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);