clearml-web/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.ts

178 lines
6.3 KiB
TypeScript
Raw Normal View History

import {Component, EventEmitter, Input, OnDestroy, Output, ViewChild} from '@angular/core';
import {getSystemTags, isDevelopment} from '~/features/experiments/shared/experiments.utils';
2020-06-04 15:07:14 +00:00
import {Observable} from 'rxjs';
import {Store} from '@ngrx/store';
import {selectCompanyTags, selectTagsFilterByProject} from '@common/core/reducers/projects.reducer';
2020-06-04 15:07:14 +00:00
import {addTag, removeTag} from '../../actions/common-experiments-menu.actions';
import {TagsMenuComponent} from '@common/shared/ui-components/tags/tags-menu/tags-menu.component';
import {activateEdit, deactivateEdit, setExperiment} from '../../actions/common-experiments-info.actions';
import {EXPERIMENTS_STATUS_LABELS, ExperimentTagsEnum} from '~/features/experiments/shared/experiments.const';
2021-05-11 13:45:36 +00:00
import {EXPERIMENT_COMMENT} from '../experiment-general-info/experiment-general-info.component';
import {ActivatedRoute, Router} from '@angular/router';
import {
2021-07-26 09:56:51 +00:00
MenuItems,
selectionDisabledAbort,
selectionDisabledAbortAllChildren,
selectionDisabledArchive,
selectionDisabledDelete,
selectionDisabledDequeue,
selectionDisabledEnqueue,
2021-05-11 13:45:36 +00:00
selectionDisabledMoveTo,
selectionDisabledPublishExperiments,
selectionDisabledQueue,
selectionDisabledReset,
selectionDisabledViewWorker
} from '@common/shared/entity-page/items.utils';
2022-07-10 11:10:46 +00:00
import {addMessage} from '@common/core/actions/layout.actions';
import {MatMenuTrigger} from '@angular/material/menu';
import { selectExperimentsTags } from '@common/experiments/reducers';
2024-04-25 19:03:04 +00:00
import { UploadArtifactDialogComponent } from '@common/shared/ui-components/overlay/upload-artifact-dialog/upload-artifact-dialog.component';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
2020-06-04 15:07:14 +00:00
@Component({
2021-01-18 14:30:25 +00:00
selector: 'sm-experiment-info-header',
2020-06-04 15:07:14 +00:00
templateUrl: './experiment-info-header.component.html',
2021-01-18 14:30:25 +00:00
styleUrls: ['./experiment-info-header.component.scss']
2020-06-04 15:07:14 +00:00
})
export class ExperimentInfoHeaderComponent implements OnDestroy {
2020-06-04 15:07:14 +00:00
public viewId: boolean;
2021-01-18 14:30:25 +00:00
public tagsFilterByProject$: Observable<boolean>;
public projectTags$: Observable<string[]>;
public companyTags$: Observable<string[]>;
2020-06-04 15:07:14 +00:00
public isDev = false;
public systemTags = [] as string[];
2021-01-18 14:30:25 +00:00
public shared: boolean;
public isPipeline: boolean;
public selectedDisableAvailable = {};
2024-04-25 19:03:04 +00:00
private upUrl: string;
2020-06-04 15:07:14 +00:00
@Input() editable: boolean = true;
@Input() infoData;
2021-01-18 14:30:25 +00:00
@Input() backdropActive = false;
2020-06-04 15:07:14 +00:00
@Input() showMenu: boolean;
2022-06-07 14:48:29 +00:00
@Input() minimized: boolean;
2021-01-18 14:30:25 +00:00
@Input() isSharedAndNotOwner: boolean;
2020-06-04 15:07:14 +00:00
@Output() experimentNameChanged = new EventEmitter<string>();
@Output() minimizeClicked = new EventEmitter();
@Output() closeInfoClicked = new EventEmitter();
@Output() maximizedClicked = new EventEmitter();
@ViewChild('tagsMenuTrigger') tagMenuTrigger: MatMenuTrigger;
@ViewChild(TagsMenuComponent) tagMenu: TagsMenuComponent;
2020-06-04 15:07:14 +00:00
2024-04-25 19:03:04 +00:00
constructor(private store: Store, private router: Router, private activatedRoute: ActivatedRoute, private dialog: MatDialog) {
2021-01-18 14:30:25 +00:00
this.tagsFilterByProject$ = this.store.select(selectTagsFilterByProject);
this.projectTags$ = this.store.select(selectExperimentsTags);
2021-01-18 14:30:25 +00:00
this.companyTags$ = this.store.select(selectCompanyTags);
2020-06-04 15:07:14 +00:00
}
ngOnDestroy(): void {
this.tagMenuTrigger = null;
this.tagMenu = null;
this.store.dispatch(setExperiment(null));
}
2021-05-11 13:45:36 +00:00
private _experiment: any;
2020-06-04 15:07:14 +00:00
get experiment() {
return this._experiment;
}
2021-05-11 13:45:36 +00:00
@Input() set experiment(experiment) {
if (experiment?.id !== this._experiment?.id) {
this.viewId = false;
}
2020-06-04 15:07:14 +00:00
this._experiment = experiment;
this.isDev = isDevelopment(experiment);
this.systemTags = getSystemTags(experiment);
this.isPipeline = !!experiment?.system_tags?.includes(ExperimentTagsEnum.Pipeline);
this.shared = experiment?.system_tags?.includes(ExperimentTagsEnum.Shared);
2021-05-11 13:45:36 +00:00
this.selectedDisableAvailable = {
2021-07-26 09:56:51 +00:00
[MenuItems.abort]: selectionDisabledAbort([experiment]),
[MenuItems.abortAllChildren]: selectionDisabledAbortAllChildren([experiment]),
2021-07-26 09:56:51 +00:00
[MenuItems.publish]: selectionDisabledPublishExperiments([experiment]),
[MenuItems.reset]: selectionDisabledReset([experiment]),
[MenuItems.delete]: selectionDisabledDelete([experiment]),
[MenuItems.moveTo]: selectionDisabledMoveTo([experiment]),
[MenuItems.enqueue]: selectionDisabledEnqueue([experiment]),
[MenuItems.dequeue]: selectionDisabledDequeue([experiment]),
[MenuItems.queue]: selectionDisabledQueue([experiment]),
[MenuItems.viewWorker]: selectionDisabledViewWorker([experiment]),
[MenuItems.archive]: selectionDisabledArchive([experiment])
2021-05-11 13:45:36 +00:00
};
2020-06-04 15:07:14 +00:00
}
2020-09-10 13:45:48 +00:00
2020-06-04 15:07:14 +00:00
onNameChanged(name) {
this.experimentNameChanged.emit(name);
}
openTagMenu() {
if (!this.tagMenuTrigger) {
2020-09-10 13:45:48 +00:00
return;
}
2022-11-01 10:40:14 +00:00
window.setTimeout(() => this.store.dispatch(activateEdit('tags')), 200);
2020-06-04 15:07:14 +00:00
window.setTimeout(() => {
this.tagMenuTrigger.openMenu();
this.tagMenu.focus();
2020-06-04 15:07:14 +00:00
});
}
addTag(tag: string) {
this.store.dispatch(addTag({tag, experiments: [this.experiment]}));
}
removeTag(tag: string) {
this.store.dispatch(removeTag({tag, experiments: [this.experiment]}));
}
tagsMenuClosed() {
2022-11-01 10:40:14 +00:00
this.store.dispatch(deactivateEdit());
this.tagMenu.clear();
2020-06-04 15:07:14 +00:00
}
2020-09-10 13:45:48 +00:00
editExperimentName(edit) {
if (edit) {
2022-11-01 10:40:14 +00:00
this.store.dispatch(activateEdit('ExperimentName'));
2020-09-10 13:45:48 +00:00
} else {
2022-11-01 10:40:14 +00:00
this.store.dispatch(deactivateEdit());
2020-09-10 13:45:48 +00:00
}
}
showID() {
this.viewId = true;
}
2021-01-18 14:30:25 +00:00
getStatusLabel() {
return EXPERIMENTS_STATUS_LABELS[this.experiment?.status] || '';
}
2021-05-11 13:45:36 +00:00
editDescriptionHandler() {
2021-05-11 13:45:36 +00:00
this.router.navigate(['general'], {relativeTo: this.activatedRoute});
window.setTimeout(() => this.store.dispatch(activateEdit(EXPERIMENT_COMMENT)), 50);
2021-05-11 13:45:36 +00:00
}
2022-06-07 14:48:29 +00:00
copyToClipboard() {
this.store.dispatch(addMessage('success', 'Copied to clipboard'));
}
2024-04-25 19:03:04 +00:00
enableUploadButton() {
return this.getStatusLabel() === 'Draft';
}
public openUploadDialog() {
if(this.enableUploadButton()) {
const uploadDialogRef: MatDialogRef<any> = this.dialog.open(UploadArtifactDialogComponent, {
data: {
uploadUrl: this.upUrl,
task: this.experiment.id,
title: 'Upload Artifacts',
iconClass: 'al-icon al-ico-upload al-color blue-300',
}
});
} else {
this.store.dispatch(addMessage('info', 'Upload only available in \'Draft\' state.'));
}
}
2020-06-04 15:07:14 +00:00
}