【问题标题】:Creating a custom VSTS dashboard widget创建自定义 VSTS 仪表板小部件
【发布时间】:2019-03-01 21:06:06
【问题描述】:

我们正在尝试创建一个漂亮的小型 VSTS 仪表板小部件来监控我们将存储在远程存储中的一些测试指标。使用以下链接,

https://www.visualstudio.com/en-us/docs/integrate/extensions/develop/add-dashboard-widget https://www.visualstudio.com/en-us/docs/integrate/extensions/develop/add-chart

我能够创建一些基本的折线图。但是,如何进一步定制/微调这些? MSFT 链接没有提供关于可用可视化的大量文档(几乎没有)。看起来他们正在使用 HighCharts 进行可视化。但是来自 VSS sdk 的服务不接受相同格式的 HighCharts 选项。

基本上,我的问题是

  • 有没有办法在自定义小部件中构建精美的视觉效果?如果是这样,我在哪里可以找到这些文档。
  • 我们能否拥有交互式的高级小部件,例如,带有修改所显示数据的下拉菜单?


考虑到开发小部件(代码、打包和发布!)所需的时间,最好至少有这些文档或源代码。

P.S:如果这不是这个问题的正确渠道,如果提供了一些适当的重定向,请感谢。

【问题讨论】:

    标签: tfs azure-devops


    【解决方案1】:

    我为我的公司创建 VSTS 仪表板,我不会对此撒谎,这是一个艰难的过程,但我也选择了艰难的方式。仪表板通常使用淘汰赛,但它只是 CSS HTML 和 JavaScript。我对仪表板使用 angular 4,对独立小部件使用 vanilla JS。我喜欢Charts.js 对于我的图表,您也可以这样做。

    请注意您的文件引用(js、css 等)不要这样做 /scripts/main.js 这样做:scripts/main.js并且不要在你的 html 中使用基本元素。

    我会给你一堆网址,可以帮助你深入了解。 https://www.visualstudio.com/en-us/docs/integrate/extensions/get-started/node https://nocture.dk/2016/01/02/lets-make-a-visual-studio-team-services-extension/

    https://github.com/Microsoft/vsts-extension-multivalue-control

    其余的客户非常重要: https://www.visualstudio.com/en-us/docs/integrate/extensions/reference/client/rest-clients 但不是全套

    这里是全套

    rmo.d.ts(6): "ReleaseManagement/Core/Constants" 
    rmo.d.ts(180): "ReleaseManagement/Core/Contracts" 
    rmo.d.ts(1649): "ReleaseManagement/Core/ExtensionContracts" 
    rmo.d.ts(1741): "ReleaseManagement/Core/RestClient" 
    rmo.d.ts(2479): "ReleaseManagement/Core/Utils" 
    tfs.d.ts(6): "TFS/Build/Contracts" 
    tfs.d.ts(1894): "TFS/Build/ExtensionContracts" 
    tfs.d.ts(1942): "TFS/Build/RestClient" 
    tfs.d.ts(3473): "TFS/Chat/Contracts" 
    tfs.d.ts(3609): "TFS/Chat/RestClient" 
    tfs.d.ts(3776): "TFS/Core/Contracts" 
    tfs.d.ts(4183): "TFS/Core/RestClient" 
    tfs.d.ts(4454): "TFS/Dashboards/Contracts" 
    tfs.d.ts(4714): "TFS/Dashboards/Events" 
    tfs.d.ts(4724): "TFS/Dashboards/RestClient" 
    tfs.d.ts(5182): "TFS/Dashboards/Services" 
    tfs.d.ts(5215): "TFS/Dashboards/WidgetContracts" 
    tfs.d.ts(5444): "TFS/Dashboards/WidgetHelpers" 
    tfs.d.ts(5558): "TFS/DistributedTaskCommon/Contracts" 
    tfs.d.ts(5610): "TFS/DistributedTask/Contracts" 
    tfs.d.ts(6986): "TFS/DistributedTask/TaskAgentRestClient" 
    tfs.d.ts(8132): "TFS/DistributedTask/TaskRestClient" 
    tfs.d.ts(8379): "TFS/TestImpact/Contracts" 
    tfs.d.ts(8531): "TFS/TestImpact/RestClient" 
    tfs.d.ts(8629): "TFS/TestManagement/Contracts" 
    tfs.d.ts(10145): "TFS/TestManagement/Helper/Utils" 
    tfs.d.ts(10321): "TFS/TestManagement/RestClient" 
    tfs.d.ts(11583): "TFS/VersionControl/Contracts" 
    tfs.d.ts(13987): "TFS/VersionControl/Controls" 
    tfs.d.ts(14063): "TFS/VersionControl/GitRestClient" 
    tfs.d.ts(15175): "TFS/VersionControl/Services" 
    tfs.d.ts(15202): "TFS/VersionControl/TfvcRestClient" 
    tfs.d.ts(15543): "TFS/VersionControl/UIContracts" 
    tfs.d.ts(15573): "TFS/WorkItemTracking/BatchRestClient" 
    tfs.d.ts(15689): "TFS/WorkItemTracking/Contracts" 
    tfs.d.ts(16337): "TFS/WorkItemTracking/ExtensionContracts" 
    tfs.d.ts(16409): "TFS/WorkItemTracking/ProcessContracts" 
    tfs.d.ts(16811): "TFS/WorkItemTracking/ProcessDefinitionsContracts" 
    tfs.d.ts(17234): "TFS/WorkItemTracking/ProcessDefinitionsRestClient" 
    tfs.d.ts(17783): "TFS/WorkItemTracking/ProcessRestClient" 
    tfs.d.ts(17927): "TFS/WorkItemTracking/ProcessTemplateContracts" 
    tfs.d.ts(17980): "TFS/WorkItemTracking/ProcessTemplateRestClient" 
    tfs.d.ts(18069): "TFS/WorkItemTracking/RestClient" 
    tfs.d.ts(18751): "TFS/WorkItemTracking/Services" 
    tfs.d.ts(18940): "TFS/WorkItemTracking/UIContracts" 
    tfs.d.ts(18957): "TFS/Work/Contracts" 
    tfs.d.ts(19970): "TFS/Work/RestClient" 
    vss.d.ts(2707): XDM 
    vss.d.ts(2834): VSS 
    vss.d.ts(2958): "VSS/Accounts/Contracts" 
    vss.d.ts(3139): "VSS/Accounts/RestClient" 
    vss.d.ts(3293): "VSS/Adapters/Knockout" 
    vss.d.ts(3422): "VSS/Ajax" 
    vss.d.ts(3466): "VSS/Artifacts/Constants" 
    vss.d.ts(3501): "VSS/Artifacts/Services" 
    vss.d.ts(3569): "VSS/Authentication/Contracts" 
    vss.d.ts(3595): "VSS/Authentication/RestClient" 
    vss.d.ts(3655): "VSS/Authentication/Services" 
    vss.d.ts(3783): "VSS/Bundling" 
    vss.d.ts(3837): "VSS/Commerce/Contracts" 
    vss.d.ts(4808): "VSS/Commerce/RestClient" 
    vss.d.ts(5119): "VSS/Common/Constants/Platform" 
    vss.d.ts(5188): "VSS/Common/Contracts/FormInput" 
    vss.d.ts(5463): "VSS/Common/Contracts/Platform" 
    vss.d.ts(6336): "VSS/Common/Contracts/System" 
    vss.d.ts(6381): "VSS/Common/Contracts/System.Data" 
    vss.d.ts(6549): "VSS/Compatibility" 
    vss.d.ts(6554): "VSS/Context" 
    vss.d.ts(6652): "VSS/Contributions/Contracts" 
    vss.d.ts(7728): "VSS/Contributions/Controls" 
    vss.d.ts(7867): "VSS/Contributions/PageEvents" 
    vss.d.ts(7869): "VSS/Contributions/RestClient" 
    vss.d.ts(7972): "VSS/Contributions/Services" 
    vss.d.ts(8399): "VSS/Controls" 
    vss.d.ts(8743): "VSS/Controls/AjaxPanel" 
    vss.d.ts(8749): "VSS/Controls/CheckboxList" 
    vss.d.ts(8821): "VSS/Controls/Combos" 
    vss.d.ts(9665): "VSS/Controls/Dialogs" 
    vss.d.ts(10264): "VSS/Controls/EditableGrid" 
    vss.d.ts(10545): "VSS/Controls/ExternalHub" 
    vss.d.ts(10572): "VSS/Controls/FileInput" 
    vss.d.ts(10708): "VSS/Controls/Filters" 
    vss.d.ts(10878): "VSS/Controls/FormInput" 
    vss.d.ts(11105): "VSS/Controls/Grids" 
    vss.d.ts(12344): "VSS/Controls/Header" 
    vss.d.ts(12369): "VSS/Controls/Histogram" 
    vss.d.ts(12462): "VSS/Controls/KeyboardShortcuts" 
    vss.d.ts(12632): "VSS/Controls/Menus" 
    vss.d.ts(13646): "VSS/Controls/Navigation" 
    vss.d.ts(14177): "VSS/Controls/Notifications" 
    vss.d.ts(14330): "VSS/Controls/Panels" 
    vss.d.ts(14471): "VSS/Controls/PerfBar" 
    vss.d.ts(14473): "VSS/Controls/PopupContent" 
    vss.d.ts(14588): "VSS/Controls/RichEditor" 
    vss.d.ts(14884): "VSS/Controls/Search" 
    vss.d.ts(15072): "VSS/Controls/Splitter" 
    vss.d.ts(15376): "VSS/Controls/StatusIndicator" 
    vss.d.ts(15700): "VSS/Controls/TabContent" 
    vss.d.ts(16223): "VSS/Controls/TreeView" 
    vss.d.ts(16703): "VSS/Controls/Validation" 
    vss.d.ts(16933): "VSS/Controls/Virtualization" 
    vss.d.ts(16999): "VSS/DelegatedAuthorization/Contracts" 
    vss.d.ts(17260): "VSS/DelegatedAuthorization/RestClient" 
    vss.d.ts(17395): "VSS/Diag" 
    vss.d.ts(17749): "VSS/Diag/Services" 
    vss.d.ts(17790): "VSS/Error" 
    vss.d.ts(17796): "VSS/Events/Action" 
    vss.d.ts(17878): "VSS/Events/Document" 
    vss.d.ts(17962): "VSS/Events/Handlers" 
    vss.d.ts(18061): "VSS/Events/Page" 
    vss.d.ts(18116): "VSS/Events/Services" 
    vss.d.ts(18146): "VSS/ExtensionManagement/Contracts" 
    vss.d.ts(18868): "VSS/ExtensionManagement/RestClient" 
    vss.d.ts(19175): "VSS/FeatureAvailability/Contracts" 
    vss.d.ts(19201): "VSS/FeatureAvailability/RestClient" 
    vss.d.ts(19301): "VSS/FeatureAvailability/Services" 
    vss.d.ts(19340): "VSS/FeatureManagement/Contracts" 
    vss.d.ts(19470): "VSS/FeatureManagement/RestClient" 
    vss.d.ts(19594): "VSS/FileContainer/Contracts" 
    vss.d.ts(19776): "VSS/FileContainer/RestClient" 
    vss.d.ts(19880): "VSS/FileContainer/Services" 
    vss.d.ts(19908): "VSS/Flux/Action" 
    vss.d.ts(19931): "VSS/Flux/AsyncLoadedComponent" 
    vss.d.ts(19944): "VSS/Flux/Component" 
    vss.d.ts(19963): "VSS/Flux/PlatformComponent" 
    vss.d.ts(20015): "VSS/Flux/Store" 
    vss.d.ts(20049): "VSS/Gallery/Contracts" 
    vss.d.ts(21571): "VSS/Gallery/RestClient" 
    vss.d.ts(22268): "VSS/Graph/Contracts" 
    vss.d.ts(22504): "VSS/Graph/RestClient" 
    vss.d.ts(22688): "VSS/Identities/Contracts" 
    vss.d.ts(22886): "VSS/Identities/Mru/Contracts" 
    vss.d.ts(22906): "VSS/Identities/Mru/RestClient" 
    vss.d.ts(22991): "VSS/Identities/Picker/Cache" 
    vss.d.ts(23134): "VSS/Identities/Picker/Common" 
    vss.d.ts(23160): "VSS/Identities/Picker/Constants" 
    vss.d.ts(23214): "VSS/Identities/Picker/Controls" 
    vss.d.ts(23972): "VSS/Identities/Picker/RestClient" 
    vss.d.ts(24120): "VSS/Identities/Picker/Services" 
    vss.d.ts(24347): "VSS/Identities/RestClient" 
    vss.d.ts(24613): "VSS/JoinOrganization/Contracts" 
    vss.d.ts(24623): "VSS/JoinOrganization/RestClient" 
    vss.d.ts(24661): "VSS/Licensing/Contracts" 
    vss.d.ts(24993): "VSS/Licensing/RestClient" 
    vss.d.ts(25243): "VSS/Locations" 
    vss.d.ts(25383): "VSS/Locations/Contracts" 
    vss.d.ts(25553): "VSS/Locations/RestClient" 
    vss.d.ts(25642): "VSS/Navigation/HubsProvider" 
    vss.d.ts(25685): "VSS/Navigation/HubsService" 
    vss.d.ts(25858): "VSS/Navigation/Services" 
    vss.d.ts(26027): "VSS/Operations/Contracts" 
    vss.d.ts(26099): "VSS/Operations/RestClient" 
    vss.d.ts(26165): "VSS/OrganizationPolicy/Contracts" 
    vss.d.ts(26191): "VSS/OrganizationPolicy/RestClient" 
    vss.d.ts(26271): "VSS/Organization/Contracts" 
    vss.d.ts(26446): "VSS/Organization/RestClient" 
    vss.d.ts(26654): "VSS/Performance" 
    vss.d.ts(26876): "VSS/Profile/Contracts" 
    vss.d.ts(26989): "VSS/Profile/Metrics" 
    vss.d.ts(27163): "VSS/Profile/RestClient" 
    vss.d.ts(27629): "VSS/ReparentCollection/Contracts" 
    vss.d.ts(27694): "VSS/SDK/Services/Dialogs" 
    vss.d.ts(27751): "VSS/SDK/Services/ExtensionData" 
    vss.d.ts(27874): "VSS/SDK/Services/Navigation" 
    vss.d.ts(27955): "VSS/Search" 
    vss.d.ts(28235): "VSS/SecurityRoles/Contracts" 
    vss.d.ts(28319): "VSS/SecurityRoles/RestClient" 
    vss.d.ts(28419): "VSS/Security/Contracts" 
    vss.d.ts(28606): "VSS/Security/RestClient" 
    vss.d.ts(28758): "VSS/Serialization" 
    vss.d.ts(28826): "VSS/Service" 
    vss.d.ts(28977): "VSS/Settings" 
    vss.d.ts(29026): "VSS/Settings/RestClient" 
    vss.d.ts(29123): "VSS/Telemetry/Contracts" 
    vss.d.ts(29143): "VSS/Telemetry/RestClient" 
    vss.d.ts(29209): "VSS/Telemetry/Services" 
    vss.d.ts(29255): "VSS/UserMapping/Contracts" 
    vss.d.ts(29269): "VSS/UserMapping/RestClient" 
    vss.d.ts(29318): "VSS/Utils/Accessibility" 
    vss.d.ts(29424): "VSS/Utils/Array" 
    vss.d.ts(29610): "VSS/Utils/Clipboard" 
    vss.d.ts(29644): "VSS/Utils/Core" 
    vss.d.ts(29929): "VSS/Utils/Culture" 
    vss.d.ts(30047): "VSS/Utils/Date" 
    vss.d.ts(30247): "VSS/Utils/Draggable" 
    vss.d.ts(30249): "VSS/Utils/File" 
    vss.d.ts(30305): "VSS/Utils/Html" 
    vss.d.ts(30406): "VSS/Utils/Mobile" 
    vss.d.ts(30420): "VSS/Utils/Number" 
    vss.d.ts(30471): "VSS/Utils/String" 
    vss.d.ts(30668): "VSS/Utils/Tree" 
    vss.d.ts(30715): "VSS/Utils/UI" 
    vss.d.ts(31009): "VSS/Utils/Url" 
    vss.d.ts(31170): "VSS/VSS" 
    vss.d.ts(31423): "VSS/WebApi/Constants" 
    vss.d.ts(31563): "VSS/WebApi/Contracts" 
    vss.d.ts(31854): "VSS/WebApi/RestClient" 
    

    【讨论】:

    • 你好。感谢您的详细回复。我想看看我是否可以避免使用图表的外部库。默认的“图表/服务”提供了一些应该满足我们需求的基本选项,如此链接visualstudio.com/en-us/docs/integrate/extensions/develop/… 中使用的那样。但是,除了示例中的那些之外,我似乎找不到有关其他选项的文档或代码。我正在尝试在小部件中创建一些折线图。
    • visualstudio.com/en-us/docs/integrate/extensions/develop/…是源,我查看了vss-web-extension-sdk中的typings文件,那里没有参考。
    • 是的。这就是令人困惑的地方。我不知道在哪里以及如何使用它。我将给 Charts.js 一个机会。我们将看看情况如何。它看起来很容易。谢谢!
    • 感谢您详细说明未记录的 REST 客户端。我有一种感觉,其中一些是由未记录的 OAuth 范围控制的;知道是否有完整列表可用吗?见stackoverflow.com/questions/44765983/…
    • 没关系,找到了,作用域是vso.base。自 TFS 2017 起可用,未记录,适用于 GET 但不适用于 POST。
    【解决方案2】:

    有很多库可以构建精美的可视化图表,例如bootstrap chartsjQuery charts

    关于小部件扩展,您可以设置配置页面来配置小部件。查看Hello World with Configuration 文章。

    来自SimplePieChart的简单示例,您可以将饼图更改为折线图(小写)。

    <!DOCTYPE html>
    <html>
    
    <head>
        <script src="bower_components/vss-web-extension-sdk/lib/VSS.SDK.min.js"></script>
        <script type="text/javascript">
    VSS.init({
            explicitNotifyLoaded: true,
            usePlatformStyles: true 
        });
    
    VSS.require([
            "TFS/Dashboards/WidgetHelpers", 
            "Charts/Services"
            ],
            function (WidgetHelpers, Services) {
            WidgetHelpers.IncludeWidgetStyles();
            VSS.register("SimplePieChart", function () { 
                 return {
                 load:function() {
                    return Services.ChartsService.getService().then(function(chartService){
                        var $container = $('#Chart-Container');
                        var chartOptions = { 
                            "hostOptions": { 
                                "height": "290", 
                                "width": "300"
                            },
                            "chartType": "pie",
                            "series": [{
                                "data": [11, 4, 3, 1]
                            }],
                            "xAxis": { 
                                "labelValues": ["Design", "On Deck", "Completed", "Development"] 
                            }, 
                            "specializedOptions": {
                                "showLabels": "true",
                                "size": 200
                            } 
                        };
    
                        chartService.createChart($container, chartOptions);
                        return WidgetHelpers.WidgetStatusHelper.Success();
                    });
                    }
                 }
                });
        VSS.notifyLoadSucceeded();
    });
    </script>
    </head>
    
    <body>
        <div class="widget">
            <h2 class="title">Chart Widget</h2>
            <div id="Chart-Container"></div>
        </div>
    </body>
    
    </html>
    

    【讨论】:

    • 但默认的“图表/服务”模块实际上相当不错。 visualstudio.com/en-us/docs/integrate/extensions/develop/… 此处的此链接显示了如何添加饼图等。在某处详细说明所有选项会很好。我们正在尝试在小部件中添加一些可能有下拉菜单的折线图。您是否认为最好采用您提到的其他选项,即 bootstrap、jquery 等?这似乎是可以避免的额外代码。
    • @iambatman 不,只是根据细节要求,如果图表/服务中不支持某些功能,您可以选择其他的或者您熟悉一些 3rd 库。
    • @iambatman 来自 vsts-extension-sample 的示例很简单,您可以参考它进行测试。 (我更新了我的答案)
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2012-01-29
    • 2018-02-28
    • 1970-01-01
    • 2017-05-27
    • 2016-12-28
    相关资源
    最近更新 更多