{"id":11440,"date":"2023-05-16T12:35:05","date_gmt":"2023-05-16T09:35:05","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=11440"},"modified":"2023-08-29T13:48:57","modified_gmt":"2023-08-29T10:48:57","slug":"dhtmlx-to-do-list-1-2","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/dhtmlx-to-do-list-1-2\/","title":{"rendered":"DHTMLX To Do List 1.2 with Task Priority, Synchronized Work of Many Users, and Grid View"},"content":{"rendered":"<p>We are excited to present the official release of DHTMLX To Do List 1.2. This minor update comes with only three main novelties but all of them are designed to significantly improve user experience with our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxTodo\/\" target=\"_blank\" rel=\"noopener\">JavaScript To Do List<\/a>.<\/p>\n<p>First of all, we\u2019ve added the ability to set a priority level for one or multiple selected tasks at once. Moreover, now you can enable several end-users to conveniently work on the same tasks and see each other\u2019s changes in real time by implementing a multi-user backend. And finally, there is an opportunity to enrich your JavaScript To Do list with a Table view using Grid from our Suite library.<\/p>\n\n\t\t<div class='post-banner'>\n\t\t    <div class='post-banner__inside'>\n\t\t        <div>\n\t\t            <div class=\"post-banner__title\">Download DHTMLX To Do List v1.2<\/div>\n\t\t            <div class=\"post-banner__text\">Estimate the updated functionality for building checklists of any complexity level<\/div>\n                <\/div>\n\t\t            \n                \n            <div class='post-banner__btn'>\n                <a href='https:\/\/dhtmlx.com\/docs\/products\/dhtmlxTodo\/download.shtml' title='' class='button-secondary'>Get free trial<\/a>\n            <\/div>\n        \n            <\/div>\n\t\t<\/div>\n\t\n<h5>Task Priority<\/h5>\n<p>Prioritizing is one of the key criteria for enhancing task management productivity. Starting from v1.2, you can enable end-users to organize tasks in a JavaScript To Do List in accordance with their importance by setting a priority level for all of them or resetting it when necessary. With this feature at hand, end-users can make the whole workflow more predictable and tackle each task on a timely basis.<\/p>\n<p>In practice, now it is possible add a priority status to any number of selected tasks in two ways:<\/p>\n<ul>\n<li>via a dropdown list in the task context menu<\/li>\n<\/ul>\n<p>The priority menu offers available priority levels for tasks. Once the required option is clicked, the task will be highlighted with a particular color corresponding to a given priority level. The menu also includes the option for resetting the given priority status.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11441\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/05\/setting-priority.gif\" alt=\"v1.2 - Task Priority\" width=\"803\" height=\"680\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/5cymicwt?tag=todolist&amp;mode=wide\" target=\"_blank\" rel=\"noopener\">Check the sample &gt;<\/a><\/p>\n<ul>\n<li>via keyboard shortcuts<\/li>\n<\/ul>\n<p>To specify the task priority with a keyboard, end-users should press \u201cAlt+ID\u201d of the needed priority level. By default, the priority ID is indicated by numbers (1, 2, 3, and 0) starting with 1 for the top priority task and increasing by one for each lower level and 0 for tasks without priority.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11442\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/05\/setting-priority-with-shortcuts.gif\" alt=\"v1.2 - setting priority with shortcuts\" width=\"803\" height=\"680\" \/><\/p>\n<p>When it comes to adding this feature to your To Do List, you should specify the list of priority elements using the newly added <strong><a href=\"https:\/\/docs.dhtmlx.com\/todolist\/api\/configs\/priorities_config\/\" target=\"_blank\" rel=\"noopener\">priorities<\/a><\/strong> configuration property. In fact, this property is an array of objects describing priority elements. It takes the following parameters:<\/p>\n<ul>\n<li><strong>id<\/strong> (required) &#8211; sets an ID for the element which stands for the priority level. By default, there are 4 priority levels:<\/li>\n<\/ul>\n<p>1 &#8211; high priority level<br \/>\n2 &#8211; medium priority level<br \/>\n3 &#8211; low priority level<br \/>\n0 | null &#8211; no priority<\/p>\n<ul>\n<li><strong>label<\/strong> (required) &#8211; names a priority element<\/li>\n<li><strong>color<\/strong> (optional) &#8211; sets a color for a given priority element<\/li>\n<li><strong>hotkey<\/strong> (optional) &#8211; defines a custom combination of hotkeys for setting a specific priority level<\/li>\n<\/ul>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> list <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> ToDo<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#root&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"co1\">\/\/ other parameters<\/span><br \/>\npriorities<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nid<span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\nlabel<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Critical&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\ncolor<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;#f33&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\nid<span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\nlabel<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Major&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\ncolor<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;rgba(255, 225, 0, 1)&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n... <span class=\"co1\">\/\/ other priority settings<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Besides the default list including 4 options (such as High, Medium, Low, and No Priority), you can make your own list of priority elements and add custom hotkey combinations for them as shown in the example above.<\/p>\n<p>The <strong><a href=\"https:\/\/docs.dhtmlx.com\/todolist\/api\/configs\/tasks_config\/\" target=\"_blank\" rel=\"noopener\">tasks<\/a><\/strong> property of our To Do List also received the <strong>priority<\/strong> parameter intended for specifying an initial priority status.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> tasks<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n<span class=\"br0\">&#123;<\/span><br \/>\n...<br \/>\n<span class=\"me1\">priority<\/span><span class=\"sy0\">?:<\/span> number <span class=\"sy0\">|<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#123;<\/span>...<span class=\"br0\">&#125;<\/span> <span class=\"co1\">\/\/ more task objects<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>To configure how a task with a certain priority level should be shown in the list of tasks, it is necessary to specify the <strong>priority<\/strong> parameter in the <strong><a href=\"https:\/\/docs.dhtmlx.com\/todolist\/api\/configs\/taskshape_config\/\" target=\"_blank\" rel=\"noopener\">taskShape<\/a><\/strong> object. This parameter has two boolean attributes:<\/p>\n<ul>\n<li><strong>cover<\/strong> &#8211; enables\/disables highlighting of the whole task with the color related to its priority level<\/li>\n<li><strong>label<\/strong> &#8211; enables\/disables the display of a priority label added to a given task<\/li>\n<\/ul>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> list <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> ToDo<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;#root&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n...<br \/>\n<span class=\"me1\">taskShape<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\npriority<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\ncover<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\nlabel<span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Moreover, now end-users can sort tasks according to their priority via the context menu in the toolbar.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11446\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/05\/sorting-tasks-according-to-their-priority.gif\" alt=\"v1.2 - sorting tasks according to their priority\" width=\"803\" height=\"680\" \/><\/p>\n<h5>Synchronizing Simultaneous Multiple User Actions<\/h5>\n<p>Such task management tools as our To Do list are very popular in business apps used by companies of various sizes. Therefore, it is great to have the ability to ensure a good user experience for any number of users at once. Specifically for this release, our development team prepared a new <a href=\"https:\/\/snippet.dhtmlx.com\/82ayq2lk?tag=todolist&amp;mode=wide\" target=\"_blank\" rel=\"noopener\">demo<\/a> dedicated to implementing a JavaScript To Do list with a multi-user backend.<\/p>\n<p>Using this useful addition under the hood, multiple end-users can simultaneously manage the same tasks in the list and their actions will be synchronized without page reloading.<\/p>\n<p>To add a multi-user backend to a web project, first of all, you need to get authorization on the server before the To Do List initialization using the <strong>login()<\/strong> function:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">function<\/span> login<span class=\"br0\">&#40;<\/span>url<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">var<\/span> token <span class=\"sy0\">=<\/span> sessionStorage.<span class=\"me1\">getItem<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;login-token&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>token<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">return<\/span> Promise.<span class=\"me1\">resolve<\/span><span class=\"br0\">&#40;<\/span>token<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"kw1\">return<\/span> fetch<span class=\"br0\">&#40;<\/span>url <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;\/login?id=1&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n.<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span>raw <span class=\"sy0\">=&amp;<\/span>gt<span class=\"sy0\">;<\/span> raw.<span class=\"me1\">text<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n.<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span>token <span class=\"sy0\">=&amp;<\/span>gt<span class=\"sy0\">;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\nsessionStorage.<span class=\"me1\">setItem<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;login-token&quot;<\/span><span class=\"sy0\">,<\/span> token<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">return<\/span> token<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>This function should return the server token that is crucial for all subsequent interactions with the server. The token is included in each request as the value of the <strong>Remote-Token<\/strong> header in the following way:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">login<span class=\"br0\">&#40;<\/span>url<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">then<\/span><span class=\"br0\">&#40;<\/span>token <span class=\"sy0\">=&amp;<\/span>gt<span class=\"sy0\">;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"kw1\">const<\/span> restProvider <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> RestDataProvider<span class=\"br0\">&#40;<\/span>url<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nrestProvider.<span class=\"me1\">setHeaders<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;Remote-Token&quot;<\/span><span class=\"sy0\">:<\/span> token<span class=\"sy0\">,<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>After the initialization completion, it is required to add websockets aimed to listen for events from the server:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ create server-client connection<\/span><br \/>\n<span class=\"kw1\">const<\/span> events <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> RemoteEvents<span class=\"br0\">&#40;<\/span>url <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot;\/api\/v1&quot;<\/span><span class=\"sy0\">,<\/span> token<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/ get client handlers<\/span><br \/>\n<span class=\"kw1\">const<\/span> handlers <span class=\"sy0\">=<\/span> todoUpdates<span class=\"br0\">&#40;<\/span><br \/>\nlist.<span class=\"me1\">api<\/span><span class=\"sy0\">,<\/span><br \/>\nrestProvider.<span class=\"me1\">getIDResolver<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"co1\">\/\/ add client handlers for server events<\/span><br \/>\nevents.<span class=\"me1\">on<\/span><span class=\"br0\">&#40;<\/span>handlers<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Apart from that, you can also specify your own logic for processing server events. To this end, the <strong>handlers<\/strong> object passed to <strong>RemoteEvents.on(handlers)<\/strong> should have the following structure:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n<span class=\"st0\">&quot;tasks&quot;<\/span><span class=\"sy0\">:<\/span> tasksHandler<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>obj<span class=\"sy0\">:<\/span> any<span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n<span class=\"st0\">&quot;projects&quot;<\/span><span class=\"sy0\">:<\/span> projectsHandler<span class=\"sy0\">:<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>obj<span class=\"sy0\">:<\/span> any<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>When any change occurs on the backend, the server returns the name of the modified item. These names may vary depending on the server implementation.<\/p>\n<p>The data that should be updated on the frontend will be placed in the <strong>obj<\/strong> argument of the <strong>function(obj: any)<\/strong> function. There is a <strong>type: string<\/strong> field serving to clarify the operation. It can take the following values:<\/p>\n<ul>\n<li>for <strong>tasks<\/strong> &#8211; &#8220;add-task&#8221;, &#8220;update-task&#8221;, &#8220;delete-task&#8221;, &#8220;move-task&#8221;, and &#8220;clone-task&#8221;<\/li>\n<li>for <strong>projects<\/strong> &#8211; &#8220;add-project&#8221;, &#8220;update-project&#8221;, and &#8220;delete-project&#8221;<\/li>\n<\/ul>\n<p>Find more details on adding custom server event handlers on the client-side in the <a href=\"https:\/\/docs.dhtmlx.com\/todolist\/guides\/working_with_server\/#customization-of-server-events\" target=\"_blank\" rel=\"noopener\">documentation<\/a>.<\/p>\n<p>By integrating the multi-user backend into your app, you can significantly facilitate collaboration between end-users and allow them to keep track of any changes via the UI in real time.<\/p>\n<h5>Presenting Task Data with Grid Widget<\/h5>\n<p>The ability to present data in a tabular format is frequently requested in modern business apps. That is why our development team created a new <a href=\"https:\/\/snippet.dhtmlx.com\/e97idjs8?mode=wide\" target=\"_blank\" rel=\"noopener\">demo<\/a> that vividly demonstrates a JavaScript To Do list with the embedded Grid view. It is implemented with the use of the corresponding <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxGrid\/\" target=\"_blank\" rel=\"noopener\">JavaScript Grid widget<\/a> from our Suite library. Thus, end-users get a great opportunity to manage task data with two powerful instruments in one.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11449\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2023\/05\/image4.gif\" alt=\"v1.2 - Grid View\" width=\"968\" height=\"536\" \/><a href=\"https:\/\/snippet.dhtmlx.com\/e97idjs8?tag=todolist&amp;mode=wide\" target=\"_blank\" rel=\"noopener\">Check the sample &gt;<\/a><\/p>\n<p>As you can see, it is possible to add and handle tasks in both views and all changes will be synchronized.<\/p>\n<p>These are the main features delivered in DHTMLX To Do List v1.2 and you can review them one more time in the <a href=\"https:\/\/docs.dhtmlx.com\/todolist\/whats_new\/#version-12\" target=\"_blank\" rel=\"noopener\">&#8220;What\u2019s new&#8221;<\/a> section of our documentation. Be sure to also take a look at <a href=\"https:\/\/docs.dhtmlx.com\/todolist\/migration\/#11---12\" target=\"_blank\" rel=\"noopener\">migration notes<\/a> to v1.2.<\/p>\n<p>To estimate all the novelties in your own scenarios, you can download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxTodo\/download.shtml\" target=\"_blank\" rel=\"noopener\">free 30-day trial version<\/a>. For our current clients, v1.2 is available in their <a href=\"https:\/\/dhtmlx.com\/clients\/\" target=\"_blank\" rel=\"noopener\">Client\u2019s Area<\/a>.<\/p>\n<h5>Related Materials<\/h5>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/todolist\/whats_new\/#version-12\" target=\"_blank\" rel=\"noopener\">What\u2019s new in v1.2<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/todolist\/\" target=\"_blank\" rel=\"noopener\">DHTMLX To Do List documentation<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/5cymicwt?tag=todolist&amp;mode=wide\" target=\"_blank\" rel=\"noopener\">DHTMLX To Do List examples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxTodo\/download.shtml\" target=\"_blank\" rel=\"noopener\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We are excited to present the official release of DHTMLX To Do List 1.2. This minor update comes with only three main novelties but all of them are designed &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":11581,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,68],"class_list":["post-11440","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-to-do-list"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/101014"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=11440"}],"version-history":[{"count":14,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11440\/revisions"}],"predecessor-version":[{"id":11651,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/11440\/revisions\/11651"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/11581"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=11440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=11440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=11440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}