Просмотр исходного кода

Argument suggestions (#252)

* feature: Suggestions for inputs

* feature: #103 Completed suggestions support
James Read 2 лет назад
Родитель
Сommit
1319f314ff
4 измененных файлов с 31 добавлено и 0 удалено
  1. 1 0
      OliveTin.proto
  2. 1 0
      internal/config/config.go
  3. 1 0
      internal/grpcapi/grpcApiActions.go
  4. 28 0
      webui.dev/js/ArgumentForm.js

+ 1 - 0
OliveTin.proto

@@ -23,6 +23,7 @@ message ActionArgument {
 	repeated ActionArgumentChoice choices = 5;
 
 	string description = 6;
+	map<string, string> suggestions = 7;
 }
 
 message ActionArgumentChoice {

+ 1 - 0
internal/config/config.go

@@ -33,6 +33,7 @@ type ActionArgument struct {
 	Default     string
 	Choices     []ActionArgumentChoice
 	Entity      string
+	Suggestions map[string]string
 }
 
 // ActionArgumentChoice represents a predefined choice for an argument.

+ 1 - 0
internal/grpcapi/grpcApiActions.go

@@ -94,6 +94,7 @@ func actionCfgToPb(action *config.Action, user *acl.AuthenticatedUser) *pb.Actio
 			Description:  cfgArg.Description,
 			DefaultValue: cfgArg.Default,
 			Choices:      buildChoices(cfgArg),
+			Suggestions:  cfgArg.Suggestions,
 		}
 
 		btn.Arguments = append(btn.Arguments, &pbArg)

+ 28 - 0
webui.dev/js/ArgumentForm.js

@@ -64,6 +64,7 @@ class ArgumentForm extends window.HTMLElement {
       domArgumentWrapper.classList.add('argument-wrapper')
 
       domArgumentWrapper.appendChild(this.createDomLabel(arg))
+      domArgumentWrapper.appendChild(this.createDomSuggestions(arg))
       domArgumentWrapper.appendChild(this.createDomInput(arg))
       domArgumentWrapper.appendChild(this.createDomDescription(arg))
 
@@ -79,6 +80,29 @@ class ArgumentForm extends window.HTMLElement {
     return domLbl
   }
 
+  createDomSuggestions (arg) {
+    if (typeof arg.suggestions !== 'object' || arg.suggestions.length === 0) {
+      return document.createElement('span')
+    }
+
+    const ret = document.createElement('datalist')
+    ret.setAttribute('id', arg.name + '-choices')
+
+    for (const suggestion of Object.keys(arg.suggestions)) {
+      const opt = document.createElement('option')
+
+      opt.setAttribute('value', suggestion)
+
+      if (typeof arg.suggestions[suggestion] !== 'undefined' && arg.suggestions[suggestion].length > 0) {
+        opt.innerText = arg.suggestions[suggestion]
+      }
+
+      ret.appendChild(opt)
+    }
+
+    return ret
+  }
+
   createDomInput (arg) {
     let domEl = null
 
@@ -144,6 +168,10 @@ class ArgumentForm extends window.HTMLElement {
     domEl.name = arg.name
     domEl.value = arg.defaultValue
 
+    if (typeof arg.suggestions === 'object' && Object.keys(arg.suggestions).length > 0) {
+      domEl.setAttribute('list', arg.name + '-choices')
+    }
+
     this.argInputs.push(domEl)
 
     return domEl