dashboard_import.html 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <page-header model="ctrl.navModel"></page-header>
  2. <div class="page-container page-body" ng-cloak>
  3. <div ng-if="ctrl.step === 1">
  4. <form class="page-action-bar">
  5. <div class="page-action-bar__spacer"></div>
  6. <dash-upload on-upload="ctrl.onUpload(dash)"></dash-upload>
  7. </form>
  8. <h5 class="section-heading">Grafana.com Dashboard</h5>
  9. <div class="gf-form-group">
  10. <div class="gf-form gf-form--grow">
  11. <input type="text" class="gf-form-input max-width-30" ng-model="ctrl.gnetUrl" placeholder="Paste Grafana.com dashboard url or id" ng-blur="ctrl.checkGnetDashboard()"></textarea>
  12. </div>
  13. <div class="gf-form" ng-if="ctrl.gnetError">
  14. <label class="gf-form-label text-warning">
  15. <i class="fa fa-warning"></i>
  16. {{ctrl.gnetError}}
  17. </label>
  18. </div>
  19. </div>
  20. <h5 class="section-heading">Or paste JSON</h5>
  21. <div class="gf-form-group">
  22. <div class="gf-form">
  23. <textarea rows="10" data-share-panel-url="" class="gf-form-input" ng-model="ctrl.jsonText"></textarea>
  24. </div>
  25. <button type="button" class="btn btn-secondary" ng-click="ctrl.loadJsonText()">
  26. <i class="fa fa-paste"></i>
  27. Load
  28. </button>
  29. <span ng-if="ctrl.parseError" class="text-error p-l-1">
  30. <i class="fa fa-warning"></i>
  31. {{ctrl.parseError}}
  32. </span>
  33. </div>
  34. </div>
  35. <div ng-if="ctrl.step === 2">
  36. <div class="gf-form-group" ng-if="ctrl.dash.gnetId">
  37. <h3 class="section-heading">
  38. Importing Dashboard from
  39. <a href="https://grafana.com/dashboards/{{ctrl.dash.gnetId}}" class="external-link" target="_blank">Grafana.com</a>
  40. </h3>
  41. <div class="gf-form">
  42. <label class="gf-form-label width-15">Published by</label>
  43. <label class="gf-form-label width-15">{{ctrl.gnetInfo.orgName}}</label>
  44. </div>
  45. <div class="gf-form">
  46. <label class="gf-form-label width-15">Updated on</label>
  47. <label class="gf-form-label width-15">{{ctrl.gnetInfo.updatedAt | date : 'yyyy-MM-dd HH:mm:ss'}}</label>
  48. </div>
  49. </div>
  50. <h3 class="section-heading">
  51. Options
  52. </h3>
  53. <div class="gf-form-group">
  54. <div class="gf-form-inline">
  55. <div class="gf-form gf-form--grow">
  56. <label class="gf-form-label width-15">Name</label>
  57. <input type="text" class="gf-form-input" ng-model="ctrl.dash.title" give-focus="true" ng-change="ctrl.titleChanged()" ng-class="{'validation-error': ctrl.nameExists || !ctrl.dash.title}">
  58. <label class="gf-form-label text-success" ng-if="ctrl.titleTouched && !ctrl.hasNameValidationError">
  59. <i class="fa fa-check"></i>
  60. </label>
  61. </div>
  62. </div>
  63. <div class="gf-form-inline" ng-if="ctrl.hasNameValidationError">
  64. <div class="gf-form offset-width-15 gf-form--grow">
  65. <label class="gf-form-label text-warning gf-form-label--grow">
  66. <i class="fa fa-warning"></i>
  67. {{ctrl.nameValidationError}}
  68. </label>
  69. </div>
  70. </div>
  71. <div class="gf-form-inline">
  72. <div class="gf-form gf-form--grow">
  73. <folder-picker label-class="width-15"
  74. initial-folder-id="ctrl.folderId"
  75. initial-title="ctrl.initialFolderTitle"
  76. on-change="ctrl.onFolderChange($folder)"
  77. on-load="ctrl.onFolderChange($folder)"
  78. enter-folder-creation="ctrl.onEnterFolderCreation()"
  79. exit-folder-creation="ctrl.onExitFolderCreation()"
  80. enable-create-new="true">
  81. </folder-picker>
  82. </div>
  83. </div>
  84. <div class="gf-form-inline">
  85. <div class="gf-form gf-form--grow">
  86. <span class="gf-form-label width-15">
  87. Unique identifier (uid)
  88. <info-popover mode="right-normal">
  89. The unique identifier (uid) of a dashboard can be used for uniquely identify a dashboard between multiple Grafana installs.
  90. The uid allows having consistent URL’s for accessing dashboards so changing the title of a dashboard will not break any
  91. bookmarked links to that dashboard.
  92. </info-popover>
  93. </span>
  94. <input type="text" class="gf-form-input" disabled="disabled" ng-model="ctrl.autoGenerateUidValue" ng-if="ctrl.autoGenerateUid">
  95. <a class="btn btn-secondary gf-form-btn" href="#" ng-click="ctrl.autoGenerateUid = false" ng-if="ctrl.autoGenerateUid">change</a>
  96. <input type="text" class="gf-form-input" maxlength="40" placeholder="optional, will be auto-generated if empty" ng-model="ctrl.dash.uid" ng-change="ctrl.uidChanged()" ng-if="!ctrl.autoGenerateUid">
  97. <label class="gf-form-label text-success" ng-if="!ctrl.autoGenerateUid && !ctrl.hasUidValidationError">
  98. <i class="fa fa-check"></i>
  99. </label>
  100. </div>
  101. </div>
  102. <div class="gf-form-inline" ng-if="ctrl.hasUidValidationError">
  103. <div class="gf-form offset-width-15 gf-form--grow">
  104. <label class="gf-form-label text-warning gf-form-label--grow">
  105. <i class="fa fa-warning"></i>
  106. {{ctrl.uidValidationError}}
  107. </label>
  108. </div>
  109. </div>
  110. <div ng-repeat="input in ctrl.inputs">
  111. <div class="gf-form">
  112. <label class="gf-form-label width-15">
  113. {{input.label}}
  114. <info-popover mode="right-normal">
  115. {{input.info}}
  116. </info-popover>
  117. </label>
  118. <!-- Data source input -->
  119. <div class="gf-form-select-wrapper" style="width: 100%" ng-if="input.type === 'datasource'">
  120. <select class="gf-form-input" ng-model="input.value" ng-options="v.value as v.text for v in input.options" ng-change="ctrl.inputValueChanged()">
  121. <option value="" ng-hide="input.value">{{input.info}}</option>
  122. </select>
  123. </div>
  124. <!-- Constant input -->
  125. <input ng-if="input.type === 'constant'" type="text" class="gf-form-input" ng-model="input.value" placeholder="{{input.default}}" ng-change="ctrl.inputValueChanged()">
  126. <label class="gf-form-label text-success" ng-show="input.value">
  127. <i class="fa fa-check"></i>
  128. </label>
  129. </div>
  130. </div>
  131. </div>
  132. <div class="gf-form-button-row">
  133. <button type="button" class="btn btn-success width-12" ng-click="ctrl.saveDashboard()" ng-hide="ctrl.nameExists || ctrl.uidExists" ng-disabled="!ctrl.isValid()">
  134. <i class="fa fa-save"></i> Import
  135. </button>
  136. <button type="button" class="btn btn-danger width-12" ng-click="ctrl.saveDashboard()" ng-show="ctrl.nameExists || ctrl.uidExists" ng-disabled="!ctrl.isValid()">
  137. <i class="fa fa-save"></i> Import (Overwrite)
  138. </button>
  139. <a class="btn btn-link" ng-click="ctrl.back()">Cancel</a>
  140. </div>
  141. </div>
  142. </div>