Data repository
Function
connection between JS front-end and TM1 back-end
loads data into widgets from TM1
the config file is case-sensitive
Structure
<widged id>: {
<action 1>: {
<action parameter 1>: (db) => {...},
...
<action parameter n>: (db) => {...}
},
...
}
Example:
textWidget1: {
init:
{
url: (db) => `/api/v1/ExecuteMDX?$expand=Cells($select=Ordinal,Value)`,
type: 'POST',
body: (db) => `{"MDX":"..."}`,
parsingControl: {
type: 'object',
query:
{
title: (r, x) => {
return r.Cells[0].Value;
}
}
}
}
},
textWidget2: {
init(ctx) {
return {title: ctx.getWidgetId()};
}
},
buttonWidget1: {
launch:
{
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('systemValueSomething')}"}
]
}`
},
},
buttonWidget2: {
launch(ctx) {
Api.updateContent('otherWidgetId');
}
}
Actions
Init
initialization of widget, with TM1
loading data into widget while rendering
if init is not defined widget is rendered based on widget-config
the result of init overwrite widget-config parameters
Rest request action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,..)
parsingControl: parsing data from TM1 response
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
Examples
Client side mdx rest request
textWidget1: {
init:
{
url: (db) => `/api/v1/ExecuteMDX?$expand=Cells($select=Ordinal,Value)`,
type: 'POST',
body: (db) => `{"MDX":"..."}`,
parsingControl: {
type: 'object',
query:
{
title: (r, x) => {
return r.Cells[0].Value;
}
}
}
}
},
Server side mdx rest request
textWidget1: {
init:
{
url: (db) => `/api/v1/ExecuteMDX?$expand=Cells($select=Ordinal,Value)`,
type: 'POST',
body: (db) => {
return {
param1: 'value'
};
},
parsingControl: {
type: 'object',
query:
{
title: (r, x) => {
return r.Cells[0].Value;
}
}
}
}
},
repository.yml
textWidget1_init: >
{"MDX":"SELECT
{
[sys_parameters].[something]
} on COLUMNS FROM [SYS_PARAMETERS] WHERE ([sys_data].[$param1])
"}
Client side init from application ctx
textWidget1: {
init(ctx) {
return {title: v('otherWidgetId.value')};
}
},
Parsing Control
Object
Result will be an object.
parsingControl: {
type: 'object',
query:
{
title: (r, x) => {
return r.Cells[0].Value;
},
body: (r, x) => {
return r.Cells[1].Value;
}
}
}
It will return:
{
title: 'value from tm1 response in position 0',
body: 'value from tm1 response in position 1'
}
List
Result will be a list
parsingControl: {
type: 'list',
query:
(r, x) => {
return {name: r.Cells[x].FormattedValue, on: x === 0};
}
}
Result will be:
[
{name: 'value from tm1 response in position 0', on: true},
...,
{name: 'value from tm1 response in position x', on: false},
...,
{name: 'value from tm1 response in position last', on: false}
]
Matrix
Result will be matrix.
parsingControl: {
type: 'matrix',
length: 2,
query: [
(r, x) => {
return {value: r.Cells[x].FormattedValue};
},
(r, x) => {
return {value: r.Cells[x].FormattedValue + ' 2022'};
}
]
}
Result will be:
[
[{value: 'tm1 response pos 0'}, {value: 'tm1 response pos 1 concatenated with 2022 string'}],
...
]
Script
This type enable you to write you own parsing logic.
parsingControl: {
type: 'script',
script: (data, widgetId, object, ctx) => {
data // response from tm1
}
}
InitCondition
condition, dependency on init event
if true: init will be executed
if false: initDefault will be executed
initCondition(ctx) {
if(..) {
return true;
}
return false;
},
initDefault(ctx) {
return {};
}
Launch
Action of ButtonWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
launch:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('systemValueSomething')}"}
]
}`
},
},
widget2: {
launch(ctx) {
Api.updateContent('otherWidgetId');
}
}
Choose
Action of DropboxWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
choose:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.choose.value')}"}
]
}`
},
},
widget2: {
choose(ctx) {
Api.updateContent('otherWidgetId');
}
}
cellEdit
Action of HorizontalTableWidget and ScrollTableWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
cellEdit:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.cellEdit.value')}"}
]
}`
},
},
widget2: {
cellEdit(ctx) {
Api.updateContent('otherWidgetId');
}
}
pick
Action of DatePickerWidget
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
pick:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.pick.value')}"}
]
}`
},
},
widget2: {
pick(ctx) {
Api.updateContent('otherWidgetId');
}
}
pasteCells
Action of ScrollTableWidget
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
pasteCells:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Cellsets('${ctx.getObject().init[2].cellsetId}')/Cells`,
type: 'PATCH',
body: (ctx) => `[${v('widget1').pastedCellValues.map((t, i) => `{"Ordinal": ${t.ordinal},"Value": \"${t.value}\"}`)}]`
},
}
switch
Action of SegmentedControlWidget and ToggleWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
switch:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.switch.value')}"}
]
}`
},
},
widget2: {
switch(ctx) {
Api.updateContent('otherWidgetId');
}
}
slide
Action of SliderWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
slide:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.slide.value')}"}
]
}`
},
},
widget2: {
slide(ctx) {
Api.updateContent('otherWidgetId');
}
}
write
Action of TextWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
write:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.write.value')}"}
]
}`
},
},
widget2: {
write(ctx) {
Api.updateContent('otherWidgetId');
}
}
save
Action of TextAreaWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
save:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.save.value')}"}
]
}`
},
},
widget2: {
save(ctx) {
Api.updateContent('otherWidgetId');
}
}
writeEnd
Action of TextBoxWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
writeEnd:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.writeEnd.value')}"}
]
}`
},
},
widget2: {
writeEnd(ctx) {
Api.updateContent('otherWidgetId');
}
}
writeKey
Action of TextBoxWidget.
Action parameters
url: URL of the request
body: body of the request
type: type of request (POST, GET,…)
validation: validation of current state. if success = false -> no request, warning message
server: boolean (optional, default false) if mdx stored on the server side in repository.yml
widget1: {
writeKey:
{
validation(ctx) {
if(...) {
return {
success: false,
message: 'validation failed'
};
}
return {success: true};
},
url: (ctx) => `/api/v1/Processes('processname')/tm1.ExecuteWithReturn`,
type: 'POST',
body: (ctx) => `{
"Parameters": [
{"Name": "pParam1", "Value": "${ctx.activeUserName}"},
{"Name": "pParam2", "Value": "${v('widget1.writeKey.value')}"}
]
}`
},
},
widget2: {
writeKey(ctx) {
Api.updateContent('otherWidgetId');
}
}