<?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: Liberty</title>
    <description>The latest articles on DEV Community by Liberty (@libert).</description>
    <link>https://dev.to/libert</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%2F1064997%2Fc2b982c3-1646-44cd-972e-2e5a7a20bf91.jpeg</url>
      <title>DEV Community: Liberty</title>
      <link>https://dev.to/libert</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/libert"/>
    <language>en</language>
    <item>
      <title>Open Source Software: an advanced filter</title>
      <dc:creator>Liberty</dc:creator>
      <pubDate>Mon, 19 Jun 2023 05:01:03 +0000</pubDate>
      <link>https://dev.to/libert/open-source-projects-an-advanced-filter-8ek</link>
      <guid>https://dev.to/libert/open-source-projects-an-advanced-filter-8ek</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P5N60jTO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/2a55af5a-800a-49cd-9abe-e422cf42aabc" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P5N60jTO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/2a55af5a-800a-49cd-9abe-e422cf42aabc" alt="filter" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/Liberty-liu/Everright-filter"&gt;https://github.com/Liberty-liu/Everright-filter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1.Supports filtering of multiple data types, including string, number, dropdown, cascade, region, date and time. Whether you need to filter different types of data, it can meet your needs.&lt;/li&gt;
&lt;li&gt;2.Provides a wealth of operators, such as equal to, not equal to, greater than, less than, interval, etc., allowing you to flexibly define filtering rules based on specific conditions.&lt;/li&gt;
&lt;li&gt;3.Provides great flexibility. It supports filtering on date, year, month and day. It also supports the selection of relative time and absolute time, such as today, this week, this month, this year, past N days/hours, future N days/hours, etc. This makes date filtering more flexible and can meet the needs of various time dimensions.&lt;/li&gt;
&lt;li&gt;4.Support conditional grouping settings, you can use logical operators (AND/OR) to combine multiple conditions to implement complex data filtering logic. Data that meets multiple conditions can be filtered out more precisely to meet the needs of advanced data analysis and mining.&lt;/li&gt;
&lt;li&gt;5.For behavioral data, it supports setting start and end time, limit times and limit attributes. You can precisely filter out actions that occurred within a specific time period, and further filter based on frequency and attribute conditions.&lt;/li&gt;
&lt;li&gt;6.Each filter type is extracted and used separately, and can be easily embedded into different UI interfaces. Whether it is a search box, a filter panel or a table header, everright-filter can provide consistent functions and data structures, eliminating the need to develop separate filter functions for different interfaces, saving development resources and time.&lt;/li&gt;
&lt;li&gt;7.Developers can easily configure the data structure of the required functions according to the document UI interface, saving the tedious manual coding and debugging process.&lt;/li&gt;
&lt;li&gt;8.Support Chinese and English&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample screenshot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pHFHp74u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/f4c67762-60c0-44f1-bf6d-726660988309" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pHFHp74u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/f4c67762-60c0-44f1-bf6d-726660988309" alt="text" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  number
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uyLxoVZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/048b03a4-196d-49e0-b816-7c8ea525c50d" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uyLxoVZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/048b03a4-196d-49e0-b816-7c8ea525c50d" alt="number" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  time
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vMp7tMqc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/65be8861-458b-423b-b50c-d34f97da431b" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vMp7tMqc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/65be8861-458b-423b-b50c-d34f97da431b" alt="time" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  date
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jz3P_Paz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c4669a5b-2a21-4d1b-b3c6-b390898ca3fd" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jz3P_Paz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c4669a5b-2a21-4d1b-b3c6-b390898ca3fd" alt="date" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  cascader
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Wek4Dbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/8ef740f5-f7bb-4e1d-8608-5a1bb7578e77" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Wek4Dbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/8ef740f5-f7bb-4e1d-8608-5a1bb7578e77" alt="cascader" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  select
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l8uUVnul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c03357ae-73ce-43ff-b5dd-a65e4a4330b9" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l8uUVnul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c03357ae-73ce-43ff-b5dd-a65e4a4330b9" alt="cascader" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  linear
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QPbBVreA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/77194eeb-56dd-409e-9876-dbec7a332c11" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QPbBVreA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/77194eeb-56dd-409e-9876-dbec7a332c11" alt="image" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  matrix
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CGEeOsJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c0a5ff74-332a-4843-9ef8-29bd9f369bac" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CGEeOsJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/c0a5ff74-332a-4843-9ef8-29bd9f369bac" alt="image" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  quick-search
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HkV1fWpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/02ff7512-aa1c-43f2-8767-3cbd3837dfae" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HkV1fWpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/02ff7512-aa1c-43f2-8767-3cbd3837dfae" alt="image" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  quick-filter
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cQutI2mO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/a815d7fb-7425-4697-bf31-fb48899503e0" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cQutI2mO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/Liberty-liu/Everright-filter/assets/21301475/a815d7fb-7425-4697-bf31-fb48899503e0" alt="image" width="800" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>filter</category>
      <category>querybuilder</category>
      <category>filterbuilder</category>
    </item>
    <item>
      <title>Everright-formEditor low-code drag-and-drop form editor is now open-source</title>
      <dc:creator>Liberty</dc:creator>
      <pubDate>Sat, 15 Apr 2023 12:21:33 +0000</pubDate>
      <link>https://dev.to/libert/a-low-code-drag-and-drop-form-editor-is-now-open-source-2na0</link>
      <guid>https://dev.to/libert/a-low-code-drag-and-drop-form-editor-is-now-open-source-2na0</guid>
      <description>&lt;h2&gt;
  
  
  About the editor
&lt;/h2&gt;

&lt;p&gt;First come to a gif, have a preliminary understanding&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fe61389719e6240b7a907e97de98a1ecc~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fe61389719e6240b7a907e97de98a1ecc~tplv-k3u1fbpfcp-watermark.image%3F" alt="QQ20230408-091351-HD 2.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorry, the picture is a bit blurry&lt;/p&gt;

&lt;p&gt;github: &lt;a href="https://github.com/Liberty-liu/Everright-formEditor" rel="noopener noreferrer"&gt;https://github.com/Liberty-liu/Everright-formEditor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;demo: &lt;a href="https://everright.site/zh-cn/module/formEditor/introduction.html" rel="noopener noreferrer"&gt;https://everright.site/zh-cn/module/formEditor/introduction.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everright-formEditor is a visual editor based on vue3, which depends on element-plus and vant for development. An adapter is provided internally for parameter transcoding.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Flexible interaction(You can decide whether to insert a field into a row or a column by dragging and dropping, without a layout container)&lt;/li&gt;
&lt;li&gt;Providing multiple components(Input,email,ID number、Cellphone,URL,Textarea,Number,Radio,Checkbox,Time,Date,Rate,Switch,Slider,Html,Cascader,Upload file,Signature,Region)&lt;/li&gt;
&lt;li&gt;Layout fields（Grid、Table、Tabs、Collapse、Divider）&lt;/li&gt;
&lt;li&gt;i18n（Chinese and English）&lt;/li&gt;
&lt;li&gt;Built-in two modes：Fields and layout not separated、Fields and layout separated&lt;/li&gt;
&lt;li&gt;The editor,previewer,and configuration panel can all be used independently, and the configuration panel can be selectively used separately according to actual needs to meet the needs of different scenarios&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sample screenshot
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Editor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F57f8aaeb007048ffb429ccf5063dbd74~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F57f8aaeb007048ffb429ccf5063dbd74~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Previewer on PC
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F965007a70c354857a3c61d529e9a67bd~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F965007a70c354857a3c61d529e9a67bd~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Previewer on mobile
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fc8a206aec98f458bb9067b3d75e086cf~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fc8a206aec98f458bb9067b3d75e086cf~tplv-k3u1fbpfcp-watermark.image%3F" alt="IMG_0570.PNG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Config panel
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F96d2157328e940c2831f2605cc24efde~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F96d2157328e940c2831f2605cc24efde~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Internal realization principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Field
&lt;/h3&gt;

&lt;p&gt;Field as one of the elements&lt;/p&gt;

&lt;p&gt;In the form editor, the main operation is an element, the layout container(also one of the elements) is used as the carrier of the Field. use the following figure to represent a Field,and the Field itself will have many attributes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F73e531dfc52245a69025a8b6f2a0e0ae~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F73e531dfc52245a69025a8b6f2a0e0ae~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note the white pattern in the upper right corner, indicating that the internal properties of this Field are jointly determined by the input of the two pipelines.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the canvas panel and the selection below the canvas panel&lt;/li&gt;
&lt;li&gt;From the configuration panel configuration properties&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Field is inserted into the Canvas drawing board by the user's click or drag and drop&lt;/p&gt;

&lt;h2&gt;
  
  
  Canvas
&lt;/h2&gt;

&lt;p&gt;Use the following figure to represent the Canvas drawing board&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F4e2fb6dd1a1f4371a15b66322f6162bb~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F4e2fb6dd1a1f4371a15b66322f6162bb~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data inside the Canvas drawing board is represented by a two-dimensional array &lt;code&gt;Array[r][c]&lt;/code&gt;, where r is the row and c is the column. In fact, it is the same as the table, and the interior can be nested infinitely (the layout container can be nested ).&lt;/p&gt;

&lt;p&gt;When an element is inserted into the Canvas artboard, the element will be automatically wrapped by Selection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selection
&lt;/h3&gt;

&lt;p&gt;Use the following figure to represent the Selection&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F204ff3726bb94d7389728c9db547bbde~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F204ff3726bb94d7389728c9db547bbde~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The white area in the figure represents the slot, where elements are placed.&lt;/p&gt;

&lt;p&gt;Selection provides whether it can be dragged, deleted, copied, resized, and parented.&lt;/p&gt;

&lt;p&gt;When an element is selected, it will be highlighted on the Canvas panel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Config panel
&lt;/h3&gt;

&lt;p&gt;Use the following figure to represent the configuration panel&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F166c726ae01c4d5cb6c8b5b24b1b5ebf~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp6-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F166c726ae01c4d5cb6c8b5b24b1b5ebf~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Used to configure field properties.&lt;/p&gt;

&lt;p&gt;When an element is selected, the Config panel will display all the properties of the selected element itself&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Flow Diagram
&lt;/h3&gt;

&lt;p&gt;Combined with the above schematic diagram, the user's behavior is shown in the following diagram&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fd1ba3a46e9564c3781973ec8630f8e3d~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fd1ba3a46e9564c3781973ec8630f8e3d~tplv-k3u1fbpfcp-watermark.image%3F" alt="WX20230410-134616@2x.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solid arrows represent user actions&lt;/li&gt;
&lt;li&gt;Solid arrow with a dot represents an automatically occurring event&lt;/li&gt;
&lt;li&gt;Dashed arrows indicate data flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add a paragraph of text description to facilitate understanding&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When the user drags an element into the artboard by clicking or dragging, the editor will automatically wrap a selection for the element&lt;/li&gt;
&lt;li&gt;When the user selects the selection area, the Config panel will display all the properties of the selected element itself&lt;/li&gt;
&lt;li&gt;When the user modifies the attribute of the element through the Config panel or the Selection (Selection), the data will be synchronized to the Canvas drawing board, so that what you see is what you get&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adapter
&lt;/h3&gt;

&lt;p&gt;Use the following figure to represent the adapter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F4ba9369f37b44d1fb75e3f26b9ffaeff~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp9-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2F4ba9369f37b44d1fb75e3f26b9ffaeff~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since pc depends on element-plus, and mobile depends on vant, the functional parameters of the intersection between them are somewhat different, and the adapter does this physical work.&lt;/p&gt;

&lt;p&gt;example&lt;/p&gt;

&lt;p&gt;The Rate rating component wants to set the number of stars ⭐️, the element-plus parameter is max, and the vant is count.&lt;/p&gt;

&lt;p&gt;Insert a little code below to show what the adapter does&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!isPc) {
  result.count = options.max
} else {
  result.max = options.max
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Two modes of the editor
&lt;/h3&gt;

&lt;p&gt;Recall that the main data flowing inside the editor is elements, which are divided into fields and layout containers.&lt;/p&gt;

&lt;p&gt;The real data inside the editor is a tree structure.&lt;/p&gt;

&lt;p&gt;By default, the editor adopts a mode in which the layout and fields are not separated. Of course, the mode in which the layout and fields are separated is also supported.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;layoutType1 Fields and layout not separated&lt;/p&gt;

&lt;p&gt;Designing the form on the PC side will adapt to the mobile side.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;layoutType2 Fields and layout separated&lt;/p&gt;

&lt;p&gt;When designing a form on a PC, for example, if a field such as "email" is placed in a tabs container, switching to the mobile end will not synchronize the tabs container.  In this case, if a new Collapse container is created on mobile and the email field is placed in it, switching to the PC end will not synchronize the Collapse container.  For fields added on one end, when switching to the other end, with newly added fields pushed to the bottom of the canvas and deleted fields removed from the layout structure.  All properties of the fields themselves are synchronized.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless of the mode used, the exported data will extract the fields, and for the backend, they are more concerned with the fields rather than the tree structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the internal drag and drop principle
&lt;/h3&gt;

&lt;p&gt;The implementation relies on sortablejs, but inserting rows or columns is not supported by sortablejs. When inserting a row, wrap it with an inline container (inserting an element in a row will automatically wrap it with a virtual inline container). In short, when dragging an element, if a row is inserted, an inline container will be wrapped; if a column is inserted, it will be inserted below the inline container.&lt;/p&gt;

&lt;p&gt;Therefore, a sortablejs plugin was written to intercept dragOver and drop events to achieve this.&lt;/p&gt;

&lt;p&gt;When dragging, the dragOver event is continuously triggered. Based on the x/y coordinates of the current mouse position, it is determined in which of the four directions of the target element to insert a row or a column. The four directions are determined based on the slope calculation, which can be easily understood by referring to a figure. When dropping, the last dragOver element and instance are recorded to implement the feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fc955feacf07a41b09cdd279579e68949~tplv-k3u1fbpfcp-watermark.image%3F" 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%2Fp1-juejin.byteimg.com%2Ftos-cn-i-k3u1fbpfcp%2Fc955feacf07a41b09cdd279579e68949~tplv-k3u1fbpfcp-watermark.image%3F" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Existing functional defects
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;history record&lt;/li&gt;
&lt;li&gt;Reflect the tree structure interface&lt;/li&gt;
&lt;li&gt;GUI mode to control field display and hiding and logic verification&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The above functions will be developed next&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>vue</category>
      <category>opensource</category>
      <category>lowcode</category>
    </item>
  </channel>
</rss>
