{"id":31941,"date":"2025-09-10T05:00:00","date_gmt":"2025-09-10T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=31941"},"modified":"2025-08-11T14:55:09","modified_gmt":"2025-08-11T12:55:09","slug":"hierarchy-view-in-canvas-apps","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/hierarchy-view-in-canvas-apps\/","title":{"rendered":"Hierarchy view in Canvas apps"},"content":{"rendered":"\n<p>Data hierarchy is popular in business applications \u2013 product catalogs, company organizational structures, and project or task management often require multi-level representation. Application users need tools for clear and intuitive navigation through nested structures. <strong>Presenting data in a readable, multi-level, hierarchical view is one of the biggest challenges that Canvas Apps developers face<\/strong>.<\/p>\n\n\n\n<p>End users expect functional and intuitive interfaces that allow for quick understanding and navigation of data. Presenting information as a multi-level list can significantly improve readability and work efficiency. Hierarchy allows the user to better understand the context, dependencies, and level of detail. Unfortunately, despite the multitude of ready-made components, Canvas Apps <strong>do not offer a ready-made solution for flexible data visualization in this form.<\/strong><\/p>\n\n\n\n<p>Therefore, you need to create your own solutions, which you can learn more about in this article.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Methods of visualizing data in a hierarchy<\/strong><\/strong><\/h2>\n\n\n\n<p>The most popular method of visualizing data in a hierarchy is using nested galleries. This relatively easy-to-implement solution allows for the presentation of a 2-level data structure.<\/p>\n\n\n\n<p><strong>Example of use:<\/strong><\/p>\n\n\n\n<p>The main gallery shows departments, and each record contains a sub-gallery with specific department employees.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"780\" height=\"472\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image1-1.png\" alt=\"Nested gallery\" class=\"wp-image-31902\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image1-1.png 780w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image1-1-300x182.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image1-1-768x465.png 768w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><figcaption class=\"wp-element-caption\">Fig. 1 Nested gallery<\/figcaption><\/figure>\n\n\n\n<p>Sub-gallery data source:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"409\" height=\"102\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image2-1.png\" alt=\"Sub-gallery data source:\" class=\"wp-image-31904\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image2-1.png 409w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image2-1-300x75.png 300w\" sizes=\"(max-width: 409px) 100vw, 409px\" \/><\/figure>\n\n\n\n<p>By making the visibility of nested galleries dependent, for example, on the value of the parent record (group), which is updated after clicking the icon, you can also relatively easily implement expanding\/collapsing sections.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"777\" height=\"466\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image3-1.png\" alt=\"Expanding\/collapsing sections\" class=\"wp-image-31906\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image3-1.png 777w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image3-1-300x180.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image3-1-768x461.png 768w\" sizes=\"(max-width: 777px) 100vw, 777px\" \/><figcaption class=\"wp-element-caption\">Fig. 2 Expanding\/collapsing sections<\/figcaption><\/figure>\n\n\n\n<p>Sub-gallery visibility:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"664\" height=\"49\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image4-1.png\" alt=\"Sub-gallery visibility\" class=\"wp-image-31908\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image4-1.png 664w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image4-1-300x22.png 300w\" sizes=\"(max-width: 664px) 100vw, 664px\" \/><\/figure>\n\n\n\n<p>Action on selecting an icon:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"388\" height=\"174\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image5-1.png\" alt=\"Action on selecting an icon\" class=\"wp-image-31910\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image5-1.png 388w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image5-1-300x135.png 300w\" sizes=\"(max-width: 388px) 100vw, 388px\" \/><\/figure>\n\n\n\n<p>Icon type:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"574\" height=\"33\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image6.png\" alt=\"Icon type:\" class=\"wp-image-31912\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image6.png 574w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image6-300x17.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image6-555x33.png 555w\" sizes=\"(max-width: 574px) 100vw, 574px\" \/><\/figure>\n\n\n\n<p>Due to its low complexity, this solution is very popular and often used. This type of visualization can be a good solution for a two-level hierarchy structure and an optimal amount of data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Disadvantages of the solution<\/strong><\/strong><\/h3>\n\n\n\n<p>However, it is associated with limitations and problems, such as<strong> low efficiency and a lack of flexibility<\/strong>. The internal gallery loads data separately, which significantly affects the system&#8217;s efficiency and speed. Attempting to create additional data nesting will only intensify this effect and slow down the application even more.<\/p>\n\n\n\n<p>Another, this time less obvious, disadvantage of this solution is <strong>the height limit<\/strong> of a single gallery record. Because each of the nested galleries is part of the records of the parent gallery, it is subject to a height limit of 5000. This is especially important when displaying a larger number of records with data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>A hierarchical view in a single gallery<\/strong><\/strong><\/h2>\n\n\n\n<p>Implementing a hierarchical view in a single gallery, using a key that allows for dynamic filtering and arranging data in a multi-level structure, can be a workaround for most of the above-mentioned limitations and problems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Defining keys<\/strong><\/strong><\/h3>\n\n\n\n<p>The most important element of creating this type of view is the correct construction of the key, based on which data in the gallery will be sorted. Defining the level of nested records with data in the context of the entire multi-level structure may also be helpful. It is best to build the key with unique information within a specific data instance. <strong>GUID may be the best choice<\/strong>, because in addition to uniqueness, it has an additional advantage that is very helpful in this case &#8211; a static number of characters.<\/p>\n\n\n\n<p>Defining keys for individual records can be done in several ways.<\/p>\n\n\n\n<p>One of them is to use a loop that will rotate until all records have been processed. Since Canvas Apps do not have a built-in function similar to those in popular programming languages \u200b\u200b(e.g., &#8216; do until&#8217; or &#8216;while&#8217;), a workaround is to use the self-triggering &#8216;toggle&#8217; control. This trick can be used in this situation and any other situation, e.g., when we would like to use the logic of a loop that executes until a certain condition is met.<\/p>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n\n<p>The task table contains relationships between data records from the same table. Task creators can define the order of their execution in this way, split them into specific implementation stages, group them, etc. Each record has a unique identifier (GUID) stored in the &#8216;InternalId&#8217; column. The &#8216;ParentInternalId&#8217; column can also optionally define the identifier of the parent task.<\/p>\n\n\n\n<p>This is an example of the presentation of data relationships reflected in many data instances and business cases.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"172\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image7-1024x172.png\" alt=\"Part of the data table\" class=\"wp-image-31914\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image7-1024x172.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image7-300x51.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image7-768x129.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image7.png 1134w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fig. 3 Part of the data table<\/figcaption><\/figure>\n\n\n\n<p>Due to the lack of a defined number of data nesting levels and the number of records located at these levels, we will use the &#8216;toggle&#8217; control to generate the key. To implement easy and controlled action to trigger the code, we can use a variable that should be used in the default value of the toggle and the appropriate place (e.g. &#8216;OnVisible&#8217; of the screen) define its value to &#8216;true&#8217; (call), and then to &#8216;false&#8217; (deactivation and waiting for the next call).<\/p>\n\n\n\n<p>Setting the value of a variable:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"347\" height=\"44\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image8.png\" alt=\"Setting the value of a variable:\" class=\"wp-image-31916\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image8.png 347w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image8-300x38.png 300w\" sizes=\"(max-width: 347px) 100vw, 347px\" \/><\/figure>\n\n\n\n<p>Default toggle value:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"504\" height=\"38\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image9.png\" alt=\"Default toggle value:\" class=\"wp-image-31918\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image9.png 504w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image9-300x23.png 300w\" sizes=\"(max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<p>The code executed during the toggle operation should be defined in the control&#8217;s OnCheck property. The idea is to update the values \u200b\u200bin the columns with each record&#8217;s key and nesting level.<\/p>\n\n\n\n<p>The sequence of value updates will occur from the highest level (items without a defined parent) and downwards (the most nested items). For this purpose, a collection with the data subject to update is created at each loop rotation. The number of loop rotations (toggle code calls) equals the number of data nesting levels in the hierarchy structure. After that, the key value and nesting level are updated.<\/p>\n\n\n\n<p>The key value is created from the identifiers of the parent records, the processed record, and optionally from a value that allows for the implementation of additional sorting (in this case, the start date). The nesting level value is a numeric value, where 0 means a non-nested record. An increase in these values \u200b\u200bmeans a greater degree of data nesting.<\/p>\n\n\n\n<p>Finally, <strong>a check is made to see if there is still unprocessed data<\/strong>. If the condition is met, the toggle is reactivated. <strong>A negative value of this condition means the end of code execution<\/strong>.<\/p>\n\n\n\n<p>Code executed during toggle activation:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"751\" height=\"812\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie-1.jpg\" alt=\"Code executed during toggle activation:\" class=\"wp-image-31924\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie-1.jpg 751w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie-1-277x300.jpg 277w\" sizes=\"(max-width: 751px) 100vw, 751px\" \/><\/figure>\n\n\n\n<p>Optionally, suppose the order of displayed records within the same instance is important (same level + same parent) when defining the key. In that case, you can include the column value by which the sorting is to occur.<\/p>\n\n\n\n<p>It should be mentioned that the target sorting that will be implemented in the gallery is alphabetical. This is especially important when we expect sorting by a column with numeric values \u200b\u200bor dates. Regarding dates, it is a good idea to include the appropriate format (e.g., &#8216;yyyy-mm-dd&#8217;), as in the example above.<\/p>\n\n\n\n<p>Numeric data may prove more problematic, but you can also create a solution for this type of information. You only need to estimate the maximum number of characters of the largest values. In the example below, it is 3 (i.e., the maximum estimated value is 999). You can increase this value by a margin to maintain a safety buffer.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"617\" height=\"37\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie2.jpg\" alt=\"code\" class=\"wp-image-31926\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie2.jpg 617w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie2-300x18.jpg 300w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/figure>\n\n\n\n<p>In the gallery data source, you should refer to the prepared collection and consider alphabetical sorting by the key column.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"556\" height=\"42\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie3.jpg\" alt=\"code\" class=\"wp-image-31928\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie3.jpg 556w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Przechwytywanie3-300x23.jpg 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/figure>\n\n\n\n<p>To visualize the levels of record nesting in the gallery, you can, for example, use the value from the &#8216;LevelInHierarchy&#8217; column and depend on it for the text offset and background color.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"851\" height=\"516\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image10-1.png\" alt=\"The levels of record nesting in the gallery  visualization \" class=\"wp-image-31930\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image10-1.png 851w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image10-1-300x182.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image10-1-768x466.png 768w\" sizes=\"(max-width: 851px) 100vw, 851px\" \/><figcaption class=\"wp-element-caption\">Fig. 4 The levels of record nesting in the gallery\u00a0 visualization<\/figcaption><\/figure>\n\n\n\n<p>Text offset:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"626\" height=\"36\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image11.png\" alt=\"Text offset\" class=\"wp-image-31932\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image11.png 626w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image11-300x17.png 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/figure>\n\n\n\n<p>Background fill color:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"901\" height=\"35\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image12.png\" alt=\"Background fill color:\" class=\"wp-image-31934\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image12.png 901w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image12-300x12.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/image12-768x30.png 768w\" sizes=\"(max-width: 901px) 100vw, 901px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/en\/job-ads\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/praca-EN-k-4.jpg\" alt=\"job offer\" class=\"wp-image-31943\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/praca-EN-k-4.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/praca-EN-k-4-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Summary<\/strong><\/strong><\/h2>\n\n\n\n<p>The solution presented above enables the visualization of a multi-level data hierarchy without specifying the number of levels in advance. <strong>Due to its flexibility, it can be used in many scenarios<\/strong>. The solution also does not exclude the option of implementing expandable sections and filters.<\/p>\n\n\n\n<p>It is important to remember to ensure an <strong>intuitive distinction between individual data instances<\/strong>, so that individual hierarchical structures do not randomly combine in the view. However, this visual aspect can be handled in many ways, depending on preferences.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;31941&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Hierarchy view in Canvas apps&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Data hierarchy is popular in business applications \u2013 product catalogs, company organizational structures, and project or task management often require &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/hierarchy-view-in-canvas-apps\/\">Continued<\/a><\/p>\n","protected":false},"author":733,"featured_media":31939,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1320],"tags":[2859,1590,1526],"class_list":["post-31941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hard-development","tag-canvas-apps-en","tag-tools","tag-guidebook"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/08\/Computer_2.jpg","category_names":["Hard development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/31941"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/733"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=31941"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/31941\/revisions"}],"predecessor-version":[{"id":31945,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/31941\/revisions\/31945"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/31939"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=31941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=31941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=31941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}