Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 23 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "configcat-feature-flags",
"displayName": "ConfigCat Feature Flags",
"description": "ConfigCat Visual Studio Code extension to manage feature flags from Visual Studio Code.",
"version": "2.3.0-1",
"version": "2.3.0-2",
"publisher": "ConfigCat",
"repository": "https://github.com/configcat/vscode-extension-configcat",
"preview": false,
Expand Down Expand Up @@ -32,7 +32,8 @@
"onCommand:configcat.configs.add",
"onCommand:configcat.configs.refresh",
"onCommand:configcat.settings.refresh",
"onCommand:configcat.settings.add"
"onCommand:configcat.settings.add",
"onCommand:configcat.settings.search"
],
"main": "./out/extension.js",
"contributes": {
Expand Down Expand Up @@ -64,6 +65,11 @@
"type": "boolean",
"default": true,
"markdownDescription": "Use Web-View authorization instead of the VS Code commands option."
},
"configcat.openAutomaticallySearchedFeatureFlag": {
"type": "boolean",
"default": true,
"markdownDescription": "Automatically open the Feature Flag after searching it."
}
}
},
Expand Down Expand Up @@ -180,6 +186,12 @@
"title": "Add Feature Flag",
"icon": "$(add)"
},
{
"command": "configcat.settings.search",
"category": "ConfigCat",
"title": "Search Feature Flag",
"icon": "$(filter)"
},
{
"command": "configcat.settings.findUsages",
"category": "ConfigCat",
Expand Down Expand Up @@ -238,6 +250,10 @@
"command": "configcat.settings.add",
"when": "configcat:initialized && configcat:authenticated && configcat:connected"
},
{
"command": "configcat.settings.search",
"when": "configcat:initialized && configcat:authenticated && configcat:connected"
},
{
"command": "configcat.settings.openInDashboard",
"when": "false"
Expand Down Expand Up @@ -267,6 +283,11 @@
"when": "configcat:initialized && configcat:authenticated && configcat:connected && view == configcat.settings",
"group": "navigation"
},
{
"command": "configcat.settings.search",
"when": "configcat:initialized && configcat:authenticated && configcat:connected && view == configcat.settings",
"group": "navigation"
},
{
"command": "configcat.settings.openInDashboard",
"when": "configcat:initialized && configcat:authenticated && configcat:connected && view == configcat.settings",
Expand Down
2 changes: 2 additions & 0 deletions src/configuration/workspace-configuration-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,15 @@ export class WorkspaceConfigurationProvider {
const publicApiBaseUrl = config.get("publicApiBaseUrl");
const dashboardBaseUrl = config.get("dashboardBaseUrl");
const webAuthorizationEnabled = config.get("webAuthorizationEnabled") ?? true;
const openAutomaticallySearchedFeatureFlag = config.get("openAutomaticallySearchedFeatureFlag") ?? true;

return Promise.resolve({
productId: String(productId),
configId: String(configId),
publicApiBaseUrl: String(publicApiBaseUrl),
dashboardBaseUrl: String(dashboardBaseUrl),
webAuthorizationEnabled: Boolean(webAuthorizationEnabled),
openAutomaticallySearchedFeatureFlag: Boolean(openAutomaticallySearchedFeatureFlag),
});
}

Expand Down
1 change: 1 addition & 0 deletions src/configuration/workspace-configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export interface ConfigCatWorkspaceConfiguration {
publicApiBaseUrl: string;
dashboardBaseUrl: string;
webAuthorizationEnabled: boolean;
openAutomaticallySearchedFeatureFlag: boolean;
}
27 changes: 27 additions & 0 deletions src/inputs/setting-search-input.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { SettingModel } from "configcat-publicapi-node-client";
import * as vscode from "vscode";

export class SettingSearchInput {

static async searchSettings(settings: SettingModel[]): Promise<SettingModel> {

const pickItems = settings.map(p => {
return { label: p.key || "", description: p.name, id: p.settingId };
});

const pick = await vscode.window.showQuickPick(pickItems, {
canPickMany: false,
placeHolder: "Search Feature Flag ",
matchOnDescription: true,
});

if (!pick?.id) {
return Promise.reject(new Error("No selected setting."));
}
const setting = settings.find(s => s.settingId === pick.id);
if (!setting) {
return Promise.reject(new Error("Selected setting not found."));
}
return Promise.resolve(setting);
}
}
55 changes: 50 additions & 5 deletions src/settings/setting-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import { ConfigCatWorkspaceConfiguration } from "../configuration/workspace-conf
import { WorkspaceConfigurationProvider } from "../configuration/workspace-configuration-provider";
import { handleError } from "../error-handler";
import { EnvironmentInput } from "../inputs/environment-input";
import { SettingSearchInput } from "../inputs/setting-search-input";
import { PublicApiService } from "../public-api/public-api.service";
import { CreateSettingWebPanel } from "../webpanel/create-setting-webpanel";
import { SettingWebPanel } from "../webpanel/setting-webpanel";

export class SettingProvider implements vscode.TreeDataProvider<Resource> {

treeView: vscode.TreeView<Resource | undefined > | null = null;
treeView: vscode.TreeView<Resource | undefined> | null = null;
selectedSetting: string | null = null;

constructor(private readonly context: vscode.ExtensionContext,
Expand Down Expand Up @@ -102,9 +103,7 @@ export class SettingProvider implements vscode.TreeDataProvider<Resource> {

const settingsService = this.publicApiService.createSettingsService(publicApiConfiguration, workspaceConfiguration.publicApiBaseUrl);
return settingsService.getSettings(workspaceConfiguration.configId).then(settings => {
const items = settings.data.map((s) => new Resource(String(s.settingId), s.name ?? "",
s.key ?? "", s.hint ?? "",
vscode.TreeItemCollapsibleState.None));
const items = settings.data.map((s) => this.createResourceFromSetting(s));
statusBar.hide();
if (this.selectedSetting) {
const selectedResource = items.find(resource => resource?.resourceId === this.selectedSetting);
Expand All @@ -128,6 +127,12 @@ export class SettingProvider implements vscode.TreeDataProvider<Resource> {
});
}

private createResourceFromSetting(setting: SettingModel): Resource {
return new Resource(String(setting.settingId), setting.name ?? "",
setting.key ?? "", setting.hint ?? "",
vscode.TreeItemCollapsibleState.None);
}

async openInDashboardCommand(resource: Resource) {
this.selectSettingInTreeView(resource);
let workspaceConfiguration: ConfigCatWorkspaceConfiguration | null;
Expand Down Expand Up @@ -183,6 +188,45 @@ export class SettingProvider implements vscode.TreeDataProvider<Resource> {
return new CreateSettingWebPanel(this.context, authenticationConfiguration, workspaceConfiguration, productModel.name, configModel.name, this);
}

async searchSettingsCommand() {
let authenticationConfiguration = null;
let workspaceConfiguration = null;
try {
authenticationConfiguration = await this.authenticationProvider.getAuthenticationConfiguration();
workspaceConfiguration = await this.workspaceConfigurationProvider.getWorkspaceConfiguration();
} catch (error: unknown) {
console.log(error);
return;
}
if (!authenticationConfiguration
|| !workspaceConfiguration?.publicApiBaseUrl
|| !workspaceConfiguration.configId
|| !workspaceConfiguration.productId) {
return;
}

const settingsService = this.publicApiService.createSettingsService(authenticationConfiguration, workspaceConfiguration.publicApiBaseUrl);
const settings = await settingsService.getSettings(workspaceConfiguration.configId);

let setting: SettingModel;
try {
setting = await SettingSearchInput.searchSettings(settings.data);
} catch (error: unknown) {
console.log(error);
return;
}

if (!setting) {
return;
}

this.selectSettingInTreeView(this.createResourceFromSetting(setting));
if (workspaceConfiguration.openAutomaticallySearchedFeatureFlag) {
await this.openSettingPanel(setting.settingId);
}

}

copyToClipboardCommand(resource: Resource) {
if (!resource) {
return;
Expand Down Expand Up @@ -303,9 +347,10 @@ export class SettingProvider implements vscode.TreeDataProvider<Resource> {
(resource: Resource) => this.findUsageCommand(resource)));
this.context.subscriptions.push(vscode.commands.registerCommand("configcat.settings.values",
(resource: Resource) => this.openSettingPanelCommand(resource)));

this.context.subscriptions.push(vscode.commands.registerCommand("configcat.settings.add",
async () => this.openCreatePanelCommand()));
this.context.subscriptions.push(vscode.commands.registerCommand("configcat.settings.search",
async () => this.searchSettingsCommand()));
this.context.subscriptions.push(
vscode.workspace.onDidChangeConfiguration(async e => {
if (e.affectsConfiguration(WorkspaceConfigurationProvider.configurationKey)) {
Expand Down