diff --git a/public/app/features/dashboard/submenu/submenu.html b/public/app/features/dashboard/submenu/submenu.html
index f240a86efba..9d3332b06e2 100644
--- a/public/app/features/dashboard/submenu/submenu.html
+++ b/public/app/features/dashboard/submenu/submenu.html
@@ -4,7 +4,8 @@
-
+
+
diff --git a/public/app/features/templating/all.ts b/public/app/features/templating/all.ts
index 16465740642..424494f66b2 100644
--- a/public/app/features/templating/all.ts
+++ b/public/app/features/templating/all.ts
@@ -9,6 +9,7 @@ import { DatasourceVariable } from './datasource_variable';
import { CustomVariable } from './custom_variable';
import { ConstantVariable } from './constant_variable';
import { AdhocVariable } from './adhoc_variable';
+import { TextVariable } from './text_variable';
coreModule.factory('templateSrv', () => {
return templateSrv;
@@ -22,4 +23,5 @@ export {
CustomVariable,
ConstantVariable,
AdhocVariable,
+ TextVariable
};
diff --git a/public/app/features/templating/partials/editor.html b/public/app/features/templating/partials/editor.html
index 0d8b0ace327..ed8398738da 100644
--- a/public/app/features/templating/partials/editor.html
+++ b/public/app/features/templating/partials/editor.html
@@ -155,6 +155,14 @@
+
+
Query Options
diff --git a/public/app/features/templating/text_variable.ts b/public/app/features/templating/text_variable.ts
new file mode 100644
index 00000000000..3459b99f602
--- /dev/null
+++ b/public/app/features/templating/text_variable.ts
@@ -0,0 +1,58 @@
+import { Variable, assignModelProperties, variableTypes } from './variable';
+
+export class TextVariable implements Variable {
+ query: string;
+ current: any;
+ options: any[];
+ skipUrlSync: boolean;
+
+ defaults = {
+ type: 'text',
+ name: '',
+ hide: 2,
+ label: '',
+ query: '',
+ current: {},
+ options: [],
+ skipUrlSync: false,
+ };
+
+ /** @ngInject */
+ constructor(private model, private variableSrv) {
+ assignModelProperties(this, model, this.defaults);
+ }
+
+ getSaveModel() {
+ assignModelProperties(this.model, this, this.defaults);
+ return this.model;
+ }
+
+ setValue(option) {
+ this.variableSrv.setOptionAsCurrent(this, option);
+ }
+
+ updateOptions() {
+ this.options = [{ text: this.query.trim(), value: this.query.trim() }];
+ this.current = this.options[0];
+ return Promise.resolve();
+ }
+
+ dependsOn(variable) {
+ return false;
+ }
+
+ setValueFromUrl(urlValue) {
+ this.query = urlValue;
+ return this.variableSrv.setOptionFromUrl(this, urlValue);
+ }
+
+ getValueForUrl() {
+ return this.current.value;
+ }
+}
+
+variableTypes['text'] = {
+ name: 'Text',
+ ctor: TextVariable,
+ description: 'Define a textbox variable, where users can enter any arbitrary string',
+};