update
All checks were successful
Deploy Static Site / deploy (push) Successful in 6m6s

This commit is contained in:
2025-05-29 16:42:45 +04:00
parent e217f89702
commit 00717a92fb
2681 changed files with 173810 additions and 0 deletions

View File

@ -0,0 +1,270 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Scripts in widgets</title>
<meta name="generator" content="Help+Manual" />
<meta name="keywords" content="" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="You can make widgets on pages interactive by using scripts." />
<meta name="picture" content="" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Full documentation for BRIX365 platform. Low-code developer guide. User guide. Admin guide. Developer guide." />
<meta property="og:url" content="https://brix365.com/en/help" />
<meta property="og:image" content="" />
<link rel="icon" href="favicon.png" type="image/png" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./jquery-ui.min.css" />
<link rel="stylesheet" href="default.css" />
<link rel="stylesheet" href="./search-yandex.css" />
<link rel="stylesheet" href="./article.css" />
<link rel="stylesheet" href="./glossary.css" />
<link rel="stylesheet" href="./theme.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="helpman_settings.js"></script>
<script type="text/javascript" src="helpman_topicinit.js"></script>
<script type="text/javascript" src="highlight.js"></script>
<script type="text/javascript">
$(document).ready(function(){highlight();});
</script>
</head>
<body>
<script>!function(e,t,c,n,r,a,m){e.ym=e.ym||function(){(e.ym.a=e.ym.a||[]).push(arguments)},e.ym.l=1*new Date;for(var s=0;s<document.scripts.length;s++)if(document.scripts[s].src===n)return;a=t.createElement(c),m=t.getElementsByTagName(c)[0],a.async=1,a.src=n,m.parentNode.insertBefore(a,m)}(window,document,"script","https://mc.yandex.ru/metrika/tag.js"),ym(83179930,"init",{clickmap:!0,trackLinks:!0,accurateTrackBounce:!0,webvisor:!0})</script><noscript><div><img alt=""src=https://mc.yandex.ru/watch/83179930 style=position:absolute;left:-9999px></div></noscript>
<header class="header elma-365">
<div class="container">
<a class="header__logo" href="https://brix365.com/en/help">
<img src="./logo-en.svg" alt="header logo">
</a>
<!-- <div class="hero__search-form" id="search-panel">
<form class="search-form" onsubmit="ym(83180416,'reachGoal','poisk')">
<label class="search-form__label">
<span id="reset-search" class="search__icon"></span>
<input class="search-form__input" type="text">
</label>
<input class="search-form__submit" type="submit" value="Submit">
</form>
</div> -->
<div class="hero__search-form" id="search-panel"> <form class="search-form"> <label class="search-form__label"> <span id="reset-search" class="search__icon"></span> <input class="search-form__input" type="text"> </label> <input class="search-form__submit" type="submit" value="Submit"> </form> </div>
<div class="hero__search">
<a href="#" id="search-icon" class="hero__search-icon">
<img src="search-icon-white.svg" alt="search string">
</a>
<a href="#" id="side-menu-icon" class="hero__side-icon">
<img src="side_menu.svg" alt="side menu">
</a>
</div>
<div class="header__navi">
<ul class="header__list"><li><span class="solution-select"><span class="solution-select__selected"></span><svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L3.5 3.5L6 1" stroke="white" stroke-linecap="round" stroke-linejoin="round"/></svg><ul class="solution-select__list"><li><a class="project-link" href="https://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a class="project-link" href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a class="project-link" href="https://brix365.com/en/help/crm/crm_overview.html">CRM</a></li><li><a class="project-link" href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a class="project-link" href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li><li><a class="project-link" href="https://brix365.com/en/help/business_solutions/-elma365-store.html">Business Solutions</a></li></ul></span></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li><li><a href="https://tssdk.brix365.com/" target="_blank">SDK</a></li></ul>
</div>
</div>
</header>
<main class="main container">
<aside class="sidebar" id="sidebar">
<div class="sidebar__header">
<a class="header__logo" href="https://brix365.com/en/help">
<img src="./logo-light-en.svg">
</a>
<span class="sidebar__close elma-365-close" id="close"></span>
</div>
<div class="sidebar__wrapper" id="side-menu">
</div>
</aside>
<article class="article" id="article">
<div class="article-inner">
<div class="content">
<header class="article__header">
<div class="article__bread" style="display:flex; gap:10px;">
<span id="subcategory" class="search-res__item-category search-res__item-category_subcategory subcategory article__badge"></span>
<div class="topic__breadcrumbs">
<p>Low-code designer &gt; <a href="interface_settings.html">Set up interfaces</a> / Scripts in widgets</p>
</div>
</div>
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">Scripts in widgets</span></h1>
</div>
</header>
<section class="article__content">
<div class="scroll-top-inner">
<a href="#h1-article" class="scroll-top"></a>
</div>
<!-- Placeholder for topic body. -->
<p style="line-height: 1.20; background: #ffffff; margin: 0 0 11px 0;">You can make widgets on pages interactive by using scripts.</p>
<p style="line-height: 1.20; background: #ffffff; margin: 0 0 11px 0;">A <span style="font-weight: bold;">Script</span> is a piece of code that describes a widget<span style="font-family: Inter;">s</span> behavior under certain conditions. Scripts use variables, the most common type being <a href="360009707032.html#yes-no-switch" class="topiclink">Yes/No switch</a>, as most widget actions (hide, show, etc.) are bound to the values of such properties.</p>
<p style="line-height: 1.20; background: #ffffff; margin: 0 0 11px 0;">Scripts can be:</p>
<ul style="list-style-type:disc">
<li style="line-height: 1.20; background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-weight: bold;">Client-side</span>. Executed in a user<span style="font-family: Inter;">s browser.</span></li><li style="line-height: 1.20; background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-weight: bold;">Server-side</span>. Executed on the BRIX server.</li><li style="line-height: 1.20; background: #ffffff; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><span style="font-weight: bold;">Mixed</span>. These scripts are executed on the client side, but they <a href="client_server_scripts.html#server" class="topiclink">call</a> server methods.</li></ul>
<p class="p_Normal">Server-side scripts run regardless of access restrictions to app items. Client scripts are executed with restrictions. For example, when trying to load an item to which the current user does not have access, the client-side code will return an error, while the server-side code will execute successfully. Similarly, when receiving a list of items, the client side will return only those items to which they have access, while the server side will return all items. </p>
<p class="p_Normal">In server-side scripts, you can use additional parameters. They allow you to customize the widget and make changes to the script without republishing. You can read more about it in the <a href="360009207779.html" class="topiclink">Additional parameters</a> article.</p>
<p class="p_Normal">Scripts for widgets usually don<span style="font-family: Inter;">t</span> require powerful hardware to operate, so we recommend writing them on the client side whenever possible.</p>
<p style="line-height: 1.20; background: #ffffff; margin: 0 0 11px 0;">Scripts are written in the TypeScript programming language on the <span style="font-weight: bold;">Scripts</span> tab of the <a href="interface_designer.html" class="topiclink">interface designer</a>.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">начало&nbsp;внимание</span></p>
<p class="p_Normal">Using <code><b>Global</b></code> or <code><b>Namespace</b></code> constants in scripts restricts the export of system components. Read more about it in the <a href="global-constants.html" class="topiclink">Global constants in scripts</a> article.</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">конец&nbsp;внимание</span></p>
<p style="line-height: 1.20; background: #ffffff; margin: 0 0 11px 0;"><img alt="S1" width="1008" height="605" style="margin:0;width:1008px;height:605px;border:none" src="s1.png"/></p>
<h2 class="p_Heading2"><span class="f_Heading2">External dependencies in client-side scripts</span></h2>
<p class="p_Normal">In client-side scripts in widgets, you can use JavaScript libraries and custom functions. To do that, go to the <span style="font-weight: bold;">Files</span> tab of the interface designer. Upload one or several .<span style="font-weight: bold;">js</span> files with the code of the required functions or libraries. On the <span style="font-weight: bold;">Scripts</span> tab, use the <code><b>import</b></code> declaration to connect the files you added to the source code. </p>
<p class="p_Normal">For example, to connect the <span style="font-weight: bold;">jQuery</span> library, go to the <span style="font-weight: bold;">Files</span> tab and upload a file with the most recent version of the library, for example, <code><b>jquery-3.6.0.min.js</b></code>. Then open the <span style="font-weight: bold;">Scripts</span> tab, to the client-side script, and add the following declaration in the beginning of the script:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">import $ from &quot;jquery-3.6.0.min.js&quot;;</span></p>
<p class="p_Normal">Now you can call functions from this library in the script<span style="font-family: Inter;"></span>s code.</p>
<p style="line-height: 1.28; margin: 0 0 11px 0;">Also, client-side scripts allow using functions that are called automatically when displaying a widget or when saving a <a href="create_form.html" class="topiclink">form</a>. Read more about it in <a href="widget_functions.html" class="topiclink">System functions in widgets</a>.</p>
<h2 class="p_Heading2"><span class="f_Heading2">Get data from widgets</span></h2>
<p style="line-height: 1.28; margin: 0 0 11px 0;">The way you can get data from a widget<span style="font-family: Inter;">s</span> context depends on where a widget is located.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Interface widgets</span></h3>
<p style="line-height: 1.28; margin: 0 0 11px 0;">If you are setting up an <a href="interface_settings.html" class="topiclink">interface</a> and creating a custom widget, you can access its context using the <code><b>Context</b></code> constant. For example:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">Context.data.string_1&nbsp;=&nbsp;'string&nbsp;value';</span></p>
<p style="line-height: 1.28; margin: 0 0 11px 0;">If you need to access a system widget placed on a page, you also need to use <code><b>Context</b></code>.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Widgets on forms</span></h3>
<p style="line-height: 1.28; margin: 0 0 11px 0;">If you need to access a widget placed on an app form, you need to use the <code><b>ViewContext</b></code> constant, as <code><b>Context</b></code> in this case grants access to the context of the app itself:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">const&nbsp;itemName&nbsp;=&nbsp;Context.data.__name;</span><br />
<span class="f_CodeExample">ViewContext.data.string_1&nbsp;=&nbsp;`Name&nbsp;${&nbsp;itemName&nbsp;}}`;</span></p>
<p style="line-height: 1.28; margin: 0 0 11px 0;">Read more about this in BRIX TS SDK, in the <a href="https://tssdk.brix365.com/en/pages/quick-start/scripts-in-widgets.html" target="_blank" class="weblink">Scripts in widgets</a> article.</p>
<h2 class="p_Heading2"><a id="server" class="hmanchor"></a><span class="f_Heading2">Call a server method from a client-side script</span></h2>
<p class="p_Normal">Not all operations can be performed strictly on the server side or the client side. Sometimes a hybrid approach is necessary. In this case you can implement a client-side script to do part of the work and then call a server script. This approach is mostly used to implement the logic for locking interfaces and sending user notifications.</p>
<p class="p_Normal">For example, there may be a script on a server that performs data processing and can access external services:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">async&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">function</span><span class="f_CodeExample">&nbsp;DoSomeWork()&nbsp;:&nbsp;Promise&lt;</span><span class="f_CodeExample" style="font-weight: bold;">void</span><span class="f_CodeExample">&gt;&nbsp;{</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;//&nbsp;A&nbsp;typical&nbsp;logic&nbsp;of&nbsp;a&nbsp;server-side&nbsp;script</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;//&nbsp;External&nbsp;calls&nbsp;can&nbsp;be&nbsp;made&nbsp;via&nbsp;`await`</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;let&nbsp;response&nbsp;=&nbsp;await&nbsp;fetch('https://my-service.mycompany.com/getmydata?token='&nbsp;+&nbsp;Context.data.secureToken);</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;Context.data.mySecureData&nbsp;=&nbsp;await&nbsp;response.text();</span><br />
<span class="f_CodeExample">}</span></p>
<p class="p_Normal">Then, in the code of a client-side script, you can call this method by using the <code><b>Server.rpc</b></code><span style="font-weight: bold;"> </span>property:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">async&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">function</span><span class="f_CodeExample">&nbsp;onButtonClick()&nbsp;:&nbsp;Promise&lt;</span><span class="f_CodeExample" style="font-weight: bold;">void</span><span class="f_CodeExample">&gt;&nbsp;{</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;ViewContext.data.blockUI&nbsp;=&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">true</span><span class="f_CodeExample">;</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;await&nbsp;Server.rpc.DoSomeWork();</span><br />
<span class="f_CodeExample">&nbsp;&nbsp;ViewContext.data.blockUI&nbsp;=&nbsp;</span><span class="f_CodeExample" style="font-weight: bold;">false</span><span class="f_CodeExample">;</span><br />
<span class="f_CodeExample">}</span></p>
<p class="p_Normal">Please note that data between the server and the client is passed only via <code><b>Context</b></code> or <code><b>ViewContext</b></code>. The method on the server side must have no parameters and has to return <code><b>Promise</b></code>. Only then it will appear in the auto-complete list for the client-side script.</p>
<p class="p_Normal">You can also call server methods using nested widgets like <a href="button_widget.html" class="topiclink">Button</a> or <a href="code_widget.html" class="topiclink">Code</a>. Read more about it in the <a href="https://tssdk.brix365.com/en/pages/quick-start/scripts-in-widgets.html#3" target="_blank" class="weblink">Scripts in widgets</a> article in BRIX TS SDK.</p>
<h2 class="p_Heading2"><a id="track-app-events" class="hmanchor"></a><span class="f_Heading2">Track app events through a client-side script</span></h2>
<p class="p_Normal">A widget on a page can display real-time data on app items. For example, you can set up a report that displays the current status of items and new entries in the app without refreshing the page.</p>
<p class="p_Normal">To do this, subscribe to the events of item creation, deletion, and change in the report widget and set handler functions for them. This can be done using a client-side script.</p>
<h3 class="p_Heading3"><span class="f_Heading3">Subscribe to an event</span></h3>
<p class="p_Normal">To create an event subscription in the app, open the Scripts tab, go to the client-side scripts section and write a script:</p>
<p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">await System.events.subscribe()</span><br />
<span class="f_CodeExample"> &nbsp; </span><br />
<span class="f_CodeExample"> &nbsp; </span><span class="f_CodeExample" style="font-style: italic;">// Subscribe to the event of creating a new item in the app</span><br />
<span class="f_CodeExample"> &nbsp; .onAppItemCreate(Context.fields.order.app, async (events) =&gt; {</span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; </span><span class="f_CodeExample" style="font-weight: bold;">const event </span><span class="f_CodeExample">= events[0];</span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; </span><span class="f_CodeExample" style="font-weight: bold;">const </span><span class="f_CodeExample">order = await </span><span class="f_CodeExample" style="font-weight: bold;">event</span><span class="f_CodeExample">.data.fetch();</span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; </span><span class="f_CodeExample" style="font-style: italic;">// Report data update</span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; updateReportWithNew(order);</span><br />
<span class="f_CodeExample"> &nbsp; },</span><br />
<span class="f_CodeExample"> &nbsp; {</span><br />
<span class="f_CodeExample"> &nbsp; &nbsp; &nbsp; debounce: 0</span><br />
<span class="f_CodeExample"> &nbsp; })</span><br />
<span class="f_CodeExample"> &nbsp; </span><br />
<span class="f_CodeExample"> &nbsp; </span><span class="f_CodeExample" style="font-style: italic;">// Subscribe to the event of change of a certain item, including the change of its status</span><br />
<span class="f_CodeExample"> &nbsp; .onAppItemUpdate(item, function(e) =&gt; {}, { buffered: 2 })</span><br />
<span class="f_CodeExample"> &nbsp; </span><br />
<span class="f_CodeExample"> &nbsp; </span><span class="f_CodeExample" style="font-style: italic;">// Subscription to the event of deletion of a certain item</span><br />
<span class="f_CodeExample"> &nbsp; .onAppItemDelete(item, function(e) =&gt; {}, { debounce: 0 })</span><br />
<span class="f_CodeExample"> &nbsp; .all();</span></p>
<p class="p_Normal">Basic parameters:</p>
<ul style="list-style-type:disc">
<li class="p_Normal">The app or item for which events are tracked.</li><li class="p_Normal">Event handler is a custom function that is run when an event occurs.</li></ul>
<p class="p_Normal">The handler options optional parameters also be used to optimize performance:</p>
<ul style="list-style-type:disc">
<li class="p_Normal"><code><b>buffered</b></code>. Specify how many events will be accumulated before they are processed. The default is 1.</li><li class="p_Normal"><code><b>debounce</b></code>. Set the maximum frequency of handler calls in milliseconds. Please note that if more events are received during the set time than specified in buffered, the last of them are processed and the earlier ones are ignored. For create and delete events, it is recommended to set the value to 0 so that all items are processed. The default value is 50 ms.</li></ul>
<h3 class="p_Heading3"><span class="f_Heading3">Disable handler</span></h3>
<p class="p_Normal">Event subscriptions are active as long as the page with the widget for which they are configured is open. When you switch to another page, they are automatically disabled.</p>
<p class="p_Normal">You can also disable an event handler when you no longer need to use it. To do this, use the following methods in the client script:</p>
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample" style="font-style: italic;">//&nbsp;Disable&nbsp;the&nbsp;`onDeleteHandler`&nbsp;handler&nbsp;that&nbsp;was&nbsp;used&nbsp;for&nbsp;the&nbsp;event&nbsp;of&nbsp;item&nbsp;deletion</span><br />
<span class="f_CodeExample">await&nbsp;System.events.unsubscribe().onAppItemDelete(item,&nbsp;onDeleteHandler).all();</span><br />
<span class="f_CodeExample">&nbsp;</span><br />
<span class="f_CodeExample">...</span><br />
<span class="f_CodeExample" style="font-style: italic;">//&nbsp;Disable&nbsp;all&nbsp;handlers&nbsp;for&nbsp;the&nbsp;event&nbsp;of&nbsp;item&nbsp;change&nbsp;</span><br />
<span class="f_CodeExample">await&nbsp;System.events.unsubscribe().onAppItemUpdate(item).all();</span><br />
<span class="f_CodeExample">&nbsp;</span><br />
<span class="f_CodeExample">...</span><br />
<span class="f_CodeExample" style="font-style: italic;">//&nbsp;Cancel&nbsp;all&nbsp;subscriptions&nbsp;to&nbsp;events&nbsp;within&nbsp;the&nbsp;widget</span><br />
<span class="f_CodeExample">await&nbsp;System.events.unsubscribe().all();</span></p>
<p class="p_Normal">&nbsp;</p>
<div class="bottom-nav">
<a id="prev-link" class="topic__navi_prev" href="user-widgets-context.html">
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
class="bottom-nav__link">user-widgets-context.html</span>
</a>
<a id="next-link" class="topic__navi_next" href="widget_functions.html">
<span class="bottom-nav__link">widget_functions.html</span> <span
class="bottom-nav__arrow bottom-nav__arrow--next"></span>
</a>
</div>
<!-- добавляет на страницу строку блок Была ли статья полезной? -->
<div class="feedback" id="feedback"><div class="feedback-help"><span><b>Was this helpful?</b></span><form action="" method="POST" class="feedback-form" id="feedback-form"><div class="feedback__popup feedback__popup-response" id="feedback__popup_thx" style="display: none;">Thanks for your feedback!</div><div class="feedback__popup" id="feedback__popup_why" style="display: none;"><div class="feedback__popup-header">Please specify why:</div><input type="radio" name="category" id="bad_recommendation" value="bad_recommendation"><label for="bad_recommendation">Recommendations did not help me</label><input type="radio" name="category" id="difficult_text" value="difficult_text"><label for="difficult_text">Article is hard to understand</label><input type="radio" name="category" id="no_answer" value="no_answer"><label for="no_answer">Didn`t answer my question</label><input type="radio" name="category" id="bad_header" value="bad_header"><label for="bad_header">Content does not match the topic</label><input type="radio" name="category" id="other_reason" value="other_reason"><label for="other_reason">Other</label></div><div class="feedback__popup" id="feedback__popup-other" style="display: none;"><div class="feedback__popup-header">How we can improve it?</div><textarea class="feedback__textarea" name="other" id=""></textarea><input type="submit" class="feedback__other-btn" value="Submit"></div><div class="feedback-form__btn-group"><input type="radio" name="useful" id="feedback__useful_yes" value="true"><label for="feedback__useful_yes"><img src="like.svg" class="small-img" alt="like"><spanclass="feedback-form__btn-group_yes-btn">Yes</spanclass="feedback-form__btn-group_yes-btn"></label><input type="radio" name="useful" id="feedback__useful_no" value="false"><label for="feedback__useful_no"><img src="dislike.svg" class="small-img" alt="dislike"><spanclass="feedback-form__btn-group_no-btn">No</spanclass="feedback-form__btn-group_no-btn"></label></div><select name="category"><option disabled="">Please specify why</option><option value="bad_recommendation" selected="">Recommendations did not help me</option><option value="difficult_text">Article is hard to understand</option><option value="no_answer">Didn`t answer my question</option><option value="bad_header">Content does not match the topic</option><option value="other_reason">Other</option></select><input type="submit"></form></div><div class="found_typo"><p style="margin: 0px; margin-top: 16px !important;"><span><b>Found a typo?</b></span> Select it and press <i>Ctrl+Enter</i> to send us feedback</p></div></div>
</section>
</div>
<aside class="article__sidebar" style="display:none">
<input type="checkbox" />
<div class="article__arrow"></div>
<div class="table-of-contents elma365-right" id="toc2Content">
<h3 class="h3-toc">In this topic</h3>
<nav id="toc2"></nav>
</div>
</aside>
</div>
</article>
</main>
<footer class="footer">
<div class="footer-container">
<div class="footer-mobile">
<ul class="footer-mobile__list"><li><a href="https://brix365.com/en/" target="_blank">BRIX</a></li><li><a href="https://tssdk.brix365.com/en/latest/" target="_blank">SDK</a></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li></ul><ul class="footer-mobile__list"><li><a href="https://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li></ul>
</div>
<div class="footer-wrap">
<div><span class="mobile-question-popup">Send feedback</span><form method="POST" action class="question__popup question-xs" id="question__popup"><div class="question-wrap"><span class="close"></span><span class="title">Ask a question</span><label for="help_question" style="display: none;"></label><textarea name="help_question" id="help_question"></textarea><input type="submit" value="Send"></div></form><div class="hidden fade-in question-success-xs">Sent</div></div>
<div class="footer-flex-b">
<span class="footer-copy">&copy; 2025 BRIX</span>
<ul class="footer-list">
<li class="footer-item">
<a href="#" class="arrow-top" style="display: block;"></a>
</li>
</ul>
</div>
</div>
</div>
</footer>
<iframe name="hmnavigation" style="display:none!important"></iframe>
<script src="./jquery-ui.js"></script>
<!--script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script-->
<script src="./jquery.tocify.min.js"></script>
<script src="./TypoReporter.min.js"></script>
<script src="./google-search.js"></script>
<script src="./main.js"></script>
</body>
</html>