/// import _ from 'lodash'; import {PanelCtrl} from 'app/plugins/sdk'; export class TextPanelCtrl extends PanelCtrl { static templateUrl = `public/app/plugins/panel/text/module.html`; static scrollable = true; remarkable: any; content: string; // Set and populate defaults panelDefaults = { mode : "markdown", // 'html', 'markdown', 'text' content : "# title", }; /** @ngInject **/ constructor($scope, $injector, private templateSrv, private $sce) { super($scope, $injector); _.defaults(this.panel, this.panelDefaults); this.events.on('init-edit-mode', this.onInitEditMode.bind(this)); this.events.on('refresh', this.onRefresh.bind(this)); this.events.on('render', this.onRender.bind(this)); $scope.$watch('ctrl.panel.content', _.throttle(() => { this.render(); }, 1000) ); } onInitEditMode() { this.addEditorTab('Options', 'public/app/plugins/panel/text/editor.html'); this.editorTabIndex = 1; if (this.panel.mode === 'text') { this.panel.mode = 'markdown'; } } onRefresh() { this.render(); } onRender() { if (this.panel.mode === 'markdown') { this.renderMarkdown(this.panel.content); } else if (this.panel.mode === 'html') { this.updateContent(this.panel.content); } this.renderingCompleted(); } renderText(content) { content = content .replace(/&/g, '&') .replace(/>/g, '>') .replace(/'); this.updateContent(content); } renderMarkdown(content) { if (!this.remarkable) { return System.import('remarkable').then(Remarkable => { this.remarkable = new Remarkable(); this.$scope.$apply(() => { this.updateContent(this.remarkable.render(content)); }); }); } this.$scope.$applyAsync(() => { this.updateContent(this.remarkable.render(content)); }); } updateContent(html) { try { this.content = this.$sce.trustAsHtml(this.templateSrv.replace(html, this.panel.scopedVars)); } catch (e) { console.log('Text panel error: ', e); this.content = this.$sce.trustAsHtml(html); } } } export {TextPanelCtrl as PanelCtrl};