From b524c9e97c1ed0a4e7a9eec600364c7b51881733 Mon Sep 17 00:00:00 2001 From: Dmitriy Borzenko Date: Wed, 19 Jul 2023 10:57:07 +0300 Subject: [PATCH] Add prepare step functionality. --- .../add-polling-source-form.types.ts | 6 + .../add-polling-source.component.html | 6 +- .../add-polling-source.component.ts | 8 +- .../process-form.service.ts | 25 +++- .../prepare-step/prepare-step.component.html | 103 +++++++++++++++- .../prepare-step/prepare-step.component.sass | 8 ++ .../prepare-step/prepare-step.component.ts | 112 +++++++++++++++++- .../input-field/input-field.component.sass | 2 + 8 files changed, 258 insertions(+), 12 deletions(-) diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source-form.types.ts b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source-form.types.ts index 2b6e52726..5663a2422 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source-form.types.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source-form.types.ts @@ -119,6 +119,12 @@ export interface EditFormType { kind: PreprocessKind.SQL; query?: string; }; + prepare?: { + kind: string; + command?: string[] | string; + format?: string; + subPath?: string; + }[]; } export interface EditFormParseType { diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.html b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.html index 07fcc03af..f4e5a0947 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.html +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.html @@ -19,7 +19,10 @@ > - + + diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.ts b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.ts index 4a0490ef0..4f255b893 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/add-polling-source.component.ts @@ -4,8 +4,6 @@ import { FetchKind, ReadKind, MergeKind, - PrepareKind, - PreprocessKind, PreprocessStepValue, } from "./add-polling-source-form.types"; import { FinalYamlModalComponent } from "../final-yaml-modal/final-yaml-modal.component"; @@ -48,7 +46,6 @@ import { SupportedEvents } from "src/app/dataset-block/metadata-block/components export class AddPollingSourceComponent extends BaseComponent implements OnInit { public currentStep: SetPollingSourceSection = SetPollingSourceSection.FETCH; public steps: typeof SetPollingSourceSection = SetPollingSourceSection; - public showPreprocessStep = false; public errorMessage = ""; public history: DatasetHistoryUpdate; @@ -58,10 +55,6 @@ export class AddPollingSourceComponent extends BaseComponent implements OnInit { engine: "", queries: [], }; - - // -------------------------------- - private readonly DEFAULT_PREPARE_KIND = PrepareKind.PIPE; - private readonly DEFAULT_PREPROCESS_KIND = PreprocessKind.SQL; // --------------------------------- public readonly FETCH_STEP_RADIO_DATA = FETCH_STEP_RADIO_CONTROLS; public readonly FETCH_FORM_DATA = FETCH_FORM_DATA; @@ -79,6 +72,7 @@ export class AddPollingSourceComponent extends BaseComponent implements OnInit { fetch: this.fb.group({ kind: [this.FETCH_DEFAULT_KIND], }), + prepare: this.fb.array([]), read: this.fb.group({ kind: [this.READ_DEFAULT_KIND], }), diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/process-form.service.ts b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/process-form.service.ts index 5159d52ad..3a8398785 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/process-form.service.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/process-form.service.ts @@ -8,7 +8,7 @@ import { } from "./process-form.service.types"; import { SetPollingSource } from "src/app/api/kamu.graphql.interface"; import { SetPollingSourceSection } from "src/app/shared/shared.types"; -import { FetchKind } from "./add-polling-source-form.types"; +import { EditFormType, FetchKind } from "./add-polling-source-form.types"; @Injectable({ providedIn: "root", @@ -19,6 +19,8 @@ export class ProcessFormService { this.processFetchOrderControl(formGroup); this.removeEmptyControls(formGroup); this.processEventTimeControl(formGroup); + this.processEmptyPrepareStep(formGroup); + this.processPipeCommandControl(formGroup); } private transformSchema(formGroup: FormGroup): void { @@ -37,6 +39,27 @@ export class ProcessFormService { } } + private processPipeCommandControl(formGroup: FormGroup): void { + const form = formGroup.value as EditFormType; + if (form.prepare && form.prepare.length > 0) { + form.prepare.map((item) => { + if (item.kind === "pipe" && typeof item.command === "string") { + item.command = item.command.trim().split(" "); + } + if (item.kind === "decompress" && !item.subPath) { + delete item.subPath; + } + }); + } + } + + private processEmptyPrepareStep(formGroup: FormGroup): void { + const form = formGroup.value as EditFormType; + if (form.prepare && !form.prepare.length) { + delete form.prepare; + } + } + private processEventTimeControl(formGroup: FormGroup): void { const form = formGroup.value as OrderControlType; if (form.fetch.eventTime && form.fetch.kind === "container") { diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.html b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.html index f4af7616c..083f6950d 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.html +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.html @@ -1 +1,102 @@ -

prepare-step works!

+

Prepare

+
+

+ Defines how raw data is prepared before reading. You can add + Pipe and + Decompress steps. +

+
+
+
+ +
+

Pipe

+
+ +
+ +
+ + + +
+
+
+ +
+

Decompress

+
+ + +
+
+ + +
+
+ + + +
+
+
+
+
diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.sass b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.sass index e69de29bb..a1798c9a6 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.sass +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.sass @@ -0,0 +1,8 @@ +.prepare-item + color: #0d6efd + text-decoration: none + +.buttons-section + position: absolute + top: 20px + right: 30px diff --git a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.ts b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.ts index c4ad95aa7..64323be44 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.ts +++ b/src/app/dataset-view/additional-components/metadata-component/components/add-polling-source/steps/prepare-step/prepare-step.component.ts @@ -1,9 +1,117 @@ -import { ChangeDetectionStrategy, Component } from "@angular/core"; +import { + ChangeDetectionStrategy, + Component, + Input, + OnInit, +} from "@angular/core"; +import { + ControlContainer, + FormArray, + FormBuilder, + FormGroup, + FormGroupDirective, +} from "@angular/forms"; +import { MaybeNull } from "src/app/common/app.types"; +import { BaseComponent } from "src/app/common/base.component"; +import { SetPollingSourceSection } from "src/app/shared/shared.types"; +import { EditFormType, PrepareKind } from "../../add-polling-source-form.types"; +import { EditPollingSourceService } from "../../edit-polling-source.service"; @Component({ selector: "app-prepare-step", templateUrl: "./prepare-step.component.html", styleUrls: ["./prepare-step.component.sass"], changeDetection: ChangeDetectionStrategy.OnPush, + viewProviders: [ + { provide: ControlContainer, useExisting: FormGroupDirective }, + ], }) -export class PrepareStepComponent {} +export class PrepareStepComponent extends BaseComponent implements OnInit { + @Input() public eventYamlByHash: MaybeNull = null; + @Input() public sectionName: SetPollingSourceSection; + public parentForm: FormGroup; + public setPollingSourceEvent: MaybeNull = null; + + constructor( + private rootFormGroupDirective: FormGroupDirective, + private fb: FormBuilder, + private editService: EditPollingSourceService, + ) { + super(); + } + + ngOnInit(): void { + this.parentForm = this.rootFormGroupDirective.form; + if (this.eventYamlByHash) { + this.setPollingSourceEvent = this.editService.parseEventFromYaml( + this.eventYamlByHash, + ); + this.initExistingPrepareStep(this.setPollingSourceEvent); + } + } + + private initExistingPrepareStep(event: EditFormType): void { + let group: FormGroup; + if (event.prepare && this.sectionForm.length === 0) { + event.prepare.forEach((item) => { + if ( + item.kind === PrepareKind.PIPE && + Array.isArray(item.command) + ) { + group = this.fb.group({ + kind: this.fb.control(PrepareKind.PIPE), + command: this.fb.control(item.command.join(" ")), + }); + } else if (item.kind === PrepareKind.DECOMPRESS) { + group = this.fb.group({ + kind: this.fb.control(PrepareKind.DECOMPRESS), + format: this.fb.control(item.format), + subPath: this.fb.control(item.subPath), + }); + } + this.sectionForm.push(group); + }); + } + } + + public get sectionForm(): FormArray { + return this.parentForm.get(this.sectionName) as FormArray; + } + + public addPipe(): void { + this.sectionForm.push( + this.fb.group({ + kind: this.fb.control(PrepareKind.PIPE), + command: this.fb.control(""), + }), + ); + } + + public addDecompress(): void { + this.sectionForm.push( + this.fb.group({ + kind: this.fb.control(PrepareKind.DECOMPRESS), + format: this.fb.control(""), + subPath: this.fb.control(""), + }), + ); + } + + public delete(index: number): void { + this.sectionForm.removeAt(index); + } + + public swap(index: number, direction: number): void { + const current = this.sectionForm.at(index); + this.sectionForm.removeAt(index); + this.sectionForm.insert(index + direction, current); + } + + public isLastItem(index: number): boolean { + return index === this.sectionForm.length - 1; + } + + public isFirstItem(index: number): boolean { + return index === 0; + } +} diff --git a/src/app/dataset-view/additional-components/metadata-component/components/form-components/input-field/input-field.component.sass b/src/app/dataset-view/additional-components/metadata-component/components/form-components/input-field/input-field.component.sass index e69de29bb..7dcc57b85 100644 --- a/src/app/dataset-view/additional-components/metadata-component/components/form-components/input-field/input-field.component.sass +++ b/src/app/dataset-view/additional-components/metadata-component/components/form-components/input-field/input-field.component.sass @@ -0,0 +1,2 @@ +input + text-overflow: ellipsis