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

jeditor

v2.0.0

Published

A simple admin interface that allows a user to build a data object that conforms to a schema defined with Javascript.

Downloads

11

Readme

Jeditor

Warning: Jeditor is experimental! It will undergo major changes in subsequent updates and is seriously, seriously untested. Check out the "Alernatives" section below if you need something more stable.

Jeditor is a simple admin interface that allows a user to build an object that conforms to a specified schema, all without a database. It's an HTML/JS/CSS Browserify-bundled component that can be inserted into any HTML page via client-side Javascript. You pass to a Javascript function a jQery selection and a configuration object that includes a schema, and it prints an admin interface to the selected element that will allow your user to create an object based on that schema.

Jeditor comes with a variety of controllers for different data types, including text, arrays, and files, and you can easily build your own.

Jeditor was built primarily to allow non-technical users to create complex, multi-level data objects without requiring a database or framework.

Some highlights:

  • Associations: Model definitions can include other models. For example, a "quiz" model can include an array that contains instances of another model, a "question."
  • Model properties and arrays can accept multiple types. For example, the "quiz" model's question array could accept "multiple choice question" instances or "hangman" instances.
  • Includes a simple drag-and-drop file upload controller. The controller is agnostic about what you do on the server-side; you simply tell the controller where to POST the file and how to determine the instance value from the response object of that request.

Class: Jeditor

Constructor

  • $container: A jQuery selection of the container that Jeditor will print to.
  • schema: An object representing the schema configuration. See "schema" below.

Methods

  • .export() returns a Javascript object representing the object instance.
  • .import(data) fills the currently edited object with data. This completely overwrites all existing data.

Usage

index.html:

<div id="your_container"></div>
<div class=".btn_export"></div>

main.bundle.js:

var Jeditor = require('jeditor');
var jeditor = new Jeditor($('#your_container'), YOUR_SCHEMA);

// Example export button
$('.btn_export').click(function(){
  window.prompt('Your object', JSON.stringify(jeditor.export()));
});

Schema

The schema is a simple Javascript object. The first level of the schema includes your models, which are keyed with an initial $ sign. One must be called $main, and it represents the primary or root model.

Each model definition comprises properties with keys that start with the @ symbol

A property object includes these parameters, which describe the property's type and the UI component with which the user defines its value, i.e. the controller.

  • type: Required. String or array. The type can either be the name of another model (using the $ symbol) or the name of a controller (see below). If array, the user can choose the type of object to set to this field.
  • desc: Optional. String. This string appears as small text inside the field's node in the DOM. Useful for annotating each field.
  • required: Optional. Boolean. Defaults to false. Determines whether the field is required. The project will not validate unless all required fields have values. (TK)
  • hide: Optional. Boolean. Defaults to false. If set to true, the field is hidden initially and can be added by clicking a link near the top of the object.

Each property contains additional parameters that affect its controller. See below.

Immutable properties

If you would like to predefine object properties that the user cannot change but will still appear in the export, you want to use immutable properties. Immutable properties can be set by leaving the @ symbol out. You may not include two keys that only differ with the @ symbol, e.g. @content and content cannot exist in the same model. That's because the @ symbol is dropped on export. Immutable properties do not appear in the UI.

Example Schema

{
  $quiz:{
    "@title": {
      type: 'string'
    }
    "@questions": {
      type: 'array',
      contains: ['$question']
    }
  },
  $question:{
    "@text": {
      type: 'richtext'
    },
    "@choices": {
      type: 'array',
      contains: '$choice'
    }
  },
  $choice: {
    "@text": {
      type: 'richtext'
    }
    "@validity": {
      type: 'boolean'
    }
  }

}

Example Export

{
  title: "My Quiz",
  questions: [
    {
      text: "What' the meaning of life?",
      choices: [
        {
          text: "42",
          validity: false
        },
        {
          text: "43",
          validity: true
        }
      ]
    }
  ]
}

Controllers

Controllers are the components by which the reader specifies the value of a field.

string

Straightforward enough! TK: char limit.

file

Uploads a file and shows a preview of it.

  • accepts: Array. Optional. An array of extensions that the controller allows. E.g. ['png','gif','jpg','jpeg'];
  • postTo: String. Required. The URL to which the controller will send a POST request that includes the data object as the body.
  • post_data: Object. Optional. Data to be sent along with the file in the POST request. Your server may use this data to, for example, resize an image.
  • setValue: Function. Required. A function returning the value that you would like this object to be set to after the file upload. The first argument is the response of the POST request.
  • getPreviewUrl: Function. Optional. A function returning the URL that you would like the controller to use to show the preview of the file (for images). The first argument is the value of the object. If this is not set, the controller will assume the value itself is the preview URL.

richtext

Similar to string, but allows the user to bold, italicize, underline, and link text. To use the RichText controller, you must embed medium-editor on your page.

integer

Similar to a string, but the data is stored as an integer.

array

In the code, array is referred to as intArray.

  • contains: String or array. If a string, the object (e.g. $description) or controller type (e.g. string) that this array contains. If an array, an array of strings identifying the types of objects that the array can contain, allowing the user to select which to add.

Creating your own controller

Constructor arguments:

  • $target is the jQuery selection of the DOM element representing the controller's field.
  • conf is the property definition of the controller. It includes all controller-specific properties.
  • template is the entire schema.

Required methods:

  • .setValue(val) must set the the value when Jeditor's import function is run. The controller must reflect this new value.
  • .getValue() must return the value that will be stored in the object when Jeditor's export function is run.

Alternatives