Skip to content

Commit

Permalink
Merge pull request #819 from DSD-DBS/fix-readonly-branch-selection
Browse files Browse the repository at this point in the history
Fix: Use correct revisions for readonly selection
  • Loading branch information
MoritzWeber0 authored Jul 3, 2023
2 parents 905ade9 + 8e7a8da commit 108a6ad
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 58 deletions.
52 changes: 39 additions & 13 deletions frontend/src/app/services/git/git.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
AbstractControl,
AsyncValidatorFn,
ValidationErrors,
ValidatorFn,
} from '@angular/forms';
import { BehaviorSubject, map, Observable, take } from 'rxjs';
import { environment } from 'src/environments/environment';
Expand Down Expand Up @@ -50,22 +51,34 @@ export class GitService {
});
}

getPrivateRevision(
gitUrl: string,
projectSlug: string,
modelSlug: string,
gitModelId: number
): Observable<Revisions> {
return this.http.post<Revisions>(
this.BACKEND_URL_PREFIX +
`/projects/${projectSlug}/models/${modelSlug}/modelsources/git/${gitModelId}/revisions`,
gitUrl
);
}

loadPrivateRevisions(
gitUrl: string,
project_slug: string,
model_slug: string,
git_model_id: number
projectSlug: string,
modelSlug: string,
gitModelId: number
): void {
this.http
.post<Revisions>(
this.BACKEND_URL_PREFIX +
`/projects/${project_slug}/models/${model_slug}/modelsources/git/${git_model_id}/revisions`,
gitUrl
)
.subscribe({
next: (revisions) => this._revisions.next(revisions),
error: () => this._revisions.next(undefined),
});
this.getPrivateRevision(
gitUrl,
projectSlug,
modelSlug,
gitModelId
).subscribe({
next: (revisions) => this._revisions.next(revisions),
error: () => this._revisions.next(undefined),
});
}

clearRevision(): void {
Expand All @@ -87,3 +100,16 @@ export class GitService {
};
}
}

export function existingRevisionValidator(revisions: Revisions): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const revision = control.value;

const isInBranches = revisions.branches.includes(revision);
const isInTags = revisions.tags.includes(revision);

return !(isInBranches || isInTags)
? { revisionNotFoundError: `${revision} does not exist` }
: null;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

<div [formGroup]="form">
<h2>
<mat-checkbox formControlName="include">{{ model.name }}</mat-checkbox>
<mat-checkbox formControlName="include">{{
modelOptions.model.name
}}</mat-checkbox>
</h2>
<fieldset *ngIf="form.controls.include.value">
<mat-form-field appearance="fill">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

import { Component, Input, OnInit } from '@angular/core';
import { Validators, FormBuilder } from '@angular/forms';
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
import { filter } from 'rxjs';
import {
getPrimaryGitModel,
Model,
} from 'src/app/projects/models/service/model.service';
import { Model } from 'src/app/projects/models/service/model.service';
import { GetGitModel } from 'src/app/projects/project-detail/model-overview/model-detail/git-model.service';
import { Revisions, GitService } from 'src/app/services/git/git.service';
import {
Revisions,
GitService,
existingRevisionValidator,
} from 'src/app/services/git/git.service';

export type ModelOptions = {
model: Model;
Expand All @@ -22,7 +22,6 @@ export type ModelOptions = {
deepClone: boolean;
};

@UntilDestroy()
@Component({
selector: 'create-readonly-model-options',
templateUrl: './create-readonly-model-options.component.html',
Expand All @@ -34,28 +33,16 @@ export class CreateReadonlyModelOptionsComponent implements OnInit {

constructor(private gitService: GitService, private fb: FormBuilder) {}

private revision?: Revisions;
private revisions?: Revisions;
public filteredRevisions?: Revisions;

public form = this.fb.group({
include: this.fb.control(true),
revision: this.fb.control('', {
validators: Validators.required,
asyncValidators: this.gitService.asyncExistingRevisionValidator(),
}),
deepClone: this.fb.control(false),
include: [true],
revision: this.fb.control('', Validators.required),
deepClone: [false],
});

get model(): Model {
return this.modelOptions!.model;
}

ngOnInit(): void {
const primaryGitModel = getPrimaryGitModel(this.model);
if (!primaryGitModel) {
return;
}

this.form.controls.deepClone.setValue(this.modelOptions.deepClone);
this.form.controls.include.setValue(this.modelOptions.include);

Expand All @@ -67,39 +54,37 @@ export class CreateReadonlyModelOptionsComponent implements OnInit {
this.modelOptions.include = value || false;
});

this.gitService.revisions
.pipe(untilDestroyed(this), filter(Boolean))
.subscribe({
next: (revisions) => {
this.revision = revisions;
this.filteredRevisions = revisions;
this.gitService
.getPrivateRevision(
this.modelOptions.primaryGitModel.path,
this.projectSlug,
this.modelOptions.model.slug,
this.modelOptions.primaryGitModel.id
)
.pipe(filter(Boolean))
.subscribe((revisions) => {
this.revisions = revisions;
this.filteredRevisions = revisions;

this.form.controls.revision.enable();
this.form.controls.revision.setValue(primaryGitModel?.revision || '');
this.form.controls.revision.updateValueAndValidity();
},
complete: () => this.gitService.clearRevision(),
});
const revisionControl = this.form.controls.revision;

this.gitService.loadPrivateRevisions(
primaryGitModel.path,
this.projectSlug,
this.model.slug,
primaryGitModel.id
);
revisionControl.addValidators(existingRevisionValidator(revisions));
revisionControl.setValue(this.modelOptions.primaryGitModel.revision);
revisionControl.updateValueAndValidity();
});
}

filterRevisionsByPrefix(prefix: string): void {
if (!this.revision) {
if (!this.revisions) {
this.filteredRevisions = undefined;
return;
}

this.filteredRevisions = {
branches: this.revision!.branches.filter((branch) =>
branches: this.revisions!.branches.filter((branch) =>
branch.toLowerCase().startsWith(prefix.toLowerCase())
),
tags: this.revision!.tags.filter((tag) =>
tags: this.revisions!.tags.filter((tag) =>
tag.toLowerCase().startsWith(prefix.toLowerCase())
),
};
Expand Down

0 comments on commit 108a6ad

Please sign in to comment.