Fix display of settings

Signed-off-by: Sanjula Ganepola <sanjulagane@gmail.com>
This commit is contained in:
Sanjula Ganepola
2024-10-20 23:10:28 -04:00
parent f5424c9e7a
commit b7dd3b5d0f
7 changed files with 142 additions and 69 deletions

View File

@@ -47,11 +47,11 @@ export enum Event {
export enum Option { export enum Option {
ActionCachePath = '--action-cache-path', ActionCachePath = '--action-cache-path',
ActionOfflineMode = '--action-offline-mode', ActionOfflineMode = '--action-offline-mode',
Actor = '--actor', Actor = '--a',
ArtifactServerAddr = '--artifact-server-addr', ArtifactServerAddr = '--artifact-server-addr',
ArtifactServerPath = '--artifact-server-path', ArtifactServerPath = '--artifact-server-path',
ArtifactServerPort = '--artifact-server-port', ArtifactServerPort = '--artifact-server-port',
Bind = '--bind', Bind = '--b',
BugReport = '--bug-report', BugReport = '--bug-report',
CacheServerAddr = '--cache-server-addr', CacheServerAddr = '--cache-server-addr',
CacheServerPath = '--cache-server-path', CacheServerPath = '--cache-server-path',
@@ -63,20 +63,20 @@ export enum Option {
ContainerOptions = '--container-options', ContainerOptions = '--container-options',
DefaultBranch = '--defaultbranch', DefaultBranch = '--defaultbranch',
DetectEvent = '--detect-event', DetectEvent = '--detect-event',
Directory = '--directory', Directory = '--C',
DryRun = '--dryrun', DryRun = '--n',
Env = '--env', Env = '--env',
EnvFile = '--env-file', EnvFile = '--env-file',
EventPath = '--eventpath', EventPath = '--e',
GitHubInstance = '--github-instance', GitHubInstance = '--github-instance',
Graph = '--graph', Graph = '--g',
Help = '--help', Help = '--h',
Input = '--input', Input = '--input',
InputFile = '--input-file', InputFile = '--input-file',
InsecureSecrets = '--insecure-secrets', InsecureSecrets = '--insecure-secrets',
Job = '--job', Job = '--j',
Json = '--json', Json = '--json',
List = '--list', List = '--l',
LocalRepository = '--local-repository', LocalRepository = '--local-repository',
LogPrefixJobId = '--log-prefix-job-id', LogPrefixJobId = '--log-prefix-job-id',
ManPage = '--man-page', ManPage = '--man-page',
@@ -85,15 +85,15 @@ export enum Option {
NoCacheServer = '--no-cache-server', NoCacheServer = '--no-cache-server',
NoRecurse = '--no-recurse', NoRecurse = '--no-recurse',
NoSkipCheckout = '--no-skip-checkout', NoSkipCheckout = '--no-skip-checkout',
Platform = '--platform', Platform = '--P',
Privileged = '--privileged', Privileged = '--privileged',
Pull = '--pull', Pull = '--p',
Quiet = '--quiet', Quiet = '--q',
Rebuild = '--rebuild', Rebuild = '--rebuild',
RemoteName = '--remote-name', RemoteName = '--remote-name',
ReplaceGHEActionTokenWithGitHubCom = '--replace-ghe-action-token-with-github-com', ReplaceGHEActionTokenWithGitHubCom = '--replace-ghe-action-token-with-github-com',
ReplaceGHEActionWithGitHubCom = '--replace-ghe-action-with-github-com', ReplaceGHEActionWithGitHubCom = '--replace-ghe-action-with-github-com',
Reuse = '--reuse', Reuse = '--r',
Rm = '--rm', Rm = '--rm',
Secret = '--secret', Secret = '--secret',
SecretFile = '--secret-file', SecretFile = '--secret-file',
@@ -102,17 +102,17 @@ export enum Option {
Userns = '--userns', Userns = '--userns',
Var = '--var', Var = '--var',
VarFile = '--var-file', VarFile = '--var-file',
Verbose = '--verbose', Verbose = '--v',
Version = '--version', Version = '--version',
Watch = '--watch', Watch = '--w',
Workflows = '--workflows' Workflows = '--W'
} }
export interface CommandArgs { export interface CommandArgs {
workspaceFolder: WorkspaceFolder, workspaceFolder: WorkspaceFolder,
options: string, options: string,
name: string, name: string,
typeText: string[] extraHeader: { key: string, value: string }[]
} }
export class Act { export class Act {
@@ -189,7 +189,7 @@ export class Act {
workspaceFolder: workspaceFolder, workspaceFolder: workspaceFolder,
options: ``, options: ``,
name: workspaceFolder.name, name: workspaceFolder.name,
typeText: [] extraHeader: []
}); });
} }
@@ -198,8 +198,8 @@ export class Act {
workspaceFolder: workspaceFolder, workspaceFolder: workspaceFolder,
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`, options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`,
name: workflow.name, name: workflow.name,
typeText: [ extraHeader: [
`Workflow: ${workflow.name}` { key: 'Workflow', value: workflow.name }
] ]
}); });
} }
@@ -209,9 +209,9 @@ export class Act {
workspaceFolder: workspaceFolder, workspaceFolder: workspaceFolder,
options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}" ${Option.Job} "${job.id}"`, options: `${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}" ${Option.Job} "${job.id}"`,
name: `${workflow.name}/${job.name}`, name: `${workflow.name}/${job.name}`,
typeText: [ extraHeader: [
`Workflow: ${workflow.name}`, { key: 'Workflow', value: workflow.name },
`Job: ${job.name}` { key: 'Job', value: job.name }
] ]
}); });
} }
@@ -221,15 +221,13 @@ export class Act {
workspaceFolder: workspaceFolder, workspaceFolder: workspaceFolder,
options: event, options: event,
name: event, name: event,
typeText: [ extraHeader: [
`Event: ${event}` { key: 'Event', value: event }
] ]
}); });
} }
async runCommand(commandArgs: CommandArgs) { async runCommand(commandArgs: CommandArgs) {
const command = `${Act.base} ${Option.Json} ${commandArgs.options}`;
const unreadyComponents = await this.componentsManager.getUnreadyComponents(); const unreadyComponents = await this.componentsManager.getUnreadyComponents();
if (unreadyComponents.length > 0) { if (unreadyComponents.length > 0) {
window.showErrorMessage(`The following required components are not ready: ${unreadyComponents.map(component => component.name).join(', ')}`, 'Fix...').then(async value => { window.showErrorMessage(`The following required components are not ready: ${unreadyComponents.map(component => component.name).join(', ')}`, 'Fix...').then(async value => {
@@ -240,12 +238,6 @@ export class Act {
return; return;
} }
if (!this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath]) {
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath] = [];
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
}
const historyIndex = this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length;
const taskExecution = await tasks.executeTask({ const taskExecution = await tasks.executeTask({
name: commandArgs.name, name: commandArgs.name,
detail: 'Run workflow', detail: 'Run workflow',
@@ -266,6 +258,48 @@ export class Act {
runOptions: {}, runOptions: {},
group: TaskGroup.Build, group: TaskGroup.Build,
execution: new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => { execution: new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
const environments = await this.settingsManager.getEnvironments(commandArgs.workspaceFolder);
const secrets = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.secretsRegExp, StorageKey.Secrets)).filter(secret => secret.selected && secret.value);
const variables = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.variablesRegExp, StorageKey.Variables)).filter(variable => variable.selected && variable.value);
const inputs = (await this.settingsManager.getSetting(commandArgs.workspaceFolder, SettingsManager.inputsRegExp, StorageKey.Inputs)).filter(input => input.selected && input.value);
// TODO: Fix secrets, variables, and inputs in below command
// How to pass in secrets
// Is there any point to show environments in the header? Is it needed in the tree view?
const command = `${Act.base} ${Option.Json} ${commandArgs.options}`;
const historyIndex = this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length;
if (!this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath]) {
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath] = [];
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
}
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].push({
index: historyIndex,
name: `${commandArgs.name} #${this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length + 1}`,
status: HistoryStatus.Running,
taskExecution: taskExecution,
commandArgs: commandArgs
});
historyTreeDataProvider.refresh();
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
const writeEmitter = new EventEmitter<string>(); const writeEmitter = new EventEmitter<string>();
const closeEmitter = new EventEmitter<number>(); const closeEmitter = new EventEmitter<number>();
@@ -292,18 +326,6 @@ export class Act {
} }
} }
const handleIO = (data: any) => { const handleIO = (data: any) => {
if (typeof this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath][historyIndex] === 'undefined') {
this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].push({
index: historyIndex,
name: `${commandArgs.name} #${this.historyManager.workspaceHistory[commandArgs.workspaceFolder.uri.fsPath].length + 1}`,
status: HistoryStatus.Running,
taskExecution: taskExecution,
commandArgs: commandArgs
});
historyTreeDataProvider.refresh();
this.storageManager.update(StorageKey.WorkspaceHistory, this.historyManager.workspaceHistory);
}
const lines: string[] = data.toString().split('\n').filter((line: string) => line != ''); const lines: string[] = data.toString().split('\n').filter((line: string) => line != '');
for (const line of lines) { for (const line of lines) {
let jsonLine: any; let jsonLine: any;
@@ -351,16 +373,36 @@ export class Act {
onDidWrite: writeEmitter.event, onDidWrite: writeEmitter.event,
onDidClose: closeEmitter.event, onDidClose: closeEmitter.event,
open: async (initialDimensions: TerminalDimensions | undefined): Promise<void> => { open: async (initialDimensions: TerminalDimensions | undefined): Promise<void> => {
writeEmitter.fire(`Name: ${commandArgs.name}\r\n`); let headerText: string = '';
writeEmitter.fire(`Path: ${commandArgs.workspaceFolder.uri.fsPath}\r\n`); const addMultipleEntries = (key: string, values: string[]): { key: string, value: string }[] => {
for (const text of commandArgs.typeText) { if (values.length === 0) return [];
writeEmitter.fire(`${text}\r\n`); return values.map((value, index) => ({
key: index === 0 ? key : '', // Show the key only for the first entry
value
}));
};
const header: { key: string, value: string }[] = [
{ key: 'Name', value: commandArgs.name },
{ key: 'Path', value: commandArgs.workspaceFolder.uri.fsPath },
...commandArgs.extraHeader,
...addMultipleEntries('Environments', environments.map(env => env.name)),
...addMultipleEntries('Variables', variables.map(variable => `${variable.key}=${variable.value}`)),
...addMultipleEntries('Secrets', secrets.map(secret => `${secret.key}=••••••••`)),
...addMultipleEntries('Inputs', inputs.map(input => `${input.key}=${input.value}`)),
{ key: 'Command', value: command.replace(` ${Option.Json}`, ``) }
];
const maxKeyLength = Math.max(...header.map(item => item.key.length));
for (const { key, value } of header) {
const spaces = ' '.repeat(maxKeyLength - key.length + 1);
headerText += key ? `${key}:${spaces}${value}\r\n` : ` ${spaces}${value}\r\n`;
} }
writeEmitter.fire(`Environments: OSSBUILD\r\n`);
writeEmitter.fire(`Variables: VARIABLE1=ABC, VARIABLE2=DEF\r\n`); const maxValueLength = Math.max(...header.map(item => item.value.length));
writeEmitter.fire(`Secrets: SECRET1=ABC, SECRET2=DEF\r\n`); const borderText = '-'.repeat(maxKeyLength + 2 + maxValueLength);
writeEmitter.fire(`Command: ${command.replace(` ${Option.Json}`, ``)}\r\n`);
writeEmitter.fire(`\r\n`); writeEmitter.fire(`${borderText}\r\n${headerText}${borderText}\r\n\r\n`);
}, },
close: () => { close: () => {

View File

@@ -1,10 +1,14 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import { window, workspace } from 'vscode'; import { TreeCheckboxChangeEvent, window, workspace } from 'vscode';
import { Act } from './act'; import { Act } from './act';
import ComponentsTreeDataProvider from './views/components/componentsTreeDataProvider'; import ComponentsTreeDataProvider from './views/components/componentsTreeDataProvider';
import { DecorationProvider } from './views/decorationProvider'; import { DecorationProvider } from './views/decorationProvider';
import { GithubLocalActionsTreeItem } from './views/githubLocalActionsTreeItem';
import HistoryTreeDataProvider from './views/history/historyTreeDataProvider'; import HistoryTreeDataProvider from './views/history/historyTreeDataProvider';
import InputTreeItem from './views/settings/input';
import SecretTreeItem from './views/settings/secret';
import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider'; import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider';
import VariableTreeItem from './views/settings/variable';
import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider'; import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider';
export let act: Act; export let act: Act;
@@ -28,6 +32,9 @@ export function activate(context: vscode.ExtensionContext) {
const historyTreeView = window.createTreeView(HistoryTreeDataProvider.VIEW_ID, { treeDataProvider: historyTreeDataProvider }); const historyTreeView = window.createTreeView(HistoryTreeDataProvider.VIEW_ID, { treeDataProvider: historyTreeDataProvider });
settingsTreeDataProvider = new SettingsTreeDataProvider(context); settingsTreeDataProvider = new SettingsTreeDataProvider(context);
const settingsTreeView = window.createTreeView(SettingsTreeDataProvider.VIEW_ID, { treeDataProvider: settingsTreeDataProvider }); const settingsTreeView = window.createTreeView(SettingsTreeDataProvider.VIEW_ID, { treeDataProvider: settingsTreeDataProvider });
settingsTreeView.onDidChangeCheckboxState(async (event: TreeCheckboxChangeEvent<GithubLocalActionsTreeItem>) => {
await settingsTreeDataProvider.onDidChangeCheckboxState(event as TreeCheckboxChangeEvent<SecretTreeItem | VariableTreeItem | InputTreeItem>);
});
// Create file watcher // Create file watcher
const workflowsFileWatcher = workspace.createFileSystemWatcher('**/.github/workflows/*.{yml,yaml}'); const workflowsFileWatcher = workspace.createFileSystemWatcher('**/.github/workflows/*.{yml,yaml}');

View File

@@ -32,6 +32,9 @@ export interface Runner {
export class SettingsManager { export class SettingsManager {
storageManager: StorageManager; storageManager: StorageManager;
static secretsRegExp: RegExp = /\${{\s*secrets\.(.*?)\s*}}/g;
static variablesRegExp: RegExp = /\${{\s*vars\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g;
static inputsRegExp: RegExp = /\${{\s*(?:inputs|github\.event\.inputs)\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g;
constructor(storageManager: StorageManager) { constructor(storageManager: StorageManager) {
this.storageManager = storageManager; this.storageManager = storageManager;
@@ -63,7 +66,7 @@ export class SettingsManager {
return environments; return environments;
} }
async getSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, regExp: RegExp, storageKey: StorageKey): Promise<T[]> { async getSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, regExp: RegExp, storageKey: StorageKey): Promise<T[]> {
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {}; const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
@@ -76,7 +79,13 @@ export class SettingsManager {
continue; continue;
} }
settings.push(...this.findInWorkflow<T>(workflow.fileContent, regExp)); const workflowSettings = this.findInWorkflow<T>(workflow.fileContent, regExp);
for (const workflowSetting of workflowSettings) {
const existingSetting = settings.find(setting => setting.key === workflowSetting.key);
if (!existingSetting) {
settings.push(workflowSetting);
}
}
} }
if (existingSettings[workspaceFolder.uri.fsPath]) { if (existingSettings[workspaceFolder.uri.fsPath]) {
@@ -97,7 +106,7 @@ export class SettingsManager {
return settings; return settings;
} }
editSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, newSetting: T, storageKey: StorageKey) { async editSetting<T extends Secret | Variable | Input>(workspaceFolder: WorkspaceFolder, newSetting: T, storageKey: StorageKey) {
const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {}; const existingSettings = this.storageManager.get<{ [path: string]: T[] }>(storageKey) || {};
if (existingSettings[workspaceFolder.uri.fsPath]) { if (existingSettings[workspaceFolder.uri.fsPath]) {
const index = existingSettings[workspaceFolder.uri.fsPath].findIndex(setting => setting.key === newSetting.key); const index = existingSettings[workspaceFolder.uri.fsPath].findIndex(setting => setting.key === newSetting.key);
@@ -110,7 +119,7 @@ export class SettingsManager {
existingSettings[workspaceFolder.uri.fsPath] = [newSetting]; existingSettings[workspaceFolder.uri.fsPath] = [newSetting];
} }
this.storageManager.update(storageKey, existingSettings); await this.storageManager.update(storageKey, existingSettings);
} }
private findInWorkflow<T extends Secret | Variable | Input>(content: string, regExp: RegExp) { private findInWorkflow<T extends Secret | Variable | Input>(content: string, regExp: RegExp) {

View File

@@ -1,5 +1,6 @@
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
import { act } from "../../extension"; import { act } from "../../extension";
import { SettingsManager } from "../../settingsManager";
import { StorageKey } from "../../storageManager"; import { StorageKey } from "../../storageManager";
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
import InputTreeItem from "./input"; import InputTreeItem from "./input";
@@ -16,7 +17,7 @@ export default class InputsTreeItem extends TreeItem implements GithubLocalActio
async getChildren(): Promise<GithubLocalActionsTreeItem[]> { async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
const items: GithubLocalActionsTreeItem[] = []; const items: GithubLocalActionsTreeItem[] = [];
const inputs = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*(?:inputs|github\.event\.inputs)\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g, StorageKey.Inputs); const inputs = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.inputsRegExp, StorageKey.Inputs);
for (const input of inputs) { for (const input of inputs) {
items.push(new InputTreeItem(this.workspaceFolder, input)); items.push(new InputTreeItem(this.workspaceFolder, input));
} }

View File

@@ -1,5 +1,6 @@
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
import { act } from "../../extension"; import { act } from "../../extension";
import { SettingsManager } from "../../settingsManager";
import { StorageKey } from "../../storageManager"; import { StorageKey } from "../../storageManager";
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
import SecretTreeItem from "./secret"; import SecretTreeItem from "./secret";
@@ -16,7 +17,7 @@ export default class SecretsTreeItem extends TreeItem implements GithubLocalActi
async getChildren(): Promise<GithubLocalActionsTreeItem[]> { async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
const items: GithubLocalActionsTreeItem[] = []; const items: GithubLocalActionsTreeItem[] = [];
const secrets = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*secrets\.(.*?)\s*}}/g, StorageKey.Secrets); const secrets = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.secretsRegExp, StorageKey.Secrets);
for (const secret of secrets) { for (const secret of secrets) {
items.push(new SecretTreeItem(this.workspaceFolder, secret)); items.push(new SecretTreeItem(this.workspaceFolder, secret));
} }

View File

@@ -1,4 +1,4 @@
import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeDataProvider, TreeItem, window, workspace } from "vscode"; import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeCheckboxChangeEvent, TreeDataProvider, TreeItem, TreeItemCheckboxState, window, workspace } from "vscode";
import { act } from "../../extension"; import { act } from "../../extension";
import { StorageKey } from "../../storageManager"; import { StorageKey } from "../../storageManager";
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
@@ -26,8 +26,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
password: true password: true
}); });
if (newValue) { if (newValue !== undefined) {
act.settingsManager.editSetting(secretTreeItem.workspaceFolder, { key: secretTreeItem.secret.key, value: newValue, selected: secretTreeItem.secret.selected }, StorageKey.Secrets); await act.settingsManager.editSetting(secretTreeItem.workspaceFolder, { key: secretTreeItem.secret.key, value: newValue, selected: secretTreeItem.secret.selected }, StorageKey.Secrets);
this.refresh(); this.refresh();
} }
}), }),
@@ -38,8 +38,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
value: variableTreeItem.variable.value value: variableTreeItem.variable.value
}); });
if (newValue) { if (newValue !== undefined) {
act.settingsManager.editSetting(variableTreeItem.workspaceFolder, { key: variableTreeItem.variable.key, value: newValue, selected: variableTreeItem.variable.selected }, StorageKey.Variables); await act.settingsManager.editSetting(variableTreeItem.workspaceFolder, { key: variableTreeItem.variable.key, value: newValue, selected: variableTreeItem.variable.selected }, StorageKey.Variables);
this.refresh(); this.refresh();
} }
}), }),
@@ -50,8 +50,8 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
value: inputTreeItem.input.value value: inputTreeItem.input.value
}); });
if (newValue) { if (newValue !== undefined) {
act.settingsManager.editSetting(inputTreeItem.workspaceFolder, { key: inputTreeItem.input.key, value: newValue, selected: inputTreeItem.input.selected }, StorageKey.Inputs); await act.settingsManager.editSetting(inputTreeItem.workspaceFolder, { key: inputTreeItem.input.key, value: newValue, selected: inputTreeItem.input.selected }, StorageKey.Inputs);
this.refresh(); this.refresh();
} }
}), }),
@@ -77,6 +77,18 @@ export default class SettingsTreeDataProvider implements TreeDataProvider<Github
return element; return element;
} }
async onDidChangeCheckboxState(event: TreeCheckboxChangeEvent<SecretTreeItem | VariableTreeItem | InputTreeItem>) {
for await (const [treeItem, state] of event.items) {
if (treeItem instanceof SecretTreeItem) {
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.secret.key, value: treeItem.secret.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Secrets);
} else if (treeItem instanceof VariableTreeItem) {
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.variable.key, value: treeItem.variable.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Variables);
} else {
await act.settingsManager.editSetting(treeItem.workspaceFolder, { key: treeItem.input.key, value: treeItem.input.value, selected: state === TreeItemCheckboxState.Checked }, StorageKey.Inputs);
}
}
}
async getChildren(element?: GithubLocalActionsTreeItem): Promise<GithubLocalActionsTreeItem[]> { async getChildren(element?: GithubLocalActionsTreeItem): Promise<GithubLocalActionsTreeItem[]> {
if (element) { if (element) {
return element.getChildren(); return element.getChildren();

View File

@@ -1,5 +1,6 @@
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode"; import { ThemeIcon, TreeItem, TreeItemCollapsibleState, WorkspaceFolder } from "vscode";
import { act } from "../../extension"; import { act } from "../../extension";
import { SettingsManager } from "../../settingsManager";
import { StorageKey } from "../../storageManager"; import { StorageKey } from "../../storageManager";
import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem";
import VariableTreeItem from "./variable"; import VariableTreeItem from "./variable";
@@ -16,7 +17,7 @@ export default class VariablesTreeItem extends TreeItem implements GithubLocalAc
async getChildren(): Promise<GithubLocalActionsTreeItem[]> { async getChildren(): Promise<GithubLocalActionsTreeItem[]> {
const items: GithubLocalActionsTreeItem[] = []; const items: GithubLocalActionsTreeItem[] = [];
const variables = await act.settingsManager.getSetting(this.workspaceFolder, /\${{\s*vars\.(.*?)(?:\s*==\s*(.*?))?\s*}}/g, StorageKey.Variables); const variables = await act.settingsManager.getSetting(this.workspaceFolder, SettingsManager.variablesRegExp, StorageKey.Variables);
for (const variable of variables) { for (const variable of variables) {
items.push(new VariableTreeItem(this.workspaceFolder, variable)); items.push(new VariableTreeItem(this.workspaceFolder, variable));
} }