This code snippet shows the sample of a Gadget shipped with 12d Synergy - it provides the list of all upcoming tasks for the current job.

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Contracts;
 using Contracts.Data;
 using Contracts.Databases;
 namespace SynergyServer.Gadgets.Tasks
 {
     // Gadget to show all upcoming tasks in the current job
     public class JobUpcomingTasksGadget : SynergyServerScripting.Gadgets.Gadget
     {
         // constants for inputs
         private const string INPUT_TASK_STATUS = "Task status";
         private const string INPUT_RANGE = "Staring/ending date range";
         private const string INPUT_MY_TASKS_ONLY = "Limit to my tasks only";
         private const string INPUT_INCLUDE_SUB_JOBS = "Include sub jobs";
 
         // always use the max height of the gadget
         public override bool UseMaxHeight => true;
 
         // Cosmetic properties of the gadget
         public override string Name => "Upcoming Tasks - Current job";
         public override string Description => "Show a list of upcoming tasks for the current job.";
         public override string Category => "Tasks";
       
         public JobUpcomingTasksGadget() : base(Guid.Parse("{F5A38B49-CD5F-470B-B676-28DB488BBB59}"))
         {
         }
 
         // Generate the gadget
         public override bool Generate(EntityID project_id, Dictionary<string, ScriptInput> inputs, EntityID user_id, IDatabase db, out GadgetData data)
         {
             data = new GadgetData();
             DateTime start_time;
             DateTime end_time;
 
             // grab any date range inputs
             if (!inputs.ContainsKey(INPUT_RANGE)) return false;
             ((PrimitiveScriptInput)inputs[INPUT_RANGE]).GetDateRange(out start_time, out end_time);
 
             if (!inputs.ContainsKey(INPUT_INCLUDE_SUB_JOBS)) return false;
 
             // Get our Job information
             var project_info = SynergyServerScripting.Entities.Project.GetProjectInfo(project_id, false, db);
             bool include_sub_jobs = ((PrimitiveScriptInput) inputs[INPUT_INCLUDE_SUB_JOBS]).type_value == "Yes";
 
             // Build up a search query
             
             SearchQuery query = new SearchQuery();
             query.AddDomainValue(AttributeSearchContext.TaskAttribute, "Project", new QueryValueOperation(new ProjectQueryValue(project_info), AttributeMatchOperation.EqualTo));
             query.AddDomainValue(AttributeSearchContext.TaskAttribute, "IncludeSubProjects", new QueryValueOperation(new PrimitiveQueryValue(include_sub_jobs), AttributeMatchOperation.EqualTo));
             query.AddDomainValue(AttributeSearchContext.TaskAttribute, "IncludeNonMatchingSubTasks", new QueryValueOperation(new PrimitiveQueryValue(false), AttributeMatchOperation.EqualTo));
             query.AddDomainValue(AttributeSearchContext.TaskAttribute, "IsClosed", new QueryValueOperation(new PrimitiveQueryValue(false), AttributeMatchOperation.EqualTo));
           
             // Are we filtering by date on our start date, or our due date?
             if (((ListScriptInput) inputs[INPUT_TASK_STATUS]).current_value == "Starting tasks")
             {
                 query.AddDomainValue(AttributeSearchContext.TaskAttribute, "StartDate", new QueryValueOperation(new DateRangeQueryValue(start_time, end_time), AttributeMatchOperation.EqualTo));
             }
             else
             {
                 query.AddDomainValue(AttributeSearchContext.TaskAttribute, "DueDate", new QueryValueOperation(new DateRangeQueryValue(start_time, end_time), AttributeMatchOperation.EqualTo));
             }
 
             // Are we looking for my tasks only?
 
             if (((PrimitiveScriptInput) inputs[INPUT_MY_TASKS_ONLY]).type_value == "Yes")
             {
                 var contact = SynergyServerScripting.Entities.Contact.GetContactInfo(user_id, false, db);
                 query.AddDomainValue(AttributeSearchContext.TaskAttribute, "Assignee", new QueryValueOperation(new ContactQueryValue(contact), AttributeMatchOperation.EqualTo));
             }
 
             // Perform the task search
             List<TaskItem> tasks = SynergyServerScripting.Entities.TaskList.SearchTasks(query, user_id, db);
 
             // Use the results to build the table
             var table = new GadgetTable();
             table.AddColumn("Task Name", "TaskName");
             table.AddColumn("Assignee", "Assignee");
             table.AddColumn("Start Date", "StartDate");
             table.AddColumn("Due Date", "DueDate");
             foreach (TaskItem task in tasks)
             {
                 var row = table.NewRow();
                 row.Colour = System.Drawing.Color.FromArgb(task.colour);
                 row[table.GetColumnIndexByVariable("TaskName")] = task.name;
                 row[table.GetColumnIndexByVariable("Assignee")] = task.assigned_entity == null ? "" : task.assigned_entity.DisplayName;
                 row[table.GetColumnIndexByVariable("StartDate")] = task.start_date_utc == DateTime.MaxValue ? "Unknown" : task.start_date_utc.ToLocalTime().ToString("dd/MM/yyyy");
                 row[table.GetColumnIndexByVariable("DueDate")] = task.due_date_utc == DateTime.MaxValue ? "Unknown" : task.due_date_utc.ToLocalTime().ToString("dd/MM/yyyy");
                 table.AddRow(row);
             }
             table.Width = DefaultWidth;
             table.DefaultHeight = DefaultHeight;
             data.width = DefaultWidth;
             data.height = DefaultHeight;
             data.html = table.ToString();
 
             return true;
         }
 
         // Get all our inputs
         protected override List<ScriptInput> GetScriptInputs(IDatabase db)
         {
             return new List<ScriptInput>
             {
                 new ListScriptInput(INPUT_TASK_STATUS, "Show starting tasks or ending tasks.", false, new[] {"Staring tasks", "Ending tasks"}) {current_value = "Starting tasks"},
                 new PrimitiveScriptInput(INPUT_RANGE, "Filter tasks by starting/ending date range.", false, PrimitiveScriptInputType.DateRange) {type_value = "-0D;+2W"},
                 new PrimitiveScriptInput(INPUT_MY_TASKS_ONLY, "Whether or not to show my tasks only.", false, PrimitiveScriptInputType.YesNo) {type_value = "Yes"},
                 new PrimitiveScriptInput(INPUT_INCLUDE_SUB_JOBS, "Whether or not to search tasks in the sub jobs.", false, PrimitiveScriptInputType.YesNo) {type_value = "Yes"}
             };
         }
 
     }
 }
 					
This language is not supported or no code example is available.