create tag and pick folder
This commit is contained in:
parent
83091e74bb
commit
1a115dfa68
4 changed files with 116 additions and 5 deletions
|
@ -555,6 +555,11 @@
|
||||||
"command": "vscode-appwrite.openFunctionSettingsInBrowser",
|
"command": "vscode-appwrite.openFunctionSettingsInBrowser",
|
||||||
"when": "viewItem =~ /^functionSettings$/",
|
"when": "viewItem =~ /^functionSettings$/",
|
||||||
"group": "inline"
|
"group": "inline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "vscode-appwrite.CreateTag",
|
||||||
|
"when": "viewItem =~ /^tags$/",
|
||||||
|
"group": "inline"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"explorer/context": [
|
"explorer/context": [
|
||||||
|
|
|
@ -1,10 +1,29 @@
|
||||||
import { Uri } from "vscode";
|
import { ProgressLocation, Uri, window } from "vscode";
|
||||||
import { functionsClient, storageClient } from "../../client";
|
import { functionsClient, storageClient } from "../../client";
|
||||||
import { getTarReadStream } from "../../utils/tar";
|
import { getTarReadStream } from "../../utils/tar";
|
||||||
import { ext } from "../../extensionVariables";
|
import { ext } from "../../extensionVariables";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
export async function createTag(folder: Uri): Promise<void> {
|
import { TagsTreeItem } from "../../tree/functions/tags/TagsTreeItem";
|
||||||
const tarFilePath = await getTarReadStream(folder);
|
import { selectWorkspaceFolder } from "../../utils/workspace";
|
||||||
|
export async function createTag(item: TagsTreeItem | Uri): Promise<void> {
|
||||||
|
if (item instanceof Uri) {
|
||||||
|
window.withProgress({ location: ProgressLocation.Notification, title: "Creating tag..." }, async (progress, token) => {
|
||||||
|
await createTagFromUri(item);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item instanceof TagsTreeItem) {
|
||||||
|
const folder = await selectWorkspaceFolder("Select folder of your function code.");
|
||||||
|
console.log(folder);
|
||||||
|
window.withProgress({ location: ProgressLocation.Notification, title: "Creating tag..." }, async (progress, token) => {
|
||||||
|
await createTagFromUri(Uri.parse(folder));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createTagFromUri(uri: Uri): Promise<void> {
|
||||||
|
const tarFilePath = await getTarReadStream(uri);
|
||||||
if (functionsClient === undefined) {
|
if (functionsClient === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { ThemeIcon, TreeItem } from "vscode";
|
import { MarkdownString, ThemeIcon, TreeItem } from "vscode";
|
||||||
import { Tag } from '../../../appwrite';
|
import { Tag } from '../../../appwrite';
|
||||||
|
import { msToDate } from '../../../utils/date';
|
||||||
import { TagsTreeItem } from './TagsTreeItem';
|
import { TagsTreeItem } from './TagsTreeItem';
|
||||||
|
|
||||||
export class TagTreeItem extends TreeItem {
|
export class TagTreeItem extends TreeItem {
|
||||||
|
@ -7,8 +8,10 @@ export class TagTreeItem extends TreeItem {
|
||||||
super(tag.$id);
|
super(tag.$id);
|
||||||
const func = parent.parent.func;
|
const func = parent.parent.func;
|
||||||
const active = func.tag === tag.$id;
|
const active = func.tag === tag.$id;
|
||||||
this.label = `${tag.$id}${active ? ' (Active)' : ''}`;
|
this.label = `${msToDate(tag.dateCreated)}${active ? ' (Active)' : ''}`;
|
||||||
|
this.description = tag.$id;
|
||||||
this.iconPath = new ThemeIcon(active ? 'circle-filled' : 'circle-outline');
|
this.iconPath = new ThemeIcon(active ? 'circle-filled' : 'circle-outline');
|
||||||
this.contextValue = `tag${active ? '_active' : ''}`;
|
this.contextValue = `tag${active ? '_active' : ''}`;
|
||||||
|
this.tooltip = new MarkdownString(`ID: ${tag.$id} \nCreated: ${msToDate(tag.dateCreated)} \nCommand: ${tag.command} \nSize: ${tag.size}B`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
84
src/utils/workspace.ts
Normal file
84
src/utils/workspace.ts
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as path from "path";
|
||||||
|
import * as vscode from "vscode";
|
||||||
|
import { QuickPickItem } from 'vscode';
|
||||||
|
|
||||||
|
export interface IAzureQuickPickItem<T = undefined> extends QuickPickItem {
|
||||||
|
/**
|
||||||
|
* An optional id to uniquely identify this item across sessions, used in persisting previous selections
|
||||||
|
* If not specified, a hash of the label will be used
|
||||||
|
*/
|
||||||
|
id?: string;
|
||||||
|
|
||||||
|
data: T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to use when this item is picked, instead of returning the pick
|
||||||
|
* Only applies when used as part of an `AzureWizard`
|
||||||
|
* This is not compatible with `canPickMany`
|
||||||
|
*/
|
||||||
|
onPicked?: () => void | Promise<void>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The group that this pick belongs to. Set `IAzureQuickPickOptions.enableGrouping` for this property to take effect
|
||||||
|
* Only applies when used as part of an `AzureWizard`
|
||||||
|
*/
|
||||||
|
group?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optionally used to suppress persistence for this item, defaults to `false`
|
||||||
|
*/
|
||||||
|
suppressPersistence?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function selectWorkspaceFolder(placeHolder: string): Promise<string> {
|
||||||
|
return await selectWorkspaceItem(placeHolder, {
|
||||||
|
canSelectFiles: false,
|
||||||
|
canSelectFolders: true,
|
||||||
|
canSelectMany: false,
|
||||||
|
defaultUri:
|
||||||
|
vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0
|
||||||
|
? vscode.workspace.workspaceFolders[0].uri
|
||||||
|
: undefined,
|
||||||
|
openLabel: "Select",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function selectWorkspaceFile(placeHolder: string, fileExtensions?: string[]): Promise<string> {
|
||||||
|
const filters: { [name: string]: string[] } = {};
|
||||||
|
if (fileExtensions) {
|
||||||
|
filters.Artifacts = fileExtensions;
|
||||||
|
}
|
||||||
|
return await selectWorkspaceItem(placeHolder, {
|
||||||
|
canSelectFiles: true,
|
||||||
|
canSelectFolders: false,
|
||||||
|
canSelectMany: false,
|
||||||
|
openLabel: "Select",
|
||||||
|
filters: filters,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function selectWorkspaceItem(placeHolder: string, options: vscode.OpenDialogOptions): Promise<string> {
|
||||||
|
let folder: IAzureQuickPickItem<string | undefined> | undefined;
|
||||||
|
if (vscode.workspace.workspaceFolders) {
|
||||||
|
const folderPicks: IAzureQuickPickItem<string | undefined>[] = await Promise.all(
|
||||||
|
vscode.workspace.workspaceFolders.map((f: vscode.WorkspaceFolder) => {
|
||||||
|
return { label: path.basename(f.uri.fsPath), description: f.uri.fsPath, data: f.uri.fsPath };
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
folderPicks.push({ label: "$(file-directory) Browse...", description: "", data: undefined });
|
||||||
|
folder = await vscode.window.showQuickPick(folderPicks, { placeHolder });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (folder?.data) {
|
||||||
|
return folder.data;
|
||||||
|
} else {
|
||||||
|
return (await vscode.window.showOpenDialog(options))?.[0].fsPath ?? '';
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue