doo.environment

Information about the Tabidoo environment.

currentApplication

 

Information about the current application. It contains the application ID, name, header, parameters, and information about the currently opened table.

doo.environment.currentApplication
 

const currentApplication = doo.environment.currentApplication;
console.log(currentApplication);

You can use it to get basic information about the current application.

Get the current application ID:

const appId = doo.environment.currentApplication.id;
console.log(appId); // "11111-0612-476b-b211-5512f49b1111"

Get the current application name:

const appName = doo.environment.currentApplication.name;
console.log(appName); // tabidoo

Get the current application header:

const appHeader = doo.environment.currentApplication.header;
console.log(appHeader); // "Tabidoo"

Get application parameters:

const params = doo.environment.currentApplication.params;
console.log(params); // {parameters: {name: "Test app",number: 1000}}

Get a specific application parameter:

const parameterName = doo.environment.currentApplication.params.parameters.name;
const parameterNumber = doo.environment.currentApplication.params.parameters.number;
console.log(parameterName); // "Test app"
console.log(parameterNumber); // 1000

The currentApplication object also contains information about the table that is currently opened in the application.

doo.environment.currentApplication.currentTable

 

const currentTable = doo.environment.currentApplication.currentTable;
console.log(currentTable);

You can use the current table to get its ID, name, header, currently selected records, and the current user data filter.

Get the current table ID:

const tableId = doo.environment.currentApplication.currentTable.id;
console.log(tableId); // "xxx39972-0762-4913-97cb-a93db2a2xxxx"

Get the current table name:

const tableName = doo.environment.currentApplication.currentTable.name;
console.log(tableName); // company

Get the current table header:

const tableHeader = doo.environment.currentApplication.currentTable.header;
console.log(tableHeader); // Company

On the currently opened table, you can get a list of currently selected records in the grid view or card view.

doo.environment.currentApplication.currentTable.selectedRecords

 

const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords;

console.log(selectedRecords); // [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",ver: 0,number: {value: 3000},date:value: "2026-06-17"}}]

Get the number of selected records:

const selectedRecords = doo.environment.currentApplication.currentTable.selectedRecords ?? [];

console.log(selectedRecords.length); // 1

You can also get the current user data filter from the currently opened table.

doo.environment.currentApplication.currentTable.dataConditions

 

const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

console.log(dataConditions); // {filter: [{field: "number",operator: "gt",value: "1000",values: null}],filterOperator: "and",fullText: undefined}

The current user data filter can be used to retrieve filtered table data using methods such as doo.table.getData, doo.table.getCount, doo.table.getDataSummary, and other methods supporting data conditions.

Get the number of records matching the current user data filter:

const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const count = await doo.table.getCount(tableId, dataConditions);

console.log(count); // {data: {count: 2}}

Get only the count value:

const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const count = await doo.table.getCount(tableId, dataConditions);

console.log(count.data.count); // 2

Get records matching the current user data filter:

const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const records = await doo.table.getData(tableId, {
  filter: dataConditions
});

console.log(records); // {data: [{id: "xxx670b8-1480-4340-9551-05b72bfb9xxx",created: "2026-06-01T06:51:12.878Z",modified: "2026-06-01T06:51:12.878Z",ver: 0,fields: {number: 3000,date: "2026-06-17"}}

Get only returned records:

const tableId = doo.environment.currentApplication.currentTable.id;
const dataConditions = doo.environment.currentApplication.currentTable.dataConditions;

const records = await doo.table.getData(tableId, {
  filter: dataConditions
});

console.log(records.data);

isPublicDashboard

The Tabidoo app can publish a dashboard without the need to log in. For example, to a company website. With this property, you can easily detect this state and modify the behavior in the code.


isPublicForm

The Tabidoo app can also use a public form to collect data. Without the need to log in. For example, from a public company website. With this property, you can easily detect this state and modify the behavior on the form.


queryParam

If the public form was run with parameters in the query string, here are their keys and values.


isServer

Whether the JavaScript code is running on the client side or on the server side.


getCurrentUserTechnicalLimits

 

await doo.environment.getCurrentUserTechnicalLimits();

returns information about the technical limits that the current user (as the application owner) has consumed.

  • Limits that have not been touched are not included in the response list.
  • For example, if no workflow has run on a given day, workflow-related limits will not appear.
  • If a limit is reported as 0, it is currently not actively enforced β€” the value is only logged and may be evaluated in the future.

Example Response

 

[
  {
    "value": 61183,
    "limit": 1800000,
    "type": "workflowRunsMs",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "milliseconds"
  },
  {
    "value": 876,
    "limit": 10000,
    "type": "getDataResponseCharsMB",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "count"
  },
  {
    "value": 122077,
    "limit": 0,
    "type": "getDataResponseElapsedMs",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "milliseconds"
  },
  {
    "value": 27,
    "limit": 10000,
    "type": "workflowRunsCount",
    "userLimitTimeUnit": "day",
    "userLimitValueUnit": "count"
  } ] 

Field Descriptions

  • value – the current consumption for the given metric.
  • limit – the allowed maximum for that metric. (0 = not enforced, only tracked).
  • type – the type of operation being measured (e.g., workflowRunsMs, workflowRunsCount, getDataResponseElapsedMs).
  • userLimitTimeUnit – the time window for the limit (e.g., day, hour).
  • userLimitValueUnit – the unit of measurement (e.g., milliseconds, count).
     

Possible Limit Types

The method may return different types of limits depending on what features are used.
Each limit can be tracked in different time windows – most commonly daily and hourly, in some cases even per minute.

Workflow

  • workflowRunsMs – total workflow execution time (milliseconds).
  • workflowRunsCount – number of workflow executions.

API / Data

  • getDataResponseCharsMB – total size of data returned by getData requests (megabytes).
  • getDataResponseElapsedMs – total response time for getData requests (milliseconds).
  • getAttachmentResponseCharsMB – total size of attachments returned by API requests (megabytes).

Email

  • emailsPerRecipientCount – number of emails sent per recipient.

The same limit type may appear multiple times with different time windows (e.g. day, hour, or minute).


Example Use Cases

  • Quick Inspection
    Run the method directly in any script to see the current usage values.
  • Daily Logging
    Create a workflow that calls this method every hour and stores results in a table.
    This allows you to build graphs, alerts, or daily summaries.
  • Logging on Workflow Completion
    After a workflow finishes, log the values together with metadata (e.g., which workflow has completed).
  • Alerting on Threshold Breach
    Build a workflow that checks limits hourly.
    If consumption is close to the threshold (e.g., 80%), send yourself an email alert.
    This gives you time to upgrade your Tabidoo plan before limits are exceeded.