npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

angular-json-tree

v1.1.0

Published

Angular directive for displaying a JSON object in an expandable tree structure

Downloads

1,536

Readme

Angular JSON Tree

This plugin was created to address a common development issue: how to easily visualize JSON/JS Object trees. From a development standpoint, when querying API endpoints and wishing to easily visualize the response object—or from a design standpoint, when looking for an easy way to display a complex object—this plugin provides an easy to use directive for displaying the Object tree response.

This is nice and easy because all you should have to do is include the directive in your app, and then pass a reference to the directive of which object on the scope you want it to display.

A live implementation of this directive can be found at https://awendland.github.io/angular-json-tree/ and the source for that project can be found on the gh-pages branch.

Requirements: AngularJS 1.2+

File Size: v1.1.0

  • JS: 9.15kB raw, 2.56kB minified, 1.04kB gzipped
  • JS + CSS: 10.28kB raw, 3.69kB minified, 1.53kB gzipped

Usage:

  1. Include angular-json-tree as a dependency for your app
angular.module('myApp', ['angular-json-tree'])
  1. Include the supplied CSS file (or create your own).
  2. Setup the directive and reference an object on your scope

JavaScript:

$scope.someobj = {
    greetings: ["hi", "hello", "welcome"],
    parent: {
        child: "name",
        age: 42
    }
};

HTML:

<json-tree object="someobj"></json-tree>

via bower:

$ bower install angular-json-tree

Why I created this:

I was searching for a way to easily display the JSON results from an API endpoint. The objects were dynamic and followed no uniform pattern. Thus I created this AngularJS directive. Given the above input (from Usage), it would produce an expandable object similar to:

Example Output

This directive helps me with another problem while developing: visualizing JSON objects. Being able to break down JSON objects piece by piece has proven invaluably useful. To simplify that process, I threw together this website: http://blog.alexwendland.com/angular-json-tree/.

Directive Configuration:

These attributes are available for configuration on the directive:

object [required]

The object property takes the name of an object on the $scope. This object will be displayed as an expandable tree.

<json-tree object="someobj"></json-tree>

start-expanded [optional, default=false]

This is an optional attribute that designates if the tree's root should display as expanded initially. This is useful when you are only showing one json-tree, but would probably be set to false if json-trees were being created with an ng-repeat loop.

<json-tree object="someobj" start-expanded="true"></json-tree>

Besides true or false, you can also set it to 'recursive' to cause the entire tree to be expanded initially (instead of just the top level if true was used).

root-name [optional, default='Object']

This is an optional attribute that sets the title displayed at the root node. This is useful when you are showing sub-portions of an object or want the object root node to have a different string than 'Object'.

<json-tree object="someobj" root-name="'Name'"></json-tree>

Styling

The default CSS is separated into two parts: structure and looks. The looks section can be easily modified in order to change font, color and toggle buttons. The structure section can also be modified, but some more care will be needed because it provides the framework from which this directive provides functionality. The looks framework will be covered here while the structure framework will only be touched on.

The json-tree is based on recursive nodes of two basic structures. The first structure is for nodes that have no subnodes themselves (a leaf), and the other is for nodes that have children (a branch). Here the simplified template structures for each, with appropriate, style-able, class names.

Leaf Nodes

<json-node class="not-expandable">
    <span class="key">{{key}}</span>
    <span class="leaf-value">{{value}}</span>
</json-node>

In the default CSS, all .key elements have the same style, a bold red color. There is some padding, and then the property's value follows. By default, no special styling is applied to .leaf-value elements.

Branch Nodes

Branch nodes have two states: expanded or not-expanded. The not-expanded state is very similar to the leaf nodes and simply exchanges the .leaf-value class for .branch-preview.

<json-node class="not-expandable">
    <span class="key">{{key}}</span>
    <span class="branch-preview">{{value}}</span>
</json-node>

In the default CSS, .branch-preview elements are italicized, concatenated, hidden overflow, and reduced in opacity.

The expanded state is different and contains further subnodes that are generated with ng-repeat:

<json-node class="expandable">
    <span class="key">{{key}}</span>
    <ul class="branch-value">
        <li ng-repeat>
            <json-node>{{subnode values}}</json-node>
        </li>
    </ul>
</json-node>

The .expandable class adds several features to the normal json-node element. Particularly, by the default looks CSS, a carrot-style toggle pseudo-element will be created. This ::before element will rotate 90 deg downward when the element is expanded.

Furthermore, if an .expandable element does not have any children, then .empty will be added to the class list as well. This can be used to remove any expansion UI from nodes representing empty objects/arrays.

Additionally, json-node elements receive a class corresponding to their object type. For example, the .array class or .object may be placed on a json-node. These classes can be used for special stylings.

Further Explanation:

An example implementation of this project can be found at the gh-pages branch of this repository.

Changelog

v1.1.0

  • Set angular as a peer dependency instead of as a normal dependency (allowing for better user control of the angular version) (Issue #52)
  • Add start-expanded="'recursive'" to cause the entire tree to be expanded initially (instead of just the top-level, which setting the value to true previously allowed) (Issue #56)
  • Add track by to remove $$hashKey attributes (Issue #59, PR #60)
  • Add .empty to the class list of nodes that are expandable but have no children (Issue #63)

v1.0.1

  • Remove css files from the main entry in package.json.

v1.0.0

  • Update npm dev dependencies to latest (as of 2016-05-24) and remove unnecessary ones
  • Update angular dependency to accept all 1.x versions
  • Set main in bower.json and package.json properly so that this package can easily be included in bower and npm managed projects (Issue #7, PR #1)
  • Allow setting the name of the root node (Issue #5)
    • This can be done setting the root-name attribute on the directive. An evaluatable expression must be provided, such as root-name="'My name'".

v0.0.1

  • Initial release

Credits:

Thank you to Mark Lagendijk from StackOverflow for providing a service than assists in recursive directives. That post can be found here.

Also, thank you to chieffancypants for his angular-loading-bar project from which I used the README.md as inspiration for this (poor) one.

License:

Licensed under the Creative Commons Attribution 4.0 International (CC-BY-4.0)