dashboard_list_ctrl.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import _ from 'lodash';
  2. import appEvents from 'app/core/app_events';
  3. export class DashboardListCtrl {
  4. public dashboards: any [];
  5. query: any;
  6. navModel: any;
  7. canDelete = false;
  8. canMove = false;
  9. /** @ngInject */
  10. constructor(private backendSrv, navModelSrv, private $q) {
  11. this.navModel = navModelSrv.getNav('cfg', 'dashboards');
  12. this.query = '';
  13. this.getDashboards();
  14. }
  15. getDashboards() {
  16. return this.backendSrv.get(`/api/search?query=${this.query}&mode=tree`).then((result) => {
  17. this.dashboards = this.groupDashboardsInFolders(result);
  18. for (let dash of this.dashboards) {
  19. dash.checked = false;
  20. }
  21. });
  22. }
  23. groupDashboardsInFolders(results) {
  24. let byId = _.groupBy(results, 'id');
  25. let byFolderId = _.groupBy(results, 'folderId');
  26. let finalList = [];
  27. // add missing parent folders
  28. _.each(results, (hit, index) => {
  29. if (hit.folderId && !byId[hit.folderId]) {
  30. const folder = {
  31. id: hit.folderId,
  32. uri: `db/${hit.folderSlug}`,
  33. title: hit.folderTitle,
  34. type: 'dash-folder'
  35. };
  36. byId[hit.folderId] = folder;
  37. results.splice(index, 0, folder);
  38. }
  39. });
  40. // group by folder
  41. for (let hit of results) {
  42. if (hit.folderId) {
  43. hit.type = "dash-child";
  44. } else {
  45. finalList.push(hit);
  46. }
  47. hit.url = 'dashboard/' + hit.uri;
  48. if (hit.type === 'dash-folder') {
  49. if (!byFolderId[hit.id]) {
  50. continue;
  51. }
  52. for (let child of byFolderId[hit.id]) {
  53. finalList.push(child);
  54. }
  55. }
  56. }
  57. return finalList;
  58. }
  59. selectionChanged() {
  60. const selected = _.filter(this.dashboards, {checked: true}).length;
  61. this.canDelete = selected > 0;
  62. const selectedDashboards = _.filter(this.dashboards, (o) => {
  63. return o.checked && (o.type === 'dash-db' || o.type === 'dash-child');
  64. }).length;
  65. const selectedFolders = _.filter(this.dashboards, {checked: true, type: 'dash-folder'}).length;
  66. this.canMove = selectedDashboards > 0 && selectedFolders === 0;
  67. }
  68. delete() {
  69. const selectedDashboards = _.filter(this.dashboards, {checked: true});
  70. appEvents.emit('confirm-modal', {
  71. title: 'Delete',
  72. text: `Do you want to delete the ${selectedDashboards.length} selected dashboards?`,
  73. icon: 'fa-trash',
  74. yesText: 'Delete',
  75. onConfirm: () => {
  76. const promises = [];
  77. for (let dash of selectedDashboards) {
  78. promises.push(this.backendSrv.delete(`/api/dashboards/${dash.uri}`));
  79. }
  80. this.$q.all(promises).then(() => {
  81. this.getDashboards();
  82. });
  83. }
  84. });
  85. }
  86. moveTo() {
  87. const selectedDashboards = _.filter(this.dashboards, {checked: true});
  88. const template = '<move-to-folder-modal dismiss="dismiss()" ' +
  89. 'dashboards="model.dashboards" after-save="model.afterSave()">' +
  90. '</move-to-folder-modal>`';
  91. appEvents.emit('show-modal', {
  92. templateHtml: template,
  93. modalClass: 'modal--narrow',
  94. model: {dashboards: selectedDashboards, afterSave: this.getDashboards.bind(this)}
  95. });
  96. }
  97. }