From a1e331d69cecac4933d02b42f8851fbaafd45dc2 Mon Sep 17 00:00:00 2001 From: duckonomy Date: Thu, 8 Apr 2021 17:50:55 -0500 Subject: [PATCH 01/36] Add save to file functionality. --- .../control-bar/control-bar.component.html | 6 ++++++ .../control-bar/control-bar.component.ts | 18 ++++++++++++++++++ .../modal-file-browser.component.html | 3 +-- .../modal-file-browser.component.ts | 1 + src/app/services/projects.service.ts | 15 ++++++++++++++- 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/app/components/control-bar/control-bar.component.html b/src/app/components/control-bar/control-bar.component.html index d39d600b..bf640e39 100644 --- a/src/app/components/control-bar/control-bar.component.html +++ b/src/app/components/control-bar/control-bar.component.html @@ -6,6 +6,12 @@
+ {{isPublicView? 'Public Map': 'Map'}}: {{ activeProject.name }}
diff --git a/src/app/components/control-bar/control-bar.component.ts b/src/app/components/control-bar/control-bar.component.ts index 3204b676..6569a96b 100644 --- a/src/app/components/control-bar/control-bar.component.ts +++ b/src/app/components/control-bar/control-bar.component.ts @@ -1,11 +1,13 @@ import {Component, OnInit, OnDestroy, Input} from '@angular/core'; import { ProjectsService } from '../../services/projects.service'; import { Project } from '../../models/models'; +import { BsModalRef, BsModalService } from 'ngx-foundation'; import { GeoDataService } from '../../services/geo-data.service'; import {LatLng} from 'leaflet'; import {skip} from 'rxjs/operators'; import {combineLatest, Subscription} from 'rxjs'; import {NotificationsService} from '../../services/notifications.service'; +import { ModalFileBrowserComponent } from '../modal-file-browser/modal-file-browser.component'; @Component({ selector: 'app-control-bar', @@ -20,8 +22,10 @@ export class ControlBarComponent implements OnInit, OnDestroy { private loadingActiveProject = true; private loadingActiveProjectFailed = false; private loadingData = false; + modalRef: BsModalRef; constructor(private projectsService: ProjectsService, + private bsModalService: BsModalService, private geoDataService: GeoDataService, private notificationsService: NotificationsService, ) { } @@ -60,6 +64,20 @@ export class ControlBarComponent implements OnInit, OnDestroy { })); } + openSaveProjectModal() { + const initialState = { + single: true, + allowFolders: true, + onlyFolder: true, + }; + const modal: BsModalRef = this.bsModalService.show(ModalFileBrowserComponent, { initialState }); + modal.content.onClose.subscribe( (next) => { + this.projectsService.saveProject(this.activeProject.uuid, + next[0].path, + next[0].system) + }); + } + ngOnDestroy() { this.subscription.unsubscribe(); } diff --git a/src/app/components/modal-file-browser/modal-file-browser.component.html b/src/app/components/modal-file-browser/modal-file-browser.component.html index 2b60b68e..49dbd952 100644 --- a/src/app/components/modal-file-browser/modal-file-browser.component.html +++ b/src/app/components/modal-file-browser/modal-file-browser.component.html @@ -2,11 +2,10 @@ [single]=single [allowFolders]=allowFolders [allowedExtensions]=allowedExtensions + [onlyFolder]=onlyFolder (selection)="onSelect($event)">
- - diff --git a/src/app/components/modal-file-browser/modal-file-browser.component.ts b/src/app/components/modal-file-browser/modal-file-browser.component.ts index eeec4bb6..c15c4da9 100644 --- a/src/app/components/modal-file-browser/modal-file-browser.component.ts +++ b/src/app/components/modal-file-browser/modal-file-browser.component.ts @@ -13,6 +13,7 @@ export class ModalFileBrowserComponent implements OnInit { @Input() allowedExtensions: Array = this.tapisFilesService.IMPORTABLE_FEATURE_TYPES; @Input() single: false; @Input() allowFolders: false; + @Input() onlyFolder: false; selectedFiles: Array = []; public onClose: Subject> = new Subject>(); constructor(private modalRef: BsModalRef, private tapisFilesService: TapisFilesService) { } diff --git a/src/app/services/projects.service.ts b/src/app/services/projects.service.ts index 56cc0701..d3c9fd11 100644 --- a/src/app/services/projects.service.ts +++ b/src/app/services/projects.service.ts @@ -112,6 +112,19 @@ export class ProjectsService { ); } + saveProject(projectUUID: string, path: string, system: string) { + const payload = { + project_uuid: projectUUID, + path, + system_id: system + }; + this.http.post(this.envService.apiUrl + `/projects/save/`, payload).subscribe(resp => { + this.notificationsService.showSuccessToast(`Saved file to ${system}/${path}/${projectUUID}.hazmapper`) + }, error => { + console.log(error); + }); + } + setActiveProjectUUID(uuid: string): void { this._loadingActiveProject.next(true); this._loadingActiveProjectFailed.next(false); @@ -193,4 +206,4 @@ export class ProjectsService { ); } -} \ No newline at end of file +} From d8ca261a11425a354890232b3eb39dbcd8d734ac Mon Sep 17 00:00:00 2001 From: duckonomy Date: Wed, 21 Apr 2021 15:39:50 -0500 Subject: [PATCH 02/36] Improve project save. --- src/app/app.module.ts | 7 +- .../control-bar/control-bar.component.html | 9 +- .../control-bar/control-bar.component.ts | 15 +- .../file-browser/file-browser.component.ts | 5 +- .../main-welcome/main-welcome.component.html | 45 ++++-- .../main-welcome/main-welcome.component.styl | 13 +- .../modal-create-project.component.html | 22 ++- .../modal-create-project.component.ts | 15 +- .../modal-file-browser.component.html | 5 +- .../modal-link-project.component.html | 28 ++++ .../modal-link-project.component.spec.ts | 25 ++++ .../modal-link-project.component.styl | 10 ++ .../modal-link-project.component.ts | 59 ++++++++ .../project-browser.component.html | 16 ++ .../project-browser.component.spec.ts | 25 ++++ .../project-browser.component.styl | 14 ++ .../project-browser.component.ts | 39 +++++ .../public-map-info-panel.component.html | 5 +- .../users-panel/users-panel.component.html | 18 +++ .../users-panel/users-panel.component.ts | 40 +++++ src/app/models/models.ts | 2 + src/app/services/projects.service.ts | 17 ++- src/assets/designsafe.svg | 138 ++++++++++++++++++ src/assets/nheri.png | Bin 0 -> 12528 bytes 24 files changed, 519 insertions(+), 53 deletions(-) create mode 100644 src/app/components/modal-link-project/modal-link-project.component.html create mode 100644 src/app/components/modal-link-project/modal-link-project.component.spec.ts create mode 100644 src/app/components/modal-link-project/modal-link-project.component.styl create mode 100644 src/app/components/modal-link-project/modal-link-project.component.ts create mode 100644 src/app/components/project-browser/project-browser.component.html create mode 100644 src/app/components/project-browser/project-browser.component.spec.ts create mode 100644 src/app/components/project-browser/project-browser.component.styl create mode 100644 src/app/components/project-browser/project-browser.component.ts create mode 100644 src/assets/designsafe.svg create mode 100644 src/assets/nheri.png diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6f804dc4..5b123de6 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -52,6 +52,8 @@ import { MainProjectComponent } from './components/main-project/main-project.com import {DragDropModule, CDK_DRAG_CONFIG} from '@angular/cdk/drag-drop'; import { LoginComponent } from './components/login/login.component'; import { LogoutComponent } from './components/logout/logout.component'; +import { ProjectBrowserComponent } from './components/project-browser/project-browser.component'; +import { ModalLinkProjectComponent } from './components/modal-link-project/modal-link-project.component'; @NgModule({ declarations: [ @@ -87,6 +89,8 @@ import { LogoutComponent } from './components/logout/logout.component'; MainProjectComponent, LoginComponent, LogoutComponent, + ProjectBrowserComponent, + ModalLinkProjectComponent, ], imports: [ CommonModule, @@ -151,6 +155,7 @@ import { LogoutComponent } from './components/logout/logout.component'; ModalCreatePointCloudComponent, ModalCreateOverlayComponent, ModalCreateTileServerComponent, - ModalPointCloudInfoComponent] + ModalPointCloudInfoComponent, + ModalLinkProjectComponent] }) export class AppModule { } diff --git a/src/app/components/control-bar/control-bar.component.html b/src/app/components/control-bar/control-bar.component.html index bf640e39..4ab822fe 100644 --- a/src/app/components/control-bar/control-bar.component.html +++ b/src/app/components/control-bar/control-bar.component.html @@ -6,13 +6,10 @@
- {{isPublicView? 'Public Map': 'Map'}}: {{ activeProject.name }} +
+ Project: {{activeProject.system_name}} +
Loading Data diff --git a/src/app/components/control-bar/control-bar.component.ts b/src/app/components/control-bar/control-bar.component.ts index 6569a96b..1ed77f72 100644 --- a/src/app/components/control-bar/control-bar.component.ts +++ b/src/app/components/control-bar/control-bar.component.ts @@ -8,6 +8,7 @@ import {skip} from 'rxjs/operators'; import {combineLatest, Subscription} from 'rxjs'; import {NotificationsService} from '../../services/notifications.service'; import { ModalFileBrowserComponent } from '../modal-file-browser/modal-file-browser.component'; +import { ModalLinkProjectComponent } from '../modal-link-project/modal-link-project.component'; @Component({ selector: 'app-control-bar', @@ -64,20 +65,6 @@ export class ControlBarComponent implements OnInit, OnDestroy { })); } - openSaveProjectModal() { - const initialState = { - single: true, - allowFolders: true, - onlyFolder: true, - }; - const modal: BsModalRef = this.bsModalService.show(ModalFileBrowserComponent, { initialState }); - modal.content.onClose.subscribe( (next) => { - this.projectsService.saveProject(this.activeProject.uuid, - next[0].path, - next[0].system) - }); - } - ngOnDestroy() { this.subscription.unsubscribe(); } diff --git a/src/app/components/file-browser/file-browser.component.ts b/src/app/components/file-browser/file-browser.component.ts index ac59e6e8..ce6c3838 100644 --- a/src/app/components/file-browser/file-browser.component.ts +++ b/src/app/components/file-browser/file-browser.component.ts @@ -25,6 +25,7 @@ export class FileBrowserComponent implements OnInit { @Input() helpText = 'Note: Only files are selectable, not folders. Double click on a folder to navigate into it.'; @Input() allowedExtensions: Array = []; @Output() selection: EventEmitter> = new EventEmitter>(); + @Output() systemSelection: EventEmitter = new EventEmitter(); private currentUser: AuthenticatedUser; private currentDirectory: RemoteFile; @@ -65,8 +66,9 @@ export class FileBrowserComponent implements OnInit { this.myDataSystem = systems.find( (sys) => sys.id === 'designsafe.storage.default'); this.communityDataSystem = systems.find( (sys) => sys.id === 'designsafe.storage.community'); this.publishedDataSystem = systems.find( (sys) => sys.id === 'designsafe.storage.published'); - this.selectedSystem = this.myDataSystem; this.projects = projects; + this.selectedSystem = this.myDataSystem; + this.systemSelection.next(this.myDataSystem); this.currentUser = user; const init = { system: this.myDataSystem.id, @@ -86,6 +88,7 @@ export class FileBrowserComponent implements OnInit { type: 'dir', path: pth }; + this.systemSelection.next(system) this.browse(init); } diff --git a/src/app/components/main-welcome/main-welcome.component.html b/src/app/components/main-welcome/main-welcome.component.html index fce42dbb..710c10e6 100644 --- a/src/app/components/main-welcome/main-welcome.component.html +++ b/src/app/components/main-welcome/main-welcome.component.html @@ -9,11 +9,14 @@
-
-
+
+
Maps
-
+
+ Linked Project +
+
Create a New Map @@ -40,18 +43,28 @@
-
+
- {{p.name}} -
+ +
+ {{p.name}} +
+ + +
@@ -88,8 +101,16 @@
- diff --git a/src/app/components/main-welcome/main-welcome.component.styl b/src/app/components/main-welcome/main-welcome.component.styl index b15606d2..f9c6e115 100644 --- a/src/app/components/main-welcome/main-welcome.component.styl +++ b/src/app/components/main-welcome/main-welcome.component.styl @@ -14,7 +14,8 @@ #user-guide width: 550px text-align: right - + .list-column + width: 187px #sponsor height: 50px display: flex @@ -22,7 +23,7 @@ justify-content: center background-color: #f7f7f7 img - padding-left: 5px + padding-left: 10px #welcome-background background-color: #f7f7f7 height: calc(100% - 40px) @@ -40,21 +41,21 @@ .project-list-item-button cursor: pointer margin: 0px 10px + :hover + color: #fff .welcome-project-header font-size: 14px padding: 12px background-color: #d0d0d0 .welcome-project-light - font-size: 14px - padding: 12px background-color: #ffffff .welcome-project-dark - font-size: 14px - padding: 12px background-color: #eeeeee .welcome-project:hover color: #ffffff background-color: #3c6fdb + a + color: #ADDFFF #welcome-no-information height: 100% display: flex diff --git a/src/app/components/modal-create-project/modal-create-project.component.html b/src/app/components/modal-create-project/modal-create-project.component.html index 5932fbed..b1e4d536 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.html +++ b/src/app/components/modal-create-project/modal-create-project.component.html @@ -10,9 +10,22 @@

Create a new Map

+ + +
+ + +
- +
@@ -22,8 +35,10 @@

Create a new Map

[onlyFolder]="true" [single]="true" [heading]="'Select a RApp Folder'" + [allowedExtensions]="allowedExtensions" [helpText]="'All files inside this folder (that can be) will be imported. ' + - 'This folder will also be periodically scraped for new data.'" + 'This folder will also be periodically scraped for new data.' + + 'A project link will be created with the project of this folder.'" (selection)="onFolderSelection($event)" > @@ -34,6 +49,3 @@

Create a new Map

- - - diff --git a/src/app/components/modal-create-project/modal-create-project.component.ts b/src/app/components/modal-create-project/modal-create-project.component.ts index 95ca0a16..34815b3f 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.ts +++ b/src/app/components/modal-create-project/modal-create-project.component.ts @@ -18,7 +18,9 @@ export class ModalCreateProjectComponent implements OnInit { projCreateForm: FormGroup; rapidFolder: RemoteFile; + linkProject = false; submitting: boolean; + dsProject: any; errorMessage = ''; constructor(private bsModalRef: BsModalRef, private projectsService: ProjectsService) { } @@ -27,9 +29,9 @@ export class ModalCreateProjectComponent implements OnInit { this.submitting = false; this.projCreateForm = new FormGroup( { name: new FormControl(''), - description: new FormControl('') + description: new FormControl(''), + linkProject: new FormControl(false) }); - } close(project: Project) { @@ -41,6 +43,10 @@ export class ModalCreateProjectComponent implements OnInit { this.rapidFolder = item[0]; } + onProjectSelection(item: any) { + this.dsProject = item; + } + createRapidProject() { this.errorMessage = ''; const req: RapidProjectRequest = new RapidProjectRequest(this.rapidFolder.system, this.rapidFolder.path) @@ -57,11 +63,14 @@ export class ModalCreateProjectComponent implements OnInit { p.description = this.projCreateForm.get('description').value; p.name = this.projCreateForm.get('name').value; this.projectsService.create(p).subscribe( (project) => { + if (this.linkProject) { + // console.log(this.linkProject) + this.projectsService.linkExportProject(project, this.dsProject.id, '/'); + } this.close(project); }, err => { this.errorMessage = err.toString(); }); this.submitting = true; } - } diff --git a/src/app/components/modal-file-browser/modal-file-browser.component.html b/src/app/components/modal-file-browser/modal-file-browser.component.html index 49dbd952..58fef4e8 100644 --- a/src/app/components/modal-file-browser/modal-file-browser.component.html +++ b/src/app/components/modal-file-browser/modal-file-browser.component.html @@ -3,9 +3,10 @@ [allowFolders]=allowFolders [allowedExtensions]=allowedExtensions [onlyFolder]=onlyFolder - (selection)="onSelect($event)"> + (selection)="onSelect($event)" + (systemSelection)="onSystemSelect($event)">
- +
diff --git a/src/app/components/modal-link-project/modal-link-project.component.html b/src/app/components/modal-link-project/modal-link-project.component.html new file mode 100644 index 00000000..060cddef --- /dev/null +++ b/src/app/components/modal-link-project/modal-link-project.component.html @@ -0,0 +1,28 @@ + + + + + +
+ + +
diff --git a/src/app/components/modal-link-project/modal-link-project.component.spec.ts b/src/app/components/modal-link-project/modal-link-project.component.spec.ts new file mode 100644 index 00000000..1b802959 --- /dev/null +++ b/src/app/components/modal-link-project/modal-link-project.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalLinkProjectComponent } from './modal-link-project.component'; + +describe('ModalLinkProjectComponent', () => { + let component: ModalLinkProjectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ModalLinkProjectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalLinkProjectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/modal-link-project/modal-link-project.component.styl b/src/app/components/modal-link-project/modal-link-project.component.styl new file mode 100644 index 00000000..3f5a1661 --- /dev/null +++ b/src/app/components/modal-link-project/modal-link-project.component.styl @@ -0,0 +1,10 @@ +:host + .dimmed + color: #ccc + .link-project + padding: 20px + label + font-size: 19px + span + padding-right: 10px + diff --git a/src/app/components/modal-link-project/modal-link-project.component.ts b/src/app/components/modal-link-project/modal-link-project.component.ts new file mode 100644 index 00000000..fd34bba5 --- /dev/null +++ b/src/app/components/modal-link-project/modal-link-project.component.ts @@ -0,0 +1,59 @@ +import {Component, Input, OnInit} from '@angular/core'; +import { RemoteFile} from 'ng-tapis/models/remote-file'; +import { BsModalRef } from 'ngx-foundation/modal/bs-modal-ref.service'; +import { Subject } from 'rxjs'; +import { TapisFilesService } from '../../services/tapis-files.service'; +import {ChangeDetectorRef } from '@angular/core'; + + +@Component({ + selector: 'app-modal-link-project', + templateUrl: './modal-link-project.component.html', + styleUrls: ['./modal-link-project.component.styl'] +}) +export class ModalLinkProjectComponent implements OnInit { + @Input() allowedExtensions: Array = this.tapisFilesService.IMPORTABLE_FEATURE_TYPES; + @Input() single: false; + @Input() allowFolders: false; + @Input() onlyFolder: false; + @Input() allowEmptyFiles: false; + selectedFiles: Array = []; + selectedSystem: any; + linkProject: boolean = false; + public onCloseAll: Subject = new Subject(); + constructor(private modalRef: BsModalRef, + private tapisFilesService: TapisFilesService, + private cdref: ChangeDetectorRef ) { } + + ngOnInit() { + } + + ngAfterContentChecked() { + this.cdref.detectChanges(); + } + + onSelect(items: Array) { + this.selectedFiles = items; + } + + onSystemSelect(system: any) { + this.selectedSystem = system; + } + + testIt(hw) { + console.log(hw.disabled); + } + + close() { + this.onCloseAll.next({ + fileList: this.selectedFiles, + linkProject: this.linkProject, + system: this.selectedSystem + }); + this.modalRef.hide(); + } + + cancel() { + this.modalRef.hide(); + } +} diff --git a/src/app/components/project-browser/project-browser.component.html b/src/app/components/project-browser/project-browser.component.html new file mode 100644 index 00000000..b79756a5 --- /dev/null +++ b/src/app/components/project-browser/project-browser.component.html @@ -0,0 +1,16 @@ +
+ Select a project to link to +
+
+
+
+ {{p.description}} +
+
+
+ +
+ +
+
diff --git a/src/app/components/project-browser/project-browser.component.spec.ts b/src/app/components/project-browser/project-browser.component.spec.ts new file mode 100644 index 00000000..ea0a9bc7 --- /dev/null +++ b/src/app/components/project-browser/project-browser.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProjectBrowserComponent } from './project-browser.component'; + +describe('ProjectBrowserComponent', () => { + let component: ProjectBrowserComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ProjectBrowserComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProjectBrowserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/project-browser/project-browser.component.styl b/src/app/components/project-browser/project-browser.component.styl new file mode 100644 index 00000000..857b24a6 --- /dev/null +++ b/src/app/components/project-browser/project-browser.component.styl @@ -0,0 +1,14 @@ +@import '../../../variables.styl' + +:host + .selection-container + padding: 15px + background: #f9f9f9 + margin-bottom: 20px + .selection-item + border 1px solid transparent + .selection-item:hover + border 1px solid #ccc + user-select: none + .selected + background: #d3d3d3 \ No newline at end of file diff --git a/src/app/components/project-browser/project-browser.component.ts b/src/app/components/project-browser/project-browser.component.ts new file mode 100644 index 00000000..99c3a1da --- /dev/null +++ b/src/app/components/project-browser/project-browser.component.ts @@ -0,0 +1,39 @@ +import {Component, EventEmitter, OnInit, Output} from '@angular/core'; +import {SystemSummary} from 'ng-tapis'; +import {AgaveSystemsService} from '../../services/agave-systems.service'; +import { take } from 'rxjs/operators'; + +@Component({ + selector: 'app-project-browser', + templateUrl: './project-browser.component.html', + styleUrls: ['./project-browser.component.styl'] +}) +export class ProjectBrowserComponent implements OnInit { + + static limit = 200; + public projects: Array; + public hasError: boolean; + private currentIndex = 0; + public inProgress = true; + private offset = 0; + + @Output() selection: EventEmitter = new EventEmitter(); + + constructor(private agaveSystemsService: AgaveSystemsService) { } + + ngOnInit() { + this.agaveSystemsService.list(); + this.agaveSystemsService.projects.pipe(take(1)).subscribe(projects => { + this.selection.next(projects[0]); + this.projects = projects; + }) + } + + + select(system: any, index: number) { + console.log(system); + this.selection.next(system); + this.currentIndex = index; + } + +} diff --git a/src/app/components/public-map-info-panel/public-map-info-panel.component.html b/src/app/components/public-map-info-panel/public-map-info-panel.component.html index 369263fe..87973639 100644 --- a/src/app/components/public-map-info-panel/public-map-info-panel.component.html +++ b/src/app/components/public-map-info-panel/public-map-info-panel.component.html @@ -5,7 +5,10 @@
Name:
{{activeProject.name}} +
+ {{activeProject.system_name}} +
Description:
{{activeProject.description}}
-
\ No newline at end of file +
diff --git a/src/app/components/users-panel/users-panel.component.html b/src/app/components/users-panel/users-panel.component.html index 51684fc2..92065cca 100644 --- a/src/app/components/users-panel/users-panel.component.html +++ b/src/app/components/users-panel/users-panel.component.html @@ -34,6 +34,17 @@
Description:
> +
Linked Project
+ + +
+ No link!
+ You must export the map to a project. +
+
+
Public Access
@@ -53,9 +64,16 @@
Public Access
Make map public
+ + +
+ +
diff --git a/src/app/components/users-panel/users-panel.component.ts b/src/app/components/users-panel/users-panel.component.ts index 8cd0abfe..5fc28ebc 100644 --- a/src/app/components/users-panel/users-panel.component.ts +++ b/src/app/components/users-panel/users-panel.component.ts @@ -1,10 +1,13 @@ import { Component, OnInit } from '@angular/core'; import {ProjectsService} from '../../services/projects.service'; import {ModalService} from '../../services/modal.service'; +import { BsModalRef, BsModalService } from 'ngx-foundation'; import {IProjectUser} from '../../models/project-user'; import {FormGroup, FormControl} from '@angular/forms'; import {Project} from '../../models/models'; import {EnvService} from '../../services/env.service'; +import { ModalLinkProjectComponent } from '../modal-link-project/modal-link-project.component'; +import { ModalFileBrowserComponent } from '../modal-file-browser/modal-file-browser.component'; @Component({ selector: 'app-users-panel', @@ -23,6 +26,7 @@ export class UsersPanelComponent implements OnInit { publicStatusChangingError = false; constructor(private projectsService: ProjectsService, + private bsModalService: BsModalService, private modalService: ModalService, private envService: EnvService) { } @@ -45,6 +49,42 @@ export class UsersPanelComponent implements OnInit { return publicUrl; } + openLinkProjectModal() { + const modal: BsModalRef = this.bsModalService.show(ModalLinkProjectComponent); + modal.content.onClose.subscribe( (next) => { + console.log(next.id); + // this.projectsService.linkExportProject(this.activeProject, next.id); + }); + } + + openExportProjectModal() { + const initialState = { + single: true, + allowFolders: true, + onlyFolder: true, + allowEmptyFiles: true, + allowedExtensions: [] + }; + const modal: BsModalRef = this.bsModalService.show(ModalLinkProjectComponent, { initialState }); + modal.content.onCloseAll.subscribe( (next) => { + const path = next.fileList.length > 0 ? next.fileList[0].path : '/'; + console.log(path); + console.log(next); + console.log(next.system.id) + if (next.system.id.includes('project') && next.linkProject) { + console.log("awesome."); + this.projectsService.linkExportProject(this.activeProject, + next.system.id, + path) + } else { + console.log("Fridge"); + this.projectsService.exportProject(this.activeProject.uuid, + next.system.id, + path) + } + }); + } + updateMapPublicAccess(makePublic: boolean) { const title = makePublic ? 'Make map public' : 'Make map private'; const message = makePublic ? 'Are you sure you want to make this map public?' diff --git a/src/app/models/models.ts b/src/app/models/models.ts index f84ba35e..54b20b47 100644 --- a/src/app/models/models.ts +++ b/src/app/models/models.ts @@ -49,6 +49,8 @@ export interface Project { name: string; uuid?: string; public?: boolean; + system_name?: string; + system_id?: string; } export class Project implements Project { diff --git a/src/app/services/projects.service.ts b/src/app/services/projects.service.ts index d3c9fd11..5fd9a71a 100644 --- a/src/app/services/projects.service.ts +++ b/src/app/services/projects.service.ts @@ -96,6 +96,19 @@ export class ProjectsService { ); } + linkExportProject(proj: Project, systemId: string, path: string = '/') { + const data = { + systemId, + path + }; + + this.http.put(this.envService.apiUrl + `/projects/${proj.id}/link`, data).subscribe( + proj => { + this._projects.next([...this._projects.value, proj]); + } + ); + } + createRapidProject(data: RapidProjectRequest) { return this.http.post(this.envService.apiUrl + `/projects/rapid/`, data) .pipe( @@ -112,13 +125,13 @@ export class ProjectsService { ); } - saveProject(projectUUID: string, path: string, system: string) { + exportProject(projectUUID: string, system: string, path: string) { const payload = { project_uuid: projectUUID, path, system_id: system }; - this.http.post(this.envService.apiUrl + `/projects/save/`, payload).subscribe(resp => { + this.http.post(this.envService.apiUrl + `/projects/export/`, payload).subscribe(resp => { this.notificationsService.showSuccessToast(`Saved file to ${system}/${path}/${projectUUID}.hazmapper`) }, error => { console.log(error); diff --git a/src/assets/designsafe.svg b/src/assets/designsafe.svg new file mode 100644 index 00000000..48f4fee6 --- /dev/null +++ b/src/assets/designsafe.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/nheri.png b/src/assets/nheri.png new file mode 100644 index 0000000000000000000000000000000000000000..26e82495e0569289d99559954b0cb4898d620f41 GIT binary patch literal 12528 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 literal 0 HcmV?d00001 From f700060a39e5a908ac0133782e63080a63c43d19 Mon Sep 17 00:00:00 2001 From: duckonomy Date: Wed, 21 Apr 2021 15:43:10 -0500 Subject: [PATCH 03/36] Remove unnecessary logs. --- .../modal-link-project/modal-link-project.component.ts | 4 ++-- src/app/components/users-panel/users-panel.component.ts | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/app/components/modal-link-project/modal-link-project.component.ts b/src/app/components/modal-link-project/modal-link-project.component.ts index fd34bba5..39696c98 100644 --- a/src/app/components/modal-link-project/modal-link-project.component.ts +++ b/src/app/components/modal-link-project/modal-link-project.component.ts @@ -20,7 +20,7 @@ export class ModalLinkProjectComponent implements OnInit { selectedFiles: Array = []; selectedSystem: any; linkProject: boolean = false; - public onCloseAll: Subject = new Subject(); + public onClose: Subject = new Subject(); constructor(private modalRef: BsModalRef, private tapisFilesService: TapisFilesService, private cdref: ChangeDetectorRef ) { } @@ -45,7 +45,7 @@ export class ModalLinkProjectComponent implements OnInit { } close() { - this.onCloseAll.next({ + this.onClose.next({ fileList: this.selectedFiles, linkProject: this.linkProject, system: this.selectedSystem diff --git a/src/app/components/users-panel/users-panel.component.ts b/src/app/components/users-panel/users-panel.component.ts index 5fc28ebc..8d0a0304 100644 --- a/src/app/components/users-panel/users-panel.component.ts +++ b/src/app/components/users-panel/users-panel.component.ts @@ -66,18 +66,16 @@ export class UsersPanelComponent implements OnInit { allowedExtensions: [] }; const modal: BsModalRef = this.bsModalService.show(ModalLinkProjectComponent, { initialState }); - modal.content.onCloseAll.subscribe( (next) => { + modal.content.onClose.subscribe( (next) => { const path = next.fileList.length > 0 ? next.fileList[0].path : '/'; console.log(path); console.log(next); console.log(next.system.id) if (next.system.id.includes('project') && next.linkProject) { - console.log("awesome."); this.projectsService.linkExportProject(this.activeProject, next.system.id, path) } else { - console.log("Fridge"); this.projectsService.exportProject(this.activeProject.uuid, next.system.id, path) From 1ff2a99151e3d21c140f5ebeedb1a21d3b69e694 Mon Sep 17 00:00:00 2001 From: duckonomy Date: Wed, 21 Apr 2021 15:49:21 -0500 Subject: [PATCH 04/36] Change Import to Export. --- .../modal-link-project/modal-link-project.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/components/modal-link-project/modal-link-project.component.html b/src/app/components/modal-link-project/modal-link-project.component.html index 060cddef..78f6e1ea 100644 --- a/src/app/components/modal-link-project/modal-link-project.component.html +++ b/src/app/components/modal-link-project/modal-link-project.component.html @@ -24,5 +24,5 @@
- +
From 257c81d40fb01b4ecfad996efd489c410fb6d417 Mon Sep 17 00:00:00 2001 From: duckonomy Date: Fri, 23 Apr 2021 13:13:42 -0500 Subject: [PATCH 05/36] Cleanup and fix routing. --- .../modal-create-project.component.ts | 1 - .../modal-link-project.component.ts | 4 ---- .../project-browser/project-browser.component.ts | 5 ----- .../components/users-panel/users-panel.component.ts | 11 ----------- src/app/services/projects.service.ts | 6 +++--- 5 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/app/components/modal-create-project/modal-create-project.component.ts b/src/app/components/modal-create-project/modal-create-project.component.ts index 34815b3f..097a7e8f 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.ts +++ b/src/app/components/modal-create-project/modal-create-project.component.ts @@ -64,7 +64,6 @@ export class ModalCreateProjectComponent implements OnInit { p.name = this.projCreateForm.get('name').value; this.projectsService.create(p).subscribe( (project) => { if (this.linkProject) { - // console.log(this.linkProject) this.projectsService.linkExportProject(project, this.dsProject.id, '/'); } this.close(project); diff --git a/src/app/components/modal-link-project/modal-link-project.component.ts b/src/app/components/modal-link-project/modal-link-project.component.ts index 39696c98..01c00e6b 100644 --- a/src/app/components/modal-link-project/modal-link-project.component.ts +++ b/src/app/components/modal-link-project/modal-link-project.component.ts @@ -40,10 +40,6 @@ export class ModalLinkProjectComponent implements OnInit { this.selectedSystem = system; } - testIt(hw) { - console.log(hw.disabled); - } - close() { this.onClose.next({ fileList: this.selectedFiles, diff --git a/src/app/components/project-browser/project-browser.component.ts b/src/app/components/project-browser/project-browser.component.ts index 99c3a1da..e9806cd0 100644 --- a/src/app/components/project-browser/project-browser.component.ts +++ b/src/app/components/project-browser/project-browser.component.ts @@ -9,13 +9,11 @@ import { take } from 'rxjs/operators'; styleUrls: ['./project-browser.component.styl'] }) export class ProjectBrowserComponent implements OnInit { - static limit = 200; public projects: Array; public hasError: boolean; private currentIndex = 0; public inProgress = true; - private offset = 0; @Output() selection: EventEmitter = new EventEmitter(); @@ -29,11 +27,8 @@ export class ProjectBrowserComponent implements OnInit { }) } - select(system: any, index: number) { - console.log(system); this.selection.next(system); this.currentIndex = index; } - } diff --git a/src/app/components/users-panel/users-panel.component.ts b/src/app/components/users-panel/users-panel.component.ts index 8d0a0304..3ef21c48 100644 --- a/src/app/components/users-panel/users-panel.component.ts +++ b/src/app/components/users-panel/users-panel.component.ts @@ -49,14 +49,6 @@ export class UsersPanelComponent implements OnInit { return publicUrl; } - openLinkProjectModal() { - const modal: BsModalRef = this.bsModalService.show(ModalLinkProjectComponent); - modal.content.onClose.subscribe( (next) => { - console.log(next.id); - // this.projectsService.linkExportProject(this.activeProject, next.id); - }); - } - openExportProjectModal() { const initialState = { single: true, @@ -68,9 +60,6 @@ export class UsersPanelComponent implements OnInit { const modal: BsModalRef = this.bsModalService.show(ModalLinkProjectComponent, { initialState }); modal.content.onClose.subscribe( (next) => { const path = next.fileList.length > 0 ? next.fileList[0].path : '/'; - console.log(path); - console.log(next); - console.log(next.system.id) if (next.system.id.includes('project') && next.linkProject) { this.projectsService.linkExportProject(this.activeProject, next.system.id, diff --git a/src/app/services/projects.service.ts b/src/app/services/projects.service.ts index 5fd9a71a..7d279e05 100644 --- a/src/app/services/projects.service.ts +++ b/src/app/services/projects.service.ts @@ -96,13 +96,13 @@ export class ProjectsService { ); } - linkExportProject(proj: Project, systemId: string, path: string = '/') { + linkExportProject(proj: Project, system_id: string, path: string = '/') { const data = { - systemId, + system_id, path }; - this.http.put(this.envService.apiUrl + `/projects/${proj.id}/link`, data).subscribe( + this.http.post(this.envService.apiUrl + `/projects/${proj.id}/link/`, data).subscribe( proj => { this._projects.next([...this._projects.value, proj]); } From 47a6d26d592e136a3955838455e85de0e2a44ded Mon Sep 17 00:00:00 2001 From: duckonomy Date: Mon, 26 Apr 2021 17:07:22 -0500 Subject: [PATCH 06/36] Add delete files and better export dialog --- src/app/app.module.ts | 2 - .../main-welcome/main-welcome.component.html | 5 ++- .../main-welcome/main-welcome.component.ts | 27 ++++++++++-- .../modal-confirmation-body.component.ts | 17 ++++---- .../modal-create-project.component.html | 34 +++++++++++---- .../modal-create-project.component.styl | 10 +++++ .../modal-create-project.component.ts | 42 ++++++++++++++----- .../modal-link-project.component.html | 16 +++++-- .../modal-link-project.component.styl | 4 +- .../modal-link-project.component.ts | 12 +++++- .../project-browser.component.html | 16 ------- .../project-browser.component.spec.ts | 25 ----------- .../project-browser.component.styl | 14 ------- .../project-browser.component.ts | 34 --------------- .../users-panel/users-panel.component.html | 19 ++++++++- .../users-panel/users-panel.component.ts | 1 - src/app/models/models.ts | 1 + src/app/services/projects.service.ts | 33 ++++++++------- 18 files changed, 163 insertions(+), 149 deletions(-) delete mode 100644 src/app/components/project-browser/project-browser.component.html delete mode 100644 src/app/components/project-browser/project-browser.component.spec.ts delete mode 100644 src/app/components/project-browser/project-browser.component.styl delete mode 100644 src/app/components/project-browser/project-browser.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5b123de6..98ee07f2 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -52,7 +52,6 @@ import { MainProjectComponent } from './components/main-project/main-project.com import {DragDropModule, CDK_DRAG_CONFIG} from '@angular/cdk/drag-drop'; import { LoginComponent } from './components/login/login.component'; import { LogoutComponent } from './components/logout/logout.component'; -import { ProjectBrowserComponent } from './components/project-browser/project-browser.component'; import { ModalLinkProjectComponent } from './components/modal-link-project/modal-link-project.component'; @NgModule({ @@ -89,7 +88,6 @@ import { ModalLinkProjectComponent } from './components/modal-link-project/modal MainProjectComponent, LoginComponent, LogoutComponent, - ProjectBrowserComponent, ModalLinkProjectComponent, ], imports: [ diff --git a/src/app/components/main-welcome/main-welcome.component.html b/src/app/components/main-welcome/main-welcome.component.html index 710c10e6..8ab82d3e 100644 --- a/src/app/components/main-welcome/main-welcome.component.html +++ b/src/app/components/main-welcome/main-welcome.component.html @@ -58,7 +58,7 @@
- + {{p.system_name}} @@ -68,7 +68,8 @@ -
diff --git a/src/app/components/main-welcome/main-welcome.component.ts b/src/app/components/main-welcome/main-welcome.component.ts index 8f67bbad..7a6ea160 100644 --- a/src/app/components/main-welcome/main-welcome.component.ts +++ b/src/app/components/main-welcome/main-welcome.component.ts @@ -5,6 +5,7 @@ import {ProjectsService} from '../../services/projects.service'; import {BsModalService} from 'ngx-foundation'; import {ModalCreateProjectComponent} from '../modal-create-project/modal-create-project.component'; import { Router, ActivatedRoute } from '@angular/router'; +import { ModalConfirmationBodyComponent } from '../modal-confirmation-body/modal-confirmation-body.component'; @Component({ selector: 'app-main-welcome', @@ -51,13 +52,31 @@ export class MainWelcomeComponent implements OnInit { } openCreateProjectModal() { - const modal = this.bsModalService.show(ModalCreateProjectComponent); - modal.content.onClose.subscribe( (project) => { - this.routeToProject(project.uuid); - }); + this.bsModalService.show(ModalCreateProjectComponent); } deleteProject(p: Project) { this.projectsService.deleteProject(p); } + + openDeleteProjectModal(p: Project) { + let initialState = { + title: 'Delete Project', + message: 'Confirm deleting project.', + options: ['Cancel', 'Confirm'] + }; + if (p.system_path) { + initialState = { + title: 'Delete Project', + message: 'Deleting this project will remove the associated file as well.', + options: ['Cancel', 'Confirm'] + }; + } + const modal = this.bsModalService.show(ModalConfirmationBodyComponent, {initialState}); + modal.content.answer.subscribe( (close) => { + if (close === 'Confirm') { + this.projectsService.deleteProject(p); + } + }); + } } diff --git a/src/app/components/modal-confirmation-body/modal-confirmation-body.component.ts b/src/app/components/modal-confirmation-body/modal-confirmation-body.component.ts index 115c2b85..f33d9965 100644 --- a/src/app/components/modal-confirmation-body/modal-confirmation-body.component.ts +++ b/src/app/components/modal-confirmation-body/modal-confirmation-body.component.ts @@ -1,5 +1,6 @@ -import { Component, Output, EventEmitter } from '@angular/core'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; import { BsModalRef, BsModalService } from 'ngx-foundation/modal'; +import {Subject} from 'rxjs'; @Component({ selector: 'app-modal-confirmation-body', @@ -7,15 +8,15 @@ import { BsModalRef, BsModalService } from 'ngx-foundation/modal'; styleUrls: ['./modal-confirmation-body.component.styl'] }) export class ModalConfirmationBodyComponent { - title: string; - message: string; - options: string; - answer: string; + @Input() options: Array = [false, true]; + @Input() message: string = 'message'; + @Input() title: string = 'title'; + public readonly answer: Subject = new Subject(); constructor(public bsModalRef: BsModalRef) { } - closeModal(answer) { - this.answer = answer; + closeModal(answer: string) { + this.answer.next(answer); this.bsModalRef.hide(); } -} \ No newline at end of file +} diff --git a/src/app/components/modal-create-project/modal-create-project.component.html b/src/app/components/modal-create-project/modal-create-project.component.html index b1e4d536..16206fe7 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.html +++ b/src/app/components/modal-create-project/modal-create-project.component.html @@ -13,19 +13,39 @@

Create a new Map

-
- - +
+ + + +
+ +
+ Must be in a project folder to link! +
+
- +
diff --git a/src/app/components/modal-create-project/modal-create-project.component.styl b/src/app/components/modal-create-project/modal-create-project.component.styl index e69de29b..53f03b28 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.styl +++ b/src/app/components/modal-create-project/modal-create-project.component.styl @@ -0,0 +1,10 @@ +:host + .dimmed + color: #ccc + .confirm-checkbox + padding: 20px + label + font-size: 19px + span + padding-right: 10px + \ No newline at end of file diff --git a/src/app/components/modal-create-project/modal-create-project.component.ts b/src/app/components/modal-create-project/modal-create-project.component.ts index 097a7e8f..9ef86f0b 100644 --- a/src/app/components/modal-create-project/modal-create-project.component.ts +++ b/src/app/components/modal-create-project/modal-create-project.component.ts @@ -5,7 +5,7 @@ import { ProjectsService } from '../../services/projects.service'; import { Project } from '../../models/models'; import {RemoteFile} from 'ng-tapis'; import {RapidProjectRequest} from '../../models/rapid-project-request'; -import {Subject} from 'rxjs'; +import {ChangeDetectorRef } from '@angular/core'; @Component({ selector: 'app-modal-create-project', @@ -14,28 +14,33 @@ import {Subject} from 'rxjs'; }) export class ModalCreateProjectComponent implements OnInit { - public readonly onClose: Subject = new Subject(); - projCreateForm: FormGroup; rapidFolder: RemoteFile; - linkProject = false; + exportProject = false; submitting: boolean; - dsProject: any; errorMessage = ''; + selectedFiles: Array = []; + selectedSystem: any; - constructor(private bsModalRef: BsModalRef, private projectsService: ProjectsService) { } + constructor(private bsModalRef: BsModalRef, + private cdref: ChangeDetectorRef, + private projectsService: ProjectsService) { } ngOnInit() { this.submitting = false; this.projCreateForm = new FormGroup( { name: new FormControl(''), description: new FormControl(''), + exportProject: new FormControl(false), linkProject: new FormControl(false) }); } + ngAfterContentChecked() { + this.cdref.detectChanges(); + } + close(project: Project) { - this.onClose.next(project); this.bsModalRef.hide(); } @@ -43,8 +48,17 @@ export class ModalCreateProjectComponent implements OnInit { this.rapidFolder = item[0]; } - onProjectSelection(item: any) { - this.dsProject = item; + onSelect(items: Array) { + this.selectedFiles = items; + } + + onSystemSelect(system: any) { + this.selectedSystem = system; + if (system.id.includes('project')) { + this.projCreateForm.get('linkProject').enable() + } else { + this.projCreateForm.get('linkProject').disable() + } } createRapidProject() { @@ -63,8 +77,14 @@ export class ModalCreateProjectComponent implements OnInit { p.description = this.projCreateForm.get('description').value; p.name = this.projCreateForm.get('name').value; this.projectsService.create(p).subscribe( (project) => { - if (this.linkProject) { - this.projectsService.linkExportProject(project, this.dsProject.id, '/'); + if (this.projCreateForm.get('exportProject').value) { + const path = this.selectedFiles.length > 0 ? this.selectedFiles[0].path : '/'; + const systemId = this.selectedSystem.id; + if (this.projCreateForm.get('linkProject').value) { + this.projectsService.linkExportProject(project, systemId, path); + } else { + this.projectsService.exportProject(project.uuid, systemId, path); + } } this.close(project); }, err => { diff --git a/src/app/components/modal-link-project/modal-link-project.component.html b/src/app/components/modal-link-project/modal-link-project.component.html index 78f6e1ea..1a1adf70 100644 --- a/src/app/components/modal-link-project/modal-link-project.component.html +++ b/src/app/components/modal-link-project/modal-link-project.component.html @@ -3,6 +3,7 @@ [allowFolders]=allowFolders [allowedExtensions]=allowedExtensions [onlyFolder]=onlyFolder + [showPublicSystems]=false [heading]="'Select Export Location'" [helpText]="'If no folder is selected, the file will be exported to the root of the selected system.' + 'If you select a project, you can link the current map to the project.'" @@ -10,11 +11,11 @@ (systemSelection)="onSystemSelect($event)"> -