<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by ZingGrid on Medium]]></title>
        <description><![CDATA[Stories by ZingGrid on Medium]]></description>
        <link>https://medium.com/@zinggrid?source=rss-83c5b4e63413------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dhFc3JCZJDHMd3Sp5bfQ8Q.png</url>
            <title>Stories by ZingGrid on Medium</title>
            <link>https://medium.com/@zinggrid?source=rss-83c5b4e63413------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 15 Jun 2026 23:09:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@zinggrid/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Connecting ZingGrid to Supabase: Add a Backend in Minutes]]></title>
            <link>https://medium.com/@zinggrid/connecting-zinggrid-to-supabase-add-a-backend-in-minutes-c05105014fbb?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/c05105014fbb</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[datagrid]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[supabase]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Fri, 13 Sep 2024 22:49:25 GMT</pubDate>
            <atom:updated>2024-09-13T22:49:25.188Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Supabase plus ZingGrid" src="https://cdn-images-1.medium.com/max/1024/1*_X55dxNZ7F-4KrTZxH6R1Q.jpeg" /></figure><p>Cross post from <a href="https://blog.zingsoft.com/connecting-zinggrid-to-supabase-add-a-backend-in-minutes/">our article on the Zing blog</a>.</p><p><a href="https://supabase.com/?ref=blog.zingsoft.com">Supabase</a> is an open source Firebase alternative. There are a variety of services they offer, but for the purposes of this article, we’ll be diving into how it can act as a simple backend for our grids.</p><h3>Initial Setup</h3><p>There are a few steps we need to run through on the Supabase side of things before we can start configuring our grids.</p><h4>1. Account Creation</h4><p>We first need to create the Supabase account that we will be connecting to. <a href="https://supabase.com/dashboard/projects?ref=blog.zingsoft.com">You can sign up for Supabase using this link</a>. Once your account has been created and email confirmed, continue to the next step.</p><h4>2. Create Your First Project</h4><p>Go ahead and head over to the <a href="https://supabase.com/dashboard/projects">dashboard page</a> and create a new project. Make sure to note down the project name and database password.</p><h4>3. Note Down Project Info</h4><p>It is at this point you should see your Project URL and your API Key. We will need to give both of these to ZingGrid in our code later so make sure to store them in a secure local file.</p><h4>4. Create Your First Table</h4><p>From the side bar click the Table Editor section. From here we can create our first table</p><figure><img alt="An empty Supabase dashboard with a button in the center that says Create new table" src="https://cdn-images-1.medium.com/max/1024/1*KM1Y25PX6uJAAgkMsJOicA.png" /></figure><p>First step is to give our table a name, here I’ll use demoTable</p><figure><img alt="A new table creation form in Supabase, this one has a name field filled in with demoTable" src="https://cdn-images-1.medium.com/max/728/1*EOnribwd--5S7pNoMT_9bg.png" /></figure><p>Then we can edit the columns, I’ll have two columns for this example. One for first names and one for last names.</p><figure><img alt="A new table creation field a little further down specifying columns. This table specifies first and last name columns as text." src="https://cdn-images-1.medium.com/max/728/1*oGGJ21IzTHw4aE-xPYV0FA.png" /></figure><h4>5. Add Some Sample Data</h4><figure><img alt="A gif showing a user inserting a row into the table with the name Julia Smith being filled into the fields." src="https://cdn-images-1.medium.com/max/896/1*mHItXafoOtCt7lLqaXzHuw.gif" /></figure><h4>6. Update Security Settings</h4><p>We’ll temporarily disable Row Level Security so we can easily read and write from our table for the purpose of this demo. In production we’ll want to set up proper roles with authentication.</p><p>⚠️ <strong>NOTE</strong>: This settings change is just for the purpose of this demo, this is not meant for production</p><figure><img alt="A gif of a user navigating to the authentication tab in Supabase and disabling the row level security policy" src="https://cdn-images-1.medium.com/max/850/1*0bi6H5V_1PlMJdyVmYrGNQ.gif" /></figure><h3>Supabase Adapter — REST API</h3><p>ZingGrid supports both ways of interacting with Supabase — via the REST API and via the client script. We’ll first go over using the REST API.</p><p>Using the initial demo code below, make sure to replace the following:</p><ul><li>***link*** - The Project URL that you noted down earlier</li><li>***tableName*** - The name of the Supabase table you just created</li><li>***apiKey*** - The Supabase API Key you noted down earlier</li></ul><pre>&lt;html lang=&quot;en&quot;&gt;<br>&lt;head&gt;<br>  &lt;meta charset=&quot;UTF-8&quot;&gt;<br>  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;<br>  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;<br>  &lt;script src=&quot;/lib/zinggrid.js&quot;&gt;&lt;/script&gt;<br>  &lt;title&gt;Supabase&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>  &lt;zing-grid<br>    page-size=&quot;5&quot;<br>    sort<br>    pager<br>    title=&quot;Supabase&quot;<br>    editor-controls<br>    editor-disabled-fields=&quot;id&quot;<br>    src=&quot;https://***link***.supabase.co/rest/v1/***tableName***&quot;<br>  &gt;<br>    &lt;zg-data adapter=&quot;supabase&quot;&gt;<br>      &lt;zg-param<br>        name=&quot;headers&quot;<br>        value=&#39;<br>          {<br>            &quot;Authorization&quot;: &quot;Bearer ***apiKey***&quot;,<br>            &quot;apikey&quot;: &quot;***apiKey***&quot;<br>          }&#39;<br>        &gt;&lt;/zg-param&gt;<br>    &lt;/zg-data&gt;<br>  &lt;/zing-grid&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><p>When viewing that page in the browser, you should start to see the initial data we populated come through!</p><figure><img alt="A simple ZingGrid showing one row, the Julia Smith entry that was previously entered in the Supabase dashboard" src="https://cdn-images-1.medium.com/max/761/1*wWrgEA6AC4ABPJLshGj3Rw.png" /></figure><h3>SupabaseJS Adapter — Client Script</h3><p>If your app happens to use the Supabase JavaScript Client Library (<a href="https://supabase.com/docs/reference/javascript/introduction?ref=blog.zingsoft.com">which you can read more about on their docs site</a>), you are able to store your Supabase credentials outside of your markup making it much more flexible.</p><p>Amending the previous example, we first create a Superbase client object (<a href="https://supabase.com/docs/reference/javascript/installing?ref=blog.zingsoft.com">more on that in their docs</a>)</p><pre>const supabaseUrl = &#39;https://***link***.supabase.co/&#39;;<br>const supabaseKey = &#39;***apiKey***&#39;;<br>const supabaseClient = supabase.createClient(supabaseUrl, supabaseKey);</pre><p>and then <a href="https://www.zinggrid.com/docs/api/methods/zinggrid-object?ref=blog.zingsoft.com#registerclient">register that client with ZingGrid</a></p><pre>ZingGrid.registerClient(supabaseClient);</pre><p>Finally we set the adapter attribute on zg-data to supabaseJS and we have the following</p><pre>&lt;html lang=&quot;en&quot;&gt;<br>&lt;head&gt;<br>  &lt;meta charset=&quot;UTF-8&quot;&gt;<br>  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;<br>  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;ie=edge&quot;&gt;<br>  &lt;title&gt;Supabase&lt;/title&gt;<br>  &lt;!-- ZingGrid --&gt;<br>  &lt;script src=&quot;https://cdn.zinggrid.com/zinggrid.min.js&quot;&gt;&lt;/script&gt;<br>  &lt;!-- Supabase Client Library --&gt;<br>  &lt;script src=&quot;https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2&quot;&gt;&lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>  &lt;script&gt;<br>    const supabaseUrl = &#39;https://***link***.supabase.co/&#39;;<br>    const supabaseKey = &#39;***apiKey***&#39;;<br>    const supabaseClient = supabase.createClient(supabaseUrl, supabaseKey);<br>    ZingGrid.registerClient(supabaseClient);<br>  &lt;/script&gt;<br>  &lt;zing-grid<br>    page-size=&quot;5&quot;<br>    sort<br>    pager<br>    title=&quot;SupabaseJS&quot;<br>    editor-controls<br>    editor-disabled-fields=&quot;id&quot;<br>  &gt;<br>    &lt;zg-data adapter=&quot;supabaseJS&quot;&gt;<br>      &lt;zg-param name=&quot;dataTable&quot; value=&quot;***tableName***&quot;&gt;&lt;/zg-param&gt;<br>    &lt;/zg-data&gt;<br>  &lt;/zing-grid&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</pre><p>Working the same as before</p><figure><img alt="A simple ZingGrid showing one row, the Julia Smith entry that was previously entered in the Supabase dashboard" src="https://cdn-images-1.medium.com/max/761/1*wWrgEA6AC4ABPJLshGj3Rw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c05105014fbb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Embed Audio in a Data Grid in Under 60 Seconds]]></title>
            <link>https://medium.com/@zinggrid/how-to-embed-audio-in-a-data-grid-in-under-60-seconds-7a6ffd32ae66?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/7a6ffd32ae66</guid>
            <category><![CDATA[datagrid]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[how-to]]></category>
            <category><![CDATA[datatables]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Mon, 28 Oct 2019 21:45:17 GMT</pubDate>
            <atom:updated>2019-10-28T22:04:11.192Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*cNqLF66APmq-BqYQsgKzpw.jpeg" /></figure><p>This is part four of our <a href="https://medium.com/@zinggrid/functionality-in-under-60-seconds-using-zinggrid-e2487418bd5a">“Functionality in Under 60 Seconds”</a> blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to <a href="https://www.zinggrid.com/">ZingGrid data grids and tables</a>.</p><p>Watch the short video below to see how easy it is to embed audio in ZingGrid data grids, or scroll further to read a short summary covering the basics.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fzs3V_zqxt24%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dzs3V_zqxt24&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fzs3V_zqxt24%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c8ce7ac83149346a2fc89d08e34bdd34/href">https://medium.com/media/c8ce7ac83149346a2fc89d08e34bdd34/href</a></iframe><p>The first thing you’ll want to do is follow this checklist to make sure you’ve set up ZingGrid properly in preparation for implementing this feature:</p><ol><li>Make sure the audio you want to embed is already hosted online, and that you have permission to link to it.</li><li>Update your JSON dataset to include the URLs to the audio you’d like to embed. Make sure to include the embed URL in your dataset, as opposed to the direct URL.</li><li>Make sure you’ve set up a basic grid by referencing the ZingGrid library in your development environment using either the CDN or self-hosted options</li></ol><p>As a quick refresher, if you’re using ZingGrid in a basic HTML page, this is what your code should look like before starting this tutorial:</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>    &lt;meta charset=&quot;utf-8&quot;&gt;<br>      &lt;title&gt;&lt;/title&gt;<br>      &lt;script src=&quot;https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;zing-grid&gt;&lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>From here, it’s just a matter of adding your data to your grid, and adding columns so you can specify the column type for your embedded audio.</p><h3>Embedding Audio in Under a Minute</h3><p>Let’s say you have a basic dataset featuring a song from SoundCloud associated with each planet in our solar system. This dataset will yield two columns of data when rendered in ZingGrid, the last of which contains audio embeds.</p><p>As I mentioned at the beginning of this post, it’s important that you use the embed URLs for the audio, as opposed to the direct URLs. In the case of SoundCloud audio, this is what the difference between those two types of URLs looks like:</p><p>Embed URL: <a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/344477157&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/344477157&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a></p><p>Direct URL: <a href="https://soundcloud.com/user-831103706/sza-the-weekend">https://soundcloud.com/user-831103706/sza-the-weekend</a></p><p>Your JSON dataset will probably look something like this once you’ve added your audio embed URLs to it:</p><pre>[ <br>  {<br>    &quot;planet&quot;: &quot;Mercury&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Venus&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Earth&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Mars&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Jupiter&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Saturn&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Uranus&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Neptune&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  },<br>  {<br>    &quot;planet&quot;: &quot;Pluto&quot;,<br>    &quot;audio&quot;: &quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true&quot;<br>  }<br>]</pre><p>This is what your code would look like if you were to add your data inline to your grid:</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>    &lt;meta charset=&quot;utf-8&quot;&gt;<br>    &lt;title&gt;&lt;/title&gt;<br>    &lt;script src=&quot;https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;zing-grid<br>      data=&#39;[ <br>      {<br>        &quot;planet&quot;: &quot;Mercury&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Venus&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Earth&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Mars&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Jupiter&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Saturn&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Uranus&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Neptune&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Pluto&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      }<br>      ]&#39;&gt;<br>    &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>At this point, your grid should look something like this when rendered — but don’t worry because it’s not a mistake:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wQBHVYMS383338FzQ1qUww.png" /><figcaption>Data grid rendering URL strings instead of audio embeds.</figcaption></figure><p>To render the last column in your dataset as an audio embed instead of a string containing the embed URL, you’ll need to manually specify the columns in your grid so you can change the last column’s column type.</p><p>To do this, add two zg-column tags inside &lt;zing-grid&gt;&lt;/zing-grid&gt; – one for each unique key in your JSON data. In our case, our sample dataset has two unique JSON keys, so we&#39;ll add two &lt;zg-column&gt;&lt;/zg-column&gt; tags inside the &lt;zing-grid&gt;&lt;/zing-grid&gt; tag.</p><p>Within each set of &lt;zg-column&gt;&lt;/zg-column&gt; tags, we&#39;ll add index=&quot;&quot; and fill in each JSON key name in the order we&#39;d like the columns to appear. In the zg-column tag for audio, we&#39;ll add the type=&quot;&quot; attribute with a value of iframe to specify that the column should render iframe content instead of strings of text.</p><p>If you’re using the sample data from this tutorial, your column tags should look like this:</p><pre>&lt;zg-colgroup&gt; <br>  &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>  &lt;zg-column index=&quot;audio&quot; type=&quot;iframe&quot;&gt;&lt;/zg-column&gt;<br>&lt;/zg-colgroup&gt;</pre><p>Remember, you don’t need to specify the column type for the planet column because ZingGrid&#39;s default column type is text.</p><p>If you’re following along, your code should look like this (focus on the code below the inline data):</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>    &lt;meta charset=&quot;utf-8&quot;&gt;<br>    &lt;title&gt;&lt;/title&gt;<br>    &lt;script src=&quot;https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;zing-grid<br>      data=&#39;[ <br>      {<br>        &quot;planet&quot;: &quot;Mercury&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Venus&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Earth&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Mars&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Jupiter&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Saturn&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Uranus&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Neptune&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      },<br>      {<br>        &quot;planet&quot;: &quot;Pluto&quot;,<br>        &quot;audio&quot;: &quot;<a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true">https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true</a>&quot;<br>      }<br>      ]&#39;&gt;<br>      &lt;zg-colgroup&gt;<br>        &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;video&quot; type=&quot;iframe&quot;&gt;&lt;/zg-column&gt;<br>      &lt;/zg-colgroup&gt;<br>    &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>That’s all you need to do to render audio embeds in your ZingGrid data grid! The above code will yield the following result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/791/1*OarDoWaEIDolAunjqzwIWg.gif" /><figcaption>Data grid rendering audio embeds. View the <a href="https://app.zingsoft.com/demos/create/A02DR615">live demo</a></figcaption></figure><p>And those are the basics of adding audio embeds in your ZingGrid data tables &amp; grids. <a href="https://app.zingsoft.com/demos/create/A02DR615">View the live demo</a> in our Studio playground to see how it works, and to play around with the final result.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7a6ffd32ae66" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How the ZingGrid Team Uses Notion for Shared Knowledge Management]]></title>
            <link>https://medium.com/@zinggrid/how-the-zinggrid-team-uses-notion-for-shared-knowledge-management-45658304d367?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/45658304d367</guid>
            <category><![CDATA[tools]]></category>
            <category><![CDATA[knowledge-management]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[information-architecture]]></category>
            <category><![CDATA[workflow]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Tue, 15 Oct 2019 19:01:22 GMT</pubDate>
            <atom:updated>2019-10-15T19:13:19.352Z</atom:updated>
            <content:encoded><![CDATA[<p><em>by Sarah at Zing</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZGO6WdCuA0PL4YEPerNROA.jpeg" /></figure><p>Until around a year ago, internal knowledge management was a stubborn thorn in my team’s side. Dedicated wiki solutions like Gitbook weren’t cutting it for us, over-generalized solutions like the Google Suite of products stumbled with internally linked docs and multimedia embeds, and internal knowledge base add-on’s (I’m looking at you Gitlab and Clubhouse) weren’t powerful or flexible enough to meet our needs.</p><p>To be fair, it’s a tall order to holistically manage internal knowledge documentation for a small team across a variety of domains like software development, web development, marketing, sales, design, product development, and project management. It’s an even taller order to expect any team to adopt not only a new product, but new processes as well without running into a few roadblocks. This is where Notion really saved the day for us.</p><p>Before we settled on one dedicated way to document our fickle body of accumulated knowledge, the ZingSoft team knowledge base consisted of a brittle hodgepodge of various services and products including Gitlab, Github, Clubhouse, Airtable, Google Sheets, Google Docs, and Gmail. This network was barely held together by Toby bookmarks (Toby’s wonderful, but that’s a post for another day).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PyY6ul6YIvVDQ46y8urofw.png" /><figcaption><em>This is what our knowledge base looked like before Notion.</em></figcaption></figure><p>Compared to the previous solutions we tried, Notion has been the Swiss Army Knife of knowledge management solutions. So much so that it has actually changed the way the ZingSoft team <em>approaches </em>internal documentation. “That should probably go in Notion,” is a suggestion you’ll hear often if you listen in on our team’s conversations and meetings lately. The best part is, that thing usually <em>does</em> end up in Notion by the end of the workday, which is a testament to how well-integrated it’s become in our team’s workflows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JZLKZU2Drqyy3_CFUTQI8Q.png" /><figcaption><em>This is what our knowledge base looks like using Notion.</em></figcaption></figure><p>Of course, there are caveats to any documentation solution. Even the greatest knowledge management tool can fall victim to a team that habitually under- or over-documents things. Beyond that, a knowledge base is no substitution for well-defined information architecture given that it’s a reflection of the way that information is organized in teammates’ minds.</p><p>Internal documentation is as much about the organization of ideas as it is about the way they’re preserved. The importance of that insight is further emphasized in <a href="https://abookapart.com/products/everyday-information-architecture">“Everyday Information Architecture,”</a> by Lisa Marie Martin — a quick and helpful read for anyone who finds themselves organizing information in a variety of contexts throughout the workweek.</p><p>By paying attention to the architecture of your internal documentation, it becomes easier over time to distinguish between what does and doesn’t belong there. This prevents your knowledge base from becoming bloated with too many details. For us it’s been important to learn the importance of delineating the right information while balancing the need for flexibility. Notion makes it easy to restructure our information as needed as our organization strategy changes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/392/1*cCzysOxQPTebaUpe6WQp3w.gif" /><figcaption><em>A quick snippet showing you what some of our internal information architecture looks like in Notion.</em></figcaption></figure><p>So what are the specific selling points that have made the ZingSoft team a loyal Notion customer? Here are some of the things we’ve enjoyed about using it as a knowledge base:</p><ul><li>It’s fully-featured for editing and viewing across desktop and mobile devices</li><li>Real-time collaboration is easy. You can see which users are currently viewing a page, as well as their page position and edits</li><li>Built-in version history for your pages lets you revert changes if needed</li><li>Powerful embeds! I’m able to embed read-only Figma &amp; Airtable files with ease, along with many other embed types.</li><li>Content blocks give you just enough control over the presentation of your information</li><li>Somewhat customizable design — you can upload your own icons and header imagery for your pages</li></ul><p>Is there more we could do to improve our internal knowledge management? Absolutely! As the GIF above shows, our team’s way of organizing information may make sense to us, but it’s still a bit of a puzzle for newcomers, as it doesn’t seem to have much of a rhyme or reason. Despite that, the information architecture we’ve chosen has allowed our productivity to increase dramatically, and has helped resurface internal knowledge that would have otherwise remained hidden.</p><p>For any team stuck in analysis paralysis when it comes to their internal documentation, the best advice I can suggest is to approach knowledge management iteratively, and to find a tool that complements your team’s way of working. Many times teams don’t clearly understand what they need out of a knowledge management tool, nor have they put enough thought into what the structure of that knowledge should look like. Notion has been forgiving for us in these situations, and I encourage you to give it a try if your team has similar needs!</p><p><a href="https://www.zingsoft.com/"><em>ZingSoft</em></a><em> is dedicated to building cutting-edge data visualization JavaScript products for developers across a variety of industries. Based in San Diego, our team is a creative and diverse group of web professionals who live and work across the globe.</em></p><p><em>We are proponents of strong software engineering processes and native web APIs, and we’d love to show you how our products can help your team thrive. </em><a href="https://app.zingsoft.com/signup"><em>Sign up for the ZingSoft Studio</em></a><em> or contact us to learn more about what our products can do.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=45658304d367" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Its Made: Sea Level Change Demo]]></title>
            <link>https://medium.com/@zinggrid/how-its-made-sea-level-change-demo-866660fabcde?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/866660fabcde</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[zinggrid]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[charts]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Sat, 24 Aug 2019 00:51:56 GMT</pubDate>
            <atom:updated>2019-09-16T23:26:15.048Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Josh at ZingSoft</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9g0TLAW2OffJMxmehSLAug.png" /></figure><p>This post is the first installment in our ‘How Its Made’ blog series. Each of these posts and videos will offer a short walkthrough of how a particular grid is created.</p><p>The video below will walk you through the basics of creating this demo. Skip the video to read the walkthrough instead.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FOQd-3h0jv1k%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DOQd-3h0jv1k&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FOQd-3h0jv1k%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2cf14b74b2733e7725f8de6932688169/href">https://medium.com/media/2cf14b74b2733e7725f8de6932688169/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vKaHPgufBJwN5g95zHLPog.png" /></figure><p>Steps to create this grid:</p><ol><li>Rendering the grid to the page</li><li>Overview of ZingGrid features</li><li>Adding renderer functions to customize data</li><li>Styling your grid</li></ol><h3>Before I begin</h3><p>Before we dive into how to create this custom grid, I strongly encourage you to sign up for ZingGrid’s ‘Studio’ free web-app.</p><p>This free sandbox-like environment allows you to create grids and charts quickly to see how your grids might fit into your site or application. It also offers free pre-made templates to get you off the ground quickly.</p><p>Check out <a href="https://app.zingsoft.com/signup">the Studio</a> and start creating grids!</p><h3>1. Rendering the Grid</h3><p>If you are following along, you will have created the above grid and all its functionality by the end of this tutorial.</p><p>I have provided a basic HTML outline below if you decide to start from scratch.</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>   &lt;head&gt;<br>      &lt;meta charset=&quot;utf-8&quot;&gt;<br>      &lt;title&gt;Global Average Absolute Sea Level Change&lt;/title&gt;<br>			&lt;script src=&quot;&lt;https://cdn.zinggrid.com/zinggrid.min.js&gt;&quot; defer&gt;&lt;/script&gt;   <br>	&lt;/head&gt;<br>   &lt;body&gt;</pre><pre>   &lt;/body&gt;<br>&lt;/html&gt;</pre><p>To initialize ZingGrid to the page, you should reference our library directly from our CDN by including the script tag (shown above) within the head section of your HTML.</p><p>You can also directly download the latest version of our library from our <a href="https://www.zinggrid.com/download">site</a>, or install it locally with a package manager like NPM.</p><p>The next step is including the the the &lt;zing-grid&gt; tag to the body of your page. This is where your grid will actually be rendered.</p><p>The &lt;zing-grid&gt; tag is the most important tag within the library and is where you will add your data, create and customize columns, and include built in features to your grid.</p><pre>&lt;zing-grid<br>     src=&quot;&lt;https://zinggrid-examples-9f268.firebaseio.com/Global-Average-Sealevel&gt;&quot;<br>          &gt;<br>&lt;/zing-grid&gt;</pre><p>In my case, I compiled our data in Firebase and referenced it using the src attribute as shown above. Notice the src attribute lives within the opening &lt;zing-grid&gt; tag and not between the two tags. To read how to hook up alternative data sources to your grid, visit <a href="https://www.zinggrid.com/docs/rest">our docs</a>.</p><p>If you hit run, you will see that a grid renders with the data from my external source, but contains very limited styling.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4OY7vUg8VVxXFzFH3N4QdA.png" /></figure><p>To begin basic customizations of the grid, you will want to start adding <a href="https://www.zinggrid.com/docs/api-elements#zing-grid-caption">captions</a> (headers) and <a href="https://www.zinggrid.com/docs/api-elements#zg-column">columns</a> to your grid.</p><p>This can be accomplished by using the &lt;zg-caption&gt;, &lt;zg-colgroup&gt; and &lt;zg-column&gt; tags in-between the opening and closing &lt;zing-grid&gt; tags.</p><pre>&lt;zing-grid<br>    src=&quot;&lt;https://zinggrid-examples-9f268.firebaseio.com/Global-Average-Sealevel&gt;&quot;<br>          &gt;<br>    &lt;zg-caption&gt;<br>        &lt;h1&gt;Global Average Absolute Sea Level Change (1880 - 2014)&lt;/h1&gt;<br>        &lt;p&gt;&lt;em&gt;From the US Environmental Protection Agency using data from CSIRO, 2015; NOAA, 2015.&lt;/em&gt;<br>          &lt;br&gt;<br>          &lt;a href=&quot;&lt;https://datahub.io/core/sea-level-rise&gt;&quot; target=&quot;_blank&quot;&gt;View Source &lt;i class=&quot;far fa-arrow-alt-circle-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;<br>    &lt;/zg-caption&gt;<br>    <br>&lt;/zing-grid&gt;</pre><p>Again, To add content to the caption/header of your grid, you will use the &lt;zg-caption&gt; tag. Within the tag, you can format your text in normal HTML syntax. Reference above for how we added content to the header of our grid. If you render this grid, you should see the grid below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1DwwkpdPz31C1Lx_pefDYg.png" /></figure><p>To style the rows or only display certain pieces of data within your dataset, you need to utilize the &lt;zg-colgroup&gt; and &lt;zg-column&gt; tags.</p><pre>&lt;zing-grid<br>      src=&quot;&lt;https://zinggrid-examples-9f268.firebaseio.com/Global-Average-Sealevel&gt;&quot;<br>          &gt;</pre><pre>      &lt;zg-caption&gt;<br>        &lt;h1&gt;Global Average Absolute Sea Level Change (1880 - 2014)&lt;/h1&gt;<br>        &lt;p&gt;&lt;em&gt;From the US Environmental Protection Agency using data from CSIRO, 2015; NOAA, 2015.&lt;/em&gt;<br>          &lt;br&gt;<br>          &lt;a href=&quot;&lt;https://datahub.io/core/sea-level-rise&gt;&quot; target=&quot;_blank&quot;&gt;View Source &lt;i class=&quot;far fa-arrow-alt-circle-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;<br>    &lt;/zg-caption&gt;</pre><pre>		&lt;zg-colgroup&gt;<br>        &lt;zg-column index=&quot;Year&quot; header=&quot;Year&quot;&gt;<br>          &lt;strong&gt;[[index.Year]]&lt;/strong&gt;<br>        &lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;CSIROAdjustedSeaLevel&quot; header=&quot;CSIRO Adjusted Sea Level&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;LowerErrorBound&quot; header=&quot;Lower Error Bound&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;NOAAAdjustedSeaLevel&quot; header=&quot;NOAA Adjusted Sea Level&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;UpperErrorBound&quot; header=&quot;Upper Error Bound&quot;&gt;&lt;/zg-column&gt;<br>    &lt;/zg-colgroup&gt;</pre><pre>&lt;/zing-grid&gt;</pre><p>You will want to add a &lt;zg-column&gt; for each piece of data you want to display. Referencing the above code snippet, you will notice we have included the index attribute as well as a header attribute. Each index attribute for each column needs to include the name of the property you are trying to display. Each header attribute should be set to the desired header name of your choosing.</p><p>If you render this grid, you will notice not much has changed. However, this has opened the door to customize the rows through CSS and Javascript.</p><h3>2. Adding ZingGrid features</h3><p>The ability to quickly add and remove features from your grid is what sets ZingGrid apart from other grid libraries.</p><p>Looking at the grid we have created thusfar, there isn’t much user interactivity available. However, we can quickly change that with the addition of a few attributes.</p><pre>&lt;zing-grid<br>      layout=&quot;row&quot;<br>      layout-controls=&quot;false&quot;<br>      src=&quot;&lt;https://zinggrid-examples-9f268.firebaseio.com/Global-Average-Sealevel&gt;&quot;<br>      sort<br>      pager<br>      page-size-options=&quot;25,50,100,200&quot;<br>          &gt;</pre><pre>	    ...</pre><pre>&lt;/zing-grid&gt;</pre><p>Looking at the code above, you will notice we added a few extra attributes to the &lt;zing-grid&gt; tag. Below is a list of these attributes and how they affect the grid.</p><ul><li>layout = Tells ZingGrid whether to display the data in &#39;rows&#39; or &#39;cards&#39;</li><li>layout-controls = Tells ZingGrid whether the user has the option to view the data in row or card mode</li><li>src = Tells ZingGrid where to pull the data</li><li>sort = Gives the grid sorting functionality. Click the column header to change the sort order</li><li>pager = Turns on the pagination functionality for your grid</li><li>page-size-options = Allows you to choose different number of row or card values displayed on a single page</li></ul><p>Try adding these attributes to your &lt;zing-grid&gt; tag and see how they affect your grid.</p><p>There are many other attributes you can include based on use case. For a full list of these features, reference the <a href="https://www.zinggrid.com/docs/adding-features">ZingGrid docs</a>.</p><h3>3. Adding a renderer function</h3><p>In the case of this dataset, we want to show a clear distinction between values that are greater than 0 and less than 0. To do so, we will create a simple Javascript function and add it to each of our columns.</p><pre>&lt;script&gt;<br>	function renderNull(value) {<br>	  if(value == &quot;null&quot;) {<br>	    return `&lt;i style=&quot;font-size: 12px; color: #a1b2b5;&quot; class=&quot;far fa-times-circle&quot;&gt;&lt;/i&gt; &lt;span class=&quot;null&quot;&gt; ${value}&lt;/span&gt;`;<br>	  } else if(value == &quot;0&quot;) {<br>	    return `&lt;span style=&quot;color: #b3c1c4; font-style: italic;&quot;&gt;${value}&lt;/span&gt;`;<br>	  } else if(value &gt; &quot;0&quot;) {<br>	    return `&lt;span style=&quot;color: #19b29f; font-weight: bold;&quot;&gt;${value}&lt;/span&gt;`;<br>	  } else {<br>	    return `&lt;span style=&quot;color: #ea5374; font-weight: bold; margin-left: -8px;&quot;&gt;${value}&lt;/span&gt;`;<br>	  }<br>	}<br>&lt;/script&gt;</pre><p>The above function will look at all the values in our dataset and display them based on if they are greater than, less than or equal to 0.</p><pre>&lt;zing-grid<br>      src=&quot;&lt;https://zinggrid-examples-9f268.firebaseio.com/Global-Average-Sealevel&gt;&quot;<br>      &gt;</pre><pre>      &lt;zg-caption&gt;<br>        &lt;h1&gt;Global Average Absolute Sea Level Change (1880 - 2014)&lt;/h1&gt;<br>        &lt;p&gt;&lt;em&gt;From the US Environmental Protection Agency using data from CSIRO, 2015; NOAA, 2015.&lt;/em&gt;<br>          &lt;br&gt;<br>          &lt;a href=&quot;&lt;https://datahub.io/core/sea-level-rise&gt;&quot; target=&quot;_blank&quot;&gt;View Source &lt;i class=&quot;far fa-arrow-alt-circle-right&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;<br>	    &lt;/zg-caption&gt;</pre><pre>		&lt;zg-colgroup&gt;<br>        &lt;zg-column index=&quot;Year&quot; header=&quot;Year&quot;&gt;<br>          &lt;strong&gt;[[index.Year]]&lt;/strong&gt;<br>        &lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;CSIROAdjustedSeaLevel&quot; renderer=&quot;renderNull&quot; header=&quot;CSIRO Adjusted Sea Level&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;LowerErrorBound&quot; renderer=&quot;renderNull&quot; header=&quot;Lower Error Bound&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;NOAAAdjustedSeaLevel&quot; renderer=&quot;renderNull&quot; header=&quot;NOAA Adjusted Sea Level&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;UpperErrorBound&quot; renderer=&quot;renderNull&quot; header=&quot;Upper Error Bound&quot;&gt;&lt;/zg-column&gt;<br>    &lt;/zg-colgroup&gt;</pre><pre>&lt;/zing-grid&gt;</pre><p>Now that we have created this function, we need to make sure it is applied to each column that requires these parameters. In the above code, I have added the renderer attribute to each column that will utilize the function. I have passed in the name of the function as a value of the renderer attribute. Try adding the function and renderer attribute to your code.</p><p>Now if you render this, you should see a color change for values less than or greater than 0.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uibRdBOyGmd9ZtmefNJuaw.png" /></figure><h3>4. Styling your grid</h3><p>The last important thing we will discuss in this post is how to further target and style your grid using CSS. If you have even minimal experience with CSS, styling your grid should be a fairly easy affair. While we won’t cover each class we created using CSS, you will notice that you can target any ZingGrid tag and give it standard CSS properties.</p><pre>body {<br>  padding-top: 50px;<br>  font-family: &#39;Rubik&#39;, sans-serif;<br>  background: url(&#39;&lt;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/water-levels%2Fweather-cooler.png?alt=media&amp;token=5e6df3b4-1089-47c5-9fea-f191206bbc73&gt;&#39;);<br>}</pre><pre>zing-grid {<br>  max-width: 750px; <br>  margin: 0 auto;<br>  font-family: &#39;Rubik&#39;, sans-serif;<br>  border: 0px solid #03375e;<br>  background: #004a6b;<br>  color: #03375e;<br>  --theme-color-primary: #ffffff;<br>    border-radius: 6px;<br>  -webkit-border-radius: 6px;<br>  -moz-border-radius: 6px;<br>  --zg-cell-background_sorted: #e3e6e8;<br>  --zg-head-cell-background_sorted: #045282;<br>  --zg-head-cell-color_sorted: #ffffff;<br>  box-shadow: 0 20px 50px rgba(36, 107, 138, 0.7);<br>  -webkit-box-shadow: 0 20px 50px rgba(36, 107, 138, 0.7);<br>  -moz-box-shadow: 0 20px 50px rgba(36, 107, 138	, 0.7);<br>}</pre><pre>zg-icon {<br>  max-width: 15px;<br>}</pre><pre>zg-caption {<br>  background: #004a6b;<br>  border-bottom: 1px solid #004a6b;<br>  padding: 30px 20px;<br>  border-radius: 6px 6px 0 0;<br>  -webkit-border-radius: 6px 6px 0 0;<br>  -moz-border-radius: 6px 6px 0 0;<br>  text-align: center;<br>}</pre><pre>zg-caption h1 {<br>  color: #76d9f4;<br>  font-size: 25px;<br>  margin: 0;<br>  font-weight: 300;<br>}</pre><pre>zg-caption p {<br>  font-size: 11px;<br>  font-family: &#39;Roboto Mono&#39;, monospace;<br>  color: #F8FAFC;<br>  line-height: 1.9;<br>  margin-bottom: -5px;<br>}<br></pre><pre>zg-caption a {<br>  color: #028ecc;<br>  text-decoration: none;<br>  padding: 2px;<br>  font-size: 12px;<br>  margin-top: -15px;<br>}</pre><pre>zg-caption a:hover {<br>  color: #ffffff;<br>  text-decoration: underline;<br>}</pre><pre>zg-head-cell {<br>  font-size: 11px;<br>  background: #028ecc;<br>  color: #F8FAFC;<br>  margin-bottom: -2px;<br>}</pre><pre>zg-body {<br>  font-size: 12px;<br>  font-family: &#39;Roboto Mono&#39;, monospace;<br>	background: #F8FAFC;<br>  color: #04769e;<br>  border: 0px;<br>}</pre><pre>zg-row, zg-cell {<br>  padding: 0 15px; <br>  height: 38px;<br>}</pre><pre>zg-row {<br>  border-bottom: 1px solid #dcdfe0;<br>}</pre><pre>.null {<br>  color: #a1b2b5;<br>  font-style: italic;<br>}</pre><pre>zg-footer {<br>  font-size: 12px;<br>  padding: 0 15px 0 15px;<br>  display: flex;<br>  justify-content: space-between; <br>  color: #ffffff;<br>  background: #004a6b;<br>}</pre><pre>zg-pager {<br>  color: #ffffff;<br>}</pre><pre>zg-watermark {<br>  border-top: 1px solid #004a6b;<br>  background: #004a6b;<br>    border-radius: 0 0 6px 6px;<br>  -webkit-border-radius: 0 0 6px 6px;<br>  -moz-border-radius: 0 0 6px 6px;<br>}</pre><p>Take a look at the above CSS and try copying it into your either a separate &lt;style&gt; tag in your HTML or in a separate CSS file. After re-rendering your grid, you should see the fully styled version of the grid we showed previously.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=866660fabcde" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Embed Videos in a Data Grid in Under 60 Seconds]]></title>
            <link>https://medium.com/@zinggrid/how-to-embed-videos-in-a-data-grid-in-under-60-seconds-53fd9b04609e?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/53fd9b04609e</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[datatables]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[datagrid]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Wed, 14 Aug 2019 16:04:20 GMT</pubDate>
            <atom:updated>2019-08-14T16:04:20.442Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*dhWNHGnzhVmAIZ0pAGEnGw.jpeg" /></figure><p>This is part three in our <a href="https://medium.com/@zinggrid/functionality-in-under-60-seconds-using-zinggrid-e2487418bd5a">“Functionality in Under 60 Seconds”</a> blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to <a href="https://www.zinggrid.com/">ZingGrid data grids and tables</a>.</p><p>Watch the short video below to see how easy it is to add videos to ZingGrid data grids, or scroll further to read a short summary covering the basics.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fe5BFU9zlQNw%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3De5BFU9zlQNw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fe5BFU9zlQNw%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/344ac2e70d9edad4f6822ff513d46553/href">https://medium.com/media/344ac2e70d9edad4f6822ff513d46553/href</a></iframe><p>The first thing you’ll want to do is follow this checklist to make sure you’ve set up ZingGrid properly in preparation for implementing this feature:</p><ol><li>Make sure the videos you want to embed are already hosted online, and that you have permission to use them</li><li>Update your JSON dataset to include the URLs to the videos you’d like to embed. Make sure to include the video embed URL in your dataset, not the direct video URL.</li><li>Make sure you’ve set up a basic grid by referencing the ZingGrid library in your development environment using either the CDN or self-hosted options</li></ol><p>As a quick refresher, if you’re using ZingGrid in a basic HTML page, this is what your code should look like before starting this tutorial:</p><pre>&lt;!DOCTYPE html&gt;<br> &lt;html&gt;<br>  &lt;head&gt;<br>     &lt;meta charset=&quot;utf-8&quot;&gt;<br>   &lt;title&gt;&lt;/title&gt;<br>   &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>   &lt;zing-grid&gt;&lt;/zing-grid&gt;<br>  &lt;/body&gt;<br> &lt;/html&gt;</pre><p>From here, it’s just a matter of adding your data to your grid, and adding columns so you can specify the column type for your embedded media.</p><h3>Embedding Videos in Under a Minute</h3><p>Let’s say you have a basic dataset featuring videos of classical musical compositions dedicated to each planet in our solar system. This dataset will yield two columns of data when rendered in ZingGrid, the last of which contains videos.</p><p>As I mentioned at the beginning of this post, it’s important that you use the embed URL for videos, as opposed to the direct URL. In the case of YouTube videos, this is what the difference between those two types of URLs looks like:</p><p>Embed URL: <a href="https://www.youtube.com/embed/RkiiAloL6aE">https://www.youtube.com/embed/RkiiAloL6aE</a></p><p>Direct URL: <a href="https://www.youtube.com/watch?v=RkiiAloL6aE">https://www.youtube.com/watch?v=RkiiAloL6aE</a></p><p>Your JSON dataset will probably look something like this once you’ve added your video URLs to it:</p><pre>[<br>   {<br>   &quot;planet&quot;: &quot;Mercury&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/RkiiAloL6aE&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Venus&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/EE6_PacCnRw&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Earth&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/MbHQ6eWANIo&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Mars&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/Jmk5frp6-3Q&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Jupiter&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/Gu77Vtja30c&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Saturn&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/MO5sB56rfzA&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Uranus&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/aDFGmiXnLjU&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Neptune&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/v4wuV14QlNM&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Pluto&quot;,<br>   &quot;video&quot;: &quot;https://www.youtube.com/embed/N_v8G0fo4Ws&quot;<br>  }<br>]</pre><p>This is what your code would look like if you were to add inline data to your data grid:</p><pre>&lt;!DOCTYPE html&gt;<br> &lt;html&gt;<br>  &lt;head&gt;<br>     &lt;meta charset=&quot;utf-8&quot;&gt;<br>   &lt;title&gt;&lt;/title&gt;<br>   &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>   &lt;zing-grid<br>    data=&#39;[<br>      {<br>      &quot;planet&quot;: &quot;Mercury&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/RkiiAloL6aE&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Venus&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/EE6_PacCnRw&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Earth&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/MbHQ6eWANIo&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Mars&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/Jmk5frp6-3Q&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Jupiter&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/Gu77Vtja30c&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Saturn&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/MO5sB56rfzA&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Uranus&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/aDFGmiXnLjU&quot;<br>     },<br>     { <br>     &quot;planet&quot;: &quot;Neptune&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/v4wuV14QlNM&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Pluto&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/N_v8G0fo4Ws&quot;<br>     }<br>    ]&#39;&gt;<br>   &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br> &lt;/html&gt;</pre><p>At this point, your grid should look something like this when rendered — don’t worry, it’s not a mistake:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/909/1*ZfHIsd-KO8e_TzzQf5fqSg.png" /><figcaption>Data grid rendering URL strings instead of video embeds.</figcaption></figure><p>To render the last column in your dataset as a video instead of a string containing the video URL, you’ll need to manually specify the columns in your grid so you can change the last column’s column type.</p><p>To do this, add two &lt;zg-column&gt;&lt;/zg-column&gt; tags inside the&lt;zing-grid&gt;&lt;/zing-grid&gt; tag — one for each unique key in your JSON data. In our case, our sample dataset has two unique JSON keys, so we&#39;ll add two &lt;zg-column&gt;&lt;/zg-column&gt; tags inside the &lt;zing-grid&gt;&lt;/zing-grid&gt; tag.</p><p>Within each set of &lt;zg-column&gt;&lt;/zg-column&gt; tags, we&#39;ll add index=&quot;&quot; and fill in each JSON key name in the order we&#39;d like the columns to appear. In the zg-column tag for video, we&#39;ll add the type=&quot;&quot; attribute with a value of iframe to specify that the column should render iframe content instead of strings of text.</p><p>If you’re using the sample data from this tutorial, your column tags should look like this:</p><pre>&lt;zg-colgroup&gt;<br>   &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>   &lt;zg-column index=&quot;video&quot; type=&quot;iframe&quot;&gt;&lt;/zg-column&gt;<br>&lt;/zg-colgroup&gt;</pre><p>You don’t need to specify the column type for the planet column because ZingGrid&#39;s default column type is set to text.</p><p>If you’re following along, your code should look like this (focus on the code below the inline data):</p><pre>&lt;!DOCTYPE html&gt;<br> &lt;html&gt;<br>  &lt;head&gt;<br>   &lt;meta charset=&quot;utf-8&quot;&gt;<br>   &lt;title&gt;&lt;/title&gt;<br>   &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>   &lt;zing-grid<br>     data=&#39;[<br>      {<br>      &quot;planet&quot;: &quot;Mercury&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/RkiiAloL6aE&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Venus&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/EE6_PacCnRw&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Earth&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/MbHQ6eWANIo&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Mars&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/Jmk5frp6-3Q&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Jupiter&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/Gu77Vtja30c&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Saturn&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/MO5sB56rfzA&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Uranus&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/aDFGmiXnLjU&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Neptune&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/v4wuV14QlNM&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Pluto&quot;,<br>      &quot;video&quot;: &quot;https://www.youtube.com/embed/N_v8G0fo4Ws&quot;<br>     }<br>    ]&#39;&gt;<br>    &lt;zg-colgroup&gt;<br>     &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>     &lt;zg-column index=&quot;video&quot; type=&quot;iframe&quot;&gt;&lt;/zg-column&gt;<br>    &lt;/zg-colgroup&gt;<br>   &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br> &lt;/html&gt;</pre><p>That’s all you need to do to render videos in your ZingGrid data grid! The above code will yield the following result.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/903/1*ly20EWIsqTGDNJQQJviryw.gif" /><figcaption>Data grid rendering video embeds. View the <a href="https://app.zingsoft.com/demos/create/FS3Q3016">live demo</a></figcaption></figure><p>And those are the basics of adding video embeds in your ZingGrid data tables &amp; grids. <a href="https://app.zingsoft.com/demos/create/FS3Q3016">View the live demo</a> in our Studio playground to see how it works, and to play around with the final result.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=53fd9b04609e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How ZingGrid Can Help Dev Teams in the Finance Industry]]></title>
            <link>https://medium.com/@zinggrid/how-zinggrid-can-help-dev-teams-in-the-finance-industry-356b51dbde18?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/356b51dbde18</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[datagrid]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Wed, 07 Aug 2019 16:06:02 GMT</pubDate>
            <atom:updated>2019-08-07T16:06:02.550Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*egmvInHQWPmd8_Oe9aCDVg.jpeg" /></figure><p><em>By Sarah at ZingSoft</em></p><p>From commercial banking, to corporate finance, to accounting, insurance operations, wealth management, and trading — web development teams in the financial services industry often need to visualize different kinds of data, and they operate within a wide range of financial sectors. Financial data comes in many forms, and the demand for that data to be presented in a variety digital contexts has increased dramatically as mobile devices and non-traditional computer interactions have become more popular.</p><p>Tabular data in particular tends to be an often overlooked aspect of financial data visualization when compared to charts and diagrams, but it’s no less important. In the days of printed financial statements and reports, it was easy to justify the lack of interactivity in data grids and data tables. However, in the age of digital media there’s no reason to continue to treat data grids and tables as flat and static visual elements. Users want to be able to do more than just stare at their tabular financial data — they want to sort through it, filter it, search it, paginate it, control how much of it is visible, and a lot more.</p><p>Development tools like <a href="https://zinggrid.com">ZingGrid</a>, a JavaScript library for data grids and data tables, can help web development teams in the financial industry make easy work of this interactivity with just a few lines of code. A project that might have originally taken hours to code from scratch can become a project that takes less than half an hour to get off the ground. Beyond the user-facing benefits to using a data grid library like ZingGrid, there can also be plenty of backend benefits for dev teams.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kt-E_odnOr7Q5kNz1d74LA.png" /><figcaption>View this cryptocurrency demo <a href="https://www.zinggrid.com/demos?demo=NAGI05UY">here</a></figcaption></figure><p>Features like <a href="https://www.zinggrid.com/docs/features/server-side-rendering">server-side rendering</a>, <a href="https://www.zinggrid.com/docs/features/data">real-time/dynamic data</a>, <a href="https://www.zinggrid.com/docs/crud-basics">built-in CRUD functionality</a>, and a <a href="https://www.zinggrid.com/docs/features/api">rich API</a> are all examples of how ZingGrid was built with developers in mind. It’s a tool that doesn’t so much replace the work of a developer as much as it greatly reduces the time it takes to do the work. It also makes those results much easier to replicate and scale across a variety of development contexts and team sizes.</p><p>To see a live example of how ZingGrid handles different kinds of financial data, check out our <a href="https://www.zinggrid.com/demos?demo=NAGI05UY">Cryptocurrency Pricing demo</a>, our <a href="https://www.zinggrid.com/demos?demo=G5EIVNRD">Stock Trends demo</a>, or our <a href="https://app.zingsoft.com/demos/create/9PAU67EM">Euro Forex demo</a>. You’ll be able to see the code used to create these demos, as well as modify and play with it to see how easy it is to work with ZingGrid. If you’d also like to see an example of how easy it is to implement a feature like conditionality into your data grids, read our “Conditionality in 60 Seconds” <a href="https://medium.com/@zinggrid/conditionality-in-60-seconds-b026215ca568">blog post tutorial</a>, or watch the <a href="https://www.youtube.com/watch?v=PiY3zvE5-5g">video walk-through</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BsgL8E5Q8DbiYtwhks6slg.png" /><figcaption>View this combined ZingGrid and ZingChart stock ticker demo <a href="https://www.zinggrid.com/demos?demo=G5EIVNRD">here</a></figcaption></figure><p>If you’re curious about how ZingGrid can help your web development team streamline their process for presenting tabular data, check out our website at <a href="http://www.zinggrid.com">http://www.zinggrid.com</a>, or contact us. We’d love to help you find custom solutions for your financial data!</p><p>Lastly, I encourage you to check out the blog post I wrote about how our sister product, ZingChart, can further help streamline your development team’s data visualization workflow for financial data. With over 35 built-in chart types and lots of customizable features, ZingChart is an extremely powerful charting tool that’s equipped to handle datasets with even millions of data points. Together, ZingGrid and ZingChart form a powerful suite of data visualization products that are sure to help take the headache out of visualizing financial data for your development team.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=356b51dbde18" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How the ZingSoft Team Uses CloudApp to Streamline their Media Capture Workflow]]></title>
            <link>https://medium.com/@zinggrid/how-the-zingsoft-team-uses-cloudapp-to-streamline-their-media-capture-workflow-b81dedaf3e56?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/b81dedaf3e56</guid>
            <category><![CDATA[image-capture]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[workflow]]></category>
            <category><![CDATA[workflow-management]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Tue, 06 Aug 2019 16:01:01 GMT</pubDate>
            <atom:updated>2019-08-06T16:18:20.664Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Sarah at ZingSoft</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ExTfrNPr5pYiDo-OipSaSw.jpeg" /></figure><p>At <a href="https://www.zingsoft.com/">ZingSoft</a>, we’re always on the lookout for new tools that can make our jobs easier, which also means that we’ve tried many, many different products and services. If I had to choose just one tool that’s been the most transformative for my team’s overall productivity in the past year, <a href="https://www.getcloudapp.com/">CloudApp</a> would be one of my top two contenders for that title. Perhaps it’s surprising to hear that a media-capture application could make such a big impact on a software development team, but the reality is that it has filled a gap we were unaware of — one we didn’t realize was having such a big impact on our workflows.</p><p>As it turns out, there are many reasons why everyone from a software developer, to a graphic designer, to a QA tester might need to capture a screenshot, GIF, or video recording of what’s happening on their computer screen. What’s more, it’s perfectly reasonable to expect someone in any of those team roles to want to annotate and share those recordings as well. Enter CloudApp, a cloud-based media recording application that not only includes all of the aforementioned functionality, but which also stores all recorded media in the cloud (are you noticing a theme here?) for later access and retrieval from any desktop. Here’s what a CloudApp capture looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9b2s2Qd_wSRgC7OHBZ26Cg.png" /><figcaption>This screenshot was created and annotated with CloudApp</figcaption></figure><p>On the surface, the functionality that CloudApp provides may seem easy to de-emphasize. After all, it’s simple enough to take screenshots natively, and many basic image viewing applications nowadays have some form of basic annotative abilities. However, CloudApp differentiated itself with my team by making the process of capturing, annotating, and sharing motion graphics and video as easy as it is with static screenshots. Additionally, its non-invasive UX means that the app is there when we need it, but nearly invisible when we don’t. This combination of thoughtful functionality and minimal presence is what ultimately made it so easy for my teammates to integrate it into their various workflows, regardless of their role.</p><p>The use cases in which we’ve found ourselves using CloudApp are many. They run the gamut from capturing bugs in the JavaScript libraries we build, to recording weird behavior in our various websites and apps, to visually bookmarking inspirational things we come across on the web, to creating content for our marketing materials (like the screenshots in this blog post). However, beyond its many use cases, CloudApp’s sharing options are what have also made it invaluable to us. We can share a single piece of media directly by dragging and dropping the file, or via various cloud-based link sharing options (e.g. direct link, download link, embed code, etc). We can also share our recorded media directly to various platforms like Slack, Trello, Twitter, etc. from CloudApp’s interface.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*Sp3Qdb1aAWga7bgW34lerQ.gif" /><figcaption>This GIF was created with CloudApp</figcaption></figure><p>At a higher level, CloudApp has made it easier for my team to visually communicate the value of our <a href="https://www.zinggrid.com/">ZingGrid</a> and <a href="https://www.zingchart.com/">ZingChart</a> data visualization products to existing and potential customers. Our two JavaScript libraries are predominantly presentational, and having a tool that makes it so easy to visually convey what our products can do has been transformative and time-saving. Producing content like product tutorials, email campaigns, bug reports/stories, and internal status presentations have become easier than ever thanks to the help that CloudApp provides.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b81dedaf3e56" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Embed Images in a Data Grid in Under 60 Seconds]]></title>
            <link>https://medium.com/@zinggrid/how-to-embed-images-in-a-data-grid-in-under-60-seconds-fc36dbffc7ff?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/fc36dbffc7ff</guid>
            <category><![CDATA[datagrid]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[data-visualization]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Tue, 23 Jul 2019 16:22:35 GMT</pubDate>
            <atom:updated>2019-08-14T16:02:39.448Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Sarah at ZingSoft</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*i49KzV2Ouw0JdSDkUfuhCw.jpeg" /></figure><p>This is number two in our <a href="https://medium.com/@zinggrid/functionality-in-under-60-seconds-using-zinggrid-e2487418bd5a">“Functionality in Under 60 Seconds”</a> blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to <a href="https://www.zinggrid.com/">ZingGrid data grids and tables</a>.</p><p>Watch the short video below to see how easy it is to add images to ZingGrid data grids, or scroll further to read a short summary covering the basics.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FyHvgZE73K3s%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DyHvgZE73K3s&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FyHvgZE73K3s%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/bb16687c51e73365b3f2bd58766d5c60/href">https://medium.com/media/bb16687c51e73365b3f2bd58766d5c60/href</a></iframe><p>The first thing you’ll want to do is follow this checklist to make sure you’ve set up ZingGrid properly in preparation for implementing this feature:</p><ol><li>Make sure the images you want to embed are already hosted online, and that you have permission to use them.</li><li>Update your JSON dataset to include the URLs to the images you’d like to embed.</li><li>Make sure you’ve set up a basic grid by referencing the ZingGrid library in your development environment using either the CDN or self-hosted options</li></ol><p>As a quick refresher, if you’re using ZingGrid in a basic HTML page, this is what your code should look like before starting this tutorial:</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html&gt;<br>  &lt;head&gt;<br>    &lt;meta charset=&quot;utf-8&quot;&gt;<br>    &lt;title&gt;&lt;/title&gt;   <br>    &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;  <br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;zing-grid&gt;&lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>From here, it’s just a matter of adding your data to your grid, and adding columns so you can specify the column type for your embedded images.</p><h3>Embedding Images in Under a Minute</h3><p>Let’s say you have a simple dataset about the planets in our solar system. This dataset will yield three columns of data when rendered in ZingGrid, the last of which contains images. Your JSON dataset might look something like this:</p><pre>[<br>   {<br>   &quot;planet&quot;: &quot;Mercury&quot;,<br>   &quot;moons&quot;: &quot;0&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;token=23f8d355-ca73-4334-980c-23f5ae91d087&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Venus&quot;,<br>   &quot;moons&quot;: &quot;0&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Earth&quot;,<br>   &quot;moons&quot;: &quot;1&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;token=33df1022-e000-4e95-9996-5b9101af627d&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Mars&quot;,<br>   &quot;moons&quot;: &quot;2&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Jupiter&quot;,<br>   &quot;moons&quot;: &quot;67&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;token=64c3cf9b-5541-475b-9711-17f046cff801&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Saturn&quot;,<br>   &quot;moons&quot;: &quot;62&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Uranus&quot;,<br>   &quot;moons&quot;: &quot;27&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Neptune&quot;,<br>   &quot;moons&quot;: &quot;13&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c&quot;<br>  },<br>  {<br>   &quot;planet&quot;: &quot;Pluto&quot;,<br>   &quot;moons&quot;: &quot;4&quot;,<br>   &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd&quot;<br>  }<br>]</pre><p>This is what your code would look like if you were to add this data inline to your grid:</p><pre>&lt;!DOCTYPE html&gt;<br> &lt;html&gt;<br>  &lt;head&gt;<br>     &lt;meta charset=&quot;utf-8&quot;&gt;<br>   &lt;title&gt;&lt;/title&gt;<br>   &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>    &lt;zing-grid<br>    data=&#39;[<br>      {<br>      &quot;planet&quot;: &quot;Mercury&quot;,<br>      &quot;moons&quot;: &quot;0&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;token=23f8d355-ca73-4334-980c-23f5ae91d087&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Venus&quot;,<br>      &quot;moons&quot;: &quot;0&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Earth&quot;,<br>      &quot;moons&quot;: &quot;1&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;token=33df1022-e000-4e95-9996-5b9101af627d&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Mars&quot;,<br>      &quot;moons&quot;: &quot;2&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Jupiter&quot;,<br>      &quot;moons&quot;: &quot;67&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;token=64c3cf9b-5541-475b-9711-17f046cff801&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Saturn&quot;,<br>      &quot;moons&quot;: &quot;62&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Uranus&quot;,<br>      &quot;moons&quot;: &quot;27&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Neptune&quot;,<br>      &quot;moons&quot;: &quot;13&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Pluto&quot;,<br>      &quot;moons&quot;: &quot;4&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd&quot;<br>     }<br>    ]&#39;&gt;<br>    &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>At this point, your grid should look something like this when rendered — but don’t worry, it’s not a mistake:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aeY5ZAqszbpF2U3UlmSlOw.png" /><figcaption>Data grid rendering URL strings instead of image embeds.</figcaption></figure><p>This is where the magic happens! To render the third column in your dataset as an image instead of a string containing an image path, you’ll need to manually specify the columns in your grid so you can change the third column’s column type.</p><p>To do this, add three zg-column tags inside &lt;zing-grid&gt;&lt;/zing-grid&gt; – one for each unique key in your JSON data. In our case, our sample dataset has three unique JSON keys, so we&#39;ll add three &lt;zg-column&gt;&lt;/zg-column&gt; tags inside the &lt;zing-grid&gt;&lt;/zing-grid&gt; tag.</p><p>Within each set of &lt;zg-column&gt;&lt;/zg-column&gt; tags, we&#39;ll add index=&quot;&quot; and fill in each JSON key name in the order we&#39;d like the columns to appear. In the zg-column tag for photo, we&#39;ll add the type=&quot;&quot; attribute with a value of image to specify that the column should render images instead of strings of text.</p><p>If you’re using the sample data from this tutorial, your column tags should look like this:</p><pre>&lt;zg-colgroup&gt;<br>  &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>  &lt;zg-column index=&quot;moons&quot;&gt;&lt;/zg-column&gt;<br>  &lt;zg-column index=&quot;photo&quot; type=&quot;image&quot;&gt;&lt;/zg-column&gt;<br>&lt;/zg-colgroup&gt;</pre><p>You don’t need to specify the column type for the planet and moons columns because ZingGrid&#39;s default column type is text.</p><p>If you’re following along, your code should look like this (focus on the code below the inline data):</p><pre>&lt;!DOCTYPE html&gt;<br> &lt;html&gt;<br>  &lt;head&gt;<br>     &lt;meta charset=&quot;utf-8&quot;&gt;<br>   &lt;title&gt;&lt;/title&gt;<br>   &lt;script src=&quot;<a href="https://cdn.zinggrid.com/zinggrid.min.js">https://cdn.zinggrid.com/zinggrid.min.js&quot; defer&gt;&lt;/script</a>&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>   &lt;zing-grid<br>    data=&#39;[<br>      {<br>      &quot;planet&quot;: &quot;Mercury&quot;,<br>      &quot;moons&quot;: &quot;0&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;token=23f8d355-ca73-4334-980c-23f5ae91d087&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Venus&quot;,<br>      &quot;moons&quot;: &quot;0&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Earth&quot;,<br>      &quot;moons&quot;: &quot;1&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;token=33df1022-e000-4e95-9996-5b9101af627d&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Mars&quot;,<br>      &quot;moons&quot;: &quot;2&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Jupiter&quot;,<br>      &quot;moons&quot;: &quot;67&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;token=64c3cf9b-5541-475b-9711-17f046cff801&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Saturn&quot;,<br>      &quot;moons&quot;: &quot;62&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Uranus&quot;,<br>      &quot;moons&quot;: &quot;27&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Neptune&quot;,<br>      &quot;moons&quot;: &quot;13&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c&quot;<br>     },<br>     {<br>      &quot;planet&quot;: &quot;Pluto&quot;,<br>      &quot;moons&quot;: &quot;4&quot;,<br>      &quot;photo&quot;: &quot;https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd&quot;<br>     }<br>    ]&#39;&gt;<br>      &lt;zg-colgroup&gt;<br>        &lt;zg-column index=&quot;planet&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;moons&quot;&gt;&lt;/zg-column&gt;<br>        &lt;zg-column index=&quot;photo&quot; type=&quot;image&quot;&gt;&lt;/zg-column&gt;<br>      &lt;/zg-colgroup&gt;<br>    &lt;/zing-grid&gt;<br>  &lt;/body&gt;<br>&lt;/html&gt;</pre><p>And that’s all you need to do to render images in your ZingGrid data grid! The above code will yield the following result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/790/1*T-97oUa6K3bNTmgRP9goZg.gif" /><figcaption>Data grid rendering image embeds. View the <a href="https://app.zingsoft.com/demos/create/P06UH5EQ">live demo</a></figcaption></figure><p>Those are the basics of adding image embeds in your ZingGrid data tables &amp; grids. <a href="https://app.zingsoft.com/demos/create/P06UH5EQ">View the live demo</a> in our Studio playground to see how it works and to play around with the final result.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fc36dbffc7ff" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How ZingGrid Can Help Dev Teams in the Health Care Industry]]></title>
            <link>https://medium.com/@zinggrid/how-zinggrid-can-help-dev-teams-in-the-health-care-industry-2774a3402b89?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/2774a3402b89</guid>
            <category><![CDATA[datagrid]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[healthcare]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Wed, 17 Jul 2019 15:29:53 GMT</pubDate>
            <atom:updated>2019-07-17T18:54:18.121Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Sarah at ZingSoft</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YXRuHN_Qi8s-cDrQQ5yIZg.jpeg" /></figure><p>As health care continues to progress towards increasing integration with digital technologies, the need to streamline web development workflows that facilitate the capture and presentation of medical and health-related data has become more important than ever. Legislative incentives and consumer demand have also greatly accelerated the pace at which digitization has transformed the modern health care space.</p><p>From customer information, to scientific study data, to medical records, to product inventories — there are many examples of tabular data that emerge from the intersection of medicine, business, science, and technology. The challenge that many development teams in the health care space face is how to leverage and present that data in the most efficient way possible, given limited resources. This is where tools like ZingGrid, a JavaScript library for data grids and data tables, shines.</p><p>ZingGrid lets developers quickly create mobile-friendly, CRUD-ready data grids and data tables for websites and apps. It’s ideal for use cases where the need to display tabular information is combined with the need to quickly and modularly implement basic functionality like sorting, filtering, searching, editing, and paging through data. Features like layout modes, data export, pagination, and media embeds can be activated in <a href="https://www.zinggrid.com">ZingGrid</a> with just a few lines of code to dynamically present your JSON data.</p><p>In many cases, ZingGrid doesn’t necessarily replace the work that an experienced developer could do, it simply makes it so that the work doesn’t need to be done in the first place — a shortcut. Additionally, it makes it so that implementing fully-featured data grids and data tables becomes a modular, repeatable, and scalable task for development teams — one that takes minimum time and effort.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/858/1*0k0eO-oQJbqILo0TNzwNVg.gif" /><figcaption>View the live demo of this CRUD grid <a href="https://www.zinggrid.com/demos?demo=AEA3OP7F">here</a>.</figcaption></figure><p>If you’d like to see a live example of a basic grid built using ZingGrid, check out <a href="https://www.zinggrid.com/demos?demo=AEA3OP7F">this CRUD demo in our gallery</a>. The best thing about the CRUD data grid featured in this example is that it can be set-up in less than a minute if you’ve already decided on your back-end configuration. <a href="https://www.youtube.com/watch?v=ULFdufdUgPA">Here’s a video</a> that shows how quick it is to set up a CRUD-ready data grid using a Node Express server.</p><p>If you’re interested in learning more about how ZingGrid can help you and your customers present and interact with tabular health care data, check out our website at <a href="http://www.zinggrid.com">http://www.zinggrid.com</a>, or contact us. We’d be happy to help you figure out custom solutions for your team’s health care use cases.</p><p>Lastly, I encourage you to check out the <a href="https://medium.com/@zingchart/how-zingchart-can-help-dev-teams-in-the-health-care-industry-bd99dc8a52c7">blog post</a> I wrote about how our sister product, ZingChart, can further help streamline your development team’s data visualization workflow for health care data. With over 35 built-in chart types and lots of customizable features, ZingChart is an extremely powerful charting tool that’s equipped to handle datasets with even millions of data points.</p><p>Together, ZingGrid and ZingChart form a powerful suite of data visualization products that are sure to help take the headache out of visualizing health care data for your development team.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2774a3402b89" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How the ZingSoft Team Uses StatusHero to Improve Intra-Team Communication]]></title>
            <link>https://medium.com/@zinggrid/how-the-zingsoft-team-uses-statushero-to-improve-intra-team-communication-60a0b0277b5b?source=rss-83c5b4e63413------2</link>
            <guid isPermaLink="false">https://medium.com/p/60a0b0277b5b</guid>
            <category><![CDATA[team-building]]></category>
            <category><![CDATA[communication]]></category>
            <category><![CDATA[organization]]></category>
            <category><![CDATA[improvement]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[ZingGrid]]></dc:creator>
            <pubDate>Tue, 09 Jul 2019 17:01:01 GMT</pubDate>
            <atom:updated>2019-07-09T17:01:01.852Z</atom:updated>
            <content:encoded><![CDATA[<p><em>By Sarah at ZingSoft</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DxLCVIm6z-QofsIvft6iAw.png" /></figure><p>Whether you’re on a small development team, or are part of a much larger development organization, intra-team communication is vital regardless of your team’s size. Yet given the increasing proliferation of digital communication tools and contexts in the modern workplace, that’s easier said than done — especially during the ebb and flow of a busy workday.</p><p>At <a href="https://www.zingsoft.com/">ZingSoft</a>, we’ve been using a suite of popular tools for active communication with solid results for years, but more recently we realized we also had a passive communication problem. This distinction between active and passive communication patterns within teams is important for a few reasons. Whereas active communication is more immediate and direct (e.g. chat or email), passive communication is more persistent and indirect (e.g. status updates or a shared calendar).</p><p>Information can easily and quickly become buried when using active communication formats. In general, those conversational forms of communication aren’t ideal for capturing and revisiting information like status updates or schedules. For example, relying solely on chat or face-to-face conversations can make it difficult for everyone to keep track of what everyone else on your team is doing within a given time period.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xOfka4ZQy3JaEE-tIn3SFQ.png" /><figcaption>This is what a team dashboard looks like in Status Hero (above the fold)</figcaption></figure><p>This is why <a href="https://statushero.com/">StatusHero</a> has become such an integral part of our team’s daily workflow. It’s a tool for tracking daily status updates and simple metrics around our team’s daily goals, and it integrates well with tools we already use, like Gitlab and Clubhouse. Tried and true services like Slack, Gmail, and Zoom have been the workhorses of our digital interactions for years, but they’re geared towards active, conversational communication formats.</p><p>In a workplace like ours where some teammates work remotely 100% of the time, while others split their time between in-office and remote work, the need for passive communication solutions like StatusHero becomes magnified. When your team’s founder &amp; CEO is also a computer science professor and soon-to-be data visualization professor, the need for those solutions becomes imperative.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cwY_RWe4wEM5JIrwJ1tFlw.png" /><figcaption>This is what a status update prompt looks like in StatusHero</figcaption></figure><p>So what does a status update look like? Every morning, everyone on the ZingSoft team receives a reminder via Slack to take a few minutes to fill out their StatusHero update for the day. A daily update involves succinctly answering four simple questions:</p><ol><li>Did you meet yesterday’s goals?</li><li>What did you do yesterday?</li><li>What are your goals for today?</li><li>Are you blocked by anything?</li></ol><p>Each teammate’s response is then displayed on a daily dashboard that chronicles a few simple metrics around team participation and goals, as well as everyone’s status update for the day. This makes it easy to check in on what your team as a whole is doing on any given day, and also gives you the flexibility to go back as far as you need to if you’d like to see what someone was doing on a given day. Over time, you can begin to form a high-level picture of team health and productivity using StatusHero’s Reports feature. With Reports, you can gauge team health over time based on comparisons like the proportion of daily goals hit versus days blocked.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WektNLZh7gfxeOEqXtZN3g.png" /><figcaption>Here’s a close-up example of the ZingSoft team’s Reports page in StatusHero</figcaption></figure><p>Beyond the obvious benefits, StatusHero has helped increase our team’s productivity in unexpected ways too. When it comes time to create presentations summarizing team activity over the course of the week or month (during retrospective or all-hands meetings, for example), StatusHero makes it so much easier to go back and summarize what everyone worked on. If I lose track of what I was working on due to a prolonged interruption, StatusHero makes it much quicker for me to re-orient myself in my workweek.</p><p>If you find that your development team could use some passive communication, then daily status updates are definitely a great place to start. Whether you go with StatusHero or a different type of solution, I highly recommend you explore how integrating more passive forms of communication into your team’s daily workflow can increase productivity while helping your teammates feel better-informed.</p><p><em>Built using web components, </em><a href="https://www.zinggrid.com/"><em>ZingGrid </em></a><em>is a fully-featured, native JavaScript data grid solution for the web. With out-of-the-box CRUD capability and ease of use via custom DOM elements, ZingGrid introduces a new way to visualize data using JS grids.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=60a0b0277b5b" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>