|
|
@@ -0,0 +1,161 @@
|
|
|
+///<reference path="../../../headers/common.d.ts" />
|
|
|
+
|
|
|
+import _ from 'lodash';
|
|
|
+import coreModule from 'app/core/core_module';
|
|
|
+import appEvents from 'app/core/app_events';
|
|
|
+
|
|
|
+export class FolderPickerCtrl {
|
|
|
+ initialTitle: string;
|
|
|
+ initialFolderId?: number;
|
|
|
+ labelClass: string;
|
|
|
+ onChange: any;
|
|
|
+ onLoad: any;
|
|
|
+ onCreateFolder: any;
|
|
|
+ enterFolderCreation: any;
|
|
|
+ exitFolderCreation: any;
|
|
|
+ enableCreateNew: boolean;
|
|
|
+ rootName = 'Root';
|
|
|
+ folder: any;
|
|
|
+ createNewFolder: boolean;
|
|
|
+ newFolderName: string;
|
|
|
+ newFolderNameTouched: boolean;
|
|
|
+ hasValidationError: boolean;
|
|
|
+ validationError: any;
|
|
|
+
|
|
|
+ /** @ngInject */
|
|
|
+ constructor(private backendSrv, private validationSrv) {
|
|
|
+ if (!this.labelClass) {
|
|
|
+ this.labelClass = "width-7";
|
|
|
+ }
|
|
|
+
|
|
|
+ this.loadInitialValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ getOptions(query) {
|
|
|
+ var params = {
|
|
|
+ query: query,
|
|
|
+ type: 'dash-folder',
|
|
|
+ };
|
|
|
+
|
|
|
+ return this.backendSrv.search(params).then(result => {
|
|
|
+ if (query === '' ||
|
|
|
+ query.toLowerCase() === "r" ||
|
|
|
+ query.toLowerCase() === "ro" ||
|
|
|
+ query.toLowerCase() === "roo" ||
|
|
|
+ query.toLowerCase() === "root") {
|
|
|
+ result.unshift({title: this.rootName, id: 0});
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.enableCreateNew && query === '') {
|
|
|
+ result.unshift({title: '-- New Folder --', id: -1});
|
|
|
+ }
|
|
|
+
|
|
|
+ return _.map(result, item => {
|
|
|
+ return {text: item.title, value: item.id};
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ onFolderChange(option) {
|
|
|
+ if (option.value === -1) {
|
|
|
+ this.createNewFolder = true;
|
|
|
+ this.enterFolderCreation();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.onChange({$folder: {id: option.value, title: option.text}});
|
|
|
+ }
|
|
|
+
|
|
|
+ newFolderNameChanged() {
|
|
|
+ this.newFolderNameTouched = true;
|
|
|
+
|
|
|
+ this.validationSrv.validateNewDashboardOrFolderName(this.newFolderName)
|
|
|
+ .then(() => {
|
|
|
+ this.hasValidationError = false;
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ this.hasValidationError = true;
|
|
|
+ this.validationError = err.message;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ createFolder(evt) {
|
|
|
+ if (evt) {
|
|
|
+ evt.stopPropagation();
|
|
|
+ evt.preventDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ return this.backendSrv.createDashboardFolder(this.newFolderName).then(result => {
|
|
|
+ appEvents.emit('alert-success', ['Folder Created', 'OK']);
|
|
|
+
|
|
|
+ this.closeCreateFolder();
|
|
|
+ this.folder = {text: result.dashboard.title, value: result.dashboard.id};
|
|
|
+ this.onFolderChange(this.folder);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ cancelCreateFolder(evt) {
|
|
|
+ if (evt) {
|
|
|
+ evt.stopPropagation();
|
|
|
+ evt.preventDefault();
|
|
|
+ }
|
|
|
+
|
|
|
+ this.closeCreateFolder();
|
|
|
+ this.loadInitialValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ private closeCreateFolder() {
|
|
|
+ this.exitFolderCreation();
|
|
|
+ this.createNewFolder = false;
|
|
|
+ this.hasValidationError = false;
|
|
|
+ this.validationError = null;
|
|
|
+ this.newFolderName = '';
|
|
|
+ this.newFolderNameTouched = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private loadInitialValue() {
|
|
|
+ if (this.initialFolderId && this.initialFolderId > 0) {
|
|
|
+ this.getOptions('').then(result => {
|
|
|
+ this.folder = _.find(result, {value: this.initialFolderId});
|
|
|
+ this.onFolderLoad();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ if (this.initialTitle) {
|
|
|
+ this.folder = {text: this.initialTitle, value: null};
|
|
|
+ } else {
|
|
|
+ this.folder = {text: this.rootName, value: 0};
|
|
|
+ }
|
|
|
+
|
|
|
+ this.onFolderLoad();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private onFolderLoad() {
|
|
|
+ if (this.onLoad) {
|
|
|
+ this.onLoad({$folder: {id: this.folder.value, title: this.folder.text}});
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export function folderPicker() {
|
|
|
+ return {
|
|
|
+ restrict: 'E',
|
|
|
+ templateUrl: 'public/app/features/dashboard/folder_picker/folder_picker.html',
|
|
|
+ controller: FolderPickerCtrl,
|
|
|
+ bindToController: true,
|
|
|
+ controllerAs: 'ctrl',
|
|
|
+ scope: {
|
|
|
+ initialTitle: '<',
|
|
|
+ initialFolderId: '<',
|
|
|
+ labelClass: '@',
|
|
|
+ rootName: '@',
|
|
|
+ onChange: '&',
|
|
|
+ onLoad: '&',
|
|
|
+ onCreateFolder: '&',
|
|
|
+ enterFolderCreation: '&',
|
|
|
+ exitFolderCreation: '&',
|
|
|
+ enableCreateNew: '@'
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+coreModule.directive('folderPicker', folderPicker);
|