Only this pageAll pages
Powered by GitBook
1 of 40

TuumIO Platform

Loading...

Protocol Overview

Loading...

Loading...

Protocol Guide

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

TuumIO Wallet User Manual

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Tutorials

Loading...

Loading...

Loading...

Home

Discover everything you need to know about the platform with our comprehensive documentation.

Introduction

What is TuumIO Protocol?

TuumIO.Protocol is a secure and decentralized platform that empowers individuals to take control of their data using blockchain technology. It is designed to reduce reliance on centralized IT systems and provides a foundation for Web3 development.

Key Components

Chains: Enterprise-level solutions that offer a wide range of products and services categorized by various industries, such as healthcare, finance, gaming, and more.

dApp: A decentralized application in Web3 that offers various functionalities, including interactions, data exchanges, and workflows for specific user roles.

TuumIO Wallet: A mobile application that allows users to store and manage digital assets, and serves as a gateway to chains and dApps.

Use Case Examples

Remote patient monitoring

Facilitates treatment adjustments and supports patients in managing their conditions remotely, without direct intervention from care providers.

Insurance claims processing

Manages the submission and processing of insurance claims. Patients can submit claims for reimbursement plans, such as vision or dental insurance, ensuring faster and more transparent processing.

Employee rewards system

Addresses burnout and high turnover among employees by implementing a rewards system. This can include gift cards, paid time offs, discount vouchers, wellness programs, and more.

What is TuumIO Protocol?

Get an overview of the core components of the protocol.

Protocol Guide

Learn how to build and author decentralized applications (dApps).

Tutorials

Create an Event Booker Create a Library Explorer

Components

This section describes the structured files and modules that can be configured in TuumIO Protocol.

input.json

The input.json file is a hierarchical structure of objects defined within a network. It contains information about the network, roles, journeys, cards, events, event handlers, and TuumIO ledgers.

TuumIO Data Node

The TuumIO Data Node (TDN) serves as the network's central database for storing and processing data files. It facilitates data exchange with external client systems, including electronic medical records, claims systems, member systems, and payment systems.

TuumIO Card definitions

A TuumIO Card is an interactive module encapsulating multiple data types, user interface elements, and interoperable functions. The TuumIO Card definition structure includes card data, layout, card footer, and UI actions.

Event definitions

Events define the interactions and communication between roles or nodes in the network, such as sending and receiving information. Events are chained together in a time series on a blockchain, creating a secure, transparent, and immutable record of transactions within the network.

Event handlers

An event handler is a set of instructions that execute tasks based on specific events. These tasks include updating records, transforming data, and identifying recipients for the next event.

Python event handlers

Python event handlers are designed to execute complex events and transactions that require data processing, analysis, import, and export. They can fetch external data in HL7, X12 EDI, XML, JSON, or CSV formats.

Resources

Resources contain predefined data that is inserted or updated automatically during initialization.

Transactional data

Transactional data consists of configurable data that can be referenced from roles, cards, or events within the network.

Test and Publish

Deployment readiness checklist

Before testing and publishing the network, make sure that:

About TuumIO Wallet

TuumIO Wallet Your all-in-one companion for managing health, finance, and beyond. TuumIO Wallet connects you to a wide range of app networks, including the powerful Care.Trials, giving you complete control over the healthcare services you choose to use.

Powered by blockchain technology, TuumIO Wallet ensures your data remains secure and private. With no ads and total privacy protection, your information is never accessed, aggregated, brokered, or sold without your consent. Only you can see what's in your TuumIO Wallet—not even TuumIO has access.

Care.Trials Join groundbreaking clinical trials with TuumIO Wallet. Care.Trials connects you to the latest medical research studies, seeking participants for conditions like cancer, diabetes, mental health, and more. Find local wellness and prevention studies, and take part in the journey toward better medicine.

Buy SOLVE Easily purchase SOLVE tokens directly in your TuumIO Wallet using traditional payment methods. Choose the amount you want in SOLVE or USD.

Track Your SOLVE Keep an eye on your SOLVE activity with the SOLVE Transaction Statement, tracking all your interactions within the app network.

Care.Trials

Get Started

TuumIO Protocol defines the rules governing information communication and data exchange. It employs an event-driven architecture and utilizes JSON files to represent configurations for roles, relationships, journeys, events, and interactions. By using standard data structures, it reduces complexity and enables interoperability between systems.

In this guide, you'll learn how to manually author TuumIO Protocol using provided examples.

Structure of files and folders

Prerequisites

Before you begin, ensure you have the following:

  • An Integrated Development Environment (IDE) or a text editor to manually author files.

  • The required Python packages to configure and run Python event handlers.

  • Postman API platform and the network environment details for publishing.

  • BrowserStack, a cloud web and mobile testing platform, for testing the application.

Figure 1: Use case diagram for remote patient monitoring
├── sample-network/
     ├── definitions/
     │    ├── card/
     │    ├── ddf/     
     │    ├── event/
     │    ├── event-handler/
     │    ├── python-event-handler/
     │    ├── resources/
     │    └── td/
     └── input.json 
remote-patient-monitoring-use-case

Transactional Data

This section shows the structure and attributes of transactional data.

Transactional data contains configurable data that can be referenced from roles, cards, or events within the network. The following example shows the definition of transactional data in td/td-default.json.

Example:
{
    "id": "td-default",
    "path": "td/td-default.json",
    "definition": {
        "collection": "DEFAULT",
        "description": "DEFAULT",
        "name": "DEFAULT",
        "resource": "DEFAULT",
        "status": "RELEASED",
        "type": "TRANSACTIONAL_DATA"
    },
    "structure": {
        "attributes": [
            {
                "code": "transactionalGuid",
                "name": "transactionalGuid",
                "type_definition": {
                    "type": "string"
                },
                "order": 1,
                "required": false,
                "system": false
            },
            {
                "code": "createdAt",
                "name": "createdAt",
                "type_definition": {
                    "type": "timestamp"
                },
                "order": 2,
                "required": false,
                "system": false
            },
            {
                "code": "answer",
                "name": "answer",
                "type_definition": {
                    "type": "string"
                },
                "order": 3,
                "required": false,
                "system": false
            },
            {
                "name": "senderNodeAddress",
                "code": "senderNodeAddress",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "order": 4
            }
        ]
    }
}
insurance-claims-processing-use-case
Figure 2: Use case diagram for insurance claims processing

Create a Library Explorer

Overview

Welcome to the Library Explorer example, an app designed for exploring educational materials in a digital library. The underlying structure can be adapted for Web3 integration, allowing you to extend the app's functionality such as minting non-fungible tokens (NFTs) for digital content like e-books.

Here's how the app works:

  1. Launch the app.

  2. Fill in the details of the material that match your interest (title, author, subject).

  3. Browse the catalog of recommended materials.

Steps

Support

Our support team is here for you! Reach out at [email protected].

Join the conversation:

  • Telegram

  • Discord

Build a dApp

This section outlines the steps involved in authoring the protocol for building decentralized applications (dApps).

Note: Ensure that all fields and values adhere strictly to the protocol structure and specifications.

Understand the structure of the input.json file

  • Open the input.json file in a text editor.

  • Save and validate the input.json file.

Define the data structure

Create the definitions for cards

Create events and event handler definitions

Configure Python event handlers

Nurse

Reviewing ID and medical records

  1. Sign in to the TuumIO Wallet app.

  2. Approve or reject the records.

Viewing history of reviewed records

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

Reviewing lead eligibility

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Select the lead you want to review.

    • View the details of the trial

    • Ask a question to the lead

  4. Approve or reject the lead.

Viewing lead verification details

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

Architecture

Application Layer

The Application Layer handles configuration, administration, and communication within networks, allowing users to interact with decentralized applications (dApps).

  • TuumIO Wallet: A mobile app that allows users to store and manage digital assets and serves as a gateway to various industry services and dApps.

  • Journeys: A sequence of interconnected cards outlining specific workflows for roles such as participants, administrators, managers and employees.

  • TuumIO Card: An interactive module that combines text, images, buttons, and interoperable functions on the app's user interface.

  • TuumIO Network: A digital network of various healthcare roles, operating based on the rules defined in the TuumIO Protocol.

  • TuumIO Protocol: A governance framework that defines the rules for data exchange and communication, facilitating secure transactions and interactions within the network.

Data Layer

The Data Layer provides secure, transparent, decentralized data storage and records management.

  • MainNet: Holds the core registry service that maps TuumIO Wallet users to their respective TuumIO Networks, such as the country matrix for region-based services.

  • Event Ledger: A decentralized, immutable record of event logs from sender and recipient node addresses, including payload data.

  • TuumIO Data Node (CDN): A specialized node created for each network. It manages data storage, processing, and exchanges with external systems.

Compute Layer

The Compute Layer manages core operations and node management, ensuring secure data and event transmission across the network.

  • TuumIO Node: An entity that manages data storage and event handling across the network. It is a secure, versatile object deployable in any environment.

  • Network Onboarding Manager (NOM): Facilitates the initial creation and assignments of TuumIO Nodes upon joining the network.

  • Node Lifecycle Manager (NLM): Manages the creation and lifecycle states of TuumIO Nodes, including active, start, stop, and hibernate states.

  • Base Node Services (BNS): Ensures secure transmission of events and data through the blockchain.

Definition of Terms

This section provides definitions for the key terms used throughout this documentation.

SOLVE Tokens

Buying SOLVE

  1. Sign in to the TuumIO Wallet app.

  2. Enter the amount in USD.

  3. The equivalent amount in SOLVE is calculated automatically.

  4. Tap Buy.

Depositing SOLVE

  1. Sign in to the TuumIO Wallet app.

  2. From the bottom navigation bar, tap FUNDS.

Transferring SOLVE

  1. Sign in to the TuumIO Wallet app.

  2. From the bottom navigation bar, tap FUNDS.

  3. Enter the amount in SOLVE.

  4. Tap Transfer.

  5. Tap Confirm.

Paying bills

  1. Sign in to the TuumIO Wallet app.

  2. From the bottom navigation bar, tap FUNDS.

  3. Select the bill you want to pay.

  4. Send your payment.

Viewing transactions history

  1. Sign in to the TuumIO Wallet app.

  2. From the bottom navigation bar, tap FUNDS.

User Profile

The Profile screen allows users to view the details they have saved in the application. The following information is displayed:

  1. Wallet ID

  2. Nickname

  3. Country

  4. Verification method

  5. Financial information

The information is clearly labeled so users understand which details are public, private, or shared only with us. Users can update their nickname and financial information; however, other details cannot be changed.

Users can also view detailed descriptions of each field and learn how their data is being securely stored.

Additionally, users have the option to delete their wallet account if they no longer wish to use the service.

Overview

Getting started

Participate in clinical trials to help discover new treatments and contribute to medical advancements. Join Care.Trials and search for clinical trials near you.

Types of roles in Care.Trials

  • Participants — When you join Care.Trials as a participant, you will have access to available trials that match your profile. Use swiping to like or skip matched trials.

  • Physician — The physician, also known as principal investigator, helps connect patients to relevant clinical trials. In Care.Trials, the physician can browse trials, refer patients and search for trial sponsors.

  • Site Admin — The site admin helps coordinate clinical trials in a specific site location. In Care.Trials, the site admin can view leads and interact with the participants.

  • Trial Admin — The trial admin oversees the clinical trials in all sites. In Care.Trials, the trial admin can activate trials and set the budget for a trial site.

  • Nurse — The nurse in Care.Trials can review medical records and verify the eligibility of participants.

Joining the Care.Trials network

  1. Sign in to the TuumIO Wallet app.

  2. Please review the terms and conditions.

  3. Tap the join button.

  4. Wait up to 5 minutes to connect your TuumIO Wallet to the network.

Testing the app using BrowserStack

  1. Sign in to your account.

  2. From the homepage, navigate to App Live.

  3. Upload the app.

  4. Select the operating system and device model.

  5. Wait for the app to load on the device, then start testing. Note: To view event payload and analyze data flow, select the Network tab > Enable for all traffic, and then save the configuration.

Caira - AI Assistant

Caira is an AI Patient AIdvocate here to provide you with a "wow" experience on Care.Trials. Caira is focused on helping you understand clinical trials and the benefits they offer. Whether it's discovering new opportunities for improving your health or meeting people from different walks of life, Caira is here to assist you with all the information you need about becoming a part of Care.Trials. If you have any questions, feel free to ask!

Using Caira Assistant

  1. Sign in to the TuumIO Wallet app.

  2. Share your query to Caira.

Need Help?

Ask the Community

View or modify the .

In the network settings, fill in the and specify the .

Configure the and set up .

Define the and .

Declare the included , , and .

If necessary, include details about .

Create a based on how you want to organize data.

Define the structure of the .

Define the , including and .

Configure the and .

Configure .

Understand the predefined functions in the .

Perform the steps to configure an event based on the .

From the Manage Networks screen, tap Care.Trials.

Tap Manage the Records > Pending record review.

Review the attached records, then fill in the participant details.

Tap Record > Reviewed records.

Select the record details you want to view.

Tap Review Trials Liked by Leads > Pending Review.

Do either of the following:

Tap Review Trials Liked by Leads > Reviewed Leads.

Select the lead verification details that you want to view.

Node Vault: A secure and decentralized storage of data for TuumIO Nodes, with backups stored in .

Term
Definition

From the bottom navigation bar, tap FUNDS.

Select Buy SOLVE.

Select the payment method and enter details.

Select Deposit SOLVE.

Scan the QR code or copy the deposit address.

Select Transfer/Gift SOLVE.

Enter the Wallet ID or Scan the QR code of receiver.

Enter your PIN code.

Select Pay Bills.

Select Transactions History.

Select a transaction to view the details.

To open the profile screen, tap 'Profile' from the bottom navigation bar.

From the CTN Home screen, select the role you want to join.

Tap any card of the role.

Open a web browser, and then go to .

For more information on testing mobile apps in App Live, see the .

From the bottom navigation bar, tap Caira.

Allow the app to access your device's microphone.

You will see the result to your requested query.

📧
🤖

TuumIO Card (Card)

An interactive module encapsulating multiple data types, user interface elements, and interoperable functions. "TuumIO Card" and "Card" are used interchangeably in this document.

TuumIO Data Node (TDN)

A specialized node that acts as a database, facilitating secure data storage, retrieval, and exchange with external systems.

TuumIO Ledger

A decentralized record of events or transactions within a network, as defined by the protocol.

TuumIO Network (Network)

A digital network of various healthcare roles, operating based on rules defined in a TuumIO Protocol. "TuumIO Network" and "Network" are used interchangeably in this document.

TuumIO Node (Node)

A secure digital entity that enables secure data exchange and event handling. "TuumIO Node" and "Node" are used interchangeably in this document.

TuumIO Protocol (Protocol)

A governance framework that defines the rules for data exchange and communication in networks. "TuumIO Protocol" and "Protocol" are used interchangeably in this document.

TuumIO Wallet (Wallet)

A mobile app that serves as a gateway to various industry services and dApps. It provides a secure way to store and manage digital assets and records. "TuumIO Wallet" and "Wallet" are used interchangeably in this document.

TuumIO Vault (Vault)

A decentralized storage, facilitating secure data management and storage.

Chain

An enterprise-level solution that offers various industry services.

dApps

A decentralized application in Web3 that offers various functionalities, including interactions, data exchanges, and workflows for specific user roles.

Data definition file (DDF)

A JSON file specifying the structure of data stored within the TuumIO Data Node, defining data elements, data types, and validation rules.

Event

A message or record signifying an occurrence within a network or journey. Events define interactions and communications between roles and nodes.

Event Handler

A set of instructions that execute tasks based on specific events. These tasks include updating records, transforming data, and identifying recipients for the next event.

Journeys

A sequence of interconnected TuumIO Cards, defining functionalities, including interactions, data exchanges, and workflows for specific user roles.

Role

A fundamental element in the protocol that defines a specific participant type, such as patient, physician, admins, etc. Each role is associated with corresponding consents and cards within the protocol.

SOLVE

A cryptocurrency utility token used throughout the platform to facilitate payments and transactions.

Tile

A modular component in a card user interface that displays data or provides functionality.

network details
author details
supported countries
join network settings
solve token usage
roles
journeys
cards
events
event handlers
tuumIO ledgers
data definition file
transactional data
card structure
tiles
functions
events
event handlers
node event handlers
Python template
use case example
Storj
https://www.browserstack.com/
BrowserStack documentation

TuumIO Data Node

How TuumIO Data Node works?

The TuumIO Data Node (TDN) is responsible for storing and exchanging data files within the TuumIO Network. It can convert external data files into events, and events into external data files. When receiving data files, the TuumIO Data Node extracts and transforms the data, and then creates events. Event handlers can be created in TuumIO Protocol to manage the events generated by the TuumIO Data Node.

Data definition file

The data definition file (DDF) defines the model and structure for organizing data in the TDN. This file is used in TDN to process incoming data files and generate events for distribution to TuumIO Nodes. The DDF and raw CSV files are uploaded to the environment repository for processing. For more information, see Updating TDN.

The following example shows data definition in ddf/us-doctors-sample.json.

Example:
{
    "ddf_type": "us-doctors-sample",
    "meta_data": {
        "description": "Sample"
    },
    "messages": [
        {
            "message_category": "CSV",
            "message_type": "Doctors",
            "meta_data": {
                "description": "Sample",
                "indices": "us-doctors-sample"
            },
            "events": [
                {
                    "to_role": "rl-patient",
                    "event": "ev-cdn-broadcast"
                }
            ],
            "attributes": [
                {
                    "name": "Provider",
                    "description": "Provider",
                    "required": false,
                    "index_field": true,
                    "type": "integer",
                    "data_location": "Provider"
                },
                {
                    "name": "License",
                    "description": "License",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "License"
                },
                {
                    "name": "Specialization",
                    "description": "Specialization",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "Specialization"
                },
                {
                    "name": "Address",
                    "description": "Address",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "Address"
                }
            ]
        }
    ]
}

User Access

Signing up to TuumIO Wallet

  1. Open the TuumIO Wallet app from your mobile device.

    • Choose 'Continue with Facebook' to sign up using your Facebook account.

  2. Allow the app to use biometrics for added security when accessing your account.

  3. Use fingerprint scan or facial recognition.

  4. Wait a few seconds for your account to be created.

Save your recovery phrase and keep it in a safe place. For complete instructions, see Saving your recovery phrase.

Signing up to TuumIO Wallet using Apple ID on iOS device

  1. Open the TuumIO Wallet app from your mobile device.

  2. Tap Create a new TuumIO Wallet.

  3. Allow the app to access your device's location.

  4. Authorise the app to create account using your Apple ID.

  5. Set up a 6-digit Wallet PIN, and then proceed.

  6. Wait a few seconds for your account to be created.

Signing in to TuumIO Wallet

  1. Open the TuumIO Wallet app from your mobile device.

  2. If biometrics is enabled, use fingerprint scan or facial recognition.

  3. Wait a few seconds for the home screen to load.

Resetting your passcode

  1. Open your TuumIO Wallet app.

Saving your recovery phrase

  1. Sign in to your TuumIO Wallet app.

  2. Enter your Wallet PIN, then tap Next.

If you lose your mobile device or uninstall the app, you can use the recovery phrase to restore your access to TuumIO Wallet.

Recovering the access

  1. Open the TuumIO Wallet app from your mobile device.

  2. Tap 'I already have a TuumIO Wallet'.

  3. Allow the app to use biometrics for added security when accessing your account.

  4. Use fingerprint scan or facial recognition.

  5. Wait a few seconds for the home screen to load.

Participant

Getting matched for clinical trials

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Start to proceed**.**

  4. Tap Submit.

  5. Wait up to 5 minutes to search for available trials near you.

Swiping matched trials

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Like the trial you want to participate in. You can also skip or go back to the previous trial.

Uploading your medical records and ID

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Select a file from your device or take a photo.

  4. Tap Upload.

Submitting records for review or verification

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Records Review and ID Verification.

  4. Confirm your payment.

Viewing records history

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Records Review and ID Verification.

Managing liked trials

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

    • Matched — View the clinical trials you liked that the site admin has responded to.

    • No response — View the clinical trials you liked that the site admin has not yet responded to.

    • Not a fit — View trials you liked but don't match your profile.

TuumIO Ledgers

TuumIO Ledger specifications

A TuumIO ledger is used to store and manage data related to events or transactions within the network. If necessary, include details about tuumIO_ledgers and tuumIO_ledger_tags in your protocol.

Use tags to categorize data within TuumIO ledgers, such as Appointments, Prescriptions, Results, and others.

Declare the attributes and values for the TuumIO ledgers.

Trial Admin

Activating a trial

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Activate Trial.

  4. Tap Request code. Wait for the activation code to be sent to your email.

  5. Tap Activate.

Updating trial info

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Update.

Setting the budget

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Select the site you want to update.

  4. Tap Submit.

Checking the site statistics

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Select the site you want to update.

Tap Create a new TuumIO Wallet.

Allow the app to access your device's location.

Choose a method for signing up. Do one of the following:

Choose 'Receive a code via email' to sign up via your email address.

Choose 'Receive a code on your phone' to sign up via your phone number.

If necessary, enter the one-time code sent to you, and then proceed.

Set up a 6-digit Wallet PIN, and then proceed.

Choose 'Continue with Apple' method for signing up.

Tap 'I already have a TuumIO Wallet'.

Enter your 6-digit PIN, and then proceed.

From the "Login using PIN" screen, tap "Forgot PIN?". \

Enter the one-time code sent to you, and then proceed.

Set up a new Wallet PIN for your account.

From the Side Menu screen, tap Backup.

Allow access to view the recovery phrase.

Copy the phrase or write it down.

Enter your recovery phrase.

Enter your Wallet PIN, and then proceed.

Tap Start Here.

To get an overview of the next steps, watch the video. To read the FAQs, tap Learn more.

Answer the 5 questions to create your profile for matching clinical trials.

Agree to the terms and conditions and privacy policy.

Tap See Trials Near You.

Swipe left or right to browse through available trials.

Tap Records and ID.

Select Upload records and ID.

Select the type of attachment you want to upload.

Select Records Review and ID Verification.

Select the record or ID you want to submit.

Attach the file, then select your payment option.

Select Records & ID History.

Select the record or ID that you want to view. \

Tap See your Likes and Matches.

In the "Trials you liked" screen, select any of the following:

Field Name
Value
Description
Field Name
Value
Description

Tap Start Here.

Tap Step 1: Request admin code.

Enter the Trial ID and the email address where you want the activation code to be sent.

Tap Step 2: Activate admin role.

Enter the activation code you received in Step 1.

Tap Start Here.

In the "Active trials" list, select the trial you want to update.

Select Update trial info.

Fill in the details you want to modify.

Tap Manage Sites.

Tap View budget requests.

Select the site and the budget request you want to view.

To approve the request, tap Set Budget.

Enter the amount in SOLVE, then add a comment.

Tap Manage Sites.

Tap Check site statistics > Update.

id

string

The unique ID of the TuumIO ledger tag.

name

string

The name of the TuumIO ledger tag.

Example:
        "care_ledger_tags": [            
            {
                "id": "clt-Answer-QA",
                "name": "Answer QA"
            },
            {
                "id": "clt-Request-Appointment",
                "name": "Request Appointment"
            }
        ],

id

string

The unique ID of the tuumIO ledger.

name

string

The name of the tuumIO ledger.

description

string

The description of the tuumIO ledger.

event_id

string

The reference ID of the event to be recorded in the tuumIO ledger.

private_cards

array

The cards with consent to view.

public_cards

array

The cards associated to the event record, which can be shared across the network.

tuumIO_ledger_tags

array

The reference IDs of the tuumIO ledger tags.

Example:
        "care_ledgers": [
            {
                "id": "cl-e-PSbUgucq4Z8zCSemaBiuSyc2uijm8",
                "name": "Answer QA",
                "description": "Answer QA",
                "event_id": "e-w-broad-sendqa-next",
                "private_cards": [],
                "public_cards": [
                    "cd-wv129h6n1lr1ognzepj2abp1iqvp"
                ],
                "care_ledger_tags": [
                    "clt-Answer-QA"
                ]
            },
            {
                "id": "cl-e-PSbUgucq4Z8zCSemaBiuSyc2jXg4",
                "name": "Request Appointment from Patient to Doctor",
                "description": "Request Appointment from Patient to Doctor",
                "event_id": "e-w-broad-shareAppt-next",
                "private_cards": [],
                "public_cards": [
                    "cd-mwlyle6o9ko65ojdorbrg259g761"
                ],
                "care_ledger_tags": [
                    "clt-Request-Appointment"
                ]
            }
        ]    
Figure 3: Use case diagram for an employee rewards system
employee-rewards-system-use-case
Figure 4: High-level Platform Architecture

Python Event Handlers

This section provides examples on how to configure Python event handlers.

The Python event handler contains a set of base classes that provide an interface to the platform's core components, such as Vault, Wallet, Node, and TuumIO Data Node (TDN). The following template includes base classes and functions that provide features to retrieve, search, update, and save data.

Python template

Example:
class TDN:
    def __init__(self, index: str):
        self.context = context
        self.index = index
    def find_all(self, parameters: SearchRequest) -> List:
        return self.context.getCareDataNodeProvider().findAll(self.index, parameters)
    def find_first(self, parameters: SearchRequest) -> SearchResponse:
        return self.context.getCareDataNodeProvider().findFirst(self.index, parameters)
    def raw_search(self, from_row, num_rows, search_request) -> List:
        return self.context.getCareDataNodeProvider().rawSearch(self.index, from_row, num_rows, search_request)

class Wallet:
    def __init__(self):
        self.context = context
    def get_wallet_profile(self) -> WalletProfile:
        return self.context.getMainNetNodeProvider().getMainNetProfile(ProfileType.WALLET)
    def get_phone_profile(self) -> PhoneProfile:
        return self.context.getMainNetNodeProvider().getMainNetProfile(ProfileType.PHONE)
    def get_contact_profile(self) -> ContactProfile:
        return self.context.getMainNetNodeProvider().getMainNetProfile(ProfileType.CONTACT)
    def update_wallet_profile(self, data: Map, attribute_mapping: Map) -> Map:
        self.context.getMainNetNodeProvider().updateWalletProfile(data, attribute_mapping)
        return data
    def update_phone_profile(self, data: Map, attribute_mapping: Map) -> Map:
        self.context.getMainNetNodeProvider().updatePhoneProfile(data, attribute_mapping)
        return data
    def update_contact_profile(self, data: Map, attribute_mapping: Map) -> Map:
        self.context.getMainNetNodeProvider().updateContactProfile(data, attribute_mapping)
        return data

class Vault:
    def __init__(self):
        self.context = context
    def save(self, collection: str, data: Map) -> Map:
        vault = self.context.getVaultStorage(collection)
        guid = vault.save(data)
        return vault.getByGuid(guid)
    def update(self, collection: str, criteria: List, data: Map, insert_if_absent: bool) -> Map:
        vault = self.context.getVaultStorage(collection)
        guid = vault.update(criteria, data, insert_if_absent)
        return vault.getByGuid(guid)
    def search(self, collection: str, filters: List) -> List:
        vault = self.context.getVaultStorage(collection)
        return vault.search(filters)

class Node:
    def __init__(self, context: HandlerExecutionContext):
        self.context = context

    def info(self) -> NodeInfo:
        return self.context.getNodeInfo()


def execute(ctx: HandlerExecutionContext) -> Map:
    result = HashMap(arguments())
    # PUT YOUR CODE HERE
    return result

Use case example

  1. Define the event in the input.json file.

Example:
{
    "id": "ev-tdn-broadcast",
    "name": "N.TDN.BROADCAST.MESSAGE",
    "code": "N.TDN.BROADCAST.MESSAGE",
    "description": "TDN broadcast message",
    "status": "Active",
    "type": "NODE_TO_ROLE",
    "from_role": "DATA_NODE",
    "to_role": "PATIENT",
    "event_definition_ref": "event/ev-cdn-broadcast.json",
    "node_event_handlers": [
      "eh-n-patient-process-py"
    ]
  }
  1. Create the event definition: event/ev-cdn-broadcast.json.

Example:
{
  "definition": {
    "description": "Broadcast TDN message",
    "name": "N_TDN_BROADCAST_MESSAGE",
    "resource": "N_TDN_BROADCAST_MESSAGE",
    "type": "EVENT_DATA"
  },
  "structure": {
    "attributes": [
      {
        "code": "transactionalGuid",
        "name": "transactionalGuid",
        "type_definition": {
          "type": "string"
        },
        "order": 1,
        "system": false
      },
      {
        "code": "indexName",
        "name": "indexName",
        "type_definition": {
          "type": "string"
        },
        "order": 2,
        "system": false
      },
      {
        "code": "ddfType",
        "name": "ddfType",
        "type_definition": {
          "type": "string"
        },
        "order": 3,
        "system": false
      },
      {
        "code": "msgType",
        "name": "msgType",
        "type_definition": {
          "type": "string"
        },
        "order": 4,
        "system": false
      },
      {
        "code": "attributes",
        "name": "attributes",
        "type_definition": {
          "type": "collection",
          "item_type_definition": {
            "type": "string"
          }  
        },
        "order": 5,
        "system": false
      }
    ]
  }
}
  1. Define the event handler in the input.json file.

Example:
 {
    "id": "eh-n-patient-process-py",
    "name": "N.TDN.BROADCAST.MESSAGE",
    "description": "N.TDN.BROADCAST.MESSAGE",
    "status": "Active",
    "event": "ev-tdn-broadcast",
    "type": "NODE_EVENT_HANDLER",
    "python_event_handler_ref": "python-event-handler/eh-n-patient-process.py"
  }
  1. Create a Python event handler definition that saves the data.

Example:
def execute(ctx: HandlerExecutionContext) -> Map:
    result = HashMap(arguments())
    # PUT YOUR CODE HERE
    start_row = 0
    num_rows = 10
    query = {
      "match_all": {}
    }
    page = CDN('DOCTORS').search(start_row, num_rows, query)
    Vault('MY_DATA').save(page.getContent())
    return result

Site Admin

Activating a site

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Activate Site.

  4. Tap Request code. Wait for the activation code to be sent to your email.

  5. Tap Activate Site.

Buying leads

In TuumIO Trials, a lead is a potential participant in clinical trials. Make sure you have enough SOLVE balance to buy a lead. For instructions on how to buy SOLVE, see Buying SOLVE tokens.

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Buy the lead you want to buy.

Updating trial info

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Update.

Upgrade your plan

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

Buying campaigns

You must upgrade your plan in order to buy campaigns.

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. In the "Active site" list, select the trial you want to update.

  4. Tap Buy Now, then confirm your payment.

Requesting budget

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. In the "Active site" list, select the trial you want to update.

  4. Tap Request.

Checking statistics

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. In the "Active site" list, select a trial.

Connecting with the lead

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

    • Share trial info — Share the details about the trial with the participant.

    • Participant records & ID — Request records and ID from the participant.

    • Ask a question — Send questions to the participant.

    • Set an appointment — Send an appointment request to the participant containing the trial facility details.

Submitting records to Nurse for review and verification

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. In Purchased Leads, select the lead you want to connect with.

  4. Select the record you want to submit for review or verification.

Card Definitions

This section describes the structure of card definitions, including card data, card layout, card footer, and card UI actions.

All card definitions must be included in the input.json file.

Cards

A card contains multiple data types, user interface elements, and interactive functions triggered by events.

Card definition structure

Each card definition is located in the /definitions/card/ folder.

  • Card data - The information or data displayed within the card, such as texts, images, and links.

  • Card layout - The arrangement and organization of elements within the card, including body content style, and footer menus.

  • Card footer - The additional options, navigation buttons, or menus at the bottom of the card for user interaction and navigation.

  • Card UI actions - The actions triggered by user interactions within the card, such as navigation, form submissions, or data updates.

Card data

Card data can include text, images, links or different types of information relevant to a healthcare journey.

Card layout

Card footer

The card footer includes buttons or actions used to interact with the card itself or navigate to other related cards. These buttons or actions can perform specific tasks like submitting information, saving changes, or going back to previous screens.

Card UI actions

The card UI actions define user interactions within the card's content. These actions trigger functionalities like navigation, data updates, input validation, or external function calls.

Tap Activate your site.

Tap Step 1: Request site code.

Enter the Trial ID and the email address where you want the activation code to be sent.

Tap Step 2: Activate site role.

Enter the activation code sent to your email.

Tap See Your Matches.

Tap Previous or Skip to browse through matched leads.

Tap Activate your site.

In the "Active site" list, select the trial you want to update.

Select Update trial info.

Fill in the details you want to modify.

Tap Activate your site.

In the "Active site" list, select the trial you want to upgrade plan.

Tap Upgrade plan.

From Explore Plans screen, tap on Upgrade Plan button.

Tap on Confirm to confirm your payment.

Your plan will be subscribed.

Tap Activate your site.

Tap Buy campaign.

View each campaign card to see more details.

Tap Activate your site.

Tap Track Budget > Request budget.

Enter the amount, then add a comment.

Tap Activate your site.

Tap Check statistics > Update data.

Tap Connect and Engage.

In Purchased Leads, select the lead you want to connect with.

In the "Connect with the Lead" section, do any of the following:

Tap Connect and Engage.

In the "Connect with the Lead" section, tap Participant records & ID.

Tap Submit for review & verification.

Tap Submit to Nurse.

Field Name
Value Type
Description

The card body displays the card's content, which includes tiles, texts, images, and interactive functions. For information on supported tiles, see . For details on supported functions, see .

id

string

The unique ID of the card.

name

string

The name of the card.

description

string

The description of the card.

status

string

The status of the card is set to Active.

card_definition_ref

string

The reference to the UI component of the card.

side

string

The side on which data is presented.

role

string

The role ID is referenced in the card.

transaction_data_ref

string

The reference to the transaction data used upon initialization.

journey

string

The journey to which the card belongs.

outgoing_events

array

The events or actions triggered by the card.

pre_rendering_events

array

The events or actions used to initialize the card.

Example:
    "cards": [
      {
        "id": "cd-start-rl-patient",
        "name": "Patient start card",
        "description": "Start card for patient",
        "status": "Active",
        "card_definition_ref": "card/cd-start-rl-patient.json",
        "side": "PUBLIC",
        "role": "rl-patient",
        "transaction_data_ref": "td/td-default.json",
        "private_card": "",
        "base_card": "",
        "journey": "jn-start-journey",
        "outgoing_events": ["ev-patient-nav-to-cd-next"],
        "pre_rendering_events": [],
        "post_rendering_events": []
      }
    ],
Example:
{
    "id": "cd-start-rl-patient",
    "name": "Get started",
    "cardData": {
        "Tile11000vtext": "Welcome to my TuumIO network!",
        "Tile11000vsubText": "This is an example.",
        "Tile11000vsubText1": "This is another example.",
        "imgUrlpjbx": "https://123.abc.net/media/Intro.png",
        "EN01BottomButton1002vtext": "Get Started"
    },
Example:
    "cardLayout": {
        "body": [
            {
                "id": "00tc01",
                "tileComponent": [
                    {
                        "id": "Tile0",
                        "subView": [
                            {
                                "title": {
                                    "text": "Tile11000vtext",
                                    "style": "bold"
                                }
                            }
                        ],
                        "align": "START",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 1
                    },
                    {
                        "id": "Tile11",
                        "subView": [
                            {
                                "title": {
                                    "text": "Tile11000vsubText"
                                },
                                "subTitle": {
                                    "text": "Tile11000vsubText1"
                                }
                            }
                        ],
                        "align": "START",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 1
                    },
                    {
                        "id": "Tile16",
                        "subView": [
                            {
                                "img": {
                                    "text": "imgUrlpjbx",
                                    "isUrl": true,
                                    "height": "250",
                                    "width": "250"
                                }
                            }
                        ],
                        "align": "START",
                        "textColor": "#212121",
                        "borderColor": "#1a1a1a",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 1
                    }
                ],
                "tileType": "WRAP",
                "uiAction": "",
                "order": 1
            }
        ],
Example:
        "footer": {
            "menu": [
                {
                    "id": "EN01BottomButtonBack",
                    "subView": [
                        {
                            "title": {
                                "text": ""
                            }
                        }
                    ],
                    "align": "START",
                    "type": "BACK_BUTTON",
                    "uiAction": "${action1}",
                    "order": 1
                },
                {
                    "id": "EN01BottomButton1",
                    "subView": [
                        {
                            "title": {
                                "text": "EN01BottomButton1002vtext"
                            }
                        }
                    ],
                    "align": "END",
                    "type": "BUTTON",
                    "uiAction": "${action2}",
                    "order": 2
                }
            ],
            "orientation": "HORIZONTAL"
        }
    },
Example:
    "cardUIAction": {
        "action1": {
            "action": ""
        }, "action2": {
            "action": "ev-patient-nav-to-cd-next"
        }
    }
}
Tiles
Functions

Roles and Journeys

This section describes the definition structure of user roles and journeys in a network.

Roles

A role is a fundamental element of TuumIO Protocol that represents a specific participant type, such as patients or doctors. Each role is defined with the corresponding cards and events.

Journeys

A journey is a sequence of interconnected cards, defining a specific workflow for a role or network.

Journey definitions

The following example shows the "Get Started" and the "Join as Doctor" journeys.

Journey data model

Here is another example of a "Book Appointment" journey that defines the events, roles, and permissions for synchronizing data across multiple nodes.

Field Name
Value Type
Description
Field Name
Value Type
Description
Field Name
Value Type
Description

id

string

The unique ID of the role.

name

string

The name of the role.

description

string

The description of the role.

type

string

The role type is defined in the platform.

status

string

The status of the role is set to Active.

version

number

The role's version number is updated when the role metadata value changes.

td_collections

array

The transactional data records are linked to the role.

allow_events_with_role

array

The events allowed for the role.

home_card_ref_id

string

The reference ID to the home card for the role.

Example:
        "roles": [
            {
                "id": "rl-patient",
                "name": "PATIENT",
                "description": "The patient user role.",
                "type": "Wallet",
                "status": "Active",
                "version": 1,
                "allow_events_with_role": [],
                "home_card_ref_id": "cd-h-patient"
            },
            {
                "id": "rl-doctor",
                "name": "DOCTOR",
                "description": "The Doctor user role.",
                "type": "Wallet",
                "status": "Active",
                "version": 1,
                "allow_events_with_role": [],
                "home_card_ref_id": "cd-h-doctor"
            }
            
        ],

id

string

The unique ID of the journey.

icon

string

The path to the icon image file.

name

string

The name of the journey.

description

string

The description of the journey.

status

string

The status of the journey is set to Active.

start_card_ref_id

string

The reference ID of the journey starting card.

roles

string

The roles involved in the journey.

journey_data

array

The data model for synchronizing across multiple roles or nodes, triggered by events. See Journey data model.

journey_type

string

The journey type is defined in the platform.

Example:
        "journeys": [
            {
                "id": "jn-start-journey",
                "icon": "",
                "name": "Get Started",
                "description": "Start journey for Patient",
                "status": "Active",
                "start_card_ref_id": "cd-start-rl-patient",
                "roles": ["rl-patient"],
                "journey_data": [],
                "journey_type": "STANDARD_JOURNEY"
            },
            {
                "id": "jn-rl-doctor",
                "icon": "",
                "name": "Join as Doctor",
                "description": "Join as Doctor",
                "status": "Active",
                "start_card_ref_id": "cd-invite-rl-doctor",
                "roles": ["rl-doctor"],
                "journey_data": [],
                "journey_type": "JOIN_NETWORK_JOURNEY"
            },

name

string

The unique name of the journey data model.

start_event_ids

array

The IDs of start events that trigger data sharing and synchronization. Note: Only the user role with OWNER access can submit the start (init) event.

stop_event_ids

array

The IDs of stop events with shared data in the payload, completing the synchronization to all nodes.

affected_collections

array

The data collections where payload data is saved.

expire_in

string

The number of days (d), weeks (w), or years (y) from initialization until synchronization is stopped.

permissions

array

The list of roles and corresponding access permissions.

role

string

The reference ID of each role defined in the journey.

access

string

The access level permission set for each role.

Example:
{
        "id": "book-appointment-journey",
        "name": "Book Appointment",
        "description": "Book Appointment",
        "status": "Active",
        "start_card_ref_id": "get-records-list-card",
        "roles": ["patient", "doctor", "nurse"],
        "journey_data": [
          {
            "name": "jdm-001-data-01",
            "start_event_ids": [
              "e-w-broad-patient-to-rl-xxx",
              "e-w-pt-confirm-appt"
            ],
            "stop_event_ids": [
              "e-w-pt-confirm-appt-fee"
            ],
            "affected_collections": [
              "td/td-BOOKING.json"
            ],
            "expire_in": "1d",
            "permissions": [
              {
                "role": "rl-PATIENT",
                "access": "OWNER"
              },
              {
                "role": "rl-DOCTOR",
                "access": "READ"
              },
              {
                "role": "rl-NURSE",
                "access": "DELEGATION"
              }
            ]
          }
        ],
        "journey_type": "STANDARD_JOURNEY"
      }

Physician

Verifying ID and medical license

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

  3. Tap Submit.

Viewing history of submitted IDs

  1. Sign in to the TuumIO Wallet app.

  2. From the Manage Networks screen, tap Care.Trials.

Tap Verify your identity > Verify your identity.

Enter your full name, then upload your ID or medical license.

Tap Verify your identity > ID history.

Select the ID record details that you want to view.

Publishing the protocol

Use Postman to perform the steps for publishing. To get the authorization and environment details, contact [email protected].

Fetch MainNet authorization token

Initiate a request with the appropriate details for your environment.

POST

https://{{abc-care-env}}/core-registry-service/oauth/token?grant_type=password&username=%2B{{networkAuthorPhone}}&password={{networkAuthorPassword}}&blockchainAddress={{networkAuthorWalletId}}

Pre-request script:

Example:
pm.globals.set("abc-care-env", "dev.env.abc.net");
pm.globals.set("xxx-env", "site000.abc.net/sample-net");


pm.globals.set("networkAuthorPhone", "91888888888");
pm.globals.set("networkAuthorWalletId", "0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
pm.globals.set("networkAuthorPassword", "999999");
pm.globals.set("networkId", "dev-network-xxx");

Fetch network authorization token

POST

https://{{eks-env}}/nom/oauth/token?grant_type=exchange_token&exchange_token={{networkAuthorMainNetToken}}

Get sponsor address

GET

https://{{eks-env}}/nom/v2/holders/me

Post-request script:

Example:
const jsonData = pm.response.json().nodes;
const networkId = pm.globals.get("networkId");
const node = jsonData.filter(r => r.networkId === networkId && r.roleId === 'NETWORK_SPONSOR')[0];
pm.globals.set("sponsorWalletAddress", node.scAddress);

Upload the protocol package

POST

https://{{eks-env}}/generic-protocol-service/v2/packaging/{{networkId}}/restore/zip

Publish the protocol package

POST

https://{{eks-env}}/generic-protocol-service/v2/packaging/{{networkId}}/publish
Example:
curl --location --globoff 'https://{{eks-env}}/generic-protocol-service/v2/packaging/{{networkId}}/publish' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{networkAuthorCANToken}}' \
--data '{
    "certificates":"CERT-12345-2022",
    "effectiveDate": "20-05-2022",
    "sponsorWalletAddress": "{{sponsorWalletAddress}}"
    
    

}'

Get publishing state

GET

https://{{eks-env}}/generic-protocol-service/v2/packaging/{{networkId}}/{{networkVersion}}
Example:
curl --location --globoff 'https://{{eks-env}}/generic-protocol-service/v2/packaging/{{networkId}}/{{networkVersion}}' \
--header 'Authorization: Bearer {{networkAuthorCANToken}}'

Update TDN

Upload the CSV file with the same attributes as the uploaded DDF in the input folder of the Amazon S3 bucket. If necessary, delete existing data.

Uploading data definition file (DDF)

The data definition file contains the model and structure for organizing data in TDN.

POST

https://{{eks-env}}/{{network-id}}/data-node/v1/ddf
Example:
curl --location 'https://data-node/v1/ddf?status=ACTIVE' \
--header 'Authorization: Basic Y2FyZS1iYWNrZW5kOnNlY3JldA==' \
--header 'Content-Type: application/json' \
--data '{
    "ddf_type": "us-doctors-sample",
    "meta_data": {
        "description": "Sample"
    },
    "messages": [
        {
            "message_category": "CSV",
            "message_type": "Doctors",
            "meta_data": {
                "description": "Sample",
                "indices": "us-doctors-sample"
            },
            "events": [
                {
                    "to_role": "rl-patient",
                    "event": "ev-cdn-broadcast"
                }
            ],
            "attributes": [
                {
                    "name": "Provider",
                    "description": "Provider",
                    "required": false,
                    "index_field": true,
                    "type": "integer",
                    "data_location": "Provider"
                },
                {
                    "name": "License",
                    "description": "License",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "License"
                },
                {
                    "name": "Specialization",
                    "description": "Specialization",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "Specialization"
                },
                {
                    "name": "Address",
                    "description": "Address",
                    "required": false,
                    "index_field": true,
                    "type": "string",
                    "data_location": "Address"
                }
            ]
        }
    ]
}'

Searching data

POST

https://{{eks-env}}/{{network-id}}/elasticsearch/us-doctors-sample/_search
Example:
curl --location 'https://elasticsearch/us-doctors-sample/_search' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzpweFkwMXNQTXMyZTRTdFp3M2U1MjU5N3U=' \
--data '{

"query": {

"match_all": {}

}

}'

Deleting existing data from TDN

POST

https://{{eks-env}}/{{network-id}}/elasticsearch/us-doctors-sample/_delete_by_query
Example:
curl --location 'https://{{eks-env}}/{{network-id}}/elasticsearch/us-doctors-sample/_delete_by_query' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzpweFkwMXNQTXMyZTRTdFp3M2U1MjU5N3U=' \
--data '{

"query": {

"match_all": {}

}

}'

Checking the count

POST

https://{{eks-env}}/{{network-id}}/elasticsearch/us-doctors-sample/_count
Example:
curl --location --globoff 'https://{{eks-env}}/{{network-id}}/elasticsearch/us-doctors-sample/_count' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzo5UlBJMTMzNFNydHBOMzI1NFNRcjd4clI=' \
--data '{

"query": {

"match_all": {}

}

}'

Node Event Handlers

This section describes the different types of node event handlers, their definitions, parameters, and examples.

Types of node event handlers

  • VAULT_INSERT — This event handler is used to insert a record into a specific collection in the vault.

  • VAULT_UPDATE — This event handler is used to update a record in a specific collection in the vault based on the dynamic search criteria.

  • MAPPER — This event handler is used for data transformation, such as excluding, appending, or generating data in the execution chain.

  • NEXT_EVENT_RECIPIENT — This event handler is used to identify the recipient for the next event.

  • EXPRESSION_LANGUAGE — This event handler allows writing data manipulation expressions to easily access, filter, and calculate values.

  • CUSTOM — This event handler is used to specify a specific Java class that implements a legacy JAR (Java Archive) handler.

Handler definition constants

Handler data source (GenericHandlerDataSource)

  • EMPTY— An empty source or collection.

  • EVENT_PAYLOAD — The payload source of events processed in the handlers chain.

  • HANDLER_ARGUMENTS — The response value from the previous handler in the chain.

  • PERSISTED_ENTITY — For vault-related handlers, it is the state of inserted or updated documents in a collection.

Dynamic handler value (DynamicHandlerValue)

It uses "source" and "value" fields to link data. The actual value can be determined dynamically based on the information in the "source" field. Here are the possible values:

Handler definition examples

Vault Insert handler

Vault Update handler

Data Transformation handler

Next Event Recipient handler

Expression Language handler

Here are the operators supported in the language:

Here are the parameters in the event handler definition:

In Example 1, let's assume that the HANDLER_ARGUMENTS has variables a and b. If the variables represent numeric values, such as a=1 and b=2, then the result will be 1+2=3. If the variables represent string values, such as a='1' and b='2', then the result will be '1'+'2'='12'.

In Example 2, let's assume that the HANDLER_ARGUMENTS has a variable user, which represent a list with the following value:

The expression arguments[users].?[country=='USA'].size() will filter the items which has the country value set to "USA". Then it calculates the size, which returns the count. In this case, the result will be 1.

In Example 3, let's assume that the HANDLER_ARGUMENTS has a variable user, which represent a list with the following value:

The expression arguments[users].?[country=='USA'].size() > 0 ? 'USA_PRESENT' : 'USA_NOT_PRESENT' will filter the items which has the country value set to "USA". Then it calculates the size, which returns the count. In this case, the count is 1. If the count is greater than 0, then the result will be 'USA_PRESENT'.

Custom (JAR) handler

Source
Possible values
Description
Parameters
Data type / Values
Description
Parameters
Data type / Values
Description
Parameters
Data type / Values
Description
Parameters
Data type / Values
Description

The expression language used for this handler type is based on Spring Expression Language (SpEL). For more information, see the documentation for .

Type
Operators
Parameter
Data type / Values
Description
Parameter
Data type / Values
Description

CONSTANT

Any value

The constant propagates the value field as a result.

GENERATED

UUID, CURRENT_TIMESTAMP

It generates a UUID or timestamp.

EVENT

SENDER, RECIPIENT, CODE, TIMESTAMP, CORRELATION_ID

It gets the value of the original event sender, recipient, code, timestamp, or correlation ID.

EVENT_PAYLOAD

Attribute name

It gets the value of the attribute in the event payload.

HANDLER_ARGUMENTS

Attribute name

It gets the value of the attribute in the handler arguments.

type

VAULT_INSERT

The handler type.

order

Integer

The order of the handler in the execution chain.

name

String

The name of the handler which is used for logging.

collection

String

The name of the vault collection.

collectionVersion

Integer

The version of the vault collection.

dataSource

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS

The data source of the record which will be inserted into the collection.

handlerOutput

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS, PERSISTED_ENTITY

The handler output that will be passed as an argument to the next handler.

Example:
    {
      "type": "VAULT_INSERT",
      "name": "Insert SAMPLE record",
      "order": 2,
      "collection": "SAMPLE",
      "collectionVersion": 1,
      "dataSource": "HANDLER_ARGUMENTS",
      "handlerOutput": "PERSISTED_ENTITY"
    }

type

VAULT_UPDATE

The handler type.

order

Integer

The order of the handler in the execution chain.

name

String

The name of the handler which is used for logging.

collection

String

The name of the vault collection.

collectionVersion

Integer

The version of the vault collection.

dataSource

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS

The data source from which the record changes (diffs) will be retrieved.

handlerOutput

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS, PERSISTED_ENTITY

The handler output that will be passed as an argument to the next handler.

insertIfAbsent

Boolean

It defines a flag that inserts the document if it does not exist in the collection based on the search criteria. The value is set to false by default.

searchCriteria

Array of SearchQueryFilter

The search criteria to find the document to be updated.

Example:
    {
      "type": "VAULT_UPDATE",
      "name": "Answer SAMPLE question",
      "order": 1,
      "collection": "SAMPLE",
      "collectionVersion": 1,
      "dataSource": "EVENT_PAYLOAD",
      "searchCriteria": [
        {
          "queryMatcher": "EQUAL",
          "fieldName": "transactionalGuid",
          "dynamicValue": {
            "source": "EVENT_PAYLOAD",
            "value": "transactionalGuid"
          }
        }
      ],
      "handlerOutput": "PERSISTED_ENTITY"
    }

type

MAPPER

The handler type.

order

Integer

The order of the handler in the execution chain.

name

String

The name of the handler which is used for logging.

dataSource

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS

The data source for the unmapped data.

handlerOutput

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS, PERSISTED_ENTITY

The handler output that will be passed as an argument to the next handler.

excludedAttributes

Array of strings

A set of attributes to be excluded from the input data.

additionalAttributes

Map of DynamicHandlerValue

(see Dynamic handler value)

A map of attributes with dynamic values calculated at runtime.

Example:
    {
      "type": "MAPPER",
      "name": "Append SAMPLE payload",
      "order": 1,
      "dataSource": "EVENT_PAYLOAD",
      "additionalAttributes": {
        "createdAt": {
          "source": "GENERATED",
          "value": "CURRENT_TIMESTAMP"
        },
        "transactionalGuid": {
          "source": "GENERATED",
          "value": "UUID"
        },
        "doctorNodeAddress": {
          "source": "EVENT",
          "value": "SENDER"
        }
      },
      "excludedAttributes": [
        "correlationId"
      ]
    }

type

NEXT_EVENT_RECIPIENT

The handler type.

order

Integer

The order of the handler in the execution chain.

name

String

The name of the handler which is used for logging.

handlerOutput

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS

The handler output that will be passed as an argument to the next handler.

recipientAddress

DynamicHandlerValue

(see Dynamic handler value)

The dynamic value represents the recipient of the next event.

Example:
    {
      "type": "NEXT_EVENT_RECIPIENT",
      "name": "Fetch SAMPLE target doctor",
      "order": 2,
      "recipientAddress": {
        "source": "HANDLER_ARGUMENTS",
        "value": "doctorNodeAddress"
      },
      "handlerOutput": "HANDLER_ARGUMENTS"
    }

Arithmetic

+, -, *, /, %, ^, div, mod

Relational

<, >, ==, !=, <=, >=, lt, gt, eq, ne, le, ge

Logical

and, or, not, &&, ||, !

Conditional

?:

Regex

matches

type

EXPRESSION_LANGUAGE

The handler type.

order

Integer

The order of the handler in the execution chain.

name

String

The name of the handler which is used for logging.

dataSource

EMPTY, EVENT_PAYLOAD, HANDLER_ARGUMENTS

The data source of the record which will be inserted into the collection.

computedAttributes

Map of expressions, where the key is a variable name, and the value is the expression itself.

The handler executes the expression and puts the value inside the specified variable.

Example 1:
    {
      "type": "EXPRESSION_LANGUAGE",
      "name": "Calc",
      "order": 2,
      "dataSource": "EMPTY",
      "computedAttributes": {
        "c": "arguments['a']+arguments['b']"
      }
    }
Example 2:
    {
      "type": "EXPRESSION_LANGUAGE",
      "name": "Calc",
      "order": 2,
      "dataSource": "EMPTY",
      "computedAttributes": {
        "res": "arguments[users].?[country=='USA'].size()"
      }
    }
    [
      {
        "name": "John",
        "country": "USA"
      },
      {
        "name": "Sam",
        "country": "Canada"
      },
    ]
Example 3:
    {
      "type": "EXPRESSION_LANGUAGE",
      "name": "Calc",
      "order": 2,
      "dataSource": "EMPTY",
      "computedAttributes": {
        "res": "arguments[users].?[country=='USA'].size() > 0 ? 'USA_PRESENT' : 'USA_NOT_PRESENT'"
      }
    }
    [
      {
        "name": "John",
        "country": "USA"
      },
      {
        "name": "Sam",
        "country": "Canada"
      },
    ]

type

CUSTOM

The handler type.

order

Integer

The order of the handler in the execution chain.

jarUrl

String

The URL where the JAR file with the handler implementation is stored.

className

String

The full Java class name that implements the corresponding interface.

Example:
  {
    "type": "CUSTOM",
    "order": 2,
    "jarUrl": "https://a.solvecare.net/artifactory/libs-snapshot-local/care/solve/generic/node/hello-world-handler/1.0.4-SNAPSHOT/hello-world-handler-1.0.4-20220406.133327-6.jar",
    "className": "care.solve.node.handler.demo.patient.PatientComputeBmiHandler"
  }
Spring Expression Language (SpEL)

Network Configuration

This section describes the overall network specifications, including author details, countries, join network settings, and solve token settings.

Network metadata

Field Name
Value Type
Description

network_id

string

The unique ID associated with the network.

node_url

string

The URL of the network node where it is deployed.

name

string

The unique name of the network.

version

number

The version number of the network protocol.

description

string

The short description of the network.

publish_date

string

The date when the network protocol is published.

effective_date

string

The date when the protocol is effective or operational within the network.

Example:
{
    "tuumIO_protocol": {
        "network_id": "dev-network-xxx",
        "node_url": "https://site000.abc.net",
        "name": "My TuumIO Network",
        "version": 1,
        "description": "This is a sample TuumIO network.",
        "publish_date": "2024-03-27",
        "effective_date": "2024-03-27",

Author details and countries

Field Name
Value Type
Description

author_name

string

The name of the network protocol's author (entity or person).

author_website

string

The website URL of the author.

author_address1

string

The address of the author (line1).

author_address2

string

The address of the author (line2).

geo_fence_countries

string

The list of countries that can join the network.

Example:
        "network_settings": {
                    "author_details": {
                        "author_name": "John Carter",
                        "author_address1": "127 Goyette River, Lake Audreanne",
                        "author_website": "www.abc-company.net",
                        "author_address2": "Arizona"
                    },
                    "geo_fence_countries": [
                        "US",
                        "IN",
                        "UA"
                    ]
                },

Join network settings

Field Name
Value Type
Description

role

string

The ID of the role joining the network.

join_method

string

The method of joining the network.

required_consents

array

The cards which you allow other users in the network to access.

terms_and_conditions_checksum

string

The terms and conditions for joining the network.

Example:
                    "join_network_settings": {
                      "join_roles": [
                        {
                          "role": "rl-patient",
                          "join_method": "DEFAULT",
                          "required_consents": ["WALLET", "PHONE"],
                          "terms_and_conditions_checksum": "d61c0c428b88a19c1d0b9e10dae816fe"
                        },
                        {
                          "role": "rl-doctor",
                          "join_method": "INVITE",
                          "required_consents": ["WALLET"],
                          "terms_and_conditions_checksum": "6dadacb7b61860d446c5ebdffcc2be54"
                        }
                      ]
                    },

SOLVE token usage

Field Name
Value Type
Description

deposit_value

string

The deposit value of SOLVE tokens.

redemption_value

string

The redemption value of SOLVE tokens.

solve_gas_setting

JSON

The SOLVE gas usage setting.

event_wise_cost

array

The event and the cost in SOLVE token.

event

string

The event used for transactions in the network.

cost

integer

The cost in SOLVE gas for each event transaction.

Example:
            "solve_token_usage": {
                "deposit_value": "Market",
                "redemption_value": "Deposit",
                "solve_gas_setting": {
                    "event_wise_cost": [
                        {
                            "event": "e-booking-appointment",
                            "cost": 1000
                        }
                    ]
                },
                "custom_payments": {
                    "event_wise_cost": []
                }
            }
        }, 

Events and Event Handlers

This section describes the structure of event and event handler definitions, and some examples for the different types of events and event handlers.

All event and event handler definitions must be included in the input.json file.

Events

An event represents the actions that occur based on user interactions within a network. It defines the data used to communicate between roles or nodes in the network, such as sending and receiving information.

Types of events

  • WALLET_LOCAL — A local event within TuumIO Wallet, such as sending data from one card to another.

  • WALLET_FROM_NODE — An event that gets data from a specific node, such as retrieving a list of records in TuumIO Wallet.

  • WALLET_TO_NODE — An event that sends data from TuumIO Wallet to a specific node, such as submitting records.

  • NODE_TO_NODE — An event that sends data from one node to another node, such as a patient booking an appointment with a doctor.

  • NODE_TO_ROLE — An event that sends data to all nodes with a designated role in a network, such as a patient searching for the nearest pediatrician among all doctors in the network.

Field Name
Value Type
Description

id

string

The unique ID of the event.

name

string

The name of the event.

description

string

The description of the event.

code

string

The same as the event name.

status

string

The status of the event is set to Active.

type

string

The type of event. The possible values are WALLET_LOCAL, WALLET_FROM_NODE, WALLET_TO_NODE, NODE_TO_NODE and NODE_TO_ROLE.

event_definition_ref

string

The reference path and ID of the event definition.

submit_event_handler

string

The ID of the event handler used for submitting the event.

node_event_handlers

array

The list of outgoing event handlers for node events.

card

string

The reference ID of the card associated to the event.

The following example represents an event that lets users navigate from one card to another, as defined in the input.json file.

Example:
        "events": [
            {
                "id": "ev-patient-nav-to-cd-next",
                "name": "W.PATIENT.NAV.CD-NEXT",
                "description": "Event to navigate from start card to next card",
                "code": "W.PATIENT.NAV.CD-NEXT",
                "status": "Active",
                "type": "WALLET_LOCAL",
                "event_definition_ref": "event/ev-patient-nav-to-cd-next.json",
                "submit_event_handler": "eh-w-ev-patient-nav-to-cd-next",
                "node_event_handlers": [],
                "card": "cd-start-rl-patient"
            },

The following example defines an event containing user details: event/ev-patient-nav-to-cd-next.json.

Example:
{
  "definition": {
    "description": "Get started",
    "name": "GET_STARTED",
    "resource": "GET_STARTED",
    "type": "EVENT_DATA"
  },
  "structure": {
    "attributes": [
      {
        "code": "answer",
        "name": "answer",
        "type_definition": {
          "type": "number"
        },
        "order": 3,
        "system": false,
        "required": false
      },

      {
        "code": "memberId",
        "name": "memberId",
        "type_definition": {
          "type": "string"
        },
        "order": 1,
        "system": false,
        "required": false
      }
    ]
  }
}

Event handlers

The event handler defines the instructions that execute tasks based on specific events, such as navigation and data manipulation.

Types of event handlers

  • WALLET_EVENT_HANDLER — This event handler is defined in JSON and can be used to navigate between cards, submit data, or retrieve data.

  • NODE_EVENT_HANDLER — This event handler is defined in either JSON or Python and can be used to search, retrieve, update, or save data. To learn more about the different types of node event handlers, see Node Event Handlers and Python Event Handlers.

Field Name
Value Type
Description

id

string

The unique ID of the event handler.

name

string

The name of the event handler.

description

string

The description of the event handler.

status

string

The status of the event handler is set to Active.

event

string

The event which the event handler executes.

type

string

The type of event handler. The possible values are: WALLET_EVENT_HANDLER and NODE_EVENT_HANDLER

event_handler_definition_ref

string

The reference path and ID of the event handler definition.

The following example is the wallet event handler for navigating to the next card, as defined in the input.json file.

Example:
        "event_handlers": [
            {
                "id": "eh-w-patient-nav-to-cd-next",
                "name": "W.PATIENT.NAV.CD-NEXT",
                "description": "Wallet Event Handler to Navigate from Start to cd-next",
                "status": "Active",
                "event": "ev-patient-nav-to-cd-next",
                "type": "WALLET_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-w-ev-patient-nav-to-cd-next.json"
            },

The following example is an event handler definition in a JSON file that sends the details to the next card in the sequence: event-handler/eh-w-ev-patient-nav-to-cd-next1.json.

Example:
{
    "walletEventHandler": [
        {
            "refId": "ev-patient-nav-to-cd-next",
            "walletEvents": [
                {
                    "actions": [
                        {
                            "name": "submit",
                            "order": 1,
                            "parameter": [
                                {
                                    "method": "POST",
                                    "url": "/events"
                                }
                            ]
                        }
                    ],
                    "postAction": "cd-next",
                    "refId": "ev-patient-nav-to-cd-next"
                }
            ]
        }
    ]
}

Use case examples

Submitting health questions

In this example, a patient submits answers from the health questions card and the data is saved in a collection.

  1. Define the events in the input.json file. Here, we have two events:

Example:
            {
                "id": "ev-w-broad-health-questions",
                "name": "W.BROAD.H.QUESTIONS",
                "description": "Submit health questions",
                "code": "W.BROAD.H.QUESTIONS",
                "status": "Active",
                "type": "WALLET_TO_NODE",
                "event_definition_ref": "event/ev-w-broad-health-questions.json",
                "submit_event_handler": "eh-ev-w-broad-health-questions",
                "next_event": "ev-w-broad-health-questions-na",
                "node_event_handlers": [
                    "eh-n-ev-w-broad-health-questions", "eh-n-patient-process-py"
                ],
                "card": "cd-health-questions"
            },
            {
                "id": "ev-w-broad-health-questions-na",
                "name": "W.BROAD.H.QUESTIONS.NA",
                "description": "Broadcast health questions from Patients to rl-netadmin",
                "code": "W.BROAD.H.QUESTIONS.NA",
                "status": "Active",
                "type": "NODE_TO_ROLE",
                "event_definition_ref": "event/ev-w-broad-health-questions-na.json",
                "from_role": "rl-patient",
                "to_role": "rl-netadmin",
                "node_event_handlers": [
                    "eh-n-ev-w-broad-health-questions-na"
                ],
                "card": "cd-health-questions"
            },
  1. Create the event definition for the submit event that contains the data used in the patient health questions: event/ev-w-broad-health-questions.json.

Example:
{
    "definition": {
        "description": "Save H_QUESTIONS at Patients",
        "name": "W-BROAD-H-QUESTIONS",
        "resource": "W-BROAD-H-QUESTIONS",
        "type": "EVENT_DATA"
    },
    "structure": {
        "attributes": [
            {
                "name": "Symptoms",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "code": "Symptoms",
                "order": 1
            },
            {
                "name": "History",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "code": "History",
                "order": 2
            },
            {
                "name": "Gender",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "code": "Gender",
                "order": 3
            },
            {
                "name": "Age",
                "type_definition": {
                    "type": "number"
                },
                "required": true,
                "system": false,
                "times": 1,
                "code": "Age",
                "order": 4
            },
            {
                "code": "transactionalGuid",
                "name": "transactionalGuid",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "times": 1,
                "order": 5
            },
            {
                "code": "createdAt",
                "name": "createdAt",
                "type_definition": {
                    "type": "timestamp"
                },
                "required": false,
                "system": false,
                "times": 1,
                "order": 6
            },
            {
                "name": "senderNodeAddress",
                "code": "senderNodeAddress",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "order": 7
            }
        ],
        "primary_key": "false"
    }
}
  1. Define the event handlers for the submit event in the input.json file. Here, the submit event has two event handlers: eh-ev-w-broad-health-questions.json and eh-n-ev-w-broad-health-questions.json.

Example:
            {
                "id": "eh-ev-w-broad-health-questions",
                "name": "eh-ev-w-broad-health-questions",
                "description": "Submit H_Questions",
                "status": "Active",
                "event": "ev-w-broad-health-questions",
                "type": "WALLET_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-ev-w-broad-health-questions.json"
            },
            {
                "id": "eh-n-ev-w-broad-health-questions",
                "name": "eh-n-ev-w-broad-health-questions",
                "description": "Broadcast H_QUESTIONS from Patients to rl-netadmin",
                "status": "Active",
                "event": "ev-w-broad-health-questions",
                "type": "NODE_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-n-ev-w-broad-health-questions.json"
            },
  1. Create the wallet event handler definition for submitting the event data: event-handler/eh-ev-w-broad-health-questions.json.

Example:
{
    "walletEventHandler": [
        {
            "refId": "ev-w-broad-health-questions",
            "walletEvents": [
                {
                    "actions": [
                        {
                            "name": "submit",
                            "order": 1,
                            "parameter": [
                                {
                                    "method": "POST",
                                    "url": "/events"
                                }
                            ]
                        }
                    ],
                    "postAction": "cd-health-questions-done",
                    "refId": "ev-w-broad-health-questions"
                } 
            ]
        }
    ]
}
  1. Create the node event handler definition for saving the event payload: eh-n-ev-w-broad-health-questions.json.

Example:
{
    "nodeEventHandlers": [
        {
            "type": "MAPPER",
            "name": "Append or Exclude attributes to H_QUESTIONS payload",
            "order": 1,
            "dataSource": "EVENT_PAYLOAD",
            "additionalAttributes": {
                "createdAt": {
                    "source": "GENERATED",
                    "value": "CURRENT_TIMESTAMP"
                },
                "transactionalGuid": {
                    "source": "GENERATED",
                    "value": "UUID"
                },
                "senderNodeAddress": {
                    "source": "EVENT",
                    "value": "SENDER"
                }
            },
            "excludedAttributes": []
        },
        {
            "type": "VAULT_INSERT",
            "name": "H_QUESTIONS",
            "order": 2,
            "collection": "H_QUESTIONS",
            "collectionVersion": 1,
            "dataSource": "HANDLER_ARGUMENTS",
            "handlerOutput": "PERSISTED_ENTITY"
        },
        {
            "type": "MAPPER",
            "name": "Append or Exclude attributes in the result",
            "order": 3,
            "dataSource": "EVENT_PAYLOAD",
            "additionalAttributes": {
                "createdAt": {
                    "source": "HANDLER_ARGUMENTS",
                    "value": "createdAt"
                },
                "transactionalGuid": {
                    "source": "HANDLER_ARGUMENTS",
                    "value": "transactionalGuid"
                },
                "senderNodeAddress": {
                    "source": "EVENT",
                    "value": "SENDER"
                }
            },
            "excludedAttributes": []
        }
    ]
}
  1. Create the event definition for the next event: ev-w-broad-health-questions-na.json.

{
    "definition": {
        "description": "Save H_QUESTIONS at PATIENT_ANSWERS",
        "name": "W-BROAD-H-QUESTIONS",
        "resource": "W-BROAD-H-QUESTIONS",
        "type": "EVENT_DATA"
    },
    "structure": {
        "attributes": [
            {
                "name": "Symptoms",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "code": "Symptoms",
                "order": 1
            },
            {
                "name": "History",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "code": "History",
                "order": 2
            },
            {
                "name": "Gender",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "code": "Gender",
                "order": 3
            },
            {
                "name": "Age",
                "type_definition": {
                    "type": "number"
                },
                "required": true,
                "system": false,
                "times": 1,
                "code": "Age",
                "order": 4
            },
            {
                "code": "transactionalGuid",
                "name": "transactionalGuid",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "times": 1,
                "order": 5
            },
            {
                "code": "createdAt",
                "name": "createdAt",
                "type_definition": {
                    "type": "timestamp"
                },
                "required": false,
                "system": false,
                "times": 1,
                "order": 6
            },
            {
                "name": "senderNodeAddress",
                "code": "senderNodeAddress",
                "type_definition": {
                    "type": "string"
                },
                "required": false,
                "system": false,
                "order": 7
            }
        ],
        "primary_key": "false"
    }
}
  1. Define the event handler for the next event in the input.json file. The next event has one event handler: eh-n-ev-w-broad-health-questions-na.json.

            {
                "id": "eh-n-ev-w-broad-health-questions-na",
                "name": "eh-n-ev-w-broad-health-questions-na",
                "description": "Broadcast H_QUESTIONS from Patients to rl-netadmin",
                "status": "Active",
                "event": "ev-w-broad-health-questions-na",
                "type": "NODE_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-n-ev-w-broad-health-questions-na.json"
            }
  1. Create the node event handler definition that saves the event data to the collection: event-handler/eh-ev-n-broad-health-questions-na.json. Here, the data is saved to the PATIENT_ANSWERS collection based on the defined search criteria.

{
    "nodeEventHandlers": [
        {
            "type": "MAPPER",
            "name": "Append or Exclude attributes to H_QUESTIONS payload",
            "order": 1,
            "dataSource": "EVENT_PAYLOAD",
            "additionalAttributes": {},
            "excludedAttributes": []
        },
        {
            "type": "VAULT_UPDATE",
            "name": "PATIENT_ANSWERS",
            "order": 2,
            "collection": "PATIENT_ANSWERS",
            "collectionVersion": 1,
            "dataSource": "HANDLER_ARGUMENTS",
            "insertIfAbsent": true,
            "searchCriteria": [
                {
                    "queryMatcher": "EQUAL",
                    "fieldName": "senderNodeAddress",
                    "dynamicValue": {
                        "source": "EVENT_PAYLOAD",
                        "value": "senderNodeAddress"
                    }
                }
            ],
            "handlerOutput": "PERSISTED_ENTITY"
        }
    ]
}

Viewing records history

In this example, the wallet retrieves the history of records from a data collection and displays it on the card.

  1. Define the event in the input.json file.

Example:
            {
                "id": "ev-get-records-history",
                "name": "W.GET.RECORDS.HIST",
                "code": "W.GET.RECORDS.HIST",
                "description": "Get Records History",
                "status": "Active",
                "type": "WALLET_FROM_NODE",
                "event_definition_ref": "event/ev-get-records-history.json",
                "submit_event_handler": "eh-ev-get-records-history",
                "node_event_handlers": [],
                "card": "cd-view-records"
            }
  1. Create the event definition with the source of data: event/ev-get-records-history.json. To retrieve data, this event uses the unique ID of the transactionalGuid generated from a submit event.

Example:
{
    "definition": {
        "description": "Get Records History",
        "name": "Get Records History",
        "resource": "Get Records History",
        "type": "EVENT_DATA"
    },
    "structure": {
        "attributes": [
            {
                "code": "transactionalGuid",
                "name": "transactionalGuid",
                "type_definition": {
                    "type": "string"
                },
                "order": 1,
                "system": false,
                "required": false
            }
        ]
    }
}
  1. Define the event handler in the input.json file.

Example:
            {
                "id": "eh-ev-get-records-history",
                "name": "eh-ev-get-records-history",
                "description": "eh-ev-get-records-history",
                "status": "Active",
                "event": "ev-get-records-history",
                "type": "WALLET_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-ev-get-records-history.json"
            }   
  1. Create the wallet event handler definition that gets the records history data from the collection: event-handler/eh-ev-get-records-history.json. This event handler uses the GET method to retrieve record data based on the filter query.

Example:
{
    "walletEventHandler": [
        {
            "refId": "ev-get-records-history",
            "walletEvents": [
                {
                    "actions": [
                        {
                            "name": "",
                            "order": 1,
                            "parameter": [
                                {
                                    "method": "GET",
                                    "url": "/transactions/RECORD_DATA?filter=[{\"queryMatcher\":\"EQUAL\",\"fieldName\":\"senderNodeAddress\",\"value\":\"${senderNodeAddress}\"}]"
                                }
                            ]
                        }
                    ],
                    "postAction": "",
                    "refId": "ev-get-records-history"
                }
            ]
        }
    ]
}

Create an Event Booker

Overview

Welcome to the Event Booker example, a simple booking app for events or appointments. The underlying structure can be adapted for Web3 integration, allowing you to extend the app's functionality such as using tokens to pay booking fees for exclusive events. Here’s how the app works:

  1. Launch the app to book an event or appointment.

  2. Fill in the details of the event or appointment.

  3. Confirm and submit your booking details.

Steps

Ready to create your own booking app? Follow these steps:

1. Define the structure

Open the input.json file in a text editor, then add the journey definition:

input.json
            {
                "id": "jn-event-booker",
                "icon": "https://i.ibb.co/7N134gb/booking.png",
                "name": "Book an Event",
                "description": "Book an Event",
                "status": "Active",
                "start_card_ref_id": "cd-book-an-event",
                "roles": [
                    "rl-member"
                ],
                "journey_type": "STANDARD_JOURNEY"
            }

Define the included cards:

input.json
            {
                "id": "cd-book-an-event",
                "name": "Book an Event",
                "description": "Book an Event",
                "status": "Active",
                "card_definition_ref": "card/cd-book-an-event.json",
                "side": "PUBLIC",
                "role": "rl-member",
                "transaction_data_ref": "td/td-BOOKING-DETAILS.json",
                "private_card": "",
                "base_card": "base-card-1",
                "journey": "jn-event-booker",
                "outgoing_events": [
                    "e-w-navig-to-details"   
                ],
                "pre_rendering_events": [],
                "post_rendering_events": []
            },
            {
                "id": "cd-set-booking-details",
                "name": "Booking Details",
                "description": "Booking Details",
                "status": "Active",
                "card_definition_ref": "card/cd-set-booking-details.json",
                "side": "PUBLIC",
                "role": "rl-member",
                "transaction_data_ref": "td/td-BOOKING-DETAILS.json",
                "private_card": "",
                "base_card": "base-card-1",
                "journey": "jn-event-booker",
                "outgoing_events": [
                    "e-w-broad-shareAppt",
                    "e-w-navig-to-book-1"
                ],
                "pre_rendering_events": [],
                "post_rendering_events": []
            }

Define the included events:

input.json
            {
                "id": "e-w-navig-to-details",
                "name": "W-NAVIG-TO-SET",
                "description": "Event to Navigate from Book an Event to next card",
                "code": "W-NAVIG-TO-SET",
                "status": "Active",
                "type": "WALLET_LOCAL",
                "event_definition_ref": "event/e-w-navig-to-details.json",
                "submit_event_handler": "eh-w-navig-to-details",
                "node_event_handlers": [],
                "card": "cd-book-an-event"                
            },            
			{
                "id": "e-w-navig-to-book-1",
                "name": "W-NAVIG-TO-BOOK-EVT",
                "description": "Event to Navigate from Set Booking to first card",
                "code": "W-NAVIG-TO-BOOK-EVT",
                "status": "Active",
                "type": "WALLET_LOCAL",
                "event_definition_ref": "event/e-w-navig-to-book-1.json",
                "submit_event_handler": "eh-w-navig-to-book-1",
                "node_event_handlers": [],
                "card": "cd-set-booking-details"
            },
            {
                "id": "e-w-broad-shareAppt",
                "name": "W-BROAD-SHAREAPPT",
                "description": "Submit UDETAILS",
                "code": "W-BROAD-SHAREAPPT",
                "status": "Active",
                "type": "WALLET_TO_NODE",
                "event_definition_ref": "event/e-w-broad-shareAppt.json",
                "submit_event_handler": "eh-w-e-w-broad-shareAppt",
                "node_event_handlers": [
                    "eh-h-e-w-broad-shareAppt"
                ],
                "card": "cd-set-booking-details"
            }

Define the included event handlers:

input.json
            {
                "id": "eh-w-navig-to-details",
                "name": "W-NAVIG-TO-SET",
                "description": "Wallet Event Handler to Navigate from Book an Event to next card",
                "status": "Active",
                "event": "e-w-navig-to-details",
                "type": "WALLET_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-w-navig-to-details.json"
            },
            {
                "id": "eh-w-navig-to-book-1",
                "name": "W-NAVIG-TO-BOOK-EVT",
                "description": "Wallet Event Handler to Navigate from Set Booking Details to first card",
                "status": "Active",
                "event": "e-w-navig-to-book-1",
                "type": "WALLET_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-w-navig-to-book-1.json"
            },
            {
                "id": "eh-h-e-w-broad-shareAppt",
                "name": "eh-h-e-w-broad-shareAppt",
                "description": "Broadcast UDETAILS",
                "status": "Active",
                "event": "e-w-broad-shareAppt",
                "type": "NODE_EVENT_HANDLER",
                "event_handler_definition_ref": "event-handler/eh-h-e-w-broad-shareAppt.json"
            }     

2. Create the card definitions

Create the definitions for the start card: cd-book-an-event.json and the next card: cd-set-booking-details.json.

cd-book-an-event.json
{
    "id": "cd-book-an-event",
    "name": "Book an Event",
    "cardData": {
        "textforbookevent": "Book an event",
        "imageUrlzkk3n12": "https://abc-rep.net/arrow-right blue.png",

    }, 
    "cardLayout": {
        "body": [
            {
                "id": "000t1",
                "tileComponent": [
                    {
                        "id": "Tile14",
                        "subView": [
                            {
                                "title": {
                                    "text": "textforbookevent",
                                    "fontSize": 16,
                                    "titleTextColor": "#000080",
                                    "style": "REGULAR"
                                },
                                "img": {
                                    "text": "imageUrlzkk3n12",
                                    "isUrl": true,
                                    "height": "25",
                                    "width": "25"
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "backgroundColor": "#ffffff",
                        "borderWidth": 3,
                        "type": "CONTAINER",
                        "uiAction": "${action502}",
                        "order": 3
                    }
                ],
                "tileType": "WRAP",
                "uiAction": "",
                "order": 1
            }
        ],
        "style": {
            "fontSize": 16,
            "bgColor": "#ffffff",
            "borderWidth": 1
        },
        "footer": {
            "menu": [
                {
                    "id": "EN01BottomButtonBack",
                    "subView": [
                        {
                            "title": {
                                "text": ""
                            }
                        }
                    ],
                    "align": "START",
                    "type": "BACK_BUTTON",
                    "uiAction": "${action478}",
                    "order": 1
                }
            ],
            "orientation": "HORIZONTAL"
        }
    },
    "cardUIAction": {
        "action478": {
            "action": ""
        },
        "action502": {
            "action": "e-w-navig-to-details" 
        }
    }
}   
cd-set-booking-details.json
{
    "id": "cd-set-booking-details",
    "name": "Booking Details",
    "cardData": {
        "0tile0iitextiiiw8": "Enter the details for your booking.",
        "2en01bottombutton1iitextiilor": "Send",
        "1tile1iitextiiixo1": "Location",
        "1tile1iihintii6km1": "e.g. London, UK",
        "1tile1iierrorii6se1": "",
        "1tile1iitextiiixo2": "Date",
        "1tile1iihintii6km2": "e.g. Day 1, Day 2",
        "1tile1iierrorii6se2": "",
        "1tile1iitextiiixo3": "Time",
        "1tile1iihintii6km3": "e.g. 2 p.m. EST",
        "1tile1iierrorii6se3": "",
        "tile1iitextiiixop": "Purpose",
        "1tile1iihintii6kmp": "e.g. Comic Convention",
        "1tile1iierrorii6sep": "" 
    }, 
    "cardLayout": {
        "body": [
            {
                "id": "000t1",
                "tileComponent": [
                    {
                        "id": "Tile0",
                        "subView": [
                            {
                                "title": {
                                    "text": "0tile0iitextiiiw8",
                                    "style": "BOLD",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "START",
                                    "fontSize": 16
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "backgroundColor": "#ffffff",
                        "borderWidth": 1,
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 1
                    },
                    {
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "1tile1iitextiiixo",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$apptInfo}",
                                    "hint": "1tile1iihintii6km",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "1tile1iierrorii6se"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    },
                    {
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "tile1iitextiiixop",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$apptPurpose}",
                                    "hint": "1tile1iihintii6kmp",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "1tile1iierrorii6sep"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    },
                    {
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "1tile1iitextiiixo1",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$apptLocation}",
                                    "hint": "1tile1iihintii6km1",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "1tile1iierrorii6se1"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    },
                    {
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "1tile1iitextiiixo2",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$apptDays}",
                                    "hint": "1tile1iihintii6km2",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "1tile1iierrorii6se2"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    },
                    {
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "1tile1iitextiiixo3",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$apptTime}",
                                    "hint": "1tile1iihintii6km3",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "1tile1iierrorii6se3"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    }
                ],
                "tileType": "WRAP",
                "uiAction": "",
                "order": 1
            }
        ],
        "style": {
            "fontSize": 16,
            "bgColor": "#ffffff",
            "borderWidth": 1
        },
        "footer": {
            "menu": [
                {
                    "id": "EN01BottomButtonBack",
                    "subView": [
                        {
                            "title": {
                                "text": ""
                            }
                        }
                    ],
                    "align": "START",
                    "type": "BACK_BUTTON",
                    "uiAction": "${action461}",
                    "order": 1
                },
                {
                    "id": "EN01BottomButton1",
                    "subView": [
                        {
                            "title": {
                                "text": "2en01bottombutton1iitextiilor"
                            }
                        }
                    ],
                    "align": "START",
                    "type": "BUTTON",
                    "uiAction": "${action420}",
                    "order": 2
                }
            ],
            "orientation": "HORIZONTAL"
        }
    },
    "cardUIAction": {
        "action461": {
            "action": "e-w-navig-to-book-1"
        },
        "action420": {
            "action": "e-w-broad-shareAppt" 
        }
    }
}   

3. Create the event definitions

Create the definition for the event to navigate from start card to the next card: e-w-navig-to-details.json.

e-w-navig-to-details.json
{
    "definition": {
        "description": "Event to Navigate from Book an Event to next card",
        "name": "W-NAVIG-TO-SET",
        "resource": "W-NAVIG-TO-SET",
        "type": "EVENT_DATA"
    },
    "structure": {
        "attributes": [
            {
                "code": "transactionalGuid",
                "name": "transactionalGuid",
                "type_definition": {
                    "type": "string"
                },
                "order": 1,
                "system": false,
                "required": false
            }
        ]
    }
}

Create the definition for the submit event that contains the data for the booking details: e-w-broad-shareAppt.json.

e-w-broad-shareAppt.json
{
    "definition": {
        "description": "Submit Booking Details",
        "name": "W-BROAD-SHAREAPPT",
        "resource": "W-BROAD-SHAREAPPT",
        "type": "EVENT_DATA"
    },
    "structure": {
        "attributes": [
            {
                "name": "apptInfo",
                "code": "apptInfo",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 1
            },
            {
                "name": "apptPurpose",
                "code": "apptPurpose",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 2
            },
            {
                "name": "apptLocation",
                "code": "apptLocation",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 3
            }, 
            {
                "name": "apptDays",
                "code": "apptDays",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 4
            },
            {
                "name": "apptTime",
                "code": "apptTime",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 5
            },
            {
                "name": "senderNodeAddress",
                "code": "senderNodeAddress",
                "type_definition": {
                    "type": "string"
                },
                "required": true,
                "system": false,
                "order": 7
            }
        ]
    }
}

Create the definition for the next navigation event after submitting details: e-w-navig-to-book-1.json.

e-w-navig-to-book-1.json
{
  "definition": {
    "description": "Event to Navigate from Set Booking Details to first card",
    "name": "W-NAVIG-TO-BOOK-EVT",
    "resource": "W-NAVIG-TO-BOOK-EVT",
    "type": "EVENT_DATA"
  },
  "structure": {
    "attributes": [
      {
        "code": "transactionalGuid",
        "name": "transactionalGuid",
        "type_definition": { "type": "string" },
        "order": 1,
        "system": false,
        "required": false
      }
    ]
  }
}

4. Create the event handler definitions

Create the event handler definition for the navigation event with booking details: eh-w-navig-to-details.json.

{
    "walletEventHandler": [
        {
            "refId": "e-w-navig-to-details",
            "walletEvents": [
                {
                    "actions": [
                        {
                            "name": "submit",
                            "order": 1,
                            "parameter": [
                                {
                                    "method": "DETAILS",
                                    "url": ""
                                }
                            ]
                        }
                    ],
                    "postAction": "cd-set-event-details",
                    "refId": "e-w-navig-to-details"
                }
            ]
        }
    ]
}

Create the event handler definition for saving data to the BOOKING_DETAILS collection: eh-h-e-w-broad-shareAppt.json. This node event handler also appends attributes to the payload.

eh-h-e-w-broad-shareAppt.json
{
    "nodeEventHandlers": [
        {
            "type": "MAPPER",
            "name": "Append attributes",
            "order": 1,
            "dataSource": "EVENT_PAYLOAD",
            "additionalAttributes": {
                "transactionalGuid": {
                    "source": "GENERATED",
                    "value": "UUID" 
                },
                "leadNodeAddress": {
                    "source": "EVENT_PAYLOAD",
                    "value": "senderNodeAddress"
                },
                "apptInfo": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptInfo"
                },
                "apptPurpose": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptPurpose"
                },
                "apptLocation": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptLocation"
                },
                "apptWorkDays": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptDays"
                },
                "apptWorkHours": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptTime"
                },
                "createdAt": {
                    "source": "GENERATED",
                    "value": "CURRENT_TIMESTAMP"
                },
                "updatedAt": {
                    "source": "GENERATED",
                    "value": "CURRENT_TIMESTAMP"
                }
            },
            "excludedAttributes": [
                "senderNodeAddress"
            ]
        },
        {
            "type": "EXPRESSION_LANGUAGE",
            "name": "Append attributes",
            "order": 2,
            "dataSource": "HANDLER_ARGUMENTS",
            "computedAttributes": {
                "submittedAt": "\"Received on: \" + new java.text.SimpleDateFormat(\"dd/MM/yyyy\").format(new java.util.Date(arguments['createdAt']))"            }
        },
        {
            "type": "VAULT_INSERT",
            "name": "BOOKING_DETAILS",
            "order": 3,
            "collection": "BOOKING_DETAILS",
            "collectionVersion": 1,
            "dataSource": "HANDLER_ARGUMENTS",
            "handlerOutput": "PERSISTED_ENTITY"
        },
        {
            "type": "NEXT_EVENT_RECIPIENT",
            "name": "Fetch sender address",
            "order": 4,
            "recipientAddress": {
                "source": "EVENT_PAYLOAD",
                "value": "senderNodeAddress"
            },
            "handlerOutput": "HANDLER_ARGUMENTS"
        },
        {
            "type": "MAPPER",
            "name": "Append and Exclude attributes in the result",
            "order": 5,
            "dataSource": "EVENT_PAYLOAD",
            "additionalAttributes": {
                "transactionalGuid": {
                    "source": "HANDLER_ARGUMENTS",
                    "value": "transactionalGuid"
                },
                "submittedAt": {
                    "source": "HANDLER_ARGUMENTS",
                    "value": "submittedAt"
                },
                "apptInfo": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptInfo"
                },
                "apptPurpose": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptPurpose"
                },
                "apptLocation": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptLocation"
                },
                "apptWorkDays": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptDays"
                },
                "apptWorkHours": {
                    "source": "EVENT_PAYLOAD",
                    "value": "apptTime"
                }
            },
            "excludedAttributes": [
                "createdAt",
                "updatedAt",
                "leadNodeAddress",
                "senderNodeAddress"
            ]
        }
    ]
}

Create the event handler definition for the navigation event after submitting booking details: eh-w-navig-to-book-1.json. The booking details are fetched from the data collection: td/td-BOOKING_DETAILS.

eh-w-navig-to-book-1.json
{
    "walletEventHandler": [
        {
            "refId": "e-w-navig-to-book-1",
            "walletEvents": [
                {
                    "actions": [
                        {
                            "name": "submit",
                            "order": 1,
                            "parameter": [
                                {
                                    "method": "GET",
                                    "url": "/transactions/BOOKING_DETAILS"
                                }
                            ]
                        }
                    ],
                    "postAction": "cd-book-an-event",
                    "refId": "e-w-navig-to-book-1" 
                }
            ]
        }
    ]
}

Functions

This section provides information about the functions that are supported within card definitions.

Use the functions to link cards to event handlers, execute operations to fetch data, validate data input, navigate between cards, and manage other interactions.

Fetching data

Function.SOLVE.getTokenBalance

Fetches the available SOLVE token balance after joining a network.

Parameter

Field
Value
Description

name

string

The name of the function: Function.SOLVE.getTokenBalance

sourceKeys

array

Not required

totalKey

string

Not required

resultKey

string

The key name in which you want to store the final outcome of the function.

Example:
    "prerenderingFunctions": [
        {
            "name": "Function.SOLVE.getTokenBalance",
            "sourceKeys": [],
            "totalKey": "",
            "resultKey": "solveBalance"
        }
    ]

Function.SOLVE.getExchangeRate

Fetches the exchange value of SOLVE from USD.

Parameter

Field
Value
Description

name

string

The name of the function: Function.SOLVE.getExchangeRate

sourceKeys

array

The key name, which has a value in USD and is passed as an input to the function.

resultKey

string

The key name in which you want to store the final outcome of the function.

Example:
"prerenderingFunctions": [
    {
        "name": "Function.SOLVE.getExchangeRate",
        "sourceKeys": [ "totalUsdCost" ],
        "resultKey": "totalSolveCost"
    }
]

Function.Profile.key

Shows user profile data inside the network.

Parameter

Field
Value
Description

text

string

The name of the function: Function.Profile.key

The following keys can be used as input:

  • name (nickname)

  • cw_id

  • phone

  • country (get user's country code, such as "US")

  • first_name

  • last_name

  • ssn

  • language

Example 1:
{
    "id": "Tile0",
    "subView": [
        {
        "title": {
        "text": "Function.Profile.first_name"
        }
    }
]
}
Example 2:
{
    "id": "Tile14a",
    "subView": [
     {
       "title": {
       "text": "2tile14aiitextiihsb",
       "titleTextColor": "#000080",
       "style": "BOLD"
      },
       "subTitle": {
       "text": "Function.Profile.cw_id",
       "subTitleTextColor": "#000080",
       "style": "REGULAR"
      },
   }
]
}

Function.PROTOCOL.preLoadData

Executes a GET request to the user node.

Parameter

Field
Value
Description

name

string

The name of the function: Function.PROTOCOL.preLoadData

url

string

The URL path where the data is stored.

Example:
    "prerenderingFunctions": [
            {
                "name": "Function.PROTOCOL.preLoadData",
                "url": "/transactions/H_QUESTIONS"
            }

Function.getGPSLocation

Fetches user's current location latitude and longitude.

Parameter

Field
Value
Description

name

string

The name of the function: Function.getGPSLocation

sourceKeys

array

The key names that correspond to the user's location coordinates (latitude and longitude).

Example:
    "prerenderingFunctions": [
        {
            "name": "Function.getGPSLocation",
            "sourceKeys": [ "userLocationLatitude", "userLocationLongitude" ]
        }

Function.Preference.language

Shows user preference data such as language preference.

Parameter

Field
Value
Description

text

string

The name of the function: Function.Preference.language This function is used only inside Tiles.

Example:
{
    "id": "Tile0",
    "subView": [
        {
            "title": {
                "text": "Function.Preference.language"
            }
        }
    ],
}

Performing calculations

Function.data.totalCount

Shows the total count of fetched data.

Parameter

Field
Value
Description

text

string

The name of the function: Function.data.totalCount

Example:
{
    "id": "Tile0a",
    "subView": [
        {
            "title": {
                "text": "0tile0aiitextiizsx",
                "style": "BOLD",
                "titleTextColor": "#000080",
                "titleAlign": "START"
            },
            "subTitle": {
                "text": "Function.data.totalCount",
                "style": "REGULAR",
                "subTitleTextColor": "#000080",
                "subTitleAlign": "END"
            }
        }
    ],
    "borderColor": "#87ceeb",
    "type": "CONTAINER",
    "uiAction": "",
    "order": 2
}

Function.calculateSum

Calculates the total sum of all input value.

Parameter

Field
Value
Description

name

string

The name of the function: Function.calculateSum

sourceKeys

array

The names of the keys on which you want to calculate the sum.

resultKey

string

The key name in which you want to store the final outcome of the function.

NAVIGATE

string

The value of the card ID where you want to navigate after getting the result from the function. If you want to show results on the same card, then use the same card ID.

Example:
"cardUIAction": {
     "action1": {
        "action": [
        {
          "name": "Function.calculateSum",
          "url": "",
          "sourceKeys":["keyName1","keyName2","keyName3"],
          "sourceKey":"",
          "resultKey" : "KeyName3",
          "NAVIGATE":"cd-cost-preview"
         }
       ]
     }
   }

Function.calculateSubtract

Calculates the subtraction of the input value.

Parameter

Field
Value
Description

name

string

The name of the function: Function.calculateSubtract

sourceKey

string

The key name that you want to subtract from the totalKey.

totalKey

string

The key name from which the source key value gets subtracted.

resultKey

string

The key name in which you want to store the final outcome of the function.

NAVIGATE

string

The value of the card ID where you want to navigate after getting the result from the function. If you want to show results on the same card, then use the same card ID.

Example:
"cardUIAction": {
     "action1": {
        "action": [
        {
          "name": "Function.calculateSubtract",
          "url": "",
          "sourceKeys":[],
          "sourceKey":"keyName1",
          "totalKey":"keyName2"
          "resultKey" : "KeyName3",
          "NAVIGATE":"cd-cost-preview"
         }
       ]
     }
   }

Function.calculateMultiply

Calculates the multiplication of all input values.

Parameter

Field
Value
Description

name

string

The name of the function: Function.calculateMultiply

sourceKeys

array

The key names on which you want to calculate multiplication.

resultKey

string

The key name in which you want to store the final outcome of the function.

NAVIGATE

string

The value of the card ID where you want to navigate after getting the result from the function. If you want to show results on the same card, then use the same card ID.

Example:
"cardUIAction": {
     "action1": {
        "action": [
        {
          "name": "Function.calculateMultiply",
          "url": "",
          "sourceKeys":["keyName1","keyName2","keyName3"],
          "sourceKey":"",
          "resultKey" : "KeyName3",
          "NAVIGATE":"cd-cost-preview"
         }
       ]
     }
   }

Function.calculateDivide

Calculates the division of the input value.

Parameter

Field
Value
Description

name

string

The name of the function: Function.calculateDivision

sourceKey

string

The key name that you want to get divided from the totalKey.

totalKey

string

The key name from which the source key value gets divided.

resultKey

string

The key name in which you want to store the final outcome of the function.

Example:
"cardUIAction": {
     "action1": {
        "action": [
        {
           "name": "Function.calculateDivide",
           "url": "",
           "sourceKeys":[],
           "sourceKey":"keyName1",
           "totalKey":"keyName2"
           "resultKey" : "KeyName3",
           "NAVIGATE":"cd-cost-preview"  
         }
       ]
     }
   }

Function.calculatePercentage

Calculates the percentage of the input value.

Parameter

Field
Value
Description

name

string

The name of the function: Function.calculatePercentage

sourceKey

string

The key name that has the percentage value, like 10% should be used as 10, 20% should be used as 20.

totalKey

string

The key name on which sourceKey will be applied. For example, if sourceKey has a key name with a value of 10 and totalKey has a key name with a total value of 200, the outcome will be 10 * 200 / 100 = 20.

resultKey

string

The key name on which the final outcome of the function is stored.

NAVIGATE

string

The value of the card ID where you want to navigate after getting the result from the function. If you want to show results on the same card, then use the same card ID.

Example:
"cardUIAction": {
     "action1": {
        "action": [
        {
           "name": "Function.calculatePercentage",
           "url": "",
           "sourceKeys":[],
           "sourceKey":"keyName1",
           "totalKey":"keyName2"
           "resultKey" : "KeyName3",
           "NAVIGATE":"cd-cost-preview"
          }
        ]
      }
    }

Validating data input

Function.validateReferralCode

Validates if the referral code entered is a valid TuumIO Wallet ID.

Parameter

Field
Value
Description

name

string

The name of the function: Function.validateReferralCode

resultKey

string

The input key for referral code. For example: {$ReferralCode}

Example:
        "action2":{
            "action": [
                {
                    "name": "Function.validateReferralCode",
                    "resultKey": "{recipientPublicKey}"
                },
                {
                    "name": "e-w-parti-refer-trial"
                }
            ]
        } 

Check field format and field value

Validates field format and value. This function is used in SmartTile1.

Parameter

Field
Value
Description

fieldFormat

string

The name of the field value to be validated. The supported fieldFormat values are:

  • age

  • email

  • pin

  • year

  • date

  • phone

  • country

  • ssn

  • otp

  • text

  • number

  • trialId

min

string

The minimum length of the field value.

max

string

The maximum length of the field value.

validation

string

The validation whether field is required and the error message.

name

string

The validation whether field is required.

error

string

The error message that shows when the value entered in invalid.

Example:
{
    "id": "SmartTile1",
    "subView": [
        {
            "title": {
                "text": "5tile2iitextii7g0",
                "titleTextColor": "#000000",
                "titleAlign": "START"
            },
            "subTitle": {
                "text": "{$phoneValue}",
                "hint": "5tile2iihintiij3r",
                "subTitleTextColor": "#000000",
                "subTitleAlign": "START",
                "tip": "5tile2iitipiivqw",
                "fieldFormat": "phone",
                "min": "1",
                "max": "30",
                "validation": [
                    {
                        "name": "REQUIRED_FIELD",
                        "error": "5tile2iierroriinaz"
                    }
                ]
            },
            "img": {
                "text": "imageUrlktoxk",
                "isUrl": true,
                "height": "24",
                "width": "24"
            }
        }
    ],
    "borderColor": "#afafaf",
    "type": "CONTAINER",
    "uiAction": "",
    "order": 5
}

Linking and navigation

Function.When.Condition.Navigate

Shows a default empty card when no data is fetched, otherwise it moves to a specific card based on the whenConditionKey value within the data. This function allows displaying different cards based on various conditions.

Parameter

Field
Value
Description

name

string

The name of the function: Function.When.Condition.preLoad

method

string

The method used to fetch data: GET

url

string

The path of the transaction data collection.

cardId

string

The reference ID of the current card.

whenConditionKey

string

The key name which represents the condition values, such as recordStatus.

whenConditions

array

The list of condition values and card IDs.

conditionValue

string

The value of the condition.

conditionCardId

string

The card ID reference of the destination card.

Example:
    "cardUIAction": {
        "action253": {
            "action": [
                      {
                          "name": "Function.When.Condition.Navigate",
                          "cardId": "cd-xb8kw63u8rpge76l5mngcpkt36v1",
                          "whenConditionKey": "recordStatus",
                          "whenConditions": [
                            {
                                  "conditionValue": "empty",
                                  "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg6"
                            },
                            {
                                "conditionValue": "rejected",
                                "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg8"
                            },
                            {
                                "conditionValue": "verified",
                                "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg7"
                            },
                            {
                                "conditionValue": "submitted",
                                "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg9"
                            },
                            {
                                "conditionValue": "Pending review",
                                "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg10"
                            }
                          ]
                        }
                    ]
          },

Function.When.Condition.PreLoad

Shows a default empty card when no data is fetched, otherwise it stays on the current card. For the description of parameters, see Function.When.Condition.Navigate.

Example:
    "prerenderingFunctions": [
        {
          "name": "Function.When.Condition.preLoad",
          "method": "GET",
          "url": "/transactions/RECORD_DATA",
          "cardId": "cd-xb8kw63u8rpge76l5mngcpkt36v1",
          "whenConditionKey": "recordStatus",
          "whenConditions": [
            {
              "conditionValue": "empty",
              "conditionCardId": "cd-7w2t7slwuxjxojbu8n1qdvps-sg6"
            }
          ]
        }
      ],

Function.Navigate

Moves to the destination card without calling events or event handlers. This function also supports calculating and comparing values.

Parameter

Field
Value
Description

name

string

The name of the function: Function.Navigate

cardId

string

The card ID reference of the destination card.

Example 1:
    "cardUIAction": {
        "action1": {
            "action": "HOME"
        },
        "action17d1": {
            "action": [
                {
                    "name": "Function.Navigate",
                    "cardId": "cd-bpmho1x359gohn1rw6xdppzkzu11"
                }
            ]
        },
        "action17d2": {
            "action": [
                {
                    "name": "Function.Navigate",
                    "cardId": ""
                }
            ]
        },
        "action17d3": {
            "action": [
                {
                    "name": "Function.Navigate",
                    "cardId": ""
                }
            ]
        }
    }
Example 2:
"cardUIAction": {
    "action1": {
        "action": "BACK"
    },
    "action337": {
        "action": [
            {
                "name": "Function.calculateSum",
                "sourceKeys": [
                    "patientAge",
                    "patientSugarLevel",
                    "patientSleepingTime"
                ],
                "resultKey": "resultSum1"
            },
            {
                "name": "Function.Navigate",
                "compareKey": "resultSum1",
                "compareValue": 60,
                "cardIdForGreaterValue": "cd-40yoxo205nu4sippxzmzj22mnn0",
                "cardIdForLessValue": "cd-34fdshqildm8ojse2tzu7jd85qj",
                "cardId": "cd-40yoxo205nu4sippxzmzj22mnn0"
            }
        ]
    }
}

Function.ChangeCard

Pushes to a new view after comparing the compareKey values.

Parameter

Field
Value
Description

name

string

The name of the function: Function.ChangeCard

compareKey

string

The dynamic value based on results from another function.

compareValue

integer

The fixed value to which the compareKey value is compared to.

cardIdForGreaterValue

string

The card ID that is viewed when the compareKey value is greater than the fixed value set in compareValue.

cardIdForLessValue

string

The card ID that is viewed when the compareKey value is less than the fixed value set in compareValue.

cardId

string

The card ID of the current view.

Example:
{
    "name": "Function.ChangeCard",
    "compareKey": "resultSum1",
    "compareValue": 60,
    "cardIdForGreaterValue": "cd-40yoxo205nu4sippxzmzj22mnn0",
    "cardIdForLessValue": "cd-34fdshqildm8ojse2tzu7jd85qj",
    "cardId": "cd-40yoxo205nu4sippxzmzj22mnn0"
}

Function.deposit.SOLVE

Navigates from any card to the "SOLVE" tab view.

Parameter

Field
Value
Description

uiAction

string

The name of the function: Function.deposit.SOLVE

Example:
{
    "id": "Tile14",
    "subView": [
        {
            "title": {
                "text": "2tile14iitextii8ek"
            },
            "img": {
                "text": "imageUrl8i1kh",
                "isUrl": true,
                "height": "25",
                "width": "25"
            }
        }
    ],
    "borderColor": "#afafaf",
    "type": "CONTAINER",
    "uiAction": "Function.deposit.SOLVE",
    "order": 2
}

Multiple selection

Allows multiple item selection for Tile12: Dropdown Option Selector.

Parameter

Field
Value
Description

fieldFormat

string

The value that allows selecting multiple items in a dropdown list.

Example:
{
    "id": "Tile12",
    "subView": [
        {
            "title": {
                "text": "4tile12iitextii0xr",
                "style": "REGULAR",
                "titleTextColor": "#000000",
                "titleAlign": "START",
                "fontSize": 16
            },
            "subTitle": {
                "text": "4tile12iitextii1w4",
                "fontSize": 16,
                "data": "4tile12iidataii9pw",
                "hint": "4tile12iihintiigmm",
                "keyboard": "text",
                "subTitleTextColor": "#000000",
                "subTitleAlign": "START",
                "fieldFormat": "multiple"
            },
            "img": {
                "text": "imageUrlltc9e",
                "isUrl": true,
                "height": "25",
                "width": "25"
            }
        }
    ],
    "borderColor": "#afafaf",
    "backgroundColor": "#ffffff",
    "borderWidth": 1,
    "type": "CONTAINER",
    "uiAction": "",
    "order": 4
}

isLink or isUrl

Adds links inside the text of a tile, such as Tile0: Text Label.

Parameter

Field
Value
Description

isLink or isURL

string

To enable the link features in a tile, the value is set to "true".

urls

array

The list of labels and URLs. If isLink or isURL is set to "true", then this property is required.

label

string

The title or subtitle text that will be clickable from the tile.

url

string

The URL that opens when the label text is clicked.

Example:
{
  "id": "Tile0",
  "subView": [
      {
          "title": {
              "text": "6tile0aiitextiicqd",
              "style": "REGULAR",
              "titleTextColor": "#000000",
              "titleAlign": "START",
              "isUrl": true,
              "urls": [
                  { 
                    "label":"Terms",
                    "url":"https://solve.care/tuumiowallet-terms-and-conditions/" 
                  },
                  {
                    "label":"Privacy",
                    "url":"https://solve.care/tuumiowallet-privacy-policy/" 
                  }
              ]
          }
      }
  ],
  "borderColor": "#afafaf",
  "type": "CONTAINER",
  "uiAction": "",
  "order": 7
},

Function.CallEventHandler

Executes other functions to pass user input to the next card.

Parameter

Field
Value
Description

name

string

The name of the function: Function.CallEventHandler

method

string

The user input data to pass to the next card.

Example:
        "action3": {
            "action": {
                "name": "Function.CallEventHandler",
                "method": "DETAILS",
                "NAVIGATION": "cd-participants-terms"
            }
        }

Function.COPY.TEXT

Copies the subtitle or title text from specific tiles.

Parameter

Field
Value
Description

uiAction

string

The name of the function: Function.COPY.TEXT

Example:
{
    "id": "Tile0a",
    "subView": [
        {
            "title": {
                "text": "0tile0aiitextiictl",
                "style": "BOLD",
                "titleTextColor": "#000000",
                "titleAlign": "START"
            },
            "subTitle": {
                "text": "0tile0aiitextiiocy",
                "style": "REGULAR",
                "subTitleTextColor": "#000000",
                "subTitleAlign": "END"
            }
        }
    ],
    "borderColor": "#afafaf",
    "type": "CONTAINER",
    "uiAction": "Function.COPY.TEXT",
    "order": 1
}

Function.camera_selfie

Captures a selfie or selects from the gallery.

Parameter

Field
Value
Description

name

string

The name of the function: Function.camera_selfie

resultKey

string

The key name which will save the image in base64 format and will be added to the payload to be sent to the node.

Example:
"cardUIAction": {
     "action1": {
        "action":[
        {
          "name": "Function.camera_selfie",
          "resultKey" : "KeyName",
          "NAVIGATE":"cd-cost-preview"
         }
       ]
     }
   }

Function.uploadFiles

Uploads multiple files in AttachmentUploadTile.

Parameter

Field
Value
Description

name

string

The name of the function: Function.uploadFiles

sourceKeys

array

The input key of the AttachmentUploadTile. For example, for input key {$attachingFiles}, the value for sourceKey is "attachingFiles".

resultKey

string

The final submit key for storing data.

timestampKey

string

The time in milliseconds when the file is successfully uploaded.

Example:
{
  "id": "AttachmentUploadTile",
  "subView": [
      {
          "title": {
              "text": "1tile13iitextiiacf",
              "style": "REGULAR",
              "titleTextColor": "#000000",
              "titleAlign": "START",
              "fontSize": 16
          },
          "subTitle": {
              "text": "{$attachingFiles}",
              "fontSize": 16,
              "fileType": "PDF,PNG,JPG",
              "hint": "1tile13iihintii9rf",
              "subTitleTextColor": "#000000",
              "subTitleAlign": "START"
          }
      }
  ],
  "borderColor": "#afafaf",
  "backgroundColor": "#ffffff",
  "borderWidth": 1,
  "type": "CONTAINER",
  "uiAction": "",
  "order": 2
}
Example:
"cardUIAction": {
    "action394": {
        "action": [
            {
                "name": "Function.uploadFiles",
                "sourceKeys": ["attachingFiles"],
                "resultKey": "record_folder_ref",
                "timestampKey": "createdAt"
            },
            {
                "name": "e-w-pt-save-pt_da-ms3o"
            }
        ]
    }
}

Tiles

This section describes the supported configurations and examples of tiles used in card definitions.

Use tiles to display card data in a specific layout or to provide functionality to texts, buttons, and images.

Tile0: Text Label

This tile represents a text label in a single row.

Configurations
Preview
  • style: Regular or Bold

  • align: START (left), CENTER, END (right) or JUSTIFY

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile0",
            "subView": [
              {
                "title": {
                  "text": "00t1v0",
                  "style": "bold"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile0a: Two Text Labels

This tile represents two texts labels in a single row.

Configurations
Preview
  • style: Regular or Bold

  • align: START (left), END (right) or JUSTIFY

  • border color: hex value

  • text color: hex value

Example:
 {
            "id": "Tile0a",
            "subView": [
              {
                "title": {
                  "text": "00t1v36",
                  "style": "bold"
                },
                "subTitle": {
                  "text": "00t1v37",
                  "style": "bold"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile1: Text Input

This tile represents a text input for a specific key.

Configurations
Preview
  • align: START (left), END (right) or JUSTIFY

  • keyboard: text or number

  • min and max: character length

  • hint: placeholder for text input

  • key: {*sugarLevel}- The text input is set to key sugarlevel that will be used and sent through an event.

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile1",
            "subView": [
              {
                "title": {
                  "text": "00t1v25"
                },
                "subTitle": {
                  "text": "{*sugarLevel}",
                  "hint": "00t1v26",
                  "keyboard": "text",
                  "min":"1",
                  "max":"30"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile1a: Two Rows with Text Input

This tile represents two rows: the first containing a text label and the second containing a text input for a specific key.

Configurations
Preview
  • Title text is displayed on the first row

  • Subtitle text is displayed on the second row as an input field

  • text color: hex value

  • border color: hex value

  • align: START, CENTER, END and JUSTIFY

  • hint: placeholder for text input

  • keyboard: text or number

  • min and max length

  • validation: optional or required, and error message

Example:
{
                        "id": "Tile1a",
                        "subView": [
                            {
                                "title": {
                                    "text": "1tile1iitextiiixo",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "JUSTIFY"
                                },
                                "subTitle": {
                                    "text": "{$ReferralCode}",
                                    "hint": "1tile1iihintii6km",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "keyboard": "text",
                                    "min": "1",
                                    "max": "1000",
                                    "validation": [
                                        {
                                            "name": "OPTIONAL",
                                            "error": "1tile1iierrorii6se"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#87ceeb",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 4
                    }

Tile2: Text Input with Tooltip

This tile represents a text input for a specific key with tooltip.

Configurations
Preview
  • align: START (fixed left)

  • keyboard: text or number

  • min and max: character length

  • hint: placeholder for text input

  • key: {*age} - The text input is set to age that will be used and sent through an event.

  • tip: text shows when a user clicks the question mark icon

  • border color: hex value

  • text color: hex value

  • icon image: height and width

Example:
{
            "id": "Tile2",
            "subView": [
              {
                "title": {
                  "text": "00t1v23"
                },
                "subTitle": {
                  "text": "{*age}",
                  "hint": "00t1v24",
                  "keyboard": "text",
                  "min":"1",
                  "max":"30",
                  "tip": "00t1v22"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile3: Date Selector

This tile represents a date selector for a specific key.

Configurations
Preview
  • title label (left)

  • min and max: date values

  • align: START (fixed left)

  • hint: placeholder for date input

  • key: {*dateSelected} - The date input is set to key dateSelectedthat will be used and sent through an event.

  • border color: hex value

  • text color: hex value

  • icon image: height and width

Example:
{
            "id": "Tile3",
            "subView": [
              {
                "title": {
                  "text": "00t1v19"
                },
                "subTitle": {
                  "text": "{*dateSelected}",
                  "hint": "00t1v20",
                  "min" : "12/01/2022",
                  "max" : "14/01/2022"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile5: Stepper

This tile represents a stepper to adjust the value for a specific key.

Configurations
Preview
  • title label (left)

  • start: the start number of the stepper

  • end: the end number of the stepper

  • align: START (fixed left), JUSTIFY

  • key: {status} - The selected value is set to key statusthat will be used and sent through an event.

  • border color: hex value

  • text color: hex value

Example:
{
            "id":"Tile5",
            "subView":[
              {
                "title":{
                  "text":"00t1v18"
                },
                "subTitle":{
                  "text":"{status}",
                  "start": 0,
                  "end": 100,
                  "count":10
                }
              }
            ],
            "align":"START",
            "type":"CONTAINER",
            "uiAction":"",
            "order":1
          }

Tile6: Horizontal Radio Buttons

This tile represents option selectors as radio buttons in horizontal format.

Configurations
Preview
  • title label (left)

  • align: START, JUSTIFY

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: dynamic options list

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile6",
            "subView": [
              {
                "title": {
                  "text": "00t1v5"
                },
                "options": {
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v11"
                    },
                    {
                      "label": "00t1v12"
                    },
                    {
                      "label": "00t1v13"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile6a: Vertical Radio Buttons

This tile represents option selectors as radio buttons in vertical format.

Configurations
Preview
  • title label (left)

  • align: START, JUSTIFY

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: dynamic options list

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile6",
            "subView": [
              {
                "title": {
                  "text": "00t1v5"
                },
                "options": {
                  "key":{
                    "name":"{answer5}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v11"
                    },
                    {
                      "label": "00t1v12"
                    },
                    {
                      "label": "00t1v13"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile7: Horizontal Checkboxes

This tile represents a multi-option selector as checkboxes in horizontal format.

Configurations
Preview
  • title label (left)

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: dynamic options list

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile7",
            "subView": [
              {
                "title": {
                  "text": "00t1v5"
                },
                "options": {
                  
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v11"
                    },
                    {
                      "label": "00t1v12"
                    },
                    {
                      "label": "00t1v13"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile7a: Vertical Checkboxes

This tile represents a multi-option selector as checkboxes in vertical format.

Configurations
Preview
  • title label (left)

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile7a",
            "subView": [
              {
                "title": {
                  "text": "00t1v5"
                },
                "options": {
                  
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v11"
                    },
                    {
                      "label": "00t1v12"
                    },
                    {
                      "label": "00t1v13"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile7b: Vertical Checkboxes with Subtitle

This tile is the same as Tile7a with an extra option for a subtitle label, such as displaying the count in numbers.

Configurations
Preview

For subtitle color handling:

  • border color: hex value

  • text color: hex value

In the example, the subtitle is shown as a number next to the title label.

Example:
{
            "id": "Tile7b",
            "subView": [
              {
                "title": {
                  "text": "00t1v5"
                },
                "options": {
                  
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v11",
                      "subTitle":{
                        "text": "{00t1v11}",
                        "colorCode": "00FF00"
                    },
                    {
                      "label": "00t1v12"
                      "subTitle":{
                        "text": "{00t1v12}",
                        "colorCode": "00FF00"                
                    },
                    {
                      "label": "00t1v13"
                      "subTitle":{
                        "text": "{00t1v13}",
                        "colorCode": "00FF00"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile8: Scrollable Table

This tile represents a scrollable table grid.

Configurations
Preview
  • title label (left)

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: label and data

  • label: the header title

  • data: the list of data for each header

Example:
{
              "id": "Tile8",
              "subView": [
                {
                  "title": {
                    "text": "00t1v10"
                  },
                  "options": {
                    
                    "key":{
                      "name":"{answer}"
                    },
                    "list":[
                      {
                        "label": "00t1v11",
                        "data" : "00t1v14"
                      },
                      {
                        "label": "00t1v12",
                        "data" : "00t1v15"
                      },
                      {
                        "label": "00t1v13",
                        "data" : "00t1v16"
                      }
                    ]
                  }
                }
              ],
              "align":"START",
              "type": "CONTAINER",
              "uiAction": "",
              "order": 1
            }

Tile9: Scrollable Table without Title Label

This tile is the same as Tile8, with no title.

Configurations
Preview
Example:
{
              "id": "Tile9",
              "subView": [
                {
                  "options": {
                    
                    "key":{
                      "name":"{answer}"
                    },
                    "list":[
                      {
                        "label": "00t1v11",
                        "data" : "00t1v14"
                      },
                      {
                        "label": "00t1v12",
                        "data" : "00t1v15"
                      },
                      {
                        "label": "00t1v13",
                        "data" : "00t1v16"
                      }
                    ]
                  }
                }
              ],
              "align":"START",
              "type": "CONTAINER",
              "uiAction": "",
              "order": 1
            }

Tile10: Option Selector

This tile represents an option selector.

Configurations
Preview
  • title label (left)

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: dynamic options list

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile10",
            "subView": [
              {
                "title": {
                  "text": "00t1v4"
                },
                "options": {
                  
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v16"
                    },
                    {
                      "label": "00t1v17"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile10a: Toggle Switch

This tile represents a toggle switching button, such as "on" or "off".

Configurations
Preview
  • title label (left)

  • options: key and list

  • key: {answer} - The selected option is set to key answer that will be used and sent through an event.

  • list: dynamic options to toggle on and off

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile10a",
            "subView": [
              {
                "title": {
                  "text": "00t1v4"
                },
                "options": {
                  
                  "key":{
                    "name":"{answer}"
                  },
                  "list":[
                    
                    {
                      "label": "00t1v16"
                    },
                    {
                      "label": "00t1v17"
                    }
                  ]
                  
                }
                
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile11: Title and Text

This tile represents two rows with a title and a subtitle text.

Configurations
Preview
  • title label (left) on first row

  • subtitle label (left) on second row

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile11",
            "subView": [
              {
                "title": {
                  "text": "00t1v27"
                },"subTitle":{
                  "text":"00t1v28"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
            
          }

Tile11a: Title and Scrollable Text

This tile is the same as Tile11 with a scrollable subtitle text.

Configurations
Preview

For subtitle view:

  • heightMultiplier: "1" - This value is calculated according the screen ratio.

  • text includes JUSTIFY option

  • border color: hex value

  • text color: hex value

Example:
{
            "id": "Tile11",
            "subView": [
              {
                "title": {
                  "text": "00t1v27"
                },"subTitle":{
                  "text":"00t1v28",
                  "heightMultiplier":"1"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
            
          }

Tile12: Dropdown Option Selector

This tile represents a dropdown selector for a list of options.

Configurations
Preview
  • title label (left)

  • subtitle: key, hint, and data

  • key: {*patient} - The selected option is set to key patient that will be used and sent through an event.

  • hint: placeholder for the selected option

  • data: an array of options loaded from cardData, for example: ["option 1", "option 2", "option 3"]

  • text includes JUSTIFY option

  • border color: hex value

  • text color: hex value

  • icon image: height and width

Example:
{
            "id": "Tile12",
            "subView": [
              {
                "title": {
                  "text": "00t1v29"
                },
                
                "subTitle": {
                  "text": "{*patient}",
                  "hint": "00t1v30",
                  "keyboard": "text",
                  "data" : "00t1v14"
                }
              }
            ],
            "align":"START",
            "type": "CONTAINER",
            "uiAction": "",
            "order": 1
          }

Tile14: Clickable Tile

This tile represents a clickable tile that triggers an action.

Configurations
Preview
  • title label

  • uiAction: "${action1}" - This value is correlated with an event handler.

  • text includes JUSTIFY option

  • border color: hex value

  • text color: hex value

  • icon image: height and width

Example:
 {
            "id":"Tile14",
            "subView":[
              {
                "title":{
                  "text":"00t1v21"
                }
                
              }
            ],
            "align":"START",
            "type":"CONTAINER",
            "uiAction":"${action1}",
            "order":1
          }

Tile14a: Clickable Tile with Subtitle

This tile is the same as Tile14 with a subtitle.

Configurations
Preview
  • style: bold

  • text includes JUSTIFY option

  • border color: hex value

  • text color: hex value

  • icon image: height and width

Example:
 {
            "id":"Tile14a",
            "subView":[
              {
                "title":{
                  "text":"00t1v21",
                  "style":"bold"
                },
                "subTitle":{
                  "text":"00t1v21",
                  "style":"bold"
                },
                "img":{
                  "text":"00t1v35"
              }
            ],
            "align":"START",
            "type":"CONTAINER",
            "uiAction":"${action1}",
            "order":1
          }

Tile16: Image Tile

This tile represents an image that can be loaded locally or from a URL.

Configurations
Preview
  • image: text, isURL, height and width

  • text: the source of the image (link or image name) loaded from the cardData

  • isURL: true or false

  • size: height and width

Example:
{
            "id":"Tile16",
            "subView":[
              {
                "img":{
                  "text":"00t1v35",
                  "isUrl":true
                }
              }
            ],
            "align":"START",
            "type":"CONTAINER",
            "uiAction":"",
            "order":1
          }

Tile17: Clickable Image Grid

This tile represents clickable images to select an option or trigger an action.

Configurations
Preview
  • options: key and list

  • key: {answer5} - The selected option from the list is set to key answer5 that will be used and sent through an event.

  • image: text and isURL

  • isURL: true or false

Example:
{
            "id":"Tile17",
            "subView":[
              {
                "options":{
                  "key":{
                    "name":"{answer5}"
                    },
                  "list":[
                    {
                    "label":"00t1v44",
                    "img":{
                      "text":"00t1v43",
                      "isURL":false
                    }
                  },
                    {
                    "label":"00t1v45",
                    "img":{
                      "text":"00t1v48",
                      "isURL":false
                    }
                  },
                    {
                    "label":"00t1v46",
                    "img":{
                      "text":"00t1v49",
                      "isURL":false
                    }
                  },
                    {
                    "label":"00t1v47",
                    "img":{
                      "text":"00t1v50",
                      "isURL":false
                    }
                  }
                ]
              }
                    
                "img":{
                  "text":"00t1v35",
                  "isUrl":true
                }
              }
            ],
            "order":1
            "type":"CONTAINER",
            "uiAction":""
          }

Tile17a: Clickable Image Row

This tile represents clickable images in a single row. Clicking the image navigates the user to a target location.

Configurations
Preview
  • subtitle text: reference to the title that displays below the image

  • align: START, CENTER, or END

  • text color: hex value

  • border color: hex value

  • uiAction: for example, "action17a2"

Tile definition example:
{
                        "id": "Tile17a",
                        "subView": [
                            {
                                "options": {
                                    "list": [
                                        {
                                            "subTitle": {
                                                "text": "10tile17aiitextiizxq",
                                                "subtitleAlign": "CENTER",
                                                "colorCode": "#000080",
                                                "style": "REGULAR"
                                            },
                                            "img": {
                                                "text": "imageUrlo9w7y"
                                            },
                                            "uiAction": ""
                                        },
                                        {
                                            "subTitle": {
                                                "text": "9tile17aiitextii0ak",
                                                "subtitleAlign": "CENTER",
                                                "colorCode": "#000080",
                                                "style": "REGULAR"
                                            },
                                            "img": {
                                                "text": "imageUrlynopr"
                                            },
                                            "uiAction": "action17a2"
                                        },
                                        {
                                            "subTitle": {
                                                "text": "8tile17aiitextiimyk",
                                                "subtitleAlign": "END",
                                                "colorCode": "#000080",
                                                "style": "REGULAR"
                                            },
                                            "img": {
                                                "text": "imageUrlk6cem"
                                            },
                                            "uiAction": "action17a1"
                                        }
                                        
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#ffffff",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 5
                    }
cardUIAction example:
"action17a2": {
            "action": [
                {
                    "name": "Function.Navigate",
                    "cardId":"cd-vwgot7h4rlhwnzjf24aqa37ezz4"
                    
                }
            ]
        }

SmartTile1: Input Validation Tile

This tile is an input field that is used to implement checks, such as "field format" and "field value".

Configurations
Preview
  • title text

  • subtitle text

  • text color: hex value

  • font size: number value

  • border color: hex value

  • align: START, CENTER, END or JUSTIFY

  • hint: placeholder for text input

  • min and max length

  • fieldFormat: Any supported field format, such as "email".

  • validation: optional or required, and error message

Example:
                    {
                        "id": "SmartTile1",
                        "subView": [
                            {
                                "title": {
                                    "text": "2tile1iitextii5gb",
                                    "titleTextColor": "#000080",
                                    "titleAlign": "START",
                                    "fontSize": 16
                                },
                                "subTitle": {
                                    "text": "{$email}",
                                    "hint": "2tile1iihintiid8l",
                                    "subTitleTextColor": "#000080",
                                    "subTitleAlign": "START",
                                    "tip": "2tile2iitipii3m6",
                                    "fieldFormat": "email",
                                    "validation": [
                                        {
                                            "name": "REQUIRED_FIELD",
                                            "error": "2tile1iierrorii0uj"
                                        }
                                    ]
                                }
                            }
                        ],
                        "borderColor": "#C5C3C8",
                        "type": "CONTAINER",
                        "uiAction": "",
                        "order": 2
                    }

See configurations for .

Tile8