How do I match a enum symbol in a result view? - bixby

I have some training examples that have the same goal, but use enums/symbols (to reduce the training examples needed.)
How can I match the symbols in a result view?
I've looked at pattern matching in the docs here: https://bixbydevelopers.com/dev/docs/dev-guide/developers/customizing-plan.match-patterns
I think this is pretty straightforward. I have an enum:
enum (sizes) {
description (drink sizes)
symbol (large)
symbol (medium)
symbol (small)
}
And some corresponding vocabulary:
vocab (sizes) {
"large" {"large", "largest", "big"}
"medium" {"medium", "normal"}
"small" {"small", "smallest", "tiny"}
}
And then for training I might have:
[g:BuyDrink] I want a (large)[v:sizes:large] drink
[g:BuyDrink] I want the (smallest)[v:sizes:small] drink
I want different result views for the two utterances, but I can't figure out the correct match pattern.

The match pattern will work for concept types. You should be able to create a layout for any variations of the value when you render the view. For example:
Action:
action (BuyDrink) {
type(Search)
description (Buy a drink (small, medium, or large))
collect {
input (size) {
type (sizes)
min (Optional) max (One)
}
}
output (sizes)
}
View:
result-view {
match {
sizes(drinkSize) {
from-output: BuyDrink(drink)
}
}
render {
if (drinkSize == 'large') {
layout-macro (large)
}
else-if (drink == 'medium') {
layout-macro (medium)
}
else {
layout-macro (small)
}
}
}
Large layout:
layout-macro-def (large) {
content {
single-line {
text(This is LARGE)
}
}
}
Medium layout:
layout-macro-def (medium) {
content {
single-line {
text(This is Medium)
}
}
}
Small layout:
layout-macro-def (small) {
content {
single-line {
text(This is small)
}
}
}

Related

Bixby: want to display two form element text-input in one input form view

I want to build an input form using text-input, in which I want to display multiple text fields in one form.
Making a single view having multiple text fields not providing the output.
So, would it possible to write multiple text-input in a single form or not.
Below is my code which I am trying to implement:
Action:
action (CardDetails) {
type(Search)
collect{
input (creditCard) {
type (CreditCard)
min (Required)
}
input (cvv) {
type (Cvv)
min (Required)
}
}
output (getCardInfo)
}
Structure:
structure (getCardInfo){
property (creditCard) {
type (CreditCard)
min (Optional)
}
property (cvv) {
type (Cvv)
min (Optional)
}
}
Input View:
input-view {
match {
CreditCard (creditCard) {
to-input: CardDetails
}
}
message {
template ("Enter Card Details")
}
render {
form {
elements {
text-input {
id (creditCard)
label (Credit Card)
type (CreditCard)
max-length (20)
value ("#{raw(creditCard)}")
}
text-input {
id (cvv)
label (cvv)
type (Cvv)
max-length (4)
}
}
on-submit {
goal: CardDetails
value: viv.core.FormElement(creditCard)
value: viv.core.FormElement(cvv)
}
submit-button (Ok)
}
}
}
Result View :
result-view {
match: getCardInfo(res){
from-output : CardDetails
}
message{
template ("Here are the details")
}
}
Unable to display result view. Showing I need CVV details to continue.
Any Help on this, Please
I am sure there are other ways, but the easiest way I could think of is to do input-view on the structure. Also it might be just personal style, but I would recommend change the naming, actions should start with something like Get or Create, not the structure name.
input-view {
match: StructCard(this)
message: template ("Give me your card")
render {
form {
elements {
text-input {
id (aaa)
label("Card Number")
type (TextCardNumber)
value("Costco Citi")
}
text-input {
id (bbb)
label("Card CVV")
type (TextCardCvv)
value("No WAY")
}
}
on-submit {
goal: StructCard
value: StructCard {
cardNumber: viv.core.FormElement(aaa)
cardCvv: viv.core.FormElement(bbb)
}
}
}
}
}
There are other minor but subtle changes to the action, check the complete example on GitHub. Utterance "tell me your card".
Here is the input-view
Here is the result-view

Bixby : Display form element slider along with other information

We have to implement a ticket booking system in our capsule, where we need selectbox to select tickets. But I didn't get a selectbox in Bixby. so, I am using slider to select. On that I have to display event with input form element slider. But, unable to display js details and slider on one page.
Link: https://bixbydevelopers.com/dev/docs/reference/type/input-view.render.form.elements.slider
Action :
action (Book) {
type(Search)
collect {
input (rating) {
type (Rating)
min (Required) max (One)
}
input (event) {
type (Event)
min (Optional) max (One)
}
}
output (OrderBooking)
}
Structure :
structure (OrderBooking){
property (event) {
type (Event)
min (Optional)
max (One)
}
property (rating){
type (Rating)
min (Required)
max (One)
}
}
View:
input-view {
match {
OrderBooking (rating)
}
render {
form {
elements {
slider {
id (rating)
min-value (0)
max-value (10)
min-label (0 - Lowest)
max-label (10 - Highest)
step (1)
type (Rating)
}
}
on-submit {
goal: Rating
value: viv.core.FormElement(rating)
}
}
if (exists(rating.ticketName)){
selection-of (rating) {
navigation-mode {
read-many {
page-size (3)
page-content{
underflow-statement (This is the final set)
item-selection-question {
if(exists(rating.ticketName)){
template ("Here are a few suggestions for the events.")
}else{
template (Which one would you like)
}
}
overflow-statement (That's all I have)
}
}
}
has-details (false)
where-each (item) {
layout-macro (book-type-summary) {
param (singlebook) {
expression (item)
}
}
}
}
}
}
}
Layout:
layout-macro-def(book-type-summary) {
params {
param (singlebook) {
type (OrderBooking)
min (Required)
max (One)
}
}
content {
compound-card {
content {
paragraph {
value {
if (exists(singlebook.event)){
template ("#{value(singlebook.event)}")
}
}
style (Detail_M)
}
}
}
}
}
There are two points to this question:
It looks like you would like to display additional information in the input-view. Currently this is not possible. You cannot add content that does not fit in the form you want to present to the user.
Instead of a slider, perhaps it would be better for you to use selection-of (documentation)

Creating selection-of from enum?

I am looking to create an input-view where the user can pick a list of enum symbols.
For example, I have a finite number of Genres, so I placed them into an enum, these are things such as "Fantasy", and "Sci-fi"
I have tried the code below but nothing displays; I check the documentation but all of the selection-of examples are based off concepts that already have data.
Is there a way to create a selection-of input-view where the user can select one or more items, then outputs this as a concept?
input-view {
match {
GenreNames(gnames)
}
message (Select Genre(s))
render {
selection-of (gnames) {
where-each (one) {
single-line {
text {
value (one)
style (Detail_M_Soft)
}
}
}
}
}
}
Try this:
input-view {
match {
GenreNames(gnames)
}
message (Select Genre(s))
render {
selection-of (gnames) {
where-each (gnames) {
single-line {
text {
value {
template ("#{value(gnames)}")
}
style (Detail_M_Soft)
}
}
}
}
}
}

Not sure how to update a struct with new information

A question concerning Bixby Studio.
I am trying to figure out how to accept text-input from the user.
I have a Filter struct with some fields such as SearchField, Genre, Platforms (Gaming consoles), and Themes (A few other entries)
By default, all of these are optional, especially with the search field. However, i would like for the user to be able to visibly see what filters are enabled, and be able to select and change their values (This values can be overwritten by NLP training, but I can't figure out how to disable the field.)
I created a result view for my filters and I've setup input-cells for selecting a specific field to modify. (In this case, SearchField.). I have been successful in redirecting to an input-view, but it seems that no matter what text I put in here, it does not save or apply to my filter.
Looking for some insight into the problem and willing to provide more information as needed.
Some of the things that I have tried in the past, seem to want take the existing context "SearchField" within the filters (which might not exist) and apply it to the new "search field". However, this doesn't work and seems to create a loop.
I've also tried to set the prompt-behavior (AlwaysSelection) in the action model for SetSearchField, but it appears to do nothing.
// Result View for Filters
result-view {
match {
Filter(this)
}
message {
template (Active Filters){
speech (Would you like to change any filters?)
}
}
render {
layout-macro (filter-details) {
param (filter) {
expression (this)
}
}
}
}
// Layout Macro
layout-macro-def(filter-details) {
params {
param (filter) {
type (Filter)
min (Required)
max (One)
}
}
content {
section {
title (Filters)
content {
input-cell {
label (Search Name)
value ("#{value(filter.name)}")
on-click {
intent {
goal: SetSearchField // <-------- Field in question
}
}
}
}
}
}
}
// Input-view for SearchField
input-view {
match {
SearchField(searchField)
}
render {
form {
elements {
text-input {
id (val)
type (SearchField)
required (true)
}
}
on-submit {
goal:SearchField
}
}
}
}
// SetSearchField action
action (SetSearchField) {
description (Sets the name in a search filter)
type (Fetch)
collect {
input (newSearchField) {
type (SearchField)
min (Required)
prompt-behavior (AlwaysSelection)
}
}
output (SearchField)
}
// SetSearchField endpoint
action-endpoint (SetSearchField) {
accepted-inputs (newSearchField)
local-endpoint ("filters/SetSearchField.js")
}
// .js file
module.exports.function = function setName (newSearchField) {
return newSearchField
}
I discovered there is a special way in accessing input form elements for input-views.
Collect input through the form -> elements, then reference them using the viv.core.FormElement(id)
input-view {
match {
SearchField(searchField)
}
render {
form {
on-submit {
goal: SearchField
value: viv.core.FormElement(text)
}
elements {
text-input {
id (text)
type (SearchField)
label (Search for: )
value("#{raw(searchField)}")
}
}
}
}
}

On click method on thumbnail-card in bixby

I am showing multiple choices on user's screen with thumbnail-card in bixby. Have added the slots for click as well. What I am trying to achieve is if user click on the thumbnail, i should get the id of the particular card and process it for further information.This is the layout
layout-macro-def (artist-thumbnail-card) {
params {
param (artistchoice) {
type (ArtistChoiceResult)
min (Required) max (One)
}
}
content {
thumbnail-card {
image-position (Start)
image-url ("#{value(artistchoice.multiple_image)}")
title-area {
halign (Start)
slot1 {
text {
value ("#{value(artistchoice.multiple_name)}")
style (Title_S)
}
}
slot2 {
single-line {
text {
value ("From #{value(artistchoice.multiple_cat)}")
style (Detail_L_Soft)
}
}
}
}
on-click {
intent {
goal: ArtistSearch
}
}
}
}
}
And this is the result view
result-view {
match: ArtistChoiceResult (artistchoice) {
from-output: ArtistChoice
}
message {
template ("Please select one of the following")
}
render {
if (size(artistchoice) > 1) {
list-of (artistchoice) {
has-details (true)
where-each (item) {
layout-macro (artist-thumbnail-card) {
param (artistchoice) {
expression (item)
}
}
}
}
} else-if (size(artistchoice) == 1) {
layout-match (artistchoice) {
mode (Details)
}
}
}
}
I am not able to send the ID information to the artistSearch Intent. How will I achieve that. And I have Id in other variable, so how do i pass that value?
Based on the code you have provided, we have to assume 2 things:
1) This is the result-view that is triggered for an artistchoice structure
2) The multiple_name is an array that holds all the options.
Given the above assumptions, you would need to build a layout where each of the elements of multiple_name (multiple_name[1], multiple_name[2], multiple_name[3], etc.).
Since one on-click event cannot be defined with variable click events, you would need to create a separate card for each multiple choice option so there is one on-click event per card. This would allow the on-click to look like the following:
on-click {
intent {
goal: ArtistSearch
value-set: [YOUR CONCEPT HERE]{$expr(artistchoice.multiple_name[1])}
}
}
If you need any further information, please reach out to the support team where we can discuss any particular issues you're facing that may be unique to your use case.

Resources