├── .gitignore ├── LICENSE ├── README.md └── public ├── azure-devops-extension.json ├── config.md ├── details.md ├── img ├── config.png ├── edtro-logo.png ├── inetum-realdolmen-becomes.png ├── kanban-iterations.png ├── kanban-zoom.png ├── kanban.png ├── logo.png ├── notassigned-user.png ├── taskboard-arrows.png ├── taskboard-settings.png ├── taskboard-tree.png ├── taskboard.png └── youtube.png ├── imports.md ├── privacy.md └── tests.md /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /.vs/slnx.sqlite 6 | /.vs/EdTro.AzureDevOps.Extensions.querybasedboards/v16/.suo 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Edward Trouw, Inetum-Realdolmen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EdTro.AzureDevOps.Extensions.querybasedboards 2 | Query Based Boards enables a user to visualize the result of work item queries as a board and track the dependencies. 3 | 4 | This extension for Azure DevOps Services/Server is available on the markteplace [here](https://marketplace.visualstudio.com/items?itemName=realdolmen.EdTro-AzureDevOps-Extensions-QueryBasedBoards-Public) 5 | 6 | View the detail documentation [here](public/details.md) 7 | 8 | Please feel free to take a look at the [YouTube channel](https://www.youtube.com/channel/UCPhOzbTeOeNiy3-sIgE0U5g) that I have created for this extension. 9 | 10 | ## Information 11 | This project is bootstrapped with [Create React App](https://github.com/facebook/create-react-app) and has the following dependencies: 12 | * azure-devops-extension-sdk, see details [here](https://github.com/Microsoft/azure-devops-extension-sdk) 13 | * azure-devops-extension-api, see detals [here](https://github.com/Microsoft/azure-devops-extension-api) 14 | * azure-devops-ui (this is the new Formula Design System), see information [here](https://developer.microsoft.com/en-us/azure-devops/) 15 | * react-dnd, see details [here](https://github.com/react-dnd/react-dnd/) and for a tutorial [here](https://react-dnd.github.io/react-dnd/docs/tutorial) 16 | * react-dnd-multi-backend, see details [here](https://github.com/LouisBrunner/dnd-multi-backend/tree/master/packages/react-dnd-multi-backend) 17 | * some components that where missing in the Formula Design System, I have used from Fluent UI, see details [here](https://developer.microsoft.com/en-us/fluentui) 18 | * lodash, see details [here](https://github.com/lodash/lodash) 19 | 20 | Many thanks to these teams and people. 21 | 22 | > NOTE: this the second version of this extension. The first version was created by a former colleague of ours, all the credits for coming up with this idea is going to him! This version is however rebuild completely, based on the new Azure DevOps extension libraries and the new Formula Design System. 23 | > The old and original project is still available on the marketplace [here](https://marketplace.visualstudio.com/items?itemName=realdolmen.querybasedboards) 24 | 25 | Full list of dependencies: 26 | ``` json 27 | { 28 | "dependencies": { 29 | "@testing-library/jest-dom": "^5.16.5", 30 | "@testing-library/react": "^12.1.5", 31 | "@testing-library/user-event": "^13.5.0", 32 | "@types/jest": "^27.5.2", 33 | "@types/lodash": "^4.14.191", 34 | "@types/node": "^16.18.11", 35 | "@types/pluralize": "^0.0.29", 36 | "@types/react": "^16.8.6", 37 | "@types/react-dnd-html5-backend": "^3.0.2", 38 | "@types/react-dnd-multi-backend": "^5.0.0", 39 | "@types/react-dnd-touch-backend": "^0.5.0", 40 | "@types/react-dom": "^16.8.6", 41 | "azure-devops-extension-api": "^1.158.0", 42 | "azure-devops-extension-sdk": "^2.0.11", 43 | "azure-devops-ui": "^2.167.53", 44 | "lodash": "^4.17.21", 45 | "moment": "^2.29.4", 46 | "office-ui-fabric-react": "^7.203.0", 47 | "pluralize": "^8.0.0", 48 | "react": "^16.8.6", 49 | "react-dnd": "^10.0.2", 50 | "react-dnd-html5-backend": "^10.0.2", 51 | "react-dnd-multi-backend": "^5.0.1", 52 | "react-dnd-touch-backend": "^10.0.2", 53 | "react-dom": "^16.8.6", 54 | "react-scripts": "5.0.1", 55 | "typescript": "^4.9.4", 56 | "web-vitals": "^2.1.4" 57 | }, 58 | "devDependencies": { 59 | "sass": "^1.57.1" 60 | } 61 | } 62 | ``` 63 | -------------------------------------------------------------------------------- /public/azure-devops-extension.json: -------------------------------------------------------------------------------- 1 | { 2 | //"baseUri": "", 3 | "manifestVersion": 1, 4 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards", 5 | "publisher": "EdTro", 6 | "version": "0.1.0", 7 | "name": "Query Based Boards", 8 | "description": "Query Based Boards enables a user to visualize the result of work item queries as a board and track the dependencies", 9 | "branding": { 10 | "color": "rgb(217, 217, 217)", 11 | "theme": "light" 12 | }, 13 | "categories": [ 14 | "Azure Boards" 15 | ], 16 | "demands": [ 17 | "api-version/5.0" 18 | ], 19 | "targets": [ 20 | { 21 | "id": "Microsoft.VisualStudio.Services" 22 | } 23 | ], 24 | "tags": [ 25 | "Board", 26 | "Boards", 27 | "Query", 28 | "Queries", 29 | "WIQL", 30 | "Dependency", 31 | "Dependencies" 32 | ], 33 | "scopes": [ 34 | "vso.extension.data", 35 | "vso.extension.data_write", 36 | "vso.work", 37 | "vso.work_write" 38 | ], 39 | "icons": { 40 | "default": "img/logo.png" 41 | }, 42 | "content": { 43 | "details": { 44 | "path": "details.md" 45 | } 46 | }, 47 | "files": [ 48 | { 49 | "path": "img", 50 | "addressable": true, 51 | "packagePath": "img" 52 | }, 53 | { 54 | "path": "static/js", 55 | "addressable": true, 56 | "packagePath": "static/js" 57 | }, 58 | { 59 | "path": "static/css", 60 | "addressable": true, 61 | "packagePath": "static/css" 62 | }, 63 | { 64 | "path": "static/media", 65 | "addressable": true, 66 | "packagePath": "static/media" 67 | }, 68 | { 69 | "path": "details.md", 70 | "addressable": true 71 | }, 72 | { 73 | "path": "index.html", 74 | "addressable": true 75 | } 76 | ], 77 | "contributions": [ 78 | { 79 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BoardTab", 80 | "type": "ms.vss-web.tab", 81 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the query results", 82 | "targets": [ 83 | "ms.vss-work-web.query-tabs" 84 | ], 85 | "properties": { 86 | "uri": "index.html?type=board", 87 | "title": "Query Based Boards - Show Board / Show Taskboard", 88 | "name": "Board", 89 | "dynamic": true 90 | } 91 | }, 92 | { 93 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BacklogTab1", 94 | "type": "ms.vss-web.tab", 95 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the product/itetation backlog view", 96 | "targets": [ 97 | "ms.vss-work-web.product-backlog-tabs", 98 | "ms.vss-work-web.iteration-backlog-tabs" 99 | ], 100 | "properties": { 101 | "uri": "index.html?type=backlog&id=1", 102 | "title": "Query Based Boards - Show Board / Show Taskboard", 103 | "name": "Board", 104 | "dynamic": true 105 | } 106 | }, 107 | { 108 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BacklogTab2", 109 | "type": "ms.vss-web.tab", 110 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the product/itetation backlog view", 111 | "targets": [ 112 | "ms.vss-work-web.product-backlog-tabs", 113 | "ms.vss-work-web.iteration-backlog-tabs" 114 | ], 115 | "properties": { 116 | "uri": "index.html?type=backlog&id=2", 117 | "title": "Query Based Boards - Show Board / Show Taskboard", 118 | "name": "Board", 119 | "dynamic": true 120 | } 121 | }, 122 | { 123 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BacklogTab3", 124 | "type": "ms.vss-web.tab", 125 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the product/itetation backlog view", 126 | "targets": [ 127 | "ms.vss-work-web.product-backlog-tabs", 128 | "ms.vss-work-web.iteration-backlog-tabs" 129 | ], 130 | "properties": { 131 | "uri": "index.html?type=backlog&id=3", 132 | "title": "Query Based Boards - Show Board / Show Taskboard", 133 | "name": "Board", 134 | "dynamic": true 135 | } 136 | }, 137 | { 138 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BacklogTab4", 139 | "type": "ms.vss-web.tab", 140 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the product/itetation backlog view", 141 | "targets": [ 142 | "ms.vss-work-web.product-backlog-tabs", 143 | "ms.vss-work-web.iteration-backlog-tabs" 144 | ], 145 | "properties": { 146 | "uri": "index.html?type=backlog&id=4", 147 | "title": "Query Based Boards - Show Board / Show Taskboard", 148 | "name": "Board", 149 | "dynamic": true 150 | } 151 | }, 152 | { 153 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.BacklogTab5", 154 | "type": "ms.vss-web.tab", 155 | "description": "Adds a 'Query Based Boards - Show Board / Show Taskboard' tab to the product/itetation backlog view", 156 | "targets": [ 157 | "ms.vss-work-web.product-backlog-tabs", 158 | "ms.vss-work-web.iteration-backlog-tabs" 159 | ], 160 | "properties": { 161 | "uri": "index.html?type=backlog&id=5", 162 | "title": "Query Based Boards - Show Board / Show Taskboard", 163 | "name": "Board", 164 | "dynamic": true 165 | } 166 | }, 167 | { 168 | "id": "EdTro-AzureDevOps-Extensions-QueryBasedBoards.ConfigTab", 169 | "type": "ms.vss-web.hub", 170 | "description": "Adds a 'Query Based Boards - Configuration' hub to the project admin group", 171 | "targets": [ 172 | "ms.vss-web.project-admin-hub-group" 173 | ], 174 | "properties": { 175 | "uri": "index.html?type=config", 176 | "title": "Query Based Boards - Configuration", 177 | "name": "Query Based Boards", 178 | "order": 100 179 | } 180 | } 181 | ], 182 | "screenshots": [ 183 | { 184 | "path": "img/taskboard.png" 185 | }, 186 | { 187 | "path": "img/taskboard-arrows.png" 188 | }, 189 | { 190 | "path": "img/taskboard-settings.png" 191 | }, 192 | { 193 | "path": "img/kanban.png" 194 | }, 195 | { 196 | "path": "img/kanban-zoom.png" 197 | }, 198 | { 199 | "path": "img/config.png" 200 | } 201 | ], 202 | "links": { 203 | "privacypolicy": { 204 | "uri": "https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/blob/master/public/privacy.md" 205 | }, 206 | "license": { 207 | "uri": "https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/blob/master/LICENSE" 208 | }, 209 | "support": { 210 | "uri": "https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/issues" 211 | }, 212 | "repository": { 213 | "uri": "https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards" 214 | }, 215 | "getstarted": { 216 | "uri": "https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/blob/master/public/config.md" 217 | }, 218 | "learn": { 219 | "uri": "https://www.youtube.com/channel/UCPhOzbTeOeNiy3-sIgE0U5g" 220 | } 221 | } 222 | } -------------------------------------------------------------------------------- /public/config.md: -------------------------------------------------------------------------------- 1 | # Getting started 2 | ## The YouTube channel 3 | Recently I have started a YouTube channel for this extension, to provide you instruction videos regarding the possibilities of this extension. 4 | Please make sure to check it out @ https://www.youtube.com/channel/UCPhOzbTeOeNiy3-sIgE0U5g. 5 | 6 | ## Using the configuration 7 | 8 | Within the Teamprojects settings hub, you can find within the extensions section, the option to configure "Query Based Boards". For each query a seperate configuration item is available, next to a **Global** configuration item (here you can define the settings/configs that should be used as default for all of the queries). 9 | 10 | > Please note, that whenever you run a query and select the tab 'Show as board' or 'Show as taskboard', a configuration item is *automatically created* for the specific query. So first do this, before trying to configure the board for the query. 11 | 12 | At the moment these options are implemented: 13 | - settings 14 | - setup columns 15 | - splitup columns in doing/done **PREVIEW** 16 | - setup swimlanes **PREVIEW** 17 | - display fields **PREVIEW** 18 | - style Rules **PREVIEW** 19 | - backlog/board tabs **PREVIEW** 20 | 21 | Unfortunately, I did not have the time to complete this documentation yet (or to create a user friendly UI). Sorry about that! But I have included the model of the actual configuration, see: 22 | 23 | ```javascript 24 | export interface IConfigDataSetup { 25 | settings?: IConfigDataSettings, 26 | backlogTabs?: IConfigDataBacklogTab[], 27 | fields?: IConfigDataDisplayField[], 28 | columns?: IConfigDataColumn[], 29 | swimlanes?: IConfigDataSwimlanes, 30 | styleRules?: IConfigDataStylingRule[] //you can setup multiple rules, takes the first rule that can be applied 31 | } 32 | 33 | export interface IConfigDataSettings { 34 | showFilter?: boolean, 35 | showArrows?: boolean, 36 | zoomLevel?: number, //0, 1, 2 or 3 37 | showProject?: boolean, 38 | showStoryPoints?: boolean, 39 | showTags?: boolean, 40 | } 41 | 42 | export interface IConfigDataBacklogTab { 43 | tabNumber: string, //"1", "2", "3", "4" or "5" 44 | level: string, //"", "Epics", "Features", "Stories" or "Backlog items" 45 | teamId: string, //can also be "", next to the actual id 46 | queryId: string, //only the actual id 47 | title: string 48 | } 49 | 50 | export interface IConfigDataDisplayField { 51 | name: string, 52 | title: string, 53 | type?: number, //0=standard; 1=treepath; 2=tags; 3=treepathCustom 54 | filter?: boolean, //true=will allow this field (when it is text based) to be shown within the quick filters (only the first two will be used), 55 | tagColor?: string, //use the HTML Hexcolor values like #RRGGBB, 56 | nestedFilterFieldName?: string, //one of the other display fields (with filter=true)... does not work with tags (multi value) or type=2 (an aggregation) 57 | } 58 | 59 | export interface IConfigDataColumn { 60 | name: string, 61 | title: string, 62 | field?: string, //when undefined or empty 'System.State' is used, no system fields like 'System.xyz' (except 'System.IterationPath' and 'System.AreaPath'). Multiple fields are not allowed (first is used) 63 | isBacklog?: boolean, 64 | isCollapsed?: boolean, //backlog=true 65 | width?: number, //backlog=false && between 1 and 5 66 | wipLimit?: number, //backlog=false && if >= 0 then count and limit will be displayed 67 | doingDone?: IConfigDataColumnDoingDone, // only for field 'System.State' 68 | parentTransitionMapping?: IConfigDataColumnParentTransitionMapping // only for field 'System.State' 69 | } 70 | 71 | export interface IConfigDataColumnDoingDone { 72 | field: string, //no system fields like 'System.xyz' 73 | doingTitle: string, 74 | doingDefaultValue: boolean | number | string, 75 | doneTitle: string, 76 | doneValue: boolean | number | string, 77 | unsupportedAPIFields?: string[]; //like the name suggest: USING THIS IS UNSUPPORTED... try at your own risk. Use the correct fieldnames, like: WEF_{ID-CODE}_Kanban.Column.Done (note: only works when field='System.BoardColumnDone') 78 | } 79 | 80 | export interface IConfigDataColumnParentTransitionMapping { 81 | parentToNameAll: string, //the 'state' value of the parent, when a 'state' is transitioned to this 'state' (or column) 82 | parentToName: string, //the 'state' value of the parent, when a 'state' is transitioned to this 'state' (or column) 83 | allChildren: boolean //are all other children within this 'state' (or column) 84 | } 85 | 86 | export interface IConfigDataSwimlanes { 87 | field: string, //no system fields like 'System.xyz' 88 | defaultValue: boolean | number | string, 89 | values: IConfigDataSwimlaneFieldValue[], 90 | } 91 | 92 | export interface IConfigDataSwimlaneFieldValue { 93 | value: boolean | number | string, 94 | title: string, 95 | } 96 | 97 | export interface IConfigDataStylingRule { 98 | field: string; //at this moment only the operator 'EQUAL' is implemented (and this will always the default) 99 | value: string; 100 | color: string; //use the HTML Hexcolor values like #RRGGBB 101 | } 102 | 103 | export interface IConfigDataImport { 104 | id: string, 105 | title: string, 106 | json: string, 107 | project: string 108 | } 109 | ``` 110 |
111 | 112 | Please be aware of the restraints that I have put into the comments. 113 | 114 | ## Important notice 115 | When you configure the query to split up the columns into Doing/Done and/or use the swimlanes, be aware that _this extension will also do updates to the workitem in other fields than just the 'System.State' field_. 116 | We are using existing fields (or custom fields you have created yourself), but we only allow fields that are setup with "allowed values". 117 | 118 | So make sure that: 119 | * The REST api can retrieve the "allowed values", see examples: 120 | * _apis/wit/workitemtypes/Bug/fields/Microsoft.VSTS.CMMI.Blocked?$expand=All&api-version=5.1 (this is a text based picklist) 121 | * _apis/wit/workitemtypes/Bug/fields/Microsoft.VSTS.Common.Priority?$expand=All&api-version=5.1 (this is a number based picklist)) 122 | * (also fields of the type boolean are allowed, regardless that these have no "allowed values" within, but obviously the allowed values are True or False, so this is implemented) 123 | * Please mind uppercase and lowercase, it is case sensitive. 124 | 125 | > NOTE: for obvious reasons **all** system fields are not allowed to be used e.g. `System.WorkItemType`, because the risk is too high or they are system protected. 126 | 127 | > NOTE #2: make sure to implement rules when you want to use the doing/done columns to reset the 'done' value to 'false' on state change. 128 | 129 | ## Tips 130 | Here are some tips: 131 | * Make sure the JSON is correct and can be parsed (please use a formatter like this one https://jsonformatter.curiousconcept.com/). 132 | * When you modify a configuration, within the console of the browser (goto the development tools with `F12`) the actual parsed JSON is logged. So make sure to review this when there are any problems. I will be adding a feature that will show the serialized JSON according to the model above. 133 | * When an error is shown, please review the details within the console of the browser (goto the development tools with `F12`). 134 | 135 | ## Examples 136 | Here is an sample for just using columns (for a query with Epics and Features): 137 | ```json 138 | { 139 | "columns":[ 140 | { 141 | "name":"New", 142 | "title":"New/Backlog", 143 | "isBacklog":true 144 | }, 145 | { 146 | "name":"In Progress", 147 | "title":"In Progress/Active" 148 | }, 149 | { 150 | "name":"Test", 151 | "title":"Testing - will not be shown" 152 | }, 153 | { 154 | "name":"Done", 155 | "title":"Completed/Done", 156 | "isBacklog":true 157 | } 158 | ] 159 | } 160 | ``` 161 |
162 | NOTE: the "name" has to map to an actual state that is used within one of the work item types... so within this example the column "Test" will not be shown. 163 | 164 | 165 | And here is an example with swimlanes, columns splitup into doing/done, a custom width, wiplimits and backlog columns that are collapsed by default: 166 | ```json 167 | { 168 | "columns":[ 169 | { 170 | "name":"New", 171 | "title":"Proposed", 172 | "isBacklog":true 173 | }, 174 | { 175 | "name":"Active", 176 | "title":"Active - In development", 177 | "wipLimit":5, 178 | "width": 2, 179 | "doingDone":{ 180 | "field":"Custom.IsDone", 181 | "doingTitle":"Working on it...", 182 | "doingDefaultValue":false, 183 | "doneTitle":"Finished!", 184 | "doneValue":true 185 | } 186 | }, 187 | { 188 | "name":"Test", 189 | "title":"Testing (this column will not be visible, because the 'name' does not map to a valid workitemtype state" 190 | }, 191 | { 192 | "name":"Resolved", 193 | "title":"Resolved - Can be released", 194 | "wipLimit":7 195 | }, 196 | { 197 | "name":"Closed", 198 | "title":"Completed", 199 | "isBacklog":true, 200 | "isCollapsed": true 201 | } 202 | ], 203 | "swimlanes":{ 204 | "field":"Microsoft.VSTS.CMMI.Blocked", 205 | "defaultValue": "No", 206 | "values":[ 207 | { 208 | "value":"Yes", 209 | "title":"Is Blocked" 210 | } 211 | ] 212 | } 213 | } 214 | ``` 215 |
216 | 217 | An example for the Parent Transition Mappings (this **PREVIEW** feature is great for simple rollup scenario's/flows): 218 | ```json 219 | { 220 | "columns":[ 221 | { 222 | "name":"New", 223 | "title":"New", 224 | "isBacklog":true, 225 | "parentTransitionMapping": 226 | { 227 | "parentToName":"Active", 228 | "parentToNameAll":"New", 229 | "allChildren": true 230 | } 231 | }, 232 | { 233 | "name":"Active", 234 | "title":"Active", 235 | "parentTransitionMapping": 236 | { 237 | "parentToName":"Active", 238 | "parentToNameAll":"Active", 239 | "allChildren": false 240 | } 241 | }, 242 | { 243 | "name":"Closed", 244 | "title":"Closed", 245 | "isBacklog":true, 246 | "parentTransitionMapping": 247 | { 248 | "parentToName":"Active", 249 | "parentToNameAll":"Closed", 250 | "allChildren": true 251 | } 252 | } 253 | ] 254 | } 255 | ``` 256 |
257 | 258 | Here is an example of using default values for a setting and the setup of backlogtabs. This json is inserted into the 'Global' configuration (you can setup 'settings' and 'backlogTabs' globally only). 259 | ```json 260 | { 261 | "settings":{ 262 | "showFilter":true 263 | }, 264 | "backlogTabs":[ 265 | { 266 | "tabNumber":"1", 267 | "level":"Epics", 268 | "teamId":"", // add the GUID of your team here, but you can leave it empty 269 | "queryId":"00000000-0000-0000-0000-000000000000", // add the GUID of your query here 270 | "title":"Custom Board" 271 | }, 272 | { 273 | "tabNumber":"1", 274 | "level":"Features", 275 | "teamId":"", // add the GUID of your team here, but you can leave it empty 276 | "queryId":"00000000-0000-0000-0000-000000000000", // add the GUID of your query here 277 | "title":"Custom Board" 278 | }, 279 | { 280 | "tabNumber":"1", 281 | "level":"", // you can leave the level empty, please be aware of the sortorder of your json. Because the config that is found first, that matches the criteria, will be used. 282 | "teamId":"", // add the GUID of your team here, but you can leave it empty 283 | "queryId":"00000000-0000-0000-0000-000000000000", // add the GUID of your query here 284 | "title":"Custom Board" 285 | } 286 | ] 287 | } 288 | ``` 289 |
290 | 291 | Here is an example of adding extra fields on the workitem cards: 292 | ```json 293 | { 294 | "fields":[ 295 | { 296 | "name":"System.AreaPath", 297 | "title":"Area", 298 | "filter": true 299 | }, 300 | { 301 | "name":"System.IterationPath", 302 | "title":"Sprint" 303 | }, 304 | { 305 | "name":"Microsoft.VSTS.Common.Priority", 306 | "title":"Priority" 307 | }, 308 | { 309 | "name":"System.Tags", 310 | "title":"Tags", 311 | "filter": true 312 | }, 313 | { 314 | "name":"System.Parent", 315 | "title":"Parent" 316 | } 317 | ], 318 | "styleRules":[ 319 | { 320 | "field":"Microsoft.VSTS.Common.Priority", 321 | "value":"1", 322 | "color":"#FF0000" 323 | }, 324 | { 325 | "field":"Microsoft.VSTS.Common.Priority", 326 | "value":"2", 327 | "color":"#FFA500" 328 | } 329 | ] 330 | } 331 | ``` 332 | > Please note: for the display fields the types Guid, History, Html and Identity are not supported. 333 | 334 | While adding the 'System.Tags' to the 'Fields' will not enable you to display the field (you should use the settings), but it will enable you to filter on this field 335 | It is also possible to filter on Areas and Iterations (and on all other text-based fields... unfortunately numbers/guid/etc... are not supported) 336 | 337 | When you have added the field, it is also possible to add a styling rule. 338 | 339 | And finally here is an example to show iterations as columns (this is a **preview feature**): 340 | ``` 341 | { 342 | "columns":[ 343 | { 344 | "name":"MyProjectName", 345 | "field":"System.IterationPath", 346 | "title":"Backlog", 347 | "isBacklog":true 348 | }, 349 | { 350 | "name":"MyProjectName\\Sprint 1", 351 | "field":"System.IterationPath", 352 | "title":"#Sprint 1" 353 | }, 354 | { 355 | "name":"MyProjectName\\Sprint 2", 356 | "field":"System.IterationPath", 357 | "title":"#Sprint 2" 358 | }, 359 | { 360 | "name":"MyProjectName\\Sprint 3", 361 | "field":"System.IterationPath", 362 | "title":"#Sprint 3" 363 | } 364 | ], 365 | "settings":{ 366 | "showFilter":true, 367 | "zoomLevel": 4, 368 | "showStoryPoints": true, 369 | "showTags": true 370 | }, 371 | "fields":[ 372 | { 373 | "name":"System.State", 374 | "title":"State", 375 | "type": 0, 376 | "filter": true 377 | } 378 | ] 379 | } 380 | ``` 381 | 382 | Please note: I am reusing the code that I have made for the workitem states, so "name" is the actual value of the field. For the IterationPath/AreaPath you will need to provide the full path including the projectname. 383 | Also make sure to provide the "field" for every column and make sure it is the same field. Or you could get very strange results. 384 | 385 | -------------------------------------------------------------------------------- /public/details.md: -------------------------------------------------------------------------------- 1 | **Query Based Boards** enables a user to visualize the result of work item queries as a board and track the dependencies 2 | 3 | > LICENSE: This is a free showcase project to show the possibilities of creating extensions for Azure DevOps Server/Services and the Formula Design System (ref: https://developer.microsoft.com/en-us/azure-devops/). It is provided by **Inetum-Realdolmen** 'as-is' under the general MIT license issued within the support page (on GitHub). So feel free to install it, try it out and use it in any of your organizations. But do this at your own risk, no guarantees and/or no warrentees of any kind are provided. 4 | 5 | > NOTE: This is the second version of this extension. The first version was created by a former colleague of ours, all the credits for coming up with this idea is going to him! This version is however rebuild completely, based on the new Azure DevOps extension libraries and the new Formula Design System. The old and original project is still available on the marketplace (ref: https://marketplace.visualstudio.com/items?itemName=realdolmen.querybasedboards). 6 | 7 | > IMPORTANT: Not all of the features that are available within the standard out of the box boards are implemented within this extension or in the exact same way. However this extension will provide several features that are not available (yet) within the standard. 8 | 9 | 10 | ## Introduction 11 | If you are in need of more flexibility regarding the boards, or you want to build a custom flow and the standard boards won't fit to your needs. 12 | 13 | This extension can be of great help to you! Just create a **flat** or **one-hop** query and show it as a board, it is as easy as that. 14 | 15 | Here is a [link](https://youtu.be/tod0S2QXO-E) to an introduction video on YouTube with an overview of the available features, to get you started (or _click on the picture below_, it takes less than 4 minutes to watch): 16 | [![screenshot](img/youtube.png)](https://youtu.be/tod0S2QXO-E) 17 | 18 | > Please feel free to subscribe to the [YouTube channel](https://www.youtube.com/channel/UCPhOzbTeOeNiy3-sIgE0U5g) and watch other movies regarding the possibilities of this extension. When this version was released, only a few videos are available, but more will follow soon with detailed instructions regarding this extension. 19 | 20 | ## Known limitations 21 | * This extension is currently only available on Azure DevOps Services and Azure DevOps Server (demands the API version 5.0 at least; so it works on-line and on the on-premises versions 2019 and 2020); 22 | * Be aware: this extension is created and supported for "on-line" first (like many other extensions). For "on-premises" instances there is limited support; 23 | * Only 'flat' and 'one-hop' queries are implemented (a first preview is available to use 'tree' queries); 24 | * When you use a 'one-hop' query, only the `Parent-Child` relations are suppported (this is also the case for the 'tree' queries); 25 | * The dependency arrows are based on `Successor-Predecessor` relations only; 26 | * The columns are based on the values of the field `System.State` only; 27 | * Only tested and validated on Chrome, FireFox and Edge (the new Chromium based version) for a regular non-touch device; 28 | * Only tested and validated on Safari (IPhone) for a touch device; 29 | * A couple of features are still in 'preview'. 30 | 31 | (please review: https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/issues) 32 | 33 | ## Preview 34 | It is possible to get access to the 'preview' version of this extension. This version is available for early-adaptors / testers that want to have early access to new features and/or fixes. Please follow the instructions here: [Get access to the PREVIEW](https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/issues/62) 35 | 36 | > NOTE: this is not available for on-premise installations of Azure DevOps Server. Please do not use the 'preview' version of the extension within a Production environment. 37 | 38 | ## Feedback 39 | Please feel free to leave a behind your feedback within the Q & A section. We love to hear from you. 40 | 41 | ## Changelog 42 | 43 | | Version | Description | 44 | |---------|-------------| 45 | | 0.23028 | Fixed a number of minor bugs and **(finally) added the posibility to use 'tree' queries within the board**. The 'tree' queries will be displayed as a Taskboard, here is a screenshot to show you an example:
![screenshot](img/taskboard-tree.png)
You can select the level within the filter/toolbar that you want to display (e.g. select 'Features' when you want to see the Features with its User Stories). When the query is displayed within the Backlog hub, the query will respond to the selection of the Backlog level automatically.

The main use-case this new feature supports: if you want a Taskboard of Features with its User Stories that are descendents of a specific Epic (or a higher level), you can now achieve this while using a 'tree' query and this extension.| 46 | | 0.23014* | Updated the Dev dependencies (moved to CRA to setup/maintain the project) and bumped the versions of packages where needed. | 47 | | 0.22329* | Removed the 'IMPORTANT NOTICE' regarding the bugs that Microsoft had to resolve, while implementing the 'Azure Boards Ux Modernization' (see: https://devblogs.microsoft.com/devops/azure-boards-ux-modernization-public-preview/). I have received the confirmation that these bugs are resolved. | 48 | | 0.22184 | Added a new preview feature that allows you to base the columns on other fields (e.g. the field `System.IterationPath`) than just the field `System.State`. Please review the 'Get-Started' section on how to do it, here is a screenshot to show you an example:
![screenshot](img/kanban-iterations.png) 49 | | 0.21350 | Fixed a bug regarding datetime fields that can be shown on the card. The 'azure-devops-ui/Ago' was used, but this library cannot handle future dates as of yet. | 50 | | 0.21262 | Fixed a bug regarding registrations within the manifest file. | 51 | | 0.21068 | Applied a couple of minor changes to:
- the filters: using the internal documents service of the SDK to store the filter user cache for the queries;
- the filters: fix to the type=3 because nothing was shown anymore, also corrected the grouping for nested filters;
- stylerules: when a stylerule is setup the forecolor/textcolor will be like the 'light' theme. | 52 | | 0.21067 | Couldn's use browser cookies (so cancelled this change), so have to use internal documents instead but this is still WIP| 53 | | 0.21066 | Applied a couple of minor changes to:
- the stylerules: you can now apply a stylerule based on a field, that is not displayed;
- the display fields with Type=2 (tags): added a 'tagColor' field to distinguish multiple fields (highly usefull when you are using the 'Multivalue control' extension);
- the filters: the Work Item Type filter displayed all of the types, instead of only the 'Child' types, so this is fixed;
- the filters: within the browser the last active filters are stored within the sessiondata, so it is not cleared when you browse to an other page/url;
- the filters: when selecting on '(empty)' with paths/tags the result was incorrect, this is adjusted;
- the filters: add the possibility to use nested custom filters. | 54 | | 0.21059 | Solved a couple of minor rendering bugs and solved the bug that the 'doing' column was not displayed within the taskboard.

Also added a couple of new PREVIEW features:
- when you use the field 'System.Parent' within the 'advanced config/fields', the full styling is now implemented including clicktrough;
- this field will also be available within the quick filters;
- for the 'Taskboard' it makes no sense to filter on the already visible parent level itself, so it will allow you to filter on the grandparents (within the 'taskboard' this field will only be visible within that level);
- the first two config fields (of the type 'text' and when they are enabled with 'filter=true') are added to the quick filters, even the areapath/iterationpath and tags fields. **This will also enable you to filter on custom fields;**
- added an override 'type' field to the config display fields, so fields can be displayed as paths/tags (and filtered as such);
- very basic styling rules for the cards are implemented within the advanced configurations.

*Please note: these items are still in preview, so please report questions/bugs etc. to contribute on these features, but please do not expect immediate response and/or follow up.*| 55 | | 0.21044 | Resolved a bug for the import function (the configs where not imported when no document existed for a query)| 56 | | 0.21020 | Added an import function for the advanced configurations while using a standard Microsoft REST api, see the new [imports.md](https://github.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/blob/master/public/imports.md) document. | 57 | | 0.21005 | Changed the way the 'Assigned To' icon is rendered (to reflect the standard). | 58 | | 0.20362 | Solved a couple of minor rendering issues.

For the PREVIEW feature regarding configuring the colums: Added workitem counters and WIP limits to the columns, added the ability to adjust the column width, show multiple items next to each other, setting the column as collapsed as default and added **Parent Transition Mappings**.

For the PREVIEW feature regarding the quick filters, added for the taskboards the option to filter on if children exist and the option to filter on the parent state.

A big noticeable change is, is that the chevrons to collapse the columns are now displayed just like the standard boards (arranged to the right).

**VIDEO:** I have added a new video to my YouTube channel, regarding the 'Taskboard', but is also showing you a couple of the new features. Please check it out @ https://youtu.be/ag0LeNaR8Tc | 59 | | 0.20338 | Solved a bug regarding missing a field within the projectCollection. | 60 | | 0.20326 | Added the filterbar, the ability to add extra fields to a work item card through the settings and the option to configure settings per query and globally.

Again added two **PREVIEW** features:
1. add extra fields to a work item card through the configuration
2. and the option to add tabs to the Backlog/Boards hub.

_Please note: these items are still in preview, so please report questions/bugs etc. to contribute on these features, but please do not expect immediate response and/or follow up._| 61 | | 0.20308 | Solved a bug regarding cross-project relations/dependencies that they were not shown (not displayed as arrows). | 62 | | 0.20305 | Solved a bug regarding the configured 'Backlog' columns (the collapse icon was still shown based on the StateCategory like the auto columns), did some rebranding and added some extra guidance when dragging an item (the columns, where it is allowed to drag the item to, are highlighted and the original position is marked).

Also added two **PREVIEW** features:
1. the option to use the 'As Of' date, that will allow you to browse back into time (for example: how many items where active yesterday?)
2. added the ability to configure swimlanes and split columns into doing/done (to use this, please take a look at the section regarding the configuration hub).

_Please note: these items are still in preview, so please report questions/bugs etc. to contribute on these features, but please do not expect immediate response and/or follow up._| 63 | | 0.20140 | Solved a bug regarding the state categories. States within the category 'Resolved' where not taken into account, but this is resolved. So when you do not use the column configurations, make sure that the states you expect to show up as a column are setup as 'Proposed', 'InProgress', 'Resolved' or 'Completed'.| 64 | | 0.20134 | Solved a bug regarding a loading error within the configuration hub when private queries where used.| 65 | | 0.20122 | Enabled hovering cards within a collapsed column and refactored the div grid to use areas.| 66 | | 0.20109 | Solved a minor bug regarding an invalid hex color code returned by the Rest API when using the 'old' xml process definitions.| 67 | | 0.20104 | Added the Config hub, implemented configuration of the columns and also added the option to collapse the backlog columns.| 68 | | 0.20096 | Solved some minor bugs, optimized the calculation of the arrow paths and implemented the support for touch devices.| 69 | | 0.20065 | Improved the styling of the arrows and added zoom level slider.| 70 | | 0.20064 | Solved minor bugs for on-prem.| 71 | | 0.20062 | Initial version.| 72 | 73 | > *) these versions where not officially published 74 | 75 | If this project inspires you and/or you have specific requirements that are not not implemented within the standard and/or this project, please feel free to contact us, so we can see how we can help. 76 | 77 | Created by **Inetum-Realdolmen**, please contact us at: https://www.realdolmen.com/en/solution/microsoft-application-lifecycle-management 78 |
79 | ![screenshot](img/inetum-realdolmen-becomes.png) 80 |
81 | 82 | -------------------------------------------------------------------------------- /public/img/config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/config.png -------------------------------------------------------------------------------- /public/img/edtro-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/edtro-logo.png -------------------------------------------------------------------------------- /public/img/inetum-realdolmen-becomes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/inetum-realdolmen-becomes.png -------------------------------------------------------------------------------- /public/img/kanban-iterations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/kanban-iterations.png -------------------------------------------------------------------------------- /public/img/kanban-zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/kanban-zoom.png -------------------------------------------------------------------------------- /public/img/kanban.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/kanban.png -------------------------------------------------------------------------------- /public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/logo.png -------------------------------------------------------------------------------- /public/img/notassigned-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/notassigned-user.png -------------------------------------------------------------------------------- /public/img/taskboard-arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/taskboard-arrows.png -------------------------------------------------------------------------------- /public/img/taskboard-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/taskboard-settings.png -------------------------------------------------------------------------------- /public/img/taskboard-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/taskboard-tree.png -------------------------------------------------------------------------------- /public/img/taskboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/taskboard.png -------------------------------------------------------------------------------- /public/img/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edtro/EdTro.AzureDevOps.Extensions.querybasedboards/fd0d6806e16c255e6ae2173cc7ad3352c5e86ec5/public/img/youtube.png -------------------------------------------------------------------------------- /public/imports.md: -------------------------------------------------------------------------------- 1 | ## Importing configurations 2 | As being a DevOps enthusiast myself... I wanted to provide an option to automatically script the configurations for this extension. So when you create automatically teams and queries, you also can setup the Query Based Boards configurations for them. 3 | 4 | However there is one big limitation: I am not able to create a webservice within Azure DevOps (and certainly not one that can execute the source code within my extension). 5 | 6 | So I am not able to provide a solution that can by completely automated. This procedure just allows you pre-load configs in a seperate document collection. **You just have to run the Configuration page, to start the actual import!** 7 | 8 | > Remark: I think it will be fairly easy to implement a fully automated flow, while using a UI testing tool like Selenium. 9 | > The only things that have to be done are: 10 | > - start a browser session (with js support), 11 | > - navigate to Azure DevOps, 12 | > - login as a user, 13 | > - navigate to the configuration hub URL, 14 | > - possibly use a retry after a timeout of 10 secs 15 | > - and just wait for the client to process the imports (this can be checked by the API). 16 | 17 | Secondly: you will have to use the **not-documented** API that is provided by Microsoft. So I will be doing a bit here, within this document. Because it is not documented, I have to mention: **USE IT AT YOUR OWN RISK** 18 | 19 | ### The API base URL 20 | 21 | For online:
22 | `https://extmgmt.dev.azure.com/{organization}/_apis/ExtensionManagement/InstalledExtensions/realdolmen/EdTro-AzureDevOps-Extensions-QueryBasedBoards-Public/Data/Scopes/Default/Current/Collections/querybasedboards-import/Documents?api-version=3.2-preview1` 23 | 24 | For onpremise:
25 | `https://{yourserverurl}/tfs/{collection}/_apis/ExtensionManagement/InstalledExtensions/realdolmen/EdTro-AzureDevOps-Extensions-QueryBasedBoards-Public/Data/Scopes/Default/Current/Collections/querybasedboards-import/Documents?api-version=3.2-preview1` 26 | 27 | When you run this url, you will get the LIST of all exisiting documents within this collection. 28 | 29 | 30 | ### List documents 31 | Method: `GET` 32 | 33 | Response Status: `200 - OK` 34 | 35 | Response body (within a collection): 36 | 37 | | Name | Type | Description | 38 | |-----------|--------|-------------| 39 | | id | string | This can contain the name of the project (this will be the 'global' configuration) or the queryid. | 40 | | title | string | You can give this document a meaningfull title, it is not used by the actual import. | 41 | | json | string | The stringified json, you normally provide within the UI. | 42 | | project | string | The name of the project. | 43 | | token | string | If the document has been processed, this is specified. | 44 | | __etag | number | System field used for versioning. | 45 | 46 | 47 | The first time you will get the following exception: 48 | ```json 49 | { 50 | "$id": "1", 51 | "innerException": null, 52 | "message": "%error=\"1660002\";%:The collection does not exist\r\n%error=\"1660002\";%:The collection does not exist", 53 | "typeName": "Microsoft.VisualStudio.Services.ExtensionManagement.WebApi.DocumentCollectionDoesNotExistException, Microsoft.VisualStudio.Services.ExtensionManagement.WebApi", 54 | "typeKey": "DocumentCollectionDoesNotExistException", 55 | "errorCode": 0, 56 | "eventId": 3000 57 | } 58 | ``` 59 |
60 | 61 | ### Create document 62 | Method: `POST` 63 | 64 | Request body: 65 | 66 | | Name | Type | Description | 67 | |-----------|--------|-------------| 68 | | id | string | This can contain the name of the project (this will be the 'global' configuration) or the queryid. | 69 | | title | string | You can give this document a meaningfull title, it is not used by the actual import. | 70 | | json | string | The stringified json, you normally provide within the UI. | 71 | | project | string | The name of the project. | 72 | 73 | > All these fields within the request body are MANDATORY. You will have to provide a valid string value for these fields. 74 | 75 | Response Status: `201 - Created` 76 | 77 | Response body: 78 | 79 | | Name | Type | Description | 80 | |-----------|--------|-------------| 81 | | id | string | This can contain the name of the project (this will be the 'global' configuration) or the queryid. | 82 | | title | string | You can give this document a meaningfull title, it is not used by the actual import. | 83 | | json | string | The stringified json, you normally provide within the UI. | 84 | | project | string | The name of the project. | 85 | | token | string | If the document has been processed, this is specified. | 86 | | __etag | number | System field used for versioning. | 87 | 88 | 89 | Example for creating a json request body for the global config 90 | ```powershell 91 | $project = "Test-Agile" 92 | $globalConfig = [PSCustomObject]@{ 93 | "settings" = [PSCustomObject]@{ 94 | "showFilter" = $true 95 | "zoomLevel" = 0 96 | } 97 | } 98 | 99 | $importGlobalConfig = [PSCustomObject]@{ 100 | "id" = $project 101 | "title" = "import global for $project" 102 | "json" = ConvertTo-Json $globalConfig -Compress 103 | "project" = $project 104 | } 105 | 106 | ConvertTo-Json $importGlobalConfig 107 | ``` 108 | 109 | Example for creating a json request body for a query 110 | ```powershell 111 | $project = "Test-Agile" 112 | $queryId = "73744df6-6bed-4125-afb1-2007f83722b4" 113 | $queryConfig = [PSCustomObject]@{ 114 | "settings" = [PSCustomObject]@{ 115 | "showFilter" = $false 116 | "zoomLevel" = 2 117 | } 118 | } 119 | 120 | $importQueryConfig = [PSCustomObject]@{ 121 | "id" = $queryId 122 | "title" = "import $queryId for $project" 123 | "json" = ConvertTo-Json $queryConfig -Compress 124 | "project" = $project 125 | } 126 | 127 | ConvertTo-Json $importQueryConfig 128 | ``` 129 |
130 | 131 | ### Other methods 132 | There are also an update method and a delete method implemented by Microsoft that you can use on these documents. -------------------------------------------------------------------------------- /public/privacy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | We're working hard to protect your privacy, while delivering software that brings you the performance, power and convenience you desire. This privacy statement explains the data collection and use practices for this extension. This isn't intended to be an exhaustive list and does only apply to this extension. 3 | 4 | ## Security of Your Information 5 | We are committed to protecting the security of your information. For that reason we are only storing your data inside Microsoft Azure DevOps Services/Server (former Microsoft VSTS/TFS) using Microsofts API for storing extension data in your account. The data is stored in your account/server and is only accessible by member of your accounts. 6 | 7 | ## Collection and Use of Your Personal Information 8 | We dont collect any information that identifies you as an individual, except the information Microsoft provides to us for commercial purposes. 9 | 10 | ## Disclosure to Third Parties 11 | Except as described in this statement, information you provide will not be transferred to third parties, Microsoft excluded, without your consent. We may access or disclose information about you, including the content of your communications, in order to: (a) comply with the law or respond to lawful requests or legal process; (b) protect the rights or property of Microsoft or our customers, including the enforcement of our agreements or policies governing your use of the services; or (c) act on a good faith belief that such access or disclosure is necessary to protect the personal safety of our employees, customers, or the public. We may also disclose personal information as part of a corporate transaction such as a merger or sale of assets. -------------------------------------------------------------------------------- /public/tests.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | > Note: these testscripts are not all of the tests that are done, there are lot of other tests that are done on also on-premise environments. These tests can be easily executed on any online organization. 4 | 5 | Preperation: 6 | - Make sure to install/enable the current release of Query Based Boards; 7 | - Make sure to install/enable the WIQL Playground extension; 8 | - Create two teamprojects with the 'Azure DevOps Demo Generator' 9 | - The first should be based on 'Tailwind Traders' (=Agile) 10 | - Add a new field 'Is Done' (Boolean) to the User Story 11 | - Add the existing field 'Blocked' to the User Story 12 | - Add an extra state called 'Test' (within the category 'In Progress' between states Active and Resolved) 13 | - Within the feature 'Purchase' there is one story for Iteration 2... and three for iteration 3. Add the first as a predeccessor dependency to those three. 14 | - The second should be based on 'SmartHotel360' (=Scrum) 15 | 16 | ## Testcases 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 45 | 46 | 47 | 48 | 49 | 50 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 134 | 135 | 136 | 137 | 138 | 139 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 152 | 153 | 154 | 155 | 156 | 157 | 182 | 183 | 184 | 185 | 186 | 187 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 199 | 200 | 201 | 202 | 203 | 204 | 239 | 240 | 241 | 242 | 243 | 244 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 310 | 311 | 312 | 313 | 314 |
Description Admin user Normal user
27 | 28 | Create a new Query called 'All Work Items', like 29 | ```sql 30 | SELECT 31 | [System.Id], 32 | [System.WorkItemType], 33 | [System.Title], 34 | [System.AssignedTo], 35 | [System.State], 36 | [System.Tags] 37 | FROM workitems 38 | WHERE 39 | [System.TeamProject] = @project 40 | AND [System.WorkItemType] <> '' 41 | AND [System.State] <> '' 42 | ORDER BY [System.Id] 43 | ``` 44 |
51 | Check if all columns are visible (there should be New*, Design*, Active, Resolved, Ready, In Planning, In Progress, Test, Closed*, Inactive* and Completed*) 52 | OK? OK?
60 | Check if the columns marked with * should be collapseable 61 | OK? OK?
69 | Check if is possible to move around different workitems of different types. Not all columns should be available for the e.g. Bug. 70 | OK? OK?
78 | Within the Query Editor, descent the sorting on the WorkItem Id and sort back, check if the sorting in the board reflects this. Sort on an other column. Save the query every time after each modification. 79 | OK? OK?
87 | Open up the settings and use zoom option. Check every option and restore to the default, make sure to check if it is possible to move items. 88 | OK? OK?
96 | Open up the settings and turn on and off the 'dependency arrows'. And move arround the work items connected to the arrows. When the successor is moved to a 'higher' state than the predeccessor, the arrow should turn into color red. 97 | OK? OK?
105 | With the 'dependency arrows' turned on, collapse a couple of columns. Check if the arrows are still correct. Move an item to a collapsed column, check if this works. 106 | OK? OK?
114 | 115 | Create a new Query called 'Stories or PBIs Multiple projects', like 116 | ```sql 117 | SELECT 118 | [System.Id], 119 | [System.WorkItemType], 120 | [System.Title], 121 | [System.AssignedTo], 122 | [System.State], 123 | [System.Tags], 124 | [Microsoft.VSTS.Common.Priority] 125 | FROM workitems 126 | WHERE 127 | [System.WorkItemType] IN ('User Story', 'Product Backlog Item') 128 | AND [System.State] <> '' 129 | AND [System.TeamProject] IN ('Test-QBB-Agile', 'Test-QBB-Scrum') 130 | ORDER BY [Microsoft.VSTS.Common.Priority] 131 | 132 | ``` 133 |
140 | Check if the columns New*, Approved*, Committed, Active, Test, Resolved, Done* and Closed* are visible 141 | OK? OK?
149 | Check if the columns marked with * should be collapseable 150 | 151 | OK? OK?
158 | 159 | **First play around in the Backlog with stack ranks, so these fields are filled in.** 160 | Create a new Query called 'Stories', like 161 | ```sql 162 | SELECT 163 | [System.Id], 164 | [System.WorkItemType], 165 | [System.Title], 166 | [System.AssignedTo], 167 | [System.State], 168 | [Microsoft.VSTS.Common.StackRank], 169 | [Microsoft.VSTS.Common.Priority], 170 | [Microsoft.VSTS.Common.Severity] 171 | FROM workitems 172 | WHERE 173 | [System.TeamProject] = @project 174 | AND [System.WorkItemType] IN ('User Story') 175 | AND [System.State] <> '' 176 | ORDER BY 177 | [Microsoft.VSTS.Common.StackRank], 178 | [Microsoft.VSTS.Common.Priority], 179 | [Microsoft.VSTS.Common.Severity] 180 | ``` 181 |
188 | Check if the columns New, Active, Test, Resolved and Closed are visible (and within that exact order) 189 | OK? OK?
197 | Shuffle arround a couple of user stories within the backlog and see if the sorting is reflected within the board 198 | OK? OK?
205 | 206 | Create a new Query called 'Features with Stories', like 207 | ```sql 208 | SELECT 209 | [System.Id], 210 | [System.WorkItemType], 211 | [System.Title], 212 | [System.AssignedTo], 213 | [System.State], 214 | [Microsoft.VSTS.Common.StackRank], 215 | [Microsoft.VSTS.Common.Priority], 216 | [Microsoft.VSTS.Common.Severity] 217 | FROM workitemLinks 218 | WHERE 219 | ( 220 | [Source].[System.TeamProject] = @project 221 | AND [Source].[System.WorkItemType] IN ('Feature') 222 | AND [Source].[System.State] <> '' 223 | ) 224 | AND ( 225 | [System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward' 226 | ) 227 | AND ( 228 | [Target].[System.TeamProject] = @project 229 | AND [Target].[System.WorkItemType] = 'User Story' 230 | ) 231 | ORDER BY 232 | [Microsoft.VSTS.Common.StackRank], 233 | [Microsoft.VSTS.Common.Priority], 234 | [Microsoft.VSTS.Common.Severity], 235 | [System.Id] 236 | MODE (MayContain) 237 | ``` 238 |
245 | Check if the columns New*, Active, Test, Resolved and Closed* are visible (and within that exact order) 246 | OK? OK?
254 | Check if the columns marked with * should be collapseable 255 | OK? OK?
263 | Check if you can collapse each of the lanes and check if the collapse all works correctly 264 | OK? OK?
272 | Collapse all of the items and open up one feature that has no user stories. Open it up with clicking on the card and set the state to 'Closed'. This should be reflected in the board and when you collapse that lane, the Feature should be 'crossed out'. 273 | OK? OK?
281 | Check when the lanes are collapsed, if the counters are correct. Per category (except for the closed) a counter is displayed. For the columns Active, Test and Resolved the counter 'Active' will be calculated. 282 | OK? OK?
290 | Move around the items within the columns and see if this is reflected within collapsed view. 291 | OK? OK?
299 | Turn on the 'Dependency Arrows' and check if these are correctly displayed. When a lane is collapsed, the arrow should not be shown. 300 | OK? OK?
308 | Check if zooming works 309 | OK? OK?
315 | 316 | ## Testing configurations 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 359 | 360 | 361 | 362 | 363 | 364 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 385 | 386 | 387 | 388 | 389 | 390 | 423 | 424 | 425 | 426 | 427 | 428 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 440 | 441 | 442 | 443 | 444 |
Description Admin user Normal user
327 | 328 | Create a new configuration for the Query called 'Stories', like 329 | ```json 330 | { 331 | "columns":[ 332 | { 333 | "name":"New", 334 | "title":"New/Backlog", 335 | "isBacklog":true 336 | }, 337 | { 338 | "name":"Active", 339 | "title":"In Progress/Active" 340 | }, 341 | { 342 | "name":"Test2", 343 | "title":"Testing (should not be visible)" 344 | }, 345 | { 346 | "name":"Resolved", 347 | "title":"Resolved/Ready for release", 348 | "isBacklog":true 349 | }, 350 | { 351 | "name":"Closed", 352 | "title":"Completed/Done", 353 | "isBacklog":true 354 | } 355 | ] 356 | } 357 | ``` 358 |
365 | Check if all columns are visible (there should be New/Backlog*, In Progress/Active, Resolved/Ready for release* and Completed/Done*) 366 | OK? OK?
374 | Check if the columns marked with * should be collapseable 375 | OK? OK?
383 | Change the config so "Test2" will be "Test" so it will show up. Next change the title accordingly. 384 | OK? OK?
391 | 392 | Create a new configuration for the Query called 'Features with Stories', like 393 | ```json 394 | { 395 | "columns":[ 396 | { 397 | "name":"New", 398 | "title":"New/Backlog", 399 | "isBacklog":true 400 | }, 401 | { 402 | "name":"Active", 403 | "title":"In Progress/Active" 404 | }, 405 | { 406 | "name":"Test", 407 | "title":"Testing" 408 | }, 409 | { 410 | "name":"Resolved", 411 | "title":"Resolved/Ready for release", 412 | "isBacklog":true 413 | }, 414 | { 415 | "name":"Closed", 416 | "title":"Completed/Done", 417 | "isBacklog":true 418 | } 419 | ] 420 | } 421 | ``` 422 |
429 | Check if all columns are visible (there should be New/Backlog*, In Progress/Active, Testing, Resolved/Ready for release* and Completed/Done*) 430 | OK? OK?
438 | Check if the columns marked with * should be collapseable 439 | OK? OK?
445 | --------------------------------------------------------------------------------