diff --git a/src/pipeline/wizard.ts b/src/pipeline/wizard.ts index 6ecd497f..49841bd6 100644 --- a/src/pipeline/wizard.ts +++ b/src/pipeline/wizard.ts @@ -28,7 +28,8 @@ export class PipelineWizard extends Disposable { { enableFindWidget: true, ...getWebviewOptions() - }); + } + ); return new PipelineWizard(webview, input); } @@ -149,13 +150,6 @@ export class PipelineWizard extends Disposable { return out.join('\n'); } - private getImagesUri(): { [key: string]: string } { - const result: { [key: string]: string } = Object.create(null); - result['task'] = this.editor.webview.asWebviewUri(vscode.Uri.file(path.join(contextGlobalState.extensionPath, 'images', 'T.svg'))).toString(); - result['clustertask'] = this.editor.webview.asWebviewUri(vscode.Uri.file(path.join(contextGlobalState.extensionPath, 'images', 'CT.svg'))).toString(); - return result; - } - private getFontPath(): string { return this.editor.webview.asWebviewUri(vscode.Uri.file(path.join(contextGlobalState.extensionPath, '/out/webview/pipeline/assets/codicon.ttf'))).toString(); } diff --git a/src/tekton/pipeline.ts b/src/tekton/pipeline.ts index bc8d913f..db1525ad 100644 --- a/src/tekton/pipeline.ts +++ b/src/tekton/pipeline.ts @@ -108,6 +108,7 @@ export class Pipeline extends TektonItem { } static async startWizard(pipeline: TektonNode): Promise { + if (!pipeline) return null; const result: cliInstance.CliExitData = await Pipeline.tkn.execute(Command.getPipeline(pipeline.getName()), process.cwd(), false); let data: TknPipelineTrigger; if (result.error) { @@ -119,6 +120,15 @@ export class Pipeline extends TektonItem { //show no pipelines if output is not correct json } const trigger = await pipelineData(data); - PipelineWizard.create({ trigger, resourceColumn: ViewColumn.Active }, ViewColumn.Active); + if (!trigger.workspaces && !trigger.resources && !trigger.params) { + Progress.execFunctionWithProgress(`Starting Pipeline '${trigger.name}'.`, () => + TektonItem.tkn.startPipeline(trigger) + .then(() => TektonItem.explorer.refresh()) + .then(() => `Pipeline '${trigger.name}' successfully started`) + .catch((error) => Promise.reject(`Failed to start Pipeline with error '${error}'`)) + ); + } else { + PipelineWizard.create({ trigger, resourceColumn: ViewColumn.Active }, ViewColumn.Active); + } } } diff --git a/src/tekton/pipelinecontent.ts b/src/tekton/pipelinecontent.ts index e5ec341e..44167b96 100644 --- a/src/tekton/pipelinecontent.ts +++ b/src/tekton/pipelinecontent.ts @@ -8,6 +8,7 @@ import { Command } from '../tkn'; import { TektonItem } from './tektonitem'; import { TknPipelineResource } from '../tekton'; import { QuickPickItem } from 'vscode'; +import { Secret, ConfigMap, PVC } from './webviewstartpipeline'; export interface Ref { name: string; @@ -37,7 +38,7 @@ export interface Workspaces { export interface Resources { name: string; - resourceRef: string; + resourceRef?: string; resourceType?: string; } @@ -53,6 +54,10 @@ export interface StartObject { params: Params[] | undefined; workspaces: Workspaces[]; serviceAccount: string | undefined; + pipelineResource?: TknPipelineResource; + Secret?: Secret[]; + ConfigMap?: ConfigMap[]; + PersistentVolumeClaim?: PVC[]; } export interface Trigger { diff --git a/src/tekton/webviewstartpipeline.ts b/src/tekton/webviewstartpipeline.ts index 3a979a2a..074fe5a3 100644 --- a/src/tekton/webviewstartpipeline.ts +++ b/src/tekton/webviewstartpipeline.ts @@ -12,19 +12,19 @@ interface KubectlMetadata { name: string; } -interface Secret { +export interface Secret { data: string[]; kind: string; metadata: KubectlMetadata; } -interface ConfigMap { +export interface ConfigMap { data: string[]; kind: string; metadata: KubectlMetadata; } -interface PVC { +export interface PVC { metadata: KubectlMetadata; } @@ -33,7 +33,7 @@ export interface TknResourceItem { resources: TknResource[]; params: TknParams[]; workspaces: TknWorkspaces[]; - serviceAcct: string; + serviceAccount: string; pipelineResource: TknPipelineResource; Secret: Secret[]; ConfigMap: ConfigMap[]; @@ -46,7 +46,7 @@ export async function pipelineData(pipeline: TknPipelineTrigger): Promise { resources.push('--resource'); diff --git a/src/webview/pipeline/app/editor.ts b/src/webview/pipeline/app/editor.ts index 9705be6b..9d0533e5 100644 --- a/src/webview/pipeline/app/editor.ts +++ b/src/webview/pipeline/app/editor.ts @@ -3,14 +3,14 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { Trigger, Params, Workspaces, PipelineStart } from './common/types'; -import { NavigationList, NavigationItem } from './utils/navigation'; -import { Widget } from './common/widget'; -import { Editor, GroupItem, EditItem } from './element/maincontent'; +import { Trigger, Params, Workspaces, PipelineStart } from './utils/types'; +import { NavigationList, NavigationItem } from './widgets/navigation'; +import { Widget } from './widgets/widget'; import { VolumeTypes, initialResourceFormValues, TknResourceType } from './utils/const'; -import { ButtonsPanel } from './element/buttonspanel'; -import { SelectWidget } from './element/selectwidget'; -import { InputWidget } from './element/inputwidget'; +import { ButtonsPanel } from './widgets/buttonspanel'; +import { Editor, GroupItem, EditItem } from './widgets/maincontent'; +import { InputWidget } from './widgets/inputwidget'; +import { SelectWidget } from './widgets/selectwidget'; export class PipelineRunEditor implements Widget { private element: HTMLElement; diff --git a/src/webview/pipeline/app/index.ts b/src/webview/pipeline/app/index.ts index 16dec917..30f03f4f 100644 --- a/src/webview/pipeline/app/index.ts +++ b/src/webview/pipeline/app/index.ts @@ -6,7 +6,7 @@ import './style.css'; import 'vscode-codicons/dist/codicon.ttf' import { PipelineRunEditor } from './editor'; -import { Trigger } from './common/types'; +import { Trigger } from './utils/types'; declare let acquireVsCodeApi: any; export const vscode = acquireVsCodeApi(); diff --git a/src/webview/pipeline/app/style.css b/src/webview/pipeline/app/style.css index 474149b8..4ad8ed2a 100644 --- a/src/webview/pipeline/app/style.css +++ b/src/webview/pipeline/app/style.css @@ -26,16 +26,18 @@ body { @media screen and (max-width: 550px) { .grid-container { grid-template-areas: "main main" "main main" "buttons buttons"; - grid-template-rows: 734px 1fr 40px; + grid-template-columns: 160px 358px; + grid-template-rows: 634px 0.92fr 2px; } } -@media screen and (max-width: 550px) and (min-height: 905px) { +/* @media screen and (max-width: 550px) and (min-height: 905px) { .grid-container { grid-template-areas: "main main" "main main" "buttons buttons"; + grid-template-columns: 160px 365px; grid-template-rows: 734px 121px; } -} +} */ @media screen and (min-width: 550px) { .grid-container { @@ -49,7 +51,7 @@ body { .grid-container { grid-template-areas: "navigation main" "navigation main" "navigation buttons"; grid-template-columns: 160px 1fr; - grid-template-rows: 200px 1fr 49px; + grid-template-rows: 200px 0.92fr 2px; } } @@ -62,6 +64,8 @@ body { .main { padding-left: 26px; grid-area: main; + overflow-y: auto; + overflow-x: hidden; flex-direction: column; } @@ -78,11 +82,12 @@ body { } .startButton-disable { - height:22px; + height: 16px; margin: -20px -50px; - position:relative; - top:33%; - left:50%; + position: fixed; + /* top:33%; */ + bottom: 40px; + left: 50%; background: #848484; color: var(--vscode-button-foreground); width: auto; @@ -96,11 +101,12 @@ body { } .startButton { - height:22px; - margin: -20px -50px; - position:relative; - top:33%; - left:50%; + height: 16px; + margin: -20px -50px; + position: fixed; + /* top:33%; */ + bottom: 40px; + left: 50%; background: var(--vscode-button-background); color: var(--vscode-button-foreground); width: auto; @@ -115,10 +121,28 @@ body { .close-button-disable { position: absolute; - right: 10px; + right: 291px; top: -32px; } +@media screen and (min-width: 357px) { + .close-button-disable { + right: 179px; + } +} + +@media screen and (min-width: 550px) { + .close-button-disable { + right: 167px; + } +} + +@media screen and (min-width: 700px) { + .close-button-disable { + right: 10px; + } +} + .close-button-disable::after{ content: "\ea76"; font-family: codicon; @@ -390,7 +414,7 @@ body { } .editor-select-box-item { - width: 466px; + width: 301px; font-family: inherit; font-size: var(--vscode-font-size); border: 1px solid; @@ -404,6 +428,24 @@ body { -webkit-border-radius: 0px; } +@media screen and (max-width: 357px) { + .editor-select-box-item { + width: 186px; + } +} + +@media screen and (min-width: 550px) { + .editor-select-box-item { + width: 308px; + } +} + +@media screen and (min-width: 700px) { + .editor-select-box-item { + width: 466px; + } +} + .editor-select-box-item:focus { outline-color: var(--vscode-focusBorder); outline-width: 1px; diff --git a/src/webview/pipeline/app/utils/disablebutton.ts b/src/webview/pipeline/app/utils/disablebutton.ts new file mode 100644 index 00000000..2b53d8df --- /dev/null +++ b/src/webview/pipeline/app/utils/disablebutton.ts @@ -0,0 +1,32 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + + +export function disableRemoveButton(event: Node & ParentNode): void { + const selectedItem = event.querySelectorAll('[id^=items-section-workspace-new-item]'); + if (selectedItem.length === 1) { + selectedItem[0].lastElementChild.firstElementChild.className = 'close-button-disable'; + } else { + selectedItem[0].lastElementChild.firstElementChild.className = 'close-button'; + } +} + +// Disable button if section are not selected for workspace +export function disableSelection(nodeList: HTMLCollectionOf): boolean { + const selectOption = ['Select a Config Map', 'Select a Secret', 'Select a PVC'] + let startButton = document.querySelector('.startButton'); + if (!startButton) { + startButton = document.querySelector('.startButton-disable') + } + for (let element = 0; element < nodeList.length; element++) { + const findOption = selectOption.includes(nodeList[element].value); + if (findOption) { + startButton.className = 'startButton-disable'; // Disable the button. + return false; + } else { + startButton.className = 'startButton'; + } + } +} diff --git a/src/webview/pipeline/app/common/item.ts b/src/webview/pipeline/app/utils/item.ts similarity index 54% rename from src/webview/pipeline/app/common/item.ts rename to src/webview/pipeline/app/utils/item.ts index 10b7a6a7..bf30b325 100644 --- a/src/webview/pipeline/app/common/item.ts +++ b/src/webview/pipeline/app/utils/item.ts @@ -3,45 +3,23 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { SelectWidget } from '../element/selectwidget'; -import { EditItem } from '../element/maincontent'; -import { createDiv } from '../utils/util'; -import { InputWidget } from '../element/inputwidget'; -import { ButtonsPanel } from '../element/buttonspanel'; +import { createDiv } from './util'; import { PipelineStart, Trigger } from './types'; import { disableButton } from '..'; - -export function disableRemoveButton(event: Node & ParentNode): void { - const selectedItem = event.querySelectorAll('[id^=items-section-workspace-new-item]'); - if (selectedItem.length === 1) { - selectedItem[0].lastElementChild.firstElementChild.className = 'close-button-disable'; - } else { - selectedItem[0].lastElementChild.firstElementChild.className = 'close-button'; - } -} - -// Disable button if section are not selected for workspace -export function disableSelection(nodeList: HTMLCollectionOf): boolean { - const selectOption = ['Select a Config Map', 'Select a Secret', 'Select a PVC'] - let startButton = document.querySelector('.startButton'); - if (!startButton) { - startButton = document.querySelector('.startButton-disable') - } - for (let element = 0; element < nodeList.length; element++) { - const findOption = selectOption.includes(nodeList[element].value); - if (findOption) { - startButton.className = 'startButton-disable'; // Disable the button. - return false; - } else { - startButton.className = 'startButton'; - } - } -} +import { SelectWidget } from '../widgets/selectwidget'; +import { EditItem } from '../widgets/maincontent'; +import { InputWidget } from '../widgets/inputwidget'; +import { ButtonsPanel } from '../widgets/buttonspanel'; +import { disableRemoveButton, disableSelection } from './disablebutton'; export function createItem(event: Node & ParentNode, optionId: string, selectValue?: string, initialValue?: PipelineStart, trigger?: Trigger): void { const newDivClass = 'items-section-workspace-new-item'; const selectItem = new SelectWidget(null, null, 'editor-select-box-item', initialValue).selectItem(trigger[optionId], selectValue); const selectItemOp = new EditItem('Items', selectItem, 'option-workspace-id', 'inner-editItem'); + addItem(event, optionId, newDivClass, selectItemOp, selectValue, initialValue, trigger); +} + +export function addItem(event: Node & ParentNode, optionId: string, newDivClass: string, selectItemOp: EditItem, selectValue: string, initialValue: PipelineStart, trigger: Trigger): void { if (event.lastElementChild.id === 'Add-New-Items') event.lastChild.remove(); event.appendChild(createDiv(null, newDivClass)); event.lastChild.appendChild(selectItemOp.getElement()); diff --git a/src/webview/pipeline/app/common/resource.ts b/src/webview/pipeline/app/utils/resource.ts similarity index 84% rename from src/webview/pipeline/app/common/resource.ts rename to src/webview/pipeline/app/utils/resource.ts index 1c5f7ba3..152e73e3 100644 --- a/src/webview/pipeline/app/common/resource.ts +++ b/src/webview/pipeline/app/utils/resource.ts @@ -6,7 +6,7 @@ import { PipelineStart } from './types'; -export function parameter(paramName: string, defaultValue: string, initialValue: PipelineStart): void { +export function collectParameterData(paramName: string, defaultValue: string, initialValue: PipelineStart): void { if (initialValue.params.length === 0) { initialValue.params.push({name: paramName, default: defaultValue}); } else { @@ -22,7 +22,7 @@ export function parameter(paramName: string, defaultValue: string, initialValue: } } -export function createResourceJson(resourceName: string, resourceReference: string, initialValue: PipelineStart): void { +export function collectResourceData(resourceName: string, resourceReference: string, initialValue: PipelineStart): void { if (initialValue.resources.length === 0) { initialValue.resources.push({name: resourceName, resourceRef: resourceReference}); } else { @@ -38,7 +38,7 @@ export function createResourceJson(resourceName: string, resourceReference: stri } } -export function createWorkspaceJson(resourceName: string, workspaceResourceType: string, initialValue: PipelineStart, workspaceResourceName?: string, keyName?: string, valueName?: string): void { +export function collectWorkspaceData(resourceName: string, workspaceResourceType: string, initialValue: PipelineStart, workspaceResourceName?: string): void { const itemData = []; if (initialValue.workspaces.length === 0) { initialValue.workspaces.push({ @@ -65,6 +65,7 @@ export function createWorkspaceJson(resourceName: string, workspaceResourceType: }); } } + console.log(initialValue); } export function addItemInWorkspace(resourceName: string, keyValue: string, path: string, initialValue: PipelineStart): void { diff --git a/src/webview/pipeline/app/common/types.ts b/src/webview/pipeline/app/utils/types.ts similarity index 100% rename from src/webview/pipeline/app/common/types.ts rename to src/webview/pipeline/app/utils/types.ts diff --git a/src/webview/pipeline/app/element/buttonspanel.ts b/src/webview/pipeline/app/widgets/buttonspanel.ts similarity index 90% rename from src/webview/pipeline/app/element/buttonspanel.ts rename to src/webview/pipeline/app/widgets/buttonspanel.ts index ea5c8250..ad7d5e00 100644 --- a/src/webview/pipeline/app/element/buttonspanel.ts +++ b/src/webview/pipeline/app/widgets/buttonspanel.ts @@ -3,11 +3,12 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { BaseWidget } from '../common/widget'; -import { Trigger, PipelineStart } from '../common/types'; -import { createItem, disableRemoveButton } from '../common/item'; +import { BaseWidget } from './widget'; +import { Trigger, PipelineStart } from '../utils/types'; +import { createItem } from '../utils/item'; import { disableButton, vscode } from '..'; -import { addItemInWorkspace } from '../common/resource'; +import { addItemInWorkspace } from '../utils/resource'; +import { disableRemoveButton } from '../utils/disablebutton'; export class ButtonsPanel extends BaseWidget { private startButton: HTMLElement; diff --git a/src/webview/pipeline/app/element/inputwidget.ts b/src/webview/pipeline/app/widgets/inputwidget.ts similarity index 89% rename from src/webview/pipeline/app/element/inputwidget.ts rename to src/webview/pipeline/app/widgets/inputwidget.ts index 8f8085af..d33c49d7 100644 --- a/src/webview/pipeline/app/element/inputwidget.ts +++ b/src/webview/pipeline/app/widgets/inputwidget.ts @@ -4,10 +4,10 @@ *-----------------------------------------------------------------------------------------------*/ import { createDiv } from '../utils/util'; -import { BaseWidget } from '../common/widget'; -import { PipelineStart } from '../common/types'; +import { BaseWidget } from './widget'; +import { PipelineStart } from '../utils/types'; import { TknResourceType } from '../utils/const'; -import { parameter, createResourceJson } from '../common/resource'; +import { collectParameterData, collectResourceData } from '../utils/resource'; import { disableButton } from '..'; export class InputWidget extends BaseWidget { @@ -65,13 +65,13 @@ export class InputWidget extends BaseWidget { disableButton(document.getElementsByTagName('input')); const initialValue = this.initialValue; if (input.parentNode.parentNode.parentNode.parentElement.id === TknResourceType.Params) { - parameter(input.parentNode.parentNode.parentNode.firstElementChild.id, this.input.value, initialValue); + collectParameterData(input.parentNode.parentNode.parentNode.firstElementChild.id, this.input.value, initialValue); } const resource = input.parentNode.parentNode.parentNode.parentNode.parentElement.id.trim(); if (resource === TknResourceType.GitResource || resource === TknResourceType.ImageResource) { const name = input.parentNode.parentNode.parentNode.parentNode.firstElementChild.id; const resourceRef = this.input.value; - createResourceJson(name, resourceRef, this.initialValue); + collectResourceData(name, resourceRef, this.initialValue); } } } diff --git a/src/webview/pipeline/app/element/maincontent.ts b/src/webview/pipeline/app/widgets/maincontent.ts similarity index 97% rename from src/webview/pipeline/app/element/maincontent.ts rename to src/webview/pipeline/app/widgets/maincontent.ts index e5692138..251a4ea2 100644 --- a/src/webview/pipeline/app/element/maincontent.ts +++ b/src/webview/pipeline/app/widgets/maincontent.ts @@ -5,7 +5,7 @@ import { createDiv } from '../utils/util'; import { debounce } from 'debounce'; -import { Listener, BaseWidget, Widget } from '../common/widget'; +import { Listener, BaseWidget, Widget } from './widget'; export class LabelItem extends BaseWidget { constructor(title: string, id?: string) { diff --git a/src/webview/pipeline/app/utils/navigation.ts b/src/webview/pipeline/app/widgets/navigation.ts similarity index 94% rename from src/webview/pipeline/app/utils/navigation.ts rename to src/webview/pipeline/app/widgets/navigation.ts index bee0d472..c7f3c7cd 100644 --- a/src/webview/pipeline/app/utils/navigation.ts +++ b/src/webview/pipeline/app/widgets/navigation.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { createDiv } from './util'; -import { BaseWidget, Listener } from '../common/widget'; +import { createDiv } from '../utils/util'; +import { BaseWidget, Listener } from './widget'; export class NavigationItem extends BaseWidget { constructor(name: string) { diff --git a/src/webview/pipeline/app/element/selectwidget.ts b/src/webview/pipeline/app/widgets/selectwidget.ts similarity index 90% rename from src/webview/pipeline/app/element/selectwidget.ts rename to src/webview/pipeline/app/widgets/selectwidget.ts index 66c82d01..3c3ede7e 100644 --- a/src/webview/pipeline/app/element/selectwidget.ts +++ b/src/webview/pipeline/app/widgets/selectwidget.ts @@ -3,15 +3,16 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { Widget, BaseWidget } from '../common/widget'; +import { Widget, BaseWidget } from './widget'; import { createDiv } from '../utils/util'; import { EditItem } from './maincontent'; import { InputWidget } from './inputwidget'; -import { NameType, Trigger, PipelineStart, Workspaces } from '../common/types'; +import { NameType, Trigger, PipelineStart, Workspaces } from '../utils/types'; import { VolumeTypes, TknResourceType } from '../utils/const'; import { selectText, disableButton } from '../index'; -import { createResourceJson, createWorkspaceJson } from '../common/resource'; -import { createItem, disableSelection } from '../common/item'; +import { collectResourceData, collectWorkspaceData } from '../utils/resource'; +import { createItem } from '../utils/item'; +import { disableSelection } from '../utils/disablebutton'; export class SelectWidget extends BaseWidget { public select: HTMLSelectElement; @@ -38,7 +39,7 @@ export class SelectWidget extends BaseWidget { } if (event.parentNode.firstElementChild.textContent === TknResourceType.GitResource || event.parentNode.firstElementChild.textContent === TknResourceType.ImageResource) { if (select.value.trim() !== 'Create Pipeline Resource') { - createResourceJson(event.firstElementChild.id, select.value, this.initialValue); + collectResourceData(event.firstElementChild.id, select.value, this.initialValue); } } if (event.parentNode.firstElementChild.textContent === TknResourceType.Workspaces || event.parentNode.parentNode.firstElementChild.textContent === TknResourceType.Workspaces) { @@ -118,7 +119,7 @@ export class SelectWidget extends BaseWidget { this.select.appendChild(op); } }); - createResourceJson(resource.name, this.select.value, this.initialValue); + collectResourceData(resource.name, this.select.value, this.initialValue); return this; } @@ -129,7 +130,7 @@ export class SelectWidget extends BaseWidget { op.text = val; this.select.appendChild(op); }); - createWorkspaceJson(resource.name, this.select.value, this.initialValue); + collectWorkspaceData(resource.name, this.select.value, this.initialValue); return this; } @@ -137,12 +138,12 @@ export class SelectWidget extends BaseWidget { if (event.parentNode.firstElementChild.textContent === TknResourceType.Workspaces) { const name = event.firstElementChild.id; const workspaceType = this.select.value; - createWorkspaceJson(name, workspaceType, this.initialValue); + collectWorkspaceData(name, workspaceType, this.initialValue); } if (event.parentNode.parentNode.firstElementChild.textContent === TknResourceType.Workspaces) { const name = event.parentNode.firstElementChild.id; const workspaceResourceName = this.select.value; - createWorkspaceJson(name, undefined, this.initialValue, workspaceResourceName) + collectWorkspaceData(name, undefined, this.initialValue, workspaceResourceName) } } } diff --git a/src/webview/pipeline/app/common/widget.ts b/src/webview/pipeline/app/widgets/widget.ts similarity index 100% rename from src/webview/pipeline/app/common/widget.ts rename to src/webview/pipeline/app/widgets/widget.ts