module.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ///<reference path="../../../headers/common.d.ts" />
  2. import _ from 'lodash';
  3. import {PanelCtrl} from 'app/plugins/sdk';
  4. import {impressions} from 'app/features/dashboard/impression_store';
  5. class DashListCtrl extends PanelCtrl {
  6. static templateUrl = 'module.html';
  7. groups: any[];
  8. modes: any[];
  9. panelDefaults = {
  10. query: '',
  11. limit: 10,
  12. tags: [],
  13. recent: false,
  14. search: false,
  15. starred: true,
  16. headings: true,
  17. folderId: 0,
  18. };
  19. /** @ngInject */
  20. constructor($scope, $injector, private backendSrv) {
  21. super($scope, $injector);
  22. _.defaults(this.panel, this.panelDefaults);
  23. if (this.panel.tag) {
  24. this.panel.tags = [this.panel.tag];
  25. delete this.panel.tag;
  26. }
  27. this.events.on('refresh', this.onRefresh.bind(this));
  28. this.events.on('init-edit-mode', this.onInitEditMode.bind(this));
  29. this.events.on('render', this.setPanelHeight.bind(this));
  30. this.events.on('panel-size-changed', this.setPanelHeight.bind(this));
  31. this.events.on('panel-change-view', this.setPanelHeight.bind(this));
  32. this.groups = [
  33. {list: [], show: false, header: "Starred dashboards",},
  34. {list: [], show: false, header: "Recently viewed dashboards"},
  35. {list: [], show: false, header: "Search"},
  36. ];
  37. // update capability
  38. if (this.panel.mode) {
  39. if (this.panel.mode === 'starred') {
  40. this.panel.starred = true;
  41. this.panel.headings = false;
  42. }
  43. if (this.panel.mode === 'recently viewed') {
  44. this.panel.recent = true;
  45. this.panel.starred = false;
  46. this.panel.headings = false;
  47. }
  48. if (this.panel.mode === 'search') {
  49. this.panel.search = true;
  50. this.panel.starred = false;
  51. this.panel.headings = false;
  52. }
  53. delete this.panel.mode;
  54. }
  55. }
  56. onInitEditMode() {
  57. this.editorTabIndex = 1;
  58. this.modes = ['starred', 'search', 'recently viewed'];
  59. this.addEditorTab('Options', 'public/app/plugins/panel/dashlist/editor.html');
  60. }
  61. setPanelHeight() {
  62. this.$scope.setPanelHeight();
  63. }
  64. link(scope, elem, attrs, ctrl: DashListCtrl) {
  65. let panelContentElem = elem.find('.panel-content');
  66. panelContentElem.height(ctrl.height);
  67. scope.setPanelHeight = () => {
  68. panelContentElem.height(ctrl.height);
  69. };
  70. }
  71. onRefresh() {
  72. var promises = [];
  73. promises.push(this.getRecentDashboards());
  74. promises.push(this.getStarred());
  75. promises.push(this.getSearch());
  76. return Promise.all(promises)
  77. .then(() => {
  78. this.setPanelHeight();
  79. return this.renderingCompleted();
  80. });
  81. }
  82. getSearch() {
  83. this.groups[2].show = this.panel.search;
  84. if (!this.panel.search) {
  85. return Promise.resolve();
  86. }
  87. var params = {
  88. limit: this.panel.limit,
  89. query: this.panel.query,
  90. tag: this.panel.tags,
  91. folderId: this.panel.folderId
  92. };
  93. return this.backendSrv.search(params).then(result => {
  94. this.groups[2].list = result;
  95. });
  96. }
  97. getStarred() {
  98. this.groups[0].show = this.panel.starred;
  99. if (!this.panel.starred) {
  100. return Promise.resolve();
  101. }
  102. var params = {limit: this.panel.limit, starred: "true"};
  103. return this.backendSrv.search(params).then(result => {
  104. this.groups[0].list = result;
  105. });
  106. }
  107. getRecentDashboards() {
  108. this.groups[1].show = this.panel.recent;
  109. if (!this.panel.recent) {
  110. return Promise.resolve();
  111. }
  112. var dashIds = _.take(impressions.getDashboardOpened(), this.panel.limit);
  113. return this.backendSrv.search({dashboardIds: dashIds, limit: this.panel.limit}).then(result => {
  114. this.groups[1].list = dashIds.map(orderId => {
  115. return _.find(result, dashboard => {
  116. return dashboard.id === orderId;
  117. });
  118. }).filter(el => {
  119. return el !== undefined;
  120. });
  121. });
  122. }
  123. onFolderChange(folder: any) {
  124. this.panel.folderId = folder.id;
  125. this.refresh();
  126. }
  127. }
  128. export {DashListCtrl, DashListCtrl as PanelCtrl};