{"id":12924,"date":"2021-03-12T21:20:53","date_gmt":"2021-03-12T20:20:53","guid":{"rendered":"https:\/\/www.tomislavstankovic.com\/blog\/?p=12924"},"modified":"2021-03-12T21:20:53","modified_gmt":"2021-03-12T20:20:53","slug":"devextreme-pivot-grid-angular","status":"publish","type":"post","link":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/","title":{"rendered":"DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka"},"content":{"rendered":"<p>U ovom \u0107u blog postu pokazati kako implementirati <em>DevExtreme Pivot Grid UI<\/em> komponentu u <em><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/angular-framework-resursi\/\" rel=\"noopener\" target=\"_blank\">Angular<\/a><\/em> projekt. Ona omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili <a href=\"https:\/\/en.wikipedia.org\/wiki\/OLAP_cube\" rel=\"noopener\" target=\"_blank\">OLAP kocke<\/a>.<\/p>\n<p>Fokusirat \u0107u se na prikaz podataka prema specifi\u010dnim parameterima te na\u010dinu na koji te podatke ure\u0111ivati jer <em>Pivot Grid<\/em> nativno ne nudi takvu mogu\u0107nost.<\/p>\n<h2>Pivot Grid prikaz podataka<\/h2>\n<p>Prva i osnovna zna\u010dajka <a href=\"https:\/\/js.devexpress.com\/Demos\/WidgetsGallery\/Demo\/PivotGrid\/Overview\/Angular\/Light\/\" rel=\"noopener\" target=\"_blank\"><em>Pivot Grida<\/em> je prikaz i analizu vi\u0161edimenzionalnih podataka<\/a>.<\/p>\n<p>U ovom \u0107u primjeru koristiti strukturu podataka prikazanu u JSON-u kojega je mogu\u0107e vidjeti ispod. S jedne strane biti \u0107e poslovnice, a s druge automobili. Cilj je prikazati koli\u010dinu naru\u010denih tj. isporu\u010denih automobila ovisno o poslovnici.<\/p>\n<p>Logika aplikacije nalazit \u0107e se unutar <em><strong>angular-devextreme.component.ts<\/strong><\/em> datoteke koja se temelji na <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/PivotGridDataSource\/\" rel=\"noopener\" target=\"_blank\">PivotGridDataSource<\/a> objektu. Za sada \u0107e se unutar njega nalaziti samo <span class=\"lang:js decode:true  crayon-inline\">fields<\/span> <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/PivotGridDataSource\/Configuration\/fields\/\" rel=\"noopener\" target=\"_blank\">niz<\/a> i <span class=\"lang:js decode:true  crayon-inline\">store<\/span> <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/PivotGridDataSource\/Configuration\/store\/\" rel=\"noopener\" target=\"_blank\">objekt<\/a>.<\/p>\n<p>Poslovnice \u0107e se nalaziti krajnje lijevo <span class=\"lang:js decode:true  crayon-inline \" >area: &#8220;row&#8221;<\/span>, a automobili na vrhu <span class=\"lang:js decode:true  crayon-inline \" >area: &#8220;column&#8221;<\/span>. Sve ostalo tj. narud\u017ebe prikazuju se kao podaci <span class=\"lang:js decode:true  crayon-inline \" >area: &#8220;data&#8221;<\/span>.<\/p>\n<pre class=\"lang:js decode:true \" title=\"angular-devextreme.component.ts\" >import { Component, OnInit } from '@angular\/core';\r\n\r\nimport PivotGridDataSource from \"devextreme\/ui\/pivot_grid\/data_source\";\r\n\r\n@Component({\r\n  selector: 'app-narudzbe-popis',\r\n  templateUrl: '.\/narudzbe-popis.component.html',\r\n  styleUrls: ['.\/narudzbe-popis.component.scss']\r\n})\r\n\r\nexport class NarudzbePopisComponent implements OnInit {\r\n\r\n  dataSource: PivotGridDataSource;\r\n\r\n  podaciDemo = [\r\n    {\r\n      \"poslovnica_ID\": 163,\r\n      \"poslovnica_naziv\": \"POSLOVNICA VK\",\r\n      \"narudzba_ID\": 1720303,\r\n      \"narudzba_narucenakolicina\": 50,\r\n      \/\/Od 50 isporu\u010deno 49 automobila\r\n      \"narudzba_isporucenakolicina\": 49,\r\n      \"artikl_ar_ID\": 69567,\r\n      \"artikl_sifra\": 666627,\r\n      \"artikl_naziv\": \"Tesla Model S\"\r\n    },\r\n    {\r\n      \"poslovnica_ID\": 163,\r\n      \"poslovnica_naziv\": \"POSLOVNICA VK\",\r\n      \"narudzba_ID\": 83572434,\r\n      \"narudzba_narucenakolicina\": 20,\r\n      \/\/Jo\u0161 nije unesena isporu\u010dena koli\u010dina\r\n      \"narudzba_isporucenakolicina\": null,\r\n      \"artikl_ar_ID\": 69463,\r\n      \"artikl_sifra\": 555018,\r\n      \"artikl_naziv\": \"Fiat Panda\"\r\n    },\r\n    {\r\n      \"poslovnica_ID\": 163,\r\n      \"poslovnica_naziv\": \"POSLOVNICA VK\",\r\n      \"narudzba_ID\": 83572437,\r\n      \"narudzba_narucenakolicina\": 6,\r\n      \/\/Od 6 isporu\u010deno 0 automobila\r\n      \"narudzba_isporucenakolicina\": 0,\r\n      \"artikl_ar_ID\": 69610,\r\n      \"artikl_sifra\": 102836,\r\n      \"artikl_naziv\": \"Kia Rio\"\r\n    },\r\n...\r\n]\r\n\r\n  constructor() {}\r\n\r\n  ngOnInit(): void {\r\n      this.prikaziNarudzbe();\r\n  }\r\n\r\n  prikaziNarudzbe(){\r\n          this.dataSource = new PivotGridDataSource({\r\n            fields: [\r\n              {\r\n                dataField: \"poslovnica_naziv\",\r\n                dataType: \"string\",\r\n                area: \"row\",\r\n                width: 120\r\n              },\r\n              {\r\n                dataField: \"artikl_naziv\",\r\n                dataType: \"string\",\r\n                area: \"column\",\r\n                expanded: true\r\n              },\r\n              {\r\n                caption: \"Naru\u010deno\",\r\n                dataField: \"narudzba_narucenakolicina\",\r\n                dataType: \"number\",\r\n                summaryType: \"sum\",\r\n                area: \"data\"\r\n              },\r\n              {\r\n                caption: \"Isporu\u010deno\",\r\n                dataField: \"narudzba_isporucenakolicina\",\r\n                dataType: \"number\",\r\n                summaryType: \"sum\",\r\n                area: \"data\"\r\n              }\r\n            ],\r\n            store: {\r\n              type: \"array\",\r\n              data: this.podaciDemo\r\n            }\r\n        });\r\n  }\r\n\r\n}<\/pre>\n<p>Izgled su\u010delja biti \u0107e definiran unutar <em><strong>angular-devextreme.component.html<\/strong><\/em> datoteke. <\/p>\n<p>Od <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/\" rel=\"noopener\" target=\"_blank\"><em>Pivot Grid UI<\/em> svojstva<\/a> koristit \u0107u ih nekoliko: <\/p>\n<li><em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/#showBorders\" rel=\"noopener\" target=\"_blank\">showBorders<\/a><\/em> &#8211; \u017eelim da vanjski rubovi budu vidljivi.<\/li>\n<li><em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/#showColumnGrandTotals\" rel=\"noopener\" target=\"_blank\">showColumnGrandTotals<\/a><\/em> &#8211; ne \u017eelim prikazivati ukupne vrijednosti za kolone. Ovo bi se ina\u010de prikazivalo krajnje desno.<\/li>\n<li><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/#showRowGrandTotals\" rel=\"noopener\" target=\"_blank\">showRowGrandTotals<\/a> &#8211; \u017eelim na dnu prikazati ukupne vrijednosti.<\/li>\n<pre class=\"lang:xhtml decode:true \" title=\"angular-devextreme.component.html\" >&lt;dx-pivot-grid\r\n            [showBorders]=\"true\"\r\n            [showColumnGrandTotals]=\"false\"\r\n            [showRowGrandTotals]=\"true\"\r\n            [dataSource]=\"dataSource\"&gt;\r\n            &lt;dxo-field-chooser [enabled]=\"false\" [height]=\"400\"&gt;&lt;\/dxo-field-chooser&gt;\r\n            &lt;dxo-scrolling\r\n                mode=\"standard\"  \r\n                [useNative]=\"false\"\r\n                [scrollByContent]=\"true\"\r\n                [scrollByThumb]=\"true\"\r\n                showScrollbar=\"always\"&gt;\r\n            &lt;\/dxo-scrolling&gt; &lt;!-- \"virtual\" | \"infinite\" --&gt;\r\n&lt;\/dx-pivot-grid&gt;<\/pre>\n<p>Sve to zajedno na kraju daje sljede\u0107e:<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid.jpg\" alt=\"DevExtreme Pivot Grid - osnovni prikaz\" width=\"1466\" height=\"669\" class=\"alignnone size-full wp-image-13065\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid.jpg 1466w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid-300x137.jpg 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid-1024x467.jpg 1024w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-PivotGrid-768x350.jpg 768w\" sizes=\"auto, (max-width: 1466px) 100vw, 1466px\" \/><\/a><\/p>\n<h2>Pivot Grid &#8211; promjena izgleda polja<\/h2>\n<p>Ako \u017eelim dodatno prilagoditi prikaz odre\u0111enih polja to mogu napraviti koriste\u0107i <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/#onCellPrepared\" rel=\"noopener\" target=\"_blank\">onCellPrepared<\/a><\/em> metodu.<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dx-pivot-grid ...\r\n    (onCellPrepared)=\"onCellPrepared($event)\"&gt;\r\n&lt;\/dx-pivot-grid&gt;<\/pre>\n<p>U ovom slu\u010daju ho\u0107u napraviti tri grafi\u010dke izmjene. Stupac &#8220;Naru\u010deno&#8221; \u0107e imati sivu pozadinsku boju i podebljane brojeve, ukupne vrijednosti na dnu tako\u0111er \u0107e biti podebljanje, a vrijednosti koje za &#8220;Isporu\u010deno&#8221; imaju <span class=\"lang:js decode:true  crayon-inline \" >null<\/span> \u0107e imati crvenu pozadinsku boju kako bi bila uo\u010dljivija.<\/p>\n<pre class=\"lang:js decode:true \" >onCellPrepared(e){\r\n      \r\n    if(e.cell.rowType == \"GT\"){\r\n      e.cellElement.style.fontWeight = \"bold\";\r\n    }\r\n\r\n    if(e.area == 'data' && e.columnIndex % 2 == 0){\r\n          e.cellElement.style.fontWeight = \"bold\";\r\n          e.cellElement.style.backgroundColor = \"rgb(242,242,242)\";\r\n    }\r\n    \r\n    if(e.area === \"data\" && e.cell.dataIndex === 1 && e.cell.value === null && e.cell.rowType != \"GT\"){\r\n        e.cellElement.style.backgroundColor = \"rgb(255 0 0 \/ 42%)\";\r\n    }\r\n          \r\n  }<\/pre>\n<p>Na ekranu bi to izgledalo ovako:<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1.png\" alt=\"Pivot Grid onCellPrepared\" width=\"1466\" height=\"668\" class=\"alignnone size-full wp-image-13117\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1.png 1466w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1-300x137.png 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1-1024x467.png 1024w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-1-768x350.png 768w\" sizes=\"auto, (max-width: 1466px) 100vw, 1466px\" \/><\/a><\/p>\n<p>Me\u0111utim, niti jedno polje nema crvenu pozadinsku boju. Razlog je \u0161to <em>Pivot Grid<\/em> sve <span class=\"lang:js decode:true  crayon-inline \" >null<\/span> vrijednosti vidi kao <code>0<\/code> i zato uvjet <span class=\"lang:js decode:true  crayon-inline \" >e.cell.value === null<\/span> nije zadovoljen. Ali ako stavim <span class=\"lang:js decode:true  crayon-inline \" >e.cell.value === 0<\/span> stanje \u0107e biti puno druga\u010dije.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2.png\" alt=\"Pivot Grid onCellPrepared\" width=\"1467\" height=\"668\" class=\"alignnone size-full wp-image-13130\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2.png 1467w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2-300x137.png 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2-1024x466.png 1024w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellPrepared-2-768x350.png 768w\" sizes=\"auto, (max-width: 1467px) 100vw, 1467px\" \/><\/a><\/p>\n<p>Iz <span class=\"lang:js decode:true  crayon-inline \" >podaciDemo<\/span> niza se mo\u017ee vidjeti da <span class=\"lang:js decode:true  crayon-inline \" >narudzba_isporucenakolicina<\/span> mo\u017ee imati vrijednosti <span class=\"lang:js decode:true  crayon-inline \" >null<\/span>. To zna\u010di da bi vrijednost za &#8220;POSLOVNICA VK&#8221; i automobil &#8220;Fiat Panda&#8221; trebala imati crvenu pozadinsku boju jer je <span class=\"lang:js decode:true  crayon-inline \" >narudzba_isporucenakolicina = null<\/span>, a kombinacija POSLOVNICA VK&#8221; i &#8220;Kia Rio&#8221; ne bi trebala imati crvenu pozadinsku boju jer ima vrijednost <span class=\"lang:js decode:true  crayon-inline \" >narudzba_isporucenakolicina = 0<\/span>.<\/p>\n<h2>Pivot Grid &#8211; prikaz null vrijednosti<\/h2>\n<p>Kako bi u <em>PivotGridu<\/em> mogao prikazati <span class=\"lang:js decode:true  crayon-inline \" >null<\/span> vrijednosti i razlikovati ih od vrijednosti <code>0<\/code> koristiti \u0107u <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/PivotGridDataSource\/Configuration\/fields\/#calculateCustomSummary\" rel=\"noopener\" target=\"_blank\">calculateCustomSummary<\/a><\/em> funkciju. Tu \u0107u funkciju vezati uz polje <span class=\"lang:js decode:true  crayon-inline \" >dataField: &#8220;narudzba_isporucenakolicina&#8221;<\/span>.<\/p>\n<pre class=\"lang:js mark:7-17 decode:true   \" >{\r\n        caption: \"Isporu\u010deno\",\r\n        dataField: \"narudzba_isporucenakolicina\",\r\n        dataType: \"number\",\r\n        \/\/summaryType: \"sum\",\r\n        area: \"data\",\r\n        summaryType: \"custom\",\r\n        calculateCustomSummary: function(options) {  \r\n          if (options.summaryProcess == 'start') {  \r\n              options.totalValue = null;  \r\n          }  \r\n          if (options.summaryProcess == 'calculate') {  \r\n              if (options.value !== null) {  \r\n                  options.totalValue += options.value;  \r\n              }  \r\n          }  \r\n        }\r\n}<\/pre>\n<p>Sada se na ekranu mo\u017ee vidjeti da istovremeno imam prikazane vrijednosti za isporu\u010denu koli\u010dinu i kao <code>null<\/code> i kao <code>0<\/code>.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary.png\" alt=\"Pivot Grid calculateCustomSummary\" width=\"1625\" height=\"670\" class=\"alignnone size-full wp-image-13140\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary.png 1625w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary-300x124.png 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary-1024x422.png 1024w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary-768x317.png 768w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-calculateCustomSummary-1536x633.png 1536w\" sizes=\"auto, (max-width: 1625px) 100vw, 1625px\" \/><\/a><\/p>\n<h2>Omogu\u0107iti klik na odabrano polje<\/h2>\n<p>\u017delim omogu\u0107iti klik samo na polje koje pokazuje isporu\u010denu koli\u010dinu, ali isklju\u010divo za poslovnice i automobile koji imaju unesenu naru\u010denu koli\u010dinu. Zna\u010di, ne \u017eelim da se u koloni sa isporu\u010denom koli\u010dinom mo\u017ee kliknuti na prazno polje jer nema smisla unositi isporu\u010denu koli\u010dinu ako ni\u0161ta nije naru\u010deno.<\/p>\n<p>Za to \u0107u koristiti <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPivotGrid\/Configuration\/#onCellClick\" rel=\"noopener\" target=\"_blank\">onCellClick<\/a><\/em> funkciju.<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dx-pivot-grid ...\r\n    (onCellClick)=\"onPivotCellClick($event)\"&gt;\r\n&lt;\/dx-pivot-grid&gt;<\/pre>\n<pre class=\"lang:js decode:true \" >onPivotCellClick(e) {\r\n    \/\/Klik na polje \"narudzba_isporucenakolicina\" ako ima unesenu vrijednost\r\n    if(e.area == \"data\" &amp;&amp; e.cell.dataIndex == 1 &amp;&amp; e.cell.value != undefined &amp;&amp; e.cell.rowType != \"GT\") {\r\n      console.log(e);\r\n    }\r\n    \/\/Klik na polje \"narudzba_isporucenakolicina\" ako je vrijednosti null tj. ako je polje crvene pozadinske boje\r\n    if(e.area === \"data\" &amp;&amp; e.cell.dataIndex === 1 &amp;&amp; e.cell.value === null &amp;&amp; e.cell.rowType != \"GT\"){\r\n      console.log(e);\r\n    }\r\n }<\/pre>\n<p>Iz prikazanog se mo\u017ee vidjeti da klik na prazno polje ne radi ni\u0161ta, klik na crveno polje dohva\u0107a vrijednost <code>null<\/code>, a klik na polje za unesenom koli\u010dinom dohva\u0107a tu vrijednost. U ovom slu\u010daju ta vrijednost je <code>10<\/code>.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellClick.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-onCellClick.gif\" alt=\"Pivot Grid onCellClick\" width=\"743\" height=\"672\" class=\"alignnone size-full wp-image-13155\" \/><\/a><\/p>\n<h2>Pivot Grid dohva\u0107anje vrijednosti polja<\/h2>\n<p><em>Pivot Grid<\/em> je primarno kreiran s ciljem prikaza podataka tj. prema dokumentaciji nema mogu\u0107nost jednostavnog ure\u0111ivanja podataka kao \u0161to je to slu\u010daj kod <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/Guide\/UI_Components\/DataGrid\/Editing\/\" rel=\"noopener\" target=\"_blank\">Data Grida<\/a><\/em>, barem ju nisam na\u0161ao, ali sam znao da mora postojati neko rje\u0161enje.<\/p>\n<p>Za po\u010detak \u017eelim prikazati nekakvu formu unutar koje \u0107e se vrijednost polja mo\u0107i urediti. Za to \u0107u iskoristiti <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPopup\/\" rel=\"noopener\" target=\"_blank\"><em>Popup UI<\/em> komponentu<\/a>. Unutar nje definiram <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/Markup_Components\/dxTemplate\/\" rel=\"noopener\" target=\"_blank\">dxTemplate<\/a><\/em> \u0161to mi omogu\u0107ava daljnju prilagodbu su\u010delja za ure\u0111ivanje isporu\u010dene vrijednosti.<\/p>\n<p>Za dohva\u0107anje vrijednosti kliknutog polja koristit \u0107u <em><a href=\"https:\/\/js.devexpress.com\/Demos\/WidgetsGallery\/Demo\/PivotGrid\/DrillDown\/Angular\/Light\/\" rel=\"noopener\" target=\"_blank\">Drill Down<\/a><\/em>.<\/p>\n<pre class=\"lang:xhtml decode:true \" >...\r\n&lt;\/dx-pivot-grid&gt;\r\n        &lt;dx-popup\r\n        [closeOnOutsideClick]=\"false\"\r\n        [showCloseButton]=\"true\"\r\n        [(visible)]=\"popupVisible\"\r\n        [title]=\"popupTitle\"\r\n        [width]=\"650\"\r\n        [height]=\"200\"\r\n        &gt;\r\n        &lt;div *dxTemplate=\"let data of 'content'\"&gt;\r\n            &lt;dx-data-grid\r\n            #drillDownDataGrid\r\n            [dataSource]=\"drillDownDataSource\"\r\n            &gt;\r\n            &lt;\/dx-data-grid&gt;\r\n        &lt;\/div&gt;\r\n        &lt;\/dx-popup&gt;<\/pre>\n<pre class=\"lang:js mark:4,28-34,39-45 decode:true \" >import { \r\n        Component,\r\n        OnInit,\r\n        ViewChild\r\n      } \r\n      from '@angular\/core';\r\n\r\nimport { DxTextBoxComponent } from 'devextreme-angular';\r\n   ...\r\n\r\nexport class NarudzbePopisComponent implements OnInit {\r\n\r\n  popupVisible = false;\r\n  popupTitle: string;\r\n  narudzba_ID: number;\r\n  isporucenakolicina: number;\r\n  narucenaKolicinaPopup: number;\r\n\r\n  drillDownDataSource: any;\r\n\r\n  @ViewChild(\"kolicinaUnos\", { static: false }) inputName: DxTextBoxComponent;\r\n...\r\n\r\nonPivotCellClick(e) {\r\n    \/\/Klik na polje \"narudzba_isporucenakolicina\" ako ima unesenu vrijednost\r\n    if(e.area == \"data\" &amp;&amp; e.cell.dataIndex == 1 &amp;&amp; e.cell.value != undefined &amp;&amp; e.cell.rowType != \"GT\") {\r\n      \/\/console.log(e);\r\n      this.drillDownDataSource = this.dataSource.createDrillDownDataSource(e.cell);\r\n        let _this = this;\r\n        this.drillDownDataSource.load().done(function(result) {\r\n          _this.narucenaKolicinaPopup = result[0].nas_kolicina;\r\n        });\r\n        this.popupTitle = e.cell.rowPath[0] + ' - ' + e.cell.columnPath[0];\r\n        this.popupVisible = true;\r\n    }\r\n    \/\/Klik na polje \"narudzba_isporucenakolicina\" ako je vrijednosti null tj. ako je polje crvene pozadinske boje\r\n    if(e.area === \"data\" &amp;&amp; e.cell.dataIndex === 1 &amp;&amp; e.cell.value === null &amp;&amp; e.cell.rowType != \"GT\"){\r\n      \/\/console.log(e);\r\n      this.drillDownDataSource = this.dataSource.createDrillDownDataSource(e.cell);\r\n        let _this = this;\r\n        this.drillDownDataSource.load().done(function(result) {\r\n          _this.narucenaKolicinaPopup = result[0].nas_kolicina;\r\n        });\r\n        this.popupTitle = e.cell.rowPath[0] + ' - ' + e.cell.columnPath[0];\r\n        this.popupVisible = true;\r\n    }\r\n  }<\/pre>\n<p>Klikom na polje isporu\u010dene koli\u010dine prikazat \u0107e se sljede\u0107e:<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown.png\" alt=\"PivotGrid DxPopup DrillDown\" width=\"1114\" height=\"669\" class=\"alignnone size-full wp-image-13196\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown.png 1114w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown-300x180.png 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown-1024x615.png 1024w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/PivotGrid-DxPopup-DrillDown-768x461.png 768w\" sizes=\"auto, (max-width: 1114px) 100vw, 1114px\" \/><\/a><\/p>\n<p>Kao \u0161to se iz prikazanog mo\u017ee vidjeti dohva\u0107eni su podaci prikazani na vrhu blog posta.<\/p>\n<pre class=\"lang:js decode:true \" >{\r\n      \"poslovnica_ID\": 163,\r\n      \"poslovnica_naziv\": \"POSLOVNICA VK\",\r\n      \"narudzba_ID\": 1720303,\r\n      \"narudzba_narucenakolicina\": 50,\r\n      \/\/Od 50 isporu\u010deno 49 automobila\r\n      \"narudzba_isporucenakolicina\": 49,\r\n      \"artikl_ar_ID\": 69567,\r\n      \"artikl_sifra\": 666627,\r\n      \"artikl_naziv\": \"Tesla Model S\"\r\n}<\/pre>\n<h2>Pivot Grid ure\u0111ivanje vrijednosti polja<\/h2>\n<p>Popup iz gornjeg primjera je potrebno prilagoditi na na\u010din da se kreira <strong>input polje za izmjenu isporu\u010dene koli\u010dine<\/strong>. Klikom na polje sa ve\u0107 unesenom isporu\u010denom koli\u010dinom ista \u0107e se prikazati unutar input polja. Ako je polje prazno isto \u0107e biti i input polje.<\/p>\n<p>U GIF-u se mo\u017ee primjetiti da ure\u0111ivanje isporu\u010dene koli\u010dine uredno prolazi, ali uz jedan problem. Prilikom svakog spremanja isporu\u010dene koli\u010dine cijeli se <em>Pivot Grid<\/em> osvje\u017ei i vrati u krajnju lijevu poziciju. Naravno da to nije prakti\u010dno. Uz to, prilikom otvaranja <em>popupa<\/em> polje za unos koli\u010dine nije fokusirano (crvena podcrtana linija) nego je na njega prvo potrebno kliknuti.<\/p>\n<p>U nastavku \u0107u pokazati kako rije\u0161iti oba problema.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/03\/PivotGrid-Edit.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/03\/PivotGrid-Edit.gif\" alt=\"Pivot Grid ure\u0111ivanje\" width=\"1366\" height=\"682\" class=\"alignnone size-full wp-image-13422\" \/><\/a><\/p>\n<pre class=\"lang:xhtml mark:7-30 decode:true \" >&lt;div *dxTemplate=\"let data of 'content'\"&gt;\r\n            &lt;dx-data-grid\r\n            class=\"dataGridKlasa\"\r\n            #drillDownDataGrid\r\n            [dataSource]=\"drillDownDataSource\"\r\n            &gt;\r\n                &lt;dxi-column dataField=\"narudzba_isporucenakolicina\" caption=\"Isporu\u010dena koli\u010dina\" [visible]=\"true\" cellTemplate=\"urediKolicinu\"&gt;\r\n                    &lt;div *dxTemplate=\"let data of 'urediKolicinu'\"&gt;\r\n                        &lt;dx-number-box #kolicinaUnos\r\n                            style=\"text-align: center;\"\r\n                            [value]=\"data.value\"\r\n                            [placeholder]=\"data.value\"\r\n                            (onValueChanged)=\"spremiKolicinu($event, data)\"\r\n                            (onEnterKey)=\"spremiKolicinuEnter($event, data)\"\r\n                            &gt;\r\n                        &lt;\/dx-number-box&gt;\r\n                    &lt;\/div&gt;\r\n                &lt;\/dxi-column&gt;\r\n                &lt;dxi-column cellTemplate=\"gumbUrediKolicinu\"&gt;\r\n                    &lt;div *dxTemplate=\"let data of 'gumbUrediKolicinu'\"&gt;\r\n                        &lt;dx-button\r\n                            style=\"margin-bottom: 5px;\"\r\n                            stylingMode=\"contained\"\r\n                            text=\"SPREMI\"\r\n                            type=\"success\"\r\n                            [width]=\"120\"\r\n                            (onClick)=\"spremiKolicinuButton($event, data)\"&gt;\r\n                        &lt;\/dx-button&gt;\r\n                    &lt;\/div&gt;\r\n                &lt;\/dxi-column&gt;\r\n            &lt;\/dx-data-grid&gt;\r\n        &lt;\/div&gt;<\/pre>\n<pre class=\"lang:js decode:true \" >  spremiKolicinu(event, data){\r\n    this.isporucenakolicina = event.value;\r\n    this.narudzba_ID = data.row.cells[0].data.narudzba_ID;\r\n  }\r\n\r\n  spremiKolicinuButton(event, data){\r\n    \/\/Slanje podataka na API\r\n    \/\/if(res.success == true){\r\n      this.popupVisible = false;\r\n    \/\/} else {\r\n      \/\/Poruka o gre\u0161ci\r\n    \/\/}\r\n  }\r\n\r\n  spremiKolicinuEnter(event, data){\r\n    \/\/ this.slanjeKolicine(data.key.nas_ID, e.value);\r\n      \/\/Slanje podataka na API\r\n      \/\/if(res.success == true){\r\n        this.popupVisible = false;\r\n      \/\/} else {\r\n        \/\/Poruka o gre\u0161ci\r\n      \/\/}\r\n  }<\/pre>\n<h2>Osvje\u017eavanje samo ure\u0111enog podatka<\/h2>\n<p>Jedan od problema koji se stvorio nakon \u0161to je omogu\u0107eno ure\u0111ivanje podataka je to \u0161to se sada cijeli ekran osvje\u017ei i onda se svaki put iznova mora skrolati do to\u010dno odre\u0111enog polja kako bi se nastavilo ure\u0111ivanje. To nikako nije prakti\u010dno i bilo je potrebno prona\u0107i rje\u0161enje. <\/p>\n<p>U ovom \u0107e mi slu\u010daju pomo\u0107i <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/ArrayStore\/\" rel=\"noopener\" target=\"_blank\">ArrayStore<\/a><\/em>, ali tek kada prilagodim <span class=\"lang:js decode:true  crayon-inline \" >prikaziNarudzbe()<\/span> funkciju. Kao \u0161to se mo\u017ee vidjeti <span class=\"lang:js decode:true  crayon-inline \" >this.podaciDemo<\/span> se sada dohva\u0107aju upravo kroz <em>ArrayStore<\/em>. Kroz <span class=\"lang:js decode:true  crayon-inline \" >key<\/span> parametar identificiram unikatnu vrijednost pomo\u0107u koje Pivot Grid mo\u017ee znati koju vrijednost \u0107e osvje\u017eiti.<\/p>\n<p>Podatke nakon unosa osvje\u017eavam pomo\u0107u <span class=\"lang:js decode:true  crayon-inline \" >update(key, values)<\/span> <a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/Data_Layer\/ArrayStore\/Methods\/#updatekey_values\" rel=\"noopener\" target=\"_blank\">metode<\/a> unutar funkcija <span class=\"lang:js decode:true  crayon-inline \" >spremiKolicinuButton()<\/span> i <span class=\"lang:js decode:true  crayon-inline \" >spremiKolicinuEnter()<\/span>.<\/p>\n<pre class=\"lang:js mark:4,6,9,12,17-20,59,68-79,90-101 decode:true \" >import { Component, OnInit, ViewChild } from '@angular\/core';\r\n\r\nimport PivotGridDataSource from \"devextreme\/ui\/pivot_grid\/data_source\";\r\nimport ArrayStore from \"devextreme\/data\/array_store\";\r\nimport { DxTextBoxComponent,\r\n         DxPivotGridComponent } from 'devextreme-angular';\r\n...\r\n\r\n@ViewChild(DxPivotGridComponent, { static: false }) pivotGrid: DxPivotGridComponent;\r\n\r\ndataSource: PivotGridDataSource;\r\ndataStore: any;\r\n\r\n...\r\n\r\nprikaziNarudzbe(){\r\n          this.dataStore = new ArrayStore({\r\n            key: \"narudzba_ID\",\r\n            data: this.podaciDemo\r\n          });\r\n          this.dataSource = new PivotGridDataSource({\r\n            fields: [\r\n              {\r\n                dataField: \"poslovnica_naziv\",\r\n                dataType: \"string\",\r\n                area: \"row\",\r\n                width: 120\r\n              },\r\n              {\r\n                dataField: \"artikl_naziv\",\r\n                dataType: \"string\",\r\n                area: \"column\"\r\n              },\r\n              {\r\n                caption: \"Naru\u010deno\",\r\n                dataField: \"narudzba_narucenakolicina\",\r\n                dataType: \"number\",\r\n                summaryType: \"sum\",\r\n                area: \"data\"\r\n              },\r\n              {\r\n                caption: \"Isporu\u010deno\",\r\n                dataField: \"narudzba_isporucenakolicina\",\r\n                dataType: \"number\",\r\n                area: \"data\",\r\n                summaryType: \"custom\",\r\n                calculateCustomSummary: function(options) {  \r\n                  if (options.summaryProcess == 'start') {  \r\n                      options.totalValue = null;  \r\n                  }  \r\n                  if (options.summaryProcess == 'calculate') {  \r\n                      if (options.value !== null) {  \r\n                          options.totalValue += options.value;  \r\n                      }  \r\n                  }  \r\n                }\r\n              }\r\n            ],\r\n            store: this.dataStore\r\n        });\r\n  }\r\n\r\n...\r\n\r\nspremiKolicinuButton(event, data){\r\n    \/\/Slanje podataka na API\r\n    \/\/if(res.success == true){\r\n      this.dataStore.update(data.key, {\r\n        'poslovnica_ID': data.data.poslovnica_ID,\r\n        'poslovnica_naziv': data.data.poslovnica_naziv,\r\n        'artikl_ar_ID': data.data.artikl_ar_ID,\r\n        'artikl_naziv': data.data.artikl_naziv,\r\n        'artikl_sifra': data.data.artikl_sifra,\r\n        'narudzba_isporucenakolicina': this.isporucenakolicina,\r\n        'narudzba_narucenakolicina': data.data.narudzba_narucenakolicina,\r\n        'narudzba_ID': data.data.narudzba_ID\r\n      });\r\n      this.isporucenakolicina = null;\r\n      this.pivotGrid.instance.getDataSource().reload();\r\n      this.popupVisible = false;\r\n    \/\/} else {\r\n      \/\/Poruka o gre\u0161ci\r\n    \/\/}\r\n  }\r\n\r\n  spremiKolicinuEnter(event, data){\r\n    \/\/ this.slanjeKolicine(data.key.nas_ID, e.value);\r\n      \/\/Slanje podataka na API\r\n      \/\/if(res.success == true){\r\n        this.dataStore.update(data.key, {\r\n          'poslovnica_ID': data.data.poslovnica_ID,\r\n          'poslovnica_naziv': data.data.poslovnica_naziv,\r\n          'artikl_ar_ID': data.data.artikl_ar_ID,\r\n          'artikl_naziv': data.data.artikl_naziv,\r\n          'artikl_sifra': data.data.artikl_sifra,\r\n          'narudzba_isporucenakolicina': this.isporucenakolicina,\r\n          'narudzba_narucenakolicina': data.data.narudzba_narucenakolicina,\r\n          'narudzba_ID': data.data.narudzba_ID\r\n        });\r\n        this.isporucenakolicina = null;\r\n        this.pivotGrid.instance.getDataSource().reload();\r\n        this.popupVisible = false;\r\n      \/\/} else {\r\n        \/\/Poruka o gre\u0161ci\r\n      \/\/}\r\n  }<\/pre>\n<p>Uz to, kada se <em>popup<\/em> otvori polje za unos isporu\u010dene koli\u010dine nije fokusirano i prije unosa potrebno je na njega kliknuti. To tako\u0111er nije prakti\u010dno. Ovo se vrlo lako rije\u0161i kroz <em><a href=\"https:\/\/js.devexpress.com\/Documentation\/ApiReference\/UI_Components\/dxPopup\/Configuration\/#onShown\" rel=\"noopener\" target=\"_blank\">onShown<\/a><\/em> funkciju.<\/p>\n<pre class=\"lang:xhtml mark:8 decode:true \" >&lt;dx-popup\r\n        [closeOnOutsideClick]=\"false\"\r\n        [showCloseButton]=\"true\"\r\n        [(visible)]=\"popupVisible\"\r\n        [title]=\"popupTitle\"\r\n        [width]=\"650\"\r\n        [height]=\"200\"\r\n        (onShown)=\"onPopupShown($event)\"\r\n        &gt;<\/pre>\n<pre class=\"lang:js decode:true \" >onPopupShown(e) {\r\n    let a = this;\r\n    setTimeout(() =&gt; {\r\n      a.inputName.instance.focus();\r\n    }, 100);\r\n}<\/pre>\n<p>Na kraju to izgleda ovako:<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/03\/PivotGrid-Edit-Reload.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/03\/PivotGrid-Edit-Reload.gif\" alt=\"PivotGrid Reload\" width=\"1366\" height=\"685\" class=\"alignnone size-full wp-image-13432\" \/><\/a><\/p>\n<h2>Zaklju\u010dak<\/h2>\n<p>Naravno, ovo je samo dio mogu\u0107nosti koje <em>DevExtreme Pivot Grid<\/em> ima, ali dovoljno da pohvatate osnove i shvatite na koji na\u010din funkcionira.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>U ovom \u0107u blog postu pokazati kako implementirati DevExtreme Pivot Grid UI komponentu u Angular projekt. Ona omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke. Fokusirat \u0107u se na prikaz podataka prema specifi\u010dnim parameterima te na\u010dinu na koji te podatke ure\u0111ivati jer Pivot Grid nativno ne nudi takvu mogu\u0107nost. Pivot Grid &hellip; <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/\" class=\"more-link\">Nastavi \u010ditati <span class=\"screen-reader-text\">DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":13031,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[566,351],"tags":[471,672,662,663],"class_list":["post-12924","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-frontend","category-razvoj","tag-angular","tag-devexpress","tag-devextreme","tag-pivot-grid"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DevExtreme Pivot Grid &amp; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107<\/title>\n<meta name=\"description\" content=\"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/\" \/>\n<meta property=\"og:locale\" content=\"hr_HR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DevExtreme Pivot Grid &amp; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107\" \/>\n<meta property=\"og:description\" content=\"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-12T20:20:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"953\" \/>\n\t<meta property=\"og:image:height\" content=\"510\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisao\/la\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomislav Stankovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Procijenjeno vrijeme \u010ditanja\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuta\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/\"},\"author\":{\"name\":\"Tomislav Stankovi\u0107\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"headline\":\"DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka\",\"datePublished\":\"2021-03-12T20:20:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/\"},\"wordCount\":1034,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/DevExtreme-Angular-PivotGrid.jpg\",\"keywords\":[\"Angular\",\"DevExpress\",\"DevExtreme\",\"Pivot Grid\"],\"articleSection\":[\"Frontend\",\"Razvoj\"],\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/\",\"name\":\"DevExtreme Pivot Grid & Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/DevExtreme-Angular-PivotGrid.jpg\",\"datePublished\":\"2021-03-12T20:20:53+00:00\",\"description\":\"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#breadcrumb\"},\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/DevExtreme-Angular-PivotGrid.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/02\\\/DevExtreme-Angular-PivotGrid.jpg\",\"width\":953,\"height\":510,\"caption\":\"DevExtreme Pivot Grid & Angular\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/devextreme-pivot-grid-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Po\u010detna stranica\",\"item\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"name\":\"Tomislav Stankovi\u0107\",\"description\":\"Sam svoj bloger\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"hr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\",\"name\":\"Tomislav Stankovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"width\":248,\"height\":165,\"caption\":\"Tomislav Stankovi\u0107\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\"},\"description\":\"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.\",\"sameAs\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tomislavstankovic\\\/\"],\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/author\\\/tomislavstankovic\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DevExtreme Pivot Grid & Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107","description":"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/","og_locale":"hr_HR","og_type":"article","og_title":"DevExtreme Pivot Grid & Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107","og_description":"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.","og_url":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/","og_site_name":"Tomislav Stankovi\u0107","article_published_time":"2021-03-12T20:20:53+00:00","og_image":[{"width":953,"height":510,"url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg","type":"image\/jpeg"}],"author":"Tomislav Stankovi\u0107","twitter_card":"summary_large_image","twitter_misc":{"Napisao\/la":"Tomislav Stankovi\u0107","Procijenjeno vrijeme \u010ditanja":"11 minuta"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#article","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/"},"author":{"name":"Tomislav Stankovi\u0107","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"headline":"DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka","datePublished":"2021-03-12T20:20:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/"},"wordCount":1034,"commentCount":0,"publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg","keywords":["Angular","DevExpress","DevExtreme","Pivot Grid"],"articleSection":["Frontend","Razvoj"],"inLanguage":"hr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/","url":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/","name":"DevExtreme Pivot Grid & Angular: prikaz i analiza vi\u0161edimenzionalnih podataka - Tomislav Stankovi\u0107","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg","datePublished":"2021-03-12T20:20:53+00:00","description":"DevExtreme Pivot Grid UI komponenta u Angular omogu\u0107ava prikaz i analizu vi\u0161edimenzionalnih podataka iz lokalne pohrane ili OLAP kocke.","breadcrumb":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#breadcrumb"},"inLanguage":"hr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/"]}]},{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#primaryimage","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2021\/02\/DevExtreme-Angular-PivotGrid.jpg","width":953,"height":510,"caption":"DevExtreme Pivot Grid & Angular"},{"@type":"BreadcrumbList","@id":"https:\/\/www.tomislavstankovic.com\/blog\/devextreme-pivot-grid-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Po\u010detna stranica","item":"https:\/\/www.tomislavstankovic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DevExtreme Pivot Grid &#038; Angular: prikaz i analiza vi\u0161edimenzionalnih podataka"}]},{"@type":"WebSite","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website","url":"https:\/\/www.tomislavstankovic.com\/blog\/","name":"Tomislav Stankovi\u0107","description":"Sam svoj bloger","publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.tomislavstankovic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"hr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d","name":"Tomislav Stankovi\u0107","image":{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","width":248,"height":165,"caption":"Tomislav Stankovi\u0107"},"logo":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg"},"description":"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.","sameAs":["https:\/\/www.tomislavstankovic.com\/blog\/","https:\/\/www.linkedin.com\/in\/tomislavstankovic\/"],"url":"https:\/\/www.tomislavstankovic.com\/blog\/author\/tomislavstankovic\/"}]}},"_links":{"self":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/12924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/comments?post=12924"}],"version-history":[{"count":178,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/12924\/revisions"}],"predecessor-version":[{"id":13463,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/12924\/revisions\/13463"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media\/13031"}],"wp:attachment":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media?parent=12924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/categories?post=12924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/tags?post=12924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}