﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://community.devexpress.com/feed-stylesheets/rss.xsl" media="screen"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dx="https://www.devexpress.com/" xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Oliver's Blog</title>
    <link>https://community.devexpress.com/Blogs/oliver/default.aspx</link>
    <description />
    <language>en-US</language>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:386002</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2021/07/14/n-228-chste-woche-deutscher-live-stream-zu-testcaf-233-mit-gregor-biswanger.aspx</link>
      <category domain="https://community.devexpress.com/Tags/TestCafe">TestCafe</category>
      <title>Nächste Woche: Deutscher Live-Stream zu TestCafé mit Gregor Biswanger</title>
      <description>&lt;p&gt;Please note: the following post is written in German language, announcing a third-party event hosted by the German consultant Gregor Biswanger. Please forgive this rare occurrence if you don’t understand German.&lt;/p&gt;
&lt;p&gt;&lt;img alt="TestCafe Live Stream" src="https://community.devexpress.com/blogs/oliver/20210714-testcafe-livestream/Live-Stream-fb-new.png" style="width:600px;"&gt;&lt;/p&gt;

&lt;p&gt;Testen ist mühsam, langwierig, anstrengend… das ist bekannt. Zumindest als Vorurteil ist das bekannt, und in so manchem Projekt wird entsprechend nicht viel getestet. Wer allerdings schon einmal in einem Projekt mit guter Testabdeckung gearbeitet hat, der weiß auch, wie angenehm das ist: man fühlt sich abgesichert, wenn Änderungen anstehen, und es ist extrem befriedigend, nach erfolgter Implementation eines neuen Bausteins der Anwendung dem automatischen Durchlauf der Tests zuzusehen.&lt;/p&gt;
&lt;p&gt;Wenn das nur immer so wäre… nun, ganz können wir Ihnen die Arbeit zur Erstellung von Tests nicht abnehmen. Wir können sie allerdings deutlich vereinfachen, und zu diesem Zweck gibt es unser Produkt TestCafé, in &lt;a href="https://testcafe.io/"&gt;einer Open Source-Version&lt;/a&gt; sowie als &lt;a href="https://www.devexpress.com/products/testcafestudio/"&gt;vollwertige IDE für Tester&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mit TestCafé schreiben Sie Tests in JavaScript oder TypeScript, die von der UI bis hin zur Backend-Funktionalität jeden Teil ihrer Anwendung abdecken können.  Testergebnisse sind voll reproduzierbar und Tests können auf Clients oder Servern ausgeführt werden, ganz ohne  grafische Oberfläche, oder in beinahe jedem beliebigen Browser. Ich selbst benutze TestCafé seit vielen Jahren, unter anderem zur automatischen Prüfung von Codebeispielen auf Plattformen wie Codepen, und ich bin von dem System sehr beeindruckt.&lt;/p&gt;
&lt;h3 id="live-stream-freitag-23-juli-2021"&gt;Live-Stream Freitag, 23. Juli 2021&lt;/h3&gt;
&lt;p&gt;Wenn Sie Interesse haben, TestCafé kennenzulernen, gibt es gute Neuigkeiten: Gregor Biswanger wird am Freitag, dem 23. Juli 2021 TestCafé live auf Twitch demonstrieren. Gregor ist Microsoft MVP und arbeitet als unabhängiger Berater, Trainer und Sprecher. Ich kenne ihn schon seit Jahren als Sprecher bei technischen Konferenzen, und ich bin sicher, dass er eine interessante und lehrreiche Vorführung bieten wird.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.meetup.com/My-Coding-Zone/events/279194615/"&gt;Bitte folgen Sie diesem Link, um sich für die Teilnahme am Live Stream zu registrieren&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Die Teilnahme ist kostenlos, und es gibt viele Preise zu gewinnen! Falls Sie es an dem Freitag nicht schaffen können: wir werden die Aufzeichnung der Veranstaltung später auch auf YouTube verfügbar machen.&lt;/p&gt;
</description>
      <pubDate>Wed, 14 Jul 2021 03:35:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:383844</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2020/03/24/devexpress-online-training-courses-a-refresh-is-on-its-way.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Training">Training</category>
      <title>DevExpress Online Training Courses - A Refresh is On Its Way</title>
      <description>&lt;p&gt;Before I describe our plans for our three &lt;a href="https://www.devexpress.com/trainingcenter/" target="_blank"&gt;online training courses&lt;/a&gt;, I wanted to wish all of you the very best. Here’s hoping everyone is safe and in good health. We are in this together so if DevExpress can be of assistance, please do reach out to us and let us know how we can help in this difficult time.&lt;/p&gt;
&lt;p&gt;As you already know, the event industry has been hit hard by the COVID-19 pandemic. Cancellations have affected many and our best wishes go out to those affected.&lt;/p&gt;
&lt;p&gt;For those of us who plan, manage and attend developer events, the pandemic has forced us to reimagine our roles and responsibilities. Since we cannot attend live events, we’ve been asked to place all of our energy on improving educational content on DevExpress web properties. More to come on this later but for now, I’m hoping for feedback from those of you who’ve used our paid online tutorials.&lt;/p&gt;
&lt;h3 id="online-training"&gt;Online Training&lt;/h3&gt;
&lt;p&gt;A few years back, we published 3 online training courses (WinForms, WPF, ASP.NET WebForms) and I updated two of those courses a little over 18 months ago. If you are unfamiliar with these online training courses, please visit:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.devexpress.com/trainingcenter/#Courses"&gt;https://www.devexpress.com/trainingcenter/#Courses&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are currently refreshing these courses and expect to publish updated versions shortly. Before we publish new versions, I wanted to reach out and ask for suggestions/feedback. I’d love to know how we can improve these courses to better serve your needs going forward. Please consider this an open-ended question. I’m happy to take all suggestions and feedback into account, including requests for new courses.&lt;/p&gt;</description>
      <pubDate>Tue, 24 Mar 2020 06:17:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:382050</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2019/09/17/updated-microsoft-blazor-video-training-course-available.aspx</link>
      <category domain="https://community.devexpress.com/Tags/ASP.NET">ASP.NET</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET+Core">ASP.NET Core</category>
      <category domain="https://community.devexpress.com/Tags/Blazor">Blazor</category>
      <category domain="https://community.devexpress.com/Tags/Training">Training</category>
      <title>Updated Microsoft Blazor Video Training Course Available</title>
      <description>&lt;p&gt;&lt;img alt="Blazor" src="https://community.devexpress.com/blogs/oliver/20190913-blazor-course-update/Image.png" style="width:780px;"&gt;&lt;/p&gt;

&lt;p&gt;Blazor development at Microsoft has been very active the past few months. Six .NET Core 3.0 Preview versions were released since &lt;a href="https://community.devexpress.com/blogs/oliver/archive/2019/04/02/microsoft-blazor-free-devexpress-video-training-course.aspx"&gt;we announced the DevExpress Blazor Video Training Course&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://community.devexpress.com/blogs/oliver/archive/2019/04/02/microsoft-blazor-free-devexpress-video-training-course.aspx"&gt;source code repository&lt;/a&gt; with the samples used in the training course is fully up to date, currently on &lt;a href="https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core-3-0-preview-9/"&gt;.NET Core 3.0 Preview 9&lt;/a&gt;. We will follow future updates and adapt the samples as necessary. As you may know, the WebAssembly side of Blazor will not be released with .NET Core 3.0, so future updates are expected.&lt;/p&gt;
&lt;p&gt;In spite of this, the &lt;a href="https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core-3-0-preview-9/"&gt;upcoming .NET Core 3.0 release&lt;/a&gt; is an opportunity to update the recorded Blazor Video Training Course. This brings the video materials back in line with the sample source code, so it’s easier for you to follow along.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.devexpress.com/support/training/blazor/"&gt;Click here for the Preview 9 Blazor Video Training Course&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please feel free to comment here or on YouTube to let us know your thoughts about Blazor and this course.&lt;/p&gt;</description>
      <pubDate>Tue, 17 Sep 2019 01:50:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:380631</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2019/04/02/microsoft-blazor-free-devexpress-video-training-course.aspx</link>
      <category domain="https://community.devexpress.com/Tags/Featured">Featured</category>
      <category domain="https://community.devexpress.com/Tags/Microsoft+Blazor">Microsoft Blazor</category>
      <title>Microsoft Blazor - Free DevExpress Video Training Course</title>
      <description>&lt;p&gt;Every now and then, a really exciting new technology comes along. &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt; is such a technology: it’s a binary format for executable code (often called &lt;em&gt;Wasm&lt;/em&gt;, short for WebAssembly) that can be generated by high-level language compilers, and all the major browsers support it. The main intent was to enable languages like C, C++ and Rust, but many other languages are being developed to support WebAssembly as a target. For .NET developers, the efforts of the Microsoft-sponsored Mono project are the most interesting (here is &lt;a href="https://github.com/mono/mono/tree/master/sdks/wasm"&gt;a link to their GitHub repo&lt;/a&gt;).&lt;/p&gt;&#xD;
&lt;p&gt;Targeting WebAssembly directly is a technically complex topic, but fortunately higher-level tools and frameworks make this easier. Microsoft created the web framework &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/client-side/spa/blazor/?view=aspnetcore-3.0"&gt;Blazor&lt;/a&gt;, which allows you to write web apps in C# and compile them to WebAssembly. The framework uses a modern component based architecture, Visual Studio 2019 integration is already available, and your code executes in any modern browser close to native speed.&lt;/p&gt;&#xD;
&lt;p&gt;At DevExpress, we are working hard to bring our own technology to the Blazor platform and we &lt;a href="https://community.devexpress.com/blogs/aspnet/archive/2019/04/02/announcing-devexpress-ui-for-blazor-razor-components-preview.aspx"&gt;announced an Early Access Preview of a DevExpress component set&lt;/a&gt; minutes ago. Since Blazor is still new at this point, we decided to create a free video training course to help you get to know the basics of the environment.&lt;/p&gt;&#xD;
&lt;p&gt;The initial four videos are &lt;a href="https://www.devexpress.com/support/training/blazor"&gt;available right now at this URL&lt;/a&gt;. We have also published the sample source code in &lt;a href="https://github.com/DevExpress/blazor-training-samples"&gt;this GitHub repository&lt;/a&gt; so you can easily run the demos yourself or work through the scenarios shown in the videos.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://www.devexpress.com/support/training/blazor"&gt;&lt;img alt="Free DevExpress Training Course for Microsoft Blazor" src="https://community.devexpress.com/blogs/oliver/20190401-blazor-training/browser-complete-50.png" style="width:504px;"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;h2 id="let-us-know-what-you-think"&gt;Let Us Know What You Think&lt;/h2&gt;&#xD;
&lt;p&gt;We are looking forward to your feedback. Did this video training course help you get started with Blazor? What do you think about the platform? We have some ideas for content to cover in the near future, but please let us know if you have any specific ideas or questions.&lt;/p&gt;&#xD;
&#xD;
</description>
      <pubDate>Tue, 02 Apr 2019 08:05:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
      <dx:excerpt>Microsoft Blazor - Free DevExpress Video Training Course</dx:excerpt>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377952</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/05/29/react-and-the-report-and-dashboard-server.aspx</link>
      <category domain="https://community.devexpress.com/Tags/React">React</category>
      <category domain="https://community.devexpress.com/Tags/Report+and+Dashboard+Server">Report and Dashboard Server</category>
      <category domain="https://community.devexpress.com/Tags/Reporting">Reporting</category>
      <title>React and the Report and Dashboard Server</title>
      <description>&lt;p&gt;I recently posted about some &lt;a href="https://community.devexpress.com/blogs/reporting/archive/2018/05/21/report-and-dashboard-server-new-administrative-panel-ui-localization-html5-document-viewer-ctp-v18-1.aspx"&gt;news in v18.1 of our Report and Dashboard Server&lt;/a&gt; and it made me curious to see how an interface could show a report without any ASP.NET components. We have several demos available that show the use of JavaScript applications as report viewing or editing front-ends (such as &lt;a href="https://github.com/DevExpress-Examples/how-to-use-the-web-document-viewer-in-javascript-with-reactjs-t561300"&gt;this one for React&lt;/a&gt;), but they assume that there’s a .NET based back-end, usually using ASP.NET MVC. The associated instructions also use &lt;code&gt;bower&lt;/code&gt;, which isn’t something I would do today when creating a React app.&lt;/p&gt;&#xD;
&lt;p&gt;I set myself the goal to create a React app using &lt;a href="https://github.com/facebook/create-react-app"&gt;create-react-app&lt;/a&gt; (duh!) and implement access to &lt;em&gt;Report and Dashboard Server&lt;/em&gt; to show a report in the app, using the &lt;a href="https://docs.devexpress.com/XtraReports/17738/creating-end-user-reporting-applications/web-reporting/document-viewer/html5-document-viewer"&gt;HTML5 Document Viewer&lt;/a&gt;. The basic steps of a solution are outlined &lt;a href="https://docs.devexpress.com/XtraReports/17738/creating-end-user-reporting-applications/web-reporting/document-viewer/html5-document-viewer/displaying-documents-from-the-report-server?tabs=tabid-csharp%2Ctabid-cshtml%2Ctabid-html"&gt;on this documentation page&lt;/a&gt;, but again assume ASP.NET MVC.&lt;/p&gt;&#xD;
&lt;p&gt;The post below describes the steps I took in enough detail for you to follow along if you’re interested. Please let me know if you find anything missing or inadequately explained!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180528-react-report-server/report-server-react-large.png" alt="React and the DevExpress Report and Dashboard Server" style="width:750px;"&gt;&lt;/p&gt;&#xD;
&lt;h2 id="preparation"&gt;Preparation&lt;/h2&gt;&#xD;
&lt;p&gt;After &lt;a href="https://documentation.devexpress.com/ReportServer/14645/Installation/Report-and-Dashboard-Server-Installation"&gt;setting up Report and Dashboard Server&lt;/a&gt; in a virtual machine, I configured the system with a Data Model and I created a report. I also set up email sending for the server and created a user account, which is necessary so I can authenticate the remote viewer using that account. Following the instructions I linked in the previous paragraph, I activated CORS.&lt;/p&gt;&#xD;
&lt;p&gt;Now I set out to create a first piece of code to run on Node.js, which contacts the server, retrieves a security token and then a list of available reports. Here’s what I ended up with:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;const base = &amp;#39;http://192.168.1.234:83&amp;#39;;&#xD;
const data = r =&amp;gt; r.data;&#xD;
&#xD;
axios&#xD;
  .post(&#xD;
    base + &amp;#39;/oauth/token&amp;#39;,&#xD;
    qs.stringify({&#xD;
      username: &amp;#39;sturm&amp;#39;,&#xD;
      password: &amp;#39;secret&amp;#39;,&#xD;
      grant_type: &amp;#39;password&amp;#39;&#xD;
    }),&#xD;
    {&#xD;
      headers: { &amp;#39;content-type&amp;#39;: &amp;#39;application/x-www-form-urlencoded&amp;#39; }&#xD;
    }&#xD;
  )&#xD;
  .then(data)&#xD;
  .then(d =&amp;gt; d.access_token)&#xD;
  .then(token =&amp;gt; {&#xD;
    console.log(&amp;#39;Token: &amp;#39;, token);&#xD;
    return axios&#xD;
      .get(base + &amp;#39;/api/documents&amp;#39;, {&#xD;
        headers: { Authorization: &amp;#39;Bearer &amp;#39; + token }&#xD;
      })&#xD;
      .then(data)&#xD;
      .then(d =&amp;gt; {&#xD;
        console.dir(d);&#xD;
      });&#xD;
  })&#xD;
  .catch(err =&amp;gt; {&#xD;
    console.error(err);&#xD;
  });&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;From the top, here are the steps of the process. First, I have an address and a port for the server, which depend on the server configuration. Port 83 is the default for a new installation and I went with that. You can see that I’m using HTTP as the protocol — more about that below.&lt;/p&gt;&#xD;
&lt;p&gt;Using &lt;a href="https://github.com/axios/axios"&gt;axios&lt;/a&gt; (because I like Promises), I make a &lt;code&gt;POST&lt;/code&gt; request to the server, using the path &lt;code&gt;/oauth/token&lt;/code&gt;. The information I send is URL-encoded and I achieve this using the &lt;a href="https://github.com/ljharb/qs"&gt;qs&lt;/a&gt; library. There are other solutions for this, but &lt;code&gt;qs&lt;/code&gt; is easy to use and works on Node as well as in the browser. As a result of this call, I receive a Bearer Token from the server, which I need to use in further calls to prove authorization.&lt;/p&gt;&#xD;
&lt;p&gt;Note that the token expires sooner or later — mine were valid for twenty minutes each — so you should make sure to retrieve a new one close enough to the actual call you’re going to make!&lt;/p&gt;&#xD;
&lt;p&gt;To retrieve the list of available reports, I make a &lt;code&gt;GET&lt;/code&gt; request to &lt;code&gt;/api/documents&lt;/code&gt; and I pass the token as part of the &lt;code&gt;Authorization&lt;/code&gt; header. This is of course a standard OAuth mechanism. The result is a list of available reports:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;[&#xD;
  {&#xD;
    id: 1,&#xD;
    categoryId: 1,&#xD;
    modifiedById: 0,&#xD;
    name: &amp;#39;Venues&amp;#39;,&#xD;
    description: &amp;#39;&amp;#39;,&#xD;
    modifiedBy: &amp;#39;DESKTOP-TMVPFDM\\sturm&amp;#39;,&#xD;
    modifiedWhen: &amp;#39;2018-05-23T10:08:06.867&amp;#39;,&#xD;
    documentType: &amp;#39;Report&amp;#39;,&#xD;
    allowModify: false,&#xD;
    allowDelete: false,&#xD;
    optimisticLock: 0&#xD;
  }&#xD;
],&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;That was simple enough! There’s just one important thing to sort out…&lt;/p&gt;&#xD;
&lt;h3 id="http-or-what-"&gt;HTTP - or what?&lt;/h3&gt;&#xD;
&lt;p&gt;By default, the OAuth token can not be retrieved from the server using HTTP, it requires HTTPS. There is a good reason: if a third party should get hold of the token, they would be able to access the server using my credentials!&lt;/p&gt;&#xD;
&lt;p&gt;Since I’m running Report and Dashboard Server in a local virtual machine, I can’t easily get hold of a “real” (i.e. not a self-signed) SSL certificate. IIS will gladly provide a self-signed certificate for development purposes, but this is not accepted by a client without some extra steps. On Node, I can tell the client to ignore validation errors by using an HTTPS Agent:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;const agent = new https.Agent({&#xD;
  host: &amp;#39;192.168.1.234&amp;#39;,&#xD;
  port: 443,&#xD;
  path: &amp;#39;/&amp;#39;,&#xD;
  rejectUnauthorized: false&#xD;
});&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;However, this agent mechanism is not available in the browser, since browsers are not allowed to ignore certificate validation issues without direct user confirmation. This means that a self-signed certificate is useless for AJAX calls, even during development.&lt;/p&gt;&#xD;
&lt;p&gt;For my development and test scenario, I chose to deactivate the HTTPS requirement for OAuth. However, before I tell you how that works, &lt;strong&gt;you must understand that this is NEVER an acceptable solution for a real-world server outside a dev environment!&lt;/strong&gt; I recommend you get a signed certificate for your server, for example using &lt;a href="https://github.com/PKISharp/win-acme"&gt;Windows ACME Simple&lt;/a&gt; in conjunction with &lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;Now, here’s how to allow Report and Dashboard Server to use HTTP for OAuth, &lt;strong&gt;purely for development purposes and entirely at your own risk&lt;/strong&gt;. Find the table &lt;code&gt;GlobalSettings&lt;/code&gt; in the server database (by default called &lt;code&gt;DevExpressReportServer&lt;/code&gt;). In that table, find the record with the &lt;code&gt;Key&lt;/code&gt; value &lt;code&gt;OAuthServerAllowInsecureHttp&lt;/code&gt; and set the associated &lt;code&gt;Value&lt;/code&gt; to &lt;code&gt;True&lt;/code&gt;. Restart the service using IIS Manager and you’ll be able to run code like mine above.&lt;/p&gt;&#xD;
&lt;h2 id="the-react-app"&gt;The React app&lt;/h2&gt;&#xD;
&lt;p&gt;With all the preparation and research out of the way, I created a new React app:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;create-react-app report-server-react&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Since I never see the point in using &lt;code&gt;yarn&lt;/code&gt;, I switched things to &lt;code&gt;npm&lt;/code&gt; and made sure everything was installed correctly:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;cd report-server-react&#xD;
rm -rf yarn.lock node_modules&#xD;
npm install&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Now I installed required packages, starting with the ones to support the communication logic already shown above:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm install --save axios qs&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;I also need the packages for the DevExpress functionality, plus &lt;code&gt;globalize&lt;/code&gt; and &lt;code&gt;cldr&lt;/code&gt; to support internationalization:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm install --save cldr globalize devextreme devexpress-reporting&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Finally, I need a special &lt;a href="https://letsencrypt.org/"&gt;loader for webpack&lt;/a&gt;:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm install --save-dev html-loader&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;h3 id="now-for-some-code"&gt;Now for some code&lt;/h3&gt;&#xD;
&lt;p&gt;I edited the file &lt;code&gt;src/App.js&lt;/code&gt; and removed the default component implementation and the &lt;code&gt;logo&lt;/code&gt; import. I added some import lines to pull in all the required library functionality:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;import axios from &amp;#39;axios&amp;#39;;&#xD;
import qs from &amp;#39;qs&amp;#39;;&#xD;
import ko from &amp;#39;knockout&amp;#39;;&#xD;
import &amp;#39;devextreme/dist/css/dx.common.css&amp;#39;;&#xD;
import &amp;#39;devextreme/dist/css/dx.light.css&amp;#39;;&#xD;
import &amp;#39;devexpress-reporting/css/web-document-viewer-light.min.css&amp;#39;;&#xD;
&#xD;
const viewerHtml = require(&amp;#39;devexpress-reporting/dx-web-document-viewer&amp;#39;).Html;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;I added a new &lt;code&gt;App&lt;/code&gt; class:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;class App extends Component {&#xD;
  constructor(props) {&#xD;
    super(props);&#xD;
    this.state = { reportName: &amp;#39;report/1&amp;#39; };&#xD;
  }&#xD;
  render() {&#xD;
    return &amp;lt;ReportViewer reportUrl={this.state.reportName} /&amp;gt;;&#xD;
  }&#xD;
}&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Like in some of our existing examples, the value passed to the &lt;code&gt;reportUrl&lt;/code&gt; attribute is retrieved from &lt;code&gt;state&lt;/code&gt;. In the demo, I’m setting the value statically to &lt;code&gt;report/&amp;lt;id&amp;gt;&lt;/code&gt; (that’s the &lt;code&gt;id&lt;/code&gt; from the report list). Of course it is easy to imagine that the value would be retrieved from some other source in a real application.&lt;/p&gt;&#xD;
&lt;p&gt;Finally, here is the &lt;code&gt;ReportViewer&lt;/code&gt; component. Again, this is based on our other examples. It is possible to separate the token retrieval logic, but I left it in place here to keep the structure simple.&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;class ReportViewer extends React.Component {&#xD;
  constructor(props) {&#xD;
    super(props);&#xD;
    this.reportUrl = ko.observable(props.reportUrl);&#xD;
  }&#xD;
  render() {&#xD;
    return (&#xD;
      &amp;lt;div&amp;gt;&#xD;
        &amp;lt;div ref=&amp;quot;innerScript&amp;quot; /&amp;gt;&#xD;
        &amp;lt;div className=&amp;quot;fullscreen&amp;quot; data-bind=&amp;quot;dxReportViewer: $data&amp;quot; /&amp;gt;&#xD;
      &amp;lt;/div&amp;gt;&#xD;
    );&#xD;
  }&#xD;
  componentWillReceiveProps(newProps) {&#xD;
    this.reportUrl(newProps.reportUrl);&#xD;
  }&#xD;
  componentDidMount() {&#xD;
    this.refs.innerScript.innerHTML = viewerHtml;&#xD;
    const baseUrl = &amp;#39;http://192.168.1.234:83&amp;#39;;&#xD;
    axios&#xD;
      .post(&#xD;
        baseUrl + &amp;#39;/oauth/token&amp;#39;,&#xD;
        qs.stringify({&#xD;
          username: &amp;#39;sturm&amp;#39;,&#xD;
          password: &amp;#39;secret&amp;#39;,&#xD;
          grant_type: &amp;#39;password&amp;#39;&#xD;
        }),&#xD;
        {&#xD;
          headers: { &amp;#39;content-type&amp;#39;: &amp;#39;application/x-www-form-urlencoded&amp;#39; }&#xD;
        }&#xD;
      )&#xD;
      .then(r =&amp;gt; r.data)&#xD;
      .then(d =&amp;gt; d.access_token)&#xD;
      .then(token =&amp;gt; {&#xD;
        ko.applyBindings(&#xD;
          {&#xD;
            reportUrl: this.reportUrl,&#xD;
            remoteSettings: {&#xD;
              serverUri: baseUrl,&#xD;
              authToken: token&#xD;
            }&#xD;
          },&#xD;
          this.refs.viewer&#xD;
        );&#xD;
      });&#xD;
  }&#xD;
  componentWillUnmount() {&#xD;
    ko.cleanNode(this.refs.viewer);&#xD;
  }&#xD;
}&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Once more, from the top, here are the important details of the implementation. First, in the constructor, there is a call to &lt;a href="http://knockoutjs.com/"&gt;Knockout&lt;/a&gt;. This library is used by the document viewer internally, so I need to interface with it from my code. I create an observable value, initializing it with the &lt;code&gt;reportUrl&lt;/code&gt; from my own &lt;code&gt;props&lt;/code&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;In the &lt;code&gt;render&lt;/code&gt; method, two container &lt;code&gt;divs&lt;/code&gt; are created. The second one has a &lt;code&gt;data-bind&lt;/code&gt; attribute, which is later recognized by Knockout. Since the attribute uses the &lt;code&gt;dxReportViewer&lt;/code&gt; binding type, Knockout will integrate the viewer in place of the container component.&lt;/p&gt;&#xD;
&lt;p&gt;In &lt;code&gt;componentWillReceiveProps&lt;/code&gt;, I update the internal observable value if and when the same value in the &lt;code&gt;props&lt;/code&gt; changes. This in turn updates the viewer since Knockout reacts to the change to the observable value.&lt;/p&gt;&#xD;
&lt;p&gt;The method &lt;code&gt;componentDidMount&lt;/code&gt; is called when the React component is ready, and you’ll recognize most of the code in there. The new part is the call to &lt;code&gt;ko.applyBindings&lt;/code&gt;: at this point, Knockout receives a data model, which in this case is a structure with document viewer parameters. These are used by the data binding described above, since there is the &lt;code&gt;$data&lt;/code&gt; variable in the attribute.&lt;/p&gt;&#xD;
&lt;p&gt;The only remaining element is a bit of clean-up logic in &lt;code&gt;componentWillUnmount&lt;/code&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;One final code addition was required: I edited the file &lt;code&gt;src/App.css&lt;/code&gt; and added this block at the end, so that the viewer appears in a full-screen setup:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:css"&gt;.fullscreen {&#xD;
  position: absolute;&#xD;
  top: 0px;&#xD;
  left: 0;&#xD;
  right: 0;&#xD;
  bottom: 20px;&#xD;
}&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;h3 id="and-then-nothing-worked"&gt;And then… nothing worked&lt;/h3&gt;&#xD;
&lt;p&gt;With all the code in place, it should have been possible to run the application at this point. Since I used &lt;code&gt;create-react-app&lt;/code&gt;, everything was set up for a simple command:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm start&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;However, there were errors reported when I did this. The reason was that the &lt;code&gt;globalize&lt;/code&gt; and &lt;code&gt;cldr&lt;/code&gt; libraries are not compatible with &lt;code&gt;webpack&lt;/code&gt; by default — and &lt;code&gt;webpack&lt;/code&gt; is used by the &lt;code&gt;create-react-app&lt;/code&gt; infrastructure, even if it’s almost invisible.&lt;/p&gt;&#xD;
&lt;p&gt;To solve this problem (and one more, below) it is necessary to modify the hidden &lt;code&gt;webpack&lt;/code&gt; configuration that has been generated by &lt;code&gt;create-react-app&lt;/code&gt;. Unfortunately this is not supported in the default setup. In fact, the makers of &lt;code&gt;create-react-app&lt;/code&gt; advise that whenever you feel the need to break out of the standard system, you should let them know why, so they can fix the original issue rather than support customization.&lt;/p&gt;&#xD;
&lt;p&gt;Note: The project &lt;a href="https://github.com/timarney/react-app-rewired"&gt;react-app-rewired&lt;/a&gt; aims to provide customizability of projects created using &lt;code&gt;create-react-app&lt;/code&gt;, at a tradeoff. For real-world scenarios I recommend considering this seriously, for the demo however I didn’t want to complicate matters further by bringing in additional tools.&lt;/p&gt;&#xD;
&lt;p&gt;There is a mechanism in place for the purpose of breaking out, and it’s called &lt;em&gt;eject&lt;/em&gt;. Once you eject your project, you are free to modify details like the &lt;code&gt;webpack&lt;/code&gt; config files, but you will not be able to use your project with new versions of &lt;code&gt;create-react-app&lt;/code&gt; and &lt;code&gt;react-scripts&lt;/code&gt; in the future. There are lots of discussions to be found online on the pros and cons of ejecting. For the purposes of this demo, I chose to do it:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm run eject&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Note: If you’re following along with my description, please click the survey link displayed at the end of the eject process and let the project maintainers know that you ejected due to lack of support for CLDR, Globalize and custom loaders.&lt;/p&gt;&#xD;
&lt;h3 id="adjusting-webpack-config-files"&gt;Adjusting webpack config files&lt;/h3&gt;&#xD;
&lt;p&gt;I edited the file &lt;code&gt;config/webpack.config.dev.js&lt;/code&gt; and found the block &lt;code&gt;resolve.alias&lt;/code&gt;. It contained an item called &lt;code&gt;react-native&lt;/code&gt; by default, and I added these lines to solve the integration problems that came up for CLDR and Globalize.&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;cldr$: &amp;#39;cldrjs&amp;#39;,&#xD;
cldr: &amp;#39;cldrjs/dist/cldr&amp;#39;,&#xD;
globalize: &amp;#39;globalize/dist/globalize&amp;#39;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;I made one more change by integrating the &lt;code&gt;html-loader&lt;/code&gt; you saw already when I added the package. This was necessary because the &lt;code&gt;devexpress-reporting&lt;/code&gt; package contains two files with HTML snippets, and these need to be supported by the loader. I found the block &lt;code&gt;modules.rules&lt;/code&gt; and navigated towards the end of it. There is a segment there for the configuration of the &lt;code&gt;file-loader&lt;/code&gt;, with a comment right behind it indicating that any custom loaders need to be added ahead of that block. I inserted my setup code in the correct position:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:js"&gt;{&#xD;
  test: [/\.html$/],&#xD;
  include: [&#xD;
    path.resolve(paths.appNodeModules, &amp;#39;devexpress-reporting/html&amp;#39;)&#xD;
  ],&#xD;
  loader: require.resolve(&amp;#39;html-loader&amp;#39;)&#xD;
},&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;This configuration means that for any HTML files located in the &lt;code&gt;devexpress-reporting&lt;/code&gt; package folder, the &lt;code&gt;html-loader&lt;/code&gt; is used.&lt;/p&gt;&#xD;
&lt;p&gt;If you intend you build a production version of your project (&lt;code&gt;npm run build&lt;/code&gt;), you will need to make the same changes to the file &lt;code&gt;config/webpack.config.prod.js&lt;/code&gt;.&lt;/p&gt;&#xD;
&lt;h2 id="that-s-it-"&gt;That’s it!&lt;/h2&gt;&#xD;
&lt;p&gt;If you have been following along, all that remains at this point is to run the application:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm start&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;This opens a page in a browser automatically, at &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;, showing the running application. If all goes well, it will contact the Report and Dashboard Server, retrieve the report and show it in the HTML5 Document Viewer!&lt;/p&gt;&#xD;
&lt;p&gt;I’m really interested in your thoughts. Will you use this type of integration in your own applications? Please feel free to get back to us if you need more help with your own integration scenarios!&lt;/p&gt;&#xD;
&lt;p&gt;Finally, here is a &lt;a href="https://github.com/oliversturm/demo-dx-report-server-react"&gt;repository with my own demo app&lt;/a&gt;. If you change the URL strings to point to your own server, this should work fine!&lt;/p&gt;&#xD;
&#xD;
</description>
      <pubDate>Tue, 29 May 2018 02:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377650</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/04/26/net-charts-new-crosshair-features-v18-1.aspx</link>
      <category domain="https://community.devexpress.com/Tags/ASP.NET">ASP.NET</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET+MVC">ASP.NET MVC</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET+WebForms">ASP.NET WebForms</category>
      <category domain="https://community.devexpress.com/Tags/Charts">Charts</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <title>.NET Charts - New Crosshair Features (v18.1)</title>
      <description>&lt;p&gt;In addition to Crosshair Cursor performance improvements mentioned in our recent &lt;a href="https://community.devexpress.com/blogs/oliver/archive/2018/04/17/winforms-xtracharts-performance-improvements-v18-1.aspx"&gt;post about performance improvements&lt;/a&gt;, we extended the Crosshair functionality on the basis of some very popular customer requests. The improvements apply to &lt;a href="https://www.devexpress.com/products/net/controls/winforms/chart/" target="_blank"&gt;WinForms Chart&lt;/a&gt; and &lt;a href="https://www.devexpress.com/products/net/controls/wpf/charting/" target="_blank"&gt;WPF Chart&lt;/a&gt; controls, as well as &lt;a href="https://www.devexpress.com/products/net/controls/asp/chart/" target="_blank"&gt;ASP.NET WebForms and MVC Chart controls&lt;/a&gt;, in our upcoming release v18.1.&lt;/p&gt;
&lt;h2 id="new-crosshair-line-mode-free"&gt;New Crosshair Line mode: Free&lt;/h2&gt;
&lt;p&gt;We introduced a new Crosshair Cursor mode where snapping is disabled and lines are shown directly at the current mouse pointer position:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180423-charts-crosshair-improvements/free-mode.png" alt="Free Lines"&gt;&lt;/p&gt;
&lt;p&gt;To enable this feature, set the property &lt;code&gt;ChartControl.CrosshairOptions.LineMode&lt;/code&gt; to &lt;code&gt;Free&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that the property &lt;code&gt;CrosshairOptions.SnapMode&lt;/code&gt; (&lt;a href="https://documentation.devexpress.com/CoreLibraries/DevExpress.XtraCharts.CrosshairOptions.SnapMode.property"&gt;link for WinForms and ASP.NET&lt;/a&gt;, &lt;a href="https://documentation.devexpress.com/WPF/DevExpress.Xpf.Charts.CrosshairOptions.SnapMode.property"&gt;link for WPF&lt;/a&gt;) is still used in this mode to determine which values are selected for inclusion in the crosshair output.&lt;/p&gt;
&lt;h2 id="crosshair-details-in-the-legend"&gt;Crosshair Details in the legend&lt;/h2&gt;
&lt;p&gt;In certain situations it can be convenient to display Crosshair Cursor information in the Legend panel instead of the standard “tooltip” popup window. This image shows a legend filled with Crosshair detail for the year 2016:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180423-charts-crosshair-improvements/crosshair-in-legend.png" alt="Crosshair Information in the Legend"&gt;&lt;/p&gt;
&lt;p&gt;Use the property &lt;code&gt;ChartControl.CrosshairOptions.ContentShowMode&lt;/code&gt; to move the Crosshair Cursor data to the legend. Note that it is also possible to customize this option for an individual series using the &lt;code&gt;Series.CrosshairContentShowMode&lt;/code&gt; property.&lt;/p&gt;
&lt;h2 id="include-extra-field-values-in-crosshair-information"&gt;Include extra field values in Crosshair information&lt;/h2&gt;
&lt;p&gt;The final new feature is perhaps the best of the lot: you can now display arbitrary extra data source field values in the Crosshair output using the pattern syntax (&lt;a href="https://documentation.devexpress.com/CoreLibraries/DevExpress.XtraCharts.SeriesBase.CrosshairLabelPattern.property"&gt;link for WinForms and ASP.NET&lt;/a&gt;, &lt;a href="https://documentation.devexpress.com/WPF/DevExpress.Xpf.Charts.XYSeries2D.CrosshairLabelPattern.property"&gt;link for WPF&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;For example, the following text pattern includes the value of a field called &lt;code&gt;Discount&lt;/code&gt; in the Crosshair output: &lt;code&gt;{S}: {V:F2} (Discount: {Discount:P0})&lt;/code&gt;. The newly extended pattern syntax interprets the part &lt;code&gt;{Discount:P0}&lt;/code&gt; as an instruction to include an extra field value.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180423-charts-crosshair-improvements/fields-in-text.png" alt="Extra Field Values"&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 26 Apr 2018 02:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377621</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/04/23/react-data-grid-tree-data-and-banded-columns-v1-2.aspx</link>
      <category domain="https://community.devexpress.com/Tags/DevExtreme">DevExtreme</category>
      <category domain="https://community.devexpress.com/Tags/DevExtreme+Reactive">DevExtreme Reactive</category>
      <category domain="https://community.devexpress.com/Tags/React">React</category>
      <category domain="https://community.devexpress.com/Tags/React+Grid">React Grid</category>
      <title>React Data Grid - Tree Data and Banded Columns (v1.2)</title>
      <description>&lt;p&gt;Our upcoming &lt;a href="https://github.com/DevExpress/devextreme-reactive/blob/master/CHANGELOG.md#120-beta1-2018-04-12"&gt;release v1.2&lt;/a&gt; of the React Grid contains two new big features: support for hierarchical data, and banded columns.&lt;/p&gt;&#xD;
&lt;h2 id="hierarchical-data-support"&gt;Hierarchical Data Support&lt;/h2&gt;&#xD;
&lt;p&gt;Hierarchical data can be displayed in a tree structure. This feature is made available through three new plugins: &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/reference/tree-data-state/"&gt;TreeDataState&lt;/a&gt;, &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/reference/custom-tree-data/"&gt;CustomTreeData&lt;/a&gt; and &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/reference/table-tree-column/"&gt;TableTreeColumn&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180418-reactgrid-1.2-beta/tree-data.PNG" alt="Tree Data"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/guides/tree-data/"&gt;guide for the Tree Data feature&lt;/a&gt; as well as &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/demos/featured/tree-data/"&gt;an online sample&lt;/a&gt; are already available. You can see in the demo that other Grid functionality like Sorting, Filtering, Selection etc. can be used in conjunction with Tree Data.&lt;/p&gt;&#xD;
&lt;h2 id="banded-columns"&gt;Banded Columns&lt;/h2&gt;&#xD;
&lt;p&gt;The second big new feature is Banded Columns, which are visual groups of columns. The &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/reference/table-band-header/"&gt;TableBandHeader&lt;/a&gt; plugin is responsible for the implementation.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180418-reactgrid-1.2-beta/band-columns.PNG" alt="Banded Columns"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/docs/guides/band-columns/"&gt;guide page&lt;/a&gt; is available for Banded Columns, which includes samples. &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/demos/featured/redux-integration/"&gt;This online demo&lt;/a&gt; also includes a Banded Columns configuration. Note that columns can still be resized and rearranged when they are included in a band!&lt;/p&gt;&#xD;
&lt;h2 id="availability"&gt;Availability&lt;/h2&gt;&#xD;
&lt;p&gt;At this time, a beta version of React Grid v1.2 is available. You can install it using the &lt;code&gt;next&lt;/code&gt; tag:&lt;/p&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:shell"&gt;npm i --save @devexpress/dx-react-core@next @devexpress/dx-react-grid@next&#xD;
npm i --save @devexpress/dx-react-grid-material-ui@next&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;As usual, any feedback is greatly appreciated!&lt;/p&gt;&#xD;
&#xD;
</description>
      <pubDate>Mon, 23 Apr 2018 02:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377625</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/04/20/devextreme-new-react-wrappers-vs-native-react-components.aspx</link>
      <category domain="https://community.devexpress.com/Tags/DevExtreme">DevExtreme</category>
      <category domain="https://community.devexpress.com/Tags/DevExtreme+Reactive">DevExtreme Reactive</category>
      <category domain="https://community.devexpress.com/Tags/Featured">Featured</category>
      <category domain="https://community.devexpress.com/Tags/React">React</category>
      <category domain="https://community.devexpress.com/Tags/React+Wrappers">React Wrappers</category>
      <title>DevExtreme - New React Wrappers vs Native React Components (v18.1)</title>
      <description>&lt;p&gt;In our v18.1 release, we introduced a set of more than 65 new React components, based on &lt;a href="https://js.devexpress.com/Demos/WidgetsGallery/"&gt;our DevExtreme widgets&lt;/a&gt;! This includes Charts, DataGrid, Scheduler, PivotGrid, and many others. The feature set, functionality and appearance of these React components is the same as that of the DevExtreme widgets.&lt;/p&gt;&#xD;
&lt;p&gt;The new React components “wrap” the core implementations of the existing DevExtreme widgets, adapting them to the React core API. That’s why we call this new library &lt;strong&gt;&lt;em&gt;DevExtreme React Wrappers&lt;/em&gt;&lt;/strong&gt;. You can follow the development progress in &lt;a href="https://github.com/DevExpress/devextreme-react"&gt;this GitHub repo&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180420-native-react-vs-wrappers/native-react-vs-wrappers-blog.png" alt="DevExtreme Native React Components vs React Wrappers"&gt;&lt;/p&gt;&#xD;
&lt;h2 id="two-sets-of-components-for-react"&gt;Two Sets of Components for React&lt;/h2&gt;&#xD;
&lt;p&gt;The availability of this set of React components means that we offer two different libraries for the platform. The library we released first is the one that includes the &lt;a href="https://devexpress.github.io/devextreme-reactive/react/grid/"&gt;React Data Grid&lt;/a&gt;,and we call it &lt;strong&gt;&lt;em&gt;DevExtreme Reactive Components for React&lt;/em&gt;&lt;/strong&gt;. Admittedly, the name is a bit complicated, but we need to distinguish from the same components that will be available for Vue in the near future! Charts and Scheduler are going to be released soon, and there is overall a lot of traction in this ongoing development.&lt;/p&gt;&#xD;
&lt;p&gt;The DevExtreme Reactive Components were written from the ground up targeting the React and Vue libraries with a shared core. On the other hand, DevExtreme React Wrappers reuse our DevExtreme widgets and make them available as React components.&lt;/p&gt;&#xD;
&lt;p&gt;Both approaches have their advantages. Please read on for more detailed explanations.&lt;/p&gt;&#xD;
&lt;h2 id="comparing-our-two-offerings"&gt;Comparing Our Two Offerings&lt;/h2&gt;&#xD;
&lt;p&gt;To help you decide which of our libraries for React better suits your development needs, we categorized some of the differences:&lt;/p&gt;&#xD;
&lt;h3 id="core-ui-packages-building-blocks-"&gt;Core UI Packages (Building Blocks)&lt;/h3&gt;&#xD;
&lt;p&gt;DevExtreme Reactive Components are built on top of popular third party React UI libraries (&lt;a href="https://react-bootstrap.github.io/"&gt;react-bootstrap&lt;/a&gt;, &lt;a href="https://reactstrap.github.io/"&gt;reactstrap&lt;/a&gt; and &lt;a href="https://www.material-ui.com/#/"&gt;material-ui&lt;/a&gt;). This means that our native components use the theming approaches supplied by these libraries, as well as included and third-party themes. Your application will benefit from the controls, the consistent APIs and the look&amp;amp;feel technologies that come with the libraries.&lt;/p&gt;&#xD;
&lt;p&gt;The DevExtreme React Wrappers don’t rely on third-party UI building blocks. They are built with their own markup and style-sheets. They support our own theming system, which supplies customizable themes including Bootstrap and Material Design. You can also import any Bootstrap LESS file to &lt;a href="https://community.devexpress.com/blogs/donw/archive/2016/05/24/devextreme-bootstrap-integration-coming-soon-in-v16-1.aspx"&gt;customize these controls&lt;/a&gt; with your favorite paid or free Bootstrap theme.&lt;/p&gt;&#xD;
&lt;h3 id="level-of-control"&gt;Level of Control&lt;/h3&gt;&#xD;
&lt;p&gt;DevExtreme Reactive Components use the native React approach where all UI state is exposed via component properties. This gives you complete control over all aspects of state, and the components can be fully &lt;a href="https://reactjs.org/docs/forms.html#controlled-components"&gt;controlled&lt;/a&gt; or &lt;a href="https://reactjs.org/docs/uncontrolled-components.html"&gt;uncontrolled&lt;/a&gt; or anywhere in between. The rendering layers of the components are separate packages, and they can be replaced partially or completely. Reactive Components are configured by composing ‘plugins’, providing granular configuration choices for individual use cases in your application.&lt;/p&gt;&#xD;
&lt;p&gt;DevExtreme React Wrappers do not use this native React technique and therefore appear more like black boxes, components that perform some configuration work internally and invisibly. This can result in reduced manual control, but the automated mechanisms are smart, and you may well find it easier to configure root component properties rather than composing and configuring individual plugins. In the React sense, Wrappers can be used as &lt;a href="https://reactjs.org/docs/uncontrolled-components.html"&gt;uncontrolled&lt;/a&gt; and partially &amp;mdash; not fully, since they expose only parts of their state! &amp;mdash; &lt;a href="https://reactjs.org/docs/forms.html#controlled-components"&gt;controlled&lt;/a&gt; components.&lt;/p&gt;&#xD;
&lt;p&gt;You may prefer one approach over the other &amp;mdash; we feel that both have their merits.&lt;/p&gt;&#xD;
&lt;h3 id="feature-sets-and-extensibility"&gt;Feature Sets and Extensibility&lt;/h3&gt;&#xD;
&lt;p&gt;DevExtreme Reactive Components are less than a year old and offer fewer components, less functionality and a smaller feature set than DevExtreme React Wrappers. The individual components are growing and so is the library as a whole. This set of components is young, but due to the modular plugin-based concept, extensibility is fantastic, with the best possible opportunities for you to add your own features or customize built-in ones.&lt;/p&gt;&#xD;
&lt;p&gt;DevExtreme React Wrappers are new for the upcoming v18.1 release, but since they are based on the DevExtreme widgets, they come with a much large feature set. However, some extensibility scenarios are not easy due to the comparatively monolithic component architecture &amp;mdash; for instance, it’s not easy to replace the pager for the Data Grid with a custom one. Fortunately the Grid supports pager customization in itself, so you probably don’t need to replace the pager! This is meant as an illustrative example of a complicated customization scenario.&lt;/p&gt;&#xD;
&lt;p&gt;Here is a table with some comparison aspects.&lt;/p&gt;&#xD;
&lt;table&gt;&#xD;
&#xD;
&lt;tr&gt;&#xD;
&lt;th&gt;&lt;strong&gt;Aspect&lt;/strong&gt;&lt;/th&gt;&#xD;
&lt;th&gt;&lt;strong&gt;DevExtreme React Wrappers&lt;/strong&gt;&lt;/th&gt;&#xD;
&lt;th&gt;&lt;strong&gt;DevExtreme Reactive Components&lt;/strong&gt;&lt;/th&gt;&#xD;
&lt;/tr&gt;&#xD;
&#xD;
&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td&gt;65+ React Components. Option to use feature/widget from the growing DevExtreme library.&lt;/td&gt;&#xD;
&lt;td&gt;React Data Grid, Charts and Scheduler planned. Option to use native React components from &lt;a href="https://react-bootstrap.github.io/"&gt;react-bootstrap&lt;/a&gt;, &lt;a href="https://reactstrap.github.io/"&gt;reactstrap&lt;/a&gt; or &lt;a href="https://www.material-ui.com/#/"&gt;material-ui&lt;/a&gt;.&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td&gt;Built-in features provide rich high-performance functionality.&lt;/td&gt;&#xD;
&lt;td&gt;Features modularized in plugins, immutable state, &lt;a href="https://en.wikipedia.org/wiki/Memoization"&gt;memoization&lt;/a&gt;, React optimizations, Virtual DOM and lightweight markup result in extreme performance.&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;strong&gt;Server-Side Rendering&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td&gt;Not Available Yet&lt;/td&gt;&#xD;
&lt;td&gt;Available&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;strong&gt;Using Redux&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td&gt;Available&lt;/td&gt;&#xD;
&lt;td&gt;Available&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;strong&gt;Ease of Configuration&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td&gt;Easy, configuration via root component properties&lt;/td&gt;&#xD;
&lt;td&gt;Moderate, configuration via plugin composition&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&#xD;
&lt;/table&gt;&#xD;
&lt;h2 id="code-examples"&gt;Code Examples&lt;/h2&gt;&#xD;
&lt;p&gt;To leave you with an impression of the structure used for configuration purposes by the two component libraries, we have prepared the following examples. Both are shown using uncontrolled (stateful) modes.&lt;/p&gt;&#xD;
&lt;h3 id="devextreme-data-grid-react-wrapper"&gt;DevExtreme Data Grid React Wrapper&lt;/h3&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:html"&gt;&amp;lt;DataGrid&#xD;
  dataSource={rows}&#xD;
  paging={{ pageSize: 10 }}&#xD;
  filterRow={{ visible: true }}&#xD;
  columns={[&#xD;
    { dataField: &amp;#39;orderId&amp;#39;, caption: &amp;#39;Order ID&amp;#39; },&#xD;
    { dataField: &amp;#39;country&amp;#39;, sortOrder: &amp;#39;asc&amp;#39; },&#xD;
    { dataField: &amp;#39;region&amp;#39; },&#xD;
    { dataField: &amp;#39;date&amp;#39;, dataType: &amp;#39;date&amp;#39;, filterValue: &amp;#39;2013/04/01&amp;#39; },&#xD;
    { dataField: &amp;#39;amount&amp;#39;, format: &amp;#39;currency&amp;#39; }&#xD;
  ]}&#xD;
/&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;h3 id="devextreme-native-react-data-grid"&gt;DevExtreme Native React Data Grid&lt;/h3&gt;&#xD;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:html"&gt;&amp;lt;Grid&#xD;
  rows={rows}&#xD;
  columns={[&#xD;
    { name: &amp;#39;orderId&amp;#39;, title: &amp;#39;Order ID&amp;#39; },&#xD;
    { name: &amp;#39;country&amp;#39;, title: &amp;#39;Country&amp;#39; },&#xD;
    { name: &amp;#39;region&amp;#39;, title: &amp;#39;Region&amp;#39; },&#xD;
    { name: &amp;#39;date&amp;#39;, title: &amp;#39;Date&amp;#39; },&#xD;
    { name: &amp;#39;amount&amp;#39;, title: &amp;#39;Amount&amp;#39; },&#xD;
  ]}&amp;gt;&#xD;
  &amp;lt;FilteringState&#xD;
    defaultFilters={[{ columnName: &amp;#39;date&amp;#39;, value: &amp;#39;2013/04/01&amp;#39; }]} /&amp;gt;&#xD;
  &amp;lt;SortingState&#xD;
    defaultSorting={[&#xD;
    { columnName: &amp;#39;country&amp;#39;, direction: &amp;#39;asc&amp;#39; } ]} /&amp;gt;&#xD;
  &amp;lt;PagingState&#xD;
    defaultPageSize={10} /&amp;gt;&#xD;
  &amp;lt;IntegratedFiltering /&amp;gt;&#xD;
  &amp;lt;IntegratedSorting /&amp;gt;&#xD;
  &amp;lt;IntegratedPaging /&amp;gt;&#xD;
  &amp;lt;CurrencyTypeProvider for={[&amp;#39;amount&amp;#39;]} /&amp;gt;&#xD;
  &amp;lt;Table /&amp;gt;&#xD;
  &amp;lt;TableHeaderRow showSortingControls /&amp;gt;&#xD;
  &amp;lt;TableFilterRow /&amp;gt;&#xD;
  &amp;lt;PagingPanel /&amp;gt;&#xD;
  &amp;lt;Toolbar /&amp;gt;&#xD;
&amp;lt;/Grid&amp;gt;&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;h2 id="what-do-you-think-"&gt;What Do You Think?&lt;/h2&gt;&#xD;
&lt;p&gt;We are excited about this full set of React Components. We would love to see the great React apps you build with our DevExtreme React Wrappers. In v18.1, they are in a CTP stage. We are considering further improvements, such as server-side rendering support, Virtual DOM utilization for rendering, better state management capabilities, etc. Please try the components, and let us know which improvements you would like to see in the RTM release.&lt;/p&gt;&#xD;
&lt;p&gt;If you have any questions about the distinction between the two libraries for React, please describe your use cases and we will do our best to help you choose the appropriate DevExtreme Components for React.&lt;/p&gt;&#xD;
&#xD;
</description>
      <pubDate>Fri, 20 Apr 2018 04:01:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377639</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/04/20/xtracharts-data-aggregation-improvements-v18-1.aspx</link>
      <category domain="https://community.devexpress.com/Tags/ASP.NET+MVC">ASP.NET MVC</category>
      <category domain="https://community.devexpress.com/Tags/ASP.NET+WebForms">ASP.NET WebForms</category>
      <category domain="https://community.devexpress.com/Tags/Charts">Charts</category>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <category domain="https://community.devexpress.com/Tags/WPF">WPF</category>
      <category domain="https://community.devexpress.com/Tags/XtraCharts">XtraCharts</category>
      <title>.NET Charts - Data Aggregation Improvements (v18.1)</title>
      <description>&lt;p&gt;The details in this post apply to the &lt;a href="https://www.devexpress.com/products/net/controls/winforms/chart/" target="_blank"&gt;WinForms Chart&lt;/a&gt; and &lt;a href="https://www.devexpress.com/products/net/controls/wpf/charting/" target="_blank"&gt;WPF Chart&lt;/a&gt; controls, the &lt;a href="https://www.devexpress.com/products/net/controls/asp/chart/" target="_blank"&gt;WebChartControl in ASP.NET WebForms&lt;/a&gt;, and the control created by the &lt;code&gt;DevExpress.Chart()&lt;/code&gt; function when using ASP.NET MVC Extensions.&lt;/p&gt;
&lt;h2 id="additional-flexibility-for-measureunit"&gt;Additional flexibility for MeasureUnit&lt;/h2&gt;
&lt;p&gt;When visualizing &lt;code&gt;DateTime&lt;/code&gt; values using a chart, it is possible to customize the detail level by setting the &lt;a href="https://documentation.devexpress.com/CoreLibraries/DevExpress.XtraCharts.DateTimeScaleOptions.MeasureUnit.property"&gt;DateTimeScaleOptions.MeasureUnit&lt;/a&gt; property to a predefined unit (e.g. day, hour, minute, second, etc).&lt;/p&gt;
&lt;p&gt;For our upcoming v18.1 release, we extended this functionality by introducing the property &lt;code&gt;MeasureUnitMultiplier&lt;/code&gt;, which accepts an integer value. For instance, by setting the &lt;code&gt;MeasureUnit&lt;/code&gt; to &lt;code&gt;Minute&lt;/code&gt; and the &lt;code&gt;MeasureUnitMultiplier&lt;/code&gt; to &lt;code&gt;15&lt;/code&gt;, you configure a measure unit of 15 minutes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180419-xtracharts-measureunit-aggregation/measurement-unit-multiplier.png" alt="MeasureUnitMultiplier"&gt;&lt;/p&gt;
&lt;p&gt;It is important to mention that this feature is not currently compatible with &lt;a href="https://documentation.devexpress.com/WindowsForms/16474/Controls-and-Libraries/Chart-Control/Providing-Data/Data-Representation/Work-Time-and-Workday-Configuration"&gt;work time and work day&lt;/a&gt; options. When a custom measure unit is specified, i.e. with a &lt;code&gt;MeasureUnitMultiplier&lt;/code&gt; other than &lt;code&gt;1&lt;/code&gt;, these features are disabled.&lt;/p&gt;
&lt;h2 id="custom-aggregation-functions"&gt;Custom aggregation functions&lt;/h2&gt;
&lt;p&gt;In addition to custom measure units, we also improved the &lt;a href="https://documentation.devexpress.com/WindowsForms/6247/Controls-and-Libraries/Chart-Control/Providing-Data/Providing-Data/Data-Aggregation"&gt;Data Aggregation&lt;/a&gt; mechanism by introducing a custom aggregation function API.&lt;/p&gt;
&lt;p&gt;To enable this feature, set the &lt;a href="https://documentation.devexpress.com/CoreLibraries/DevExpress.XtraCharts.ScaleGridOptionsBase.AggregateFunction.property"&gt;AggregateFunction&lt;/a&gt; property for the axis scale to &lt;code&gt;Custom&lt;/code&gt; and specify a callback that calculates aggregated values.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180419-xtracharts-measureunit-aggregation/custom-aggregate-function.png" alt="Custom Aggregate Function"&gt;&lt;/p&gt;
&lt;p&gt;Below is the sample custom aggregation function that transforms values into &lt;a href="https://en.wikipedia.org/wiki/Open-high-low-close_chart"&gt;OHLC&lt;/a&gt; format for the image above.&lt;/p&gt;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:csharp"&gt;XYDiagram diagram = chartControl.Diagram as XYDiagram;
diagram.AxisX.DateTimeScaleOptions.AggregateFunction = AggregateFunction.Custom;
diagram.AxisX.DateTimeScaleOptions.CustomAggregateFunction = new OhlcAggregateFunction();

class OhlcAggregateFunction : CustomAggregateFunction {
  public override double[] Calculate(GroupInfo groupInfo) {
    double open = groupInfo.Values1.First();
    double close = groupInfo.Values1.Last();
    double high = Double.MinValue;
    double low = Double.MaxValue;

    foreach (double value in groupInfo.Values1) {
      if (high &amp;lt; value) high = value;
      if (low &amp;gt; value) low = value;
    }

    return new double[] { high, low, open, close };
  }
}
&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 20 Apr 2018 02:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
    <item>
      <guid isPermaLink="false">bd716303-653c-428d-8b8a-a7d998cde032:377608</guid>
      <link>https://community.devexpress.com/Blogs/oliver/archive/2018/04/18/winforms-map-control-runtime-editor-for-vector-items-v18-1.aspx</link>
      <category domain="https://community.devexpress.com/Tags/WinForms">WinForms</category>
      <title>WinForms Map Control - Runtime Editor for Vector Items (v18.1)</title>
      <description>&lt;p&gt;Our &lt;a href="https://www.devexpress.com/products/net/controls/winforms/map/" target="_blank"&gt;WinForms Map Control&lt;/a&gt; can display several standard types of &lt;a href="https://documentation.devexpress.com/WindowsForms/15091/Controls-and-Libraries/Map-Control/Visual-Elements/Vector-Items"&gt;vector items&lt;/a&gt;: lines, ellipses, polygons, pushpins, callouts and others. We have had feedback from users of the control that indicated a need for more interactive capabilities, and so we decided to take our feature set to the next level in our upcoming v18.1 release by providing built-in support for vector item editing at runtime.&lt;/p&gt;
&lt;h2 id="runtime-editing-ui"&gt;Runtime editing UI&lt;/h2&gt;
&lt;p&gt;We developed a special toolbar panel to provide quick access to most common editor functions:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180417-xtramap-editor/panel.png" alt="Map Editor Toolbar Panel"&gt;&lt;/p&gt;
&lt;p&gt;The toolbar supports these operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Undo/Redo&lt;/li&gt;
&lt;li&gt;Select/Transform/Edit&lt;/li&gt;
&lt;li&gt;Add new elements (Pushpin, Path, Polyline, Dot, Ellipse, Rectangle, Line)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An end user can switch to Edit mode, draw new elements and edit or delete vertices. Here is an illustration showing some editing steps:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://community.devexpress.com/blogs/oliver/20180417-xtramap-editor/create-shapes.gif" alt="Editing Operations"&gt;&lt;/p&gt;
&lt;p&gt;Modified vector layer data can be persisted to a file using one of the supported formats (Shapefile, SVG and KML). This enables scenarios where end users load custom shapefiles in a mapping application and modify the shapefile data in place, without requiring a third-party tool.&lt;/p&gt;
&lt;h2 id="programmatic-feature-set"&gt;Programmatic feature set&lt;/h2&gt;
&lt;p&gt;If you would like to provide your own toolbar or similar custom UI, you can take advantage of new &lt;code&gt;MapControl&lt;/code&gt; API members to trigger the functionality from code:&lt;/p&gt;
&lt;div id="CodeDiv"&gt;&lt;pre class="brush:csharp"&gt;private void OnDefaultModeChecked(object sender, ItemClickEventArgs e) {
  mapControl1.MapEditor.ResetEditMode();
}

private void OnTransformModeChecked(object sender, ItemClickEventArgs e) {
  mapControl1.MapEditor.SetTransformMode();
}

private void OnEditModeChecked(object sender, ItemClickEventArgs e) {
  mapControl1.MapEditor.SetEditMode();
}

private void OnCreatePathClicked(object sender, ItemClickEventArgs e) {
  mapControl1.MapEditor.SetCreateMode(CreatableMapItemKind.Path);
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="allowing-runtime-editing"&gt;Allowing runtime editing&lt;/h2&gt;
&lt;p&gt;To activate the new feature in MapControl, use the &lt;code&gt;MapControl.MapEditor.ShowEditorPanel&lt;/code&gt; property. Each layer can be excluded individually by setting the property &lt;code&gt;VectorItemsLayer.AllowEditItems&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Finally, it is important to mention that the editing feature is compatible with Geographical and Cartesian coordinate systems, as well as the newly introduced Circular Scrolling functionality.&lt;/p&gt;
</description>
      <pubDate>Wed, 18 Apr 2018 02:00:00 Z</pubDate>
      <dc:creator>Oliver Sturm (DevExpress)</dc:creator>
    </item>
  </channel>
</rss>