<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hibs</title>
    <description>The latest articles on Forem by Hibs (@sarahatzing).</description>
    <link>https://forem.com/sarahatzing</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F136834%2F29c86efc-6e8f-4936-b313-aa9c59382f5f.jpg</url>
      <title>Forem: Hibs</title>
      <link>https://forem.com/sarahatzing</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sarahatzing"/>
    <language>en</language>
    <item>
      <title>How to Embed Audio in a Data Grid in Under 60 Seconds</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Mon, 28 Oct 2019 22:15:24 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-to-embed-audio-in-a-data-grid-in-under-60-seconds-5edc</link>
      <guid>https://forem.com/zinggrid/how-to-embed-audio-in-a-data-grid-in-under-60-seconds-5edc</guid>
      <description>&lt;p&gt;This is part four of my “Functionality in Under 60 Seconds” blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to &lt;a href="https://www.zinggrid.com/" rel="noopener noreferrer"&gt;ZingGrid data grids and tables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zs3V_zqxt24"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure the audio you want to embed is already hosted online, and that you have permission to link to it.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
      &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
      &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embedding Audio in Under a Minute
&lt;/h2&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;Embed URL: &lt;a href="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/344477157&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true" rel="noopener noreferrer"&gt;&lt;code&gt;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/344477157&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Direct URL: &lt;a href="https://soundcloud.com/user-831103706/sza-the-weekend" rel="noopener noreferrer"&gt;&lt;code&gt;https://soundcloud.com/user-831103706/sza-the-weekend&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your JSON dataset will probably look something like this once you've added your audio embed URLs to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 
  {
    "planet": "Mercury",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Venus",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Earth",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Mars",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Jupiter",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Saturn",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Uranus",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Neptune",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  },
  {
    "planet": "Pluto",
    "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what your code would look like if you were to add your data inline to your grid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;zing-grid
      data='[ 
      {
        "planet": "Mercury",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Venus",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Earth",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Mars",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Jupiter",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Saturn",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Uranus",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Neptune",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Pluto",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      }
      ]'&amp;gt;
    &amp;lt;/zing-grid&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, your grid should look something like this when rendered — but don’t worry because it’s not a mistake:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpbnqbd1fql0uattrjb14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpbnqbd1fql0uattrjb14.png" alt="Data grid rendering URL strings instead of audio embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;To do this, add two &lt;code&gt;zg-column&lt;/code&gt; tags inside &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; – one for each unique key in your JSON data. In our case, our sample dataset has two unique JSON keys, so we'll add two &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags inside the &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; tag. &lt;/p&gt;

&lt;p&gt;Within each set of &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags, we'll add &lt;code&gt;index=""&lt;/code&gt; and fill in each JSON key name in the order we'd like the columns to appear. In the &lt;code&gt;zg-column&lt;/code&gt; tag for &lt;code&gt;audio&lt;/code&gt;, we'll add the &lt;code&gt;type=""&lt;/code&gt; attribute with a value of &lt;code&gt;iframe&lt;/code&gt; to specify that the column should render iframe content instead of strings of text. &lt;/p&gt;

&lt;p&gt;If you're using the sample data from this tutorial, your column tags should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zg-colgroup&amp;gt; 
  &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
  &amp;lt;zg-column index="audio" type="iframe"&amp;gt;&amp;lt;/zg-column&amp;gt;
&amp;lt;/zg-colgroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember, you don't need to specify the column type for the &lt;code&gt;planet&lt;/code&gt; column because ZingGrid's default column type is &lt;code&gt;text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you're following along, your code should look like this (focus on the code below the inline data):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;zing-grid
      data='[ 
      {
        "planet": "Mercury",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907937&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Venus",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/220740990&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Earth",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390585&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Mars",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/207049506&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Jupiter",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/99286795&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Saturn",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/71907938&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Uranus",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/141390929&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Neptune",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306642706&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      },
      {
        "planet": "Pluto",
        "audio": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/305014611&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true&amp;amp;visual=true"
      }
      ]'&amp;gt;
      &amp;lt;zg-colgroup&amp;gt;
        &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
        &amp;lt;zg-column index="video" type="iframe"&amp;gt;&amp;lt;/zg-column&amp;gt;
      &amp;lt;/zg-colgroup&amp;gt;
    &amp;lt;/zing-grid&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s all you need to do to render audio embeds in your ZingGrid data grid! The above code will yield the following result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F9dgxiums4fl02fm63iek.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F9dgxiums4fl02fm63iek.gif" alt="Data grid rendering audio embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And those are the basics of adding audio embeds in your ZingGrid data tables &amp;amp; grids. View the live demo in our Studio playground to see how it works, and to play around with the final result.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How the ZingSoft Team Uses Notion for Shared Knowledge Management</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Thu, 17 Oct 2019 19:11:59 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-the-zingsoft-team-uses-notion-for-shared-knowledge-management-4966</link>
      <guid>https://forem.com/zinggrid/how-the-zingsoft-team-uses-notion-for-shared-knowledge-management-4966</guid>
      <description>&lt;p&gt;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-ons (I’m looking at you Gitlab and Clubhouse) weren’t powerful or flexible enough to meet our needs. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xU2QARp3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gni5onzurn7u1tbpvlxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xU2QARp3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gni5onzurn7u1tbpvlxd.png" alt="This is what our knowledge base looked like before Notion."&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This is what our knowledge base looked like before Notion.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Compared to the previous solutions we tried, &lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt; has been the Swiss Army Knife of knowledge management solutions. So much so that it has actually changed the way the ZingSoft team approaches 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 does 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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9aUIxde--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y1kbjv5v54a47b2716ig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9aUIxde--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/y1kbjv5v54a47b2716ig.png" alt="This is what our knowledge base now looks like using Notion."&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This is what our knowledge base now looks like using Notion.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://abookapart.com/products/everyday-information-architecture"&gt;“Everyday Information Architecture,”&lt;/a&gt; by Lisa Marie Martin – a quick and helpful read for anyone who finds themselves organizing information in a variety of contexts throughout the workweek. &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wH7C_oXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5czvvyayx4t98l6ho6zw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wH7C_oXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5czvvyayx4t98l6ho6zw.gif" alt="A quick GIF showing you what some of our internal information architecture looks like."&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A quick GIF showing you what some of our internal information architecture looks like.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So what are the specific selling points that have made the ZingSoft team a loyal Notion customer? Here are some of the things I've enjoyed about using it as a knowledge base:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's fully-featured for editing and viewing across desktop and mobile devices&lt;/li&gt;
&lt;li&gt;Real-time collaboration is easy. You can see which users are currently viewing a page, as well as their page position and edits&lt;/li&gt;
&lt;li&gt;Built-in version history for your pages lets you revert changes if needed&lt;/li&gt;
&lt;li&gt;Powerful embeds! I'm able to embed read-only Figma &amp;amp; Airtable files with ease, along with many other embed types.&lt;/li&gt;
&lt;li&gt;Content blocks give you just enough control over the presentation of your information&lt;/li&gt;
&lt;li&gt;Somewhat customizable design – you can upload your own icons and header imagery for your pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tools</category>
      <category>communication</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to Embed Videos in a Data Grid in Under 60 Seconds</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Wed, 14 Aug 2019 16:27:19 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-to-embed-videos-in-a-data-grid-in-under-60-seconds-54ia</link>
      <guid>https://forem.com/zinggrid/how-to-embed-videos-in-a-data-grid-in-under-60-seconds-54ia</guid>
      <description>&lt;p&gt;This is part three in my “Functionality in Under 60 Seconds” blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to &lt;a href="https://www.zinggrid.com/" rel="noopener noreferrer"&gt;ZingGrid data grids and tables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/e5BFU9zlQNw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure the videos you want to embed are already hosted online, and that you have permission to use them&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset="utf-8"&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
        &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embedding Videos in Under a Minute
&lt;/h2&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;Embed URL: &lt;a href="https://www.youtube.com/embed/RkiiAloL6aE" rel="noopener noreferrer"&gt;&lt;code&gt;https://www.youtube.com/embed/RkiiAloL6aE&lt;/code&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Direct URL: &lt;a href="https://www.youtube.com/watch?v=RkiiAloL6aE" rel="noopener noreferrer"&gt;&lt;code&gt;https://www.youtube.com/watch?v=RkiiAloL6aE&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your JSON dataset will probably look something like this once you've added your video URLs to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 
    {
        "planet": "Mercury",
        "video": "https://www.youtube.com/embed/RkiiAloL6aE"
    },
    {
        "planet": "Venus",
        "video": "https://www.youtube.com/embed/EE6_PacCnRw"
    },
    {
        "planet": "Earth",
        "video": "https://www.youtube.com/embed/MbHQ6eWANIo"
    },
    {
        "planet": "Mars",
        "video": "https://www.youtube.com/embed/Jmk5frp6-3Q"
    },
    {
        "planet": "Jupiter",
        "video": "https://www.youtube.com/embed/Gu77Vtja30c"
    },
    {
        "planet": "Saturn",
        "video": "https://www.youtube.com/embed/MO5sB56rfzA"
    },
    {
        "planet": "Uranus",
        "video": "https://www.youtube.com/embed/aDFGmiXnLjU"
    },
    {
        "planet": "Neptune",
        "video": "https://www.youtube.com/embed/v4wuV14QlNM"
    },
    {
        "planet": "Pluto",
        "video": "https://www.youtube.com/embed/N_v8G0fo4Ws"
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what your code would look like if you were to add this data inline to your  grid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
        &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;zing-grid
        data='[ 
    {
        "planet": "Mercury",
        "video": "https://www.youtube.com/embed/RkiiAloL6aE"
    },
    {
        "planet": "Venus",
        "video": "https://www.youtube.com/embed/EE6_PacCnRw"
    },
    {
        "planet": "Earth",
        "video": "https://www.youtube.com/embed/MbHQ6eWANIo"
    },
    {
        "planet": "Mars",
        "video": "https://www.youtube.com/embed/Jmk5frp6-3Q"
    },
    {
        "planet": "Jupiter",
        "video": "https://www.youtube.com/embed/Gu77Vtja30c"
    },
    {
        "planet": "Saturn",
        "video": "https://www.youtube.com/embed/MO5sB56rfzA"
    },
    {
        "planet": "Uranus",
        "video": "https://www.youtube.com/embed/aDFGmiXnLjU"
    },
    {
        "planet": "Neptune",
        "video": "https://www.youtube.com/embed/v4wuV14QlNM"
    },
    {
        "planet": "Pluto",
        "video": "https://www.youtube.com/embed/N_v8G0fo4Ws"
    }
]'&amp;gt;
        &amp;lt;/zing-grid&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, your grid should look something like this when rendered – but don't worry, it's not a mistake:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8xk4xoc2wkyk9huohh4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8xk4xoc2wkyk9huohh4y.png" alt="Data grid rendering URL strings instead of video embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;To do this, add two &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags inside the &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; tag – one for each unique key in your JSON data. In our case, our sample dataset has two unique JSON keys, so we'll add two &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags inside the &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; tag. &lt;/p&gt;

&lt;p&gt;Within each set of &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags, we'll add &lt;code&gt;index=""&lt;/code&gt; and fill in each JSON key name in the order we'd like the columns to appear. In the &lt;code&gt;zg-column&lt;/code&gt; tag for &lt;code&gt;video&lt;/code&gt;, we'll add the &lt;code&gt;type=""&lt;/code&gt; attribute with a value of &lt;code&gt;iframe&lt;/code&gt; to specify that the column should render iframe content instead of strings of text. &lt;/p&gt;

&lt;p&gt;If you're using the sample data from this tutorial, your column tags should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zg-colgroup&amp;gt;
    &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
    &amp;lt;zg-column index="photo" type="iframe"&amp;gt;&amp;lt;/zg-column&amp;gt;
&amp;lt;/zg-colgroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to specify the column type for the &lt;code&gt;planet&lt;/code&gt; column because ZingGrid's default column type is set to &lt;code&gt;text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you're following along, your code should look like this (focus on the code below the inline data):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
 &amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
   &amp;lt;meta charset="utf-8"&amp;gt;
   &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
   &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
   &amp;lt;zing-grid
     data='[
      {
      "planet": "Mercury",
      "video": "https://www.youtube.com/embed/RkiiAloL6aE"
     },
     {
      "planet": "Venus",
      "video": "https://www.youtube.com/embed/EE6_PacCnRw"
     },
     {
      "planet": "Earth",
      "video": "https://www.youtube.com/embed/MbHQ6eWANIo"
     },
     {
      "planet": "Mars",
      "video": "https://www.youtube.com/embed/Jmk5frp6-3Q"
     },
     {
      "planet": "Jupiter",
      "video": "https://www.youtube.com/embed/Gu77Vtja30c"
     },
     {
      "planet": "Saturn",
      "video": "https://www.youtube.com/embed/MO5sB56rfzA"
     },
     {
      "planet": "Uranus",
      "video": "https://www.youtube.com/embed/aDFGmiXnLjU"
     },
     {
      "planet": "Neptune",
      "video": "https://www.youtube.com/embed/v4wuV14QlNM"
     },
     {
      "planet": "Pluto",
      "video": "https://www.youtube.com/embed/N_v8G0fo4Ws"
     }
    ]'&amp;gt;
    &amp;lt;zg-colgroup&amp;gt;
     &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
     &amp;lt;zg-column index="video" type="iframe"&amp;gt;&amp;lt;/zg-column&amp;gt;
    &amp;lt;/zg-colgroup&amp;gt;
   &amp;lt;/zing-grid&amp;gt;
  &amp;lt;/body&amp;gt;
 &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all you need to do to render videos in your ZingGrid data grid! The above code will yield the following result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuoj62sp43i1wcr33qf2k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuoj62sp43i1wcr33qf2k.gif" alt="Data grid rendering video embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And those are the basics of adding video embeds in your ZingGrid data tables &amp;amp; grids. &lt;a href="https://app.zingsoft.com/demos/create/FS3Q3016" rel="noopener noreferrer"&gt;View the live demo&lt;/a&gt; in our Studio playground to see how it works, and to play around with the final result.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How the ZingSoft Team Uses CloudApp to Streamline their Media Capture Workflow</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Tue, 06 Aug 2019 16:13:54 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-the-zingsoft-team-uses-cloudapp-to-streamline-their-media-capture-workflow-5aid</link>
      <guid>https://forem.com/zinggrid/how-the-zingsoft-team-uses-cloudapp-to-streamline-their-media-capture-workflow-5aid</guid>
      <description>&lt;p&gt;At ZingSoft, 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, &lt;a href="https://www.getcloudapp.com/"&gt;CloudApp&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r46N8sYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mpsc5mgx064m7kgw9e3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r46N8sYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mpsc5mgx064m7kgw9e3p.png" alt="Screenshot of CloudApp's annotation screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mLQ4FsFe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/64v7qpe07ra3tq3lsh4j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mLQ4FsFe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/64v7qpe07ra3tq3lsh4j.gif" alt="GIF showing some of CloudApp's export options"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At a higher level, CloudApp has made it easier for my team to visually communicate the value of our &lt;a href="https://www.zinggrid.com/"&gt;ZingGrid&lt;/a&gt; and &lt;a href="https://www.zingchart.com/"&gt;ZingChart &lt;/a&gt;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.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tools</category>
      <category>workflow</category>
      <category>communication</category>
    </item>
    <item>
      <title>How to Embed Images in a Data Grid in Under 60 Seconds</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Tue, 23 Jul 2019 17:58:47 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-to-embed-images-in-a-data-grid-in-under-60-seconds-hcf</link>
      <guid>https://forem.com/zinggrid/how-to-embed-images-in-a-data-grid-in-under-60-seconds-hcf</guid>
      <description>&lt;p&gt;Welcome to my “ZingGrid Functionality in Under 60 Seconds” blog series. These walkthroughs are meant to highlight how easy it is to add interactivity and functionality to &lt;a href="https://www.zinggrid.com/" rel="noopener noreferrer"&gt;ZingGrid data grids and tables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yHvgZE73K3s"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;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. Check out &lt;a href="https://dev.to/zinggrid/creating-your-first-data-grid-with-zinggrid-2288"&gt;this post&lt;/a&gt; if you'd like to learn more about creating your first data grid with ZingGrid.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure the images you want to embed are already hosted online, and that you have permission to use them.&lt;/li&gt;
&lt;li&gt;Update your JSON dataset to include the URLs to the images you'd like to embed.&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset="utf-8"&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
        &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embedding Images in Under a Minute
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ 
    {
        "planet": "Mercury",
        "moons": "0",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;amp;token=23f8d355-ca73-4334-980c-23f5ae91d087"
    },
    {
        "planet": "Venus",
        "moons": "0",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f"
    },
    {
        "planet": "Earth",
        "moons": "1",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;amp;token=33df1022-e000-4e95-9996-5b9101af627d"
    },
    {
        "planet": "Mars",
        "moons": "2",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794"
    },
    {
        "planet": "Jupiter",
        "moons": "67",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;amp;token=64c3cf9b-5541-475b-9711-17f046cff801"
    },
    {
        "planet": "Saturn",
        "moons": "62",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f"
    },
    {
        "planet": "Uranus",
        "moons": "27",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5"
    },
    {
        "planet": "Neptune",
        "moons": "13",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c"
    },
    {
        "planet": "Pluto",
        "moons": "4",
        "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd"
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what your code would look like if you were to add this data inline to your  grid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
        &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;zing-grid
        data='[ 
            {
            "planet": "Mercury",
            "moons": "0",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;amp;token=23f8d355-ca73-4334-980c-23f5ae91d087"
            },
            {
            "planet": "Venus",
            "moons": "0",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f"
            },
            {
            "planet": "Earth",
            "moons": "1",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;amp;token=33df1022-e000-4e95-9996-5b9101af627d"
            },
            {
            "planet": "Mars",
            "moons": "2",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794"
            },
            {
            "planet": "Jupiter",
            "moons": "67",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;amp;token=64c3cf9b-5541-475b-9711-17f046cff801"
            },
            {
            "planet": "Saturn",
            "moons": "62",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f"
            },
            {
            "planet": "Uranus",
            "moons": "27",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5"
            },
            {
            "planet": "Neptune",
            "moons": "13",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c"
            },
            {
            "planet": "Pluto",
            "moons": "4",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd"
            }
        ]'&amp;gt;
        &amp;lt;/zing-grid&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, your grid should look something like this when rendered – but don't worry, it's not a mistake:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcly3v3hwh5egtexf6qto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcly3v3hwh5egtexf6qto.png" alt="Data grid rendering URL strings instead of image embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;To do this, add three &lt;code&gt;zg-column&lt;/code&gt; tags inside &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; – one for each unique key in your JSON data. In our case, our sample dataset has three unique JSON keys, so we'll add three &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags inside the &lt;code&gt;&amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;&lt;/code&gt; tag. &lt;/p&gt;

&lt;p&gt;Within each set of &lt;code&gt;&amp;lt;zg-column&amp;gt;&amp;lt;/zg-column&amp;gt;&lt;/code&gt; tags, we'll add &lt;code&gt;index=""&lt;/code&gt; and fill in each JSON key name in the order we'd like the columns to appear. In the &lt;code&gt;zg-column&lt;/code&gt; tag for &lt;code&gt;photo&lt;/code&gt;, we'll add the &lt;code&gt;type=""&lt;/code&gt; attribute with a value of &lt;code&gt;image&lt;/code&gt; to specify that the column should render images instead of strings of text. &lt;/p&gt;

&lt;p&gt;If you're using the sample data from this tutorial, your column tags should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zg-colgroup&amp;gt;
    &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
    &amp;lt;zg-column index="moons"&amp;gt;&amp;lt;/zg-column&amp;gt;
    &amp;lt;zg-column index="photo" type="image"&amp;gt;&amp;lt;/zg-column&amp;gt;
&amp;lt;/zg-colgroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to specify the column type for the &lt;code&gt;planet&lt;/code&gt; and &lt;code&gt;moons&lt;/code&gt; columns because ZingGrid's default column type is &lt;code&gt;text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you're following along, your code should look like this (focus on the code below the inline data):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
        &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
        &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;zing-grid
        data='[ 
            {
            "planet": "Mercury",
            "moons": "0",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmercury-200px.jpg?alt=media&amp;amp;token=23f8d355-ca73-4334-980c-23f5ae91d087"
            },
            {
            "planet": "Venus",
            "moons": "0",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fvenus-200px.jpg?alt=media&amp;amp;token=1f6119d6-414d-4f1e-906d-514d7f5a295f"
            },
            {
            "planet": "Earth",
            "moons": "1",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fearth-200px.jpg?alt=media&amp;amp;token=33df1022-e000-4e95-9996-5b9101af627d"
            },
            {
            "planet": "Mars",
            "moons": "2",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fmars-200px.jpg?alt=media&amp;amp;token=ff1209b7-ef9d-496d-8a93-ef1cd8fad794"
            },
            {
            "planet": "Jupiter",
            "moons": "67",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fjupiter-200px.jpg?alt=media&amp;amp;token=64c3cf9b-5541-475b-9711-17f046cff801"
            },
            {
            "planet": "Saturn",
            "moons": "62",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fsaturn-200px.jpg?alt=media&amp;amp;token=e4af20df-8319-4644-8361-e3f5b9a75d9f"
            },
            {
            "planet": "Uranus",
            "moons": "27",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Furanus-200px.jpg?alt=media&amp;amp;token=a9e99164-7417-4a05-80eb-421c3867e9c5"
            },
            {
            "planet": "Neptune",
            "moons": "13",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fneptune-200px.jpg?alt=media&amp;amp;token=29d86d30-995c-45eb-ab96-1b99b7b1535c"
            },
            {
            "planet": "Pluto",
            "moons": "4",
            "photo": "https://firebasestorage.googleapis.com/v0/b/zinggrid-examples.appspot.com/o/planets-demo%2Fpluto-200px.jpg?alt=media&amp;amp;token=b7cbb041-df9b-48f8-b9ab-4f0f12df4efd"
            }
        ]'&amp;gt;
            &amp;lt;zg-colgroup&amp;gt;
                &amp;lt;zg-column index="planet"&amp;gt;&amp;lt;/zg-column&amp;gt;
                &amp;lt;zg-column index="moons"&amp;gt;&amp;lt;/zg-column&amp;gt;
                &amp;lt;zg-column index="photo" type="image"&amp;gt;&amp;lt;/zg-column&amp;gt;
            &amp;lt;/zg-colgroup&amp;gt;
        &amp;lt;/zing-grid&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's all you need to do to render images in your ZingGrid data grid! The above code will yield the following result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqj4mo2l8kddt8wefwwiv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqj4mo2l8kddt8wefwwiv.gif" alt="Data grid rendering image embeds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those are the basics of adding image embeds in your ZingGrid data tables &amp;amp; grids. &lt;a href="https://app.zingsoft.com/demos/create/P06UH5EQ" rel="noopener noreferrer"&gt;View the live demo&lt;/a&gt; in our Studio playground to see how it works, and so you can play around with the final result.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How the ZingSoft Team Uses StatusHero to Improve Intra-Team Communication</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Tue, 09 Jul 2019 18:40:25 +0000</pubDate>
      <link>https://forem.com/zinggrid/how-the-zingsoft-team-uses-statushero-to-improve-intra-team-communication-45if</link>
      <guid>https://forem.com/zinggrid/how-the-zingsoft-team-uses-statushero-to-improve-intra-team-communication-45if</guid>
      <description>&lt;p&gt;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. &lt;/p&gt;

&lt;p&gt;At ZingSoft, 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). &lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bUk8nLn2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fyqkv69pn0vg30ojyl5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bUk8nLn2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fyqkv69pn0vg30ojyl5k.png" alt="Screenshot of the StatusHero dashboard"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;This is why &lt;a href="https://statushero.com/"&gt;StatusHero&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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;amp; CEO is also a computer science professor and soon-to-be data visualization professor, the need for those solutions becomes imperative.&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did you meet yesterday's goals?&lt;/li&gt;
&lt;li&gt;What did you do yesterday?&lt;/li&gt;
&lt;li&gt;What are your goals for today?&lt;/li&gt;
&lt;li&gt;Are you blocked by anything?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I1dgHPWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nee2xvs228mcl1g930ze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I1dgHPWK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nee2xvs228mcl1g930ze.png" alt="Screenshot of a StatusHero check-in"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every 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. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kL6htgZd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/u74bzv2rlfirm3ykuo72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kL6htgZd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/u74bzv2rlfirm3ykuo72.png" alt="Screenshot of StatusHero Reports"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tools</category>
      <category>workflow</category>
      <category>communication</category>
    </item>
    <item>
      <title>What is User Testing, and Why is it Important?</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Wed, 03 Apr 2019 17:14:33 +0000</pubDate>
      <link>https://forem.com/sarahatzing/what-is-user-testing-and-why-is-it-important-4on2</link>
      <guid>https://forem.com/sarahatzing/what-is-user-testing-and-why-is-it-important-4on2</guid>
      <description>&lt;p&gt;User testing is a misleading term. It implies that what’s being tested is the user, when in reality what’s being tested is the product or service. This is important to remember in any discussion about user feedback gathering because that feedback is an indicator of your project’s perceived value and usefulness in the eyes of users – not just rationally, but also emotionally. &lt;/p&gt;

&lt;p&gt;Indicators like these can provide tangible ways for teams to develop empathy with both existing and potential users. In turn, teams can use those insights to iteratively improve upon their projects.&lt;/p&gt;

&lt;p&gt;The goal should be to interpret that gathered feedback to provide a better product or service that people &lt;em&gt;want&lt;/em&gt; to use, whether because it’s pleasurable, helpful, useful, needed, etc. User testing is a great way to collect that user feedback under controlled circumstances. This is especially true if you’ve already clarified your target audiences. If you haven’t, then user testing can be a starting point to help you begin to do so.&lt;/p&gt;

&lt;p&gt;Generally speaking, user testing involves designing scenarios to gather feedback from a relevant audience segment within a desired context. Put even more simply, it’s a way to listen to your users. Although user testing can be found across many different design contexts, I’m focusing on user testing for the web because I work on a digital product team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fintro-to-user-testing-quote-1.png%3Falt%3Dmedia%26token%3Dc502500a-3508-418e-b6b4-a6fd051fa212" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fintro-to-user-testing-quote-1.png%3Falt%3Dmedia%26token%3Dc502500a-3508-418e-b6b4-a6fd051fa212" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  General to Specific User Testing
&lt;/h2&gt;

&lt;p&gt;User tests can be used as exploratory starting points for uncovering friction and pain points that need to be prioritized, or they can be designed with specific use cases or problems in mind. This general/specific approach to user testing can be used in a spectrum (e.g. you start general and over time progress to specific user tests), or as needed (e.g. you start specific to answer pre-existing questions or to solve unambiguous problems).&lt;/p&gt;

&lt;p&gt;One factor that can affect the motivation behind user testing is the stage of development of the project in question. Newer projects might benefit from a more general user testing strategy, whereas more established projects might benefit from a more specific user testing strategy that focuses on feature releases, for example. A general-to-specific user testing progression can also make sense for teams that haven’t tried user testing before.&lt;/p&gt;

&lt;p&gt;In my case, when I first began exploring user testing I chose the former, more general approach for my product and team for two reasons: 1) It was my first experience with user testing, as well as my team’s, and 2) I wanted user feedback to help guide my team’s development initiatives along with my design and marketing initiatives. The second reason is especially important to me because our product is still new. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fuser-testing-spectrum.png%3Falt%3Dmedia%26token%3Da5ee3d8c-9576-4bac-8e47-b0ad0008caf9" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fuser-testing-spectrum.png%3Falt%3Dmedia%26token%3Da5ee3d8c-9576-4bac-8e47-b0ad0008caf9" alt="The user testing spectrum"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  User Feedback Formats
&lt;/h2&gt;

&lt;p&gt;Documented user feedback usually comes in some combination of video, audio, and/or text forms. To determine which feedback format suits your team, it helps to consider the following things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The tools you’re using to administer the test&lt;/li&gt;
&lt;li&gt;The location of the user taking the test (remote vs on-site)&lt;/li&gt;
&lt;li&gt;Your goals for the test &lt;/li&gt;
&lt;li&gt;Your available bandwidth for reviewing and evaluating the test feedback&lt;/li&gt;
&lt;li&gt;Who needs to access and review test feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different feedback formats provide different kinds of value to you as the tester, and it’s worth considering what format best meets your needs. This can be especially important if your user tests are administered remotely. Here are some points that illustrate why it’s important to consider feedback format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Written feedback&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Encourages more user reflection before answering, which means feedback is usually clearer and more cohesive&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Can be better for capturing small details&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Quickest way for testers to review feedback &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Con:&lt;/em&gt; Less representative of user’s emotional response in-the-moment&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Video feedback&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Screen recordings show you exactly what the user is experiencing on their machine, in their browser, etc.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Direct video can show body language and facial expressions&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Con:&lt;/em&gt; It can take a long time to review all test footage, even if sped up&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Audio feedback&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; It’s easier to capture initial user reactions with emotion intact&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Pro:&lt;/em&gt; Inflection, tone of voice, etc. can indicate user’s emotional response along with the content of their feedback&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Con:&lt;/em&gt; It can take a long time to review all test footage, even if sped up&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fuser-testing-feedback-formats.png%3Falt%3Dmedia%26token%3Df82ebae6-b507-4fd2-ba72-33d6647576be" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fuser-testing-feedback-formats.png%3Falt%3Dmedia%26token%3Df82ebae6-b507-4fd2-ba72-33d6647576be" alt="User testing feedback formats"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Determining Production Value
&lt;/h2&gt;

&lt;p&gt;User tests can be as formal or informal as you need them to be. I’ve designed and administered user tests on a paid platform on one hand, and using a shared Google doc and Quicktime recording on the other hand. Ultimately, the primary value that paid tools can provide lies in finding qualified people to take your test who fit your target demographic. There are plenty of secondary features like video transcription, annotation, and recording that can also make paid services worthwhile.&lt;/p&gt;

&lt;p&gt;The only paid service I’ve used to administer user testing so far is &lt;a href="https://usertesting.com" rel="noopener noreferrer"&gt;UserTesting&lt;/a&gt;, but I encourage you to explore UserTesting’s &lt;a href="https://alternativeto.net/software/usertesting-com/" rel="noopener noreferrer"&gt;AlternativeTo page&lt;/a&gt; to get a broader overview of similar user testing tools out there.&lt;/p&gt;

&lt;p&gt;If you'd like to see what an actual user test looks like, I've customized an informal user test in &lt;a href="https://docs.google.com/document/d/1E_G0Z78F99Okzl6q-Cl8rxB9yUy_Hvb7z7OPZ4FKyVA/edit?usp=sharing" rel="noopener noreferrer"&gt;a Google doc&lt;/a&gt;. You can use this template as a starting point for designing your own user tests, or you can just check it out to see what kinds of questions are asked in a basic user test.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.google.com/document/d/1E_G0Z78F99Okzl6q-Cl8rxB9yUy_Hvb7z7OPZ4FKyVA/edit?usp=sharing" rel="noopener noreferrer"&gt;Click to view user testing template&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/document/d/1E_G0Z78F99Okzl6q-Cl8rxB9yUy_Hvb7z7OPZ4FKyVA/edit?usp=sharing" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Fblogging%252Fuser-test-template-graphic.png%3Falt%3Dmedia%26token%3D0cb55e6c-7584-4a9c-a9f6-c2b3414811a1" alt="User test template screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ux</category>
      <category>feedback</category>
      <category>tutorial</category>
      <category>testing</category>
    </item>
    <item>
      <title>Creating a data grid with a remote endpoint using ZingGrid</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Wed, 13 Mar 2019 19:23:56 +0000</pubDate>
      <link>https://forem.com/zinggrid/creating-a-data-grid-with-a-remote-endpoint-using-zinggrid-lkj</link>
      <guid>https://forem.com/zinggrid/creating-a-data-grid-with-a-remote-endpoint-using-zinggrid-lkj</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/zinggrid/get-started-with-data-basics-in-zinggrid-726"&gt;In my last post&lt;/a&gt;, I covered data basics in the &lt;a href="http://zinggrid.com"&gt;ZingGrid&lt;/a&gt; JavaScript library for data grids and data tables. Today, I'll show you how to connect remote data sources to ZingGrid. Check out the &lt;a href="https://www.youtube.com/watch?v=wKAvQyog5Ac"&gt;video tutorial&lt;/a&gt; to see how it’s done, or follow along with me in this written tutorial.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wKAvQyog5Ac"&gt;
&lt;/iframe&gt;
&lt;br&gt;
The three main things you'll learn about in this post are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;[src]&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;Remote JSON data&lt;/li&gt;
&lt;li&gt;Dynamic endpoints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can use your own remote dataset to follow along, but we've also provided the following remote endpoint for you to use, too: &lt;a href="https://cdn.zinggrid.com/datasets/remote-data.json"&gt;https://cdn.zinggrid.com/datasets/remote-data.json&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The [src] Attribute
&lt;/h2&gt;

&lt;p&gt;ZingGrid provides the &lt;code&gt;src&lt;/code&gt; attribute to get data from a remote source and display it. You can use either a relative path or a remote URL. When you use the &lt;code&gt;src&lt;/code&gt; attribute, an AJAX request is made internally to fetch your data.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;src&lt;/code&gt; attribute can be implemented in two different ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using the top-level &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; tag&lt;/li&gt;
&lt;li&gt;Using the &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; tag&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Using the top-level &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; tag
&lt;/h4&gt;

&lt;p&gt;The simplest way to use the &lt;code&gt;src&lt;/code&gt; attribute is to add it to the top-level &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; tag like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zing-grid
  src="https://cdn.zinggrid.com/datasets/remote-data.json"&amp;gt;
&amp;lt;/zing-grid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Using the &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; tag
&lt;/h4&gt;

&lt;p&gt;The more robust way to use the &lt;code&gt;src&lt;/code&gt; attribute involves adding it to the &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; tag. This method allows you to nest &lt;code&gt;&amp;lt;zg-param&amp;gt;&lt;/code&gt; tags within &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; so you can adjust the actions of your &lt;code&gt;src&lt;/code&gt; endpoint. This is what the syntax for &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zing-grid&amp;gt;
  &amp;lt;zg-data src="https://cdn.zinggrid.com/datasets/remote-data.json"&amp;gt;&amp;lt;/zg-data&amp;gt;
&amp;lt;/zing-grid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here's a live example of a data grid using &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/ZPaxJE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
Learn more about the markup elements &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;zg-param&amp;gt;&lt;/code&gt; in &lt;a href="https://www.zinggrid.com/docs/component-basics"&gt;our docs&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Remote JSON
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;src&lt;/code&gt; attribute works for most simple and straightforward data structures. However, datasets aren't always that simple, and you might not always be connecting to an endpoint you control. Consider the following data structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "company": {
    "name": "Planet Express",
    "employees": [
      {
        "name": "Philip J. Fry",
        "actor": "Billy West",
        "job": "Delivery Boy",
        "origin": "Earth",
        "gender": "male",
        "species": "Human"
      } ...
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The default &lt;code&gt;src&lt;/code&gt; fetch will only try to access the top-level company property. What if instead you wanted to list data starting from the &lt;code&gt;company.employees&lt;/code&gt; level? In that case you would want to add the &lt;code&gt;recordPath&lt;/code&gt; attribute to &lt;code&gt;&amp;lt;zg-param&amp;gt;&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zing-grid&amp;gt;
  &amp;lt;zg-data src="https://cdn.zinggrid.com/datasets/remote-data-recordpath.json"&amp;gt;
    &amp;lt;zg-param name="recordPath" value="company.employees"&amp;gt;&amp;lt;/zg-param&amp;gt;
  &amp;lt;/zg-data&amp;gt;
&amp;lt;/zing-grid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here's a live example of &lt;code&gt;recordPath&lt;/code&gt; in action:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/xBPWXE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;To learn more about using &lt;code&gt;&amp;lt;zg-data&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;zg-param&amp;gt;&lt;/code&gt;, check out the &lt;a href="https://www.zinggrid.com/docs/api-elements#zg-param"&gt;list of available attributes&lt;/a&gt; in ZingGrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dynamic Endpoint
&lt;/h2&gt;

&lt;p&gt;So far I've shown you how to connect static endpoints to ZingGrid, but what if you want to connect to a dynamic endpoint with data that changes? All you need to do is poll that endpoint with an interval and update your grid via the &lt;code&gt;setData()&lt;/code&gt; API method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const zgRef = document.querySelector('zing-grid');
fetch('https://cdn.zinggrid.com/datasets/remote-data-recordpath.json')
  .then(res =&amp;gt; res.json())
  .then(data =&amp;gt; zgRef.setData(data))
  .catch(err =&amp;gt; console.error('--- Error In Fetch Occurred ---', err));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is what a demo with a dynamic endpoint looks like:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/QoOmOP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;And there you have it – that's the gist of connecting to remote data sources in ZingGrid. I hope you found this helpful – any feedback is appreciated! Look out for the next tutorial in this series if you're interested in learning how to customize columns in ZingGrid 🖖&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Get Started with Data Basics in ZingGrid</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Thu, 21 Feb 2019 17:19:34 +0000</pubDate>
      <link>https://forem.com/zinggrid/get-started-with-data-basics-in-zinggrid-726</link>
      <guid>https://forem.com/zinggrid/get-started-with-data-basics-in-zinggrid-726</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/zinggrid/creating-your-first-data-grid-with-zinggrid-2288"&gt;In my last post&lt;/a&gt;, I walked you through building your first data grid with &lt;a href="http://zinggrid.com" rel="noopener noreferrer"&gt;ZingGrid&lt;/a&gt;, a JavaScript library for data grids and data tables. Now, I'm going to summarize the essentials when it comes to adding data to your grid after page-load. Check out the video tutorial to see how it’s done, or follow along with me in this written tutorial.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/XSuNwIrpiHg"&gt;
&lt;/iframe&gt;
&lt;br&gt;
The two topics you'll learn about in this post are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data types that ZingGrid accepts&lt;/li&gt;
&lt;li&gt;Data assignment in ZingGrid&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Data types that ZingGrid accepts
&lt;/h2&gt;

&lt;p&gt;ZingGrid accepts five types of data structures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Array of Objects &lt;code&gt;[{}]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Array of Nested Objects &lt;code&gt;[{key: {}}]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Object of Objects &lt;code&gt;{key: {}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Object of Nested Objects &lt;code&gt;{key: {key: {}}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Array of Arrays &lt;code&gt;[[]]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note that when you nest objects in your data, ZingGrid will automatically create nested column headers for you by default. Here's an example of what I mean:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Femails%252Fgetting-started-1%252Fnested-object-example.png%3Falt%3Dmedia%26token%3Df9cc7b8e-2f67-4d42-b493-40d245d31268" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fzinggrid-marketing.appspot.com%2Fo%2Femails%252Fgetting-started-1%252Fnested-object-example.png%3Falt%3Dmedia%26token%3Df9cc7b8e-2f67-4d42-b493-40d245d31268" alt="Example of default nested column headers"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Array of Objects
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://app.zingsoft.com/demos/create/XEET90Q0" rel="noopener noreferrer"&gt;View a live example using this data structure.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "name": "Philip J. Fry",
    "origin": "Earth"
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Array of Nested Objects
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://app.zingsoft.com/demos/create/WA1E4DR2" rel="noopener noreferrer"&gt;View a live example using this data structure.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "employee": {
      "name": "Philip J. Fry",
      "origin": "Earth"
    }
  }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Object of Objects
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://app.zingsoft.com/demos/create/IXQ33BN1" rel="noopener noreferrer"&gt;View a live example using this data structure.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "1": {
    "name": "Philip J. Fry",
    "origin": "Earth"
  },
  "2": {
    "name": "Turanga Leela",
    "origin": "Earth"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Object of Nested Objects
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://app.zingsoft.com/demos/create/BDKM7REB" rel="noopener noreferrer"&gt;View a live example using this data structure.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "1": {
    "employee": {
      "name": "Philip J. Fry",
      "origin": "Earth"
      }
  },
  "2": {
    "employee": {
      "name": "Turanga Leela",
      "origin": "Earth"
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Array of Arrays
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://app.zingsoft.com/demos/create/U8MWMWX6" rel="noopener noreferrer"&gt;View a live example using this data structure.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  ["Philip J. Fry","Earth"],
  ["Turanga Leela","Earth"] ...
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Data Assignment in ZingGrid
&lt;/h2&gt;

&lt;p&gt;ZingGrid provides the &lt;code&gt;data&lt;/code&gt; attribute as the most primitive method of assigning data to the grid. This data must have a valid JSON structure. This is per HTML spec when passing objects and arrays to HTML attributes. There are three supported ways to set ZingGrid's data attribute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTML inline data&lt;/li&gt;
&lt;li&gt;ZingGrid API&lt;/li&gt;
&lt;li&gt;HTML attribute manipulation&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  HTML Inline Data (Stringified)
&lt;/h4&gt;

&lt;p&gt;Assigning inline data in markup is the most basic way of assigning data in ZingGrid. This is the method we've used in all of our examples so far in this series.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;zing-grid data='[{"name": "Philip J. Fry"}]'&amp;gt;&amp;lt;/zing-grid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ZingGrid API
&lt;/h4&gt;

&lt;p&gt;To assign JavaScript Object data, use the ZingGrid API method &lt;code&gt;setData()&lt;/code&gt;. This is the &lt;em&gt;most efficient&lt;/em&gt; way to assign data in ZingGrid. This is because this assignment involves property assignment as opposed to attribute manipulation. This means data is being directly assigned to the internal ZingGrid component data property. &lt;a href="https://www.zinggrid.com/docs/api-methods#zg-data" rel="noopener noreferrer"&gt;Check out the API docs&lt;/a&gt; to see all of the data methods, or view the live example below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const zgRef = document.querySelector('zing-grid');
const data = [{...}];
// target grid and assign data directly
zgRef.setData(data);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/gqyqYg?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  Attribute Manipulation
&lt;/h4&gt;

&lt;p&gt;Assigning data through JavaScript as an object is the most practical use of assigning data, and it can be achieved via direct attribute manipulation. This will assign a string to the HTML attribute so the data string will appear in the markup, but this isn't a good idea for large datasets. View the live example belown.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const zgRef = document.querySelector('zing-grid');
const data = [{...}];
// target attribute directly and stringify your data structure
zgRef.setAttribute('data', JSON.stringify(data));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/mvgaNr?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Ok, those are the basics about data in ZingGrid. Please let me know if you have any questions, and keep an eye out for the next tutorial in this series if you'd like to learn about connecting remote JSON files and endpoints to ZingGrid. 🔌👀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Creating Your First Data Grid with ZingGrid</title>
      <dc:creator>Hibs</dc:creator>
      <pubDate>Fri, 15 Feb 2019 21:06:45 +0000</pubDate>
      <link>https://forem.com/zinggrid/creating-your-first-data-grid-with-zinggrid-2288</link>
      <guid>https://forem.com/zinggrid/creating-your-first-data-grid-with-zinggrid-2288</guid>
      <description>&lt;p&gt;In this post, I'm going to show you how easy and quick it is to create a data grid or data table in less than five minutes using ZingGrid. Watch the video tutorial to see these steps in action, or follow along with this blog post to learn about the syntax you’ll need to get started with ZingGrid.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/I2zzfv2tLRk"&gt;
&lt;/iframe&gt;
&lt;br&gt;
The three main things you'll learn how to do in this tutorial are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Importing the ZingGrid library&lt;/li&gt;
&lt;li&gt;Referencing the ZingGrid library&lt;/li&gt;
&lt;li&gt;Rendering the grid&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Importing the ZingGrid Library
&lt;/h2&gt;

&lt;p&gt;To import the library you need to download it as a resource first, which you can do one of three ways – via the CDN link, via a package manager, or via direct download.&lt;/p&gt;
&lt;h4&gt;
  
  
  CDN Link
&lt;/h4&gt;

&lt;p&gt;The CDN link is the quickest set-up option you can use to import the ZingGrid library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Package Manager
&lt;/h4&gt;

&lt;p&gt;If you'd rather use a package manager, you can run &lt;code&gt;npm install zinggrid&lt;/code&gt; to install the library via npm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script type="module"&amp;gt;
  import ZingGrid from 'ZingGrid';
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Direct Download
&lt;/h4&gt;

&lt;p&gt;Your third option is to download the ZingGrid library from our &lt;a href="https://www.zinggrid.com/download"&gt;website&lt;/a&gt; or from our public &lt;a href="https://github.com/ZingGrid/zinggrid"&gt;GitHub repository&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script type="module"&amp;gt;
  import ZingGrid from './index.js';
&amp;lt;/script&amp;gt;
&amp;lt;!-- fallback for no module support --&amp;gt;
&amp;lt;script nomodule src="./dist/zinggrid.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h2&gt;
  
  
  Referencing the ZingGrid library
&lt;/h2&gt;

&lt;p&gt;To use the library, you'll need to reference the script into your environment. In this example, we're using the CDN link, so we'll just add it to the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag and add the &lt;code&gt;defer&lt;/code&gt; attribute to prevent a render blocking script during page parse.&lt;/p&gt;

&lt;p&gt;We're deferring the script because the library doesn't need to be loaded before the component is parsed. Once the script is registered, all instances of &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; on the page will automatically be instantiated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;!--Script Reference--&amp;gt;
  &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;!--Grid Component--&amp;gt;
  &amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A slightly different approach you can use is to put the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag at the bottom of your document, which is effectively the same as the &lt;code&gt;defer&lt;/code&gt; process above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;!--Grid Component--&amp;gt;
  &amp;lt;zing-grid&amp;gt;&amp;lt;/zing-grid&amp;gt;
  &amp;lt;!--Script Reference--&amp;gt;
  &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h2&gt;
  
  
  Rendering the Grid
&lt;/h2&gt;

&lt;p&gt;Making your first grid is as simple as creating a &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; tag and adding a &lt;code&gt;data&lt;/code&gt; attribute. The &lt;code&gt;data&lt;/code&gt; attribute expects grid data in valid JSON format, so that's how we'll be adding our sample data to this grid.&lt;/p&gt;

&lt;p&gt;In this example, we're also using the &lt;code&gt;caption&lt;/code&gt; attribute to add a title to our data grid.&lt;/p&gt;

&lt;p&gt;Here's what your markup should look like once you've added your JSON data to the &lt;code&gt;data&lt;/code&gt; attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;!--Script Reference[1]--&amp;gt;
  &amp;lt;script src="https://cdn.zinggrid.com/zinggrid.min.js" defer&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;!--Grid Component Placement[2]--&amp;gt;
  &amp;lt;zing-grid
    caption="Hello Futurama"
    data='[{
        "name": "Philip J. Fry",
        "origin": "Earth"
      },
      {
        "name": "Turanga Leela",
        "origin": "Earth"
      },
      {
        "name": "Bender Bending Rodriguez",
        "origin": "Earth"
      },
      {
        "name": "Amy Wong",
        "origin": "Mars"
      },
      {
        "name": "Doctor John Zoidberg",
        "origin": "Decapod 10"
      },
      {
        "name": "Lord Nibbler",
        "origin": "Earth"
      }
    ]'&amp;gt;
  &amp;lt;/zing-grid&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here's a live demo of this grid in action:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/zinggrid/embed/vbQNXN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;br&gt;
All of ZingGrid's main library features are typically attributes added to the top-level &lt;code&gt;&amp;lt;zing-grid&amp;gt;&lt;/code&gt; tag. You can find the full list of available attributes and features in our &lt;a href="https://www.zinggrid.com/docs/api-elements#zing-grid"&gt;API references docs&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;And that's all you need to do to build your first grid using the ZingGrid library – thanks for your interest! Stay tuned for the next tutorial in this series, where I'll walk you through data basics in ZingGrid 🖖&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
