- = [];
public displayedColumns: string[] = ['name', 'role', 'affiliation', 'email'];
@@ -112,7 +157,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges {
this.infoTabService.wdlPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlPathEditing = editing));
this.infoTabService.cwlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.cwlTestPathEditing = editing));
this.infoTabService.wdlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlTestPathEditing = editing));
- this.infoTabService.topicEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((topicEditing) => (this.topicEditing = topicEditing));
this.sessionQuery.isPublic$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((publicPage) => (this.isPublic = publicPage));
}
@@ -124,25 +168,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges {
});
}
- toggleEditTopic() {
- if (this.topicEditing) {
- this.infoTabService.saveTopic(this.tool, this.revertTopic.bind(this));
- }
- this.infoTabService.setTopicEditing(!this.topicEditing);
- }
-
- revertTopic() {
- this.tool.topicManual = this.extendedDockstoreTool.topicManual;
- }
-
- revertTopicSelection() {
- this.tool.topicSelection = this.extendedDockstoreTool.topicSelection;
- }
-
- topicSelectionChange() {
- this.infoTabService.saveTopicSelection(this.tool, this.revertTopicSelection.bind(this));
- }
-
toggleEditDockerFile() {
if (this.dockerFileEditing) {
this.infoTabService.updateAndRefresh(this.tool);
@@ -178,14 +203,7 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges {
}
somethingIsBeingEdited(): boolean {
- return (
- this.dockerFileEditing ||
- this.cwlPathEditing ||
- this.wdlPathEditing ||
- this.cwlTestPathEditing ||
- this.wdlTestPathEditing ||
- this.topicEditing
- );
+ return this.dockerFileEditing || this.cwlPathEditing || this.wdlPathEditing || this.cwlTestPathEditing || this.wdlTestPathEditing;
}
/**
@@ -195,7 +213,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges {
*/
cancelEditing(): void {
this.infoTabService.cancelEditing();
- this.revertTopic();
}
/**
diff --git a/src/app/container/info-tab/info-tab.service.ts b/src/app/container/info-tab/info-tab.service.ts
index 7673ea7540..f8fa04627b 100644
--- a/src/app/container/info-tab/info-tab.service.ts
+++ b/src/app/container/info-tab/info-tab.service.ts
@@ -31,7 +31,6 @@ export class InfoTabService extends Base {
public wdlPathEditing$: BehaviorSubject = new BehaviorSubject(false);
public cwlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false);
public wdlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false);
- public topicEditing$: BehaviorSubject = new BehaviorSubject(false);
/**
* The original tool that should be in sync with the database
@@ -86,46 +85,6 @@ export class InfoTabService extends Base {
this.wdlTestPathEditing$.next(editing);
}
- setTopicEditing(editing: boolean) {
- this.topicEditing$.next(editing);
- }
-
- saveTopic(tool: DockstoreTool, errorCallback: () => void) {
- this.alertService.start('Updating topic');
- const partialTool = this.getPartialToolForUpdate(tool);
- this.containersService.updateContainer(this.tool.id, partialTool).subscribe(
- (response) => {
- this.alertService.detailedSuccess();
- const newTopic = response.topicManual;
- this.containerService.updateActiveTopic(newTopic);
- },
- (error) => {
- this.alertService.detailedError(error);
- errorCallback();
- }
- );
- }
-
- /**
- * Warning, this could potentially update a few other properties
- * @param entry
- */
- saveTopicSelection(entry: DockstoreTool, errorCallback: () => void) {
- this.alertService.start('Updating topic selection');
- const partialEntryForUpdate = this.getPartialToolForUpdate(entry);
- this.containersService.updateContainer(this.originalTool.id, partialEntryForUpdate).subscribe(
- (response) => {
- this.alertService.detailedSuccess();
- const newTopicSelection = response.topicSelection;
- this.containerService.updateActiveTopicSelection(newTopicSelection);
- },
- (error) => {
- this.alertService.detailedError(error);
- errorCallback();
- }
- );
- }
-
updateAndRefresh(tool: ExtendedDockstoreTool) {
const message = 'Tool Info';
const partialTool = this.getPartialToolForUpdate(tool);
@@ -157,7 +116,7 @@ export class InfoTabService extends Base {
* Sending back only the ones relevant.
* Additionally, the webservice does not appear to understand starredUsers which causes an error.
*/
- private getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool {
+ getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool {
const partialTool: DockstoreTool = {
gitUrl: tool.gitUrl,
mode: tool.mode,
@@ -198,7 +157,6 @@ export class InfoTabService extends Base {
this.wdlPathEditing$.next(false);
this.wdlTestPathEditing$.next(false);
this.cwlTestPathEditing$.next(false);
- this.topicEditing$.next(false);
this.restoreTool();
}
diff --git a/src/app/container/launch/launch.component.ts b/src/app/container/launch/launch.component.ts
index 6850039f52..defcf94510 100644
--- a/src/app/container/launch/launch.component.ts
+++ b/src/app/container/launch/launch.component.ts
@@ -24,12 +24,35 @@ import { ToolQuery } from '../../shared/tool/tool.query';
import { DescriptorLanguageService } from './../../shared/entry/descriptor-language.service';
import { Tag } from './../../shared/openapi/model/tag';
import { ToolLaunchService } from './tool-launch.service';
+import { LaunchCheckerWorkflowComponent } from '../../shared/entry/launch-checker-workflow/launch-checker-workflow.component';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { MatLegacySelectModule } from '@angular/material/legacy-select';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, AsyncPipe } from '@angular/common';
import DescriptorTypeEnum = Workflow.DescriptorTypeEnum;
@Component({
- selector: 'app-launch',
+ selector: 'app-container-launch',
templateUrl: './launch.component.html',
styleUrls: ['./launch.component.css'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyCardModule,
+ MatIconModule,
+ MatLegacyFormFieldModule,
+ MatLegacySelectModule,
+ NgFor,
+ MatLegacyOptionModule,
+ FlexModule,
+ MatLegacyTooltipModule,
+ LaunchCheckerWorkflowComponent,
+ AsyncPipe,
+ ],
})
export class LaunchComponent extends Base implements OnInit, OnChanges {
@Input() basePath: string;
diff --git a/src/app/container/paramfiles/paramfiles.component.ts b/src/app/container/paramfiles/paramfiles.component.ts
index d491cc34b5..781e159481 100644
--- a/src/app/container/paramfiles/paramfiles.component.ts
+++ b/src/app/container/paramfiles/paramfiles.component.ts
@@ -26,11 +26,39 @@ import { ToolQuery } from '../../shared/tool/tool.query';
import { FilesQuery } from '../../workflow/files/state/files.query';
import { FilesService } from '../../workflow/files/state/files.service';
import { ParamfilesService } from './paramfiles.service';
+import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../../shared/snackbar.directive';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatToolbarModule } from '@angular/material/toolbar';
+import { SelectComponent } from '../../select/select.component';
+import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common';
@Component({
selector: 'app-paramfiles-container',
templateUrl: './paramfiles.component.html',
styleUrls: ['./paramfiles.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyCardModule,
+ MatIconModule,
+ NgFor,
+ MatLegacyProgressBarModule,
+ SelectComponent,
+ MatToolbarModule,
+ FlexModule,
+ MatLegacyButtonModule,
+ SnackbarDirective,
+ ClipboardModule,
+ CodeEditorComponent,
+ AsyncPipe,
+ KeyValuePipe,
+ ],
})
export class ParamfilesComponent extends EntryFileSelector implements OnChanges {
@Input() id: number;
diff --git a/src/app/container/paramfiles/paramfiles.service.ts b/src/app/container/paramfiles/paramfiles.service.ts
index 9755972adf..5079295317 100644
--- a/src/app/container/paramfiles/paramfiles.service.ts
+++ b/src/app/container/paramfiles/paramfiles.service.ts
@@ -41,7 +41,7 @@ export class ParamfilesService {
return this.workflowsService.getTestParameterFiles1(id, versionName);
} else {
if (descriptor === 'CWL' || descriptor === 'WDL') {
- return this.containersService.getTestParameterFiles(id, versionName, descriptor);
+ return this.containersService.getTestParameterFiles(id, descriptor, versionName);
}
}
}
diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts
index eada81a62c..ddf9207660 100644
--- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts
+++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts
@@ -1,8 +1,8 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatButtonModule } from '@angular/material/button';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { MatIconModule } from '@angular/material/icon';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
+import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { ExtendedDockstoreToolService } from 'app/shared/extended-dockstoreTool/extended-dockstoreTool.service';
import { ProviderService } from 'app/shared/provider.service';
@@ -41,8 +41,7 @@ describe('RefreshToolOrganizationComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [RefreshToolOrganizationComponent],
- imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule],
+ imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule, RefreshToolOrganizationComponent],
providers: [
{ provide: UsersService, useClass: UsersStubService },
{ provide: RefreshService, useClass: RefreshStubService },
diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts
index 7fe32a8463..a1d0ff60be 100644
--- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts
+++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts
@@ -25,12 +25,16 @@ import { AlertService } from '../../shared/alert/state/alert.service';
import { RefreshOrganizationComponent } from '../../shared/refresh-organization/refresh-organization.component';
import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool';
import { UserQuery } from '../../shared/user/user.query';
+import { AsyncPipe } from '@angular/common';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
@Component({
selector: 'app-refresh-tool-organization',
// Note that the template and style is actually from the shared one (used by both my-workflows and my-tools)
templateUrl: './../../shared/refresh-organization/refresh-organization.component.html',
styleUrls: ['./../../shared/refresh-organization/refresh-organization.component.css'],
+ standalone: true,
+ imports: [MatLegacyButtonModule, AsyncPipe],
})
export class RefreshToolOrganizationComponent extends RefreshOrganizationComponent implements OnInit {
@Input() protected orgToolObject: OrgToolObject;
diff --git a/src/app/container/refresh-wizard.module.ts b/src/app/container/refresh-wizard.module.ts
deleted file mode 100644
index 3705a2a609..0000000000
--- a/src/app/container/refresh-wizard.module.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { RefreshAlertModule } from 'app/shared/alert/alert.module';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { RefreshWizardComponent } from './refresh-wizard/refresh-wizard.component';
-
-@NgModule({
- imports: [CommonModule, RefreshAlertModule, CustomMaterialModule, FlexLayoutModule],
- declarations: [RefreshWizardComponent],
- exports: [RefreshWizardComponent],
-})
-export class RefreshWizardModule {}
diff --git a/src/app/container/refresh-wizard/refresh-wizard.component.ts b/src/app/container/refresh-wizard/refresh-wizard.component.ts
index 89083d0b96..235e683bea 100644
--- a/src/app/container/refresh-wizard/refresh-wizard.component.ts
+++ b/src/app/container/refresh-wizard/refresh-wizard.component.ts
@@ -6,12 +6,41 @@ import { Observable } from 'rxjs';
import { RefreshWizardQuery } from '../state/refresh-wizard.query';
import { RefreshWizardService } from '../state/refresh-wizard.service';
import { RefreshWizardStore } from '../state/refresh-wizard.store';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatStepperModule } from '@angular/material/stepper';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { MatLegacySelectModule } from '@angular/material/legacy-select';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, AsyncPipe } from '@angular/common';
+import { LoadingComponent } from '../../shared/loading/loading.component';
@Component({
selector: 'app-refresh-wizard',
templateUrl: './refresh-wizard.component.html',
styleUrls: ['./refresh-wizard.component.scss'],
providers: [RefreshWizardQuery, RefreshWizardStore, RefreshWizardService],
+ standalone: true,
+ imports: [
+ LoadingComponent,
+ NgIf,
+ MatLegacyCardModule,
+ MatIconModule,
+ MatLegacyFormFieldModule,
+ MatLegacySelectModule,
+ NgFor,
+ MatLegacyOptionModule,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ FlexModule,
+ MatStepperModule,
+ MatLegacyDialogModule,
+ AsyncPipe,
+ ],
})
export class RefreshWizardComponent implements OnInit {
loading$: Observable;
diff --git a/src/app/container/register-tool/register-tool.component.html b/src/app/container/register-tool/register-tool.component.html
index ebde07d712..7d585e3730 100644
--- a/src/app/container/register-tool/register-tool.component.html
+++ b/src/app/container/register-tool/register-tool.component.html
@@ -57,7 +57,7 @@
Register Tool
-
+
@@ -42,7 +42,7 @@
[fileType]="'descriptor'"
[descriptorType]="selectedDescriptorType"
[selectedVersion]="currentVersion"
- [entryType]="'tool'"
+ [entryType]="EntryType.TOOL"
[entrypath]="entrypath"
>
@@ -62,7 +62,7 @@
[fileType]="'testParam'"
[descriptorType]="selectedDescriptorType"
[selectedVersion]="currentVersion"
- [entryType]="'tool'"
+ [entryType]="EntryType.TOOL"
[entrypath]="entrypath"
>
diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts
index 89d5d56d2f..919f706777 100644
--- a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts
+++ b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts
@@ -2,16 +2,16 @@ import { ClipboardModule } from '@angular/cdk/clipboard';
import { HttpClientModule } from '@angular/common/http';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCardModule } from '@angular/material/card';
-import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card';
+import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
import { MatIconModule } from '@angular/material/icon';
-import { MatInputModule } from '@angular/material/input';
-import { MatSelectModule } from '@angular/material/select';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
-import { MatTabsModule } from '@angular/material/tabs';
+import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
+import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
import { MatToolbarModule } from '@angular/material/toolbar';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service';
import { SourceFile } from '../../shared/openapi';
@@ -35,7 +35,6 @@ describe('ToolFileEditorComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [ToolFileEditorComponent, CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe],
imports: [
MatButtonModule,
MatTabsModule,
@@ -51,6 +50,11 @@ describe('ToolFileEditorComponent', () => {
ClipboardModule,
HttpClientModule,
HttpClientTestingModule,
+ ToolFileEditorComponent,
+ CodeEditorListComponent,
+ CodeEditorComponent,
+ PublicFileDownloadPipe,
+ PrivateFilePathPipe,
],
providers: [
{ provide: HostedService, useClass: HostedStubService },
@@ -82,6 +86,7 @@ describe('ToolFileEditorComponent', () => {
path: 'foo.cwl',
type: 'DOCKSTORE_CWL',
content: content,
+ state: SourceFile.StateEnum.COMPLETE,
};
component.originalSourceFiles = [sourceFile];
component.resetFiles();
diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.ts b/src/app/container/tool-file-editor/tool-file-editor.component.ts
index 62e3702416..cb4c6a5bd3 100644
--- a/src/app/container/tool-file-editor/tool-file-editor.component.ts
+++ b/src/app/container/tool-file-editor/tool-file-editor.component.ts
@@ -16,17 +16,35 @@
import { Component, Input } from '@angular/core';
import { AlertService } from '../../shared/alert/state/alert.service';
import { FileEditing } from '../../shared/file-editing';
-import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor } from '../../shared/openapi';
+import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor, EntryType } from '../../shared/openapi';
import { ContainerService } from './../../shared/container.service';
import { HostedService } from './../../shared/openapi/api/hosted.service';
import { Tag } from './../../shared/openapi/model/tag';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf } from '@angular/common';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { MatLegacySelectModule } from '@angular/material/legacy-select';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { CodeEditorListComponent } from '../../shared/code-editor-list/code-editor-list.component';
+import { MatLegacyTabsModule } from '@angular/material/legacy-tabs';
@Component({
selector: 'app-tool-file-editor',
templateUrl: './tool-file-editor.component.html',
styleUrls: ['./tool-file-editor.component.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyTabsModule,
+ CodeEditorListComponent,
+ MatLegacyFormFieldModule,
+ MatLegacySelectModule,
+ MatLegacyOptionModule,
+ NgIf,
+ MatLegacyButtonModule,
+ ],
})
export class ToolFileEditorComponent extends FileEditing {
+ public EntryType = EntryType;
dockerFile: Array = [];
descriptorFiles: Array = [];
testParameterFiles: Array = [];
diff --git a/src/app/container/version-modal/version-modal.component.spec.ts b/src/app/container/version-modal/version-modal.component.spec.ts
index b076aa3a7c..695fe34ffc 100644
--- a/src/app/container/version-modal/version-modal.component.spec.ts
+++ b/src/app/container/version-modal/version-modal.component.spec.ts
@@ -3,8 +3,8 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
-import { MatDialogModule } from '@angular/material/dialog';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { ListContainersService } from '../../containers/list/list.service';
import { ContainerService } from '../../shared/container.service';
import { DateService } from '../../shared/date.service';
@@ -32,8 +32,7 @@ describe('VersionModalComponent', () => {
waitForAsync(() => {
TestBed.configureTestingModule({
schemas: [NO_ERRORS_SCHEMA],
- declarations: [VersionModalComponent],
- imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule],
+ imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule, VersionModalComponent],
providers: [
{ provide: ParamfilesService, useClass: ParamFilesStubService },
{ provide: VersionModalService, useClass: VersionModalStubService },
diff --git a/src/app/container/version-modal/version-modal.component.ts b/src/app/container/version-modal/version-modal.component.ts
index bac17da593..d0c517597e 100644
--- a/src/app/container/version-modal/version-modal.component.ts
+++ b/src/app/container/version-modal/version-modal.component.ts
@@ -14,8 +14,8 @@
* limitations under the License.
*/
import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
-import { NgForm } from '@angular/forms';
-import { MatDialog } from '@angular/material/dialog';
+import { NgForm, FormsModule } from '@angular/forms';
+import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog';
import { Base } from 'app/shared/base';
import { forkJoin } from 'rxjs';
import { debounceTime, finalize, takeUntil } from 'rxjs/operators';
@@ -35,11 +35,36 @@ import { ToolQuery } from '../../shared/tool/tool.query';
import { formErrors, validationDescriptorPatterns, validationMessages } from '../../shared/validationMessages.model';
import { ParamfilesService } from '../paramfiles/paramfiles.service';
import { VersionModalService } from './version-modal.service';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../../shared/snackbar.directive';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatIconModule } from '@angular/material/icon';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { NgIf, NgFor, NgClass } from '@angular/common';
+import { LoadingComponent } from '../../shared/loading/loading.component';
+import { AlertComponent } from '../../shared/alert/alert.component';
@Component({
selector: 'app-version-modal',
templateUrl: './version-modal.component.html',
styleUrls: ['./version-modal.component.css'],
+ standalone: true,
+ imports: [
+ MatLegacyDialogModule,
+ AlertComponent,
+ LoadingComponent,
+ NgIf,
+ FormsModule,
+ NgFor,
+ NgClass,
+ ExtendedModule,
+ MatIconModule,
+ MatLegacyCardModule,
+ SnackbarDirective,
+ ClipboardModule,
+ MatLegacyButtonModule,
+ ],
})
export class VersionModalComponent extends Base implements OnInit, AfterViewChecked, OnDestroy {
public TagEditorMode = TagEditorMode;
diff --git a/src/app/container/versions/versions.component.html b/src/app/container/versions/versions.component.html
index d518987d52..7edabb1ff8 100644
--- a/src/app/container/versions/versions.component.html
+++ b/src/app/container/versions/versions.component.html
@@ -134,7 +134,7 @@
-
Actions
+
{{ this.publicPage ? 'Overview' : 'Actions' }}
diff --git a/src/app/container/versions/versions.component.ts b/src/app/container/versions/versions.component.ts
index 419c91dd9d..1fb4abf7a9 100644
--- a/src/app/container/versions/versions.component.ts
+++ b/src/app/container/versions/versions.component.ts
@@ -14,8 +14,8 @@
* limitations under the License.
*/
import { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core';
-import { MatSort } from '@angular/material/sort';
-import { MatTableDataSource } from '@angular/material/table';
+import { MatSort, MatSortModule } from '@angular/material/sort';
+import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table';
import { faCodeBranch, faTag } from '@fortawesome/free-solid-svg-icons';
import { takeUntil } from 'rxjs/operators';
import { AlertService } from '../../shared/alert/state/alert.service';
@@ -28,11 +28,40 @@ import { VersionVerifiedPlatform, Tag } from '../../shared/openapi';
import { SessionQuery } from '../../shared/session/session.query';
import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool';
import { Versions } from '../../shared/versions';
+import { DescriptorLanguageVersionsPipe } from '../../shared/entry/descriptor-language-versions.pipe';
+import { VerifiedPlatformsPipe } from '../../shared/entry/verified-platforms.pipe';
+import { CommitUrlPipe } from '../../shared/entry/commit-url.pipe';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { ViewContainerComponent } from '../view/view.component';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyChipsModule } from '@angular/material/legacy-chips';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatIconModule } from '@angular/material/icon';
+import { NgIf, NgClass, DatePipe } from '@angular/common';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
@Component({
selector: 'app-versions-container',
templateUrl: './versions.component.html',
styleUrls: ['./../../workflow/versions/versions.component.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyTableModule,
+ MatSortModule,
+ MatLegacyTooltipModule,
+ NgIf,
+ MatIconModule,
+ FlexModule,
+ MatLegacyChipsModule,
+ FontAwesomeModule,
+ ViewContainerComponent,
+ NgClass,
+ ExtendedModule,
+ DatePipe,
+ CommitUrlPipe,
+ VerifiedPlatformsPipe,
+ DescriptorLanguageVersionsPipe,
+ ],
})
export class VersionsContainerComponent extends Versions implements OnInit, OnChanges, AfterViewInit {
faTag = faTag;
diff --git a/src/app/container/view/view.component.ts b/src/app/container/view/view.component.ts
index a58db84a02..7eb1a03749 100644
--- a/src/app/container/view/view.component.ts
+++ b/src/app/container/view/view.component.ts
@@ -15,7 +15,7 @@
*/
import { HttpErrorResponse } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ViewService } from 'app/container/view/view.service';
import { AlertQuery } from 'app/shared/alert/state/alert.query';
import { Observable } from 'rxjs';
@@ -33,11 +33,16 @@ import { ToolQuery } from '../../shared/tool/tool.query';
import { View } from '../../shared/view';
import { VersionModalComponent } from '../version-modal/version-modal.component';
import { VersionModalService } from '../version-modal/version-modal.service';
+import { MatLegacyMenuModule } from '@angular/material/legacy-menu';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-view-container',
templateUrl: './view.component.html',
styleUrls: ['./view.component.css'],
+ standalone: true,
+ imports: [NgIf, MatLegacyButtonModule, MatLegacyMenuModule, AsyncPipe],
})
// This is actually the actions dropdown for tags
export class ViewContainerComponent extends View implements OnInit {
diff --git a/src/app/containers/containers.component.ts b/src/app/containers/containers.component.ts
index be2728f8c8..90f58478ff 100644
--- a/src/app/containers/containers.component.ts
+++ b/src/app/containers/containers.component.ts
@@ -15,15 +15,21 @@
*/
import { Component } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, RouterLink, RouterOutlet } from '@angular/router';
import { SessionQuery } from 'app/shared/session/session.query';
import { SessionService } from 'app/shared/session/session.service';
import { Observable } from 'rxjs';
import { UrlResolverService } from '../shared/url-resolver.service';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common';
+import { HeaderComponent } from '../header/header.component';
@Component({
selector: 'app-containers',
templateUrl: './containers.component.html',
+ standalone: true,
+ imports: [HeaderComponent, NgIf, FlexModule, RouterLink, ExtendedModule, RouterOutlet, AsyncPipe, TitleCasePipe],
})
export class ContainersComponent {
public entryName: string = '';
diff --git a/src/app/containers/containers.module.ts b/src/app/containers/containers.module.ts
deleted file mode 100644
index f15885f252..0000000000
--- a/src/app/containers/containers.module.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2017 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { MarkdownModule } from 'ngx-markdown';
-
-import { ContainerModule } from '../shared/modules/container.module';
-import { HeaderModule } from '../shared/modules/header.module';
-import { ListContainersModule } from '../shared/modules/list-containers.module';
-import { SelectModule } from '../shared/modules/select.module';
-import { ContainersComponent } from './containers.component';
-import { containersRouting } from './containers.routing';
-import { SearchContainersComponent } from './search/search.component';
-
-@NgModule({
- declarations: [ContainersComponent, SearchContainersComponent],
- imports: [CommonModule, HeaderModule, SelectModule, ListContainersModule, ContainerModule, containersRouting, MarkdownModule],
-})
-export class ContainersModule {}
diff --git a/src/app/containers/containers.routing.ts b/src/app/containers/containers.routing.ts
index 83b2078ac6..796689d95a 100644
--- a/src/app/containers/containers.routing.ts
+++ b/src/app/containers/containers.routing.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
import { EntryType } from 'app/shared/enum/entry-type';
import { ContainerComponent } from '../container/container.component';
import { ContainersComponent } from './containers.component';
@@ -32,4 +32,4 @@ const CONTAINERS_ROUTES: Routes = [
},
];
-export const containersRouting = RouterModule.forChild(CONTAINERS_ROUTES);
+export const containersRouting = CONTAINERS_ROUTES;
diff --git a/src/app/containers/list/list.component.ts b/src/app/containers/list/list.component.ts
index 2d2ea2beb6..f8342c4b9f 100644
--- a/src/app/containers/list/list.component.ts
+++ b/src/app/containers/list/list.component.ts
@@ -25,11 +25,45 @@ import { PaginatorService } from '../../shared/state/paginator.service';
import { ContainersService, DockstoreTool } from '../../shared/openapi';
import { ToolLister } from '../../shared/tool-lister';
import { PublishedToolsDataSource } from './published-tools.datasource';
+import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatIconModule } from '@angular/material/icon';
+import { RouterLink } from '@angular/router';
+import { PrivateIconComponent } from '../../shared/private-icon/private-icon.component';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { MatSortModule } from '@angular/material/sort';
+import { MatLegacyTableModule } from '@angular/material/legacy-table';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { NgIf, NgFor, AsyncPipe, UpperCasePipe } from '@angular/common';
@Component({
selector: 'app-list-containers',
templateUrl: './list.component.html',
styleUrls: ['../../shared/styles/entry-table.scss', './list.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyProgressBarModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ MatLegacyTableModule,
+ MatSortModule,
+ ExtendedModule,
+ PrivateIconComponent,
+ RouterLink,
+ MatIconModule,
+ MatLegacyTooltipModule,
+ NgFor,
+ FontAwesomeModule,
+ MatLegacyButtonModule,
+ MatLegacyPaginatorModule,
+ AsyncPipe,
+ UpperCasePipe,
+ ],
})
export class ListContainersComponent extends ToolLister implements OnInit {
@Input() previewMode: boolean;
diff --git a/src/app/containers/search/search.component.ts b/src/app/containers/search/search.component.ts
index 9df41d1c18..9b14f51e2b 100644
--- a/src/app/containers/search/search.component.ts
+++ b/src/app/containers/search/search.component.ts
@@ -15,10 +15,13 @@
*/
import { Component } from '@angular/core';
+import { ListContainersComponent } from '../list/list.component';
@Component({
selector: 'app-search-containers',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css'],
+ standalone: true,
+ imports: [ListContainersComponent],
})
export class SearchContainersComponent {}
diff --git a/src/app/descriptor-languages/CWL.ts b/src/app/descriptor-languages/CWL.ts
index 882de7e6d3..d742072c1b 100644
--- a/src/app/descriptor-languages/CWL.ts
+++ b/src/app/descriptor-languages/CWL.ts
@@ -7,7 +7,7 @@ export const extendedCWL: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'CWL',
friendlyName: 'Common Workflow Language',
defaultDescriptorPath: '/Dockstore.cwl',
- descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)',
+ descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$',
descriptorPathPlaceholder: 'e.g. /Dockstore.cwl',
toolDescriptorEnum: ToolDescriptor.TypeEnum.CWL,
workflowDescriptorEnum: Workflow.DescriptorTypeEnum.CWL,
diff --git a/src/app/descriptor-languages/Galaxy.ts b/src/app/descriptor-languages/Galaxy.ts
index 30ed242d46..37cbf82d5c 100644
--- a/src/app/descriptor-languages/Galaxy.ts
+++ b/src/app/descriptor-languages/Galaxy.ts
@@ -7,7 +7,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'Galaxy',
friendlyName: 'Galaxy Workflow Format',
defaultDescriptorPath: '/workflow-name.yml',
- descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(ga|yaml|yml)',
+ descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(ga|yaml|yml)$',
descriptorPathPlaceholder: 'e.g. /workflow-name.yml',
toolDescriptorEnum: ToolDescriptor.TypeEnum.GALAXY,
workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Gxformat2,
@@ -18,7 +18,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = {
rowIdentifier: 'tool\xa0ID',
workflowStepHeader: 'Tool Excerpt',
},
- workflowLaunchSupport: false,
+ workflowLaunchSupport: true,
testParameterFileType: SourceFile.TypeEnum.GXFORMAT2TESTFILE,
fileTabs: [
{
diff --git a/src/app/descriptor-languages/Jupyter.ts b/src/app/descriptor-languages/Jupyter.ts
index e6ada828ec..d3c3aa366b 100644
--- a/src/app/descriptor-languages/Jupyter.ts
+++ b/src/app/descriptor-languages/Jupyter.ts
@@ -10,7 +10,7 @@ export const extendedJupyter: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'Jupyter',
friendlyName: 'Jupyter notebook',
defaultDescriptorPath: '/notebook.ipynb',
- descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.ipynb$',
+ descriptorPathPattern: '^^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.ipynb$',
descriptorPathPlaceholder: 'e.g. /notebook.ipynb',
toolDescriptorEnum: ToolDescriptor.TypeEnum.JUPYTER,
workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Jupyter,
diff --git a/src/app/descriptor-languages/Nextflow.ts b/src/app/descriptor-languages/Nextflow.ts
index c40e73e591..a6aab51f0b 100644
--- a/src/app/descriptor-languages/Nextflow.ts
+++ b/src/app/descriptor-languages/Nextflow.ts
@@ -7,7 +7,7 @@ export const extendedNFL: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'Nextflow',
friendlyName: 'Nextflow',
defaultDescriptorPath: '/nextflow.config',
- descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)',
+ descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$',
descriptorPathPlaceholder: 'e.g. /nextflow.config',
toolDescriptorEnum: ToolDescriptor.TypeEnum.NFL,
workflowDescriptorEnum: Workflow.DescriptorTypeEnum.NFL,
diff --git a/src/app/descriptor-languages/Snakemake.ts b/src/app/descriptor-languages/Snakemake.ts
index 3ea99ba7ec..51299c79cf 100644
--- a/src/app/descriptor-languages/Snakemake.ts
+++ b/src/app/descriptor-languages/Snakemake.ts
@@ -7,7 +7,7 @@ export const extendedSMK: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'Snakemake',
friendlyName: 'Snakemake',
defaultDescriptorPath: '/Snakefile',
- descriptorPathPattern: '^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$',
+ descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$',
descriptorPathPlaceholder: 'e.g. /Snakefile',
toolDescriptorEnum: ToolDescriptor.TypeEnum.SMK,
diff --git a/src/app/descriptor-languages/WDL.ts b/src/app/descriptor-languages/WDL.ts
index ed3f0b1ffb..e221ce7c20 100644
--- a/src/app/descriptor-languages/WDL.ts
+++ b/src/app/descriptor-languages/WDL.ts
@@ -7,7 +7,7 @@ export const extendedWDL: ExtendedDescriptorLanguageBean = {
shortFriendlyName: 'WDL',
friendlyName: 'Workflow Description Language',
defaultDescriptorPath: '/Dockstore.wdl',
- descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$',
+ descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$',
descriptorPathPlaceholder: 'e.g. /Dockstore.wdl',
toolDescriptorEnum: ToolDescriptor.TypeEnum.WDL,
workflowDescriptorEnum: Workflow.DescriptorTypeEnum.WDL,
diff --git a/src/app/docs/docs.component.spec.ts b/src/app/docs/docs.component.spec.ts
index 9c398e7883..29f827ffb5 100644
--- a/src/app/docs/docs.component.spec.ts
+++ b/src/app/docs/docs.component.spec.ts
@@ -15,7 +15,7 @@
*/
import { TestBed, waitForAsync } from '@angular/core/testing';
-import { HeaderModule } from './../shared/modules/header.module';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterLinkStubDirective, RouterOutletStubComponent } from './../test/router-stubs';
import { DocsComponent } from './docs.component';
@@ -25,24 +25,26 @@ import { DocsComponent } from './docs.component';
describe('DocsComponent', () => {
// let component: DocsComponent;
// let fixture: ComponentFixture;
+ let fixture;
+ let component;
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [DocsComponent, RouterLinkStubDirective, RouterOutletStubComponent],
- imports: [HeaderModule],
+ declarations: [RouterLinkStubDirective, RouterOutletStubComponent],
+ imports: [DocsComponent, MatLegacySnackBarModule],
}).compileComponents();
})
);
- // beforeEach(() => {
- // fixture = TestBed.createComponent(DocsComponent);
- // component = fixture.componentInstance;
- // fixture.detectChanges();
- // });
+ beforeEach(() => {
+ fixture = TestBed.createComponent(DocsComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
- // it('should create', () => {
- // expect(component).toBeTruthy();
- // });
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
// it('should render subject', () => {
// const h3 = fixture.debugElement.query(By.css('h3'));
diff --git a/src/app/docs/docs.component.ts b/src/app/docs/docs.component.ts
index 2a1d956085..4972692973 100644
--- a/src/app/docs/docs.component.ts
+++ b/src/app/docs/docs.component.ts
@@ -16,6 +16,7 @@
import { Component, OnInit } from '@angular/core';
import { Dockstore } from '../shared/dockstore.model';
+import { HeaderComponent } from '../header/header.component';
interface DocObject {
existingPath: string;
@@ -25,6 +26,8 @@ interface DocObject {
@Component({
selector: 'app-docs',
templateUrl: './docs.component.html',
+ standalone: true,
+ imports: [HeaderComponent],
})
export class DocsComponent implements OnInit {
// Array of doc objects, where existingPath is the path on Dockstore, and newPath is the new path on the docs page
diff --git a/src/app/docs/docs.module.ts b/src/app/docs/docs.module.ts
index 8ed8b6cc10..a8008aafa4 100644
--- a/src/app/docs/docs.module.ts
+++ b/src/app/docs/docs.module.ts
@@ -22,8 +22,7 @@ import { docsRouting } from './docs.routing';
import { DocsComponent } from './docs.component';
@NgModule({
- declarations: [DocsComponent],
- imports: [CommonModule, docsRouting, HeaderModule],
+ imports: [CommonModule, docsRouting, HeaderModule, DocsComponent],
providers: [],
})
export class DocsModule {}
diff --git a/src/app/docs/docs.routing.ts b/src/app/docs/docs.routing.ts
index 7bedf18653..996783caef 100644
--- a/src/app/docs/docs.routing.ts
+++ b/src/app/docs/docs.routing.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
import { DocsComponent } from './docs.component';
@@ -25,4 +25,4 @@ const DOC_ROUTES: Routes = [
},
];
-export const docsRouting = RouterModule.forChild(DOC_ROUTES);
+export const docsRouting = DOC_ROUTES;
diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts
index 1b82e75d9d..a88ab4c7c8 100644
--- a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts
+++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts
@@ -1,8 +1,8 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { CustomMaterialModule } from '../../../shared/modules/material.module';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { EntriesService } from '../../../shared/openapi';
import { EntriesStubService } from '../../../test/service-stubs';
import { ArchiveEntryDialogComponent } from './archive-entry-dialog.component';
@@ -14,9 +14,8 @@ describe('ArchiveEntryDialogComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [ArchiveEntryDialogComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [CustomMaterialModule],
+ imports: [ArchiveEntryDialogComponent, MatLegacySnackBarModule],
providers: [
{ provide: EntriesService, useClass: EntriesStubService },
{
diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts
index bb072819a2..a8bdcbbefd 100644
--- a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts
+++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts
@@ -15,16 +15,26 @@
*/
import { HttpErrorResponse } from '@angular/common/http';
import { Component, Inject } from '@angular/core';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
-import { MatSnackBar } from '@angular/material/snack-bar';
+import {
+ MatLegacyDialogRef as MatDialogRef,
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule,
+} from '@angular/material/legacy-dialog';
+import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
import { Router } from '@angular/router';
import { Entry, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi';
import { AlertService } from '../../../shared/alert/state/alert.service';
+import { TitleCasePipe } from '@angular/common';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { AlertComponent } from '../../../shared/alert/alert.component';
@Component({
selector: 'app-archive-entry-dialog',
templateUrl: './archive-entry-dialog.component.html',
styleUrls: ['./archive-entry-dialog.component.scss'],
+ standalone: true,
+ imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule, TitleCasePipe],
})
export class ArchiveEntryDialogComponent {
clicked: boolean;
diff --git a/src/app/entry/current-collections.module.ts b/src/app/entry/current-collections.module.ts
index 117ad54d87..ae2b370e88 100644
--- a/src/app/entry/current-collections.module.ts
+++ b/src/app/entry/current-collections.module.ts
@@ -1,15 +1,13 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
-import { FlexLayoutModule } from '@angular/flex-layout';
+import { FlexLayoutModule } from '@ngbracket/ngx-layout';
import { RouterModule } from '@angular/router';
-import { ImgFallbackModule } from '../shared/modules/img-fallback.module';
-import { CustomMaterialModule } from '../shared/modules/material.module';
+
import { PipeModule } from '../shared/pipe/pipe.module';
import { CurrentCollectionsComponent } from './current-collections/current-collections.component';
@NgModule({
- imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RouterModule, ImgFallbackModule, PipeModule],
- declarations: [CurrentCollectionsComponent],
+ imports: [CommonModule, FlexLayoutModule, RouterModule, PipeModule, CurrentCollectionsComponent],
exports: [CurrentCollectionsComponent],
})
export class CurrentCollectionsModule {}
diff --git a/src/app/entry/current-collections/current-collections.component.ts b/src/app/entry/current-collections/current-collections.component.ts
index ae2d4ad3d9..6e0d8189af 100644
--- a/src/app/entry/current-collections/current-collections.component.ts
+++ b/src/app/entry/current-collections/current-collections.component.ts
@@ -1,5 +1,5 @@
-import { Component, Input, OnChanges, OnInit, SimpleChanges, Version } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ID } from '@datorama/akita';
import { Observable } from 'rxjs';
import { AddEntryComponent } from '../../organizations/collection/add-entry/add-entry.component';
@@ -8,11 +8,38 @@ import { TrackLoginService } from '../../shared/track-login.service';
import { CurrentCollectionsQuery } from '../state/current-collections.query';
import { CurrentCollectionsService } from '../state/current-collections.service';
import { OrgLogoService } from '../../shared/org-logo.service';
+import { GravatarPipe } from '../../gravatar/gravatar.pipe';
+import { RouterLinkActive, RouterLink } from '@angular/router';
+import { ImgFallbackDirective } from '../../shared/img-fallback.directive';
+import { MatDividerModule } from '@angular/material/divider';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, NgTemplateOutlet, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-current-collections',
templateUrl: './current-collections.component.html',
styleUrls: ['./current-collections.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyCardModule,
+ FlexModule,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ ExtendedModule,
+ MatDividerModule,
+ NgFor,
+ ImgFallbackDirective,
+ NgTemplateOutlet,
+ RouterLinkActive,
+ RouterLink,
+ AsyncPipe,
+ GravatarPipe,
+ ],
})
export class CurrentCollectionsComponent implements OnInit, OnChanges {
@Input() id: number;
diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts
index c1b2a06bb0..e4345731ae 100644
--- a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts
+++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts
@@ -1,8 +1,8 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { CustomMaterialModule } from '../../../shared/modules/material.module';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { EntriesService } from '../../../shared/openapi';
import { EntriesStubService } from '../../../test/service-stubs';
import { DeleteEntryDialogComponent } from './delete-entry-dialog.component';
@@ -14,9 +14,8 @@ describe('DeleteEntryDialogComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [DeleteEntryDialogComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [CustomMaterialModule],
+ imports: [DeleteEntryDialogComponent, MatLegacySnackBarModule],
providers: [
{ provide: EntriesService, useClass: EntriesStubService },
{
diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts
index c9d27f3eb6..4ffa06bcb9 100644
--- a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts
+++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts
@@ -15,16 +15,26 @@
*/
import { HttpErrorResponse } from '@angular/common/http';
import { Component, Inject } from '@angular/core';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
-import { MatSnackBar } from '@angular/material/snack-bar';
+import {
+ MatLegacyDialogRef as MatDialogRef,
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule,
+} from '@angular/material/legacy-dialog';
+import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
import { Router } from '@angular/router';
import { Entry, EntryType, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi';
import { AlertService } from '../../../shared/alert/state/alert.service';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf, TitleCasePipe } from '@angular/common';
+import { AlertComponent } from '../../../shared/alert/alert.component';
@Component({
selector: 'app-delete-entry-dialog',
templateUrl: './delete-entry-dialog.component.html',
styleUrls: ['./delete-entry-dialog.component.scss'],
+ standalone: true,
+ imports: [MatLegacyDialogModule, AlertComponent, NgIf, FlexModule, MatLegacyButtonModule, TitleCasePipe],
})
export class DeleteEntryDialogComponent {
clicked: boolean;
diff --git a/src/app/entry/file-path.pipe.ts b/src/app/entry/file-path.pipe.ts
index 5877d90f1a..961c086bd5 100644
--- a/src/app/entry/file-path.pipe.ts
+++ b/src/app/entry/file-path.pipe.ts
@@ -3,7 +3,10 @@ import { Pipe, PipeTransform } from '@angular/core';
* File paths are show relative to the primary descriptor, but the .dockstore.yml file can only ever be in one place
* so only display it as /.dockstore.yml
*/
-@Pipe({ name: 'filePathPipe' })
+@Pipe({
+ name: 'filePathPipe',
+ standalone: true,
+})
export class FilePathPipe implements PipeTransform {
transform(filePath: string): string {
if (filePath.endsWith('.dockstore.yml')) {
diff --git a/src/app/entry/router-link.pipe.ts b/src/app/entry/router-link.pipe.ts
index e5bcf68345..a12f2bc261 100644
--- a/src/app/entry/router-link.pipe.ts
+++ b/src/app/entry/router-link.pipe.ts
@@ -4,6 +4,7 @@ import { EntryTypeMetadataService } from './type-metadata/entry-type-metadata.se
@Pipe({
name: 'routerLink',
+ standalone: true,
})
export class RouterLinkPipe implements PipeTransform {
constructor(private entryTypeMetadataService: EntryTypeMetadataService) {}
diff --git a/src/app/file-tree/file-tree.component.spec.ts b/src/app/file-tree/file-tree.component.spec.ts
index f8e96508e4..14c04ef6b9 100644
--- a/src/app/file-tree/file-tree.component.spec.ts
+++ b/src/app/file-tree/file-tree.component.spec.ts
@@ -1,9 +1,15 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatButtonModule } from '@angular/material/button';
-import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import {
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule as MatDialogModule,
+ MatLegacyDialogRef as MatDialogRef,
+} from '@angular/material/legacy-dialog';
import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
import { MatTreeModule } from '@angular/material/tree';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { SourceFile } from 'app/shared/openapi';
import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service';
import { SourceFileTabsService } from '../source-file-tabs/source-file-tabs.service';
@@ -18,8 +24,16 @@ describe('FileTreeComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [FileTreeComponent],
- imports: [MatButtonModule, MatIconModule, MatTreeModule, MatDialogModule, HttpClientTestingModule],
+ imports: [
+ MatButtonModule,
+ MatIconModule,
+ MatTreeModule,
+ MatDialogModule,
+ HttpClientTestingModule,
+ MatLegacyInputModule,
+ BrowserAnimationsModule,
+ FileTreeComponent,
+ ],
providers: [
{ provide: MatDialogRef, useValue: {} },
{ provide: MAT_DIALOG_DATA, useValue: [] },
@@ -45,8 +59,8 @@ describe('FileTreeComponent', () => {
let expectedNodes = [];
expect(component.convertSourceFilesToTree(sourcefiles)).toEqual(expectedNodes);
sourcefiles = [
- { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL },
- { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL },
+ { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE },
+ { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE },
];
expectedNodes = [
Object({
diff --git a/src/app/file-tree/file-tree.component.ts b/src/app/file-tree/file-tree.component.ts
index fac8ce0af9..0f5d8e8f00 100644
--- a/src/app/file-tree/file-tree.component.ts
+++ b/src/app/file-tree/file-tree.component.ts
@@ -1,8 +1,17 @@
import { Component, Inject } from '@angular/core';
-import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
+import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';
import { FlatTreeControl } from '@angular/cdk/tree';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {
+ MatLegacyDialogRef as MatDialogRef,
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule,
+} from '@angular/material/legacy-dialog';
import { EntryType, SourceFile, ToolDescriptor } from 'app/shared/openapi';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf } from '@angular/common';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
/** File node data with possible child nodes. */
export interface FileNode {
@@ -34,6 +43,16 @@ export interface FlatTreeNode {
@Component({
selector: 'app-file-tree',
templateUrl: './file-tree.component.html',
+ standalone: true,
+ imports: [
+ MatLegacyDialogModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ MatTreeModule,
+ NgIf,
+ MatLegacyButtonModule,
+ MatIconModule,
+ ],
})
export class FileTreeComponent {
/** The TreeControl controls the expand/collapse state of tree nodes. */
diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts
index 3efa314623..162aaad1b6 100644
--- a/src/app/footer/footer.component.spec.ts
+++ b/src/app/footer/footer.component.spec.ts
@@ -14,9 +14,10 @@
* limitations under the License.
*/
+import { ClipboardModule } from '@angular/cdk/clipboard';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterTestingModule } from '@angular/router/testing';
import { ServiceInfoService } from '../service-info/service-info.service';
import { GA4GHV20Service } from './../shared/openapi';
@@ -32,8 +33,7 @@ describe('FooterComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [FooterComponent, GitTagPipe],
- imports: [RouterTestingModule, MatIconModule, MatSnackBarModule],
+ imports: [RouterTestingModule, MatIconModule, MatSnackBarModule, ClipboardModule, FooterComponent, GitTagPipe],
providers: [ServiceInfoService, { provide: GA4GHV20Service, useClass: GA4GHV20StubService }],
}).compileComponents();
})
diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts
index 1eb0861d91..3c9f35db27 100644
--- a/src/app/footer/footer.component.ts
+++ b/src/app/footer/footer.component.ts
@@ -24,11 +24,21 @@ import { Dockstore } from './../shared/dockstore.model';
import { TRSService } from 'app/shared/openapi';
import { FooterService } from './footer.service';
import { versions } from './versions';
+import { GitTagPipe } from './git-tag.pipe';
+import { NgFor } from '@angular/common';
+import { MatIconModule } from '@angular/material/icon';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../shared/snackbar.directive';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { RouterLink } from '@angular/router';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.scss'],
+ standalone: true,
+ imports: [FlexModule, RouterLink, MatLegacyButtonModule, SnackbarDirective, ClipboardModule, MatIconModule, NgFor, GitTagPipe],
})
export class FooterComponent extends Base implements OnInit {
domain: string;
diff --git a/src/app/footer/footer.service.spec.ts b/src/app/footer/footer.service.spec.ts
index de368be0c0..db77a0bbb5 100644
--- a/src/app/footer/footer.service.spec.ts
+++ b/src/app/footer/footer.service.spec.ts
@@ -1,3 +1,4 @@
+import { ClipboardModule } from '@angular/cdk/clipboard';
import { TestBed } from '@angular/core/testing';
import { FooterService } from './footer.service';
@@ -6,7 +7,9 @@ describe('FooterService', () => {
let service: FooterService;
beforeEach(() => {
- TestBed.configureTestingModule({});
+ TestBed.configureTestingModule({
+ imports: [ClipboardModule],
+ });
service = TestBed.inject(FooterService);
});
diff --git a/src/app/footer/git-tag.pipe.ts b/src/app/footer/git-tag.pipe.ts
index d0e071d9fa..cd01d06309 100644
--- a/src/app/footer/git-tag.pipe.ts
+++ b/src/app/footer/git-tag.pipe.ts
@@ -10,6 +10,7 @@ import { Pipe, PipeTransform } from '@angular/core';
*/
@Pipe({
name: 'gitTag',
+ standalone: true,
})
export class GitTagPipe implements PipeTransform {
/**
diff --git a/src/app/funding/funding.component.spec.ts b/src/app/funding/funding.component.spec.ts
index 7031a4eb4e..e2e2d8a609 100644
--- a/src/app/funding/funding.component.spec.ts
+++ b/src/app/funding/funding.component.spec.ts
@@ -1,5 +1,8 @@
/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { FundingComponent } from './funding.component';
@@ -10,7 +13,7 @@ describe('FundingComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [FundingComponent],
+ imports: [MatDividerModule, MatLegacyCardModule, FundingComponent, MatLegacySnackBarModule],
}).compileComponents();
})
);
diff --git a/src/app/funding/funding.component.ts b/src/app/funding/funding.component.ts
index 277b19463e..e71abe64ee 100644
--- a/src/app/funding/funding.component.ts
+++ b/src/app/funding/funding.component.ts
@@ -1,4 +1,10 @@
import { Component, Injectable } from '@angular/core';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatDividerModule } from '@angular/material/divider';
+import { NgFor } from '@angular/common';
+import { HeaderComponent } from '../header/header.component';
export interface Funder {
title: string;
@@ -17,6 +23,8 @@ export interface FundingSections {
selector: 'app-funding',
templateUrl: './funding.component.html',
styleUrls: ['./funding.component.scss'],
+ standalone: true,
+ imports: [HeaderComponent, NgFor, MatDividerModule, FlexModule, MatLegacyCardModule, MatLegacyButtonModule],
})
@Injectable()
export class FundingComponent {
diff --git a/src/app/github-callback/github-callback.component.ts b/src/app/github-callback/github-callback.component.ts
index 5363f4ed61..61280dcaef 100644
--- a/src/app/github-callback/github-callback.component.ts
+++ b/src/app/github-callback/github-callback.component.ts
@@ -4,11 +4,15 @@ import { Base } from 'app/shared/base';
import { ActivatedRoute } from 'app/test';
import { takeUntil } from 'rxjs/operators';
import { GithubCallbackService } from './github-callback.service';
+import { MatLegacyProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
@Component({
selector: 'app-github-callback',
templateUrl: './github-callback.component.html',
styleUrls: ['./github-callback.component.scss'],
+ standalone: true,
+ imports: [FlexModule, MatLegacyProgressSpinnerModule],
})
export class GithubCallbackComponent extends Base implements OnInit {
constructor(private activatedRoute: ActivatedRoute, private router: GithubCallbackService) {
diff --git a/src/app/github-callback/github-callback.service.ts b/src/app/github-callback/github-callback.service.ts
index a504aba6f2..0dc2fe26f2 100644
--- a/src/app/github-callback/github-callback.service.ts
+++ b/src/app/github-callback/github-callback.service.ts
@@ -1,5 +1,6 @@
import { Injectable } from '@angular/core';
import { Params, Router } from '@angular/router';
+import { EntryType } from 'app/shared/enum/entry-type';
@Injectable({
providedIn: 'root',
@@ -8,10 +9,10 @@ export class GithubCallbackService {
constructor(private router: Router) {}
public resolveQueryParam(queryParams: Params | null): void {
if (queryParams) {
- const state: string | null = queryParams.state;
- this.router.navigateByUrl(state);
+ const entryTypeValue: EntryType | null = queryParams.state;
+ this.router.navigate(['/github-landing-page'], { queryParams: { entryType: entryTypeValue } });
} else {
- this.router.navigateByUrl('/');
+ this.router.navigateByUrl('/github-landing-page');
}
}
}
diff --git a/src/app/github-landing-page/github-landing-page.component.html b/src/app/github-landing-page/github-landing-page.component.html
index d6ad3c3e03..45fc1f31d4 100644
--- a/src/app/github-landing-page/github-landing-page.component.html
+++ b/src/app/github-landing-page/github-landing-page.component.html
@@ -14,82 +14,85 @@
~ limitations under the License.
-->
-
-
-
-
Please wait while your GitHub repository installation is being processed. This may take a few minutes.
-
-
-
You can close this tab and return to Dockstore on the original tab.
+
+ Your GitHub repository installation is being processed. It may take a few minutes to register your {{ entryTypeMetadata.termPlural }}.
+
+
+
+
You can close this tab and return to Dockstore on the original tab.
-
-
-
- Do you have a .dockstore.yml file in your repository?
-
-
-
-
- If you havenât already, please create a .dockstore.yml file in your repository. This way, your workflows will be
- kept up-to-date automatically.
+
+
+
+ Do you have a .dockstore.yml file in your repository?
+
+
+
+
+ If you havenât already, please create a .dockstore.yml file in your repository. This way, your
+ {{ entryTypeMetadata.termPlural }} will be kept up-to-date automatically.
+
+
Here is a .dockstore.yml template:
+
+
+
+
+ View more .dockstore.yml templates for {{ entryTypeMetadata.termPlural }}
+ here.
+
- Note: the first line of this file references the version of .dockstore.yml syntax being used, not the version/tag
- of the workflow/tool/service/notebook it describes
-
-
-
-
-
-
- Tips and Tricks
-
-
-
-
-
-
-
- Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml
-
-
Put the .dockstore.yml file in the top of your repository or inside the .github/ directory
- You can use a single .dockstore.yml file to register multiple tools, workflows, and notebooks, provided they are
- all in the same repository as the .dockstore.yml file. If you do so, each one needs a unique name, it is
- recommended to give each one a unique readMePath too.
-
-
-
-
-
-
- For more information on registering, please visit our
- docs.
-
+
+
+
+ Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml.
+
+
Put the .dockstore.yml file in the top of your repository.
+ You can use a single .dockstore.yml file to register multiple {{ entryTypeMetadata.termPlural }}, provided they are
+ all in the same repository as the .dockstore.yml file. If you do so, each {{ entryTypeMetadata.term }} needs a
+ unique name.
+
- Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows. Itâs developed by
- the
- Cancer Genome Collaboratory
- and used by the GA4GH.
+ Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows.
diff --git a/src/app/home-page/home-logged-out/home.component.scss b/src/app/home-page/home-logged-out/home.component.scss
index a82ee0ad70..33610751ee 100644
--- a/src/app/home-page/home-logged-out/home.component.scss
+++ b/src/app/home-page/home-logged-out/home.component.scss
@@ -115,10 +115,6 @@ h3 {
border-radius: 1rem;
}
-.primary-3 {
- color: mat.get-color-from-palette($dockstore-app-primary, 3);
-}
-
.warn-1 {
color: mat.get-color-from-palette($dockstore-app-error, darker);
}
diff --git a/src/app/home-page/home-logged-out/home.component.spec.ts b/src/app/home-page/home-logged-out/home.component.spec.ts
index b28ffc1f3a..4fd274f166 100644
--- a/src/app/home-page/home-logged-out/home.component.spec.ts
+++ b/src/app/home-page/home-logged-out/home.component.spec.ts
@@ -16,10 +16,11 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
import { HomeComponent } from './home.component';
import { MastodonService } from '../../shared/mastodon/mastodon.service';
@@ -30,9 +31,15 @@ describe('HomeComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [HomeComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [CustomMaterialModule, RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule],
+ imports: [
+ RouterTestingModule,
+ HttpClientTestingModule,
+ BrowserAnimationsModule,
+ HomeComponent,
+ MatLegacyDialogModule,
+ MatLegacySnackBarModule,
+ ],
providers: [MastodonService, DescriptorLanguageService],
}).compileComponents();
})
diff --git a/src/app/home-page/home-logged-out/home.component.ts b/src/app/home-page/home-logged-out/home.component.ts
index 527ddf9911..7014bd506e 100644
--- a/src/app/home-page/home-logged-out/home.component.ts
+++ b/src/app/home-page/home-logged-out/home.component.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
-import { MatDialog, MatDialogRef } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { faGithub, faGoogle } from '@fortawesome/free-brands-svg-icons';
import { HomePageService } from 'app/home-page/home-page.service';
import { Base } from 'app/shared/base';
@@ -24,6 +24,23 @@ import { User } from '../../shared/openapi/model/user';
import { UserQuery } from '../../shared/user/user.query';
import { Category } from '../../shared/openapi';
import { AllCategoriesService } from '../../categories/state/all-categories.service';
+import { MastodonComponent } from '../../shared/mastodon/mastodon.component';
+import { MatDividerModule } from '@angular/material/divider';
+import { NewsAndUpdatesComponent } from '../widget/featured-content/news-and-updates.component';
+import { FeaturedContentComponent } from '../widget/featured-content/featured-content.component';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { MatLegacyTabsModule } from '@angular/material/legacy-tabs';
+import { CategoryButtonComponent } from '../../categories/button/category-button.component';
+import { MatLegacyChipsModule } from '@angular/material/legacy-chips';
+import { NgIf, NgFor, AsyncPipe, SlicePipe } from '@angular/common';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { RouterLink } from '@angular/router';
+import { JsonLdComponent } from '../../shared/json-ld/json-ld.component';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
/**
* Simple youtube iframe component, too simple to have its own file
@@ -33,6 +50,7 @@ import { AllCategoriesService } from '../../categories/state/all-categories.serv
*/
@Component({
template: '',
+ standalone: true,
})
export class YoutubeComponent {
constructor(public dialogRef: MatDialogRef) {}
@@ -42,6 +60,29 @@ export class YoutubeComponent {
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss'],
+ standalone: true,
+ imports: [
+ FlexModule,
+ JsonLdComponent,
+ RouterLink,
+ MatLegacyButtonModule,
+ MatIconModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ NgIf,
+ MatLegacyChipsModule,
+ NgFor,
+ CategoryButtonComponent,
+ MatLegacyTabsModule,
+ ExtendedModule,
+ FontAwesomeModule,
+ FeaturedContentComponent,
+ NewsAndUpdatesComponent,
+ MatDividerModule,
+ MastodonComponent,
+ AsyncPipe,
+ SlicePipe,
+ ],
})
export class HomeComponent extends Base implements OnInit {
faGithub = faGithub;
diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts
deleted file mode 100644
index b279c9924f..0000000000
--- a/src/app/home-page/home-page.module.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { HttpClientModule } from '@angular/common/http';
-import { NgModule } from '@angular/core';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { FormsModule } from '@angular/forms';
-import { RouterModule } from '@angular/router';
-import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
-import { HomeComponent } from 'app/home-page/home-logged-out/home.component';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { MarkdownModule } from 'ngx-markdown';
-import { RefreshWizardModule } from '../container/refresh-wizard.module';
-import { RefreshAlertModule } from '../shared/alert/alert.module';
-import { CategoryButtonModule } from '../categories/button/category-button.module';
-import { JsonLdModule } from '../shared/modules/json-ld.module';
-import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module';
-import { RecentEventsModule } from './recent-events/recent-events.module';
-import { FeaturedContentComponent } from './widget/featured-content/featured-content.component';
-import { NewsAndUpdatesComponent } from './widget/featured-content/news-and-updates.component';
-import { GettingStartedComponent } from './widget/getting-started/getting-started.component';
-import { NewsNotificationsComponent } from './widget/news-updates/news-notifications.component';
-import { MySidebarModule } from '../shared/modules/my-sidebar.module';
-import { EntryBoxComponent } from './widget/entry-box/entry-box.component';
-import { MytoolsService } from 'app/mytools/mytools.service';
-import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service';
-import { MyEntriesStateService } from 'app/shared/state/my-entries.service';
-import { MyEntriesStore } from 'app/shared/state/my-entries.store';
-import { MyEntriesQuery } from 'app/shared/state/my-entries.query';
-import { RegisterWorkflowModalService } from 'app/workflow/register-workflow-modal/register-workflow-modal.service';
-import { RegisterToolService } from 'app/container/register-tool/register-tool.service';
-import { RegisterToolComponent } from 'app/container/register-tool/register-tool.component';
-import { DashboardComponent } from './dashboard/dashboard.component';
-import { OrganizationBoxComponent } from './widget/organization-box/organization-box.component';
-import { StarredBoxComponent } from './widget/starred-box/starred-box.component';
-import { HeaderModule } from 'app/shared/modules/header.module';
-import { NewsBoxComponent } from './widget/news-box/news-box.component';
-import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module';
-import { PreviewWarningModule } from '../shared/modules/preview-warning.module';
-import { MastodonComponent } from '../shared/mastodon/mastodon.component';
-import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module';
-
-@NgModule({
- imports: [
- CommonModule,
- CustomMaterialModule,
- FlexLayoutModule,
- RouterModule,
- FormsModule,
- HttpClientModule,
- RefreshAlertModule,
- MarkdownModule,
- FontAwesomeModule,
- MatAutocompleteModule,
- CategoryButtonModule,
- JsonLdModule,
- MySidebarModule,
- RecentEventsModule,
- RefreshWizardModule,
- HeaderModule,
- MarkdownWrapperModule,
- PreviewWarningModule,
- RegisterGithubAppModule,
- SharedWorkflowServicesNotebooksModule,
- ],
- declarations: [
- HomeComponent,
- FeaturedContentComponent,
- NewsAndUpdatesComponent,
- NewsNotificationsComponent,
- GettingStartedComponent,
- EntryBoxComponent,
- RegisterToolComponent,
- DashboardComponent,
- OrganizationBoxComponent,
- StarredBoxComponent,
- NewsBoxComponent,
- MastodonComponent,
- ],
- providers: [
- MytoolsService,
- MyWorkflowsService,
- MyEntriesStateService,
- MyEntriesStore,
- MyEntriesQuery,
- RegisterToolService,
- RegisterWorkflowModalService,
- ],
-})
-export class HomePageModule {}
diff --git a/src/app/home-page/home-page.service.ts b/src/app/home-page/home-page.service.ts
index 29a57ef8d6..a7b21af796 100644
--- a/src/app/home-page/home-page.service.ts
+++ b/src/app/home-page/home-page.service.ts
@@ -10,7 +10,7 @@ export class HomePageService {
'@context': 'http://schema.org',
'@type': 'Organization',
description:
- 'Dockstore, developed by the Cancer Genome Collaboratory, is an open platform used by the GA4GH for sharing ' +
+ 'Dockstore is an open platform used by the GA4GH for sharing ' +
'Docker-based tools described with the Common Workflow Language (CWL), the Workflow Description Language (WDL), or Nextflow (NFL)',
logo: '../assets/images/dockstore/dockstore.png',
name: 'Dockstore',
diff --git a/src/app/home-page/recent-events/recent-events.component.ts b/src/app/home-page/recent-events/recent-events.component.ts
index 87282280f0..dd6926b388 100644
--- a/src/app/home-page/recent-events/recent-events.component.ts
+++ b/src/app/home-page/recent-events/recent-events.component.ts
@@ -1,5 +1,5 @@
import { Component, Input, OnInit } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, RouterLink } from '@angular/router';
import { ID } from '@datorama/akita';
import { Dockstore } from 'app/shared/dockstore.model';
import { Event, User, UsersService, EventsService } from 'app/shared/openapi';
@@ -13,6 +13,14 @@ import { Base } from 'app/shared/base';
import { Observable } from 'rxjs';
import { OrgLogoService } from '../../shared/org-logo.service';
import { GravatarService } from '../../gravatar/gravatar.service';
+import { RecentEventsPipe } from '../../shared/entry/recent-events.pipe';
+import { GravatarPipe } from '../../gravatar/gravatar.pipe';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { ImgFallbackDirective } from '../../shared/img-fallback.directive';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf, NgFor, NgSwitch, NgSwitchCase, AsyncPipe, LowerCasePipe, SlicePipe, DatePipe } from '@angular/common';
+import { LoadingComponent } from '../../shared/loading/loading.component';
/**
* Shows recent events related to starred organization and entries or user organization events
@@ -25,6 +33,25 @@ import { GravatarService } from '../../gravatar/gravatar.service';
selector: 'app-recent-events',
templateUrl: './recent-events.component.html',
styleUrls: ['../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
+ imports: [
+ LoadingComponent,
+ NgIf,
+ NgFor,
+ FlexModule,
+ RouterLink,
+ NgSwitch,
+ NgSwitchCase,
+ ImgFallbackDirective,
+ MatLegacyCardModule,
+ MatIconModule,
+ AsyncPipe,
+ LowerCasePipe,
+ SlicePipe,
+ DatePipe,
+ GravatarPipe,
+ RecentEventsPipe,
+ ],
})
export class RecentEventsComponent extends Base implements OnInit {
@Input() eventType: 'SELF_ORGANIZATIONS' | 'ALL_STARRED';
diff --git a/src/app/home-page/recent-events/recent-events.module.ts b/src/app/home-page/recent-events/recent-events.module.ts
index 0bca81cb79..86068bdbfa 100644
--- a/src/app/home-page/recent-events/recent-events.module.ts
+++ b/src/app/home-page/recent-events/recent-events.module.ts
@@ -1,21 +1,18 @@
import { NgModule } from '@angular/core';
import { RecentEventsComponent } from './recent-events.component';
-import { RefreshAlertModule } from '../../shared/alert/alert.module';
+
import { CommonModule } from '@angular/common';
import { EntryToDisplayNamePipe } from 'app/shared/entry-to-display-name.pipe';
-import { MatCardModule } from '@angular/material/card';
-import { FlexLayoutModule } from '@angular/flex-layout';
+import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card';
+import { FlexLayoutModule } from '@ngbracket/ngx-layout';
import { MatDividerModule } from '@angular/material/divider';
import { RouterModule } from '@angular/router';
import { MatIconModule } from '@angular/material/icon';
import { PipeModule } from '../../shared/pipe/pipe.module';
-import { ImgFallbackModule } from '../../shared/modules/img-fallback.module';
@NgModule({
- declarations: [RecentEventsComponent, EntryToDisplayNamePipe],
providers: [],
imports: [
- RefreshAlertModule,
MatIconModule,
CommonModule,
MatCardModule,
@@ -23,7 +20,8 @@ import { ImgFallbackModule } from '../../shared/modules/img-fallback.module';
MatDividerModule,
RouterModule,
PipeModule,
- ImgFallbackModule,
+ RecentEventsComponent,
+ EntryToDisplayNamePipe,
],
exports: [RecentEventsComponent],
})
diff --git a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts
index 72dfe0d8f4..ec055574d6 100644
--- a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts
+++ b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts
@@ -1,12 +1,12 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatButtonModule } from '@angular/material/button';
-import { MatDialogModule } from '@angular/material/dialog';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog';
import { MatIconModule } from '@angular/material/icon';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterTestingModule } from '@angular/router/testing';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
+import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete';
import { RegisterToolService } from 'app/container/register-tool/register-tool.service';
import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service';
import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service';
@@ -34,7 +34,6 @@ describe('EntryBoxComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [EntryBoxComponent],
schemas: [NO_ERRORS_SCHEMA],
imports: [
MatAutocompleteModule,
@@ -44,6 +43,7 @@ describe('EntryBoxComponent', () => {
MatDialogModule,
HttpClientTestingModule,
MatSnackBarModule,
+ EntryBoxComponent,
],
providers: [
{ provide: RegisterToolService, useClass: RegisterToolStubService },
diff --git a/src/app/home-page/widget/entry-box/entry-box.component.ts b/src/app/home-page/widget/entry-box/entry-box.component.ts
index 515a52262f..52b15cc460 100644
--- a/src/app/home-page/widget/entry-box/entry-box.component.ts
+++ b/src/app/home-page/widget/entry-box/entry-box.component.ts
@@ -25,12 +25,43 @@ import { Dockstore } from 'app/shared/dockstore.model';
import { AlertService } from 'app/shared/alert/state/alert.service';
import { HttpResponse, HttpErrorResponse } from '@angular/common/http';
import { SessionService } from '../../../shared/session/session.service';
-import { Router } from '@angular/router';
+import { Router, RouterLink } from '@angular/router';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete';
+import { FormsModule } from '@angular/forms';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf, NgFor, TitleCasePipe, DatePipe } from '@angular/common';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
@Component({
selector: 'app-entry-box',
templateUrl: './entry-box.component.html',
styleUrls: ['../../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyCardModule,
+ FlexModule,
+ NgIf,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ MatDividerModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ FormsModule,
+ MatLegacyAutocompleteModule,
+ MatIconModule,
+ NgFor,
+ MatLegacyOptionModule,
+ RouterLink,
+ TitleCasePipe,
+ DatePipe,
+ ],
})
export class EntryBoxComponent extends Base implements OnInit {
Dockstore = Dockstore;
diff --git a/src/app/home-page/widget/featured-content/featured-content.component.ts b/src/app/home-page/widget/featured-content/featured-content.component.ts
index 4a86ea10a6..0a975c6a14 100644
--- a/src/app/home-page/widget/featured-content/featured-content.component.ts
+++ b/src/app/home-page/widget/featured-content/featured-content.component.ts
@@ -6,6 +6,7 @@ import { Dockstore } from '../../../shared/dockstore.model';
@Component({
selector: 'app-featured-content',
template: ` `,
+ standalone: true,
})
export class FeaturedContentComponent implements OnInit {
public myExternalHTML = '';
diff --git a/src/app/home-page/widget/featured-content/news-and-updates.component.ts b/src/app/home-page/widget/featured-content/news-and-updates.component.ts
index be7e107941..410704805b 100644
--- a/src/app/home-page/widget/featured-content/news-and-updates.component.ts
+++ b/src/app/home-page/widget/featured-content/news-and-updates.component.ts
@@ -7,6 +7,7 @@ import { Dockstore } from '../../../shared/dockstore.model';
selector: 'app-news-and-updates',
template: ` `,
styleUrls: ['../../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
})
export class NewsAndUpdatesComponent {
// TODO should parameterize FeaturedContentComponent or something
diff --git a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts
index 562edfdbc8..94d788c00a 100644
--- a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts
+++ b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts
@@ -1,7 +1,8 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-
-import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
+
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { RouterTestingModule } from '@angular/router/testing';
import { RouterLinkStubDirective } from '../../../test';
import { GettingStartedComponent } from './getting-started.component';
@@ -12,8 +13,8 @@ describe('GettingStartedComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [GettingStartedComponent, RouterLinkStubDirective],
- imports: [MatIconModule, MatButtonModule],
+ declarations: [RouterLinkStubDirective],
+ imports: [RouterTestingModule, MatIconModule, MatLegacyButtonModule, GettingStartedComponent],
}).compileComponents();
})
);
diff --git a/src/app/home-page/widget/getting-started/getting-started.component.ts b/src/app/home-page/widget/getting-started/getting-started.component.ts
index c88fd7bb49..1b386c5f7b 100644
--- a/src/app/home-page/widget/getting-started/getting-started.component.ts
+++ b/src/app/home-page/widget/getting-started/getting-started.component.ts
@@ -1,10 +1,15 @@
import { Component } from '@angular/core';
import { Dockstore } from '../../../shared/dockstore.model';
+import { MatIconModule } from '@angular/material/icon';
+import { RouterLink } from '@angular/router';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
@Component({
selector: 'app-getting-started',
templateUrl: './getting-started.component.html',
styleUrls: ['./getting-started.component.scss'],
+ standalone: true,
+ imports: [MatLegacyButtonModule, RouterLink, MatIconModule],
})
export class GettingStartedComponent {
Dockstore = Dockstore;
diff --git a/src/app/home-page/widget/news-box/news-box.component.spec.ts b/src/app/home-page/widget/news-box/news-box.component.spec.ts
index 4eca91143b..4d43a241cc 100644
--- a/src/app/home-page/widget/news-box/news-box.component.spec.ts
+++ b/src/app/home-page/widget/news-box/news-box.component.spec.ts
@@ -1,4 +1,8 @@
+import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { NewsBoxComponent } from './news-box.component';
describe('NewsBoxComponent', () => {
@@ -7,7 +11,7 @@ describe('NewsBoxComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [NewsBoxComponent],
+ imports: [MatLegacyCardModule, MatDividerModule, NewsBoxComponent, HttpClientTestingModule, MatLegacySnackBarModule],
}).compileComponents();
});
diff --git a/src/app/home-page/widget/news-box/news-box.component.ts b/src/app/home-page/widget/news-box/news-box.component.ts
index 7806d45758..990b6c51d1 100644
--- a/src/app/home-page/widget/news-box/news-box.component.ts
+++ b/src/app/home-page/widget/news-box/news-box.component.ts
@@ -1,8 +1,14 @@
import { Component } from '@angular/core';
+import { NewsAndUpdatesComponent } from '../featured-content/news-and-updates.component';
+import { MatDividerModule } from '@angular/material/divider';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
@Component({
selector: 'app-news-box',
templateUrl: './news-box.component.html',
styleUrls: ['../../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
+ imports: [MatLegacyCardModule, FlexModule, MatDividerModule, NewsAndUpdatesComponent],
})
export class NewsBoxComponent {}
diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts
index ae289c871d..1282f9a157 100644
--- a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts
+++ b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts
@@ -10,8 +10,7 @@ describe('NewsNotificationsComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [NewsNotificationsComponent],
- imports: [MarkdownModule, HttpClientTestingModule],
+ imports: [MarkdownModule, HttpClientTestingModule, NewsNotificationsComponent],
}).compileComponents();
})
);
diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.ts b/src/app/home-page/widget/news-updates/news-notifications.component.ts
index 49da060f53..aa4b595706 100644
--- a/src/app/home-page/widget/news-updates/news-notifications.component.ts
+++ b/src/app/home-page/widget/news-updates/news-notifications.component.ts
@@ -2,11 +2,19 @@ import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { NotificationsService } from '../../../notifications/state/notifications.service';
import { Notification } from '../../../shared/openapi';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MarkdownWrapperComponent } from '../../../shared/markdown-wrapper/markdown-wrapper.component';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgFor, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-news-notifications',
templateUrl: './news-notifications.component.html',
styleUrls: ['./news-notifications.component.scss'],
+ standalone: true,
+ imports: [NgFor, MatLegacyCardModule, FlexModule, MarkdownWrapperComponent, MatLegacyButtonModule, MatIconModule, AsyncPipe],
})
export class NewsNotificationsComponent implements OnInit {
public activeNotifications$: Observable>;
diff --git a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts
index 6229d7edc2..644fc37d7b 100644
--- a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts
+++ b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts
@@ -1,10 +1,19 @@
import { Component, Inject } from '@angular/core';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {
+ MatLegacyDialogRef as MatDialogRef,
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule,
+} from '@angular/material/legacy-dialog';
import { OrganizationUpdateTime } from 'app/shared/openapi';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgFor, DatePipe } from '@angular/common';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
@Component({
selector: 'app-my-organizations-dialog',
templateUrl: './my-organizations-dialog.component.html',
+ standalone: true,
+ imports: [FlexModule, MatLegacyDialogModule, NgFor, MatLegacyButtonModule, DatePipe],
})
export class MyOrganizationsDialogComponent {
constructor(
diff --git a/src/app/home-page/widget/organization-box/organization-box.component.ts b/src/app/home-page/widget/organization-box/organization-box.component.ts
index 320ea9be3e..997f5d9e1c 100644
--- a/src/app/home-page/widget/organization-box/organization-box.component.ts
+++ b/src/app/home-page/widget/organization-box/organization-box.component.ts
@@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { RequestsQuery } from 'app/loginComponents/state/requests.query';
import { RequireAccountsModalComponent } from 'app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component';
import { Base } from 'app/shared/base';
@@ -9,12 +9,33 @@ import { bootstrap4mediumModalSize, bootstrap4largeModalSize } from 'app/shared/
import { Observable } from 'rxjs';
import { finalize, takeUntil } from 'rxjs/operators';
import { MyOrganizationsDialogComponent } from './my-organizations-dialog.component/my-organizations-dialog.component';
-import { Router } from '@angular/router';
+import { Router, RouterLink } from '@angular/router';
+import { RecentEventsComponent } from '../../recent-events/recent-events.component';
+import { MatDividerModule } from '@angular/material/divider';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf, AsyncPipe } from '@angular/common';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatIconModule } from '@angular/material/icon';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
@Component({
selector: 'app-organization-box',
templateUrl: './organization-box.component.html',
styleUrls: ['./organization-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyCardModule,
+ FlexModule,
+ MatIconModule,
+ RouterLink,
+ MatLegacyTooltipModule,
+ NgIf,
+ MatLegacyButtonModule,
+ MatDividerModule,
+ RecentEventsComponent,
+ AsyncPipe,
+ ],
})
export class OrganizationBoxComponent extends Base implements OnInit {
Dockstore = Dockstore;
diff --git a/src/app/home-page/widget/starred-box/starred-box.component.ts b/src/app/home-page/widget/starred-box/starred-box.component.ts
index 74f51b9318..ba397ab6c5 100644
--- a/src/app/home-page/widget/starred-box/starred-box.component.ts
+++ b/src/app/home-page/widget/starred-box/starred-box.component.ts
@@ -2,11 +2,20 @@ import { Component, OnInit } from '@angular/core';
import { Base } from 'app/shared/base';
import { Dockstore } from 'app/shared/dockstore.model';
import { UsersService } from 'app/shared/openapi';
+import { RecentEventsComponent } from '../../recent-events/recent-events.component';
+import { MatDividerModule } from '@angular/material/divider';
+import { NgIf } from '@angular/common';
+import { RouterLink } from '@angular/router';
+import { MatIconModule } from '@angular/material/icon';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
@Component({
selector: 'app-starred-box',
templateUrl: './starred-box.component.html',
styleUrls: ['./starred-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'],
+ standalone: true,
+ imports: [MatLegacyCardModule, FlexModule, MatIconModule, RouterLink, NgIf, MatDividerModule, RecentEventsComponent],
})
export class StarredBoxComponent extends Base implements OnInit {
public Dockstore = Dockstore;
diff --git a/src/app/information-dialog/information-dialog.component.ts b/src/app/information-dialog/information-dialog.component.ts
index d5720877b9..1675c7cb3c 100644
--- a/src/app/information-dialog/information-dialog.component.ts
+++ b/src/app/information-dialog/information-dialog.component.ts
@@ -1,5 +1,12 @@
import { Component, Inject } from '@angular/core';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {
+ MatLegacyDialogRef as MatDialogRef,
+ MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA,
+ MatLegacyDialogModule,
+} from '@angular/material/legacy-dialog';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf } from '@angular/common';
export class InformationDialogData {
message?: string;
@@ -10,6 +17,8 @@ export class InformationDialogData {
@Component({
selector: 'app-information-dialog',
templateUrl: './information-dialog.component.html',
+ standalone: true,
+ imports: [NgIf, MatLegacyDialogModule, FlexModule, MatLegacyButtonModule],
})
export class InformationDialogComponent {
constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: InformationDialogData) {}
diff --git a/src/app/information-dialog/information-dialog.service.ts b/src/app/information-dialog/information-dialog.service.ts
index 3d15c42dee..38574ce420 100644
--- a/src/app/information-dialog/information-dialog.service.ts
+++ b/src/app/information-dialog/information-dialog.service.ts
@@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { Observable } from 'rxjs';
import { InformationDialogComponent, InformationDialogData } from './information-dialog.component';
diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html
index 10c691ecba..d6e17bb0a7 100644
--- a/src/app/login/login.component.html
+++ b/src/app/login/login.component.html
@@ -17,7 +17,7 @@
-
Login to Collaboratory Dockstore
+
Login to Dockstore
diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts
index 9e1a962fc8..80a04b7fe8 100644
--- a/src/app/login/login.component.spec.ts
+++ b/src/app/login/login.component.spec.ts
@@ -15,9 +15,12 @@
*/
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { RegisterService } from '../register/register.service';
+import { ProviderService } from '../shared/provider.service';
import { TrackLoginService } from '../shared/track-login.service';
import { UserService } from '../shared/user/user.service';
import { LoginStubService, TrackLoginStubService, UserStubService } from '../test/service-stubs';
@@ -31,14 +34,14 @@ describe('LoginComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [LoginComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [RouterTestingModule],
+ imports: [RouterTestingModule, LoginComponent, MatLegacySnackBarModule, NoopAnimationsModule],
providers: [
{ provide: TrackLoginService, useClass: TrackLoginStubService },
{ provide: UserService, useClass: UserStubService },
{ provide: LoginService, useClass: LoginStubService },
{ provide: RegisterService, useClass: LoginStubService },
+ ProviderService,
],
}).compileComponents();
})
diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts
index 40913145d1..1628759388 100644
--- a/src/app/login/login.component.ts
+++ b/src/app/login/login.component.ts
@@ -23,11 +23,32 @@ import { RegisterService } from '../register/register.service';
import { TrackLoginService } from '../shared/track-login.service';
import { UserService } from '../shared/user/user.service';
import { LoginService } from './login.service';
+import { NgTemplateOutlet } from '@angular/common';
+import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyTabsModule } from '@angular/material/legacy-tabs';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { AlertComponent } from '../shared/alert/alert.component';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss'],
+ standalone: true,
+ imports: [
+ AlertComponent,
+ FlexModule,
+ MatLegacyCardModule,
+ MatLegacyTabsModule,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ FontAwesomeModule,
+ MatLegacyCheckboxModule,
+ NgTemplateOutlet,
+ ],
})
export class LoginComponent {
faGithub = faGithub;
diff --git a/src/app/login/login.service.spec.ts b/src/app/login/login.service.spec.ts
index 576134d893..eeb3ab5ed4 100644
--- a/src/app/login/login.service.spec.ts
+++ b/src/app/login/login.service.spec.ts
@@ -14,8 +14,8 @@
* limitations under the License.
*/
import { inject, TestBed } from '@angular/core/testing';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
-import { AuthService } from 'ng2-ui-auth';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
+import { AuthService } from '../ng2-ui-auth/public_api';
import { AuthStubService } from '../test/service-stubs';
import { LoginService } from './login.service';
diff --git a/src/app/login/login.service.ts b/src/app/login/login.service.ts
index 72cde2f132..fcd99fb3a7 100644
--- a/src/app/login/login.service.ts
+++ b/src/app/login/login.service.ts
@@ -15,8 +15,8 @@
*/
import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
-import { AuthService } from 'ng2-ui-auth';
import { Observable } from 'rxjs';
+import { AuthService } from '../ng2-ui-auth/public_api';
import { AlertService } from '../shared/alert/state/alert.service';
@Injectable()
diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts
index f49ca7c40b..a9feafb913 100644
--- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts
+++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts
@@ -1,10 +1,13 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
+import { RouterTestingModule } from '@angular/router/testing';
import { AccountSidebarComponent } from './account-sidebar.component';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { FlexLayoutModule } from '@angular/flex-layout';
+import { FlexLayoutModule } from '@ngbracket/ngx-layout';
import { CommonModule } from '@angular/common';
-import { MatTableModule } from '@angular/material/table';
+import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table';
import { UsersService } from '../../../shared/openapi/api/users.service';
import { UserService } from '../../../shared/user/user.service';
import { UsersStubService, UserStubService } from '../../../test/service-stubs';
@@ -16,8 +19,16 @@ describe('AccountSidebarComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
- declarations: [AccountSidebarComponent],
- imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, MatTableModule],
+ imports: [
+ FlexLayoutModule,
+ CommonModule,
+ MatTableModule,
+ MatLegacyButtonModule,
+ MatLegacySnackBarModule,
+ MatLegacyDialogModule,
+ RouterTestingModule,
+ AccountSidebarComponent,
+ ],
providers: [
{ provide: UsersService, useClass: UsersStubService },
{ provide: UserService, useClass: UserStubService },
diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts
index 4617854331..78ffbda541 100644
--- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts
+++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts
@@ -9,14 +9,22 @@ import { Profile, User } from '../../../shared/openapi';
import { UsersService } from '../../../shared/openapi/api/users.service';
import { UserQuery } from '../../../shared/user/user.query';
import { UserService } from '../../../shared/user/user.service';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ChangeUsernameComponent } from '../../../../app/loginComponents/accounts/internal/change-username/change-username.component';
import { bootstrap4largeModalSize } from '../../../shared/constants';
+import { RouterLink } from '@angular/router';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatIconModule } from '@angular/material/icon';
+import { NgIf } from '@angular/common';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
@Component({
selector: 'app-account-sidebar',
templateUrl: './account-sidebar.component.html',
styleUrls: ['./account-sidebar.component.scss'],
+ standalone: true,
+ imports: [FlexModule, NgIf, MatIconModule, MatLegacyTooltipModule, MatLegacyButtonModule, RouterLink],
})
export class AccountSidebarComponent implements OnInit {
user: User;
diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts
deleted file mode 100644
index 6141587033..0000000000
--- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2022 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { NgModule } from '@angular/core';
-import { AccountSidebarComponent } from './account-sidebar.component';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { CommonModule } from '@angular/common';
-import { RouterModule } from '@angular/router';
-import { ChangeUsernameModule } from '../internal/change-username/change-username.module';
-
-@NgModule({
- declarations: [AccountSidebarComponent],
- imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, RouterModule, ChangeUsernameModule],
- providers: [],
- exports: [AccountSidebarComponent],
-})
-export class AccountSidebarModule {}
diff --git a/src/app/loginComponents/accounts/accounts.component.ts b/src/app/loginComponents/accounts/accounts.component.ts
index f1983bc7c8..c7851b5eff 100644
--- a/src/app/loginComponents/accounts/accounts.component.ts
+++ b/src/app/loginComponents/accounts/accounts.component.ts
@@ -1,16 +1,34 @@
import { Location } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { UntypedFormControl } from '@angular/forms';
-import { MatTabChangeEvent } from '@angular/material/tabs';
+import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs';
import { ActivatedRoute, Params } from '@angular/router';
import { Observable } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Base } from '../../shared/base';
+import { RequestsComponent } from '../requests/requests.component';
+import { ControlsComponent } from './controls/controls.component';
+import { AccountsExternalComponent } from './external/accounts.component';
+import { AccountSidebarComponent } from './account-sidebar/account-sidebar.component';
+import { HeaderComponent } from '../../header/header.component';
+import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
@Component({
selector: 'app-accounts',
templateUrl: './accounts.component.html',
styleUrls: ['./accounts.component.scss'],
+ standalone: true,
+ imports: [
+ FlexModule,
+ MySidebarComponent,
+ HeaderComponent,
+ AccountSidebarComponent,
+ MatLegacyTabsModule,
+ AccountsExternalComponent,
+ ControlsComponent,
+ RequestsComponent,
+ ],
})
export class AccountsComponent extends Base implements OnInit {
public currentTab = 'accounts'; // default to the 'accounts' tab
diff --git a/src/app/loginComponents/accounts/controls/controls.component.spec.ts b/src/app/loginComponents/accounts/controls/controls.component.spec.ts
index 3c9f0303a0..924f1ee536 100644
--- a/src/app/loginComponents/accounts/controls/controls.component.spec.ts
+++ b/src/app/loginComponents/accounts/controls/controls.component.spec.ts
@@ -2,7 +2,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { CustomMaterialModule } from '../../../shared/modules/material.module';
import { RefreshService } from '../../../shared/refresh.service';
import { UsersService } from '../../../shared/openapi';
import { UserService } from '../../../shared/user/user.service';
@@ -17,8 +16,7 @@ describe('ControlsComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [ControlsComponent, ChangeUsernameComponent],
- imports: [CustomMaterialModule, BrowserAnimationsModule, ReactiveFormsModule],
+ imports: [BrowserAnimationsModule, ReactiveFormsModule, ControlsComponent, ChangeUsernameComponent],
providers: [
{ provide: UserService, useClass: UserStubService },
{ provide: UsersService, useClass: UsersStubService },
diff --git a/src/app/loginComponents/accounts/controls/controls.component.ts b/src/app/loginComponents/accounts/controls/controls.component.ts
index 24265ce5d0..ce3e898d96 100644
--- a/src/app/loginComponents/accounts/controls/controls.component.ts
+++ b/src/app/loginComponents/accounts/controls/controls.component.ts
@@ -1,15 +1,21 @@
import { Component, OnInit } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { Observable } from 'rxjs';
import { UsersService } from '../../../shared/openapi';
import { UserQuery } from '../../../shared/user/user.query';
import { UserService } from '../../../shared/user/user.service';
import { DeleteAccountDialogComponent } from './delete-account-dialog/delete-account-dialog.component';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-controls',
templateUrl: './controls.component.html',
styleUrls: ['./controls.component.scss'],
+ standalone: true,
+ imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyButtonModule, AsyncPipe],
})
export class ControlsComponent implements OnInit {
public canChangeUsername$: Observable;
diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts
index 9e84c19427..006cb0fd19 100644
--- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts
+++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts
@@ -1,10 +1,10 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
-import { MatDialogRef } from '@angular/material/dialog';
+import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { LogoutService } from '../../../../shared/logout.service';
-import { CustomMaterialModule } from '../../../../shared/modules/material.module';
import { UsersService } from '../../../../shared/openapi';
import { LogoutStubService, UsersStubService } from '../../../../test/service-stubs';
import { DeleteAccountDialogComponent } from './delete-account-dialog.component';
@@ -16,9 +16,8 @@ describe('DeleteAccountDialogComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [DeleteAccountDialogComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [CustomMaterialModule, ReactiveFormsModule],
+ imports: [ReactiveFormsModule, DeleteAccountDialogComponent, MatLegacySnackBarModule],
providers: [
{ provide: LogoutService, useClass: LogoutStubService },
{ provide: UsersService, useClass: UsersStubService },
diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts
index 3088c29cdb..0eb5cf050d 100644
--- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts
+++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts
@@ -1,19 +1,46 @@
import { HttpErrorResponse } from '@angular/common/http';
import { Component, OnDestroy } from '@angular/core';
-import { AbstractControl, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms';
-import { MatDialogRef } from '@angular/material/dialog';
-import { MatSnackBar } from '@angular/material/snack-bar';
+import {
+ AbstractControl,
+ UntypedFormBuilder,
+ UntypedFormControl,
+ UntypedFormGroup,
+ ValidatorFn,
+ Validators,
+ FormsModule,
+ ReactiveFormsModule,
+} from '@angular/forms';
+import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
import { Subject } from 'rxjs';
import { finalize, takeUntil } from 'rxjs/operators';
import { LogoutService } from '../../../../shared/logout.service';
import { UsersService } from '../../../../shared/openapi';
import { UserQuery } from '../../../../shared/user/user.query';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { NgIf } from '@angular/common';
+import { MatDividerModule } from '@angular/material/divider';
+import { AlertComponent } from '../../../../shared/alert/alert.component';
@Component({
selector: 'app-delete-account-dialog',
templateUrl: './delete-account-dialog.component.html',
styleUrls: ['./delete-account-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyDialogModule,
+ AlertComponent,
+ MatDividerModule,
+ NgIf,
+ FormsModule,
+ ReactiveFormsModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ MatLegacyButtonModule,
+ ],
})
export class DeleteAccountDialogComponent implements OnDestroy {
username = '';
diff --git a/src/app/loginComponents/accounts/external/accounts.component.ts b/src/app/loginComponents/accounts/external/accounts.component.ts
index 0567ee2c33..5354f1da93 100644
--- a/src/app/loginComponents/accounts/external/accounts.component.ts
+++ b/src/app/loginComponents/accounts/external/accounts.component.ts
@@ -14,11 +14,11 @@
* limitations under the License.
*/
import { Component, OnDestroy, OnInit } from '@angular/core';
-import { MatSnackBar } from '@angular/material/snack-bar';
-import { Router } from '@angular/router';
-import { AuthService } from 'ng2-ui-auth';
+import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
+import { Router, RouterLink } from '@angular/router';
import { Observable, Subject } from 'rxjs';
import { first, map, takeUntil } from 'rxjs/operators';
+import { AuthService } from '../../../ng2-ui-auth/public_api';
import { Dockstore } from '../../../shared/dockstore.model';
import { TokenSource } from '../../../shared/enum/token-source.enum';
import { TokenQuery } from '../../../shared/state/token.query';
@@ -30,10 +30,23 @@ import { TokenUser } from './../../../shared/openapi/model/tokenUser';
import { AccountsService } from './accounts.service';
import { LogoutService } from '../../../shared/logout.service';
import { RevokeTokenDialogComponent } from './revoke-token-dialog/revoke-token-dialog.component';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { accountInfo, bootstrap4largeModalSize } from '../../../shared/constants';
import { AlertService } from '../../../shared/alert/state/alert.service';
import { HttpErrorResponse } from '@angular/common/http';
+import { GetTokenUsernamePipe } from './getTokenUsername.pipe';
+import { MatIconModule } from '@angular/material/icon';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../../../shared/snackbar.directive';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatLegacyChipsModule } from '@angular/material/legacy-chips';
+import { MatBadgeModule } from '@angular/material/badge';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, AsyncPipe } from '@angular/common';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
export interface AccountInfo {
name: string;
@@ -53,6 +66,25 @@ export interface AccountInfo {
selector: 'app-accounts-external',
templateUrl: './accounts.component.html',
styleUrls: ['./accounts.component.scss'],
+ standalone: true,
+ imports: [
+ FlexModule,
+ NgIf,
+ MatLegacyCardModule,
+ MatBadgeModule,
+ MatLegacyChipsModule,
+ RouterLink,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ SnackbarDirective,
+ ClipboardModule,
+ MatIconModule,
+ NgFor,
+ AsyncPipe,
+ GetTokenUsernamePipe,
+ ],
})
export class AccountsExternalComponent implements OnInit, OnDestroy {
public dsServerURI: any;
diff --git a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts
index 002bc34766..999701ccb1 100644
--- a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts
+++ b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts
@@ -4,6 +4,7 @@ import { TokenUser } from './../../../shared/openapi/model/tokenUser';
@Pipe({
name: 'getTokenUsername',
+ standalone: true,
})
export class GetTokenUsernamePipe implements PipeTransform {
/**
diff --git a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts
index b43a45b8f7..87b26f9e92 100644
--- a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts
+++ b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts
@@ -15,16 +15,45 @@
*/
import { Component, OnDestroy } from '@angular/core';
-import { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';
-import { MatDialogRef } from '@angular/material/dialog';
+import {
+ AbstractControl,
+ FormBuilder,
+ FormControl,
+ FormGroup,
+ ValidatorFn,
+ Validators,
+ FormsModule,
+ ReactiveFormsModule,
+} from '@angular/forms';
+import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog';
import { takeUntil } from 'rxjs/operators';
import { UserQuery } from '../../../../shared/user/user.query';
import { Base } from '../../../../shared/base';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { NgIf } from '@angular/common';
+import { MatDividerModule } from '@angular/material/divider';
+import { AlertComponent } from '../../../../shared/alert/alert.component';
@Component({
selector: 'app-revoke-token-dialog',
templateUrl: './revoke-token-dialog.component.html',
styleUrls: ['./revoke-token-dialog.component.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyDialogModule,
+ AlertComponent,
+ MatDividerModule,
+ NgIf,
+ FormsModule,
+ ReactiveFormsModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ FlexModule,
+ MatLegacyButtonModule,
+ ],
})
export class RevokeTokenDialogComponent extends Base implements OnDestroy {
username = '';
diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts
index 608d89f163..d1d840257b 100644
--- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts
+++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts
@@ -1,12 +1,12 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCardModule } from '@angular/material/card';
-import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card';
+import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
import { MatIconModule } from '@angular/material/icon';
-import { MatInputModule } from '@angular/material/input';
-import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner';
+import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RefreshService } from '../../../../shared/refresh.service';
@@ -22,7 +22,6 @@ describe('ChangeUsernameComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [ChangeUsernameComponent],
imports: [
ReactiveFormsModule,
MatIconModule,
@@ -33,6 +32,7 @@ describe('ChangeUsernameComponent', () => {
MatFormFieldModule,
MatCardModule,
BrowserAnimationsModule,
+ ChangeUsernameComponent,
],
providers: [
{ provide: UserService, useClass: UserStubService },
diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts
index 50733798c5..e6e544053b 100644
--- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts
+++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { Component, Input, OnInit } from '@angular/core';
-import { UntypedFormControl, Validators } from '@angular/forms';
+import { UntypedFormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Observable, Subject } from 'rxjs';
import { debounceTime, finalize, takeUntil } from 'rxjs/operators';
import { formInputDebounceTime } from '../../../../shared/constants';
@@ -23,11 +23,33 @@ import { User } from '../../../../shared/openapi/model/user';
import { UserQuery } from '../../../../shared/user/user.query';
import { UserService } from '../../../../shared/user/user.service';
import { UsersService } from './../../../../shared/openapi/api/users.service';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatIconModule } from '@angular/material/icon';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { NgIf, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-change-username',
templateUrl: './change-username.component.html',
styleUrls: ['./change-username.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyDialogModule,
+ MatLegacyCardModule,
+ FlexModule,
+ MatIconModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ FormsModule,
+ ReactiveFormsModule,
+ MatLegacyButtonModule,
+ AsyncPipe,
+ ],
})
export class ChangeUsernameComponent implements OnInit {
@Input() noDialog: boolean;
diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts
deleted file mode 100644
index 968766ab54..0000000000
--- a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2022 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { NgModule } from '@angular/core';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { CommonModule } from '@angular/common';
-import { ChangeUsernameComponent } from './change-username.component';
-import { ReactiveFormsModule } from '@angular/forms';
-
-@NgModule({
- declarations: [ChangeUsernameComponent],
- imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, ReactiveFormsModule],
- providers: [],
- exports: [ChangeUsernameComponent],
-})
-export class ChangeUsernameModule {}
diff --git a/src/app/loginComponents/auth/auth.component.spec.ts b/src/app/loginComponents/auth/auth.component.spec.ts
index b5ff2ea4bc..9349726431 100644
--- a/src/app/loginComponents/auth/auth.component.spec.ts
+++ b/src/app/loginComponents/auth/auth.component.spec.ts
@@ -1,7 +1,7 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { TokenService } from '../../shared/state/token.service';
import { UserService } from '../../shared/user/user.service';
import { TokenStubService, UserStubService } from '../../test/service-stubs';
@@ -14,8 +14,7 @@ describe('AuthComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [AuthComponent],
- imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule],
+ imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule, AuthComponent],
providers: [
{ provide: UserService, useClass: UserStubService },
{ provide: TokenService, useClass: TokenStubService },
diff --git a/src/app/loginComponents/auth/auth.component.ts b/src/app/loginComponents/auth/auth.component.ts
index 5ed1268068..aaf13c26ed 100644
--- a/src/app/loginComponents/auth/auth.component.ts
+++ b/src/app/loginComponents/auth/auth.component.ts
@@ -13,6 +13,7 @@ import { TokenService } from '../../shared/state/token.service';
@Component({
selector: 'app-auth',
templateUrl: './auth.component.html',
+ standalone: true,
})
export class AuthComponent extends Base implements OnInit {
Dockstore = Dockstore;
diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts
index a8c57245a7..55715caf69 100644
--- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts
+++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts
@@ -1,19 +1,19 @@
import { ClipboardModule } from '@angular/cdk/clipboard';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { AuthService } from 'ng2-ui-auth';
import { HttpClientTestingModule } from '@angular/common/http/testing';
-import { MatButtonModule } from '@angular/material/button';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { MatIconModule } from '@angular/material/icon';
-import { MatTabsModule } from '@angular/material/tabs';
+import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MarkdownModule } from 'ngx-markdown';
+import { AuthService } from '../../../ng2-ui-auth/public_api';
import { MetadataService, GA4GHV20Service } from '../../../shared/openapi';
import { ServiceInfoService } from '../../../service-info/service-info.service';
import { RouterLinkStubDirective, RouterOutletStubComponent } from './../../../test/router-stubs';
import { AuthStubService, GA4GHV20StubService } from './../../../test/service-stubs';
import { DownloadCLIClientComponent } from './downloadcliclient.component';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
describe('DownloadCLIClientComponent', () => {
let component: DownloadCLIClientComponent;
@@ -22,7 +22,7 @@ describe('DownloadCLIClientComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [DownloadCLIClientComponent, RouterLinkStubDirective, RouterOutletStubComponent],
+ declarations: [RouterLinkStubDirective, RouterOutletStubComponent],
imports: [
ClipboardModule,
MarkdownModule.forRoot(),
@@ -32,6 +32,7 @@ describe('DownloadCLIClientComponent', () => {
MatSnackBarModule,
MatTabsModule,
NoopAnimationsModule,
+ DownloadCLIClientComponent,
],
providers: [
{ provide: AuthService, useClass: AuthStubService },
diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts
index ea94e786b8..64756b879d 100644
--- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts
+++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts
@@ -1,6 +1,6 @@
/* eslint-disable max-len */
-import { Component, EventEmitter, OnInit } from '@angular/core';
-import { AuthService } from 'ng2-ui-auth';
+import { Component, OnInit } from '@angular/core';
+import { AuthService } from '../../../ng2-ui-auth/public_api';
import { Dockstore } from '../../../shared/dockstore.model';
import { MetadataService, TRSService } from '../../../shared/openapi';
import { ServiceInfoService } from '../../../service-info/service-info.service';
@@ -8,11 +8,31 @@ import { AlertService } from './../../../shared/alert/state/alert.service';
import { forkJoin } from 'rxjs';
import { finalize, takeUntil } from 'rxjs/operators';
import { Base } from 'app/shared/base';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { SnackbarDirective } from '../../../shared/snackbar.directive';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { NgIf, NgClass } from '@angular/common';
+import { MatLegacyTabsModule } from '@angular/material/legacy-tabs';
+import { MarkdownModule } from 'ngx-markdown';
@Component({
selector: 'app-downloadcliclient',
templateUrl: './downloadcliclient.component.html',
styleUrls: ['./downloadcliclient.component.scss'],
+ standalone: true,
+ imports: [
+ MarkdownModule,
+ MatLegacyTabsModule,
+ NgIf,
+ MatLegacyButtonModule,
+ MatIconModule,
+ SnackbarDirective,
+ NgClass,
+ ExtendedModule,
+ ClipboardModule,
+ ],
})
export class DownloadCLIClientComponent extends Base implements OnInit {
public downloadCli = 'dummy-start-value';
@@ -123,6 +143,7 @@ There are several ways to install Java on Mac OS. Here are some examples:
After you've installed Java, make sure the version is correct by running \`java -version\` in the terminal, and verifying the major version is 17 or greater.
+
#### Part 2 - Install Docker
Install Docker following the instructions on [Docker's website](https://docs.docker.com/docker-for-mac/install/). You should have at least version 4.3.0 installed. Make sure to install the correct version for your hardware.
`;
@@ -168,7 +189,7 @@ At this point, you now have the Dockstore CLI set up for interacting with the Do
#### Part 6 - Install cwltool (Optional)
Dockstore relies on [cwltool](https://github.com/common-workflow-language/cwltool) - a reference implementation of CWL - for local execution of tools and workflows described with CWL.
-You'll need to have Python 3 and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine.
+You'll need to have Python 3.10+ and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine.
**Note:** cwltool must be available on your PATH for the Dockstore CLI to find it.
diff --git a/src/app/loginComponents/onboarding/onboarding.component.ts b/src/app/loginComponents/onboarding/onboarding.component.ts
index edca9ef82f..ce33911516 100644
--- a/src/app/loginComponents/onboarding/onboarding.component.ts
+++ b/src/app/loginComponents/onboarding/onboarding.component.ts
@@ -5,11 +5,36 @@ import { Dockstore } from '../../shared/dockstore.model';
import { TokenQuery } from '../../shared/state/token.query';
import { ExtendedUserData, User } from '../../shared/openapi';
import { UserQuery } from '../../shared/user/user.query';
+import { MatDividerModule } from '@angular/material/divider';
+import { RouterLink } from '@angular/router';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component';
+import { AccountsExternalComponent } from '../accounts/external/accounts.component';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { ChangeUsernameComponent } from '../accounts/internal/change-username/change-username.component';
+import { MatStepperModule } from '@angular/material/stepper';
+import { NgIf } from '@angular/common';
+import { MatIconModule } from '@angular/material/icon';
+import { HeaderComponent } from '../../header/header.component';
@Component({
selector: 'app-onboarding',
templateUrl: './onboarding.component.html',
styleUrls: ['./onboarding.component.scss'],
+ standalone: true,
+ imports: [
+ HeaderComponent,
+ MatIconModule,
+ NgIf,
+ MatStepperModule,
+ ChangeUsernameComponent,
+ MatLegacyButtonModule,
+ AccountsExternalComponent,
+ DownloadCLIClientComponent,
+ FlexModule,
+ RouterLink,
+ MatDividerModule,
+ ],
})
export class OnboardingComponent implements OnInit, OnDestroy {
public tokenSetComplete: boolean;
diff --git a/src/app/loginComponents/onboarding/quickstart.component.ts b/src/app/loginComponents/onboarding/quickstart.component.ts
index 2105f52acb..35626b73a5 100644
--- a/src/app/loginComponents/onboarding/quickstart.component.ts
+++ b/src/app/loginComponents/onboarding/quickstart.component.ts
@@ -15,10 +15,16 @@
*/
import { Component, OnInit } from '@angular/core';
import { Dockstore } from '../../shared/dockstore.model';
+import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component';
+import { NgIf } from '@angular/common';
+import { MatIconModule } from '@angular/material/icon';
+import { HeaderComponent } from '../../header/header.component';
@Component({
selector: 'app-onboarding',
templateUrl: './quickstart.component.html',
+ standalone: true,
+ imports: [HeaderComponent, MatIconModule, NgIf, DownloadCLIClientComponent],
})
export class QuickStartComponent implements OnInit {
public curStep = 1;
diff --git a/src/app/loginComponents/requests.module.ts b/src/app/loginComponents/requests.module.ts
deleted file mode 100644
index 2f5d201a6c..0000000000
--- a/src/app/loginComponents/requests.module.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { RouterModule } from '@angular/router';
-import { CustomMaterialModule } from './../shared/modules/material.module';
-import {
- OrganizationInviteConfirmDialogComponent,
- OrganizationRequestConfirmDialogComponent,
- RequestsComponent,
-} from './requests/requests.component';
-@NgModule({
- imports: [CommonModule, CustomMaterialModule, RouterModule, FlexLayoutModule],
- declarations: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent],
- exports: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent],
-})
-export class RequestsModule {}
diff --git a/src/app/loginComponents/requests/requests.component.html b/src/app/loginComponents/requests/requests.component.html
index e741cc585d..202d21f3c4 100644
--- a/src/app/loginComponents/requests/requests.component.html
+++ b/src/app/loginComponents/requests/requests.component.html
@@ -12,7 +12,7 @@
You have not registered any tools
@@ -71,6 +98,17 @@
[groupEntriesObject]="groupEntriesObject$ | async"
[refreshMessage]="isRefreshing$ | async"
>
+
+ Don't see an organization?
+ Configure
+ your authorized organizations.
@@ -105,7 +143,7 @@
class="accent-1-dark-btn"
type="button"
(click)="addToExistingTools()"
- [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === false"
+ [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === null"
matTooltip="Discover tools added by others using your linked source control accounts"
>
Discover Existing Dockstore Tools
diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts
index 36367e3fff..f8167309e9 100644
--- a/src/app/mytools/my-tool/my-tool.component.ts
+++ b/src/app/mytools/my-tool/my-tool.component.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ActivatedRoute, NavigationEnd, Router, RouterEvent } from '@angular/router';
import { faGithub } from '@fortawesome/free-brands-svg-icons';
import { AlertService } from 'app/shared/alert/state/alert.service';
@@ -22,7 +22,6 @@ import { SessionQuery } from 'app/shared/session/session.query';
import { SessionService } from 'app/shared/session/session.service';
import { MyEntriesQuery } from 'app/shared/state/my-entries.query';
import { MyEntriesStateService } from 'app/shared/state/my-entries.service';
-import { AuthService } from 'ng2-ui-auth';
import { combineLatest, Observable } from 'rxjs';
import { filter, map, takeUntil } from 'rxjs/operators';
import { RegisterToolComponent } from '../../container/register-tool/register-tool.component';
@@ -31,6 +30,7 @@ import { Tool } from '../../container/register-tool/tool';
import { AccountsService } from '../../loginComponents/accounts/external/accounts.service';
import { OrgWorkflowObject } from '../../myworkflows/my-workflow/my-workflow.component';
import { MyWorkflowsService } from '../../myworkflows/myworkflows.service';
+import { AuthService } from '../../ng2-ui-auth/public_api';
import { AlertQuery } from '../../shared/alert/state/alert.query';
import { bootstrap4largeModalSize } from '../../shared/constants';
import { ContainerService } from '../../shared/container.service';
@@ -47,11 +47,45 @@ import { UserQuery } from '../../shared/user/user.query';
import { MytoolsService } from '../mytools.service';
import { EntryType } from '../../shared/enum/entry-type';
import { UserService } from 'app/shared/user/user.service';
+import { ContainerComponent } from '../../container/container.component';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatLegacyMenuModule } from '@angular/material/legacy-menu';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common';
+import { MatSidenavModule } from '@angular/material/sidenav';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { HeaderComponent } from '../../header/header.component';
+import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component';
+import { SidebarAccordionComponent as WorkflowSidebarAccordionComponent } from '../../myworkflows/sidebar-accordion/sidebar-accordion.component';
+import { Dockstore } from 'app/shared/dockstore.model';
@Component({
selector: 'app-my-tool',
templateUrl: './my-tool.component.html',
styleUrls: ['../../shared/styles/my-entry.component.scss'],
+ standalone: true,
+ imports: [
+ FlexModule,
+ MySidebarComponent,
+ HeaderComponent,
+ MatLegacyButtonModule,
+ MatIconModule,
+ MatSidenavModule,
+ NgIf,
+ MatLegacyTooltipModule,
+ MatLegacyMenuModule,
+ SidebarAccordionComponent,
+ WorkflowSidebarAccordionComponent,
+ MatLegacyCardModule,
+ FontAwesomeModule,
+ ContainerComponent,
+ AsyncPipe,
+ TitleCasePipe,
+ ],
})
export class MyToolComponent extends MyEntry implements OnInit {
faGithub = faGithub;
@@ -69,6 +103,7 @@ export class MyToolComponent extends MyEntry implements OnInit {
public groupEntriesObject$: Observable>>;
public groupAppToolEntryObjects$: Observable>>;
EntryType = EntryType;
+ Dockstore = Dockstore;
constructor(
private mytoolsService: MytoolsService,
protected configuration: Configuration,
@@ -115,6 +150,7 @@ export class MyToolComponent extends MyEntry implements OnInit {
this.router.events
.pipe(
filter((event) => event instanceof NavigationEnd),
+ map((event) => event as NavigationEnd),
takeUntil(this.ngUnsubscribe)
)
.subscribe((event: RouterEvent) => {
@@ -222,7 +258,7 @@ export class MyToolComponent extends MyEntry implements OnInit {
addToExistingTools(): void {
if (this.user) {
- this.userService.addUserToWorkflows(this.user.id);
+ this.userService.addUserToWorkflows(this.user.id, EntryType.Tool);
}
}
diff --git a/src/app/mytools/mytools.component.ts b/src/app/mytools/mytools.component.ts
index 0ca917018f..84fde1e82f 100644
--- a/src/app/mytools/mytools.component.ts
+++ b/src/app/mytools/mytools.component.ts
@@ -14,10 +14,13 @@
* limitations under the License.
*/
import { Component } from '@angular/core';
+import { RouterOutlet } from '@angular/router';
@Component({
selector: 'app-mytools',
templateUrl: './mytools.component.html',
styleUrls: ['./mytools.component.css'],
+ standalone: true,
+ imports: [RouterOutlet],
})
export class MyToolsComponent {}
diff --git a/src/app/mytools/mytools.module.ts b/src/app/mytools/mytools.module.ts
deleted file mode 100644
index 59bb759b12..0000000000
--- a/src/app/mytools/mytools.module.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2017 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { RefreshWizardModule } from 'app/container/refresh-wizard.module';
-import { MyEntriesModule } from 'app/shared/modules/my-entries.module';
-import { RefreshToolOrganizationComponent } from '../container/refresh-tool-organization/refresh-tool-organization.component';
-import { ContainerModule } from '../shared/modules/container.module';
-import { HeaderModule } from '../shared/modules/header.module';
-import { PipeModule } from '../shared/pipe/pipe.module';
-import { RegisterToolService } from './../container/register-tool/register-tool.service';
-import { AccountsService } from './../loginComponents/accounts/external/accounts.service';
-import { CustomMaterialModule } from './../shared/modules/material.module';
-import { MyToolComponent } from './my-tool/my-tool.component';
-import { MyToolsComponent } from './mytools.component';
-import { mytoolsRouting } from './mytools.routing';
-import { MytoolsService } from './mytools.service';
-import { SidebarAccordionComponent } from './sidebar-accordion/sidebar-accordion.component';
-import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module';
-import { IsAppToolPipe } from '../search/is-app-tool.pipe';
-import { WorkflowModule } from '../shared/modules/workflow.module';
-import { MySidebarModule } from '../shared/modules/my-sidebar.module';
-
-@NgModule({
- declarations: [MyToolsComponent, RefreshToolOrganizationComponent, MyToolComponent, SidebarAccordionComponent],
- imports: [
- CommonModule,
- ContainerModule,
- FormsModule,
- HeaderModule,
- mytoolsRouting,
- CustomMaterialModule,
- PipeModule,
- MyEntriesModule,
- RefreshWizardModule,
- SharedWorkflowServicesNotebooksModule,
- WorkflowModule,
- MySidebarModule,
- ],
- providers: [RegisterToolService, AccountsService, MytoolsService, IsAppToolPipe],
-})
-export class MyToolsModule {}
diff --git a/src/app/mytools/mytools.routing.ts b/src/app/mytools/mytools.routing.ts
index 77b94ab96e..d0b4b728a8 100644
--- a/src/app/mytools/mytools.routing.ts
+++ b/src/app/mytools/mytools.routing.ts
@@ -13,8 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
import { EntryType } from 'app/shared/enum/entry-type';
+import { EmailService } from '../container/email.service';
+import { InfoTabService } from '../container/info-tab/info-tab.service';
+import { ToolLaunchService } from '../container/launch/tool-launch.service';
+import { VersionModalService } from '../container/version-modal/version-modal.service';
import { MyToolComponent } from './my-tool/my-tool.component';
import { MyToolsComponent } from './mytools.component';
@@ -23,7 +27,14 @@ const MYTOOLS_ROUTES: Routes = [
path: '',
component: MyToolsComponent,
data: { title: 'Dockstore | My Tools' },
- children: [{ path: '**', component: MyToolComponent, data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool } }],
+ children: [
+ {
+ path: '**',
+ component: MyToolComponent,
+ data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool },
+ providers: [EmailService, InfoTabService, ToolLaunchService, VersionModalService],
+ },
+ ],
},
];
-export const mytoolsRouting = RouterModule.forChild(MYTOOLS_ROUTES);
+export const mytoolsRouting = MYTOOLS_ROUTES;
diff --git a/src/app/mytools/mytools.service.spec.ts b/src/app/mytools/mytools.service.spec.ts
index 1db7a2eb7d..b41eedf312 100644
--- a/src/app/mytools/mytools.service.spec.ts
+++ b/src/app/mytools/mytools.service.spec.ts
@@ -16,19 +16,20 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { inject, TestBed } from '@angular/core/testing';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterTestingModule } from '@angular/router/testing';
import { ContainerService } from 'app/shared/container.service';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { MyEntriesModule } from 'app/shared/modules/my-entries.module';
import { UrlResolverService } from 'app/shared/url-resolver.service';
-import { ContainerStubService, WorkflowsStubService } from 'app/test/service-stubs';
+import { ContainerStubService, DateStubService, WorkflowsStubService } from 'app/test/service-stubs';
+import { MyWorkflowsService } from '../myworkflows/myworkflows.service';
+import { DateService } from '../shared/date.service';
+import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service';
import { DockstoreTool, Workflow, WorkflowsService } from '../shared/openapi';
+import { ProviderService } from '../shared/provider.service';
+import { MyEntriesStateService } from '../shared/state/my-entries.service';
+import { MyEntriesStore } from '../shared/state/my-entries.store';
import { OrgToolObject } from './my-tool/my-tool.component';
import { MytoolsService } from './mytools.service';
-import { DateService } from '../shared/date.service';
-import { MyWorkflowsService } from '../myworkflows/myworkflows.service';
-import { ProviderService } from '../shared/provider.service';
-import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service';
describe('MytoolsService', () => {
const tool1: DockstoreTool = {
@@ -288,11 +289,13 @@ describe('MytoolsService', () => {
{ provide: WorkflowsService, useClass: WorkflowsStubService },
{ provide: ContainerService, useClass: ContainerStubService },
{ provide: UrlResolverService, useclass: UrlResolverService },
- MyWorkflowsService,
- DateService,
+ { provide: DateService, useClass: DateStubService },
{ provide: DescriptorLanguageService, useClass: DescriptorLanguageService },
+ MyWorkflowsService,
+ MyEntriesStateService,
+ MyEntriesStore,
],
- imports: [RouterTestingModule, CustomMaterialModule, HttpClientTestingModule, MyEntriesModule],
+ imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule],
});
});
it('should ...', inject([MytoolsService], (service: MytoolsService) => {
diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts
index 49f2e450f1..7a987b13b1 100644
--- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts
+++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts
@@ -1,11 +1,11 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatButtonModule } from '@angular/material/button';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatIconModule } from '@angular/material/icon';
-import { MatListModule } from '@angular/material/list';
-import { MatTabsModule } from '@angular/material/tabs';
+import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list';
+import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
import { MatToolbarModule } from '@angular/material/toolbar';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { RouterTestingModule } from '@angular/router/testing';
import { RegisterToolService } from '../../container/register-tool/register-tool.service';
import { SelectTabPipe } from '../../shared/entry/select-tab.pipe';
@@ -23,7 +23,6 @@ describe('SidebarAccordionComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [SidebarAccordionComponent, RefreshToolOrganizationComponent, SelectTabPipe],
imports: [
MatTabsModule,
MatToolbarModule,
@@ -34,6 +33,9 @@ describe('SidebarAccordionComponent', () => {
MatTooltipModule,
RouterTestingModule,
HttpClientTestingModule,
+ SidebarAccordionComponent,
+ RefreshToolOrganizationComponent,
+ SelectTabPipe,
],
providers: [
{ provide: RegisterToolService, useClass: RegisterToolStubService },
diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts
index 0838171fc1..899c88c00a 100644
--- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts
+++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts
@@ -3,9 +3,17 @@ import { DockstoreTool } from 'app/shared/openapi';
import { Observable } from 'rxjs';
import { ToolQuery } from '../../shared/tool/tool.query';
import { OrgToolObject } from '../my-tool/my-tool.component';
-import { KeyValue } from '@angular/common';
+import { KeyValue, NgFor, NgIf, NgTemplateOutlet, NgClass, AsyncPipe, KeyValuePipe } from '@angular/common';
import { MetadataService } from '../../shared/openapi/api/metadata.service';
import { WorkflowQuery } from 'app/shared/state/workflow.query';
+import { SelectTabPipe } from '../../shared/entry/select-tab.pipe';
+import { RefreshToolOrganizationComponent } from '../../container/refresh-tool-organization/refresh-tool-organization.component';
+import { RouterLink } from '@angular/router';
+import { MatIconModule } from '@angular/material/icon';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { MatLegacyListModule } from '@angular/material/legacy-list';
+import { MatLegacyTabsModule } from '@angular/material/legacy-tabs';
+import { MatExpansionModule } from '@angular/material/expansion';
interface GroupEntriesByRegistry {
groupEntryInfo: OrgToolObject[];
@@ -16,6 +24,23 @@ interface GroupEntriesByRegistry {
selector: 'app-sidebar-accordion',
templateUrl: './sidebar-accordion.component.html',
styleUrls: ['./sidebar-accordion.component.scss', '../../shared/styles/my-entry-sidebar.scss'],
+ standalone: true,
+ imports: [
+ NgFor,
+ NgIf,
+ MatExpansionModule,
+ MatLegacyTabsModule,
+ NgTemplateOutlet,
+ MatLegacyListModule,
+ NgClass,
+ ExtendedModule,
+ MatIconModule,
+ RouterLink,
+ RefreshToolOrganizationComponent,
+ AsyncPipe,
+ KeyValuePipe,
+ SelectTabPipe,
+ ],
})
export class SidebarAccordionComponent implements OnInit, OnChanges {
@Input() openOneAtATime;
diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.html b/src/app/myworkflows/my-workflow/my-workflow.component.html
index c3cabefc96..8da02db3a1 100644
--- a/src/app/myworkflows/my-workflow/my-workflow.component.html
+++ b/src/app/myworkflows/my-workflow/my-workflow.component.html
@@ -62,7 +62,7 @@
Register a {{ entryType | titlecase }}
@@ -101,7 +101,7 @@
Don't see an organization?
ConfigureShared with me
Register a {{ entryType$ | async | titlecase }}
-
+
- If there are already workflows on Dockstore added by other users that you have access to, press the button below.
+ If there are already {{ entryType$ | async }}s on Dockstore added by other users that you have access to, press the
+ button below.
diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts
index 60af420a49..ab712efd97 100644
--- a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts
+++ b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts
@@ -16,20 +16,31 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatDialogRef } from '@angular/material/dialog';
+import { MatLegacyDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { TrackLoginService } from 'app/shared/track-login.service';
-import { AuthService } from 'ng2-ui-auth';
import { AccountsService } from '../../loginComponents/accounts/external/accounts.service';
-import { CustomMaterialModule } from '../../shared/modules/material.module';
-import { MyEntriesModule } from '../../shared/modules/my-entries.module';
-import { RefreshService } from '../../shared/refresh.service';
-import { TokenQuery } from '../../shared/state/token.query';
-import { WorkflowService } from '../../shared/state/workflow.service';
+import { MytoolsService } from '../../mytools/mytools.service';
+import { AuthService } from '../../ng2-ui-auth/public_api';
+import { BioschemaService } from '../../shared/bioschema.service';
+import { ContainerService } from '../../shared/container.service';
+import { DateService } from '../../shared/date.service';
+import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service';
+import { ExtendedToolsService } from '../../shared/extended-tools.service';
+import { ExtendedWorkflowsService } from '../../shared/extended-workflows.service';
+import { MetadataService } from '../../shared/openapi';
import { UsersService } from '../../shared/openapi/api/users.service';
import { WorkflowsService } from '../../shared/openapi/api/workflows.service';
import { Configuration } from '../../shared/openapi/configuration';
+import { ProviderService } from '../../shared/provider.service';
+import { RefreshService } from '../../shared/refresh.service';
+import { MyEntriesQuery } from '../../shared/state/my-entries.query';
+import { MyEntriesStateService } from '../../shared/state/my-entries.service';
+import { MyEntriesStore } from '../../shared/state/my-entries.store';
+import { TokenQuery } from '../../shared/state/token.query';
+import { WorkflowService } from '../../shared/state/workflow.service';
import { UrlResolverService } from '../../shared/url-resolver.service';
import { UserQuery } from '../../shared/user/user.query';
import { RouterLinkStubDirective } from '../../test';
@@ -38,7 +49,10 @@ import {
AccountsStubService,
AuthStubService,
ConfigurationStub,
+ ContainerStubService,
+ DateStubService,
MetadataStubService,
+ ProviderStubService,
RefreshStubService,
RegisterWorkflowModalStubService,
TrackLoginStubService,
@@ -50,8 +64,6 @@ import {
import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service';
import { MyWorkflowsService } from '../myworkflows.service';
import { MyWorkflowComponent } from './my-workflow.component';
-import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service';
-import { MetadataService } from '../../shared/openapi';
describe('MyWorkflowsComponent', () => {
let component: MyWorkflowComponent;
@@ -60,9 +72,16 @@ describe('MyWorkflowsComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [MyWorkflowComponent, RouterLinkStubDirective, RouterOutletStubComponent],
+ declarations: [RouterLinkStubDirective, RouterOutletStubComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule, CustomMaterialModule, MyEntriesModule],
+ imports: [
+ RouterTestingModule,
+ HttpClientTestingModule,
+ BrowserAnimationsModule,
+ MatLegacySnackBarModule,
+ MatLegacyDialogModule,
+ MyWorkflowComponent,
+ ],
providers: [
{ provide: DescriptorLanguageService, useClass: DescriptorLanguageService },
{ provide: MetadataService, useClass: MetadataStubService },
@@ -71,11 +90,21 @@ describe('MyWorkflowsComponent', () => {
{ provide: UsersService, useClass: UsersStubService },
{ provide: AuthService, useClass: AuthStubService },
{ provide: WorkflowService, useClass: WorkflowStubService },
+ { provide: ContainerService, useClass: ContainerStubService },
{ provide: RefreshService, useClass: RefreshStubService },
{ provide: RegisterWorkflowModalService, useClass: RegisterWorkflowModalStubService },
+ { provide: DateService, useClass: DateStubService },
+ BioschemaService,
+ ExtendedToolsService,
+ ExtendedWorkflowsService,
+ MyEntriesQuery,
+ MyEntriesStateService,
+ MyEntriesStore,
MyWorkflowsService,
+ MytoolsService,
TokenQuery,
{ provide: AccountsService, useClass: AccountsStubService },
+ { provide: ProviderService, useClass: ProviderStubService },
{ provide: WorkflowsService, useClass: WorkflowsStubService },
{ provide: UrlResolverService, useClass: UrlResolverStubService },
{ provide: TrackLoginService, useClass: TrackLoginStubService },
diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts
index 6beb61a68f..2e4f33ed56 100644
--- a/src/app/myworkflows/my-workflow/my-workflow.component.ts
+++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { faGithub } from '@fortawesome/free-brands-svg-icons';
import { EntryType } from 'app/shared/enum/entry-type';
@@ -26,10 +26,10 @@ import { TokenService } from 'app/shared/state/token.service';
import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow';
import { Service } from 'app/shared/openapi/model/service';
import { UserService } from 'app/shared/user/user.service';
-import { AuthService } from 'ng2-ui-auth';
import { combineLatest, Observable } from 'rxjs';
import { filter, map, shareReplay, takeUntil } from 'rxjs/operators';
import { AccountsService } from '../../loginComponents/accounts/external/accounts.service';
+import { AuthService } from '../../ng2-ui-auth/public_api';
import { AlertQuery } from '../../shared/alert/state/alert.query';
import { MyEntry, OrgEntryObject } from '../../shared/my-entry';
import { TokenQuery } from '../../shared/state/token.query';
@@ -42,6 +42,19 @@ import { UserQuery } from '../../shared/user/user.query';
import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service';
import { MyWorkflowsService } from '../myworkflows.service';
import { Dockstore } from '../../shared/dockstore.model';
+import { WorkflowComponent } from '../../workflow/workflow.component';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component';
+import { MatLegacyMenuModule } from '@angular/material/legacy-menu';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatSidenavModule } from '@angular/material/sidenav';
+import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { HeaderComponent } from '../../header/header.component';
+import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
/**
* How the workflow selection works:
@@ -63,6 +76,24 @@ import { Dockstore } from '../../shared/dockstore.model';
selector: 'app-my-workflow',
templateUrl: './my-workflow.component.html',
styleUrls: ['../../shared/styles/my-entry.component.scss'],
+ standalone: true,
+ imports: [
+ FlexModule,
+ MySidebarComponent,
+ HeaderComponent,
+ MatLegacyButtonModule,
+ MatIconModule,
+ NgIf,
+ MatSidenavModule,
+ MatLegacyTooltipModule,
+ MatLegacyMenuModule,
+ SidebarAccordionComponent,
+ MatLegacyCardModule,
+ FontAwesomeModule,
+ WorkflowComponent,
+ AsyncPipe,
+ TitleCasePipe,
+ ],
})
export class MyWorkflowComponent extends MyEntry implements OnInit {
Dockstore = Dockstore;
@@ -82,7 +113,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit {
public isRefreshing$: Observable;
public showSidebar = true;
hasSourceControlToken$: Observable;
- public gitHubAppInstallationLink$: Observable;
public groupEntriesObject$: Observable>>;
public groupSharedEntriesObject$: Observable>>;
public hasGroupSharedEntriesObject$: Observable;
@@ -130,7 +160,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit {
ngOnInit() {
this.myWorkflowsService.clearPartialState();
- this.gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLink$;
this.tokenService.getGitHubOrganizations();
this.isRefreshing$ = this.alertQuery.showInfo$;
/**
@@ -229,7 +258,7 @@ export class MyWorkflowComponent extends MyEntry implements OnInit {
addToExistingWorkflows(): void {
if (this.user) {
- this.userService.addUserToWorkflows(this.user.id);
+ this.userService.addUserToWorkflows(this.user.id, this.entryType);
}
}
diff --git a/src/app/myworkflows/myworkflows.module.ts b/src/app/myworkflows/myworkflows.module.ts
deleted file mode 100644
index 8d4dc55248..0000000000
--- a/src/app/myworkflows/myworkflows.module.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2017 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { NgModule } from '@angular/core';
-import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module';
-import { myworkflowRouting } from './myworkflows.routing';
-import { GitHubAppsLogsModule } from './sidebar-accordion/github-apps-logs/github-apps-logs.module';
-
-@NgModule({
- imports: [SharedWorkflowServicesNotebooksModule, myworkflowRouting, GitHubAppsLogsModule],
-})
-export class MyWorkflowsModule {}
diff --git a/src/app/myworkflows/myworkflows.routing.ts b/src/app/myworkflows/myworkflows.routing.ts
index c9ab572450..fbbb6812d3 100644
--- a/src/app/myworkflows/myworkflows.routing.ts
+++ b/src/app/myworkflows/myworkflows.routing.ts
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
import { EntryType } from '../shared/enum/entry-type';
import { MyWorkflowComponent } from './my-workflow/my-workflow.component';
@@ -24,4 +24,4 @@ const routes: Routes = [
data: { title: 'Dockstore | My Workflows', entryType: EntryType.BioWorkflow },
},
];
-export const myworkflowRouting = RouterModule.forChild(routes);
+export const myworkflowRouting = routes;
diff --git a/src/app/myworkflows/myworkflows.service.spec.ts b/src/app/myworkflows/myworkflows.service.spec.ts
index 69e16847fb..6de22a876e 100644
--- a/src/app/myworkflows/myworkflows.service.spec.ts
+++ b/src/app/myworkflows/myworkflows.service.spec.ts
@@ -15,20 +15,26 @@
*/
import { inject, TestBed } from '@angular/core/testing';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterTestingModule } from '@angular/router/testing';
-import { CustomMaterialModule } from 'app/shared/modules/material.module';
-import { MyEntriesModule } from 'app/shared/modules/my-entries.module';
-import { WorkflowService } from 'app/shared/state/workflow.service';
+import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service';
import { UsersService, WorkflowsService } from 'app/shared/openapi';
+import { WorkflowService } from 'app/shared/state/workflow.service';
import { UrlResolverService } from 'app/shared/url-resolver.service';
-import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service';
import {
+ DateStubService,
+ EntryTypeMetadataStubService,
+ ProviderStubService,
UrlResolverStubService,
UsersStubService,
WorkflowsStubService,
WorkflowStubService,
- EntryTypeMetadataStubService,
} from 'app/test/service-stubs';
+import { DateService } from '../shared/date.service';
+import { ProviderService } from '../shared/provider.service';
+import { MyEntriesStateService } from '../shared/state/my-entries.service';
+import { MyEntriesStore } from '../shared/state/my-entries.store';
import { Workflow } from './../shared/openapi/model/workflow';
import { OrgWorkflowObject } from './my-workflow/my-workflow.component';
import { MyWorkflowsService } from './myworkflows.service';
@@ -152,14 +158,17 @@ describe('MyWorkflowsService', () => {
const expectedResult: OrgWorkflowObject[] = [expectedResult1, expectedResult2, expectedResult3];
beforeEach(() => {
TestBed.configureTestingModule({
- imports: [CustomMaterialModule, RouterTestingModule, MyEntriesModule],
+ imports: [RouterTestingModule, MatLegacySnackBarModule, MatLegacyDialogModule],
providers: [
- MyWorkflowsService,
+ { provide: DateService, useClass: DateStubService },
{ provide: UrlResolverService, useClass: UrlResolverStubService },
{ provide: WorkflowService, useClass: WorkflowStubService },
{ provide: UsersService, useClass: UsersStubService },
{ provide: WorkflowsService, useClass: WorkflowsStubService },
{ provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService },
+ { provide: ProviderService, useClass: ProviderStubService },
+ MyEntriesStateService,
+ MyEntriesStore,
],
});
});
diff --git a/src/app/myworkflows/myworkflows.service.ts b/src/app/myworkflows/myworkflows.service.ts
index e3eb6af0be..989f2a89d5 100644
--- a/src/app/myworkflows/myworkflows.service.ts
+++ b/src/app/myworkflows/myworkflows.service.ts
@@ -16,28 +16,36 @@
import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { transaction } from '@datorama/akita';
import { AlertService } from 'app/shared/alert/state/alert.service';
import { includesAuthors, includesValidation, bootstrap4largeModalSize, includesMetrics } from 'app/shared/constants';
import { EntryType } from 'app/shared/enum/entry-type';
import { MyEntriesService } from 'app/shared/myentries.service';
-import { SessionQuery } from 'app/shared/session/session.query';
import { MyEntriesStateService } from 'app/shared/state/my-entries.service';
import { WorkflowService } from 'app/shared/state/workflow.service';
-import { BioWorkflow, DockstoreTool, SharedWorkflows, UsersService, Workflow, WorkflowsService } from 'app/shared/openapi';
+import {
+ BioWorkflow,
+ DockstoreTool,
+ EntryType as OpenApiEntryType,
+ SharedWorkflows,
+ UsersService,
+ Workflow,
+ WorkflowsService,
+} from 'app/shared/openapi';
import { UrlResolverService } from 'app/shared/url-resolver.service';
import { UserQuery } from 'app/shared/user/user.query';
import { RegisterWorkflowModalComponent } from 'app/workflow/register-workflow-modal/register-workflow-modal.component';
import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component';
-import { forkJoin, Observable, of as observableOf } from 'rxjs';
+import { forkJoin, of as observableOf } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';
import { OrgWorkflowObject } from './my-workflow/my-workflow.component';
import { Location } from '@angular/common';
-@Injectable()
+@Injectable({
+ providedIn: 'root',
+})
export class MyWorkflowsService extends MyEntriesService> {
- gitHubAppInstallationLink$: Observable;
constructor(
protected userQuery: UserQuery,
protected alertService: AlertService,
@@ -45,13 +53,11 @@ export class MyWorkflowsService extends MyEntriesService {
if (reloadEntries) {
const user = this.userQuery.getValue().user;
diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html
index e5f9667b9c..65a0b382c7 100644
--- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html
+++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html
@@ -1,21 +1,24 @@
GitHub App Logs
-
-
+
+ warning There were problems retrieving the GitHub App logs for this organization.
Often, if you cannot view the logs for your GitHub user account, you must unlink and relink it in
your Dockstore profile.
Otherwise, your GitHub user or the Dockstore app may not have access to the GitHub organization.
- Click here to confirm that the Dockstore app is authorized.
-
+ warning There are no GitHub App logs for this organization.
-
-
- Links
-
-
-
-
-
- Stars 0">star_rate
- {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers?.length }}
+ {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers.length }}
diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts
index 594a04248e..76cb256d5c 100644
--- a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts
+++ b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts
@@ -6,8 +6,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { DateService } from '../../shared/date.service';
import { DockstoreService } from '../../shared/dockstore.service';
-import { CustomMaterialModule } from '../../shared/modules/material.module';
-import { DockstoreStubService, SearchStubService } from '../../test/service-stubs';
+import { DateStubService, DockstoreStubService, SearchStubService } from '../../test/service-stubs';
import { SearchService } from '../state/search.service';
import { SearchWorkflowTableComponent } from './search-workflow-table.component';
@@ -18,12 +17,11 @@ describe('SearchWorkflowTableComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [SearchWorkflowTableComponent],
schemas: [NO_ERRORS_SCHEMA],
- imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule],
+ imports: [BrowserAnimationsModule, RouterTestingModule, SearchWorkflowTableComponent],
providers: [
{ provide: DockstoreService, useClass: DockstoreStubService },
- DateService,
+ { provide: DateService, useClass: DateStubService },
{ provide: SearchService, useClass: SearchStubService },
],
}).compileComponents();
diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.ts b/src/app/search/search-workflow-table/search-workflow-table.component.ts
index ce825799b5..0b4b6935af 100644
--- a/src/app/search/search-workflow-table/search-workflow-table.component.ts
+++ b/src/app/search/search-workflow-table/search-workflow-table.component.ts
@@ -14,13 +14,27 @@
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
-import { MatTableDataSource } from '@angular/material/table';
+import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table';
import { Observable } from 'rxjs';
import { DateService } from '../../shared/date.service';
import { Workflow } from '../../shared/openapi';
import { SearchEntryTable } from '../search-entry-table';
import { SearchQuery, SearchResult } from '../state/search.query';
import { SearchService } from '../state/search.service';
+import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe';
+import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe';
+import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe';
+import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatIconModule } from '@angular/material/icon';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component';
+import { RouterLink } from '@angular/router';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatSortModule } from '@angular/material/sort';
+import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { NgIf, NgFor, KeyValuePipe } from '@angular/common';
+import TopicSelectionEnum = Workflow.TopicSelectionEnum;
/**
* this component refers to search page not workflow listing search
@@ -30,6 +44,25 @@ import { SearchService } from '../state/search.service';
selector: 'app-search-workflow-table',
templateUrl: './search-workflow-table.component.html',
styleUrls: ['../../shared/styles/entry-table.scss', './search-workflow-table.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyProgressBarModule,
+ MatLegacyTableModule,
+ MatSortModule,
+ MatLegacyTooltipModule,
+ RouterLink,
+ AiBubbleComponent,
+ ExtendedModule,
+ MatIconModule,
+ FontAwesomeModule,
+ NgFor,
+ MatLegacyPaginatorModule,
+ KeyValuePipe,
+ DescriptorLanguagePipe,
+ SearchAuthorsHtmlPipe,
+ JoinWithEllipsesPipe,
+ ],
})
export class SearchWorkflowTableComponent extends SearchEntryTable implements OnInit {
readonly entryType = 'workflow';
@@ -41,4 +74,5 @@ export class SearchWorkflowTableComponent extends SearchEntryTable implements On
privateNgOnInit(): Observable>> {
return this.searchQuery.workflows$;
}
+ protected readonly TopicSelectionEnum = TopicSelectionEnum;
}
diff --git a/src/app/search/search.component.scss b/src/app/search/search.component.scss
index b45679ec86..2a186e568c 100644
--- a/src/app/search/search.component.scss
+++ b/src/app/search/search.component.scss
@@ -24,6 +24,10 @@ mat-tab-group.homeComponent {
color: $header-color;
}
+.hits {
+ line-height: 1.8;
+}
+
.sidebar {
position: fixed;
top: 0;
diff --git a/src/app/search/search.component.spec.ts b/src/app/search/search.component.spec.ts
index f58ad5f3cf..b19207df3e 100644
--- a/src/app/search/search.component.spec.ts
+++ b/src/app/search/search.component.spec.ts
@@ -16,16 +16,23 @@
import { ClipboardModule } from '@angular/cdk/clipboard';
import { Component } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { ExtendedGA4GHService } from 'app/shared/openapi';
import { of } from 'rxjs';
-import { CustomMaterialModule } from '../shared/modules/material.module';
+import { DateService } from '../shared/date.service';
import { ProviderService } from '../shared/provider.service';
-import { ExtendedGA4GHStubService, ProviderStubService, QueryBuilderStubService, SearchStubService } from './../test/service-stubs';
+import {
+ DateStubService,
+ ExtendedGA4GHStubService,
+ ProviderStubService,
+ QueryBuilderStubService,
+ SearchStubService,
+} from './../test/service-stubs';
import { MapFriendlyValuesPipe } from './map-friendly-values.pipe';
import { QueryBuilderService } from './query-builder.service';
import { SearchComponent } from './search.component';
@@ -35,18 +42,24 @@ import { SearchService } from './state/search.service';
@Component({
selector: 'app-search-results',
template: '',
+ standalone: true,
+ imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule],
})
class SearchResultsComponent {}
@Component({
selector: 'app-basic-search',
template: '',
+ standalone: true,
+ imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule],
})
class BasicSearchComponent {}
@Component({
selector: 'app-header',
template: '',
+ standalone: true,
+ imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule],
})
class HeaderComponent {}
@@ -59,14 +72,18 @@ describe('SearchComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [SearchComponent, MapFriendlyValuesPipe, HeaderComponent, BasicSearchComponent, SearchResultsComponent],
imports: [
BrowserAnimationsModule,
- CustomMaterialModule,
ClipboardModule,
FontAwesomeModule,
RouterTestingModule,
MatSnackBarModule,
+ MatLegacyDialogModule,
+ SearchComponent,
+ MapFriendlyValuesPipe,
+ HeaderComponent,
+ BasicSearchComponent,
+ SearchResultsComponent,
],
providers: [
{ provide: SearchService, useClass: SearchStubService },
@@ -74,6 +91,7 @@ describe('SearchComponent', () => {
{ provide: ProviderService, useClass: ProviderStubService },
{ provide: ExtendedGA4GHService, useClass: ExtendedGA4GHStubService },
{ provide: SearchQuery, useValue: jasmine.createSpyObj('SearchQuery', ['select', 'getValue', 'searchText']) },
+ { provide: DateService, useClass: DateStubService },
],
}).compileComponents();
})
diff --git a/src/app/search/search.component.ts b/src/app/search/search.component.ts
index 4cc14fcf4b..8d74f1e84f 100644
--- a/src/app/search/search.component.ts
+++ b/src/app/search/search.component.ts
@@ -13,11 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Location } from '@angular/common';
+import { Location, NgClass, NgFor, NgIf, NgStyle, AsyncPipe, LowerCasePipe } from '@angular/common';
import { HttpErrorResponse } from '@angular/common/http';
import { Component, HostListener, OnDestroy, OnInit, ViewChild } from '@angular/core';
-import { MatAccordion } from '@angular/material/expansion';
-import { MatTabChangeEvent } from '@angular/material/tabs';
+import { MatAccordion, MatExpansionModule } from '@angular/material/expansion';
+import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs';
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
import {
faAngleDoubleDown,
@@ -41,6 +41,27 @@ import { AdvancedSearchQuery } from './advancedsearch/state/advanced-search.quer
import { QueryBuilderService } from './query-builder.service';
import { SearchQuery } from './state/search.query';
import { Hit, SearchService } from './state/search.service';
+import { GetFacetSearchUpdatePipe } from './facet-search/facet-search-update.pipe';
+import { GetFacetSearchResultsPipe } from './facet-search/facet-search.pipe';
+import { GetHistogramStylePipe } from './get-histogram-style.pipe';
+import { MapFriendlyValuesPipe } from './map-friendly-values.pipe';
+import { SearchResultsComponent } from './search-results/search-results.component';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../shared/snackbar.directive';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete';
+import { FormsModule } from '@angular/forms';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { BasicSearchComponent } from './basic-search/basic-search.component';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { ExtendedModule } from '@ngbracket/ngx-layout/extended';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { HeaderComponent } from '../header/header.component';
/**
*
@@ -70,6 +91,38 @@ import { Hit, SearchService } from './state/search.service';
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.scss'],
+ standalone: true,
+ imports: [
+ HeaderComponent,
+ FlexModule,
+ MatLegacyTabsModule,
+ NgClass,
+ ExtendedModule,
+ MatLegacyButtonModule,
+ MatExpansionModule,
+ BasicSearchComponent,
+ NgFor,
+ NgIf,
+ MatLegacyTooltipModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ FormsModule,
+ MatLegacyAutocompleteModule,
+ MatLegacyOptionModule,
+ FontAwesomeModule,
+ NgStyle,
+ MatLegacyCheckboxModule,
+ MatLegacyCardModule,
+ SnackbarDirective,
+ ClipboardModule,
+ SearchResultsComponent,
+ AsyncPipe,
+ LowerCasePipe,
+ MapFriendlyValuesPipe,
+ GetHistogramStylePipe,
+ GetFacetSearchResultsPipe,
+ GetFacetSearchUpdatePipe,
+ ],
})
export class SearchComponent implements OnInit, OnDestroy {
Dockstore = Dockstore;
diff --git a/src/app/search/search.module.ts b/src/app/search/search.module.ts
deleted file mode 100644
index 887af17a8a..0000000000
--- a/src/app/search/search.module.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2017 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { ClipboardModule } from '@angular/cdk/clipboard';
-import { CommonModule } from '@angular/common';
-import { HttpClientModule } from '@angular/common/http';
-import { NgModule } from '@angular/core';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
-import { MatAutocompleteModule } from '@angular/material/autocomplete';
-import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
-import { TagCloudComponent } from 'angular-tag-cloud-module';
-
-import { RefreshAlertModule } from '../shared/alert/alert.module';
-import { HeaderModule } from '../shared/modules/header.module';
-import { CustomMaterialModule } from '../shared/modules/material.module';
-import { SnackbarModule } from '../shared/modules/snackbar.module';
-import { PipeModule } from '../shared/pipe/pipe.module';
-import { PrivateIconModule } from '../shared/private-icon/private-icon.module';
-import { AdvancedSearchComponent } from './advancedsearch/advancedsearch.component';
-import { BasicSearchComponent } from './basic-search/basic-search.component';
-import { IsAppToolPipe } from './is-app-tool.pipe';
-import { QueryBuilderService } from './query-builder.service';
-import { SearchResultsComponent } from './search-results/search-results.component';
-import { SearchToolTableComponent } from './search-tool-table/search-tool-table.component';
-import { SearchWorkflowTableComponent } from './search-workflow-table/search-workflow-table.component';
-import { SearchNotebookTableComponent } from './search-notebook-table/search-notebook-table.component';
-import { SearchComponent } from './search.component';
-import { searchRouting } from './search.routing';
-import { SearchService } from './state/search.service';
-import { PreviewWarningModule } from '../shared/modules/preview-warning.module';
-import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe';
-import { JoinWithEllipsesPipe } from './join-with-ellipses.pipe';
-
-@NgModule({
- declarations: [
- AdvancedSearchComponent,
- SearchComponent,
- SearchResultsComponent,
- SearchToolTableComponent,
- SearchWorkflowTableComponent,
- SearchNotebookTableComponent,
- BasicSearchComponent,
- IsAppToolPipe,
- ],
- imports: [
- CommonModule,
- CustomMaterialModule,
- FontAwesomeModule,
- MatAutocompleteModule,
- FormsModule,
- HeaderModule,
- PipeModule,
- ClipboardModule,
- searchRouting,
- HttpClientModule,
- PrivateIconModule,
- ReactiveFormsModule,
- RefreshAlertModule,
- FlexLayoutModule,
- SnackbarModule,
- TagCloudComponent,
- PreviewWarningModule,
- ],
- providers: [SearchService, QueryBuilderService, SearchAuthorsHtmlPipe, JoinWithEllipsesPipe],
- exports: [SearchComponent, IsAppToolPipe],
-})
-export class SearchModule {}
diff --git a/src/app/search/search.routing.ts b/src/app/search/search.routing.ts
index 2d6e3c71f9..e2ff4492b2 100644
--- a/src/app/search/search.routing.ts
+++ b/src/app/search/search.routing.ts
@@ -14,15 +14,19 @@
* limitations under the License.
*/
-import { RouterModule, Routes } from '@angular/router';
+import { Routes } from '@angular/router';
+import { QueryBuilderService } from './query-builder.service';
+import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe';
import { SearchComponent } from './search.component';
+import { SearchService } from './state/search.service';
const CONTAINERS_ROUTES: Routes = [
{
+ providers: [QueryBuilderService, SearchService, SearchAuthorsHtmlPipe],
path: '**',
component: SearchComponent,
data: { title: 'Dockstore | Search' },
},
];
-export const searchRouting = RouterModule.forChild(CONTAINERS_ROUTES);
+export const searchRouting = CONTAINERS_ROUTES;
diff --git a/src/app/search/state/search.query.ts b/src/app/search/state/search.query.ts
index e9bd581f31..ed997e7d5d 100644
--- a/src/app/search/state/search.query.ts
+++ b/src/app/search/state/search.query.ts
@@ -1,10 +1,10 @@
import { Injectable } from '@angular/core';
-import { ActivatedRoute } from '@angular/router';
import { Query } from '@datorama/akita';
import { combineLatest, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { AppTool, DockstoreTool, Workflow, Notebook } from '../../shared/openapi';
import { SearchState, SearchStore } from './search.store';
+import { parseTerms } from '../helpers';
export interface SearchResult {
source: T;
@@ -33,7 +33,7 @@ export class SearchQuery extends Query {
map((notebooks: Array>) => this.haveNoHits(notebooks))
);
public searchText$: Observable = this.select((state) => state.searchText);
- public basicSearchText$: Observable = this.searchText$.pipe(map((searchText) => this.joinComma(searchText)));
+ public basicSearchText$: Observable = this.searchText$.pipe(map((searchText) => this.joinComma(parseTerms(searchText))));
public showToolTagCloud$: Observable = this.select((state) => state.showToolTagCloud);
public showWorkflowTagCloud$: Observable = this.select((state) => state.showWorkflowTagCloud);
public showNotebookTagCloud$: Observable = this.select((state) => state.showNotebookTagCloud);
@@ -60,7 +60,7 @@ export class SearchQuery extends Query {
})
);
- constructor(protected store: SearchStore, private route: ActivatedRoute) {
+ constructor(protected store: SearchStore) {
super(store);
}
@@ -68,8 +68,8 @@ export class SearchQuery extends Query {
return !object || object.length === 0;
}
- joinComma(searchTerm: string): string {
- return searchTerm.trim().split(' ').join(', ');
+ joinComma(strings: string[]): string {
+ return strings.join(', ');
}
/**
diff --git a/src/app/search/state/search.service.spec.ts b/src/app/search/state/search.service.spec.ts
index 677a351c44..8a77eb6835 100644
--- a/src/app/search/state/search.service.spec.ts
+++ b/src/app/search/state/search.service.spec.ts
@@ -15,7 +15,7 @@
*/
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { inject, TestBed } from '@angular/core/testing';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacySnackBarModule as MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import { RouterTestingModule } from '@angular/router/testing';
import { first } from 'rxjs/operators';
import { ImageProviderService } from '../../shared/image-provider.service';
@@ -31,7 +31,7 @@ describe('SearchService', () => {
let searchService: SearchService;
beforeEach(() => {
TestBed.configureTestingModule({
- imports: [RouterTestingModule, HttpClientTestingModule, MatSnackBarModule],
+ imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule],
providers: [
ImageProviderService,
SearchService,
@@ -123,7 +123,7 @@ describe('SearchService', () => {
it('should sort workflows correctly', inject([SearchService], (service: SearchService) => {
const a: Workflow = {
type: '',
- author: 'a',
+ authors: [{ name: 'a' }],
gitUrl: 'https://giturl',
mode: Workflow.ModeEnum.FULL,
organization: '',
@@ -135,20 +135,23 @@ describe('SearchService', () => {
descriptorTypeSubclass: Workflow.DescriptorTypeSubclassEnum.NA,
full_workflow_path: 'abc',
};
+ a['all_authors'] = a['authors'];
- const b: Workflow = {
+ const b: Object = {
...a,
- author: 'B',
+ authors: [{ name: 'B' }],
full_workflow_path: 'Bcd',
starredUsers: [{ isAdmin: false, curator: false, platformPartner: null, setupComplete: true }],
};
+ b['all_authors'] = b['authors'];
- const c: Workflow = { ...a, author: null, full_workflow_path: null, descriptorType: Workflow.DescriptorTypeEnum.WDL };
+ const c: Workflow = { ...a, authors: [], full_workflow_path: null, descriptorType: Workflow.DescriptorTypeEnum.WDL };
+ c['all_authors'] = c['authors'];
- expect(searchService.compareAttributes(a, b, 'author', 'asc', 'workflow')).toEqual(-1);
- expect(searchService.compareAttributes(a, b, 'author', 'desc', 'workflow')).toEqual(1);
- expect(searchService.compareAttributes(b, c, 'author', 'asc', 'workflow')).toEqual(-1);
- expect(searchService.compareAttributes(b, c, 'author', 'desc', 'workflow')).toEqual(-1);
+ expect(searchService.compareAttributes(a, b, 'all_authors', 'asc', 'workflow')).toEqual(-1);
+ expect(searchService.compareAttributes(a, b, 'all_authors', 'desc', 'workflow')).toEqual(1);
+ expect(searchService.compareAttributes(b, c, 'all_authors', 'asc', 'workflow')).toEqual(-1);
+ expect(searchService.compareAttributes(b, c, 'all_authors', 'desc', 'workflow')).toEqual(1);
expect(searchService.compareAttributes(a, c, 'descriptorType', 'asc', 'workflow')).toEqual(-1);
expect(searchService.compareAttributes(a, b, 'descriptorType', 'desc', 'workflow')).toEqual(-0);
expect(searchService.compareAttributes(a, b, 'starredUsers', 'asc', 'workflow')).toEqual(-1);
diff --git a/src/app/select/select.component.spec.ts b/src/app/select/select.component.spec.ts
index 499f4c79c9..a709832f2e 100644
--- a/src/app/select/select.component.spec.ts
+++ b/src/app/select/select.component.spec.ts
@@ -16,6 +16,7 @@
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { SelectComponent } from './select.component';
@@ -26,7 +27,7 @@ describe('SelectComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [SelectComponent],
+ imports: [SelectComponent, NoopAnimationsModule],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
})
diff --git a/src/app/select/select.component.ts b/src/app/select/select.component.ts
index 18b0527e4c..caddca4473 100644
--- a/src/app/select/select.component.ts
+++ b/src/app/select/select.component.ts
@@ -15,10 +15,17 @@
*/
import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { NgFor, NgIf } from '@angular/common';
+import { MatLegacySelectModule } from '@angular/material/legacy-select';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
@Component({
selector: 'app-select',
templateUrl: './select.component.html',
+ standalone: true,
+ imports: [MatLegacyFormFieldModule, MatLegacySelectModule, NgFor, MatLegacyOptionModule, MatLegacyTooltipModule, NgIf],
})
export class SelectComponent implements OnChanges {
@Input() items: Array;
diff --git a/src/app/session-expired/session-expired.component.ts b/src/app/session-expired/session-expired.component.ts
index 021a9082e7..45112503a6 100644
--- a/src/app/session-expired/session-expired.component.ts
+++ b/src/app/session-expired/session-expired.component.ts
@@ -14,9 +14,13 @@
* limitations under the License.
*/
import { Component } from '@angular/core';
+import { RouterLink } from '@angular/router';
+import { HeaderComponent } from '../header/header.component';
@Component({
selector: 'app-policy-update',
templateUrl: './session-expired.component.html',
+ standalone: true,
+ imports: [HeaderComponent, RouterLink],
})
export class SessionExpiredComponent {}
diff --git a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts b/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts
deleted file mode 100644
index 6018af8d97..0000000000
--- a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2022 OICR, UCSC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { RouterModule } from '@angular/router';
-import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service';
-import { EntryWizardModule } from 'app/shared/entry-wizard.module';
-import { MyEntriesModule } from 'app/shared/modules/my-entries.module';
-import { PreviewWarningModule } from 'app/shared/modules/preview-warning.module';
-import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component';
-import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component';
-import { SidebarAccordionComponent } from '../myworkflows/sidebar-accordion/sidebar-accordion.component';
-import { RefreshAlertModule } from '../shared/alert/alert.module';
-import { HeaderModule } from '../shared/modules/header.module';
-import { CustomMaterialModule } from '../shared/modules/material.module';
-import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module';
-import { WorkflowModule } from '../shared/modules/workflow.module';
-import { PipeModule } from '../shared/pipe/pipe.module';
-import { RefreshWorkflowOrganizationComponent } from '../workflow/refresh-workflow-organization/refresh-workflow-organization.component';
-import { RegisterWorkflowModalComponent } from '../workflow/register-workflow-modal/register-workflow-modal.component';
-
-const DECLARATIONS: any[] = [
- MyWorkflowComponent,
- RefreshWorkflowOrganizationComponent,
- RegisterWorkflowModalComponent,
- RegisterGithubAppModalComponent,
- SidebarAccordionComponent,
-];
-const IMPORTS = [
- FormsModule,
- WorkflowModule,
- HeaderModule,
- CustomMaterialModule,
- RefreshAlertModule,
- PipeModule,
- CommonModule,
- RouterModule,
- MyEntriesModule,
- EntryWizardModule,
- PreviewWarningModule,
- RegisterGithubAppModule,
-];
-
-/**
- * This is a shared module between the My Workflows page, My Services page, and My Notebooks page.
- * It shares modules and components
- *
- * @export
- * @class SharedWorkflowServicesNotebooksModule
- */
-@NgModule({
- declarations: DECLARATIONS,
- imports: IMPORTS,
- providers: [MyWorkflowsService],
- exports: [DECLARATIONS.concat(IMPORTS), SidebarAccordionComponent],
-})
-export class SharedWorkflowServicesNotebooksModule {}
diff --git a/src/app/shared/ai-bubble/ai-bubble.component.html b/src/app/shared/ai-bubble/ai-bubble.component.html
new file mode 100644
index 0000000000..d0271f9036
--- /dev/null
+++ b/src/app/shared/ai-bubble/ai-bubble.component.html
@@ -0,0 +1,15 @@
+
+
+ AI
+
diff --git a/src/app/shared/ai-bubble/ai-bubble.component.ts b/src/app/shared/ai-bubble/ai-bubble.component.ts
new file mode 100644
index 0000000000..72b75e0a36
--- /dev/null
+++ b/src/app/shared/ai-bubble/ai-bubble.component.ts
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2024 OICR, UCSC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Component, Input, OnInit } from '@angular/core';
+import { Dockstore } from '../dockstore.model';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+
+/**
+ * Component for the AI generated indicator.
+ *
+ * @export
+ * @class AiBubbleComponent
+ * @implements {OnInit}
+ */
+@Component({
+ selector: 'app-ai-bubble',
+ templateUrl: './ai-bubble.component.html',
+ standalone: true,
+ imports: [MatLegacyTooltipModule],
+})
+export class AiBubbleComponent implements OnInit {
+ constructor() {}
+
+ ngOnInit() {}
+
+ protected readonly Dockstore = Dockstore;
+
+ @Input()
+ isPublic: boolean;
+}
diff --git a/src/app/shared/alert/alert.component.spec.ts b/src/app/shared/alert/alert.component.spec.ts
index da308ba4e9..afed9557ea 100644
--- a/src/app/shared/alert/alert.component.spec.ts
+++ b/src/app/shared/alert/alert.component.spec.ts
@@ -1,8 +1,8 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-import { MatCardModule } from '@angular/material/card';
+import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card';
import { MatIconModule } from '@angular/material/icon';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
-import { MatSnackBarModule } from '@angular/material/snack-bar';
+import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar';
import { AlertComponent } from './alert.component';
@@ -13,8 +13,7 @@ describe('RefreshAlertComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule],
- declarations: [AlertComponent],
+ imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule, AlertComponent],
}).compileComponents();
})
);
diff --git a/src/app/shared/alert/alert.component.ts b/src/app/shared/alert/alert.component.ts
index 245d7aba29..197c9b1d9a 100644
--- a/src/app/shared/alert/alert.component.ts
+++ b/src/app/shared/alert/alert.component.ts
@@ -18,6 +18,10 @@ import { Observable } from 'rxjs';
import { AlertQuery } from './state/alert.query';
import { AlertService } from './state/alert.service';
+import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, AsyncPipe } from '@angular/common';
/**
* Stick this component into any location you want to potentially display a progress bar or alert.
@@ -30,6 +34,8 @@ import { AlertService } from './state/alert.service';
selector: 'app-alert',
templateUrl: './alert.component.html',
styleUrls: ['./alert.component.css'],
+ standalone: true,
+ imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule, AsyncPipe],
})
export class AlertComponent implements OnInit {
public showError$: Observable;
diff --git a/src/app/shared/alert/alert.module.ts b/src/app/shared/alert/alert.module.ts
deleted file mode 100644
index 0bf66abe3f..0000000000
--- a/src/app/shared/alert/alert.module.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { MatIconModule } from '@angular/material/icon';
-import { MatProgressBarModule } from '@angular/material/progress-bar';
-import { CustomMaterialModule } from './../modules/material.module';
-
-import { LoadingComponent } from '../loading/loading.component';
-import { AlertComponent } from './alert.component';
-
-@NgModule({
- declarations: [AlertComponent, LoadingComponent],
- imports: [MatProgressBarModule, MatIconModule, CommonModule, FormsModule, CustomMaterialModule],
- exports: [AlertComponent, LoadingComponent],
-})
-export class RefreshAlertModule {}
diff --git a/src/app/shared/alert/state/alert.service.ts b/src/app/shared/alert/state/alert.service.ts
index 9cef7af8f0..d939d5302b 100644
--- a/src/app/shared/alert/state/alert.service.ts
+++ b/src/app/shared/alert/state/alert.service.ts
@@ -15,7 +15,7 @@
*/
import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
-import { MatSnackBar } from '@angular/material/snack-bar';
+import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar';
import { AlertQuery } from './alert.query';
import { AlertStore } from './alert.store';
diff --git a/src/app/shared/auth.guard.ts b/src/app/shared/auth.guard.ts
index faef9bf4e4..4548165862 100644
--- a/src/app/shared/auth.guard.ts
+++ b/src/app/shared/auth.guard.ts
@@ -15,15 +15,15 @@
*/
import { Injectable } from '@angular/core';
-import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
-import { AuthService } from 'ng2-ui-auth';
-import { of } from 'rxjs/internal/observable/of';
+import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
+import { of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
+import { AuthService } from '../ng2-ui-auth/public_api';
import { LogoutService } from './logout.service';
import { UsersService } from './openapi';
@Injectable()
-export class AuthGuard implements CanActivate {
+export class AuthGuard {
constructor(
private auth: AuthService,
private router: Router,
diff --git a/src/app/shared/auth.model.ts b/src/app/shared/auth.model.ts
index 7f9a9ed231..cba4e6cb15 100644
--- a/src/app/shared/auth.model.ts
+++ b/src/app/shared/auth.model.ts
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { IPartialConfigOptions } from 'ng2-ui-auth/lib/config-interfaces';
+import { IPartialConfigOptions } from '../ng2-ui-auth/lib/config-interfaces';
import { Dockstore } from '../shared/dockstore.model';
export const AuthConfig: IPartialConfigOptions = {
diff --git a/src/app/shared/available-logs.module.ts b/src/app/shared/available-logs.module.ts
deleted file mode 100644
index 81900304c7..0000000000
--- a/src/app/shared/available-logs.module.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2019 OICR
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FlexLayoutModule } from '@angular/flex-layout';
-import { RefreshAlertModule } from './alert/alert.module';
-import { AvailableLogsComponent } from './available-logs/available-logs.component';
-import { RemoveExtensionPipe } from './available-logs/remove-extension.pipe';
-import { ToolTesterLogPipe } from './available-logs/tool-tester-log.pipe';
-import { VerifiedDisplayComponent } from './entry/verified-display/verified-display.component';
-import { CustomMaterialModule } from './modules/material.module';
-
-@NgModule({
- imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RefreshAlertModule],
- declarations: [AvailableLogsComponent, VerifiedDisplayComponent, ToolTesterLogPipe, RemoveExtensionPipe],
- exports: [VerifiedDisplayComponent],
-})
-export class AvailableLogsModule {}
diff --git a/src/app/shared/available-logs/available-logs.component.ts b/src/app/shared/available-logs/available-logs.component.ts
index 6ca3e0c2a4..eff8a85fc3 100644
--- a/src/app/shared/available-logs/available-logs.component.ts
+++ b/src/app/shared/available-logs/available-logs.component.ts
@@ -1,5 +1,5 @@
import { Component, Inject, OnInit } from '@angular/core';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog';
import { ID } from '@datorama/akita';
import { Observable } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@@ -9,6 +9,15 @@ import { ToolTesterLog } from '../openapi/model/toolTesterLog';
import { AvailableLogsQuery } from '../state/available-logs.query';
import { AvailableLogsService } from '../state/available-logs.service';
import { CheckerWorkflowQuery } from '../state/checker-workflow.query';
+import { RemoveExtensionPipe } from './remove-extension.pipe';
+import { ToolTesterLogPipe } from './tool-tester-log.pipe';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyTableModule } from '@angular/material/legacy-table';
+import { VerifiedDisplayComponent } from '../entry/verified-display/verified-display.component';
+import { NgIf, AsyncPipe, DatePipe } from '@angular/common';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { LoadingComponent } from '../loading/loading.component';
interface VersionVerifiedInformation {
version: WorkflowVersion | Tag;
@@ -19,6 +28,21 @@ interface VersionVerifiedInformation {
selector: 'app-available-logs',
templateUrl: './available-logs.component.html',
styleUrls: ['./available-logs.component.scss'],
+ standalone: true,
+ imports: [
+ MatLegacyDialogModule,
+ LoadingComponent,
+ MatLegacyCardModule,
+ NgIf,
+ VerifiedDisplayComponent,
+ MatLegacyTableModule,
+ MatLegacyButtonModule,
+ FlexModule,
+ AsyncPipe,
+ DatePipe,
+ ToolTesterLogPipe,
+ RemoveExtensionPipe,
+ ],
})
export class AvailableLogsComponent extends Base implements OnInit {
version: Tag | WorkflowVersion | null;
diff --git a/src/app/shared/available-logs/remove-extension.pipe.ts b/src/app/shared/available-logs/remove-extension.pipe.ts
index 6add2d5dff..45c2381595 100644
--- a/src/app/shared/available-logs/remove-extension.pipe.ts
+++ b/src/app/shared/available-logs/remove-extension.pipe.ts
@@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'removeExtension',
+ standalone: true,
})
export class RemoveExtensionPipe implements PipeTransform {
/**
diff --git a/src/app/shared/available-logs/tool-tester-log.pipe.ts b/src/app/shared/available-logs/tool-tester-log.pipe.ts
index 3962068e91..8eb51f6aaa 100644
--- a/src/app/shared/available-logs/tool-tester-log.pipe.ts
+++ b/src/app/shared/available-logs/tool-tester-log.pipe.ts
@@ -3,6 +3,7 @@ import { Router, UrlTree } from '@angular/router';
import { Dockstore } from '../dockstore.model';
@Pipe({
name: 'toolTesterLog',
+ standalone: true,
})
export class ToolTesterLogPipe implements PipeTransform {
constructor(private router: Router) {}
diff --git a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts
index de7286303f..d89f5c6ec0 100644
--- a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts
+++ b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts
@@ -1,14 +1,14 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { ClipboardModule } from '@angular/cdk/clipboard';
-import { MatButtonModule } from '@angular/material/button';
-import { MatCardModule } from '@angular/material/card';
-import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card';
+import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field';
import { MatIconModule } from '@angular/material/icon';
-import { MatInputModule } from '@angular/material/input';
-import { MatTabsModule } from '@angular/material/tabs';
+import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input';
+import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs';
import { MatToolbarModule } from '@angular/material/toolbar';
-import { MatTooltipModule } from '@angular/material/tooltip';
+import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
import { WorkflowService } from '../state/workflow.service';
import { PrivateFilePathPipe } from './../../shared/entry/private-file-path.pipe';
@@ -27,7 +27,6 @@ describe('CodeEditorListComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe],
imports: [
MatButtonModule,
MatTabsModule,
@@ -39,6 +38,10 @@ describe('CodeEditorListComponent', () => {
MatCardModule,
ClipboardModule,
HttpClientTestingModule,
+ CodeEditorListComponent,
+ CodeEditorComponent,
+ PublicFileDownloadPipe,
+ PrivateFilePathPipe,
],
providers: [
{ provide: WorkflowService, useClass: WorkflowStubService },
diff --git a/src/app/shared/code-editor-list/code-editor-list.component.ts b/src/app/shared/code-editor-list/code-editor-list.component.ts
index 22eb2c90af..6cc71dc8c6 100644
--- a/src/app/shared/code-editor-list/code-editor-list.component.ts
+++ b/src/app/shared/code-editor-list/code-editor-list.component.ts
@@ -2,11 +2,25 @@ import { Component, Input } from '@angular/core';
import { Observable } from 'rxjs';
import { WorkflowQuery } from '../state/workflow.query';
-import { SourceFile } from '../openapi';
+import { EntryType, SourceFile } from '../openapi';
import { ToolDescriptor } from './../../shared/openapi/model/toolDescriptor';
import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion';
import { CodeEditorListService } from './code-editor-list.service';
import { FileService } from 'app/shared/file.service';
+import { PrivateFilePathPipe } from '../entry/private-file-path.pipe';
+import { PublicFileDownloadPipe } from '../entry/public-file-download.pipe';
+import { CodeEditorComponent } from '../code-editor/code-editor.component';
+import { ClipboardModule } from '@angular/cdk/clipboard';
+import { SnackbarDirective } from '../snackbar.directive';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { MatLegacyInputModule } from '@angular/material/legacy-input';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { FormsModule } from '@angular/forms';
+import { MatToolbarModule } from '@angular/material/toolbar';
+import { MatLegacyCardModule } from '@angular/material/legacy-card';
+import { NgIf, NgFor, AsyncPipe } from '@angular/common';
export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam';
@@ -14,13 +28,32 @@ export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam';
selector: 'app-code-editor-list',
templateUrl: './code-editor-list.component.html',
styleUrls: ['./code-editor-list.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyCardModule,
+ NgFor,
+ MatToolbarModule,
+ FormsModule,
+ MatLegacyFormFieldModule,
+ MatLegacyInputModule,
+ MatLegacyButtonModule,
+ MatLegacyTooltipModule,
+ MatIconModule,
+ SnackbarDirective,
+ ClipboardModule,
+ CodeEditorComponent,
+ AsyncPipe,
+ PublicFileDownloadPipe,
+ PrivateFilePathPipe,
+ ],
})
export class CodeEditorListComponent {
@Input() sourcefiles: SourceFile[];
@Input() editing: boolean;
@Input() fileType: FileCategory;
@Input() descriptorType: ToolDescriptor.TypeEnum;
- @Input() entryType: 'tool' | 'workflow';
+ @Input() entryType: EntryType;
@Input() entrypath: string;
@Input() selectedVersion: WorkflowVersion;
protected published$: Observable;
diff --git a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts
index 60ddaf7372..8d9a5beafd 100644
--- a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts
+++ b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts
@@ -33,37 +33,76 @@ describe('CodeEditorListService', () => {
it('should be able to determine files to add', () => {
const service: CodeEditorListService = TestBed.inject(CodeEditorListService);
// Brand new hosted workflow with no descriptors
- const primarySMKFile = { content: '', absolutePath: '/Snakefile', path: '/Snakefile', type: SourceFile.TypeEnum.DOCKSTORESMK };
- const secondarySMKFile = { content: '', absolutePath: '/.smk', path: '/.smk', type: SourceFile.TypeEnum.DOCKSTORESMK };
+ const primarySMKFile = {
+ content: '',
+ absolutePath: '/Snakefile',
+ path: '/Snakefile',
+ type: SourceFile.TypeEnum.DOCKSTORESMK,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
const primaryCWLFile: SourceFile = {
content: '',
absolutePath: '/Dockstore.cwl',
path: '/Dockstore.cwl',
type: SourceFile.TypeEnum.DOCKSTORECWL,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const secondaryCWLFile = {
+ content: '',
+ absolutePath: '/.cwl',
+ path: '/.cwl',
+ type: SourceFile.TypeEnum.DOCKSTORECWL,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const primaryWDLFile = {
+ content: '',
+ absolutePath: '/Dockstore.wdl',
+ path: '/Dockstore.wdl',
+ type: SourceFile.TypeEnum.DOCKSTOREWDL,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const secondaryWDLFile = {
+ content: '',
+ absolutePath: '/.wdl',
+ path: '/.wdl',
+ type: SourceFile.TypeEnum.DOCKSTOREWDL,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const firstPrimaryNFLFile = {
+ content: '',
+ absolutePath: '/main.nf',
+ path: '/main.nf',
+ type: SourceFile.TypeEnum.NEXTFLOW,
+ state: SourceFile.StateEnum.COMPLETE,
};
- const secondaryCWLFile = { content: '', absolutePath: '/.cwl', path: '/.cwl', type: SourceFile.TypeEnum.DOCKSTORECWL };
- const primaryWDLFile = { content: '', absolutePath: '/Dockstore.wdl', path: '/Dockstore.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL };
- const secondaryWDLFile = { content: '', absolutePath: '/.wdl', path: '/.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL };
- const firstPrimaryNFLFile = { content: '', absolutePath: '/main.nf', path: '/main.nf', type: SourceFile.TypeEnum.NEXTFLOW };
const secondPrimaryNFLFile = {
content: '',
absolutePath: '/nextflow.config',
path: '/nextflow.config',
type: SourceFile.TypeEnum.NEXTFLOWCONFIG,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const secondaryNFLFile = {
+ content: '',
+ absolutePath: '/.nf',
+ path: '/.nf',
+ type: SourceFile.TypeEnum.NEXTFLOW,
+ state: SourceFile.StateEnum.COMPLETE,
};
- const secondaryNFLFile = { content: '', absolutePath: '/.nf', path: '/.nf', type: SourceFile.TypeEnum.NEXTFLOW };
const primaryNFLFiles = [firstPrimaryNFLFile, secondPrimaryNFLFile];
const primaryGalaxyFile = {
content: '',
absolutePath: '/workflow-name.yml',
path: '/workflow-name.yml',
type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2,
+ state: SourceFile.StateEnum.COMPLETE,
};
const secondaryGalaxyFile = {
content: '',
absolutePath: '/.yml',
path: '/.yml',
type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2,
+ state: SourceFile.StateEnum.COMPLETE,
};
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'descriptor', [])).toEqual([primarySMKFile]);
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.CWL, 'descriptor', [])).toEqual([primaryCWLFile]);
@@ -71,27 +110,48 @@ describe('CodeEditorListService', () => {
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.NFL, 'descriptor', [])).toEqual(primaryNFLFiles);
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.GALAXY, 'descriptor', [])).toEqual([primaryGalaxyFile]);
- const testSMKFile = { content: '', absolutePath: '/test.smk.json', path: '/test.smk.json', type: SourceFile.TypeEnum.SMKTESTPARAMS };
- const testCWLFile = { content: '', absolutePath: '/test.cwl.json', path: '/test.cwl.json', type: SourceFile.TypeEnum.CWLTESTJSON };
- const testWDLFile = { content: '', absolutePath: '/test.wdl.json', path: '/test.wdl.json', type: SourceFile.TypeEnum.WDLTESTJSON };
+ const testSMKFile = {
+ content: '',
+ absolutePath: '/test.smk.json',
+ path: '/test.smk.json',
+ type: SourceFile.TypeEnum.SMKTESTPARAMS,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const testCWLFile = {
+ content: '',
+ absolutePath: '/test.cwl.json',
+ path: '/test.cwl.json',
+ type: SourceFile.TypeEnum.CWLTESTJSON,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
+ const testWDLFile = {
+ content: '',
+ absolutePath: '/test.wdl.json',
+ path: '/test.wdl.json',
+ type: SourceFile.TypeEnum.WDLTESTJSON,
+ state: SourceFile.StateEnum.COMPLETE,
+ };
// Weird because NFL doesn't have test parameter files
const testNFLFile = {
content: '',
absolutePath: '/test.nfl.json',
path: '/test.nfl.json',
type: SourceFile.TypeEnum.NEXTFLOWTESTPARAMS,
+ state: SourceFile.StateEnum.COMPLETE,
};
const testGalaxyFile = {
content: '',
absolutePath: '/test.galaxy.json',
path: '/test.galaxy.json',
type: SourceFile.TypeEnum.GXFORMAT2TESTFILE,
+ state: SourceFile.StateEnum.COMPLETE,
};
const testDockerFile = {
content: '',
absolutePath: '/Dockerfile',
path: '/Dockerfile',
type: SourceFile.TypeEnum.DOCKERFILE,
+ state: SourceFile.StateEnum.COMPLETE,
};
// Brand new hosted workflow with no test parameter file
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'testParam', [])).toEqual([testSMKFile]);
@@ -125,6 +185,7 @@ describe('CodeEditorListService', () => {
absolutePath: '/.dockstore.yml',
path: '/.dockstore.yml',
type: SourceFile.TypeEnum.DOCKSTORECWL,
+ state: SourceFile.StateEnum.COMPLETE,
};
expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SERVICE, 'descriptor', [])).toEqual([weirdServiceFile]);
});
diff --git a/src/app/shared/code-editor-list/code-editor-list.service.ts b/src/app/shared/code-editor-list/code-editor-list.service.ts
index 77cf093ec2..34aabd1e99 100644
--- a/src/app/shared/code-editor-list/code-editor-list.service.ts
+++ b/src/app/shared/code-editor-list/code-editor-list.service.ts
@@ -201,6 +201,7 @@ export class CodeEditorListService {
content: '',
path: newFilePath,
type: type,
+ state: 'COMPLETE',
};
} else {
return null;
diff --git a/src/app/shared/code-editor/code-editor.component.spec.ts b/src/app/shared/code-editor/code-editor.component.spec.ts
index 145886bec0..967851a280 100644
--- a/src/app/shared/code-editor/code-editor.component.spec.ts
+++ b/src/app/shared/code-editor/code-editor.component.spec.ts
@@ -10,8 +10,7 @@ describe('CodeEditorComponent', () => {
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
- declarations: [CodeEditorComponent],
- imports: [HttpClientTestingModule],
+ imports: [HttpClientTestingModule, CodeEditorComponent],
}).compileComponents();
})
);
diff --git a/src/app/shared/code-editor/code-editor.component.ts b/src/app/shared/code-editor/code-editor.component.ts
index 56eff64963..b6220bb8fb 100644
--- a/src/app/shared/code-editor/code-editor.component.ts
+++ b/src/app/shared/code-editor/code-editor.component.ts
@@ -1,6 +1,8 @@
import { HttpClient } from '@angular/common/http';
import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core';
+
import { ace } from './../grammars/custom-grammars.js';
+import { EntryType } from '../openapi/model/entryType';
let ACE_EDITOR_INSTANCE = 0;
@@ -8,6 +10,7 @@ let ACE_EDITOR_INSTANCE = 0;
selector: 'app-code-editor',
templateUrl: './code-editor.component.html',
styleUrls: ['./code-editor.component.scss'],
+ standalone: true,
})
export class CodeEditorComponent implements AfterViewInit {
editorContent: string;
@@ -16,7 +19,7 @@ export class CodeEditorComponent implements AfterViewInit {
editorFilepath: string;
aceId: string;
readOnly = true;
- @Input() entryType: 'tool' | 'workflow';
+ @Input() entryType: EntryType;
@Input() set editing(value: boolean) {
if (value !== undefined) {
this.toggleReadOnly(!value);
@@ -72,7 +75,9 @@ export class CodeEditorComponent implements AfterViewInit {
this.editor.setValue(this.editorContent, cursorPos);
}
- this.editor.focus();
+ if (!this.readOnly) {
+ this.editor.focus();
+ }
};
let sampleCodeUrl = '';
@@ -80,9 +85,9 @@ export class CodeEditorComponent implements AfterViewInit {
// Load sample code by default when editing empty CWL/WDL/Nextflow files
if (!this.editorContent) {
if (this.mode === 'cwl') {
- if (this.entryType === 'tool') {
+ if (this.entryType === EntryType.TOOL) {
sampleCodeUrl = '../assets/text/sample-tool.cwl';
- } else if (this.entryType === 'workflow') {
+ } else if (this.entryType === EntryType.WORKFLOW) {
sampleCodeUrl = '../assets/text/sample-workflow.cwl';
}
} else if (this.mode === 'wdl') {
@@ -91,11 +96,21 @@ export class CodeEditorComponent implements AfterViewInit {
sampleCodeUrl = '../assets/text/sample.nf';
} else if (this.editorFilepath === '/nextflow.config') {
sampleCodeUrl = '../assets/text/nextflow.config';
+ } else if (this.mode === 'yaml') {
+ if (this.entryType === EntryType.WORKFLOW) {
+ sampleCodeUrl = '../assets/text/sample-workflow-dockstore.yml';
+ } else if (this.entryType === EntryType.APPTOOL) {
+ sampleCodeUrl = '../assets/text/sample-tool-dockstore.yml';
+ } else if (this.entryType === EntryType.NOTEBOOK) {
+ sampleCodeUrl = '../assets/text/sample-notebook-dockstore.yml';
+ } else if (this.entryType === EntryType.SERVICE) {
+ sampleCodeUrl = '../assets/text/sample-service-dockstore.yml';
+ }
}
}
if (sampleCodeUrl) {
const httpOptions: Object = { responseType: 'text' };
- this.httpClient.get(sampleCodeUrl, httpOptions).subscribe(setContent);
+ this.httpClient.get(sampleCodeUrl, httpOptions).subscribe((content: string) => setContent(content, this.readOnly ? -1 : 0));
} else {
setContent(this.editorContent, -1);
}
diff --git a/src/app/shared/constants.ts b/src/app/shared/constants.ts
index 2f594d40b4..3d9fdcb359 100644
--- a/src/app/shared/constants.ts
+++ b/src/app/shared/constants.ts
@@ -27,7 +27,6 @@ export const includesValidation = 'validations';
export const includesVersions = 'versions';
export const includesAuthors = 'authors';
export const includesMetrics = 'metrics';
-export const bootstrap4smallModalSize = '300px';
export const bootstrap4mediumModalSize = '500px';
export const bootstrap4largeModalSize = '800px';
export const bootstrap4extraLargeModalSize = '1140px';
@@ -35,12 +34,7 @@ export const myBioWorkflowsURLSegment = 'my-workflows';
export const myServicesURLSegment = 'my-services';
export const myToolsURLSegment = 'my-tools';
export const myNotebooksURLSegment = 'my-notebooks';
-export const bioWorkflowsURLSegment = 'workflows';
-export const servicesURLSegment = 'services';
-export const toolsURLSegment = 'tools';
-export const notebooksURLSegment = 'notebooks';
export const altAvatarImg = 'http://www.imcslc.ca/imc/includes/themes/imc/images/layout/img_placeholder_avatar.jpg';
-export const devMode = false;
export const currentTOSVersion: User.TosversionEnum = User.TosversionEnum.TOSVERSION2;
export const currentPrivacyPolicyVersion: User.PrivacyPolicyVersionEnum = User.PrivacyPolicyVersionEnum.PRIVACYPOLICYVERSION25;
export const dismissedLatestTOS = 'dismissedLatestTOS';
diff --git a/src/app/shared/container.service.ts b/src/app/shared/container.service.ts
index 66a0d62afa..66e7f062ba 100644
--- a/src/app/shared/container.service.ts
+++ b/src/app/shared/container.service.ts
@@ -15,11 +15,8 @@
*/
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
-import { ExtendedDockstoreToolService } from './extended-dockstoreTool/extended-dockstoreTool.service';
import { DockstoreTool } from './openapi/model/dockstoreTool';
-import { ToolQuery } from './tool/tool.query';
import { ToolService } from './tool/tool.service';
-import { ToolStore } from './tool/tool.store';
/**
* This is mostly deprecated in favor of ToolService for the selected tool
@@ -33,12 +30,7 @@ export class ContainerService {
tools$ = new BehaviorSubject(null); // This contains the list of unsorted tools
private copyBtnSource = new BehaviorSubject(null); // This is the currently selected copy button.
copyBtn$ = this.copyBtnSource.asObservable();
- constructor(
- private toolService: ToolService,
- private toolQuery: ToolQuery,
- private toolStore: ToolStore,
- private extendedDockstoreToolService: ExtendedDockstoreToolService
- ) {}
+ constructor(private toolService: ToolService) {}
setTool(tool: any) {
this.toolService.setTool(tool);
}
@@ -96,16 +88,4 @@ export class ContainerService {
setCopyBtn(copyBtn: any) {
this.copyBtnSource.next(copyBtn);
}
-
- updateActiveTopic(topicManual: string) {
- const newTool = { ...this.toolQuery.getActive(), topicManual: topicManual };
- this.toolStore.upsert(newTool.id, newTool);
- this.extendedDockstoreToolService.update(newTool);
- }
-
- updateActiveTopicSelection(topicSelection: DockstoreTool.TopicSelectionEnum) {
- const newWorkflow = { ...this.toolQuery.getActive(), topicSelection: topicSelection };
- this.toolStore.upsert(newWorkflow.id, newWorkflow);
- this.extendedDockstoreToolService.update(newWorkflow);
- }
}
diff --git a/src/app/shared/entry-actions/entry-actions.service.spec.ts b/src/app/shared/entry-actions/entry-actions.service.spec.ts
index 0e8181845d..e54824bf53 100644
--- a/src/app/shared/entry-actions/entry-actions.service.spec.ts
+++ b/src/app/shared/entry-actions/entry-actions.service.spec.ts
@@ -1,18 +1,18 @@
import { inject, TestBed } from '@angular/core/testing';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialogModule } from '@angular/material/legacy-dialog';
+import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar';
import {
ContainersStubService,
ContainerStubService,
+ EntriesStubService,
WorkflowsStubService,
WorkflowStubService,
- EntriesStubService,
} from 'app/test/service-stubs';
import { exampleEntry } from '../../test/mocked-objects';
import { ContainerService } from '../container.service';
import { EntryType } from '../enum/entry-type';
-import { CustomMaterialModule } from '../modules/material.module';
+import { ContainersService, DockstoreTool, EntriesService, Entry, Tag, Workflow, WorkflowsService } from '../openapi';
import { WorkflowService } from '../state/workflow.service';
-import { ContainersService, DockstoreTool, Entry, Tag, Workflow, WorkflowsService, EntriesService } from '../openapi';
import { EntryActionsService } from './entry-actions.service';
describe('Service: EntryActionsService', () => {
@@ -41,7 +41,7 @@ describe('Service: EntryActionsService', () => {
useClass: EntriesStubService,
},
],
- imports: [CustomMaterialModule],
+ imports: [MatLegacySnackBarModule, MatLegacyDialogModule],
});
});
@@ -49,6 +49,7 @@ describe('Service: EntryActionsService', () => {
expect(service).toBeTruthy();
}));
it('should know if entry is hosted', inject([EntryActionsService], (service: EntryActionsService) => {
+ expect(DockstoreTool.ModeEnum.HOSTED).toBe(Workflow.ModeEnum.HOSTED); // Both values should be the same
expect(service.isEntryHosted(null)).toBeTruthy();
const dockstoreTool = {};
dockstoreTool.mode = DockstoreTool.ModeEnum.HOSTED;
diff --git a/src/app/shared/entry-actions/entry-actions.service.ts b/src/app/shared/entry-actions/entry-actions.service.ts
index 81ab410c21..42101f7b7b 100644
--- a/src/app/shared/entry-actions/entry-actions.service.ts
+++ b/src/app/shared/entry-actions/entry-actions.service.ts
@@ -1,6 +1,6 @@
import { HttpErrorResponse } from '@angular/common/http';
import { Injectable, EventEmitter } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { AlertService } from '../alert/state/alert.service';
import { includesAuthors, includesVersions } from '../constants';
import { ContainerService } from '../container.service';
diff --git a/src/app/shared/entry-actions/tool-actions.component.ts b/src/app/shared/entry-actions/tool-actions.component.ts
index de79fa3153..145098578f 100644
--- a/src/app/shared/entry-actions/tool-actions.component.ts
+++ b/src/app/shared/entry-actions/tool-actions.component.ts
@@ -4,11 +4,19 @@ import { RefreshService } from '../refresh.service';
import { DockstoreTool, Tag } from '../openapi';
import { EntryActionsComponent } from './entry-actions.component';
import { EntryActionsService } from './entry-actions.service';
+import { ModalComponent } from '../../container/deregister-modal/deregister-modal.component';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { RouterLink } from '@angular/router';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-tool-actions',
templateUrl: './tool-actions.component.html',
styleUrls: ['./entry-actions.component.scss'],
+ standalone: true,
+ imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, ModalComponent, AsyncPipe],
})
export class ToolActionsComponent extends EntryActionsComponent implements OnInit, OnChanges {
@Input() tool: DockstoreTool;
diff --git a/src/app/shared/entry-actions/workflow-actions.component.ts b/src/app/shared/entry-actions/workflow-actions.component.ts
index e352d74359..37833de1b2 100644
--- a/src/app/shared/entry-actions/workflow-actions.component.ts
+++ b/src/app/shared/entry-actions/workflow-actions.component.ts
@@ -1,5 +1,5 @@
import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
-import { MatDialog } from '@angular/material/dialog';
+import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog';
import { Observable } from 'rxjs';
import { AlertQuery } from '../alert/state/alert.query';
import { ga4ghServiceIdPrefix, ga4ghWorkflowIdPrefix } from '../constants';
@@ -13,11 +13,18 @@ import { EntryActionsComponent } from './entry-actions.component';
import { EntryActionsService } from './entry-actions.service';
import { DeleteEntryDialogComponent } from '../../entry/delete/dialog/delete-entry-dialog.component';
import { bootstrap4largeModalSize } from '../../shared/constants';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { RouterLink } from '@angular/router';
+import { MatLegacyButtonModule } from '@angular/material/legacy-button';
+import { FlexModule } from '@ngbracket/ngx-layout/flex';
+import { NgIf, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-workflow-actions',
templateUrl: './workflow-actions.component.html',
styleUrls: ['./entry-actions.component.scss'],
+ standalone: true,
+ imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, AsyncPipe],
})
export class WorkflowActionsComponent extends EntryActionsComponent implements OnInit, OnChanges {
@Input() workflow: BioWorkflow | Service | Notebook;
diff --git a/src/app/shared/entry-to-display-name.pipe.ts b/src/app/shared/entry-to-display-name.pipe.ts
index 6d6a59f69b..fe14cc407d 100644
--- a/src/app/shared/entry-to-display-name.pipe.ts
+++ b/src/app/shared/entry-to-display-name.pipe.ts
@@ -7,6 +7,7 @@ import { DockstoreTool, Workflow } from './openapi';
*/
@Pipe({
name: 'entryToDisplayName',
+ standalone: true,
})
export class EntryToDisplayNamePipe implements PipeTransform {
transform(entry: DockstoreTool | Workflow): string {
diff --git a/src/app/shared/entry-wizard.module.ts b/src/app/shared/entry-wizard.module.ts
deleted file mode 100644
index 949639abd7..0000000000
--- a/src/app/shared/entry-wizard.module.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { CommonModule } from '@angular/common';
-import { NgModule } from '@angular/core';
-import { FormsModule } from '@angular/forms';
-import { EntryWizardComponent } from './entry-wizard/entry-wizard.component';
-import { CustomMaterialModule } from './modules/material.module';
-
-@NgModule({
- imports: [CommonModule, CustomMaterialModule, FormsModule],
- declarations: [EntryWizardComponent],
- exports: [EntryWizardComponent],
-})
-export class EntryWizardModule {}
diff --git a/src/app/shared/entry-wizard/entry-wizard.component.ts b/src/app/shared/entry-wizard/entry-wizard.component.ts
index ac9e7a576d..d111fa5141 100644
--- a/src/app/shared/entry-wizard/entry-wizard.component.ts
+++ b/src/app/shared/entry-wizard/entry-wizard.component.ts
@@ -1,15 +1,35 @@
import { Component, OnInit } from '@angular/core';
-import { MatSlideToggleChange } from '@angular/material/slide-toggle';
+import { MatLegacySlideToggleChange as MatSlideToggleChange, MatLegacySlideToggleModule } from '@angular/material/legacy-slide-toggle';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Repository } from '../openapi/model/repository';
import { EntryWizardQuery } from '../state/entry-wizard.query';
import { EntryWizardService } from '../state/entry-wizard.service';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { MatLegacyOptionModule } from '@angular/material/legacy-core';
+import { FormsModule } from '@angular/forms';
+import { MatLegacySelectModule } from '@angular/material/legacy-select';
+import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field';
+import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar';
+import { NgIf, NgFor, AsyncPipe } from '@angular/common';
@Component({
selector: 'app-entry-wizard',
templateUrl: './entry-wizard.component.html',
styleUrls: ['./entry-wizard.component.scss'],
+ standalone: true,
+ imports: [
+ NgIf,
+ MatLegacyProgressBarModule,
+ MatLegacyFormFieldModule,
+ MatLegacySelectModule,
+ FormsModule,
+ NgFor,
+ MatLegacyOptionModule,
+ MatLegacySlideToggleModule,
+ MatLegacyTooltipModule,
+ AsyncPipe,
+ ],
})
export class EntryWizardComponent implements OnInit {
isLoading$: Observable;
diff --git a/src/app/shared/entry.ts b/src/app/shared/entry.ts
index e085d9a086..1d1d105454 100644
--- a/src/app/shared/entry.ts
+++ b/src/app/shared/entry.ts
@@ -17,11 +17,11 @@ import { Location } from '@angular/common';
import { HttpErrorResponse } from '@angular/common/http';
import { Directive, Injectable, Input, OnDestroy, ViewChild } from '@angular/core';
import { UntypedFormControl, Validators } from '@angular/forms';
-import { MatChipInputEvent } from '@angular/material/chips';
-import { MatTabChangeEvent, MatTabGroup } from '@angular/material/tabs';
+import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips';
+import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabGroup as MatTabGroup } from '@angular/material/legacy-tabs';
import { ActivatedRoute, NavigationEnd, Params, Router, RouterEvent } from '@angular/router';
import { Observable, Subject } from 'rxjs';
-import { filter, takeUntil } from 'rxjs/operators';
+import { filter, map, takeUntil } from 'rxjs/operators';
import { EntryCategoriesService } from '../categories/state/entry-categories.service';
import { Dockstore } from '../shared/dockstore.model';
import { Category, EntriesService, VersionVerifiedPlatform, SourceFile } from '../shared/openapi';
@@ -98,6 +98,7 @@ export abstract class Entry implements OnDestro
this.router.events
.pipe(
filter((event) => event instanceof NavigationEnd),
+ map((event) => event as NavigationEnd),
takeUntil(this.ngUnsubscribe)
)
.subscribe((event: RouterEvent) => {
@@ -412,11 +413,9 @@ export abstract class Entry implements OnDestro
* Will decode the URL
* @return {void}
*/
- decodeURL(type: string): void {
- const url = decodeURIComponent(window.location.href);
- const containersIndex = this.getIndexInURL('/' + type);
- const newPath = url.substring(containersIndex);
- this.location.replaceState(newPath);
+ decodeURL(): void {
+ const url = decodeURIComponent(window.location.pathname);
+ this.location.replaceState(url);
}
/**
@@ -442,11 +441,7 @@ export abstract class Entry implements OnDestro
redirectToCanonicalURL(myPage: string): void {
if (this.getIndexInURL(myPage) === -1) {
// Decode the URL
- this.decodeURL(this._toolType);
-
- // Get index of /containers or /workflows
- // TODO: Not sure why getPageIndex() returns anything, but does need to get called to change URL.
- this.getPageIndex();
+ this.decodeURL();
}
}
@@ -484,12 +479,6 @@ export abstract class Entry implements OnDestro
})();
}
- /**
- * Gets the index of /containers or /workflows from the URL
- * @return {number}
- */
- abstract getPageIndex(): number;
-
/**
* Go to the search page with a query preloaded
* @param {string} searchValue Value to search for
diff --git a/src/app/shared/entry/base-url.pipe.ts b/src/app/shared/entry/base-url.pipe.ts
index afcd2c392a..c0dcccd770 100644
--- a/src/app/shared/entry/base-url.pipe.ts
+++ b/src/app/shared/entry/base-url.pipe.ts
@@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'baseUrl',
+ standalone: true,
})
export class BaseUrlPipe implements PipeTransform {
/**
diff --git a/src/app/shared/entry/commit-url.pipe.ts b/src/app/shared/entry/commit-url.pipe.ts
index 1af461154b..3e4c56ff6d 100644
--- a/src/app/shared/entry/commit-url.pipe.ts
+++ b/src/app/shared/entry/commit-url.pipe.ts
@@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'commitUrl',
+ standalone: true,
})
export class CommitUrlPipe implements PipeTransform {
transform(commitId: string, providerUrl: string): string {
diff --git a/src/app/shared/entry/descriptor-language-versions.pipe.ts b/src/app/shared/entry/descriptor-language-versions.pipe.ts
index 43cb01bb8d..0678528bc6 100644
--- a/src/app/shared/entry/descriptor-language-versions.pipe.ts
+++ b/src/app/shared/entry/descriptor-language-versions.pipe.ts
@@ -2,18 +2,30 @@ import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'descriptorLanguageVersions',
+ standalone: true,
})
export class DescriptorLanguageVersionsPipe implements PipeTransform {
/**
- * Creates a string containing the descriptor language and descriptor language versions
+ * Creates a string containing the descriptor language or engine versions, and the descriptor language if specified by showDescriptorLanguage
* @param descriptorLanguage
- * @param descriptorLanguageVersions
+ * @param descriptorLanguageOrEngineVersions
+ * @param showDescriptorLanguage whether or not the descriptor language should be included in the resulting string
* @returns
*/
- transform(descriptorLanguage: string, descriptorLanguageVersions: Array): string {
- if (descriptorLanguageVersions && descriptorLanguageVersions.length > 0) {
- const languageVersions = [...descriptorLanguageVersions];
- return descriptorLanguage + ' ' + languageVersions.sort().join(', ');
+ transform(descriptorLanguage: string, descriptorLanguageOrEngineVersions: Array, showDescriptorLanguage: boolean = true): string {
+ if (descriptorLanguageOrEngineVersions && descriptorLanguageOrEngineVersions.length > 0) {
+ const versions = [...descriptorLanguageOrEngineVersions];
+ if (showDescriptorLanguage) {
+ return descriptorLanguage + ' ' + versions.sort().join(', ');
+ } else {
+ // Remove the descriptor language from the version if it exists. Ex: 'Nextflow !>=23.04.0' -> '!>=23.04.0'
+ return versions
+ .map((version) => {
+ return version.replace(descriptorLanguage + ' ', '');
+ })
+ .sort()
+ .join(', ');
+ }
}
return '';
}
diff --git a/src/app/shared/entry/descriptor-language-versions.spec.ts b/src/app/shared/entry/descriptor-language-versions.spec.ts
index 428596471c..1b52a39f92 100644
--- a/src/app/shared/entry/descriptor-language-versions.spec.ts
+++ b/src/app/shared/entry/descriptor-language-versions.spec.ts
@@ -7,5 +7,7 @@ describe('Pipe: DescriptorLanguageVersionsPipe', () => {
expect(pipe.transform('WDL', ['1.0, 1.1'])).toBe('WDL 1.0, 1.1');
expect(pipe.transform('CWL', ['v1.0'])).toBe('CWL v1.0');
expect(pipe.transform('WDL', [])).toBe('');
+ expect(pipe.transform('Nextflow', ['Nextflow >=0.32.0', 'Nextflow !>=23.04.0'], false)).toBe('!>=23.04.0, >=0.32.0');
+ expect(pipe.transform('Nextflow', ['Nextflow >=0.32.0'], false)).toBe('>=0.32.0');
});
});
diff --git a/src/app/shared/entry/descriptor-language.pipe.ts b/src/app/shared/entry/descriptor-language.pipe.ts
index be955ac018..ed3111fc2d 100644
--- a/src/app/shared/entry/descriptor-language.pipe.ts
+++ b/src/app/shared/entry/descriptor-language.pipe.ts
@@ -4,6 +4,7 @@ import { Workflow } from '../../shared/openapi';
@Pipe({
name: 'descriptorLanguage',
+ standalone: true,
})
export class DescriptorLanguagePipe implements PipeTransform {
/**
diff --git a/src/app/shared/entry/descriptor-language.service.spec.ts b/src/app/shared/entry/descriptor-language.service.spec.ts
index add123f201..d1e0410f12 100644
--- a/src/app/shared/entry/descriptor-language.service.spec.ts
+++ b/src/app/shared/entry/descriptor-language.service.spec.ts
@@ -28,23 +28,24 @@ describe('Service: DescriptorLanguage', () => {
it('should return the descriptor languages in an string array', () => {
const stubValue: Array = [{ value: 'cwl' }, { value: 'wdl' }, { value: 'nextflow' }];
metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(stubValue));
+ workflowQuerySpy.entryType$ = observableOf('workflow');
const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy);
descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => {
expect(languages).toEqual(['cwl', 'wdl', 'nextflow'], 'service returned stub value');
});
});
- it('should be able to filter service out', () => {
+ it('should be able to filter service and notebook out', () => {
const descriptorLanguageBeans: DescriptorLanguageBean[] = [];
descriptorLanguageBeans.push({ friendlyName: 'potato', value: 'potato' });
descriptorLanguageBeans.push({ friendlyName: 'beef', value: 'beef' });
descriptorLanguageBeans.push({ friendlyName: 'stew', value: 'stew' });
descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for services', value: 'service' });
+ descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for notebooks', value: 'jupyter' });
metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans));
+ workflowQuerySpy.entryType$ = observableOf('workflow');
const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy);
- const filteredDescriptorLanguageBeans = descriptorLanguageService.filterService(descriptorLanguageBeans);
- expect(filteredDescriptorLanguageBeans.length).toEqual(3);
- filteredDescriptorLanguageBeans.forEach((descriptorLanguageBean) => {
- expect(descriptorLanguageBean.value).not.toEqual(descriptorLanguageService.knownServiceValue);
+ descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => {
+ expect(languages).toEqual(['potato', 'beef', 'stew'], 'service returned stub value');
});
});
it('should be able to get home page inner HTML', () => {
@@ -105,13 +106,13 @@ describe('Service: DescriptorLanguage', () => {
metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans));
const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy);
let placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SMK);
- expect(placeholder).toEqual('^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$');
+ expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$');
placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.CWL);
- expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)');
+ expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$');
placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.WDL);
- expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$');
+ expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$');
placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.NFL);
- expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)');
+ expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$');
placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SERVICE);
expect(placeholder).toEqual('.*');
placeholder = descriptorLanguageService.getDescriptorPattern('UnrecognizedType');
diff --git a/src/app/shared/entry/descriptor-language.service.ts b/src/app/shared/entry/descriptor-language.service.ts
index 9be4302da9..88020e0e19 100644
--- a/src/app/shared/entry/descriptor-language.service.ts
+++ b/src/app/shared/entry/descriptor-language.service.ts
@@ -34,8 +34,6 @@ export class DescriptorLanguageService {
readonly knownServiceValue = 'service';
public descriptorLanguages$: Observable>;
- public descriptorLanguagesInnerHTML$: Observable;
- public noService$: Observable;
private descriptorLanguagesBean$ = new BehaviorSubject([]);
public filteredDescriptorLanguages$: Observable>;
constructor(private metadataService: MetadataService, private sessionQuery: SessionQuery) {
@@ -47,10 +45,6 @@ export class DescriptorLanguageService {
}
})
);
- this.noService$ = this.descriptorLanguagesBean$.pipe(map((beans) => this.filterService(beans)));
- this.descriptorLanguagesInnerHTML$ = this.noService$.pipe(
- map((descriptorLanguageBeans: DescriptorLanguageBean[]) => this.getDescriptorLanguagesInnerHTML(descriptorLanguageBeans))
- );
const combined$ = combineLatest([this.descriptorLanguages$, this.sessionQuery.entryType$]);
this.filteredDescriptorLanguages$ = combined$.pipe(map((combined) => this.filterLanguages(combined[0], combined[1])));
}
@@ -233,17 +227,6 @@ export class DescriptorLanguageService {
}
}
- /**
- * Certain pages ignore the 'service' descriptor language completely, this filters it out of the known languages
- *
- * @param {DescriptorLanguageBean[]} beans Descriptor language bean returned from the metadata endpoint
- * @returns {DescriptorLanguageBean[]} Filtered list of languages that do not have 'service' in it
- * @memberof DescriptorLanguageService
- */
- filterService(beans: DescriptorLanguageBean[]): DescriptorLanguageBean[] {
- return beans.filter((bean) => bean.value !== this.knownServiceValue);
- }
-
/**
* Some entries are not meant to show all descriptor types
*
@@ -254,7 +237,11 @@ export class DescriptorLanguageService {
*/
filterLanguages(descriptorTypes: Workflow.DescriptorTypeEnum[], entryType: EntryType): Workflow.DescriptorTypeEnum[] {
if (entryType === EntryType.BioWorkflow || entryType === EntryType.Tool || !entryType) {
- return descriptorTypes.filter((descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service);
+ return descriptorTypes.filter(
+ (descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service && descriptorType !== Workflow.DescriptorTypeEnum.Jupyter
+ );
+ } else if (entryType === EntryType.Notebook) {
+ return [Workflow.DescriptorTypeEnum.Jupyter];
} else {
return [Workflow.DescriptorTypeEnum.Service];
}
diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.html b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html
new file mode 100644
index 0000000000..111b7ac279
--- /dev/null
+++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html
@@ -0,0 +1,32 @@
+
+
+
+ account_circle
+
+
+
+
diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts
new file mode 100644
index 0000000000..1d0b87aa47
--- /dev/null
+++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts
@@ -0,0 +1,27 @@
+import { NgIf } from '@angular/common';
+import { Component, Input } from '@angular/core';
+import { MatIconModule } from '@angular/material/icon';
+import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip';
+import { Dockstore } from 'app/shared/dockstore.model';
+import { Doi } from 'app/shared/openapi';
+
+@Component({
+ selector: 'app-doi-badge',
+ templateUrl: './doi-badge.component.html',
+ styleUrls: [],
+ standalone: true,
+ imports: [MatLegacyTooltipModule, NgIf, MatIconModule],
+})
+export class DoiBadgeComponent {
+ Dockstore = Dockstore;
+ DoiInitiator = Doi.InitiatorEnum;
+ DoiType = Doi.TypeEnum;
+ zenodoUrl: string;
+ @Input() doi: Doi;
+ @Input() displayInitiator: boolean = true;
+ @Input() displayDoi: boolean = true;
+
+ constructor() {
+ this.zenodoUrl = Dockstore.ZENODO_AUTH_URL ? Dockstore.ZENODO_AUTH_URL.replace('oauth/authorize', '') : '';
+ }
+}
diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html
new file mode 100644
index 0000000000..13c8b6fcd9
--- /dev/null
+++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html
@@ -0,0 +1,47 @@
+
Manage DOIs
+
+
+ A Digital Object Identifier (DOI) allows a {{ entryTypeMetadata.term }} version to be easily cited in publications. There are two types
+ of DOIs:
+
+
+
Version DOI: represents a specific version.
+
Concept DOI: represents all versions and resolves to the latest one.
+
+
+ info This {{ entryTypeMetadata.term }} has no DOIs.
+
+
Select which DOI to display publicly:
+
+
+
+
+
+ {{ doiInfo.key | titlecase }}
+
+
+
+
+ Manually created by a user in the Dockstore UI.
+
+ Automatically created by Dockstore for valid tags belonging to published {{ entryTypeMetadata.termPlural }}.
+
+ Created by Zenodo's integration with GitHub.
+
warning This version is snapshotted but contains HTTP imports. HTTP imports may
@@ -498,19 +392,6 @@
Engine Versions:
{{ selectedVersion.versionMetadata.engineVersions }}