<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Scripting on Timill Platform Documentation</title><link>https://docs.timill.com/scripting/</link><description>Recent content in Scripting on Timill Platform Documentation</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://docs.timill.com/scripting/index.xml" rel="self" type="application/rss+xml"/><item><title>Backend Scripts</title><link>https://docs.timill.com/scripting/backend-scripts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.timill.com/scripting/backend-scripts/</guid><description>&lt;p&gt;Create server-side automation scripts triggered by events, schedules, or manual execution. Supports two languages: JavaScript (Goja) and Gonja (Jinja2-style templates).&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;a class="heading-anchor" href="#getting-started" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="creating-a-script"&gt;Creating a Script&lt;a class="heading-anchor" href="#creating-a-script" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Group Settings → Backend Scripts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;New Script&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose a language: JavaScript or Gonja&lt;/li&gt;
&lt;li&gt;Write your script code&lt;/li&gt;
&lt;li&gt;Set the trigger type and schedule&lt;/li&gt;
&lt;li&gt;Save and test&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="script-structure"&gt;Script Structure&lt;a class="heading-anchor" href="#script-structure" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="javascript-example"&gt;JavaScript Example&lt;a class="heading-anchor" href="#javascript-example" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Get the current item
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Update the status
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SetStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;approved&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Add a comment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AddComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Automatically approved by backend script&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Send a notification
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Item &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; has been approved&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="gonja-jinja2-example"&gt;Gonja (Jinja2) Example&lt;a class="heading-anchor" href="#gonja-jinja2-example" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-jinja2" data-lang="jinja2"&gt;{# Update item status #}
{% set item = item %}
{{ item.SetStatus(&amp;#34;completed&amp;#34;) }}
{{ item.Save() }}

{# Log the change #}
{{ log(&amp;#34;Item &amp;#34; ~ item.Title() ~ &amp;#34; completed&amp;#34;) }}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="trigger-types"&gt;Trigger Types&lt;a class="heading-anchor" href="#trigger-types" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
					&lt;th&gt;Configuration&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Manual&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Execute on demand from UI&lt;/td&gt;
					&lt;td&gt;None&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Schedule&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Run on cron schedule&lt;/td&gt;
					&lt;td&gt;Cron expression (e.g., &lt;code&gt;0 9 * * *&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Event&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Fire on specific events&lt;/td&gt;
					&lt;td&gt;Event type + optional conditions&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Save Hook&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Run after every item save&lt;/td&gt;
					&lt;td&gt;Optional field conditions&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="available-events"&gt;Available Events&lt;a class="heading-anchor" href="#available-events" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Event&lt;/th&gt;
					&lt;th&gt;Trigger&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CREATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item is created&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;UPDATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item is updated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item is deleted&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;STATUS_CHANGE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item status changes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;FIELD_UPDATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Specific field is updated&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ASSIGN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item is assigned/unassigned&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;COMMENT_CREATE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Comment is added&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="language-features"&gt;Language Features&lt;a class="heading-anchor" href="#language-features" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="javascript-goja-es51"&gt;JavaScript (Goja ES5.1)&lt;a class="heading-anchor" href="#javascript-goja-es51" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Complex logic, external API calls, data transformations&lt;/p&gt;</description></item><item><title>Scripted Widgets</title><link>https://docs.timill.com/scripting/scripted-widgets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.timill.com/scripting/scripted-widgets/</guid><description>&lt;p&gt;Create custom HTML widgets using Go&amp;rsquo;s &lt;code&gt;html/template&lt;/code&gt; syntax with built-in query helpers and automatic RBAC enforcement. Widgets are rendered server-side and integrated into pages and dashboards.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;a class="heading-anchor" href="#getting-started" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="creating-a-widget"&gt;Creating a Widget&lt;a class="heading-anchor" href="#creating-a-widget" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to any page or dashboard&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Widget&lt;/strong&gt; → &lt;strong&gt;Scripted Widget&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter a name and description&lt;/li&gt;
&lt;li&gt;Write your Go template code&lt;/li&gt;
&lt;li&gt;Save and preview&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="widget-structure"&gt;Widget Structure&lt;a class="heading-anchor" href="#widget-structure" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Every scripted widget consists of:&lt;/p&gt;</description></item><item><title>Scripted Charts</title><link>https://docs.timill.com/scripting/scripted-charts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.timill.com/scripting/scripted-charts/</guid><description>&lt;p&gt;Create dynamic data visualizations using JavaScript with &lt;a href="https://echarts.apache.org/" rel="noopener noreferrer"&gt;Apache ECharts&lt;/a&gt;. Charts run in both the browser and backend (Goja VM) with full RBAC enforcement.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;a class="heading-anchor" href="#getting-started" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="creating-a-chart"&gt;Creating a Chart&lt;a class="heading-anchor" href="#creating-a-chart" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Navigate to any page or dashboard&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Widget&lt;/strong&gt; → &lt;strong&gt;Scripted Chart&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter a name and description&lt;/li&gt;
&lt;li&gt;Write your JavaScript code&lt;/li&gt;
&lt;li&gt;Save and preview&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="chart-structure"&gt;Chart Structure&lt;a class="heading-anchor" href="#chart-structure" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Every chart script follows this pattern:&lt;/p&gt;</description></item><item><title>Scripting API Reference</title><link>https://docs.timill.com/scripting/api-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.timill.com/scripting/api-reference/</guid><description>&lt;p&gt;Complete JavaScript (Goja ES5.1) scripting API for backend scripts, widget scripts, and chart scripts.&lt;/p&gt;
&lt;h2 id="global-variables"&gt;Global Variables&lt;a class="heading-anchor" href="#global-variables" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Variable&lt;/th&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;userId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Current user ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;groupId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Group ID (if group-scoped)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;instanceId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Instance ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;scriptId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Current script ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;scriptType&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;backend&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;widget&amp;quot;&lt;/code&gt;, or &lt;code&gt;&amp;quot;chart&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;itemId&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Item ID (if item-scoped)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;isGroupScoped&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;True if script runs in a group context&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;isInstanceScoped&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;True if script runs at instance level&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;isItemScoped&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;True if script runs on a specific item&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="user-object"&gt;&lt;code&gt;user&lt;/code&gt; Object&lt;a class="heading-anchor" href="#user-object" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Available in all script types. Backend scripts get read-write access.&lt;/p&gt;</description></item></channel></rss>