Skip to content

Commit 8d2dc89

Browse files
Fix Edit Tags and View Properties commands for resource groups (#475)
Fixes #468
1 parent 0ea53d6 commit 8d2dc89

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

src/commands/tags/TagFileSystem.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ export interface ITagsModel extends AzExtTreeFileSystemItem {
2929
}
3030

3131
export class ResourceTags implements ITagsModel {
32-
constructor(private readonly resource: AzureResource) { }
32+
constructor(private readonly resource: AzureResource) {
33+
this.displayType = resource.resourceGroup ? 'resource' : 'resource group';
34+
}
3335

3436
readonly id: string = this.resource.id;
3537
readonly subscription: AzureSubscription = this.resource.subscription;
3638

3739
readonly displayName: string = this.resource.name;
38-
readonly displayType: ITagsModel['displayType'] = 'resource';
40+
readonly displayType: ITagsModel['displayType'];
3941

4042
cTime: number;
4143
mTime: number;
@@ -44,9 +46,15 @@ export class ResourceTags implements ITagsModel {
4446
return await callWithTelemetryAndErrorHandling('getTags', async (context): Promise<Tags | undefined> => {
4547
const subscriptionContext = createSubscriptionContext(this.resource.subscription);
4648
const client = await createResourceClient([context, subscriptionContext]);
47-
// use list because getById is only available for certain api versions and locations
48-
const resources = await uiUtils.listAllIterator(client.resources.listByResourceGroup(nonNullValue(this.resource.resourceGroup)));
49-
return resources.find(r => r.id === this.id)?.tags;
49+
50+
if (this.resource.resourceGroup) {
51+
// use list because getById is only available for certain api versions and locations
52+
const resources = await uiUtils.listAllIterator(client.resources.listByResourceGroup(nonNullValue(this.resource.resourceGroup)));
53+
return resources.find(r => r.id === this.id)?.tags;
54+
} else {
55+
const resourceGroup = await client.resourceGroups.get(nonNullValue(this.resource.name));
56+
return resourceGroup.tags;
57+
}
5058
}) ?? {};
5159
}
5260
}

src/tree/v2/azure/AzureResourceGroupingManager.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { AzExtResourceType, TreeItemIconPath } from '@microsoft/vscode-azext-utils';
6+
import { AzExtResourceType, nonNullValue, TreeItemIconPath } from '@microsoft/vscode-azext-utils';
77
import { AzureResource } from '@microsoft/vscode-azext-utils/hostapi.v2';
88
import * as vscode from 'vscode';
99
import { azureExtensions } from '../../../azureExtensions';
@@ -67,7 +67,7 @@ export class AzureResourceGroupingManager extends vscode.Disposable {
6767
}
6868
}
6969

70-
private groupBy(parent: ResourceGroupsItem, context: ResourceGroupsTreeContext, resources: AzureResource[], keySelector: (resource: AzureResource) => string, labelSelector: (key: string) => string, iconSelector: (key: string) => TreeItemIconPath | undefined, initialGrouping?: { [key: string]: AzureResource[] }, contextValues?: string[], resourceTypeSelector?: (key: string) => AzExtResourceType | undefined): GroupingItem[] {
70+
private groupBy(parent: ResourceGroupsItem, context: ResourceGroupsTreeContext, resources: AzureResource[], keySelector: (resource: AzureResource) => string, labelSelector: (key: string) => string, iconSelector: (key: string) => TreeItemIconPath | undefined, initialGrouping?: { [key: string]: AzureResource[] }, contextValues?: string[], resourceTypeSelector?: (key: string) => AzExtResourceType | undefined, resourceGroupSelector?: (key: string) => AzureResource): GroupingItem[] {
7171
initialGrouping = initialGrouping ?? {};
7272

7373
const map = resources.reduce(
@@ -93,7 +93,8 @@ export class AzureResourceGroupingManager extends vscode.Disposable {
9393
labelSelector(key),
9494
map[key],
9595
resourceTypeSelector?.(key),
96-
parent);
96+
parent,
97+
resourceGroupSelector?.(key));
9798
});
9899
}
99100

@@ -142,7 +143,9 @@ export class AzureResourceGroupingManager extends vscode.Disposable {
142143
key => key,
143144
() => treeUtils.getIconPath('resourceGroup'),
144145
initialGrouping,
145-
['azureResourceGroup']);
146+
['azureResourceGroup'],
147+
undefined,
148+
key => nonNullValue(resourceGroups.find(resource => resource.name.toLowerCase() === key.toLowerCase())));
146149

147150
return groupedResources;
148151
}

src/tree/v2/azure/GroupingItem.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
import { OpenInPortalOptions } from '@microsoft/vscode-azext-azureutils';
77
import { AzExtResourceType, createContextValue, ISubscriptionContext, TreeItemIconPath } from '@microsoft/vscode-azext-utils';
8-
import { AzureResource, AzureResourceBranchDataProvider, AzureResourceModel, AzureSubscription } from '@microsoft/vscode-azext-utils/hostapi.v2';
8+
import { AzureResource, AzureResourceBranchDataProvider, AzureResourceModel, AzureSubscription, ViewPropertiesModel } from '@microsoft/vscode-azext-utils/hostapi.v2';
99
import * as vscode from 'vscode';
10+
import { ITagsModel, ResourceTags } from '../../../commands/tags/TagFileSystem';
1011
import { getIconPath } from '../../../utils/azureUtils';
1112
import { BranchDataItemOptions } from '../BranchDataProviderItem';
1213
import { ResourceGroupsItem } from '../ResourceGroupsItem';
@@ -25,6 +26,9 @@ function createPortalUrl(subscription: AzureSubscription, id: string, options?:
2526
export class GroupingItem implements ResourceGroupsItem {
2627
private description: string | undefined;
2728

29+
readonly viewProperties?: ViewPropertiesModel;
30+
readonly tagsModel?: ITagsModel;
31+
2832
constructor(
2933
public readonly context: ResourceGroupsTreeContext,
3034
private readonly resourceItemFactory: ResourceItemFactory<AzureResource>,
@@ -34,8 +38,17 @@ export class GroupingItem implements ResourceGroupsItem {
3438
public readonly label: string,
3539
public readonly resources: AzureResource[],
3640
public readonly resourceType: AzExtResourceType | undefined,
37-
public readonly parent?: ResourceGroupsItem
38-
) { }
41+
public readonly parent?: ResourceGroupsItem,
42+
resourceGroup?: AzureResource,
43+
) {
44+
if (resourceGroup) {
45+
this.tagsModel = new ResourceTags(resourceGroup);
46+
this.viewProperties = {
47+
label: resourceGroup.name,
48+
data: resourceGroup.raw
49+
};
50+
}
51+
}
3952

4053
// Needed for context menu commands on the group tree items. E.g. "Create..."
4154
public get subscription(): ISubscriptionContext {
@@ -98,8 +111,8 @@ export class GroupingItem implements ResourceGroupsItem {
98111
}
99112
}
100113

101-
export type GroupingItemFactory = (context: ResourceGroupsTreeContext, contextValues: string[] | undefined, iconPath: TreeItemIconPath | undefined, label: string, resources: AzureResource[], resourceType: AzExtResourceType | undefined, parent: ResourceGroupsItem) => GroupingItem;
114+
export type GroupingItemFactory = (context: ResourceGroupsTreeContext, contextValues: string[] | undefined, iconPath: TreeItemIconPath | undefined, label: string, resources: AzureResource[], resourceType: AzExtResourceType | undefined, parent: ResourceGroupsItem, resourceGroup?: AzureResource) => GroupingItem;
102115

103116
export function createGroupingItemFactory(resourceItemFactory: ResourceItemFactory<AzureResource>, branchDataProviderFactory: BranchDataProviderFactory): GroupingItemFactory {
104-
return (context, contextValues, iconPath, label, resources, resourceType, parent) => new GroupingItem(context, resourceItemFactory, branchDataProviderFactory, contextValues, iconPath, label, resources, resourceType, parent);
117+
return (context, contextValues, iconPath, label, resources, resourceType, parent, resourceGroup) => new GroupingItem(context, resourceItemFactory, branchDataProviderFactory, contextValues, iconPath, label, resources, resourceType, parent, resourceGroup);
105118
}

0 commit comments

Comments
 (0)