JS SDK

JS SDK

Prerequisite

Include the JS https://js.zohocdn.com/projects/js/client_sdk.min.js in your code before calling the following SDK methods.
Include the CSS https://css.zohocdn.com/projects/styles/zps-extn/client_sdk.css in your code to use Zoho Projects style.

init

Initializes the extension.


zohoprojects.init().then(function(){});
 
Invoking this method at the beginning is necessary since the other SDK methods will work only after its invocation. While init is loading if you want to use other functions you can use it within the init function.


zohoprojects.init().then(function () {
      zohoprojects.get("portal.name").then(function (response)
      });

metadata

Fetches the payment and configuration details of an extension.

zohoprojects.metadata().then(function(response)
{
      /* output
  {
      "data": {
       "configs": [
{
"name": "Name",
"type": "text",
"is_mandatory": true,
"is_secure": false,
"description": "Enter your name",
"value": "Helen Collins"
},
{
"name": "Employee ID",
"type": "text",
"is_mandatory": true,
"is_secure": false,
"description": "Enter your Emp. ID",
"value": "EMP08"
}
],
"payments_info": {
"edition": "trial"
},
"status": "success"
}
}
*/
});

context

Fetches the module name and entity ID of the current location. The module name is 'tasks' or 'issues' and the entity ID is the ID of the respective task or issue.


zohoprojects.context().then(function(response)
{
/* output
{
"module_name": "tasks",
"entity_id": "27092000000031079"
}
*/
});

Notes We do not give the entity ID for the widget location 'app_settings', 'attachment_picker', 'blueprint_during' and 'top_band' locations.

get

Fetches the details of the instances, current user, portal, project, tasks, and issues of the current location.


zohoprojects.get("task.id

").then(function(response)
{
/* output
{
"data": 27092000000031080,
"status": "success"
}
*/
});
The following are the list of keys that can be used in the get method:

Instances

  • instances

Current user

  • current_user

Portal

  1. portal.trial_enabled
  2. portal.settings
  3. portal.gmt_time_zone
  4. portal.project_count
  5. portal.role
  6. portal.avail_user_count
  7. portal.locale
  8. portal.project_prefix
  9. portal.available_projects
  10. portal.max_user_count
  11. portal.profile_id
  12. portal.name
  13. portal.id_string
  14. portal.bug_plural
  15. portal.plan
  16. portal.bug_plan
  17. portal.bug_singular
 portal.default
  18. portal.extensions
  19. portal.is_crm_partner
  20. portal.is_display_projectprefix
  21. portal.is_display_taskprefix
  22. portal.is_new_plan
  23. portal.layouts
  24. portal.link

Project

  1. project.is_strict
  2. project.role
  3. project.bug_count
  4. project.owner_id
  5. project.taskbug_prefix
  6. project.link
  7. project.description
  8. project.milestone_count
  9. project.updated_date_long
  10. project.task_count
  11. project.updated_date_format
  12. project.workspace_id
  13. project.billing_status
  14. project.key
  15. project.is_chat_enabled
  16. project.owner_name
  17. project.profile_id
  18. project.enabled_tabs
  19. project.name
  20. project.is_public
  21. project.layout_details
  22. project.status
  23. project.permissions
  24. project.IS_BUG_ENABLED
  25. project.bug_defaultview

  26. project.bug_prefix
  27. project.cascade_setting
  28. project.completed_on
  29. project.completed_on_long
  30. project.created_date
  31. project.created_date_format
  32. project.created_date_long

  33. project.custom_status_id
  34. 
project.id_string
  35. project.show_project_overview

  36. project.start_date

  37. project.start_date_long
  38. project.updated_date

  39. project.users
  40. project.customfields
  41. project.custom_fields

Task

  1. task.name
  2. task.completed
  3. task.created_by
  4. task.priority
  5. task.percent_complete
  6. task.start_date
  7. task.end_date
  8. task.dependency
  9. task.duration
  10. task.details
  11. task.link
  12. task.created_person
  13. task.created_time
  14. task.created_time_format
  15. task.created_time_long

  16. task.custom_fields
  17. task.depth (applicable for subtasks only)
  18. task.duration_type

  19. task.id_string
  20. task.is_comment_added

  21. task.is_forum_associated

  22. task.is_recurrence_set

  23. task.is_reminder_set
  24. task.isparent
task.key

  25. task.last_updated_time
  26. task.last_updated_time_format

  27. task.last_updated_time_long
  28. task.milestone_id

  29. task.order_sequence
  30. task.parent_task_id (applicable for subtasks only)
  31. task.parenttask_id (applicable for subtasks only)
  32. task.root_task_id (applicable for subtasks only)
  33. task.status
  34. task.task_followers
  35. task.tasklist
  36. task.work
task.work_type
  37. task.comments
  38. task.subtasks

  39. task.customfields
  40. task.attachments

Issue

  1. issue.module
  2. issue.created_time_long
  3. issue.customfields
  4. issue.status
  5. issue.reproducible
  6. issue.link
  7. issue.severity
  8. issue.reported_person
  9. issue.title
  10. issue.flag
  11. issue.assignee_name
  12. issue.reporter_id
  13. issue.classification
  14. issue.created_time_format
  15. issue.closed
  16. issue.created_time
  17. issue.key
  18. issue.attachment_count
  19. 
issue.bug_number
  20. 
issue.bug_prefix

  21. issue.comment_count
  22. 
issue.escalation_level
  23. 
issue.id_string

  24. issue.reporter_email
  25. 
issue.reporter_non_zuser
  26. 
issue.updated_time
  27. 
issue.updated_time_format
  28. 
issue.updated_time_long
  29. issue.attachments
  30. issue.comments
  31. issue.views

Milestone

  1. milestone.closed
  2. milestone.comments_count
  3. milestone.created_time
  4. milestone.created_time_format
  5. milestone.created_time_long
  6. milestone.end_date
  7. milestone.end_date_format
  8. milestone.end_date_long
  9. milestone.flag
  10. milestone.has_comments
  11. milestone.id
  12. milestone.id_string
  13. milestone.is_workfield_removed
  14. milestone.last_updated_time
  15. milestone.last_updated_time_format
  16. milestone.last_updated_time_long
  17. milestone.link
  18. milestone.name
  19. milestone.owner_id
  20. milestone.owner_name
  21. milestone.owner_zpuid
  22. milestone.project
  23. milestone.sequence
  24. milestone.start_date
  25. milestone.start_date_format
  26. milestone.start_date_long
  27. milestone.status
  28. milestone.status_det

Chosen files

A file that is in queue to be uploaded is stored in chosen_files.This key is supported only for attachment picker.
  • chosen_files

Deployment type

Get current data center.

zohoprojects.get("deployment_type").then(function() {
/* output
com
*/
});

Profile

We support a couple of keys that fetch all the profiles at the portal level and the profile details of the current user respectively.
  1. all_profiles: Fetches the information of all the profiles in a portal.
  2. current_profile: Fetches the profile details of the current user.

Theme

Zoho Projects supports themes for your portal.
  • current_theme: Fetches the current theme.
zohoprojects.get("current_theme").then(function() {
/* output
{mode: "default", zpPrimary: "255, 100, 0", zpPrimaryHover: "255, 247, 243"}
*/
});

Blueprint During

  • blueprint_during: fetches the value set for the During action
zohoprojects.get("blueprint_during").then(function(res) {
/* output
[ {field_id: "UDF_CHAR1", is_visible: true, is_pii: false, is_encrypted: false}
{field_id: "UDF_CHAR2", is_visible: true, is_pii: false, is_encrypted: false}]
*/
});

Transition

Fetch the details of the current transition.
  1. transition: Fetches the ID and name of the current transition. 
  2. blueprint : Fetches the blueprint ID and name.

set

Updates the attributes of a specific task or an issue of the current location.


var nameObj={name:"Create a new checklist"};
zohoprojects.set("task",nameObj).then(function(response)
{
/* output
{
"data": {
"tasks": [
{
"milestone_id": "2*******************2",
"link": {
"timesheet": {
"url": "https://p*************e.********.com/restapi/portal/5******7/projects/2****************9/tasks/2****************9/logs/"
},
"self": {
"url": "https://p*************e.********.com/restapi/portal/5******7/projects/2****************9/tasks/2****************9/"
}
},
"description": "",
"duration": "0",
"last_updated_time_long": 1542193097398,
"details": {
"owners": [
{
"name": "JOHN MARSH",
"id": "5************3"
}
]
},
"id": 2************0,
"key": "WEUT-T1",
"created_person": "Steve Banks",
"created_time_long": 1525668983347,
"created_time": "05-07-2018",
"is_reminder_set": false,
"is_recurrence_set": false,
"created_time_format": "05-07-2018 10:26:23 AM",
"subtasks": false,
"work": "0:00",
"custom_fields": [
{
"column_name": "UDF_LONG1",
"label_name": "Expense Amount",
"value": "24573"
},
{
"column_name": "UDF_LONG3",
"label_name": "sample",
"value": "0"
},
{
"column_name": "UDF_LONG2",
"label_name": "test",
"value": "200"
}
],
"isparent": false,
"work_type": "work_hrs_per_day",
"completed": false,
"priority": "None",
"created_by": "5******3",
"percent_complete": "0",
"last_updated_time": "11-14-2018",
"name": "Create a new checklist",
"id_string": "2************9",
="last_updated_time_format": "11-14-2018 04:28:17 PM",
"tasklist": {
"name": "General",
"id": "2************7"
},
"order_sequence": 1,
"status": {
"name": "Open",
"id": "2************1",
"type": "open",
"color_code": ""
}
}
]
},
"status": "success"
}
*/
});
The following keys can be used in the set method for tasks:

Tasks

  1. person_responsible
  2. owner_work
  3. work_type
  4. name
  5. start_date
  6. end_date
  7. start_time
  8. end_time
  9. percent_complete
  10. duration
  11. duration_type
  12. reminder
  13. priority
  14. description
  15. custom_fields (This key can be used only to create a custom field.)
  16. clear_date
  17. index
  18. range
  19. json_string
  20. subtasks (This key can be used only to create a subtask. Click here to know the params for subtasks.)
The following keys can be used in the set method for issues:

Issues

  1. title
  2. description
  3. assignee
  4. flag
  5. classification_id
  6. milestone_id
  7. due_date
  8. module_id
  9. severity_id
  10. reproducible_id
  11. status_id
  12. resolution
  13. affectedmile_id
The following keys can be used in the set method to update project:

Projects

  1. name
  2. description
  3. status
  4. start_date
  5. end_date
  6. strict_project
  7. public
  8. group_id
  9. completed_on
  10. UDF_CHAR([1-9]|[1-2][0-9]|30). Example: UDF_CHAR1
  11. UDF_TEXT([1-9]|1[0-5])
  12. UDF_LONG([1-9]|1[0-5])
  13. UDF_USER[1-5]
  14. UDF_DOUBLE([1-9]|[1-2][0-9]|3[0-5])
  15. UDF_DATE[1-5]
  16. UDF_ENCRYPT([1-9]|10)
  17. owner
  18. billing_method
  19. bill_status
  20. show_project_overview
  21. custom_status
The following keys can be used in the set method to update milestone:

Milestone

  1. name
  2. start_date
  3. end_date
  4. owner
  5. flag
  6. budget
  7. threshold
  8. revenue_budge
Use linkfiles key to associate files to your location. This key supports the following locations: Task details tabIssue details tabAttachment picker. It must be an array of maximum size 10 and the following fields are mandatory: id, name, type, permanent_url, download_url, size, created_by, created_time; preview_url is mandatory for image files.
  • linkfiles

linkfiles=[{
"created_time": 1561028014712,
"id": "1LavBS5sauJ-AAFJZWp8Ch9Cp2ehydahk",
"type": "image/jpeg",
"created_by": "Patricia Boyle",
"permanent_url": "https://***************",
"size": 7409,
"preview_url": "https://******************",
"name": "sample-image.jpeg",
"download_url": "https://drive.google.com/a/web-mailhosting.com/uc?id=1LavBS5sauJ-AAFJZWp8Ch9Cp2ehydahk&export=download",
}]
zohoprojects.set('linkfiles', linkFiles).then(function (response) {
zohoprojects.invoke('attachment_picker.close');
});

Blueprint During

Set the value when configuring the During action for a blueprint transition.

var sample = [ {field_id: "UDF_CHAR1", is_visible: true, is_pii: false, is_encrypted: false}
{field_id: "UDF_CHAR2", is_visible: true, is_pii: false, is_encrypted: false}];
zohoprojects.set("blueprint_during", sample).then(function(res) {
/* output
[ {field_id: "UDF_CHAR1", is_visible: true, is_pii: false, is_encrypted: false}
{field_id: "UDF_CHAR2", is_visible: true, is_pii: false, is_encrypted: false}]
*/
});


Export location

Exports your tasks to cloud storage services. You can select a maximum of five data fields to be displayed in the export details pop-up. If a link parameter is added to the display data, the chosen location will be hyperlinked for easy access.  


let paramObj = {
"custom_data": {
"path": "G/pics",
"portal_id": "89031033",
"project_id": "185977000000199005"
},
"display_data" : [
{
"name": "Path",
"value": "G's Drive",
"link": "https://drive.google.com/drive/folders/1e1xWqREV"
}, {
"name": "App Name",
"value": "G- Drive"
}
]
      
zohoprojects.set('execute', paramObj);

request

Invokes a third-party URL from your extension using the connection defined in the plugin-manifest.json file. If the connection link name is not specified then the response is provided based on the inputs.


var file = document.getElementById("inputbox").files[0];
var file_detail = {
type: "GET",
files: [{
uploaddoc : file
type : "binary" //If the file is uploaded as binary
}],
parameters: {
fields: "id,name, thumbnailLink, webViewLink, webContentLink"
}
};
var url = "https://www.googleapis.com/drive/v3/files/1-QabBt69U8myXYRDVU-1YiCo2k-JWRfu";
zohoprojects.request(url, file_detail, "google_drive").then(function (response)
/* Output
{
"result": {
"webContentLink": "https://drive.google.com/uc?id=1-QabBt69U8myXYRDVU-1YiCo2k-JWRfu&export=download",
"name": "Eiffel_Tower_01.jpg",
"webViewLink": "https://drive.google.com/file/d/1-QabBt69U8myXYRDVU-1YiCo2k-JWRfu/view?usp=drivesdk",
"id": "1-QabBt69U8myXYRDVU-1YiCo2k-JWRfu",
"thumbnailLink": "https://lh3.googleusercontent.com/nhyq9mHrGDOZfNdQUHRj_xVlOoNAP5PEYkW4X2svGXKjVt53MvMGfjhQ2PlTv4cmv5-PgbjrR-c=s220"
},
"status": "success"
}
*/});
Argument name Data type Description
URL string The third-party URL that has to be invoked from your extension.
object JSONObject Key Data type Value
    type string "GET" / "POST" / "PUT" / "DELETE" / "PATCH"
    parameters JSONObject The request params of the API.
    headers JSONObject The headers of the API.
    body JSONObject

The body of the API.

 

    files JSONArray

The parameters for uploading a file.

Value: the actual file.

*The body will be ignored if actual file is uploaded

*If you mention the type as binary, the file will sent as binary. The body of the file will also be considered

    replace_secure_config Boolean

If the is_secure parameter in the plugin-manifest.json file is true, set the value of this param to true. 

You can pass the values in the URL and object parameter in this format - {{name}} //name of the configuration

Zoho Projects will replace the configuration value
Note: The default value is false.

connection_link_name string The connection link name generated from the zapps website. You can get the connection link name from plugin-manifest

Execute function 

Executes a custom function in Sigma without trigger. Function_uuid and its version is mandatory to execute the function.
 
let customData = {"name":"Create a new checklist"};
zohoprojects.function.execute("c8a9e660-95e2-11ef-9d3c-2d653cc724d7", "1.0", customData).then(function(response){
/* output
{       "result":{"output":"{}","Tasks":[],"outputType":"void","message":{}},
  "unique_id":"c8a9e660-95e2-11ef-9d3c-2d653cc724d7",
  "code":3009,
  "function_id":1234567890,
  "message":"Function Executed Successfully",
  "status":"Success"
}
*/
});     

Notes
To retrieve the custom data, use the syntax below:
metaData =  data.getJSON("parameters").getJSON("metadata").toMap();
payload = metaData.getJSON("custom_data");

Color System (CSS Variables)  

This section defines the theme color variables used across the application.

All colors are:

  • Defined using CSS variables (--zp*)

  • Consumed via rgb(var(--variable))

  • Designed to support Day Mode and Dark Mode

 Usage Pattern   

color: rgb(var(--zpOnData));
background-color: rgb(var(--zpSurface));
border-color: rgb(var(--zpFormElementBdr));

 

 Theme Modes   

  • Day Mode: Light UI with dark text

  • Dark Mode: Dark UI with light text

 

Colour Tokens are listed below

 

Css Variable name

Day Mode
in rgb()

Dark Mode
in rgb()

1

--zpPrimary

255, 100, 0

2

--zpPrimaryHover

255, 247, 243

40, 40, 40 !important

3

--zpOnPrimary

255, 255, 255

4

--zpBackground

255, 255, 255

0, 0, 0

5

--zpOnBackground

0, 0, 0

97, 97, 97

6

--zpSurface

255, 255, 255

0, 0, 0

7

--zpOnSurface

0, 0, 0

185, 185, 185

8

--zpSurfaceBdr

230, 230, 230

18, 18, 18

9

--zpSecondary

250, 250, 250

13, 13, 13

10

--zpOnSecondary

70, 70, 70

158, 158, 158

11

--zpSecondaryBdr

235, 235, 235

46, 46, 46

12

--zpData

255, 255, 255

18, 18, 18

13

--zpOnData

32, 33, 35

187, 187, 187

14

--zpOnDataLight

85, 85, 85

102, 102, 102

15

--zpPopupBase

255, 255, 255

30, 30, 30

16

--zpShadow

0, 0, 0

0, 0, 0

17

--zpBorderGrey

0, 0, 0

225, 225, 225

18

--zpMLTGroup

248, 248, 248

25, 25, 25

19

--zpOnMLTHeader

167, 169, 172

102, 102, 102

20

--zpOnMLTHeaderBdr

242, 242, 242

40, 40, 40

21

--zpFormElement

255, 255, 255

8, 8, 8

22

--zpFormElementBdr

232, 238, 244

23

--zpMandatory

255, 247, 247

39, 7, 7

24

--zpMandatoryBdr

119, 28, 33

25

--zpFreeze

50, 50, 50, .82

50, 50, 50, .82

26

--zpDisabled

241, 241, 241

62, 62, 62

27

--zpOnDisabled

142, 142, 142

152, 152, 152

28

--zpTooltip

0, 0, 0

222, 222, 222

29

--zpOnTooltip

242, 242, 242

0, 0, 0

30

--zpProgressGreen

135, 211, 124

108, 156, 101

31

--zpBlackOpac

0,0,0

255, 255, 255

32

--zpBulkUpdate

40, 40, 40

33

--zpDropDownShadow

-2px 0 15px rgba(0, 0, 0, .41)

 

Colour  Token Categories   

  • Primary Colours   (Used for:  Buttons, Active states, Highlights )

    • --zpPrimary

    • --zpPrimaryHover

    • --zpOnPrimary

  • Surface & Background (Used for: Page background, Cards, Containers)

    • --zpBackground

    • --zpSurface

    • --zpSecondary

  • Text Colours (Used for: Labels, Input text, Secondary text)

    • --zpOnData

    • --zpOnSurface

    • --zpOnSecondary

    • --zpOnDataLight

  • Form Elements (Used for: Inputs, Selects, Validation states)

    • --zpFormElement

    • --zpFormElementBdr

    • --zpMandatory

    • --zpMandatoryBdr

  • State Colours

    • --zpDisabled

    • --zpOnDisabled

    • --zpMandatory

    • --zpProgressGreen

  • Overlays & Effects

    • --zpPopupBase

    • --zpShadow

    • --zpDropDownShadow

    • --zpFreeze

Form UI CSS

  • Consistent UI/UX across all form components

  • Theme-based styling using CSS variables

  • Support for accessibility and multiple states

Supported Components  

Input Fields  

  • Text (text)

  • Email (email)

  • Password (password)

  • Search (search)

  • Number (number)

Other Elements  

  • <select> (native & custom)

  • <textarea>

  • Select2 dropdowns

  • Custom Checkbox (.c-checkbox)

  • Custom Radio (.cradio)

 

States & Behavior  

Hover:       Border color changes to light primary

Focus:       Stronger border highlight, Outline applied

Mandatory / Invalid  

Usage:            <input type="text" mandatory="yes">

Behavi our:    Highlighted border (--zpMandatoryBdr), Light background tint

Disabled  

Usage:            <input type="text" disabled>

Behavior:    Grey background, Muted text color, cursor: not-allowed

Readonly

Usage :    <input type="text" readonly>

Behavior:       Non-editable, Default cursor

Placeholder Styling  

::placeholder {
  color: rgba(var(--zpOnDataLight), 0.5);
}

Custom Select (.select-style)  

Usage  

<div class="select-style">
  <select>
    <option>Option 1</option>
  </select>
</div>

Features  

  • Custom dropdown arrow

  • Removes native browser styling

  • Fully responsive

 

Checkbox Component (.c-checkbox)  

Usage  

<div class="c-checkbox">
  <input type="checkbox" id="chk1">
  <label for="chk1">Option</label>
</div>

Features  

  • Custom UI rendering

  • Supports:

    • Checked / Unchecked

    • Indeterminate

    • Disabled

    • Error state

Indeterminate Example  

<div class="c-checkbox">
  <input type="checkbox" id="indChk">
  <label for="indChk">Partially Selected</label>
</div>

<script>
  document.getElementById("indChk").indeterminate = true;
</script>

Notes  : It cannot be set via HTML, Must be set using JavaScript

 

Radio Component (.cradio)  

Usage  

<div class="cradio">
  <input type="radio" id="r1" name="group">
  <label for="r1">Option</label>
</div>

Features  

  • Custom circular UI

  • Smooth selection animation

  • Disabled state support

 Disabled State Examples  

Input  

<input type="text" value="Disabled Input" disabled>

Select  

<div class="select-style">
  <select disabled>
    <option>Disabled Select</option>
  </select>
</div>

Textarea  

<textarea disabled>Disabled textarea</textarea>

Checkbox  

<div class="c-checkbox">
  <input type="checkbox" id="chk-disabled" disabled>
  <label for="chk-disabled">Disabled Checkbox</label>
</div>

Radio  

<div class="cradio">
  <input type="radio" id="r-disabled" name="group" disabled>
  <label for="r-disabled">Disabled Radio</label>
</div>

Checked + Disabled  

<div class="c-checkbox">
  <input type="checkbox" id="chk2" checked disabled>
  <label for="chk2">Checked & Disabled</label>
</div>

 

Utility Classes  

Class

Purpose

.formfield-style

Wrapper for consistent field height

.disabled-element

Apply disabled styling manually

RTL (Right-to-Left Language) Support  

Supports right-to-left layouts:

<body dir="rtl">

Select2 Integration  

Supported classes:

  • .select2-container

  • .select2-choice

  • .select2-choices

Full Example  


<form>
  <input type="text" placeholder="Name" mandatory="yes">

  <div class="select-style">
    <select>
      <option>Select Country</option>
    </select>
  </div>

  <textarea placeholder="Message"></textarea>

  <div class="c-checkbox">
    <input type="checkbox" id="agree">
    <label for="agree">Agree</label>
  </div>

  <div class="cradio">
    <input type="radio" id="r1" name="g">
    <label for="r1">Option 1</label>
  </div>
</form>