Skip to content

Commit

Permalink
Argument suggestions (#252)
Browse files Browse the repository at this point in the history
* feature: Suggestions for inputs

* feature: #103 Completed suggestions support
  • Loading branch information
jamesread committed Mar 23, 2024
1 parent 781abaa commit 1319f31
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 0 deletions.
1 change: 1 addition & 0 deletions OliveTin.proto
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ message ActionArgument {
repeated ActionArgumentChoice choices = 5;

string description = 6;
map<string, string> suggestions = 7;
}

message ActionArgumentChoice {
Expand Down
1 change: 1 addition & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions internal/grpcapi/grpcApiActions.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
28 changes: 28 additions & 0 deletions webui.dev/js/ArgumentForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 1319f31

Please sign in to comment.