diff --git a/src/composer/src/app/app.module.ts b/src/composer/src/app/app.module.ts index d05a0eb..0083051 100644 --- a/src/composer/src/app/app.module.ts +++ b/src/composer/src/app/app.module.ts @@ -25,6 +25,7 @@ import { MatTooltipModule } from '@angular/material/tooltip' import { MatCheckboxModule } from '@angular/material/checkbox' import { MatMenuModule } from '@angular/material/menu' import { MatStepperModule } from '@angular/material/stepper' +import { MatAutocompleteModule } from '@angular/material/autocomplete' import { RepoSearchComponent, DialogDetails, DialogAddCustom } from './core/components/repo-search/repo-search.component' import { HeaderComponent } from './core/components/header/header.component' @@ -66,6 +67,7 @@ import { GlobalDialogComponent } from './core/components/dialogs/global-dialog/g import { CodemirrorModule } from '@ctrl/ngx-codemirror'; import { RecipeComponent, DialogPublishRecipe, DialogRecipeDetails } from './core/components/recipe/recipe.component'; +import { BuildDialogComponent } from './core/components/dialogs/build-dialog/build-dialog.component'; export function getHighlightLanguages() { return { @@ -102,7 +104,8 @@ export function getHighlightLanguages() { GlobalDialogComponent, RecipeComponent, DialogPublishRecipe, - DialogRecipeDetails + DialogRecipeDetails, + BuildDialogComponent ], imports: [ BrowserModule, @@ -124,6 +127,7 @@ export function getHighlightLanguages() { MatCheckboxModule, MatMenuModule, MatStepperModule, + MatAutocompleteModule, DragDropModule, HighlightModule, FlexLayoutModule, diff --git a/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.html b/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.html index 4b975b1..58a3f8f 100644 --- a/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.html +++ b/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.html @@ -28,6 +28,9 @@ + diff --git a/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.ts b/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.ts index 445e7a8..36b7e5d 100644 --- a/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.ts +++ b/src/composer/src/app/core/components/canvas/jsplumb/node/node.component.ts @@ -6,6 +6,7 @@ import { RestService } from 'src/app/core/services/rest.service' import { MatDialog } from '@angular/material/dialog' import { ManageProjectDialogComponent } from '../../../dialogs/manage-project-dialog/manage-project-dialog.component' import { ConfirmDialogComponent } from '../../../dialogs/confirm-dialog/confirm-dialog.component' +import { BuildDialogComponent } from '../../../dialogs/build-dialog/build-dialog.component' import * as ProjectActions from './../../../../store/project.actions' import { NodeService } from '../node.service' import { EventEmitterService } from 'src/app/core/services/event-emitter.service' @@ -126,6 +127,14 @@ export class NodeComponent implements AfterViewInit, OnDestroy { }) } + buildDialogOpen() { + this.dialog.open(BuildDialogComponent, { + width: '50%', + minWidth: '740px', + data: this.currentService, + }) + } + ngOnDestroy() { this.unSubscribe$.next(true) this.unSubscribe$.complete() diff --git a/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.html b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.html new file mode 100644 index 0000000..df35c9a --- /dev/null +++ b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.html @@ -0,0 +1,62 @@ +

Build Config

+ + + +
+ + Build + + + + + Context + + + + + Dockerfile + + + + + Network + + + + + SHM size + + + + + Target + + +
+
+ +

Arguments

+ +
+ + +

Cache from

+ +
+ + +

Labels

+ +
+
+
+ + + + + + diff --git a/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.scss b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.spec.ts b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.spec.ts new file mode 100644 index 0000000..689e821 --- /dev/null +++ b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BuildDialogComponent } from './build-dialog.component'; + +describe('BuildDialogComponent', () => { + let component: BuildDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BuildDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BuildDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.ts b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.ts new file mode 100644 index 0000000..9c45b5c --- /dev/null +++ b/src/composer/src/app/core/components/dialogs/build-dialog/build-dialog.component.ts @@ -0,0 +1,64 @@ +import { Component, OnInit, ViewChild, Inject } from '@angular/core' +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' +import { FormControl, Validators, FormGroup, FormBuilder, AbstractControl } from '@angular/forms' +import { KeyValueComponent } from '../../common/key-value/key-value/key-value.component' +import { Service, Project, Volume, ServicePort, Network } from '../../../store/models' +import { CheckCircleComponent } from '../../widgets/check-circle/check-circle.component' +import { Store } from '@ngrx/store' +import * as ProjectActions from './../../../store/project.actions' +import { EventEmitterService } from 'src/app/core/services/event-emitter.service' + +@Component({ + selector: 'app-build-dialog', + templateUrl: './build-dialog.component.html', + styleUrls: ['./build-dialog.component.scss'] +}) +export class BuildDialogComponent implements OnInit { + @ViewChild(CheckCircleComponent) checkCircle: CheckCircleComponent + @ViewChild('args') args: KeyValueComponent + @ViewChild('cache_from') cache_from: KeyValueComponent + @ViewChild('labels') labels: KeyValueComponent + + formGeneral: FormGroup + currentArgs: [] = [] + currentCacheFrom: [] = [] + currentLabels: [] = [] + constructor(public dialogRef: MatDialogRef, private formBuilder: FormBuilder, @Inject(MAT_DIALOG_DATA) public data: Service, private store: Store, private eventEmitterService: EventEmitterService,) { } + + ngOnInit(): void { + this.formGeneral = this.formBuilder.group({ + build: new FormControl(''), + context: new FormControl(''), + dockerfile: new FormControl(''), + network: new FormControl(''), + shm_size: new FormControl(''), + target: new FormControl(''), + }) + + if (this.data.build) { + this.data.build.labels.forEach(val => this.currentLabels.push(val)) + this.data.build.cache_from.forEach(val => this.currentCacheFrom.push(val)) + this.data.build.args.forEach(val => this.currentArgs.push(val)) + + let fields = Object.keys(this.data.build).reduce((acc, key) => { + if(this.data.build[key]) acc[key] = this.data.build[key] + return acc + }, {}) + + this.formGeneral.patchValue(fields) + } + } + + onSave() { + const fields = { + ...this.formGeneral.getRawValue(), + args: this.args.getKeyValuePaies(), + cache_from: this.cache_from.getKeyValuePaies(), + labels: this.labels.getKeyValuePaies() + } + this.store.dispatch(ProjectActions.UpdateService({data: {...this.data, build: fields}})) + this.checkCircle.showCircle() + this.eventEmitterService.broadcast('save:project', {}) + } + +} diff --git a/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.html b/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.html index 04fe385..8746030 100644 --- a/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.html +++ b/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.html @@ -10,15 +10,12 @@ Tag - - - {{ tag }} - - - - - - + + + + {{ tag }} + + diff --git a/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.ts b/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.ts index 1ead06e..3fdefc8 100644 --- a/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.ts +++ b/src/composer/src/app/core/components/dialogs/manage-project-dialog/manage-project-dialog.component.ts @@ -65,7 +65,7 @@ export class ManageProjectDialogComponent implements OnInit, OnDestroy { ) { this.serviceName = this.data.name this.formGeneral = this.formBuilder.group({ - image: new FormControl({ value: this.data.image, disabled: true }, Validators.required), + image: new FormControl( this.data.image, Validators.required), name: new FormControl('', [Validators.required, this.serviceNameAlreadyExistsValidator]), tag: new FormControl('', [Validators.required]), restart: new FormControl('', [Validators.required]), @@ -78,6 +78,11 @@ export class ManageProjectDialogComponent implements OnInit, OnDestroy { networks: new FormControl(), }) + this.formGeneral.get('image').valueChanges.pipe(takeUntil(this.unSubscribe$)).subscribe((value)=> { + if (!value) this.formGeneral.get('tag').disable() + else if (value && this.formGeneral.get('tag').disabled) this.formGeneral.get('tag').enable() + }) + this.project = this.store.select('project') const sub = this.project.pipe(takeUntil(this.unSubscribe$)).subscribe((v) => { @@ -152,15 +157,11 @@ export class ManageProjectDialogComponent implements OnInit, OnDestroy { getTags(): void { this.isLoading = true this.rest - .getRepoTags(this.formGeneral.get('image').value, this.nextTagPage) + .getRepoTags(this.formGeneral.get('image').value, this.nextTagPage, this.formGeneral.get('tag').value) .pipe(takeUntil(this.unSubscribe$)) - .subscribe(({ results, next }) => { - next ? this.nextTagPage++ : (this.nextTagPage = null) + .subscribe(({ results }) => { - results.forEach(({ name }) => { - const index = this.tags.findIndex((prevName) => name === prevName) - index === -1 ? this.tags.push(name) : '' - }) + this.tags = results.map(({name}) => name) this.isLoading = false }) diff --git a/src/composer/src/app/core/components/repo-search/dialog-add-custom.html b/src/composer/src/app/core/components/repo-search/dialog-add-custom.html index 6b06bf3..aeb83df 100644 --- a/src/composer/src/app/core/components/repo-search/dialog-add-custom.html +++ b/src/composer/src/app/core/components/repo-search/dialog-add-custom.html @@ -9,8 +9,13 @@ Tag + + + Service name + +
- +
diff --git a/src/composer/src/app/core/components/repo-search/repo-search.component.ts b/src/composer/src/app/core/components/repo-search/repo-search.component.ts index 9a90dec..92fe07f 100644 --- a/src/composer/src/app/core/components/repo-search/repo-search.component.ts +++ b/src/composer/src/app/core/components/repo-search/repo-search.component.ts @@ -94,7 +94,7 @@ export class RepoSearchComponent implements OnInit, OnDestroy { shm_size: null, stdin_open: null, tty: null, - name: `${data['name']}_${postfix}`, + name: data['serviceName'] ? `${data['serviceName']}_${postfix}` : `${data['name']}_${postfix}`, container_name: null, deploy: null, image: imageName, @@ -250,9 +250,10 @@ export class DialogAddCustom { @Output() onAddProject = new EventEmitter() imageName: string tag: string + serviceName: string constructor(public dialogRef: MatDialogRef) {} addProject() { - this.onAddProject.emit({name: this.imageName, tag: this.tag}) + this.onAddProject.emit({name: this.imageName, tag: this.tag, serviceName: this.serviceName}) } } diff --git a/src/composer/src/app/core/services/rest.service.ts b/src/composer/src/app/core/services/rest.service.ts index fba4994..c6d1c28 100644 --- a/src/composer/src/app/core/services/rest.service.ts +++ b/src/composer/src/app/core/services/rest.service.ts @@ -38,8 +38,8 @@ export class RestService { return this.http.get(`${baseDetailUrl}/?r=${repoName}`, httpOptions).pipe(map(this.extractData)) } - getRepoTags(repoName: string, pageNumber: number): Observable { - return this.http.get(`${baseTagsUrl}/?r=${repoName}&page=${pageNumber}`, httpOptions).pipe(map(this.extractData)) + getRepoTags(repoName: string, pageNumber: number, searchSubStr: string): Observable { + return this.http.get(`${baseTagsUrl}/?r=${repoName}&s=${searchSubStr}&page=${pageNumber}`, httpOptions).pipe(map(this.extractData)) } generateCode(data: object): Observable {