Skip to content

Commit a2dc480

Browse files
authored
Merge pull request #188 from solidify/more-modal-samples
More modal samples
2 parents a383a2b + db9810e commit a2dc480

File tree

4 files changed

+110
-43
lines changed

4 files changed

+110
-43
lines changed

src/Samples/backlog-toolpane/backlog-toolpane.tsx

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,68 +13,89 @@ import { CommonServiceIds, IProjectPageService } from "azure-devops-extension-ap
1313
interface IBacklogToolPane {
1414
projectContext: any;
1515
selectedWorkItems: any[];
16+
teamContext: any;
1617
}
1718

1819
class BacklogToolPane extends React.Component<{}, IBacklogToolPane> {
1920
constructor(props: {}) {
20-
super(props);
21-
this.state = { projectContext: undefined, selectedWorkItems: [] };
21+
super(props);
22+
this.state = { projectContext: undefined, selectedWorkItems: [], teamContext: undefined };
2223
}
2324

2425
public componentDidMount() {
25-
try {
26-
27-
console.log("Component did mount, register objects...");
28-
SDK.register("backlogPanelObject", {
29-
workItemSelectionChanged: (workItemInfos: any) => {
30-
console.log("workItemSelectionChanged", workItemInfos);
31-
this.setState({ selectedWorkItems: workItemInfos });
32-
}
33-
});
26+
try {
3427

28+
console.log("Component did mount, register objects...");
3529
console.log("Initializing SDK...");
3630
SDK.init();
37-
31+
3832
SDK.ready().then(() => {
33+
console.log(SDK.getContributionId());
3934
console.log("SDK is ready, loading project context...");
40-
this.loadProjectContext();
35+
this.loadProjectContext();
36+
this.loadTeamContext();
4137
}).catch((error) => {
4238
console.error("SDK ready failed: ", error);
4339
});
40+
41+
SDK.register("backlogPanelObject", () => {
42+
return {
43+
workItemSelectionChanged: (workItems:any) => {
44+
this.setState({ selectedWorkItems: workItems });
45+
}
46+
}
47+
});
48+
4449
} catch (error) {
4550
console.error("Error during SDK initialization or project context loading: ", error);
4651
}
4752
}
4853

4954
public render(): JSX.Element {
5055
return (
51-
<Page className="sample-hub flex-grow">
52-
<div className="page-content sample-margin">
53-
<div className="webcontext-section">
54-
<h2>Project Context:</h2>
55-
<pre>{JSON.stringify(this.state.projectContext, null, 2)}</pre>
56+
<Page className="sample-hub flex-grow">
57+
<Header title="Backlog Toolpane" />
58+
<div className="page-content sample-margin">
59+
<div className="webcontext-section">
60+
<h2>Project Context:</h2>
61+
<pre>{JSON.stringify(this.state.projectContext, null, 2)}</pre>
62+
</div>
63+
<div>
64+
<h2>Team Context:</h2>
65+
<pre>{JSON.stringify(this.state.teamContext, null, 2)}</pre>
66+
</div>
67+
<div>
68+
<h2>Selected Work Items:</h2>
69+
<pre>{JSON.stringify(this.state.selectedWorkItems, null, 2)}</pre>
70+
</div>
5671
</div>
57-
<div>
58-
<h2>Selected Work Items:</h2>
59-
<pre>{JSON.stringify(this.state.selectedWorkItems, null, 2)}</pre>
60-
</div>
61-
</div>
6272
</Page>
6373
);
64-
}
74+
}
75+
6576

6677
private async loadProjectContext(): Promise<void> {
67-
try {
78+
try {
6879
const client = await SDK.getService<IProjectPageService>(CommonServiceIds.ProjectPageService);
6980
const context = await client.getProject();
70-
71-
this.setState({ projectContext: context });
81+
82+
this.setState({ projectContext: context });
7283

7384
SDK.notifyLoadSucceeded();
7485
} catch (error) {
7586
console.error("Failed to load project context: ", error);
7687
}
77-
}
88+
}
89+
90+
private async loadTeamContext(): Promise<void> {
91+
try {
92+
const teamContext = SDK.getConfiguration().team;
93+
this.setState({ teamContext: teamContext });
94+
}
95+
catch (error) {
96+
console.error("Failed to get team context: ", error);
97+
}
98+
}
7899
}
79100

80101
showRootComponent(<BacklogToolPane />);

src/Samples/work-hub-group/work-hub-group.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,8 @@
1515
}
1616
}
1717
}
18-
]
18+
],
19+
"scopes": [
20+
"vso.work"
21+
]
1922
}

src/Samples/work-hub-group/work-hub-group.tsx

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,30 @@ import { Header } from "azure-devops-ui/Header";
77
import { Page } from "azure-devops-ui/Page";
88

99
import { showRootComponent } from "../../Common";
10-
import { CommonServiceIds, IProjectPageService } from "azure-devops-extension-api";
10+
import { CommonServiceIds, IProjectPageService, getClient } from "azure-devops-extension-api";
11+
import { WorkItemTrackingRestClient } from "azure-devops-extension-api/WorkItemTracking";
1112

1213
interface IWorkHubGroup {
1314
projectContext: any;
15+
assignedWorkItems: any[];
1416
}
1517

16-
class WorkHubGroup extends React.Component<{}, IWorkHubGroup> {
18+
class WorkHubGroup extends React.Component<{}, IWorkHubGroup> {
1719

1820
constructor(props: {}) {
1921
super(props);
20-
this.state = { projectContext: undefined };
22+
this.state = { projectContext: undefined, assignedWorkItems: [] };
2123
}
2224

2325
public componentDidMount() {
24-
try {
26+
try {
2527
console.log("Component did mount, initializing SDK...");
2628
SDK.init();
27-
29+
2830
SDK.ready().then(() => {
2931
console.log("SDK is ready, loading project context...");
3032
this.loadProjectContext();
33+
this.loadAssignedWorkItems();
3134
}).catch((error) => {
3235
console.error("SDK ready failed: ", error);
3336
});
@@ -40,28 +43,60 @@ class WorkHubGroup extends React.Component<{}, IWorkHubGroup> {
4043
return (
4144
<Page className="sample-hub flex-grow">
4245
<Header title="Custom Work Hub" />
43-
<div className="page-content">
46+
<div className="page-content">
4447
<div className="webcontext-section">
4548
<h2>Project Context:</h2>
4649
<pre>{JSON.stringify(this.state.projectContext, null, 2)}</pre>
4750
</div>
51+
<div className="webcontext-section">
52+
<h2>Work Items Assigned To Me:</h2>
53+
<pre>{JSON.stringify(this.state.assignedWorkItems, null, 2)}</pre>
54+
</div>
4855
</div>
4956
</Page>
5057
);
51-
}
58+
}
5259

5360
private async loadProjectContext(): Promise<void> {
54-
try {
61+
try {
5562
const client = await SDK.getService<IProjectPageService>(CommonServiceIds.ProjectPageService);
5663
const context = await client.getProject();
57-
58-
this.setState({ projectContext: context });
64+
65+
this.setState({ projectContext: context });
5966

6067
SDK.notifyLoadSucceeded();
6168
} catch (error) {
6269
console.error("Failed to load project context: ", error);
6370
}
6471
}
72+
73+
private async loadAssignedWorkItems(): Promise<void> {
74+
try {
75+
const client = getClient(WorkItemTrackingRestClient);
76+
77+
const wiqlQuery = {
78+
query:`
79+
SELECT [System.Id], [System.Title]
80+
FROM WorkItems
81+
WHERE [System.AssignedTo] = @Me
82+
ORDER BY [System.ChangedDate] DESC
83+
`
84+
};
85+
86+
const queryResult = await client.queryByWiql(wiqlQuery);
87+
const workItemIds = queryResult.workItems.map((wi) => wi.id);
88+
89+
if (workItemIds.length > 0) {
90+
const workItems = await client.getWorkItems(workItemIds);
91+
this.setState({ assignedWorkItems: workItems });
92+
}
93+
else {
94+
this.setState({ assignedWorkItems: [] });
95+
}
96+
} catch (error) {
97+
console.error("Failed to load assigned work items: ", error);
98+
}
99+
}
65100
}
66101

67102
showRootComponent(<WorkHubGroup />);
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
import "es6-promise/auto";
22
import * as SDK from "azure-devops-extension-sdk";
3+
import { CommonServiceIds, IHostPageLayoutService } from "azure-devops-extension-api";
34

45
SDK.register("work-item-query-results-toolbar-menu", () => {
56
return {
6-
execute: async (context: any) => {
7-
alert("Custom query results toolbar action!");
8-
console.log(context);
7+
execute: async (context: any) => {
8+
const dialogService = await SDK.getService<IHostPageLayoutService>(CommonServiceIds.HostPageLayoutService);
9+
dialogService.openPanel(SDK.getExtensionContext().id + ".panel-content", {
10+
title: "query-results-toolbar-menu",
11+
description: "Project-and Queries context",
12+
configuration: {
13+
context: context,
14+
}
15+
})
16+
console.log(context);
17+
}
918
}
10-
}
1119
});
1220

1321
SDK.init();

0 commit comments

Comments
 (0)