Skip to content

Zenoo/FormulaJS

Repository files navigation

FormulaJS

last commit MIT License Size NPM Package Maintenance

Generate formulas on the fly

Demo

Doc

  • Installation

Simply import formula.min.js & formula.min.css into your HTML by downloading it or using a CDN.

<link rel="stylesheet" href="https://unpkg.com/@zenoo/formula-js@0.6.2/formula.min.css">
<script src="https://unpkg.com/@zenoo/formula-js@0.6.2/formula.min.js"></script>
  • Demo

A demo is available on this JSFiddle

  • Usage

Initialize your Formula by specifying a wrapper and some additional options:

const formula = new Formula("#wrapper");
// OR
const formula = new Formula(wrapperElement);
// OR
const formula = new Formula(wrapperElement, options);

You can change the cursor position by clicking on an existing tag or pressing the left/right arrow keys.

  • Options

The available options and their default values are:

{
  separators: [' ', 'Enter'], // Characters that will process the inputted String into a new tag
  closers: '+-*/()%^',        // A chain of characters that will always trigger a new separate tag
  lang: {                     // Dictionary holder (The attribute 'field' is the only one needed right now)
    field: 'Custom Field'
  },
  customFields: undefined,    // Custom Fields to display, see below
  onFieldExpand: function(field){ ... } // Callback REQUIRED if you use the 'children: true' Field property. Expects a Field-like object to be returned
  onUpdate: function(value){ ... } // Callback triggered whenever the Formula gets updated. It's first parameter is the String representation of the Formula
}
  • Custom Fields

If you want to allow the user to pick from some predefined properties, you can use the customFields attribute:

// Basic usage
const customFields = {
  firstField: {
    name: "Pretty name",
  },
  whatever: {
    name: "Prettier name",
  },
};

// Tree-like usage (you can deep-nest)
const customFields = {
  firstField: {
    name: "Pretty name",
    children: {
      nestedField: {
        name: "Hey ya",
      },
    },
  },
  whatever: {
    name: "Prettier name",
  },
};

// Dynamic tree-like usage
const customFields = {
  firstField: {
    name: "Pretty name",
    children: true, // When using a Boolean as the children value, you have to use the 'onFieldExpand' callback, see below
    customData: {
      // This optional object will be returned as the second argument of the 'onFieldExpand' callback
      whateverIWant: ":D",
    },
  },
  whatever: {
    name: "Prettier name",
  },
};
  • Dynamic fields

Using children: true as a Field property forces you to specify the onFieldExpand callback. It will be called every time a new subtree is opened by the user.

  • The first parameter of this callback returns the field Node the user opened:
<li class="formula-js-field" data-field="test" data-name="Hey">Hey<span class="children"></span></li>

The data-field and data-name attribute will allow you to build the subtree accordingly.

  • The second parameter of this callback returns whatever you passed inside the customData attribute of your Field

The onFieldExpand callback expects a Promise that resolves with a Field-like object to be returned, which will be used to build the subtree.

// Example
onFieldExpand: (field) => {
  const path = field.getAttribute("data-field"),
    children = grabChildren(path);

  return Promise.resolve(
    children.map((child) => ({
      name: prettyName(child),
      children: hasChildren(child),
    }))
  );
};
  • Methods

The full documentation is available on https://zenoo.github.io/FormulaJS/.

  • .get()
  • .set(formulaString)
  • .add(formulaString)
  • .addField(fieldPath)
  • .clear()
  • .destroy()

Authors

About

Generate formulas on the fly

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

 
 
 

Contributors 4

  •  
  •  
  •  
  •