<?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>DEV Community: JavaScript-Webix-UI</title>
    <description>The latest articles on DEV Community by JavaScript-Webix-UI (@webixui).</description>
    <link>https://dev.to/webixui</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F188678%2Fca84f211-ebe3-4707-8a6f-10df704b99a1.png</url>
      <title>DEV Community: JavaScript-Webix-UI</title>
      <link>https://dev.to/webixui</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webixui"/>
    <language>en</language>
    <item>
      <title>What To Look For When Choosing the Right JavaScript Library</title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Wed, 28 Sep 2022 12:44:57 +0000</pubDate>
      <link>https://dev.to/webixui/what-to-look-for-when-choosing-the-right-javascript-library-4n6l</link>
      <guid>https://dev.to/webixui/what-to-look-for-when-choosing-the-right-javascript-library-4n6l</guid>
      <description>&lt;p&gt;Choosing the right JavaScript library is crucial, especially early in a project. Otherwise, there is a big chance you spend a lot of time cleaning up the mess later. But how to know which one is best?&lt;/p&gt;

&lt;p&gt;In web development, there isn't always a single "best choice." However, there are usually better options than others, and considering the following factors might assist you in making the right decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Widespread usage
&lt;/h2&gt;

&lt;p&gt;Libraries and frameworks that are widely used provide access to a lot of tutorials, courses and discussions about best practices, how-tos, and blogs. Widely used libraries and frameworks would also make it easier to find developers with the necessary experience. In addition, many developers would be eager to work for your business and gain experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detailed documentation
&lt;/h2&gt;

&lt;p&gt;A good documentation makes the library easy to use and helps avoid wasting time. Libraries with straightforward and understandable APIs can get by with little documentation. But complex libraries with difficult concepts require in-depth explanations, examples, and tutorials. You can get started more quickly if you refer to the documentation, which may even include sample code. &lt;/p&gt;

&lt;h2&gt;
  
  
  Development activity
&lt;/h2&gt;

&lt;p&gt;Active development ensures that any bugs are immediately rectified, and new functionality is added to projects. Check the date in their changelog to see how recently the library was updated. If the library is published in an open source repository like GitHub and there isn't a changelog, you can look for the most recent commit date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Active community
&lt;/h2&gt;

&lt;p&gt;A big user base may increase the likelihood that bugs will be found quickly and frequently. More external contributors to the library or framework may result from an active community. They may assist in delivering features that would not normally be on the author's plan. It could also mean the addition of more courses, videos, courses, manuals, and tutorials on the relevant library or framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser support
&lt;/h2&gt;

&lt;p&gt;Verify that a library supports each of the browsers you choose. Many libraries these days purposely don't support earlier browsers’ versions, which your website may need to support, because they are exclusively meant to be lightweight. If the UI component from a library is ever used by your users on a mobile browser, it needs to function properly for them there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples of powerful JS libraries, that fit most of the criteria
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Webix JavaScript UI library
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o_yjkk3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l6m39tyg9l2ngffnojmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o_yjkk3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l6m39tyg9l2ngffnojmo.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
The library provides more than 100 widgets and components for building desktop, mobile, and web applications. There are also 13 complex widgets that can function as standalone programs. All of them are adaptable, interact with other famous frameworks, and work with modern browsers and devices. Before making a choice, developers can weigh all the advantages and disadvantages of the software during the free trial period.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kendo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AmN9QBbI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c0e9b52z82ez12el8tbo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AmN9QBbI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c0e9b52z82ez12el8tbo.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
Kendo UI is a set of four JavaScript UI libraries built for jQuery, Angular, React, and Vue. You can quickly incorporate powerful JavaScript components into your existing or new projects. With just a few lines of code, you can easily add complex elements like data grids, charts, schedulers, and calendars.&lt;/p&gt;

&lt;h3&gt;
  
  
  Underscore.js
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oiXYKdcs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mbz69s4q6h4ovg4748h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oiXYKdcs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mbz69s4q6h4ovg4748h.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
A powerful library with useful functions for numerous programming tasks. More than 100 functions are available, including general ones like map, filter, and invoke as well as more specialized ones like those for function binding, deep equality testing, building indexes, and JavaScript templating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sencha
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oMSHsgps--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsjpjje4w74am1i5bghg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oMSHsgps--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsjpjje4w74am1i5bghg.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
Ext JS comes with more than 140 tested and pre-integrated high-performance UI components. You can speed up web application development with the help of this framework, designed for easy integration. There are also countless user add-ons available from the Sencha community.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backbone.js
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m0veaJm0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4huz0udlbwnfjxicddts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m0veaJm0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4huz0udlbwnfjxicddts.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
A lightweight JavaScript library makes it possible to create and organize client-side web applications. Various building components, including models, views, events, routers, and collections, are provided by BackboneJS. It is an open-source, free library with more than 100 available extensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The selection of a library to enhance the development team's tools is not a simple task. Therefore, it is essential to choose the framework carefully and to involve developers in the process. The key points we mentioned in the article may help when you next choose a library or framework to use.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>5 Essential JavaScript Widgets for Effective Developers</title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Mon, 12 Sep 2022 13:38:30 +0000</pubDate>
      <link>https://dev.to/webixui/5-essential-javascript-widgets-for-effective-developers-3cga</link>
      <guid>https://dev.to/webixui/5-essential-javascript-widgets-for-effective-developers-3cga</guid>
      <description>&lt;p&gt;Over the past years, the demands placed on front-end developers have grown rapidly to the point where JavaScript codebases are getting increasingly complex. It gets harder to reason about a piece of software as it gets more complicated.&lt;/p&gt;

&lt;p&gt;This is where complex widgets come for help. These components allow building high-performance web applications and help accomplish a variety of tasks – make complex calculations, create interactive reports, manage workflow, and perform advanced data filtering.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/filemanager/"&gt;JavaScript File Manager&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nLay5BBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7j3jjb5nh516nwn3rds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nLay5BBn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7j3jjb5nh516nwn3rds.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a pre-made solution that can be incorporated into any web application. The JavaScript File Manager has all the tools required to work with lists of items, including table and tile views, sorting, and searching. Additionally, this widget features a double panels view for working with files in the traditional manner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognizable file-management interface with a split panel, previewing, and a file catalog tree, table, and tile arrangement.&lt;/li&gt;
&lt;li&gt;Simple file and folder name navigation and search.&lt;/li&gt;
&lt;li&gt;A built-in upload manager, the ability to download and upload files with a single click or using drag-and-drop.&lt;/li&gt;
&lt;li&gt;Efficient work with two folders in the Total commander style.&lt;/li&gt;
&lt;li&gt;Text and media file previews are available both in the preview panel and for large tiles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/spreadsheet/"&gt;JavaScript Spreadsheet&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NfXf28lY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h46gbj26q3dcq3qc3ewd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NfXf28lY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h46gbj26q3dcq3qc3ewd.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This web widget that may be customized and has all the capabilities of spreadsheets in the Excel format. There are all the standard Excel features available: formulas and math, sorting and filtering, editing, and numerous data types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export data to Excel, PDF, or PNG files and import Excel documents into web SpreadSheet.&lt;/li&gt;
&lt;li&gt;Add a formula editor, subbars, menus, and change the number of columns and rows by modifying the customizable SpreadSheet UI.&lt;/li&gt;
&lt;li&gt;Dates, numbers, monetary units, and text labels are localized to follow the laws of specific countries.&lt;/li&gt;
&lt;li&gt;To add more functionality, use the popups, dialogs, and other Webix UI library elements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/kanban/"&gt;JavaScript Kanban&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mZtpACJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ju2ze7itgwhkiafy46f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mZtpACJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ju2ze7itgwhkiafy46f.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any project management tool can incorporate this ready-made JavaScript component. It allows users to take full control of their workload and effectively manage tasks. This advanced widget also aids in speeding up design and development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compact and functional design makes it easy to visualize the working process.&lt;/li&gt;
&lt;li&gt;Add text, tag, and attachments, change the color, status, and performer for cards.&lt;/li&gt;
&lt;li&gt;Simply move task cards between the columns and add comments to the tasks.&lt;/li&gt;
&lt;li&gt;The component renders with lightning speed and is written entirely in JavaScript.&lt;/li&gt;
&lt;li&gt;All components can be changed using the API, without editing anything in the source code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/scheduler/"&gt;JavaScript Scheduler&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KwfcISec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xhtawhtcx15tyuf1111.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KwfcISec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xhtawhtcx15tyuf1111.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Web calendar that can be integrated into any business application. This solution can be used to plan events, schedule meetings, book items, and more. Because Scheduler is designed as a web widget, you may incorporate it into any browser-based solution, including websites, IoT panels, and single-page apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiling events from various calendars or other sources, then setting up the display of those events for the chosen group.&lt;/li&gt;
&lt;li&gt;Each day is divided into a number of vertical sections, where the events are shown one after the other.&lt;/li&gt;
&lt;li&gt;Timeline can be shown in three modes: day, week, month.&lt;/li&gt;
&lt;li&gt;Adding unique features to events by selecting color schemes, creating recurrent activities, and segmenting a given day's schedule into specific time slots.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/widgets/chat-messenger/"&gt;Webix Chat / Messenger&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--StnKFCCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcvckgrvhee7g10o5crv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--StnKFCCz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcvckgrvhee7g10o5crv.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the ability to manage the contact list and the chat's appearance, JavaScript Chat allows the creation of chat rooms with several users. You can download and add Webix's JS complex widget, which combines Chat and Messenger functionalities, to your business application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Possibility to message multiple users.&lt;/li&gt;
&lt;li&gt;Searching and selecting chat channel contacts.&lt;/li&gt;
&lt;li&gt;Communication via audio and video calls.&lt;/li&gt;
&lt;li&gt;Sharing files with each other as well as downloading them.&lt;/li&gt;
&lt;li&gt;Selecting the channel's icon and entering the chat's name.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Complex widgets are easy to configure, integrate and customize for different purposes and specific apps. All of them operate perfectly in the Angular or React environment and have thoroughly documented the API, backend service and methods so that you can connect any back-end.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Project Resource Management: When? Why? What?</title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Wed, 23 Feb 2022 11:37:14 +0000</pubDate>
      <link>https://dev.to/webixui/project-resource-management-when-why-what-41c</link>
      <guid>https://dev.to/webixui/project-resource-management-when-why-what-41c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jPPFCpGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5bmqh404pbqvnf08t4x3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jPPFCpGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5bmqh404pbqvnf08t4x3.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
When you start a project, you think about the aim of it, about the developers who will implement your idea, and about the money that you will need to invest. As a rule, a start-up is a small team, where all the processes happen intuitively without any additional tools because you can't spend extra money and also because everything does work well. &lt;/p&gt;

&lt;p&gt;When the project starts growing it is impossible to keep everything in mind, at the same time, making notes on paper is not effective. This is the time when you may consider using some additional tools to help you with the workload and to manage your resources. In this article, we will focus on the idea of resource management. We will try to understand what it is, why it is useful, and we will also define the best solutions from the JavaScript resource management components that exist today and that your project can benefit from. So, look through the text to find the part you need or read it all if you are not sure if you know what we are talking about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources you need to manage
&lt;/h2&gt;

&lt;p&gt;Resources are all the things the team needs to implement the project. If you are dealing with e-commerce, your resources are the goods in stock, transport for the delivery, couriers, software. If your business is event management, you probably need catering services, music equipment, contacts of available venues. Thus, resource management is the process of planning your business, allocating tasks between team members, and tracking the implementation of all the activities. The better you organize your resources, the higher the performance will be. People will know what you expect them to do, they will be motivated and focused. And of course, the resource management process is a must for a big team. You can't individually talk to each person if you have 100 people on staff. So, it is more convenient to have a special tool with an opportunity to visualize the tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of the resource management tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Project management&lt;/strong&gt;&lt;br&gt;
It doesn't matter how big or small your company is. Resource management tools will allow the business to carefully monitor each step in the strategy of further development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transparency of the processes&lt;/strong&gt;&lt;br&gt;
When your operations are transparent, the team members know their workload, they are not stressed. Besides, customers are aware of the progress, other teams may ask for support, and the general goal is clear and manageable. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Team motivation&lt;/strong&gt;&lt;br&gt;
We all enjoy pleasant working conditions. When we know our tasks ahead, we can be relaxed and we know what to expect from the next working day. It contributes to work satisfaction and employees are glad to be of service. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decreasing risks&lt;/strong&gt;&lt;br&gt;
Thorough resource allocation and exploitation lead to minimizing risks in the future. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Return on investment assessment&lt;/strong&gt;&lt;br&gt;
When you know what you need and you know when you will need more, it provides you with the vision in the long-term perspective. Thus, you can predict the time when your investment will pay out.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resource management JS components
&lt;/h2&gt;

&lt;p&gt;We now move on from theory to practice. Let's explore the features of the tools that are offered today and have high users ratings. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/gantt/"&gt;Webix Gantt Chart&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HOOddwxY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn26twumwjuz8dw8v1wv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HOOddwxY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn26twumwjuz8dw8v1wv.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
The Gantt Chart widget is a complex widget from the Webix UI library. Complex widgets are complete single-page applications, that developers can use independently or build into the environment of their system. All Webix widgets comply with any modern browsers and devices and integrate with Angular, React, Vue. The library is regularly updated and new features become available to users holding a license. &lt;br&gt;
Features of the Gantt Chart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  viewing, creating, editing tasks&lt;/li&gt;
&lt;li&gt;  tasks allocation and resources assignment&lt;/li&gt;
&lt;li&gt;  marking the start and end of the task&lt;/li&gt;
&lt;li&gt;  critical path mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://webix.com/kanban/"&gt;Webix Kanban JS&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--02ibMmt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sk7gw5ruzn3nbh6vglwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--02ibMmt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sk7gw5ruzn3nbh6vglwr.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
This is one more complex widget of the Webix UI library that is successfully used by the developers in their projects. Kanban is a task management board, it is probably a simpler solution in comparison with Gantt, but it still copes with tasks allocation perfectly well. A custom pack of the available license plans allows users to choose the widgets they would like to have. A free trial period is also available.&lt;br&gt;
Features of the Kanban widget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  cards with tasks&lt;/li&gt;
&lt;li&gt;  commenting tasks&lt;/li&gt;
&lt;li&gt;  drag-n-drop&lt;/li&gt;
&lt;li&gt;  compact view mode&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ganttpro.com/"&gt;GanttPro&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y5l-HATR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trkdjrjhznfp2x9kfdzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y5l-HATR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trkdjrjhznfp2x9kfdzv.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
This is a powerful solution that includes not only the functionality of a resource management tool. It is a complete online platform that contains solutions for team cooperation, budget tracking, time management, resource management, and others. A free trial period and fast registration on the platform allow users to start benefiting from the solution in just 3 minutes.&lt;br&gt;
Features of GanttPro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  saved history of the project&lt;/li&gt;
&lt;li&gt;  setting roles and calendars for team members&lt;/li&gt;
&lt;li&gt;  managing the workload of the resources&lt;/li&gt;
&lt;li&gt;  various access permission rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.bryntum.com/products/scheduler-pro/"&gt;Bryntum Scheduler Pro&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OfdA7dD0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hx6q02w8uvpc60n587va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OfdA7dD0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hx6q02w8uvpc60n587va.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
Another JS component that integrates with any popular modern framework. Web components from Bryntum are supported with detailed documentation, a blog, and a trial period. Scheduler differs from Gantt or Kanban but it also allows to arrange the tasks depending on the availability of resources. &lt;br&gt;
Features of Scheduler Pro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  tasks links and connectors&lt;/li&gt;
&lt;li&gt;  customized styling&lt;/li&gt;
&lt;li&gt;  highlighting overloading&lt;/li&gt;
&lt;li&gt;  synchronized resources shifts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.syncfusion.com/javascript-ui-controls/js-gantt-chart"&gt;Syncfusion Gantt Chart&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6io-2pZn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6whlmykm0kvw1v8kgcnt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6io-2pZn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6whlmykm0kvw1v8kgcnt.png" alt="Image description" width="760" height="355"&gt;&lt;/a&gt;&lt;br&gt;
Syncfusion offers a wide range of components for creating web, mobile, and desktop applications. Besides the components, they also provide users with a developer, analytics, and reporting platforms that comprise many useful tools and serve as a powerful support for the team.&lt;br&gt;
Features of the Gantt Chart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  binding various formats of data &lt;/li&gt;
&lt;li&gt;  different timeline views&lt;/li&gt;
&lt;li&gt;  tasks dependencies&lt;/li&gt;
&lt;li&gt;  filtering and sorting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Resource management tools are useful components that facilitate working processes and increase the general performance of the team. Those components take over a significant part of the tasks, letting the team leads and project managers concentrate on more challenging issues. With a resource management solution, the daily routine activities will be monitored resulting in continuous progress and employees satisfaction.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>management</category>
    </item>
    <item>
      <title>How to Create a Simple Web App Using JavaScript UI Library
</title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Wed, 30 Jun 2021 09:48:26 +0000</pubDate>
      <link>https://dev.to/webixui/how-to-create-a-simple-web-app-using-javascript-ui-library-291g</link>
      <guid>https://dev.to/webixui/how-to-create-a-simple-web-app-using-javascript-ui-library-291g</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--INjoFuP5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lybm5a7wzsy2wn12hw8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--INjoFuP5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lybm5a7wzsy2wn12hw8o.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
JavaScript was designed for developing simple web applications with interactive interfaces. So far, it has become a highly demanded skill among programmers as it can create rather complex solutions with a limited number of code lines. Together with HTML and CSS, JS has proved to be a powerful programming language. While HTML deals with the structure and contents of the application, CSS is responsible for the style, JavaScript deals with the following tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactivity.&lt;/strong&gt; When we open up a site, all the buttons respond to our actions, the fields are validated and the pictures slide. All those activities are possible due to JS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation.&lt;/strong&gt; You are creative, and you want your site to grab users' attention at first sight. JavaScript is there for you. With modern frameworks and libraries, such as &lt;a href="https://github.com/mrdoob/three.js/"&gt;Three.js&lt;/a&gt;,&lt;a href="https://github.com/juliangarnier/anime"&gt;Anime.js&lt;/a&gt;,&lt;a href="https://github.com/mojs/mojs"&gt;Mo.js&lt;/a&gt; any imaginable animation is possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games.&lt;/strong&gt; JavaScript is probably not the best tool when it comes to the gaming industry. But it can be successfully used for something simple or as a learning tool for those who are into game development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why use a JS UI library?
&lt;/h2&gt;

&lt;p&gt;JavaScript UI library is a set of tools and components that can be used as ready-made pieces in the development process. Such an approach shortens the time on the development, as you do not need to create everything from scratch. Besides, it is convenient if you want to show the prototype of the future project to your clients. JS libraries provide junior developers with a learning tool. They gain experience by studying the principles of building apps with ready-made widgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create an app?
&lt;/h2&gt;

&lt;p&gt;There is a wide variety of JS libraries on the market. Some of them are more well-known, like &lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt; or &lt;a href="https://jquery.com/"&gt;jQuery&lt;/a&gt;, others are less popular but not less productive, such as &lt;a href="https://webix.com/"&gt;Webix&lt;/a&gt;. Let's briefly outline the steps of creating a simple web app with a JS library:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; The first step will be to define what app you need. Is it a messenger tool or an app for tracking someone's progress, or a simple project management solution?&lt;/li&gt;
&lt;li&gt; The second step will be to set up the budget. Whether you prefer to rely on an open space solution or you have a sum that you are ready to invest into your project. The first option leads to much independent work. You might have a difficult time trying to figure out how things should best work for you. If you opt for buying a license, that will guarantee technical support, detailed documentation, and probably some mentoring from the side of the developers. Everything depends on the product and you'd better choose the one that is regularly updated.&lt;/li&gt;
&lt;li&gt; The third step is the most interesting one. Get started and fire away. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since there is enough information on the web about open-source solutions, let's look at the library which is less popular but surely worthy of attention. &lt;a href="https://webix.com/"&gt;Webix UI library&lt;/a&gt; has gained 4.8 out of 5 on &lt;a href="https://www.capterra.com/p/180989/Webix/"&gt;Capterra&lt;/a&gt;. The library has been developed by &lt;a href="https://xbsoftware.com/"&gt;XB Software &lt;/a&gt; since 2008. It is regularly updated, there is a blog with lots of &lt;a href="https://blog.webix.com/tag/showcase/"&gt;reviews&lt;/a&gt;  of the users. Many of them note the responsive support, the convenience of outsourcing services, and the speed and ease of building apps with the help of the &lt;a href="https://webix.com/widget/complex-widgets/"&gt;Webix complex widgets&lt;/a&gt;. The downsides of the library mentioned are the documentation which is quite restricted and the lack of examples of combining Webix with TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the apps easy to create?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  If you need to deal with data, folders, and documents, you will benefit from the &lt;a href="https://webix.com/filemanager/"&gt;File Manager&lt;/a&gt; or &lt;a href="https://webix.com/widgets/document-manager/"&gt;Document Manager&lt;/a&gt; widgets.&lt;/li&gt;
&lt;li&gt;  If you are interested in project management, the &lt;a href="https://webix.com/kanban/"&gt;Kanban&lt;/a&gt; widget will be handy.&lt;/li&gt;
&lt;li&gt;  Webix &lt;a href="https://webix.com/scheduler/"&gt;Scheduler&lt;/a&gt; will help to develop a simple event calendar, that will be compatible with mobile devices.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://webix.com/widgets/chat-messenger/"&gt;Chat&lt;/a&gt; widget is a tool for the messenger application.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The purpose of any JS library is to make the life of a developer easier. Webix UI library successfully copes with this task. The number of tools ready to be used is staggering, the Webix team does its best to improve and to enhance their offspring. In general, the JavaScript language has gained a stable position in the IT development process and it will continue supporting its reputation with the help of libraries and frameworks that are designed to help programmers.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>10 Helpful JavaScript Demos for your Business </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Thu, 25 Mar 2021 12:24:02 +0000</pubDate>
      <link>https://dev.to/webixui/10-helpful-javascript-demos-for-your-business-17o6</link>
      <guid>https://dev.to/webixui/10-helpful-javascript-demos-for-your-business-17o6</guid>
      <description>&lt;p&gt;There are two ways we can understand the word demo in the IT development. It may be a meeting with the team and the stakeholders to review the sprint in the Scrum methodology. It may also be understood as an example of the product given to a potential customer to attract their attention and check if they need the product and ready to pay for it. In both meanings we talk about some small result of the development process that is used as an example and that can show what the future solution will be capable of.  &lt;/p&gt;

&lt;p&gt;Using demos in the development process is an effective idea for several reasons: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customers see the future product, they know what to expect; &lt;/li&gt;
&lt;li&gt;the time for the design customization is saved; &lt;/li&gt;
&lt;li&gt;demos teach customers how to interact with the future application. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this review, we will focus on the most common types of web apps and resources to find suitable demos for them. &lt;/p&gt;

&lt;h2&gt;
  
  
  Dealing with files
&lt;/h2&gt;

&lt;p&gt;There is a wide choice of JavaScript libraries and frameworks  that offer tools for creating file manager applications for uploading, organizing, and previewing files. Business domain is not limited to any specific topic, as any business needs documents and convenient tools for coping with their flow. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JavaScript/HTML5 File Manager&lt;/strong&gt; – &lt;a href="https://dhtmlx.com/docs/products/demoApps/dhtmlxFileExplorerDemo/" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
The following components are used: DataView, Grid, Form, Layout, Menu, Popup, Tabbar, Toolbar, Tree, and Window. The features include uploading and downloading files, creating and deleting folders, grid and list preview modes, sorting and searching files, and keeping track of the space left. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkl6bmh1p9h5r7pvtjfrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkl6bmh1p9h5r7pvtjfrc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webix JS File Manager&lt;/strong&gt; – &lt;a href="https://webix.com/demos/filemanager/#!/files" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
This solution includes additional advanced features, such as cards view, split panels view, and media files playback. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1470lsbzwxrn70nszd11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1470lsbzwxrn70nszd11.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Syncfusion File Manager&lt;/strong&gt; – &lt;a href="https://ej2.syncfusion.com/demos/?&amp;amp;_ga=2.146320500.170773157.1596543847-2078902428.1584440001#/material/file-manager/overview.html" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
It contains built-in searching functionality with which users can search for an item in the current path and its child folder. Besides, features include ascending and descending search order by the name, size, and date, built-in drag-n-drop and multi-item selection.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficz9v0ud7jehqxtlj558.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficz9v0ud7jehqxtlj558.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Online communication
&lt;/h2&gt;

&lt;p&gt;With the Corona virus people spend much time at home, so it should be easy for them to solve any issue online. The following JS libraries and frameworks offer an opportunity of online chat or messenger. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TalkJS&lt;/strong&gt; – &lt;a href="https://talkjs.com/demo/#/?chat_ui_mode=inbox&amp;amp;conversation_id=_et4wgydu9" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
This real time messaging solution has the following features: channels, groups, and topics, presence, typing, and read indicators, translation, file and location sharing, emojis and text formatting. The UI is pre-built and highly customizable. TalkJS can also boast a robust notification system, that supports push, email, SMS, and desktop notifications. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob34bgzl5hkojkuvinz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fob34bgzl5hkojkuvinz7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webix JS Chat&lt;/strong&gt; – &lt;a href="https://webix.com/demos/chat-messenger/" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
The solution includes chat and messenger functionalities. It offers chat rooms, managing channels, and a list of contacts. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkya5mseo64ykn8fncof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkya5mseo64ykn8fncof.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hotel management
&lt;/h2&gt;

&lt;p&gt;The requirements for the solutions in the domain of hospitality business are quite common. They include booking tickets, rooms, car rentals, online communication. Here is a list of popular demos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DHTMLX JS Scheduler&lt;/strong&gt; - &lt;a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/" rel="noopener noreferrer"&gt;go to the site&lt;/a&gt; &lt;br&gt;
This is a Google-like calendar component with 10 views for booking appointments. The demo of the hotel reservation can be seen &lt;a href="https://dhtmlx.com/docs/products/demoApps/room-reservation-html5-js-php/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. It includes room types filtering, different statuses for the rooms and booking, drag-n-drop. Car rental demo is also &lt;a href="https://dhtmlx.com/docs/products/demoApps/car-rental-html5-js-php/" rel="noopener noreferrer"&gt;shown&lt;/a&gt;. The features are similar. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlhealqca1pfkoww6n1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlhealqca1pfkoww6n1r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webix Booking App&lt;/strong&gt; – &lt;a href="https://webix.com/demos/booking-app/#!/top/specialoffers" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
This widget allows everything mentioned: search tickets, book rooms, and rent cars. It supports all browsers, can be integrated with jQuery, Angular, React, Vue.js, and Backbone. The widget is easily customizable. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvpbcrk2l7wqz3yplu6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvpbcrk2l7wqz3yplu6k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DayPilot Hotel Room Booking&lt;/strong&gt; – &lt;a href="https://code.daypilot.org/27453/html5-hotel-room-booking-javascript-php" rel="noopener noreferrer"&gt;code tutorial&lt;/a&gt; &lt;br&gt;
You can create a simple JS booking system with this tool. The features include drag-n-drop, filters, and statuses. The demo is configurable with a DayPilot JS API. The appearance may also be modified using the default theme or custom CSS classes. This app can be used with Angular, React, Vue.js, and jQuery. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyxbcnl4sdfbfr1ij5i6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqyxbcnl4sdfbfr1ij5i6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hospital management
&lt;/h2&gt;

&lt;p&gt;Another trend of the previous year that is going to stay with us for quite some time is online medical service. Social distancing led to the outbreak of various services provided with no contacts. The doctor's help is one of them. Study the list of the helpful demos in this sphere: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bayanno Hospital Management System&lt;/strong&gt; – &lt;a href="https://creativeitem.com/demo/bayanno/index.php/login" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
Features include appointment module, accounting, staff management, medication management, and other necessary functions for the whole hospital operating. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2y9rg84lc9dj66d19f1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2y9rg84lc9dj66d19f1t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DXTMLX JS Hospital Management System&lt;/strong&gt; – &lt;a href="https://dhtmlx.com/docs/products/demoApps/dhtmlxHospital/#patients" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
The system is built with Suite components: TreeGrid, DatePicker, Tabbar, Layout, Form, and ComboBox. The demo app contains an org chart to visualize a hospital management hierarchy. Advanced features include hospital bed allocation, patient admission, sorting, and filtering. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firuigxftxme3wel5qwuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firuigxftxme3wel5qwuh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webix JS Appointment App&lt;/strong&gt; – &lt;a href="https://webix.com/demos/doctor-appointment/#!/top/dashboard" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
This is a template for recording appointments. It can be successfully used in the medical domain for registration, record keeping, and tracking of upcoming visits. Features include registration of visitors, managing the list of visitors, visitor cards record, experts' profiles. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy17g34k81q39maw00978.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy17g34k81q39maw00978.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Online education
&lt;/h2&gt;

&lt;p&gt;This is a domain that unites teachers and students, includes tutoring services, webinars, and various online platforms for conducting seminars and workshops. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Online Exam Management&lt;/strong&gt; – &lt;a href="http://demo.weblizar.com/online-exam-management/" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
This is a WordPress plugin to create and manage online exams for students and publish exam results. You can create exams, set exam centers, duration, date, and start time, as well as setting the tasks of the exam with the desired question types. Manage students and assign roll numbers to each student. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6tck0mburv64gyuutrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6tck0mburv64gyuutrt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DHTMLX Online Exam System&lt;/strong&gt; – &lt;a href="https://dhtmlx.com/docs/products/demoApps/dhtmlxExam/#exams" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
The solution includes scheduling exams, forms for online examination, picking exam dates, exam filters. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqclvrvnclermxqs0fs6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqclvrvnclermxqs0fs6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Webix Student/Teachers Dashboard JS&lt;/strong&gt; – &lt;a href="https://webix.com/demos/student-dashboard/" rel="noopener noreferrer"&gt;view demo&lt;/a&gt; &lt;br&gt;
The dashboard allows teachers to keep records of achievements, track the average student score, compare grades. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa30u9lvwdgbumf5rbze1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa30u9lvwdgbumf5rbze1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow-up
&lt;/h2&gt;

&lt;p&gt;There is a wide choice of various solutions, plugins, and open-source codes to implement one of the ideas mentioned. We have focused on the most convenient ways, keeping in mind the variety of the functions in demand. There are libraries on the market that can implement any of the sophisticated start-up ideas. So the choice depends on the performance required and available resources.  &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TOP 6 Business application features of Webix UI Framework </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Tue, 25 Aug 2020 19:31:29 +0000</pubDate>
      <link>https://dev.to/webixui/top-6-business-application-features-of-webix-ui-framework-5dei</link>
      <guid>https://dev.to/webixui/top-6-business-application-features-of-webix-ui-framework-5dei</guid>
      <description>&lt;p&gt;You may not have heard of the &lt;a href="https://webix.com/"&gt;JavaScript Framework Webix&lt;/a&gt; before. But if you are a professional front-end developer, then you should definitely read this article.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hUp2i-dS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ylu3n0gbgbrkowr1xeki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hUp2i-dS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ylu3n0gbgbrkowr1xeki.png" alt="TOP 6 Business application features of Webix UI Framework "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Webix?
&lt;/h2&gt;

&lt;p&gt;This product was first introduced to the market in 2013. Webix is developed and maintained by XBSoftware software house. For the full 7 years, the product has gone a long way of evolution and earned its place in the market. Today, version 7.4 is available to users. And according to the &lt;a href="https://blog.webix.com/webix-8-0-teaser-exploring-would-be-features-and-updates/"&gt;published road map&lt;/a&gt; it is preparing the release of a new version 8.0. The main competitive advantage of Webix is the accelerated development of business applications. To do this, Webix offers a business-oriented UI library and a set of complex widgets, which are sort of SPA web apps for common business application tasks. How is this business orientation implemented? In addition to 100+ ready-made components, Webix contains many useful features that make the development and prototyping of the UI interface for business applications easy and fast. For example, predefined content in combination with professional material design skin allows you to create ready-made applications using a few lines of code (&lt;a href="https://blog.webix.com/creating-a-webix-based-business-web-application-for-data-storage-with-only-12-lines-of-code/"&gt;here is an example&lt;/a&gt;. For a more detailed review, see the &lt;a href="https://thinkmobiles.com/posts/39/"&gt;ThinkMobiles&lt;/a&gt; blog.  &lt;/p&gt;

&lt;p&gt;Now let's consider the main business application features.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 1: User Management
&lt;/h2&gt;

&lt;p&gt;A very popular feature in the development of any multi-user business application. Therefore, Webix offers a ready-made &lt;a href="https://webix.com/widgets/user-manager/"&gt;ser management module&lt;/a&gt; u.  Developers can access Users list, Roles List, Rules, Roles matrix, and Security audit. A detailed overview of this app can be found at &lt;a href="https://medium.com/@webix_ui/review-of-the-webix-javascript-user-manager-d2940f1d032f"&gt;the link&lt;/a&gt;. This is not just a template, but a full-fledged application with its back end. The architecture of this solution is designed for easy customization and integration with any platforms.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SRL_YAD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z172sf5p5r3j8adxpynq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRL_YAD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z172sf5p5r3j8adxpynq.jpg" alt="User Management"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 2: File Management
&lt;/h2&gt;

&lt;p&gt;Here is another good example of how beautiful and functional applications can be created using the Webix Framework. This solution is also a ready-made UI application for &lt;a href="https://webix.com/filemanager/"&gt;javascript files exploring&lt;/a&gt;. Thanks to simple customization, developers can easily adapt this solution to perform different business functions. And there is no need to go far for examples. The same Webix offers &lt;a href="https://webix.com/widgets/document-manager/"&gt;Document Manager&lt;/a&gt;, which is a clear example of customization and adaptation (you can read an overview of File and Document manager in  &lt;a href="https://medium.com/@webix_ui/webix-file-manager-vs-document-manager-9bef14aeda65"&gt;this article&lt;/a&gt;).  &lt;/p&gt;

&lt;p&gt;Pay attention to such features as Split panel view and multifunctional preview tab.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xw2CqGGX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kgmazyiah9ssdev8u0z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xw2CqGGX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kgmazyiah9ssdev8u0z.jpg" alt="File Management "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 3: JavaScript Chat-Messenger
&lt;/h2&gt;

&lt;p&gt;Check out the ready-made &lt;a href="https://webix.com/widgets/chat-messenger/"&gt;JavaScript chat&lt;/a&gt; app. One more business application with back-end and front-end layers. A detailed overview is available &lt;a href="https://medium.com/@webix_ui/webix-javascript-chat-and-messenger-widget-review-97f7871986e"&gt;here&lt;/a&gt;. Today there are many similar solutions, but Webix allows you to integrate and customize your solution without any restrictions or binding to external services. &lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aTDYXkWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eldkea9oehw6ar6cs9ta.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aTDYXkWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eldkea9oehw6ar6cs9ta.jpg" alt="JavaScript Chat-Messenger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 4: Task Management
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webix.com/kanban/"&gt;Task management board&lt;/a&gt;  (or the so-called Kanban) is included in Webix as a complex widget. This is a reactive single page app ready to be used and integrated into any web solution. This &lt;a href="https://blog.webix.com/webix-in-practice-project-management-application-based-on-kanban-widget/"&gt;case study&lt;/a&gt; provides an example of Webix Kanban integration in .Net SharePoint, and in &lt;a href="https://blog.webix.com/webix-in-practice-erp-for-construction-supervising-and-projects-managing/"&gt;this one&lt;/a&gt; into the classic web ERP system. A more detailed overview can be found &lt;a href="https://medium.com/@webix_ui/kanban-taskboard-smart-planning-and-managing-tasks-67c45bd05568"&gt;here&lt;/a&gt;. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_NQDGmYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pprkp3zxs5a7quh1irpk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_NQDGmYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pprkp3zxs5a7quh1irpk.jpg" alt="Task Management "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 5: Pivot Table and Charts
&lt;/h2&gt;

&lt;p&gt;Looking for some sort of data-driven report management tool? Check out the &lt;a href="https://webix.com/pivot/"&gt;Webix Pivot&lt;/a&gt;. This is a powerful analytical tool that can be integrated into any web system. A detailed overview can be found &lt;a href="https://medium.com/@webix_ui/overview-of-webix-pivot-table-and-pivot-chart-widgets-6fb402f35ff5"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GngtuDxa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b9f5fjrtqnujdanopp0y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GngtuDxa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b9f5fjrtqnujdanopp0y.jpg" alt="Pivot Table and Charts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature 6: SpreadSheet
&lt;/h2&gt;

&lt;p&gt;This is a &lt;a href="https://webix.com/spreadsheet/"&gt;JavaScript Excel-like&lt;/a&gt;application for tabular computing. Webix offers a variety of features and functions that can be integrated, customized, and set to fit your solution. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nlOJYOEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hcd4kwc6xeyz3kofapiq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nlOJYOEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hcd4kwc6xeyz3kofapiq.jpg" alt="SpreadSheet"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Is it all?
&lt;/h3&gt;

&lt;p&gt;Of course not. Webix is 100+ components and applications. A complete list of all features can be found on the &lt;a href="https://webix.com/widgets/"&gt;Javascript UI widgets list&lt;/a&gt;. Besides, the published Webix roadmap has already announced new business apps:  &lt;/p&gt;

&lt;p&gt;1.Scheduler  &lt;/p&gt;

&lt;p&gt;2.Gantt chart  &lt;/p&gt;

&lt;p&gt;3.Report Builder  &lt;/p&gt;

&lt;h3&gt;
  
  
  Is it free of charge?
&lt;/h3&gt;

&lt;p&gt;Webix is available as an &lt;a href="https://github.com/webix-hub/"&gt;Open Source solution&lt;/a&gt;, but the described business functions are only present in the commercial version of Webix Pro. You can buy a license or get it for free through the &lt;a href="https://webix.com/startups/"&gt;startup support program&lt;/a&gt; or &lt;a href="https://webix.com/outsourcers/"&gt;cooperation with software outsourcing companies&lt;/a&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Need more business functions?
&lt;/h3&gt;

&lt;p&gt;Write in the comments about business features and apps you need specifically. Today, Webix is actively looking for new ideas to inspire the development of its product, and this is a good time to share your thoughts.        &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A beginner explores the JavaScript Webix library.  
Part 6. Interaction with the server </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Thu, 02 Apr 2020 07:05:53 +0000</pubDate>
      <link>https://dev.to/webixui/a-beginner-explores-the-javascript-webix-library-part-6-interaction-with-the-server-4l99</link>
      <guid>https://dev.to/webixui/a-beginner-explores-the-javascript-webix-library-part-6-interaction-with-the-server-4l99</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kr4Wyt4O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0o5n4qdbc536u79yhse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kr4Wyt4O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0o5n4qdbc536u79yhse.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My career in front-end developing has just started. Currently, I am on a trial period in one of the IT companies in Minsk. I am exploring the subtleties of the web-ui development on the basis of the JS &lt;a href="http://www.webix.com/"&gt;Webix&lt;/a&gt; library. I am happy to share my modest experience as a guideline of this curious UI library. &lt;/p&gt;

&lt;h2&gt;SIXTH TASK&lt;/h2&gt;

&lt;p&gt;Any operation in the Webix JavaScript library appears first of all on the client side. After that the server gets the result in case the data needs to be saved. The developer needs to connect the server and to work with simple queries, in case custom behavior is not intended for the project.  &lt;/p&gt;

&lt;p&gt;We will deal with the following issues: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connecting the server part of the app; &lt;/li&gt;
&lt;li&gt;methods of requests to the server; &lt;/li&gt;
&lt;li&gt;how to track the download result; &lt;/li&gt;
&lt;li&gt;how to track the result of saving. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://docs.webix.com/datatable__index.html"&gt;DataTable&lt;/a&gt; widget is described in detail in the documentation. &lt;/p&gt;

&lt;p&gt;The source code is &lt;a href="https://github.com/sashko-web/sources-for-articles-webix/tree/part-6-server-side"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The finished application is &lt;a href="https://snippet.webix.com/u40qcg46"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting the server part of the app&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;We are going to work with the DataTable widget. The structure of the application has been changed in the source code. Two folders have been added: backend, with a simple server script on nodeJS, and the app folder, with the client code. There are  separate files for the server operations. The films.js file is for the DataTable widget. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The DataTable widget code is placed in the table.js file of the app folder and is rendered in the Dashboard tab.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;First, we run the application on the local server with the following commands: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;npm install&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;npm run server&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Then there is the following in the terminal: &lt;/p&gt;

&lt;p&gt;Server is running on port 3000... &lt;/p&gt;

&lt;p&gt;Open &lt;a href="http://localhost:3000/app"&gt;http://localhost:3000/app&lt;/a&gt; in browser &lt;/p&gt;

&lt;p&gt;To &lt;a href="https://docs.webix.com/desktop__serverside.html#dataloading"&gt;load data&lt;/a&gt; into a table we provide the path to the script in its url property. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;url: "/samples/server/films", &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To send&lt;a href="https://docs.webix.com/desktop__serverside.html#datasaving"&gt; save&lt;/a&gt; requests, the path to the script is indicated in the save property.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;save:"rest-&amp;gt;/samples/server/films", &lt;strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;Methods of requests to the server&lt;/h2&gt;

&lt;p&gt;We will use the RESTful API method and other methods for the data operations, such as: GET, POST, PUT, and DELETE. &lt;/p&gt;

&lt;p&gt;With the &lt;a href="https://docs.webix.com/desktop__server_rest.html"&gt;rest&lt;/a&gt; prefix already set in the save setting, all requests will be sent via the corresponding built-in &lt;a href="https://docs.webix.com/desktop__server_proxy.html"&gt;proxy&lt;/a&gt;. The rest proxy matches the request method with the type of operation performed on the client. There are a few built-in proxies Webix suggests. It is also possible to create your own custom proxy.&lt;/p&gt;

&lt;p&gt;We will track queries on the DataTable widget example. So, we go to DevTools-&amp;gt;Network in the browser and look for the information on the desired request.&lt;/p&gt;

&lt;p&gt;To load data to a table, we use the &lt;strong&gt;GET method&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;We refresh the page and click on the request to the films script.  &lt;/p&gt;

&lt;p&gt;By default, there are no parameters in this request, as it is the first data loading into the component. &lt;/p&gt;

&lt;p&gt;Thus, the server returns us the JSON array with all the data. &lt;/p&gt;

&lt;p&gt;Result of the GET request: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--864gLu9V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oznjlc87vvmxtu1nqibq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--864gLu9V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/oznjlc87vvmxtu1nqibq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create a new record in the table, POST method is used.&lt;/p&gt;  

&lt;p&gt;We use the form to add new data to the table.&lt;/p&gt;  

&lt;p&gt;We send the following form data in the request body:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gpiMZVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4fn3ug600n3ha8s2nc8w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gpiMZVxx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4fn3ug600n3ha8s2nc8w.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When adding an entry to the server the response must contain the id assigned there: &lt;/p&gt;

&lt;p&gt; {"id":"ImurRuK1k59qzy2f"} &lt;/p&gt;

&lt;p&gt;This is important not to lose the connection between the data on the server and the client. The same id will now be used on the client.  &lt;/p&gt;

&lt;p&gt;To change data in table rows, &lt;strong&gt;PUT method &lt;/strong&gt;is used. &lt;/p&gt;

&lt;p&gt;We select the first row in the table to edit it in the related form. Then we change them and save. The entire record (object with data) with the changes will be sent to the server. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BWsRQ4W5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p776m1ovqx7ob4xlj44h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BWsRQ4W5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p776m1ovqx7ob4xlj44h.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server will return the following JSON: &lt;/p&gt;

&lt;p&gt; { status: “updated”}. &lt;/p&gt;

&lt;p&gt;To delete data, &lt;strong&gt;DELETE&lt;/strong&gt; &lt;strong&gt;method &lt;/strong&gt;is used. &lt;/p&gt;

&lt;p&gt;We delete the first row by clicking on the cross icon. &lt;/p&gt;

&lt;p&gt;In this case, the entire row will be passed to the server. The main thing in the parameters is the id of the record to be deleted on the server. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7YHdiVl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/va8mqgzmtq7ubhtck6be.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7YHdiVl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/va8mqgzmtq7ubhtck6be.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server will return an empty object, since no special confirmation is required for this operation. &lt;/p&gt;

&lt;h2&gt;Tracking loading results&lt;/h2&gt;

&lt;p&gt;To count the number of records loaded into the table and output it as a message, we use the&lt;a href="https://docs.webix.com/api__link__ui.proto_ready_config.html"&gt; ready&lt;/a&gt; handler. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Ready&lt;/strong&gt; handler is called once the first data is available in the component. We put the webix.message() function inside the handler calling the&lt;a href="https://docs.webix.com/api__link__ui.datatable_count.html"&gt; count&lt;/a&gt; method. When the data is loaded, the notification “Loaded 250 records!" appears in the right upper corner of the screen. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nx1X9eEO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fpmqu5wm17ai8adqu7ko.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nx1X9eEO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fpmqu5wm17ai8adqu7ko.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading data:&lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---cAkBV06--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fkfkpx3vw9jz7jby7pg6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---cAkBV06--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fkfkpx3vw9jz7jby7pg6.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case of an error, the onLoadError event is triggered:&lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V0eGjmXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kegjtmll5gup8wv3h34x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V0eGjmXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kegjtmll5gup8wv3h34x.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Tracking the result of saving&lt;/h2&gt;

&lt;p&gt;To get the server response for adding, editing, and deleting operations, we access the &lt;a href="https://docs.webix.com/desktop__dataprocessor.html"&gt;DataProcessor&lt;/a&gt; module. You can use the API of this module to tune the data saving more precisely. To track the moment of saving, we use the &lt;a href="https://docs.webix.com/api__dataprocessor_onaftersync_event.html"&gt;onAfterSync&lt;/a&gt; event. &lt;/p&gt;

&lt;p&gt;The DataProcessor module is accessed with the webix.dp(id) method, where id corresponds to the widget in question (here - Datatable). &lt;/p&gt;

&lt;p&gt;The onAfterSync event is called after the response from the server is received and processed. In the event handler, we render a message via webix.message(). After saving, the phrase "Saved!" appears in the right upper corner. &lt;/p&gt;

&lt;p&gt;We delete the first row in the table and here is the result. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CiKc5qbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/199phw07pb3ygqd6uex1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CiKc5qbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/199phw07pb3ygqd6uex1.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The events handler code is in the script.js file after Webix UI initialization: &lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CgDnNFBW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0ap888nnv2s6tqff2xh1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CgDnNFBW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0ap888nnv2s6tqff2xh1.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Errors in this case can be detected with the&lt;a href="https://docs.webix.com/api__dataprocessor_onaftersaveerror_event.html" rel=""&gt; onAfterSaveError&lt;/a&gt; event: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4VNexXPt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y32m5h29edy21d2a30rg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4VNexXPt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y32m5h29edy21d2a30rg.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Using CRUD operations, we unout how to interact with the server part of the application. We considered the standard set of query methods and the way to track data loading and saving. The examples discussed in this article are available both for the DataTable and List widgets. Use the source code referenced at the beginning to try everything yourself. &lt;/p&gt;

&lt;p&gt;The code of the finished application is &lt;a href="https://github.com/sashko-web/sources-for-articles-webix/tree/part-6-server-side"&gt;here&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Webix JavaScript library through the eyes of a freshman. Part 5. Working with data on the user's side </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Wed, 01 Apr 2020 06:33:23 +0000</pubDate>
      <link>https://dev.to/webixui/webix-javascript-library-through-the-eyes-of-a-freshman-part-5-working-with-data-on-the-user-s-side-89d</link>
      <guid>https://dev.to/webixui/webix-javascript-library-through-the-eyes-of-a-freshman-part-5-working-with-data-on-the-user-s-side-89d</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WjZPZ1eJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3krerfunituoh6g76j37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WjZPZ1eJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3krerfunituoh6g76j37.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have just started my career in IT. Currently I am studying web-ui development with the&lt;a href="http://www.webix.com/"&gt; JS Webix library&lt;/a&gt;. Here is a short description of what I have learnt so far.&lt;/p&gt;

&lt;p&gt;FIFTH TASK&lt;/p&gt;

&lt;p&gt;In this article, I will consider the following tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.webix.com/datatable__filtering.html#text"&gt;filtering&lt;/a&gt; and&lt;a href="https://docs.webix.com/datatable__sorting.html"&gt; sorting&lt;/a&gt; table data; &lt;/li&gt;
&lt;li&gt;filtering and sorting via the API; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.webix.com/desktop__grouping.html"&gt;grouping data&lt;/a&gt; in the tree table; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.webix.com/desktop__data_binding.html"&gt;synchronizing&lt;/a&gt; components; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more about the&lt;a href="https://docs.webix.com/desktop__list.html"&gt; List widget&lt;/a&gt;, the&lt;a href="https://docs.webix.com/desktop__treetable.html"&gt; Treetable widget&lt;/a&gt; and the&lt;a href="https://docs.webix.com/datatable__index.html"&gt; DataTable widget&lt;/a&gt; used in the article.&lt;/p&gt;

&lt;p&gt;The source code is&lt;a href="https://github.com/sashko-web/webix/tree/master/webix%20sourses%20for%205%20article"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can find the finished application &lt;a href="https://snippet.webix.com/njqcjz0b"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering and sorting table data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We start with tables. There is a &lt;a href="https://docs.webix.com/datatable__filtering.html"&gt;number of built-in filters&lt;/a&gt; embedded directly into the header of the&lt;a href="https://docs.webix.com/api__refs__ui.datatable.html"&gt; DataTable&lt;/a&gt; and TreeTable widgets.&lt;/p&gt;

&lt;p&gt;I use two options in the Table widget: a simple text filter (&lt;a href="https://docs.webix.com/datatable__filtering.html#text"&gt;textFilter&lt;/a&gt;) and a filter with a set of options in the drop-down list (&lt;a href="https://docs.webix.com/datatable__filtering.html#select"&gt;selectFilter&lt;/a&gt;). I add one filter for the columns title and year. I set the Header in them as an array instead of a row to fit the header and filter. The second element in the array is an object with the content property and the filter name.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The code of the Table widget is located in the table.js file and is rendered in the Dashboard tab.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The data is filtered by substring match, when characters are added in "textFilter". When selecting an option in "selectFilter", it will be filtered by the selected value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YBA45i-1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qf7krfjuc0mneuazeczp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YBA45i-1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qf7krfjuc0mneuazeczp.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the result of filtering by substring "star”:&lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7gXFl-26--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ubo1t80y5li9hafxue9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7gXFl-26--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ubo1t80y5li9hafxue9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorting. To tune column sorting, add the&lt;a href="https://docs.webix.com/desktop__filter_sort.html#sorting" rel=""&gt; sort&lt;/a&gt; property to the column configuration. There are several ready-made sorting types: by numeric values, by date and by row. For the 'year', 'votes', and 'rating' columns I will set the sort:"int” setting for sorting by numeric values. For the title column, the value will be "string".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GXmfrAni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fci8sz3rygm4rly4z9q8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GXmfrAni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fci8sz3rygm4rly4z9q8.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When clicking the column header, the data will be sorted according to its type. Here is the result of sorting by rating: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Cdo1OQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o7r8wl2pk0fdxzrcmh5w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Cdo1OQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o7r8wl2pk0fdxzrcmh5w.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Sorting and filtering via the API&lt;/h2&gt;

&lt;p&gt;All Webix widgets support the features of filtering and sorting elements via the API methods. I will demonstrate programmatic filtering and sorting in the&lt;a href="https://docs.webix.com/desktop__list.html"&gt; List&lt;/a&gt; widget.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The code of the List widget is located in the users_module.js file and is drawn in the "Users" tab.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering.&lt;/strong&gt; In the "&lt;strong&gt;Users&lt;/strong&gt;" tab, after the “Add new person " button, I will place the&lt;a href="https://docs.webix.com/desktop__text.html"&gt; Text&lt;/a&gt; widget, for filtering names in the list. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CLynUKrq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ymo6icxtdtrmft0fnsc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CLynUKrq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ymo6icxtdtrmft0fnsc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now in the script.js file I'll add the logic for filtering elements. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QpRNwy6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v56ewubaehvptgcv3six.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QpRNwy6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v56ewubaehvptgcv3six.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elements are filtered in the following way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using the&lt;a href="https://docs.webix.com/api__link__ui.vscroll_attachevent.html"&gt; attachEvent&lt;/a&gt; method I add a handler to the&lt;a href="https://docs.webix.com/api__ui.view_ontimedkeypress_event.html"&gt; onTimedKeyPress&lt;/a&gt; event; &lt;/li&gt;
&lt;li&gt;the onTimedKeyPress event is triggered by entering characters in the text field, but with a short delay so that the filter is not activated every time you press the keys; &lt;/li&gt;
&lt;li&gt;I get the entered text and use the&lt;a href="https://docs.webix.com/datatable__filtering.html"&gt; filter&lt;/a&gt; method to start filtering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the result of filtering via the text input: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z-HUhXGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v5c8xlfju93y2uoa99ps.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z-HUhXGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v5c8xlfju93y2uoa99ps.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorting&lt;/strong&gt;. The List widget elements will be sorted by clicking the “Sort asc” and “Sort desc” buttons.&lt;/p&gt;

&lt;p&gt;To create buttons in the "&lt;strong&gt;Users&lt;/strong&gt;" tab, I will add two&lt;a href="https://docs.webix.com/desktop__button.html"&gt; Button&lt;/a&gt; widgets with the&lt;a href="https://docs.webix.com/api__ui.button_click_config.html"&gt; click&lt;/a&gt; event handler after the text field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IJcoQBgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j7yfqyb6rl5zds7svh9i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IJcoQBgm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j7yfqyb6rl5zds7svh9i.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside the click handler, the&lt;a href="https://docs.webix.com/api__link__ui.proto_sort.html"&gt; sort&lt;/a&gt; method accepts the name of the field to sort data by, and the sorting directions: “asc“ (ascending) and” desc" (descending). By default, data elements represent rows and sorted accordingly. &lt;/p&gt;

&lt;p&gt;As a result, names in the list are sorted alphabetically: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qiTJfdgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qfdx5mb91lsdzxkermkk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qiTJfdgs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qfdx5mb91lsdzxkermkk.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Grouping data in the tree table&lt;/h2&gt;

&lt;p&gt;Now let's look at the data grouping by random parameters on the example of the TreeTable widget. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The code of the TreeTable widget is located in the products_module.js file and is rendered in the “Products" tab.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I will change hierarchical data in the tree table to get a linear array. I will get rid of the hierarchy and move the “category” field from it to each record. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BnrVrHlg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o12lacxvub1xuy77koxm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BnrVrHlg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o12lacxvub1xuy77koxm.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two ways to group data in a table: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immediately after loading them; &lt;/li&gt;
&lt;li&gt;dynamically, using the &lt;a href="https://docs.webix.com/api__groupstore_group.html"&gt;group&lt;/a&gt; and &lt;a href="https://docs.webix.com/api__groupstore_ungroup.html"&gt;ungroup&lt;/a&gt; methods. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use the first option, as I need to group the data as soon as it is available. &lt;/p&gt;

&lt;p&gt;In the TreeTable widget configuration, I will add the &lt;a href="https://docs.webix.com/desktop__data_scheme.html"&gt;scheme&lt;/a&gt; property. It determines the way of processing data. I use the &lt;a href="https://docs.webix.com/api__group_group.html"&gt;$group&lt;/a&gt; method to group data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NWXuPiaA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/854s9ih68rdjffcslg0m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWXuPiaA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/854s9ih68rdjffcslg0m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two parameters are used inside the $group handler: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a required parameter &lt;strong&gt;by&lt;/strong&gt;, which groups the data.  &lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;map&lt;/strong&gt; object, where we will describe the data fields for the created groups. Grouping splits the source data by the specified parameters and creates "parent records" for them . We can use map to add new fields to these records. To display the data correctly, I will add the "title" field. Its value will be the parameter that is used for grouping. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, I set the&lt;a href="https://docs.webix.com/api__datastore_sort.html"&gt; $sort&lt;/a&gt; function to sort the grouped data in alphabetical order. &lt;/p&gt;

&lt;p&gt;The result of the grouping is as follows: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WQNAtONe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryd3i2adxgeeb3joxf0p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WQNAtONe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryd3i2adxgeeb3joxf0p.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Synchronizing components&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The task uses the &lt;/em&gt;&lt;em&gt;Chart and List widgets. Their code is in the &lt;/em&gt;&lt;em&gt;users_module.js file and they are rendered in the "Users" tab.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;The&lt;a href="https://docs.webix.com/desktop__data_binding.html#syncingcomponents"&gt; sync&lt;/a&gt; method allows you to copy data from one component and pass it to another. Thus, changes in the main component, such as adding, deleting, and so on, are immediately reflected in another. &lt;/p&gt;

&lt;p&gt;First, in the&lt;a href="https://docs.webix.com/api__refs__ui.chart.html"&gt; Chart&lt;/a&gt; widget I will delete the link to the data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qAss-EeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8lm8e0qmhm0kicex9gje.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qAss-EeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8lm8e0qmhm0kicex9gje.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, in the script.js file using the sync method, I synchronise the Chart widget with the List widget. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HF2gbZMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iebb1clcw3zjfs4z0zlc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HF2gbZMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iebb1clcw3zjfs4z0zlc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the addPerson function, we add data only for the List widget.&lt;/p&gt;  

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ZyEGAxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l001zrlapxs2jbhuu0dr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ZyEGAxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l001zrlapxs2jbhuu0dr.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, when you add or remove entries from the list, changes will also occur in the Chart. Sorting and filtering in the List widget will now affect data in the Chart as well. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pr6w3Lz3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jved4u355wpjtzgaqcnt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pr6w3Lz3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jved4u355wpjtzgaqcnt.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Summary &lt;h2&gt;

&lt;/h2&gt;
&lt;/h2&gt;
&lt;p&gt;Thus, I have shown how to improve the user experience on practical examples. We have learnt the built-in means to sort and filter data in the DataTable and TreeTable widgets with a single setting. We have grouped data in a table, and the synchronization example expanded the ability to improve the performance of widgets that use the same data source. &lt;/p&gt;

&lt;p&gt;You can find the finished application &lt;a href="https://snippet.webix.com/njqcjz0b"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webix JavaScript library through the eyes of a freshman. &lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 5. Working with data on the user's side&lt;/strong&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Part 4. Working with data. CRUD </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Tue, 31 Mar 2020 06:36:44 +0000</pubDate>
      <link>https://dev.to/webixui/part-4-working-with-data-crud-2n21</link>
      <guid>https://dev.to/webixui/part-4-working-with-data-crud-2n21</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--69ZLopbG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zxdv6jcysn8wymzv9hkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--69ZLopbG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zxdv6jcysn8wymzv9hkv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My career in front-end developing has just started. Currently, I am on a trial period in one of the IT companies in Minsk. I am exploring the subtleties of the web-ui development on the basis of the &lt;a href="http://www.webix.com/"&gt;JS Webix library&lt;/a&gt;. Sure enough I am glad to share my modest experience and to save it as a guideline of this curious UI library. &lt;br&gt; &lt;/p&gt;

&lt;p&gt;FOURTH TASK &lt;/p&gt;

&lt;p&gt;The Webix library has all the tools for implementing basic web development functions, &lt;a href="https://ru.wikipedia.org/wiki/CRUD"&gt;or CRUD&lt;/a&gt;. This article covers the following tasks: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;editing table data via the form; &lt;/li&gt;
&lt;li&gt;installing the&lt;a href="https://docs.webix.com/desktop__editing.html"&gt; built-in row editor&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;adding data to the list and the chart; &lt;/li&gt;
&lt;li&gt;deleting items. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; In the documentation, you can learn more about the &lt;a href="https://docs.webix.com/desktop__list.html"&gt;List&lt;/a&gt; widget, the &lt;a href="https://docs.webix.com/desktop__treetable.html"&gt;Treetable&lt;/a&gt; widget, and the &lt;a href="https://docs.webix.com/datatable__index.html"&gt;DataTable&lt;/a&gt; widget covered in the article. &lt;/p&gt;

&lt;p&gt; The source codes are &lt;a href="https://github.com/sashko-web/webix/tree/master/webix%20sourses%20for%204%20article"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt; You can find the finished application &lt;a href="https://snippet.webix.com/dvf2u6z0"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;Step 1. Editing data via the form.&lt;/h2&gt;

&lt;p&gt;I work here with the &lt;em&gt;"Dashboard"&lt;/em&gt; tab where the table and the form are drawn. The table code is located in the table.js file, the form code is in form.js. &lt;/p&gt;

&lt;p&gt;I will add the &lt;a href="https://docs.webix.com/api__selectionmodel_onafterselect_event.html"&gt;onAfterSelect&lt;/a&gt; event to the &lt;a href="https://docs.webix.com/api__refs__ui.datatable.html"&gt;Table&lt;/a&gt; widget. When this event is triggered, I will get data from the table and pass it to the form fields. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E4CgnOLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/43br79hcnnvbwjsrkjal.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E4CgnOLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/43br79hcnnvbwjsrkjal.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.webix.com/api__values_setvalues.html"&gt;setValues()&lt;/a&gt; method in the above code passes the received values to the form. &lt;/p&gt;

&lt;p&gt;I run the code and check the result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jHw1ZbmS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mgj7kexqc2vfaaoppnrz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jHw1ZbmS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mgj7kexqc2vfaaoppnrz.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the row in a table is selected, its data automatically enters the form and is ready to work. &lt;/p&gt;

&lt;p&gt;To make the process more challenging, I will save the changes if the data is taken from the table and edited.  &lt;/p&gt;

&lt;p&gt;I rewrite the &lt;strong&gt;&lt;em&gt;saveItem&lt;/em&gt;&lt;/strong&gt; function and add new methods to it: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xDcAb2aI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b88f7kftjnf4yildyo3m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xDcAb2aI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b88f7kftjnf4yildyo3m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now there is the following algorithm in the function: &lt;/p&gt;

&lt;p&gt;- first, two conditions are checked : whether the form data has passed validation, and whether changes have occurred in the form. Changes in the form are tracked by the&lt;a href="https://docs.webix.com/api__values_setdirty.html"&gt; isDirty()&lt;/a&gt; method; &lt;/p&gt;

&lt;p&gt;- second, the condition "item_data.id" allows you to define a new record. A row with all its data is passed to the form, including the id, for which there is no text field in the form, but it is required for the data. The form stores and allows you to read all the passed values, so we use the id for verification. &lt;/p&gt;

&lt;p&gt;- finally, after verification, either a new record is added using the&lt;a href="https://docs.webix.com/api__link__ui.proto_add.html"&gt; add()&lt;/a&gt; method, or the current element is updated with new properties. &lt;/p&gt;

&lt;p&gt;To update the edited data, I use the&lt;a href="https://docs.webix.com/api__link__ui.proto_updateitem.html"&gt; updateItem()&lt;/a&gt; method. It takes two parameters: id of the selected element and a set of new properties taken from the form. When the function is called, the current data is replaced and supplemented with new data. &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kyuMoy_S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i7farw8penofhdvy8tmj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kyuMoy_S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i7farw8penofhdvy8tmj.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 2. Installing the built-in editor.&lt;/h2&gt;

&lt;p&gt;In the previous step, I edited the table data using the form. Now I will try the editing method directly in the element. This method is applicable both in the table and in other components for working with a large amount of data, for example, in the list. &lt;/p&gt;

&lt;p&gt;I start with a tree table in the "Products" tab. The table code is in the products_module.js file. &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.webix.com/api__refs__ui.treetable.html"&gt;Treetable&lt;/a&gt; widget allows you to edit table contents, but this feature is disabled by default. Editing is set in two places: in the table configuration with the &lt;strong&gt;editable:true&lt;/strong&gt; setting, and in the configuration of each column. The editor:"text" setting is set to the columns. The “text" attribute specifies the type of the editor. For more information about editor types, see the &lt;a href="https://docs.webix.com/desktop__editing.html"&gt;documentation&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XLrrN3AE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b2w1gu44a5b8qk2xcspk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XLrrN3AE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b2w1gu44a5b8qk2xcspk.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added editors for the Title and Price columns in the code. By clicking on any cell the text field editor opens up: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GTDYdnDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7tkp1tponsrtkpnk0grf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GTDYdnDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7tkp1tponsrtkpnk0grf.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I will go to the "Users" tab, and analyze the option with editing the &lt;a href="https://docs.webix.com/api__refs__ui.list.html"&gt;List&lt;/a&gt; widget. The widget code is located in the users_module.js file. &lt;/p&gt;

&lt;p&gt;Data editing is available by default for the TreeTable and DataTable widgets. To use the built-in editor in other widgets, you can use the special&lt;a href="https://docs.webix.com/desktop__edit.html#editingotheruirelatedcomponents"&gt; EditAbility&lt;/a&gt; module. I use this module to edit the List widget data. To do this, I will create a user component using the&lt;a href="https://docs.webix.com/desktop__custom_component.html"&gt; protoUI&lt;/a&gt; method based on the List widget. &lt;/p&gt;

&lt;p&gt;I write the name of the future widget (the name property) and inherit the necessary modules for the widget base. &lt;/p&gt;

&lt;p&gt;Prototype of the List widget. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9yDnGDBz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/we3ujgx3nl1qdqjcebs4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yDnGDBz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/we3ujgx3nl1qdqjcebs4.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After calling protoUI, I get the finished component. It is built into the widget in the same way as all other components: with the view:"editlist" setting. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3n9l4TO8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lxu703yy67ztlgund9kc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3n9l4TO8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lxu703yy67ztlgund9kc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since there can be many fields in each record, and both name and country are drawn in the List template, the &lt;a href="https://docs.webix.com/api__editability_editvalue_config.html"&gt;editorValue&lt;/a&gt;:"name" setting is added in the configuration, indicating which field can be edited. &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---CRP0A8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/etxjd65i6eno9rl76pax.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---CRP0A8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/etxjd65i6eno9rl76pax.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 3. Adding data to the list and chart.&lt;/h2&gt;

&lt;p&gt;This part of the article uses the List and Chart widgets, the code of which is located in the users_module.js file and drawn in the Users tab. &lt;/p&gt;

&lt;p&gt;The Chart and List widgets use the same data of the JSON array. Therefore, when I implement the opportunity to add data, it is necessary that it falls into both components. &lt;/p&gt;

&lt;p&gt;To do this, I will draw the "Add new person" button in the users module. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IasaGHb_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/stp3zlr8btcaq4st2plx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IasaGHb_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/stp3zlr8btcaq4st2plx.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the button calls the &lt;em&gt;addPerson&lt;/em&gt; function that adds a new entry to the list. &lt;/p&gt;

&lt;p&gt;The chart shows the age from each record, so a random number will be generated for a larger spread. &lt;/p&gt;

&lt;p&gt;Function for adding a new record: &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RpnAFq-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6ud3f617gywgl7hmio4r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RpnAFq-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6ud3f617gywgl7hmio4r.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AL6hmCnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2y4tihycsld38q0gjr57.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AL6hmCnM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2y4tihycsld38q0gjr57.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1ETAgxye--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2btv55h2wa6m4lk6weua.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1ETAgxye--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2btv55h2wa6m4lk6weua.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 4. Deleting elements.&lt;/h2&gt;

&lt;p&gt;To begin with, I create a new column with an html tag and an icon in the Table widget. &lt;/p&gt;

&lt;p&gt;To process clicks on icons, I take the delete_icon class and write it to the onClick object as a key, the value of this key will be the function, which is the handler. Among the arguments the ID of the record comes, so I can delete it with the &lt;a href="https://docs.webix.com/api__datastore_remove.html"&gt;remove()&lt;/a&gt; method. &lt;/p&gt;

&lt;p&gt;List widget code: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xgtIwr5J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1ccalho4e75h8x8xebin.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xgtIwr5J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1ccalho4e75h8x8xebin.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The List widget’s rows removal algorithm is the same as the Table widget’s:&lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hb12ttFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/saa3h4ml9w0ik8wj7rhv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hb12ttFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/saa3h4ml9w0ik8wj7rhv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Result of rows removal in the Users tab:&lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NB7LWE1X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nk2sym4jpg0ge37j12du.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NB7LWE1X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nk2sym4jpg0ge37j12du.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find the finished application&lt;a href="https://snippet.webix.com/dvf2u6z0"&gt; here&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;CRUD implementation in the Webix JS library is performed in different ways. There are built-in editors for changing data, and &lt;a href="https://ru.wikipedia.org/wiki/API"&gt;API&lt;/a&gt; that allows you to do the same through a third-party form. The whole set of CRUD functions can happen in the form with several rows of the code. It is easy to combine various functions in the library architecture. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A beginner explores the JavaScript Webix library.  
Part 3. Modules, charts, tree tables. </title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Mon, 30 Mar 2020 12:24:56 +0000</pubDate>
      <link>https://dev.to/webixui/a-beginner-explores-the-javascript-webix-library-part-3-modules-charts-tree-tables-19lc</link>
      <guid>https://dev.to/webixui/a-beginner-explores-the-javascript-webix-library-part-3-modules-charts-tree-tables-19lc</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3PdMCM6z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/359iazmuwifqf0dt3gfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3PdMCM6z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/359iazmuwifqf0dt3gfa.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My career in front-end developing has just started. Currently, I am on a trial period in one of the IT companies in Minsk. I am exploring the subtleties of the web-ui development on the basis of the &lt;a href="http://www.webix.com/" rel="dofollow"&gt;JS Webix library&lt;/a&gt;. Sure enough I am glad to share my modest experience and to save it as a guideline of this curious UI library.&lt;/p&gt;

&lt;p&gt;In this part, I deal with the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;splitting the project into modules; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.webix.com/desktop__multiview.html"&gt;tabs and switching&lt;/a&gt; between them; &lt;/li&gt;
&lt;li&gt;setting up &lt;a href="https://docs.webix.com/datatable__index.html"&gt;a table&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;drawing a&lt;a href="https://docs.webix.com/desktop__list.html"&gt; list&lt;/a&gt; and a&lt;a href="https://docs.webix.com/desktop__chart.html"&gt; chart&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;creating a&lt;a href="https://docs.webix.com/desktop__treetable.html"&gt; tree table&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The source code is &lt;a href="https://github.com/sashko-web/webix/tree/master/webix%20sourses%20for%203%20article"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The finished application is &lt;a href="https://snippet.webix.com/3hsddw9w"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;Step 1. Splitting the project into modules&lt;/h2&gt;

&lt;p&gt;To make things clearer it is better to split the project into modules. I create the following files and transfer the widget code to them: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;header.js-the&lt;a href="https://docs.webix.com/desktop__toolbar.html"&gt; &lt;em&gt;Toolbar&lt;/em&gt;&lt;/a&gt; widget; &lt;/li&gt;
&lt;li&gt;aside.js-the&lt;a href="https://docs.webix.com/desktop__list.html"&gt; &lt;em&gt;List&lt;/em&gt;&lt;/a&gt; widget; &lt;/li&gt;
&lt;li&gt;table.js- the&lt;a href="https://docs.webix.com/datatable__index.html"&gt; &lt;em&gt;Datatable&lt;/em&gt;&lt;/a&gt; widget; &lt;/li&gt;
&lt;li&gt;form.js- the&lt;a href="https://docs.webix.com/desktop__form.html"&gt; &lt;em&gt;Form&lt;/em&gt;&lt;/a&gt; widget; &lt;/li&gt;
&lt;li&gt;footer.js - the element with text: “The software is ...". &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In new files I put widget configurations into variables, e.g.: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j97jlTCK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t1fdika114wdmznjjlfy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j97jlTCK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t1fdika114wdmznjjlfy.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The created files are included in the index.html file in the following order: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o6V0q0eo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wk6hcybrldxdd9horyqo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o6V0q0eo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wk6hcybrldxdd9horyqo.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The script.js file now contains a simple application initialization code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jZu8zRUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bku1lhzh04sap933295e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jZu8zRUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bku1lhzh04sap933295e.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 2. Tabs and switching between them&lt;/h2&gt;

&lt;p&gt;The&lt;a href="https://docs.webix.com/desktop__multiview.html" rel=""&gt; Multiview&lt;/a&gt; component performs switching. I create it in the aside.js file: &lt;/p&gt; 

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vz9uhDxU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ud5e19tbt37af59ir1bj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vz9uhDxU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ud5e19tbt37af59ir1bj.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tab code is in the cells array. Each tab needs an id. Multiview contains three tabs, the first of which contains the table and the form that were created earlier. &lt;/p&gt;

&lt;p&gt;In the script.js file I replace the Table and the Form widgets with the Multi module. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZNvm2qo5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3vn5dbu7uoxjjiomglk4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZNvm2qo5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3vn5dbu7uoxjjiomglk4.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The&lt;a href="https://docs.webix.com/api__refs__ui.list.html" rel=""&gt; List&lt;/a&gt; widget acts as a switch between tabs. I set to the List widget elements the same id as the Multiview tabs. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jJTaEdCx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qnkr6b6upiqiouurmnry.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jJTaEdCx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qnkr6b6upiqiouurmnry.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click on an element of the &lt;em&gt;List&lt;/em&gt; widget, the &lt;a href="https://docs.webix.com/api__selectionmodel_onafterselect_event.html"&gt;onAfterSelect&lt;/a&gt; event is triggered. Inside its handler, we get the id of the selected element and show the corresponding tab referring to it by id. &lt;/p&gt;

&lt;p&gt;Example: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4yIfOApr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/78w81lgakj244vxqas8a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4yIfOApr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/78w81lgakj244vxqas8a.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Attention!&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Further actions with data will be performed with the local server running.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;Step 3. Dashboard tab-table settings&lt;/h2&gt;

&lt;p&gt;To delete a column or add a new one, the property &lt;em&gt;autoConfig:true&lt;/em&gt; in the &lt;em&gt;Datatable&lt;/em&gt; widget should be replaced with the &lt;a href="https://docs.webix.com/api__ui.datatable_columns_config.html"&gt;columns&lt;/a&gt; array with settings for each column.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zklW-y9W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6xw52ekm9i15gi7929px.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zklW-y9W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6xw52ekm9i15gi7929px.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;- the value of the id property shows the data item field that will be displayed in this column; &lt;/p&gt;

&lt;p&gt;- the &lt;em&gt;header&lt;/em&gt; property in the element is the column header; &lt;/p&gt;

&lt;p&gt;- all columns are set to a fixed width, but the second column with the fillspace property allows the title column to take up all the available space. &lt;/p&gt;

&lt;p&gt;All settings of the table are predefined in the style.css file and we only need to insert the class name. &lt;/p&gt;

&lt;p&gt;I add more data for the table from the data/data.js specifying the path to it using the&lt;a href="https://docs.webix.com/desktop__data_loading.html"&gt; url&lt;/a&gt; property. &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vBgzpgsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v977hcdzkfuj7m8sawhq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vBgzpgsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v977hcdzkfuj7m8sawhq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 4. The tab “Users" - drawing a list and a chart&lt;/h2&gt;

&lt;p&gt;In the second tab I will create a list and a chart. To do this, in the second Multiview element I will specify the name of the module as “users”. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uq4JgeY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/txa97eflqp71r17z4a57.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uq4JgeY2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/txa97eflqp71r17z4a57.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; I will create a new &lt;em&gt;users_module.js&lt;/em&gt; file for the widgets. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List.&lt;/strong&gt; List refers to the&lt;a href="https://docs.webix.com/api__refs__ui.list.html"&gt; &lt;em&gt;List&lt;/em&gt;&lt;/a&gt; widget, which was previously used when creating the menu. The list rows must contain user names and country names. &lt;/p&gt;

&lt;p&gt;List widget code: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5bOJ9ueD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k37u9sgt2cg0xd0mo4t7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5bOJ9ueD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k37u9sgt2cg0xd0mo4t7.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rows array is used to divide the workspace into two parts. The second one will be used for the diagram. &lt;/p&gt;

&lt;p&gt;In the template property, there is a field between the # characters. The value of the field is taken from the data element that is loaded from the users.js file. &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0a3N-FSk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y843dqqbb563bwtyd1r1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0a3N-FSk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y843dqqbb563bwtyd1r1.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chart.&lt;/strong&gt; The library supports common&lt;a href="https://docs.webix.com/desktop__chart_types.html"&gt; chart&lt;/a&gt; types, all of which are created with the&lt;a href="https://docs.webix.com/api__refs__ui.chart.html"&gt; Chart&lt;/a&gt; widget with the &lt;strong&gt;type&lt;/strong&gt; property. &lt;/p&gt;

&lt;p&gt;I replace the setting template:"Chart" with the widget code: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QNq-DswU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9gcm9ldvnmt9irc8vx5j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QNq-DswU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9gcm9ldvnmt9irc8vx5j.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;- setting &lt;em&gt;type: "bar"&lt;/em&gt; sets the linear chart type; &lt;/p&gt;

&lt;p&gt;- the field name is passed to value, and it must be specified in `#...#`; &lt;/p&gt;

&lt;p&gt;- the &lt;strong&gt;xAxis&lt;/strong&gt; setting indicates the information shown on the &lt;strong&gt;X&lt;/strong&gt; axis. &lt;/p&gt;

&lt;p&gt;- template shows that there are age numbers below the chart lines; &lt;/p&gt;

&lt;p&gt;- &lt;strong&gt;title&lt;/strong&gt; contains the name of the chart, which is "Age". &lt;/p&gt;

&lt;p&gt;Result of drawing the list and the chart: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RgVUvJ9---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ok7tvpxz61tg0509qh6u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RgVUvJ9---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ok7tvpxz61tg0509qh6u.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 5. The tab “Products” - tree table&lt;/h2&gt;

&lt;p&gt;To initialize this component, I will create the products_module.js file. In the third element of the Multiview widget, I will specify the name of the module as "products". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5oxZrXvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/blgy0bzphcml7qhhbtq6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5oxZrXvN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/blgy0bzphcml7qhhbtq6.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The&lt;a href="https://docs.webix.com/desktop__treetable.html"&gt; Treetable&lt;/a&gt; widget is used to build a tree table. One of the widget columns should contain a template&lt;a href="https://docs.webix.com/datatree__node_templates.html"&gt; {common.treetable ()}&lt;/a&gt;, not to get a standard table instead of a tree table. The template allows you to immediately draw specific elements: &lt;/p&gt;

&lt;p&gt;- an active icon to expand/collapse enclosed records; &lt;/p&gt;

&lt;p&gt;- file/folder icons; &lt;/p&gt;

&lt;p&gt;- indents depending on the record level. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JFXr6KMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gg4x54kptqr7xvrr88pr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JFXr6KMF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gg4x54kptqr7xvrr88pr.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The treetable component is filled with hierarchical data that I get from the products.js file. &lt;/p&gt;

&lt;p&gt;Result: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JBRUBquf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t4lbi2j5arr6u6wuwem6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JBRUBquf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t4lbi2j5arr6u6wuwem6.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find the finished application&lt;a href="https://snippet.webix.com/wfx663tz"&gt; here&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Summary.&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;The most important thing is to divide the code into modules. It helped to avoid confusion in the code, and to organize a multi-page interface. It was exciting to explore new Webix widgets in the form of charts and freely editable lists of tables. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title> Webix Tooltips for Improving User Experience</title>
      <dc:creator>JavaScript-Webix-UI</dc:creator>
      <pubDate>Wed, 31 Jul 2019 12:26:49 +0000</pubDate>
      <link>https://dev.to/webixui/webix-tooltips-for-improving-user-experience-32eb</link>
      <guid>https://dev.to/webixui/webix-tooltips-for-improving-user-experience-32eb</guid>
      <description>&lt;p&gt;Tooltips are champions at improving user experience. These pop-up messages guide users through your web app, providing clues and other useful information. Webix Tooltips can be added anywhere: to DataTable headers and footers, controls, HTML elements, etc. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SCZXFwt0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bm1s1gra6k2ejapma71s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCZXFwt0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bm1s1gra6k2ejapma71s.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hexlet.io"&gt;Live demo &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Webix JavaScript tooltips have several advantages as if compared to HTML tooltips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can add any text, markup, or image;&lt;/li&gt;
&lt;li&gt;It is possible to display different text in a tooltip window depending on conditions (when you define a tooltip as a function);&lt;/li&gt;
&lt;li&gt;You can effortlessly customize tooltips is the same way as &lt;a href="https://docs.webix.com/desktop__html_templates.html"&gt;Webix data templates&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How to apply &lt;h2&gt;
&lt;/h2&gt;

&lt;/h2&gt;
&lt;p&gt;You can easily add Webix tooltips to your app. You need just one setting for it. See the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Make everything great&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;autoConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;Good&lt;/span&gt;
&lt;span class="nx"&gt;Great&lt;/span&gt;
&lt;span class="nx"&gt;Make&lt;/span&gt; &lt;span class="nx"&gt;everything&lt;/span&gt; &lt;span class="nx"&gt;Great&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://snippet.webix.com/lp2hiy8e"&gt;View code &amp;gt;&amp;gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you would like to make the content of a tooltip more diverse, you can use familiar template strategies. Such an approach will allow you to get the result that you strive for. There are some hints below showing how to achieve it. Pay attention, the way you add a tooltip depends on a target widget or UI element.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a tooltip anywhere you like&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;You can equip almost any item of your app with a tooltip. Check out the showcases below.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v35p8cng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/c1cxzg58wn227xq3f5f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v35p8cng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/c1cxzg58wn227xq3f5f2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Items of &lt;a href="https://webix.com/widget/data-widgets/"&gt;Webix data widgets&lt;/a&gt;&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;If you need a tooltip with just a small text message for data widgets, you can add it via tooltip: true. But you can also attach an image or dynamic text to a message. Webix tooltips can also display any HTML content.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// ...rest of the config&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's also possible to use your CSS classes and change the place where tooltips pop up. To do this, define tooltip as an object and add the necessary settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;//... same tooltip template as above&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;persons_tooltip&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// ...rest of the config&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://snippet.webix.com/xz81ww4n"&gt;View code &amp;gt;&amp;gt; &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tooltips and controls&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;You can set tooltips for any form controls by means of tooltip: true. It allows adding simple default tooltips which display the value of the control. Have a look at the example of how you can insert a tooltip which shows a selected date of a datapicker.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datepicker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also create something more sophisticated using the same principles as for data item tooltips. The only thing is that the contents displayed by tooltips come from the control settings, but not from the data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datepicker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Client is &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; years old&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Age is unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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



&lt;p&gt;A control with options is another story. In this case, you can add a tooltip for every option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;radio&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;notifications&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Notifications&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You will receive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email notifications.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Yes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://snippet.webix.com/6wcbiy58"&gt;View code &amp;gt;&amp;gt; &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DataTable and Webix tooltips&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;Webix tooltips provide outstanding user experience with DataTable. It's possible to add clues to almost any element of it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Headers and footers&lt;h4&gt;
&lt;/h4&gt;

&lt;/h4&gt;

&lt;p&gt;Tooltips for headers and footers allow you to inform users about the features they can be unaware of. For example, hovering a mouse over a header will call a window with the information that the list can be sorted by name when you click the header. You can also set tooltips as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;true (default tooltips that show the ‘text’ of the header),&lt;/li&gt;
&lt;li&gt;string,&lt;/li&gt;
&lt;li&gt;function that receives the object of a header line.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Purchase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Click to sort the list by #text# name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// "Click to sort the list by Purchase name"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;summColumn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Total money flow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// ...other columns&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A header or a footer with a filter or an aggregator requires a more complicated tooltip function. You can turn to the &lt;a href="https://docs.webix.com/api__ui.datatable_getheadercontent.html"&gt;getHeaderContent&lt;/a&gt; method to display the sum in the footer of the column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Purchase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Click to sort the list by #text# name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;footer&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;summColumn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;getHeaderContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Total money flow: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// ...other columns&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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



&lt;h3&gt;
  
  
  Tooltips for Sparklines&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;You can add tooltips for cells that show sparklines. You have two options:&lt;/p&gt;

&lt;p&gt;1. tooltip:true allows you to show a bigger variant of sparklines,&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a special column tooltip if you want to show them for sparkline items.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To do this, define the tooltip as a function, which in this case receives one more parameter – the value of the sparkline item.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Austria&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;income&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="mi"&gt;710&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;780&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;390&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;660&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;France&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;income&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="mi"&gt;810&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;780&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;940&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;income&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Income per Month&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{common.sparklines()}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;common&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;


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



&lt;p&gt;&lt;a href="https://snippet.webix.com/nk7rlr9i"&gt;View code &amp;gt;&amp;gt; &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tooltips for any HTML areas&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;Webix tooltips can pop up anywhere you like, e.g., when you hover the mouse over a picture. All you need to do is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;to set tooltips for the widget with the tooltip setting,&lt;/li&gt;
&lt;li&gt;to set tooltip text as the webix_tooltip attribute to the HTML element.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;multicombo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Click to add tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delIcons&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mcb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;$view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.webix_multicombo_delete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delIcons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;delIcons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webix_tooltip&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;span class=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="nx"&gt;danger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Click to remove the badge&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The example above shows how to apply tooltips to the whole widget. If you want the tooltips to show up only in particular areas, you can use lower-level API. [TooltipControl(&lt;a href="https://docs.webix.com/api__refs__tooltipcontrol.html)%C2%A0will"&gt;https://docs.webix.com/api__refs__tooltipcontrol.html) will&lt;/a&gt; help in this case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;photo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;img style="height: 260px;" src="/photos/jim.jpg" /&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ... other config&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TooltipControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;photo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;$view&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://snippet.webix.com/xpp58v40"&gt;View code &amp;gt;&amp;gt; &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tooltips for HTML elements&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;You can add Webix Tooltips even to the body of the document where it's possible to place Webix and a non-Webix layout.&lt;br&gt;&lt;br&gt;
Check out the guidelines for creating a static text tooltip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give the HTML area an ID.&lt;/li&gt;
&lt;li&gt;Use the TooltipControl mixin and its addTooltip() method that expects the ID and the text of the tooltip.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// html code&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Book&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="c1"&gt;// js code&lt;/span&gt;
&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TooltipControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter book title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;It&lt;/span&gt; &lt;span class="nx"&gt;would&lt;/span&gt; &lt;span class="nx"&gt;be&lt;/span&gt; &lt;span class="nx"&gt;inconvenient&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;many&lt;/span&gt; &lt;span class="nx"&gt;times&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;especially&lt;/span&gt; &lt;span class="nx"&gt;when&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;need&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;lot&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tooltips&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;several&lt;/span&gt; &lt;span class="nx"&gt;HTML&lt;/span&gt; &lt;span class="nx"&gt;areas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Luckily&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;can&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;webix_tooltip&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;attribute&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;areas&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;then&lt;/span&gt; &lt;span class="nx"&gt;enable&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;tooltip&lt;/span&gt; &lt;span class="nx"&gt;ability&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;their&lt;/span&gt; &lt;span class="nx"&gt;common&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="nx"&gt;area&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="c1"&gt;// html code&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;fieldset&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Poetry&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Horror&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/fieldset&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="c1"&gt;//js code&lt;/span&gt;
&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TooltipControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;genre&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also create dynamic tooltips. They will depend on the changing contents of the master area. To enable this, you will have to provide extra customization handlers within addTooltip(). The handlers define the tooltip behavior and can be used to change it.&lt;/p&gt;

&lt;p&gt;See the example of how you can create a dynamic tooltip for a textarea. Note, the tooltip will show an empty field if you don't type anything in it. $tooltipIn handler will determine the view of the tooltip.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// html code&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;annotation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Annotation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;annotation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;40&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;annotation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;Some&lt;/span&gt; &lt;span class="nx"&gt;book&lt;/span&gt; &lt;span class="nx"&gt;annotation&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/textarea&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// js code&lt;/span&gt;
&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TooltipControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;annotation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;$tooltipIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;webix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TooltipControl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getTooltip&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;template&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Empty field&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://snippet.webix.com/d3zxgjbn"&gt;Live demo &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bottom line&lt;h3&gt;
&lt;/h3&gt;

&lt;/h3&gt;

&lt;p&gt;In the hunt for tricks allowing to improve user experience, it would be wise to pay attention to tooltips. If they are well-styled and applied in the right place, users can learn how to work with your web app very quickly and effortlessly. If you build your software solutions using a UI library, make sure that its tooltips are customizable, so that you could change them to meet your requirements.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>github</category>
    </item>
  </channel>
</rss>
