<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>UBOS Community: Daniel</title>
    <description>The latest articles on UBOS Community by Daniel (@daniel).</description>
    <link>https://community.ubos.tech/daniel</link>
    <image>
      <url>https://community.ubos.tech/uploads/user/profile_image/11/7792a3e1-5d64-4238-a555-9a72d7f080d6.png</url>
      <title>UBOS Community: Daniel</title>
      <link>https://community.ubos.tech/daniel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://community.ubos.tech/feed/daniel"/>
    <language>en</language>
    <item>
      <title>Відображення даних у діаграмі</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Tue, 07 Mar 2023 09:00:39 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/vidobrazhiennia-danikh-u-diaghrami-3jm2</link>
      <guid>https://community.ubos.tech/daniel/vidobrazhiennia-danikh-u-diaghrami-3jm2</guid>
      <description>&lt;p&gt;Наша платформа має декілька діаграм:&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/aux1ubwn290s5vhh9001.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/aux1ubwn290s5vhh9001.png" alt="Image description" width="319" height="380"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  StackedColumnChart
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/vqta607isd85irn645lj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/vqta607isd85irn645lj.png" alt="Image description" width="1714" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В цій діаграмі є 3 основних поля: &lt;br&gt;
x - цей йде ось Х вона йде по горизонталі, переважно в ній пишуть час&lt;br&gt;
у - ось Y вертикаль, зазвичай вказується кількість даних які хочемо показати&lt;br&gt;
seriesField - вказуємо ім'я кожного елементу&lt;/p&gt;

&lt;p&gt;Дані які відображаються в діаграмі мають складатись з масиву об'єктів:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "x": "2050-03-22",
    "y": 150,
    "seriesField": "field 1"
  },
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для прикладу, я створив API запит, який повертає інформацію про створених користувачів. Це в який день реєструвався новий користувач(x), до якого типу належить(seriesField), та яка кількість користувачів реєструвалась за день даного типу(y). Це є масив об'єктів.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/t5ts9vl08dvhzgrie513.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/t5ts9vl08dvhzgrie513.png" alt="Image description" width="987" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Так само таблиця має опцію &lt;code&gt;Tooltip option&lt;/code&gt;. Тут вказується, що ми хочемо відображати при наведені на колонку в таблиці. &lt;br&gt;
Якщо вибрано &lt;code&gt;All elements&lt;/code&gt;, тоді при наведені на на будь, який елемент буде показуватись інформація по всій колонці, де знаходиться елемент на який ми навели. &lt;br&gt;
Якщо вибрати &lt;code&gt;Current element&lt;/code&gt;, тоді при наведені відображається інформація по тому елементу, на котрий навели курсор. &lt;/p&gt;

&lt;p&gt;Для візуальної взаємодії, щоб користувач міг сам собі змінювати як він хоче бачити елементи в чарті, можемо створити віджет Select, та зробити в чарті посилання на селект. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/sve4x394691qnngtdvhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/sve4x394691qnngtdvhg.png" alt="Image description" width="991" height="489"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/8ta6336h41iwjbff35sp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/8ta6336h41iwjbff35sp.png" alt="Image description" width="986" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Тепер користувач може сам вибирати, як він хоче щоб відображались дані, при наведенні на колонку.   &lt;/p&gt;

</description>
      <category>chart</category>
      <category>ukraine</category>
    </item>
    <item>
      <title>Button actions 'onClick'</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Wed, 01 Mar 2023 16:27:26 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/button-actions-onclick-1od2</link>
      <guid>https://community.ubos.tech/daniel/button-actions-onclick-1od2</guid>
      <description>&lt;p&gt;The button has 15 different events onClick. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/ehdjyxr98lom5x8ub9ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/ehdjyxr98lom5x8ub9ut.png" alt="Image description" width="427" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execute a Query&lt;/strong&gt; - this is the event where we can call our API that we created. When you click on this event, a small menu will open with already existing APIs, or options to create a new one. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/hb7hfsztk1qe45c7gciw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/hb7hfsztk1qe45c7gciw.png" alt="Image description" width="459" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execute a JS function&lt;/strong&gt; - here we call the function that is written in JS Object. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/3glyhw1m7xco2j1oezbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/3glyhw1m7xco2j1oezbz.png" alt="Image description" width="545" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigate To&lt;/strong&gt; -  allows the user to navigate between the internal pages of the App or to an external URL. Enter the page name or the external URL in the navigateTo function, enter the Query parameters if required, and select the destination for the new page (a new window or same window).&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/fa7dzzfqrc9306l25zdl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/fa7dzzfqrc9306l25zdl.png" alt="Image description" width="453" height="275"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show message&lt;/strong&gt; - it shows a temporary notification style alert message to the user. The message type can have Info, Success, Error, and Warning.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/m65x2opzvp6dlyqbdikp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/m65x2opzvp6dlyqbdikp.png" alt="Image description" width="427" height="484"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open modal&lt;/strong&gt; - this function is used to open a modal when triggered. Modal is in widgets. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/e387r2z6ayyuloxl1j9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/e387r2z6ayyuloxl1j9z.png" alt="Image description" width="441" height="142"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Close modal&lt;/strong&gt; - this action is used to close a modal when triggered. Create a new modal and open it before calling this action.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/9ll61d0qrozhqkncu7l8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/9ll61d0qrozhqkncu7l8.png" alt="Image description" width="1201" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store value&lt;/strong&gt; -  function saves data in the browser as key-value pairs and can be later accessed anywhere in the application. It data you can view if you go to the developer console in the browser and select localStorage.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/k9azkn80sg6hooqgplg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/k9azkn80sg6hooqgplg3.png" alt="Image description" width="410" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; - users have the ability to download a wide range of file formats. This action serves the purpose of downloading any data as a file. The feature is made possible by using &lt;a href="https://github.com/rndme/download" rel="noopener noreferrer"&gt;downloadjs&lt;/a&gt; library.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/vt72cgp62hof6boo92on.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/vt72cgp62hof6boo92on.png" alt="Image description" width="427" height="264"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/dbudb1mcuxhk8jnv642e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/dbudb1mcuxhk8jnv642e.png" alt="Image description" width="265" height="148"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/tfmx93u86pk1toqah1yh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/tfmx93u86pk1toqah1yh.png" alt="Image description" width="373" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy to clipboard&lt;/strong&gt; - this function is used to copy text to the clipboard.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/nbf5wr9d0dql1x1wpp46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/nbf5wr9d0dql1x1wpp46.png" alt="Image description" width="408" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reset widget&lt;/strong&gt; - use the resetWidget function to revert a widget to its default state. Any user input changes will get reverted and the values in the default properties will be applied. For example, you can use it when you want to clean the form of inputs. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/p1zu59ygwczgadrc9swi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/p1zu59ygwczgadrc9swi.png" alt="Image description" width="432" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set interval&lt;/strong&gt; - executes a callback function with a fixed time interval between the calls.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/e3uolak9e76nsw661gct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/e3uolak9e76nsw661gct.png" alt="Image description" width="465" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clear interval&lt;/strong&gt; - stops a repeating callback that was started with the &lt;code&gt;setInterval&lt;/code&gt; method.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/qs7jgvywuojvlt3vvtkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/qs7jgvywuojvlt3vvtkm.png" alt="Image description" width="464" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get Geolocation&lt;/strong&gt; - this object contains functions to request the current user location and the coordinates received from this.&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition" rel="noopener noreferrer"&gt;request&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/bnyiw1ct5x8ynuqm3m9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/bnyiw1ct5x8ynuqm3m9p.png" alt="Image description" width="450" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch Geolocation&lt;/strong&gt; - almost similar to the original browser API, apart from the fact that you don't need to pass the success callback. On success, the location would automatically be stored at &lt;code&gt;main.geolocation.currentPosition.coords&lt;/code&gt; with the &lt;code&gt;main.geolocation.currentPosition.timestamp&lt;/code&gt; updated whenever the position was last updated. The callbacks, if provided, gets executed automatically when the location has changed. No watchId is returned as well as the platform only allow for a single watchPosition.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/kmkda30g3eiho4y19hm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/kmkda30g3eiho4y19hm1.png" alt="Image description" width="455" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop watching Geolocation&lt;/strong&gt; - stop and clearing your current geolocation. For stopping you don't have to pass the watchId. If a watch is active, you must clear it before starting a new one by calling this function.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/br4lnffcb2nkut1ylcr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/br4lnffcb2nkut1ylcr0.png" alt="Image description" width="437" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Як під'єднати UI Editor та Node-red до GIT</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Tue, 07 Feb 2023 15:44:42 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/iak-pidiednati-ui-ta-nodered-do-git-2ono</link>
      <guid>https://community.ubos.tech/daniel/iak-pidiednati-ui-ta-nodered-do-git-2ono</guid>
      <description>&lt;p&gt;Аби убезпечити свої дані, від можливого зникання та помилок, які можуть зруйнувати написане, або мати універсальний доступ до коду, ми під'єднаємо наші додатки до Git. &lt;br&gt;
В даному прикладі буде використовуватись веб-сховище GitLab.&lt;/p&gt;

&lt;p&gt;Необхідні умови:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;мати GitLab профіль&lt;/li&gt;
&lt;li&gt;створити два репозиторія без файлу Readme для Nodered та UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitLab
&lt;/h2&gt;

&lt;p&gt;В gitLab створюємо два проєкти, для UI та NodeRed. &lt;br&gt;
Коли знаходимось в групі, натискаємо на кнопку &lt;code&gt;New project&lt;/code&gt; =&amp;gt; &lt;br&gt;
в модальному вікні вибираємо &lt;code&gt;Create blank project&lt;/code&gt; =&amp;gt; &lt;br&gt;
далі в налаштуваннях вводимо назву для проєкту, та в полі з конфігурацією прибрати галочку навпроти &lt;code&gt;Initialize repository with a README&lt;/code&gt;, щоб створився без цього файлу =&amp;gt; &lt;br&gt;
&lt;code&gt;Create project&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Так само важливий момент як ми називаємо наш проєкт. Назва має бути зрозуміла. Не потрібно надто кротких назв, щоб коли ви прочитали, ви одразу зрозуміли, що це за проєкт, без написання додаткових пояснень в Readme файлі, що відбувається в даному проєкті. До прикладу, назвати проєкт Front чи UI погано, бо не зрозуміло, що саме відбувається.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/nzczvbw1vow0mok1pxk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/nzczvbw1vow0mok1pxk7.png" alt="Image description" width="994" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/y79ph7qoe9mfvn1s1ie1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/y79ph7qoe9mfvn1s1ie1.png" alt="Image description" width="1071" height="574"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/6vsgb7sjavcl0wai3c99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/6vsgb7sjavcl0wai3c99.png" alt="Image description" width="1233" height="566"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/ieiok3ukbja1yirrhsht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/ieiok3ukbja1yirrhsht.png" alt="Image description" width="1108" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В GitLab натискаємо на кнопку &lt;code&gt;Clone&lt;/code&gt;, та копіюємо стрічку з &lt;code&gt;Clone with SHH&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/egnkfc46h4cj6r3oi1nb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/egnkfc46h4cj6r3oi1nb.png" alt="Image description" width="992" height="478"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  UI
&lt;/h2&gt;

&lt;p&gt;В UI Editor натискаємо на кнопку &lt;code&gt;CONNECT GIT&lt;/code&gt; вона знаходиться в лівому куті з низу.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/ieibkal935udzxbq8fvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/ieibkal935udzxbq8fvw.png" alt="Image description" width="1675" height="897"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Відкривається модальне вікно, в яке ми вставляємо наш SHH ключ. Та натискаємо на кнопку &lt;code&gt;Generate key&lt;/code&gt;.&lt;br&gt;
З'являється &lt;code&gt;SHH Key&lt;/code&gt;, та копіюємо його. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/rnapxw36jejkt6c2umtw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/rnapxw36jejkt6c2umtw.png" alt="Image description" width="646" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далі заходимо на наш GitLab, натискаємо на іконку яка праворуч в горі, та вибираємо &lt;code&gt;Perferences&lt;/code&gt;. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/qqu7m61tfp20q30cp8rs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/qqu7m61tfp20q30cp8rs.png" alt="Image description" width="437" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В лівому меню вибираємо поле &lt;code&gt;SHH Keys&lt;/code&gt;. У відкритій сторінці вставляємо наш згенерований SHH ключ в поле &lt;code&gt;Key&lt;/code&gt;. Нижче в полі &lt;code&gt;Expiration date&lt;/code&gt; натискаємо на хрестик, щоб прибирати термін придатності. І в кінці вже натискаємо на кнопку &lt;code&gt;Add key&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/6fezukdk7uq1qtq6lxfi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/6fezukdk7uq1qtq6lxfi.png" alt="Image description" width="1529" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Тепер повертаємось в наш UI Editor та натискаємо кнопку &lt;code&gt;Connect&lt;/code&gt;. Автоматично відбувається підключення до нашого GitLab, та робиться перший коміт. В кінці показується модальне вікно &lt;code&gt;Deploy your application&lt;/code&gt; - це означає, що все пройшло успішно. &lt;/p&gt;

&lt;p&gt;Наш проєкт підєднано до GitLab.  Тепер з низу замість &lt;code&gt;CONNECT GIT&lt;/code&gt; показується кнопка плюс. Після того, як зробимо якісь зміни, натискаємо на нього, відкриється модальне вікно &lt;code&gt;Deploy your application&lt;/code&gt;, де в полі пишемо назву для нашого коміту і натискаємо на кнопку &lt;code&gt;COMMIT &amp;amp; PUSH&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/whrpgmeaxxsjpxqpipd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/whrpgmeaxxsjpxqpipd1.png" alt="Image description" width="762" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  NodeRed
&lt;/h2&gt;

&lt;p&gt;Заходимо в наш NodeRed, натискаємо на три стрічки які праворуч в горі, відкривається меню, натискаємо на &lt;code&gt;Projects&lt;/code&gt;та вибираємо &lt;code&gt;New&lt;/code&gt;, тоді відкриється модальне вікно. Або можна натиснути на клавіатурі &lt;code&gt;ctr-alt-n&lt;/code&gt;, щоб відкрити модальне вікно.&lt;br&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/bnenns6akd5vw5op6j29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/bnenns6akd5vw5op6j29.png" alt="Image description" width="706" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Вибираємо &lt;code&gt;Create Project&lt;/code&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/5z3tuhsqqskb53l8lxlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/5z3tuhsqqskb53l8lxlq.png" alt="Image description" width="649" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Водимо username, свій імейл, та натискаємо кнопку &lt;code&gt;Next&lt;/code&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/emmfvu55o7odu96m0qs1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/emmfvu55o7odu96m0qs1.png" alt="Image description" width="765" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Даємо назву нашому проєкту, та натискаємо &lt;code&gt;Next&lt;/code&gt;. &lt;br&gt;
Далі висвітлюється як нам назвати наш файл, нічого не змінюємо, просто натискаємо &lt;code&gt;Next&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/515kby4h2jh2tiryd3m9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/515kby4h2jh2tiryd3m9.png" alt="Image description" width="691" height="710"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/ni21ciajnk03d0c90oha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/ni21ciajnk03d0c90oha.png" alt="Image description" width="703" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далі відкривається модальне вікно з налаштуванням шифрування. Вибираємо без шифрування - &lt;code&gt;Disable encryption&lt;/code&gt;, та натискаємо &lt;code&gt;Create project&lt;/code&gt;. Якщо хочете створити проєкт з шифруванням, то внизу в додатковій інформації є посилання на відео, як це зробити.&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/w4qzi8r48ufv7nhwnf5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/w4qzi8r48ufv7nhwnf5o.png" alt="Image description" width="705" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Потім нам потрібно створити проєкт в GitLab(див. приклад вище). Тільки в цей раз замість того, щоб скопіювати посилання SHH, ми використаємо HTTPS(як додати SHH розповідається у відео де додаткова інформація).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Далі в NodeRed натискаємо на три стрічки які праворуч в горі, відкривається меню, натискаємо на &lt;code&gt;Projects&lt;/code&gt;та вибираємо &lt;code&gt;Project Setting&lt;/code&gt;. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/1u81ot9koxw76hsqnv8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/1u81ot9koxw76hsqnv8k.png" alt="Image description" width="584" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Потім в меню вибираємо &lt;code&gt;Settings&lt;/code&gt;. Натискаємо на кнопку &lt;code&gt;add remote&lt;/code&gt;, в полі URL вставляємо HTTPS посилання на наш проєкт на GitLab, який скопіювали. &lt;br&gt;
Натискаємо на кнопку &lt;code&gt;Add remote&lt;/code&gt;. Тепер наш NodeRed під'єднаний до GitLab.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/2btkux9xd34798g2p0yd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/2btkux9xd34798g2p0yd.png" alt="Image description" width="657" height="787"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далі щоб додати зміни в GitLab, натискаємо на кнопку дерево яка знаходиться вгорі праворуч між книгою, та жуком. Це є меню управління нашим git. &lt;br&gt;
Щоб зберегти у віддаленому середовищі натискаємо на кнопку &lt;code&gt;+add&lt;/code&gt;, та &lt;code&gt;commit&lt;/code&gt;. Якщо ви не розумієте, що означають ці стани, тобто навіщо ми робимо ці кроки, то перегляньте офіційну документацію &lt;a href="https://git-scm.com/book/uk/v2/%D0%92%D1%81%D1%82%D1%83%D0%BF-%D0%A2%D1%80%D0%B8-%D1%81%D1%82%D0%B0%D0%BD%D0%B8" rel="noopener noreferrer"&gt;git&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/9xya9sz66s6ifv288keh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/9xya9sz66s6ifv288keh.png" alt="Image description" width="622" height="852"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Пишемо назву нашого коміту, та натискаємо &lt;code&gt;Commit&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/98pqw6zl9mp9ooc4h13u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/98pqw6zl9mp9ooc4h13u.png" alt="Image description" width="411" height="817"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далі натискаємо на &lt;code&gt;Commit History&lt;/code&gt;, потім на кнопку зі стрілками, та вибираємо &lt;code&gt;Remote: None&lt;/code&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/4s9ows3d8vo2gen9artq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/4s9ows3d8vo2gen9artq.png" alt="Image description" width="395" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Має відкритись спливаюче вікно, де вказуємо наш юзернейм або імейл з паролем від GitLab. Та натискаємо кнопку Retry&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/cpjlbhht51jidma8yu1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/cpjlbhht51jidma8yu1c.png" alt="Image description" width="1082" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Потім знову натискаємо на кнопку дерево яка знаходиться вгорі праворуч між книгою, та жуком. Далі вибираємо &lt;code&gt;Remote: None&lt;/code&gt;, якщо не має ніяких гілок, то пишемо, будь яку, назву для гілки, та натискаємо трохи нижче, щоб створити її.&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/9piq5mqdpvikv5m1nl2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/9piq5mqdpvikv5m1nl2l.png" alt="Image description" width="411" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Відкриється меню, та натискаємо кнопку &lt;code&gt;Push&lt;/code&gt;. Наші дані, додаються в GitLab репозиторій.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/rq8vk0vs6atij3mcs80a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/rq8vk0vs6atij3mcs80a.png" alt="Image description" width="437" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Додаткова інформація:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/uk/v1.0.0/" rel="noopener noreferrer"&gt;Як правильно називати коміти&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.appsmith.com/advanced-concepts/version-control-with-git/connecting-to-git-repository" rel="noopener noreferrer"&gt;Приклади як на UI під'єднати git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Bto2rz7bY3g&amp;amp;ab_channel=Node-RED" rel="noopener noreferrer"&gt;Introduction to Node-RED Projects - VIDEO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>Interaction with GitLab API</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Mon, 30 Jan 2023 08:29:09 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/interaction-with-gitlab-api-4jln</link>
      <guid>https://community.ubos.tech/daniel/interaction-with-gitlab-api-4jln</guid>
      <description>&lt;p&gt;You will need to have a GitLab account and a personal access token to interact with the API.&lt;br&gt;
&lt;a href="https://docs.gitlab.com/ee/api/api_resources.html" rel="noopener noreferrer"&gt;Read more about GitLab API&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html" rel="noopener noreferrer"&gt;How create personal access token in GitLab&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1. Node-red
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/1gm054tohmkqy0q3rxw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/1gm054tohmkqy0q3rxw0.png" alt="Image description" width="929" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1) Create flow "http in"&lt;br&gt;
2) Create flow function &lt;code&gt;set data&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msg.issues = [];
msg.page = 1;

return msg;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Create flow function &lt;code&gt;url&lt;/code&gt;. Where set url to gitlab api&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
msg.url = `https://gitlab.com/api/v4/projects/40120550/issues?private_token={YOUR_GITLAB_ACCESS_TOKEN}&amp;amp;page=${msg.page}&amp;amp;per_page=100`;

return msg;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Create flow request and set in setting &lt;code&gt;a parsed JSON object&lt;/code&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/eejubem97a97647e9yff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/eejubem97a97647e9yff.png" alt="Image description" width="797" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5) Create flow function &lt;code&gt;load data&lt;/code&gt;. Where will we filter our issues. Because GitLab returns only 100 issues, we make pagination on every page. And add in setup 2 outputs. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/dnp3trueu5fcuwaroubp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/dnp3trueu5fcuwaroubp.png" alt="Image description" width="826" height="662"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (msg.payload.length === 100) {
    msg.issues = msg.issues.concat(msg.payload);

    msg.page += 1;

    return [msg, null];
} else if (msg.payload.length &amp;lt; 100 &amp;amp;&amp;amp; msg.payload.length !== 0) {
    msg.issues = msg.issues.concat(msg.payload);
    msg.payload = msg.issues;

    return [null, msg];
}
 else {
    msg.payload = msg.issues;

    return [null, msg];
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6) Create flow "http response"&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. UI
&lt;/h2&gt;

&lt;p&gt;Create page, for example with table, button and select filter.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/z3o41us9uo0xnwebyja3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/z3o41us9uo0xnwebyja3.png" alt="Image description" width="1458" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In API/JS create request to our nodered &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/1mm0tbdki6tgywan6r8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/1mm0tbdki6tgywan6r8c.png" alt="Image description" width="1022" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We add a call to our api &lt;code&gt;getIssues&lt;/code&gt; in the button. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/oem6sbzuea0ud0gmhssv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/oem6sbzuea0ud0gmhssv.png" alt="Image description" width="570" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where filter we created 3 states - all, closed, and opened. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/1wywstzxsfcvw908yb0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/1wywstzxsfcvw908yb0f.png" alt="Image description" width="1455" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can do filtering by queries API. However, it will take a lot of time to make requests. Since we already have the data that came in, it will be faster to filter JS. &lt;br&gt;
In the table where the data is displayed, we add a JS function to display the data relative to our filter.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/rugr0x7ba0re69ojdfy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/rugr0x7ba0re69ojdfy3.png" alt="Image description" width="1499" height="585"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{
Select.selectedOptionValue === 'all' ?
getIssues.data : getIssues.data.filter(i =&amp;gt; i.state === Select.selectedOptionValue)
}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Summary:&lt;br&gt;
We interact with GitLab using requests. To do this, we need to have an access token. We can't get all the data at once, so we use server pagination. When we display data on the page, we don't filter the data with API requests, because it will take a long time. We use JS for filtering because it's much faster. &lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>api</category>
      <category>dashboard</category>
    </item>
    <item>
      <title>Як взаємодіяти між двома віджетами на прикладі вкладок, та картинок</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Thu, 15 Dec 2022 15:04:52 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/iak-vzaiemodiiati-mizh-dvoma-vidzhietami-na-prikladi-tabiv-ta-knopok-23kl</link>
      <guid>https://community.ubos.tech/daniel/iak-vzaiemodiiati-mizh-dvoma-vidzhietami-na-prikladi-tabiv-ta-knopok-23kl</guid>
      <description>&lt;p&gt;Кожен віджет на платформі має свій стан, саме тому, вони не взаємодіють між собою. Проте, використовуючи глобальний об'єкт ми можемо пов'язати їх роботу. &lt;br&gt;
До приклад: ми не хочемо використовувати функціонал перемикання між вкладками, які є у віджеті &lt;em&gt;Tab&lt;/em&gt;, хочемо створити окремі картинки, натискаючи на які, буде відбуватись перемикання наших вкладок. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Що варто знати:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://community.ubos.tech/spel/ui-editor-basic-il9"&gt;UI Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.ubos.tech/daniel/globalni-zminni-storevalue-2630"&gt;Глобальні змінні (storeValue)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Крок перший - створюємо віджет вкладка(Tabs)
&lt;/h2&gt;

&lt;p&gt;Додаємо віджет Tabs на сторінку та створюємо декілька вкладок. На кожній сторінці додаємо текст, щоб бачити, що вкладки переключаються. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/2e94y57gg2qz3favg0o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/2e94y57gg2qz3favg0o5.png" alt="Image description" width="1497" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Крок другий - додаємо глобальний об'єкт
&lt;/h2&gt;

&lt;p&gt;В налаштуваннях віджета, у розділі події(Events) - &lt;em&gt;onTabSelected&lt;/em&gt;, вибираємо &lt;em&gt;storeValue&lt;/em&gt;, та даємо назву глобальному об'єкту &lt;code&gt;selectedTab&lt;/code&gt; в полі &lt;code&gt;Key&lt;/code&gt;, а поле &lt;code&gt;Value&lt;/code&gt; залишаємо пустим. Для того, щоб на вибрання вкладки, наш глобальний об'єкт очищався.  &lt;/p&gt;

&lt;p&gt;У полі "Вибрана вкладка"(Selected tab) пишемо посилання на наш глобальний об'єкт.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/n72c1sxb22gycsfcy43q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/n72c1sxb22gycsfcy43q.png" alt="Image description" width="795" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Увімкнене поле &lt;code&gt;Show Tabs&lt;/code&gt; вимикаємо. В такому випадку скриємо перемикач вкладок.&lt;/p&gt;

&lt;h2&gt;
  
  
  Крок третій - створюємо переключення через картинки
&lt;/h2&gt;

&lt;p&gt;Перетаскуємо віджет картинки на сторінку(у моєму випадку 4 віджети, бо 4 вкладки). Вставляємо будь-які посилання. В картинці, у розділі події(Events), вибираємо storeValue, та даємо назву нашому глобальному об'єкту &lt;code&gt;selectedTab&lt;/code&gt; в полі &lt;code&gt;Key&lt;/code&gt;, а в полі &lt;code&gt;Value&lt;/code&gt; пишемо назву нашої вкладки. Щоб при натисканні на картинку відкривалась вибрана вкладка. Так робимо в кожній картинці.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/jtag6u55uta9klmtf8q2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/jtag6u55uta9klmtf8q2.png" alt="Image description" width="881" height="724"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Як це працює?&lt;/strong&gt;&lt;br&gt;
У віджеті Вкладка, в полі за замовчуванням пишемо посилання на наш глобальний об'єкт. Він завжди пустий. Окрім випадків, коли ми натискаємо на картинку. При натисканні на картинку, стан нашого об'єкту змінюється на назву, вибраної вкладки. За рахунок цього, переключається вкладка, та її стан очищається. &lt;/p&gt;

&lt;p&gt;Коли стан за замовчуванням пустий, у віджеті Вкладка, він автоматично відкриває першу вкладку. Коли приходять дані(назва нашої вкладки), він відкриває вкладку з написаною назвою. Це прирівнюється до завантаження сторінки, бо стан від початку пустий. Далі стан після зміни вкладки очищається. Щоб знову змогти повторити таку дію.&lt;/p&gt;

</description>
      <category>storevalue</category>
    </item>
    <item>
      <title>Модуль Авторизації</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Wed, 07 Dec 2022 08:54:35 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/modul-avtorizatsiyi-j0e</link>
      <guid>https://community.ubos.tech/daniel/modul-avtorizatsiyi-j0e</guid>
      <description>&lt;p&gt;Це готовий модуль авторизації з якого можно починати писати проєкт, щоб не писати все з початку.&lt;br&gt;
Він включає в себе панель адміна, де можно створювати нових користувачів, керувати їхнім доступом до сторінок, та можливістью змінювати самі сторінки відповідно до користувацької ролі. &lt;br&gt;
Систему реєстрації користувача, за допомогою відправки листа підтвердження на імейл. Та функціонал скидання паролю. &lt;/p&gt;

&lt;p&gt;На початку створюємо нове середовище на UI, node-red, та імпортуємо наші пакети. &lt;br&gt;
&lt;strong&gt;Node-Red&lt;/strong&gt; &lt;br&gt;
SSH: &lt;code&gt;git@gitlab.com:ubos-academy/authorization_module/authorization_nodered.git&lt;/code&gt;&lt;br&gt;
HTTPS: &lt;code&gt;https://gitlab.com/ubos-academy/authorization_module/authorization_nodered.git&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI&lt;/strong&gt;&lt;br&gt;
SSH: &lt;code&gt;git@gitlab.com:ubos-academy/authorization_module/authorization_ui.git&lt;/code&gt;&lt;br&gt;
HTTPS: &lt;code&gt;https://gitlab.com/ubos-academy/authorization_module/authorization_ui.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;!!! Важливо, після того, як імпортували до себе модуль авторизації, видалити посилання на гіт, і під'єднати свій репозиторій під проєкт. А також створити нову базу даних, і видалити стару, яка використовувалась в проєкті!!!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Admin Panel&lt;/strong&gt; &lt;br&gt;
Після імпортування пакетів, в UI та Node-red з'являться готові сторінки та APIs, опис яких наведено далі.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Modules&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Тут ми створюємо сторінки які будуть показуватись в бічній панелі. Важливо, щоб назва сторінки в модулі співпадала з назвою сторінки в UI Editor. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/fecm1rliuhbnzdnkecpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/fecm1rliuhbnzdnkecpy.png" alt="Image description" width="1451" height="828"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В Parent Modules записуємо назви сторінок які одразу видно. &lt;br&gt;
В Child Modules вказуємо назви сторінок, які будуть показуватись при наведені на батьківський елемент. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/w4hj2xjppvngf6aa0fpf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/w4hj2xjppvngf6aa0fpf.png" alt="Image description" width="361" height="285"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/2oepzbia20mhnm9rkqc8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/2oepzbia20mhnm9rkqc8.png" alt="Image description" width="396" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Admin Roles&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
 В Admin Roles ми створюємо ролі, які матимуть різний доступ до сторінок. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/62e1n5ef27l0xqjur9hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/62e1n5ef27l0xqjur9hu.png" alt="Image description" width="1324" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;На кнопку Create Role - ми створюємо назву ролі. &lt;br&gt;
На кнопку Add Permissions To Role - ми додаємо до вибраної ролі модулі. Це сторінки, які буде бачити користувач з вказаною роллю. Перед тим ми мусимо створити сторінки в Modules&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/a6h8mjvgxmgna8hzltwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/a6h8mjvgxmgna8hzltwv.png" alt="Image description" width="1124" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;User Management&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
В User Management знаходиться вся інформація про користувачів, які зареєстровані. Тут можемо створити, нового користувача. Змінити роль вже існуючому, або зовсім його видалити. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/p68rko80f586hqa7kznm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/p68rko80f586hqa7kznm.png" alt="Image description" width="1263" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Pages&lt;/strong&gt;&lt;br&gt;
Так само, модуль ще має такі сторінки: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Login&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registered&lt;/strong&gt; (відкривається після реєстрації, )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;queryToResetPassword&lt;/strong&gt; (водить імейл на скидання паролю)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Info&lt;/strong&gt; (після відправки імейлу на скидання паролю відкривається ця сторінка, що повідомлення надіслано на пошту)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ResetPassword&lt;/strong&gt; (вводиться новий пароль. Посилання на цю сторінку відправляється користувачу на пошту, яку він вів на сторінці queryToResetPassword )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PasswordChanged&lt;/strong&gt; (відкривається ця сторінка, коли користувач змінив пароль)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Налаштування&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Додавання env&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Це є аналогом звичаного env файлу. В ньому зберігаємо силки нашого нод-реду, та юайки. Бо ми силаємось не на пряму вставляючи посилання в кожен запит, а у файл env де зберігається наше посилання. За рахунок цього нам не потрібно всюди прописувати посилання, а тільки в одному місці, та всюди зсилатись на нього. &lt;/p&gt;

&lt;p&gt;В сервіс панелі(вона знаходиться ліворуч), коли наводимо на назву нашого нодреду, праворуч від назви, з'являються кнопки з додатковими опціями. Спочатку натискаємо копіювати посилання, потім натискаємо на кнопку зі знаком питання. Там в розділі env вставляємо назву нашого нодреду в noderedUrl, а юайки в uiUrl. Те саме робимо в UI Edtitor де знаходиться наша юайка. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/r36wqn1jq38recudnpn9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/r36wqn1jq38recudnpn9.png" alt="Image description" width="335" height="208"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://community.ubos.tech/uploads/articles/rgjdsgppxw35erx9l7cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/rgjdsgppxw35erx9l7cl.png" alt="Image description" width="541" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Виклик check_token&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Коли відкритий наш модуль в UI Editor. Натискаємо на кнопку налаштування проєкту. Вона знаходиться в низу з ліва. Відкривається модальне вікно з налаштуванням проєкту. В інпуті з назвою &lt;code&gt;Enter url check auth&lt;/code&gt; заміняємо url node-red на наш. &lt;br&gt;
&lt;code&gt;newURLNode-red/check_token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Як побудований захист(Access token)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Код доступу(Access token) ми зберігаємо в cookie під назвою &lt;code&gt;user_name&lt;/code&gt;. Він скаладається з ID, та імейлу користувача.&lt;/p&gt;

&lt;p&gt;В налаштуванях, нашого проєкту(де ми писали шлях до check_token), вказані сторінки до яких користувач має доступ без авторизації. &lt;br&gt;
Якщо спробувати зайти на сторіку, на яку користувач має зайти, будучи авторизованим його автоматично перенаправить на сторінку Логін, бо він має відсутній токен. &lt;/p&gt;

&lt;p&gt;Якщо токену не має, то завжди буде перенаправляти на сторінку Логін.&lt;br&gt;
Токен створюється коли користувач заходить в систему. Далі, при кожному переході між сторінками, буде перевірятись, чи час токекну не минув. Якщо минув, то користувача розлогінить. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;check_token&lt;/strong&gt;&lt;br&gt;
check_token - це флов, який декодить наш token, та повертає інформацію на його основі. Цю інформацію можно побачити, коли робимо якийсь редірект, то в панелі розробника в розділі Network, буде запит, який називаєтьтся &lt;code&gt;me&lt;/code&gt;, там в response ми зможемо побачити всю інформацію про користувавча. &lt;/p&gt;

&lt;p&gt;check_token будує наше меню, яке ми бачимо в бічній панелі. Він отримує роль користувача(кожна роль говорить, до яких сторінок можна мати доступ, та що саме на них робити). На основі цієї інформації він створює об'єкт з доступними сторінками, які повертає цей запит. А наш віджет Акрдеон(який відображає меню), чекає коли прийде ця відповідь щоб відобразити сторінки.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Глобальні змінні (storeValue)</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Tue, 22 Nov 2022 08:36:38 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/globalni-zminni-storevalue-2630</link>
      <guid>https://community.ubos.tech/daniel/globalni-zminni-storevalue-2630</guid>
      <description>&lt;p&gt;Глобальні змінні корисні тим, що вони доступна на всіх сторінках. Її дані додаються в LocalStorge браузера, внаслідок цього їх можна використовувати для обміну інформації як і між всіма сторінками, так і в межах однієї. &lt;/p&gt;

&lt;p&gt;Для прикладу створимо 3 віджети: 2 button, 1 text(щоб бачити, що в середині глобального об'єкта).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/8vdsastgiv3sryxzdtg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/8vdsastgiv3sryxzdtg1.png" alt="Image description" width="766" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;При настиканні на кнопку &lt;em&gt;Submit&lt;/em&gt;, будемо створювати об'єкт. Ми можемо в нього додавати будь-який тип та об'єм даних. Для прикладу я використаю булеан(true, false) тип. &lt;/p&gt;

&lt;p&gt;Створюємо глобальну зміну, викликаючи функцію storeValue('name', {key: value}). Де першим параметром пишемо строку, яка буде назвою глобальної змінної (за якою звертатимемось до неї). Другий параметр - це значення, яке хочемо зберегти.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/589qk6srqeg4q8txbe32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/589qk6srqeg4q8txbe32.png" alt="Image description" width="651" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;У віджеті &lt;em&gt;button _, при події _onClick&lt;/em&gt; вибираємо JS та пишемо код, в якому зберігаємо змінну з назвою example та властивістю true.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{storeValue('example', true)}}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;При натисканні на кнопку, створиться глобальна зміна. Щоб перевірити чи точно вона створилась, у віджеті текст ми виведемо її значення. Всі глобальні змінні зберігаються в об'єкті store, який знаходиться в головній змінній main (або по старому appsmith). &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/1b3owq6ubfnnfccrk9d0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/1b3owq6ubfnnfccrk9d0.png" alt="Image description" width="639" height="388"&gt;&lt;/a&gt;&lt;br&gt;
Для цього у віджеті &lt;em&gt;text&lt;/em&gt; напишемо:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{main.store.example}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Щоб перезаписати дані глобальної зміни, ми викликаємо storeValue з назвою змінної яку хочемо перезаписати. &lt;br&gt;
Ми це напишемо у другій кнопці. Замінимо значення true на false. Та натиснемо на кнопку, щоб перезаписати.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{storeValue('example', false)}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/7dcgxvbyuat4d1dgapjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/7dcgxvbyuat4d1dgapjf.png" alt="Image description" width="705" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Все, що зберігається в storeValue додається в Local Storage. Якщо відкрити DevTools в браузері, та вибрати Local Storage(він знаходиться в розділі Application), то побачимо дані які додали. &lt;/p&gt;

&lt;p&gt;Якщо хочемо, щоб Local Storage не зберігав дані при редіректі на інші сторінки, то в StoreValue третім параметром передаємо false:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storeValue("test_obj", {key: value}, false)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Варто зауважити, коли встановлюється третій параметр, його потрібно використовувати для подальших змін (оновлення значення, видалення), інакше змінна буде недоступною.&lt;/p&gt;

&lt;p&gt;Для того, щоб видалити змінну із об'єкту потрібно присвоїти їй значення "undefined"&lt;/p&gt;

&lt;p&gt;storeValue("test_obj", undefined, false).&lt;/p&gt;

</description>
      <category>storevalue</category>
    </item>
    <item>
      <title>Використання JS Object в UI Editor</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Wed, 09 Nov 2022 16:00:06 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/vikoristannia-js-object-v-ui-editor-5fgo</link>
      <guid>https://community.ubos.tech/daniel/vikoristannia-js-object-v-ui-editor-5fgo</guid>
      <description>&lt;p&gt;JS Object дає можливість використовувати дані які нам приходять на UI, не роблячи повторні запити в базу даних. В одній функції об'єднати виклик інших функцій, або створити змінні.&lt;/p&gt;

&lt;h2&gt;
  
  
  Як створити JS Object?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/y47zs90amct63szczgy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/y47zs90amct63szczgy3.png" alt="Image description" width="1073" height="535"&gt;&lt;/a&gt;&lt;br&gt;
В лівому меню вибираємо Explorer, навпроти &lt;strong&gt;API/JS&lt;/strong&gt; натискаємо плюс(+), та вибираємо в модальному вікні New JS Object. Тоді створюється наш об'єкт, де ми можемо писати данні. Для прикладу автоматично додається 4 елементи(об'єкт, масив, функція та асинхронна функція)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
    myVar1: [],
    myVar2: {},
    myFun1: () =&amp;gt; {
        //write code here
    },
    myFun2: async () =&amp;gt; {
        //use async-await or promises
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/6gn7crl51wkk34p29jrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/6gn7crl51wkk34p29jrm.png" alt="Image description" width="1692" height="878"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Основний функціонал
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Зміна назви
&lt;/h4&gt;

&lt;p&gt;Щоб змінити назву нашого JS Object, натискаємо на його ім'я з верху(JSObject1). Воно автоматично виділяється, та можемо писати нову назву латинськими літерами, потім натискаємо на клавішу Enter.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/u9hfnycvbjq5fa5g36kz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/u9hfnycvbjq5fa5g36kz.png" alt="Image description" width="871" height="495"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Налаштування асинхронних функцій
&lt;/h4&gt;

&lt;p&gt;Під назвою нашого об'єкта маємо два таби:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Code - де ми пишемо код(вибрано автоматично)&lt;/li&gt;
&lt;li&gt;Settings - де ми можемо додавати налаштування до асинхронних функцій
&lt;img src="https://community.ubos.tech/uploads/articles/ws4iheyp2e19z93jg1ll.png" alt="Image description" width="1202" height="684"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Вона має три основні налаштування:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RUN ON PAGE LOAD - запускає функцію, коли сторінка починає завантажуватись(наприклад, використовуємо коли хочемо, щоб дані показало одразу, як тільки сторінка завантажилась, а не починали виконання після повної завантаження сторінки)&lt;/li&gt;
&lt;li&gt;RUN ON PAGE CLOSE - запускає функцію при закритті сторінки (наприклад, використовуємо коли хочемо почистити якісь дані)&lt;/li&gt;
&lt;li&gt;CONFIRM BEFORE CALLING&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Виклик функції
&lt;/h4&gt;

&lt;p&gt;Щоб перевірити чи коректна відпрацьовує функція, ми можемо її запустити. Щоб побачити результат(в Response) вона має щось повертати(написати return).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
    myVar1: [],
    myVar2: {},
    myFun1: () =&amp;gt; {
        return {
            text: 'All good!'
        }
    },
    myFun2: async () =&amp;gt; {
        //use async-await or promises
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/qk2m1paqzv9gippjfhuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/qk2m1paqzv9gippjfhuy.png" alt="Image description" width="666" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Якщо навести на назву функції, зліва від назви, з'явиться червоний трикутник. При натисканні на нього наша функція виконується, та знизу в Response видно результат виклику. &lt;br&gt;
Або. &lt;br&gt;
В правому верхньому куті, є інпут, якщо на нього натиснути, там з'являться всі функції які присутні в нашому об'єкті. Вибираємо потрібний елемент, та натискаємо на кнопку Run. Вибрана функція так само виконується, та відповідь видно з низу в Response.&lt;/p&gt;
&lt;h2&gt;
  
  
  Приклади використання
&lt;/h2&gt;
&lt;h4&gt;
  
  
  On Page Load
&lt;/h4&gt;

&lt;p&gt;Створюю асинхронну функцію(initValue), та вмикаю в ній метод OnPageLoad. В ній ми викликаємо &lt;a href="https://community.ubos.tech/daniel/globalni-zminni-storevalue-2630"&gt;глобальні змінні&lt;/a&gt;. Так, після завантаження сторінки матимемо дані, в наших &lt;a href="https://community.ubos.tech/daniel/globalni-zminni-storevalue-2630"&gt;глобальних змінних&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default {
    myVar1: [],
    myVar2: {},
    myFun1: () =&amp;gt; {
        return {
            text: 'All good!'
        }
    },
    initValue: async () =&amp;gt; {
        await storeValue("InitMapData", {name: 'User'});
        await storeValue("filterByCategroy", false);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Загальна інформація
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Якщо написати console.log в JS Object, то він буде з'являтись в консолі браузера&lt;/li&gt;
&lt;li&gt;Якщо весь об'єкт підсвічується червоним, це означає, що допустили десь помилку при написанні.&lt;/li&gt;
&lt;li&gt;Щоб звернутись до даних в середині нашого JS Object ми можемо зробити це через this. Наприклад: this.initValue(). &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>storevalue</category>
    </item>
    <item>
      <title>Додаємо данні .csv файлу в postgresql</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Sun, 09 Oct 2022 20:13:55 +0000</pubDate>
      <link>https://community.ubos.tech/daniel/dodaiemo-danni-csv-failu-v-postgresql-28i3</link>
      <guid>https://community.ubos.tech/daniel/dodaiemo-danni-csv-failu-v-postgresql-28i3</guid>
      <description>&lt;p&gt;Щоб не додавати дані самостійно, ми можемо взяти готовий файл з даними(.csv), та імпортувати це в нашу таблицю. &lt;/p&gt;

&lt;h2&gt;
  
  
  NodeRed
&lt;/h2&gt;

&lt;p&gt;На початку, в середовищі NodeRed, встановлюємо пакет під назвою "node-red-contrib-re-postgres". Надалі, потрібно створити такі вузли: http-in &amp;gt; function &amp;gt; base64 &amp;gt; function &amp;gt; csv &amp;gt; function &amp;gt; postgres(з'являється в наслідок завантаженого пакету) &amp;gt; http-response. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/3oihrheeuyu4derl56bl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/3oihrheeuyu4derl56bl.png" alt="Image description" width="990" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;В http-in вибираємо метод POST, та відмічаємо Accept file uploads. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/y3canrj0e3k570g4zddg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/y3canrj0e3k570g4zddg.png" alt="Image description" width="615" height="532"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;У функції пишемо код, який записаний на малюнку. Оскільки нам приходить масив, вибираємо перший елемент(&lt;em&gt;[0]&lt;/em&gt;), бо це той файл який ми завантажуємо. Перетворюємо дані на строку, та методом slice  вирізаємо інформацію яке несе тип файлу, залишаючи тільки закодовані данні.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/dafannx3xnwhrx2ce9w6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/dafannx3xnwhrx2ce9w6.png" alt="Image description" width="1046" height="833"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Вибираємо вузол Base64, у властивостях дописуємо payload, та вибираємо дію ConvertBuffer&amp;lt;-&amp;gt;Base64&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/vtqc1sk230qjdvppfans.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/vtqc1sk230qjdvppfans.png" alt="Image description" width="891" height="702"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;В наступному вузлі(це function), те що приходить після Base64 перетворюємо на строку&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/wows1mbruz950171kza0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/wows1mbruz950171kza0.png" alt="Image description" width="925" height="612"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Та передаємо до вузла csv.В результаті чого, ми отримаємо на виході json дані які можемо передати в таблицю.&lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/2imm53dcpehrw0fhkl3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/2imm53dcpehrw0fhkl3l.png" alt="Image description" width="836" height="728"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Формуємо запит для нашого postgresql. Щоб передати всі данні з нашого файлу в таблицю, ми створюємо велику строку з цими даними, аби покласти їх як значення в запитиі до таблиці. Важливий момент, оскільки postgresql має строгу типізацію, порядковість написання даних має значення. Отже, назва значення стовбця має мати в запиті таку ж порядковість, як і сам стовбець. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/dllobom37o4y7t1ptpji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/dllobom37o4y7t1ptpji.png" alt="Image description" width="1145" height="845"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Далі вибираємо наш вузол postgresql, в ньому потрібно вказати нашу  базу дaних яку створили, та відмітити &lt;strong&gt;Receive query output&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/xw22dnngcx6785bzkf33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/xw22dnngcx6785bzkf33.png" alt="Image description" width="879" height="714"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;І в кінці додаємо наш http-response&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  UI
&lt;/h2&gt;

&lt;p&gt;На UI додаємо віджет FILEPICKER, та в його налаштуванні вибираємо формати(Data Format) - Base64. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.ubos.tech/uploads/articles/8gpp9ub2d09mbomo7dh1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/8gpp9ub2d09mbomo7dh1.png" alt="Image description" width="1635" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Далі створюємо наш API запит. Там де з права вибирали віджети натискаємо Explorer &amp;gt; Біля API/JS натискаємо на полюс &amp;gt; Вибираємо New Blank API &amp;gt; відкривається вікно з заповненням наших даних для запиту. Записуємо все, згідно того, що на фото &lt;br&gt;
&lt;a href="https://community.ubos.tech/uploads/articles/7xhb42jv9lxqw28ew35e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://community.ubos.tech/uploads/articles/7xhb42jv9lxqw28ew35e.png" alt="Image description" width="1370" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Коли данні заповнили, згідно того, що на фото, можемо натискати на створений Filepicker, та завантажувати наш csv файл. Так данні, які були у файлі додаються в БД. &lt;/p&gt;

&lt;p&gt;Надалі, щоб метод завантаження був універсальним, створюємо примітку в якій буде вказана інформація як має виглядати .csv файл. Там буде записано бажаний розмір файлу, та колонки які мусять бути в таблиці, щоб користуватись даним функціоналом. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
