metrics_ds_selector.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. ///<reference path="../../headers/common.d.ts" />
  2. import angular from 'angular';
  3. import _ from 'lodash';
  4. var module = angular.module('grafana.directives');
  5. var template = `
  6. <div class="gf-form-group">
  7. <div class="gf-form-inline">
  8. <div class="gf-form">
  9. <label class="gf-form-label">
  10. <i class="icon-gf icon-gf-datasources"></i>
  11. </label>
  12. <label class="gf-form-label">
  13. Data Source
  14. </label>
  15. <metric-segment segment="ctrl.dsSegment"
  16. get-options="ctrl.getOptions(true)"
  17. on-change="ctrl.datasourceChanged()"></metric-segment>
  18. </div>
  19. <div class="gf-form gf-form--offset-1">
  20. <button class="btn btn-secondary gf-form-btn" ng-click="ctrl.addDataQuery()" ng-hide="ctrl.current.meta.mixed">
  21. <i class="fa fa-plus"></i>&nbsp;
  22. Add query
  23. </button>
  24. <div class="dropdown" ng-if="ctrl.current.meta.mixed">
  25. <metric-segment segment="ctrl.mixedDsSegment"
  26. get-options="ctrl.getOptions(false)"
  27. on-change="ctrl.mixedDatasourceChanged()"></metric-segment>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. `;
  33. export class MetricsDsSelectorCtrl {
  34. dsSegment: any;
  35. mixedDsSegment: any;
  36. dsName: string;
  37. panelCtrl: any;
  38. datasources: any[];
  39. current: any;
  40. /** @ngInject */
  41. constructor(private uiSegmentSrv, datasourceSrv) {
  42. this.datasources = datasourceSrv.getMetricSources();
  43. var dsValue = this.panelCtrl.panel.datasource || null;
  44. for (let ds of this.datasources) {
  45. if (ds.value === dsValue) {
  46. this.current = ds;
  47. }
  48. }
  49. if (!this.current) {
  50. this.current = {name: dsValue + ' not found', value: null};
  51. }
  52. this.dsSegment = uiSegmentSrv.newSegment({value: this.current.name, selectMode: true});
  53. this.mixedDsSegment = uiSegmentSrv.newSegment({value: 'Add query', selectMode: true});
  54. }
  55. getOptions(includeBuiltin) {
  56. return Promise.resolve(this.datasources.filter(value => {
  57. return includeBuiltin || !value.meta.builtIn;
  58. }).map(value => {
  59. return this.uiSegmentSrv.newSegment(value.name);
  60. }));
  61. }
  62. datasourceChanged() {
  63. var ds = _.find(this.datasources, {name: this.dsSegment.value});
  64. if (ds) {
  65. this.current = ds;
  66. this.panelCtrl.setDatasource(ds);
  67. }
  68. }
  69. mixedDatasourceChanged() {
  70. var target: any = {isNew: true};
  71. var ds = _.find(this.datasources, {name: this.mixedDsSegment.value});
  72. if (ds) {
  73. target.datasource = ds.name;
  74. this.panelCtrl.panel.targets.push(target);
  75. this.mixedDsSegment.value = '';
  76. }
  77. }
  78. addDataQuery() {
  79. var target: any = {isNew: true};
  80. this.panelCtrl.panel.targets.push(target);
  81. }
  82. }
  83. module.directive('metricsDsSelector', function() {
  84. return {
  85. restrict: 'E',
  86. template: template,
  87. controller: MetricsDsSelectorCtrl,
  88. bindToController: true,
  89. controllerAs: 'ctrl',
  90. transclude: true,
  91. scope: {
  92. panelCtrl: "="
  93. }
  94. };
  95. });