Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
BedrockMission!

Learn More

View all

Sign in to view all badges

Enumeration in webapps

Avatar

Avatar
Affirm 1
Level 1
RBE_jonas
Level 1

Like

1 like

Total Posts

22 posts

Correct Reply

1 solution
Top badges earned
Affirm 1
Boost 1
Validate 1
View profile

Avatar
Affirm 1
Level 1
RBE_jonas
Level 1

Like

1 like

Total Posts

22 posts

Correct Reply

1 solution
Top badges earned
Affirm 1
Boost 1
Validate 1
View profile
RBE_jonas
Level 1

21-05-2021

A webapp Page (v5 compatibility), Combo box input -> advanced settings Initialization: "Automatic via an enumeration" suggest we can use enumerations defined outside the webapp to populate a select element in our webpage's HTML.

 

Elements in schemas can use enumerations defined in the schema using attribute
enum="enumName"

 

Or, enum defined in different schema
enum="cus:schemaName:enumName"

 

Or, using a database enum
dbEnum="enumName"

 

However the settings for the combo box have a field "Enumeration Xpath", and however I write the reference to my enum, the select-element remains unpopulated.

 

The enum is of type system, and is working in inputforms using dbEnum="enumName" attribute. Can anyone share some light on how this is supposed to work, please?

Accepted Solutions (1)

Accepted Solutions (1)

Avatar

Avatar
Boost 10
Level 3
CedricRey
Level 3

Likes

24 likes

Total Posts

65 posts

Correct Reply

12 solutions
Top badges earned
Boost 10
Applaud 5
Boost 5
Affirm 5
Give Back
View profile

Avatar
Boost 10
Level 3
CedricRey
Level 3

Likes

24 likes

Total Posts

65 posts

Correct Reply

12 solutions
Top badges earned
Boost 10
Applaud 5
Boost 5
Affirm 5
Give Back
View profile
CedricRey
Level 3

21-05-2021

Hello,

I agree this is a bit confusing.... But if we give a look a little closer, with the builtin webapps (for example 'deliveryOverview', 'webAppOverview' etc. by filtering webApp with "XML memo (data) contains 'contextOptions useContext="2" '), the answer is : the xpath refer to an attribute of the document schema ("Document type" defined into the General properties of the webapp) that use a enumeration.

For example, if you choose "nms:delivery" for your webapp document type, you can put "@state" into the xpath to populate the options with the nms:delivery:deliveryState enumeration values.

It's not impossible that you could use webapp context enumeration maybe ? If I see something I'll give you more precisions.


Cedric

CedricRey
Ok, I didn't noticed that if you need more flexibility, you can load custom values (for example into a script just before the page) and use the context 'ctx' to populate your list : choose the second options "from context" instead of "Automatic via an enumeration". Then you'll have to give the path of your xml list from the ctx (var ctx.mylist = <mylist><value myLabel="xxx" myValue="xxx"/><...></mylist>, just give "[mylist/value]" as options xpath, @myLabel for label xpath and @myValue for xpath value). By this way, you can load another enumeration from anywhere (schemas enums, xtk:enum etc.) to populate your input.
RBE_jonas
Unfortunately, I do not have the default apps you refer to, et least I do not find them when setting a webapp folder to ("folder is a view"). As you suggest I load the enumerations defined in a schema in a script object before the page, and then initiate the combobox "via the context". This works fine for enumerations defined in the schema, but not for enumerations stored in the database. The idea for the client is to have a separate "product" emnumeration they can syncronise with another system without involving editing of schemas. When I try to load the enumeration using
RBE_jonas
When I try to load the enumeration using ctx.enumTest = xtk.enum.load(pirmaryKey).toSource() all I get is <enumTest>({})</enumTest>
RBE_jonas

If anyone else sees this looking for assistance, you can use a javscript object to get all enumerations defined in a schema into ctx like this:

var schema = application.getSchema("cus:schemaName")
for each(var e in schema.enumerations)
{
var enum = eval("<enum_"+ e.label+ "/>");
var options = <options/>;
for each(var item in e.values){
options.appendChild(<option label={item.label} value={item.value} />)
}
enum.options = options.option
ctx.enum = enum
}
CedricRey
Instead of "toSource()", can you try to use "toXML()" ? But also, I'm not sure of what it loads, I'm affraid that xtk:enumValue are not loaded. I'll check and tell you, but I pretty sure that's possible.
RBE_jonas
.toXML() outputs the enumeration attributes, but as you suggested not the enumValues
RBE_jonas
I was hoping there were some well defined functionality using the option "Automatic via an Enumeration" which suggest it does just what im looking for;)
CedricRey

Here it is :

JS Script :

var enumId = 123456789 //xtk:enum ID

var domainsQuery = NLWS.xtkQueryDef.create({
  queryDef : {
    schema : "xtk:enumValue",
    operation : "select",
    select : {
      node : [
        {expr:"@label"},
        {expr:"@name"}
        ]
    },
    where : {
      condition : [
        {expr : "[@enum-id] = " + enumId }
      ]
    }  
   }
});
ctx.domains = new XML( domainsQuery.ExecuteQuery().toXMLString() );

Parameters init context :

Init : From context,

options XPath : [enumValue-collection/enumValue]

label XPath : @label

values XPath : @name

 

You can change the xptah using aliases into the query.

Cedric

RBE_jonas
Ah, I see. That woks perfect. Thank you very much for your assistance.
CedricRey

You're welcome. Also, if you need to load more than one enum, the code is incomplete (because each query will have the same element name "enumValue-collection". If needed :

myResult1 = new XML( domainsQuery.ExecuteQuery().toXMLString() );
myResult1.setName('myResult1'); //this is the real root element name to give to the "options Xptah" instead of "enumValue-collection" as I did before
ctx.myValues1 = myResult1;

... another query...
myResult2 = new XML( anotherQuery.ExecuteQuery().toXMLString() );
myResult2.setName('myResult2') 
ctx.myValues2 = myResult2;
Etc.

 

Then use options XPath : [myResult1/enumValue], [myResult2/enumValue] etc.

Cedric

Answers (0)