1.7.1 • Published 7 years ago

kt-schema-creator v1.7.1

Weekly downloads
4
License
See LICENSE.md
Repository
github
Last release
7 years ago

React Editable Json Tree

Build StatusBuild Statusnpm

Demo

Demo is available here : Demo

Features

  • Json Viewer
  • Collapse node possibility via function
  • Add new node value
  • Remove node value
  • Update node value
  • Implicit convert of new value ({} for object, [] for array, true for boolean, ...)
  • Style via function
  • Read only possibility
  • Call for global update and delta update
  • Possibility to give buttons, inputs, ... in parameters
  • Possibility to authorize remove action

How to use

Install

npm install --save react-editable-json-tree

Example Usage

// Import
import { JsonTree, ADD_DELTA_TYPE, REMOVE_DELTA_TYPE, UPDATE_DELTA_TYPE } from 'react-editable-json-tree'

// Data
const data = {
    error: new Error('error'),
    text: 'text',
    int: 100,
    boolean: true,
    null: null,
    object: {
        text: 'text',
        int: 100,
        boolean: true,
    },
    array: [
        1,
        {
            string: 'test',
        },
    ],
}

// Component
<JsonTree data={data} />

There is a screenshot of the result :

Screenshot

Props

data

KeyDescriptionTypeRequiredDefault
dataData to be displayed/editedObject/ArrayTrueNone

rootName

KeyDescriptionTypeRequiredDefault
rootNameRoot name for first objectStringFalseroot

isCollapsed

KeyDescriptionTypeRequiredDefault
isCollapsedIs node collapsed ? (For Array/Object/Error)FunctionFalse(keyPath, deep) => (deep !== 0)

Function parameters :

KeyDescriptionTypeExample
keyPathKey path of current nodeArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
datadata of current node/valueAny{ string: 'test' } for data: { object: { string: 'test' } }

onFullyUpdate

KeyDescriptionTypeRequiredDefault
onFullyUpdateFunction called each time an update is done and give the updated dataFunctionFalse() => {}

Function parameters :

KeyDescriptionType
dataUpdated dataObject/Array (Same as entry)

onDeltaUpdate

KeyDescriptionTypeRequiredDefault
onDeltaUpdateFunction called each time an update is done and give delta updateFunctionFalse() => {}

Function parameters :

KeyDescriptionType
dataDelta dataObject

Delta data structure :

KeyDescriptionTypeExample
typeDelta typeString'ADD_DELTA_TYPE' or 'REMOVE_DELTA_TYPE' or 'UPDATE_DELTA_TYPE'
keyPathkey pathArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
keyModified/Created/Removed keyStringNone
newValueNew ValueAnyNone
oldValueOld ValueAnyNone

readOnly

KeyDescriptionTypeRequiredDefault
readOnlyRead only boolean for all object when a boolean is provided, read only for specific keys when function is providedBooleanFunctionFalse(keyName, data, keyPath, deep, dataType) => false

This function must return a boolean.

Function parameters :

KeyDescriptionTypeExample
keyNameKey name of current node/valueString'object' for data: { object: { string: 'test' } }
datadata of current node/valueAny{ string: 'test' } for data: { object: { string: 'test' } }
keyPathkey pathArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
dataTypedata type of current node/valueString'Object', 'Array', 'Null', 'Undefined', 'Error', 'Number', ...

getStyle

KeyDescriptionTypeRequiredDefault
getStyleGet style (CSS keys)FunctionFalse(keyName, data, keyPath, deep, dataType) => {...}

Function parameters :

KeyDescriptionTypeExample
keyNameKey name of current node/valueString'object' for data: { object: { string: 'test' } }
datadata of current node/valueAny{ string: 'test' } for data: { object: { string: 'test' } }
keyPathkey pathArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
dataTypedata type of current node/valueString'Object', 'Array', 'Null', 'Undefined', 'Error', 'Number', ...

An example of return :

{
    minus: {
        color: 'red',
    },
    plus: {
        color: 'green',
    },
    collapsed: {
        color: 'grey',
    },
    delimiter: {},
    ul: {
        padding: '0px',
        margin: '0 0 0 25px',
        listStyle: 'none',
    },
    name: {
        color: '#2287CD',
    },
    addForm: {},
}

You can see the actual used in src/utils/styles.js.

addButtonElement

KeyDescriptionTypeRequiredDefault
addButtonElementAdd button Element to replace library oneElementFalse<button>+</button>

The library will add a onClick props on element.

cancelButtonElement

KeyDescriptionTypeRequiredDefault
cancelButtonElementCancel button Element to replace library oneElementFalse<button>c</button>

The library will add a onClick props on element.

editButtonElement

KeyDescriptionTypeRequiredDefault
editButtonElementEdit button Element to replace library oneElementFalse<button>e</button>

The library will add a onClick props on element.

inputElement

KeyDescriptionTypeRequiredDefault
inputElementInput Text Element to replace library oneElementFalse<input />

The library will add a placeholder, ref, defaultValue props on element. This item will be focus when possible.

textareaElement

KeyDescriptionTypeRequiredDefault
textareaElementTextarea Element to replace library oneElementFalse<textarea />

The library will add a ref, defaultValue props on element. This item will be focus when possible.

minusMenuElement

KeyDescriptionTypeRequiredDefault
minusMenuElementMinus Menu Element to replace library oneElementFalse<span> - </span>

The library will add a onClick, className and style props on element.

plusMenuElement

KeyDescriptionTypeRequiredDefault
plusMenuElementPlus Menu Element to replace library oneElementFalse<span> + </span>

The library will add a onClick, className and style props on element.

beforeRemoveAction

KeyDescriptionTypeRequiredDefault
beforeRemoveActionFunction called before each remove action (with minus menu)FunctionFalse(key, keyPath, deep, oldValue) => new Promise(resolve => resolve())

This function must return a Promise. In case of resolve of this one, the remove will be done. Otherwise, in reject, nothing will be done.

Function parameters :

KeyDescriptionTypeExample
keyKey of current node/valueString'object' for data: { object: { string: 'test' } }
keyPathkey pathArray[] for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
oldValueOld value of the keyAny{ string: 'test' } for data: { object: { string: 'test' } } on 'object' node

beforeAddAction

KeyDescriptionTypeRequiredDefault
beforeAddActionFunction called before each add action (with plus menu)FunctionFalse(key, keyPath, deep, newValue) => new Promise(resolve => resolve())

This function must return a Promise. In case of resolve of this one, the remove will be done. Otherwise, in reject, nothing will be done.

Function parameters :

KeyDescriptionTypeExample
keyKey of current node/valueString'string' for data: { object: { string: 'test' } }
keyPathkey pathArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
newValueNew value of the keyAny'test' for data: { object: { string: 'test' } } on 'string' node

beforeUpdateAction

KeyDescriptionTypeRequiredDefault
beforeUpdateActionFunction called before each update actionFunctionFalse(key, keyPath, deep, oldValue, newValue) => new Promise(resolve => resolve())

This function must return a Promise. In case of resolve of this one, the remove will be done. Otherwise, in reject, nothing will be done.

Function parameters :

KeyDescriptionTypeExample
keyKey of current node/valueString'string' for data: { object: { string: 'test' } }
keyPathkey pathArray'object' for data: { object: { string: 'test' } }
deepDeep of current nodeNumber1 for data: { object: { string: 'test' } } on 'object' node
oldValueOld value of the keyAny'test' for data: { object: { string: 'test' } } on 'string' node
newValueNew value of the keyAny'update' for data: { object: { string: 'update' } } on 'string' node

Design

The library provide CSS class on elements. All are prefixed by "rejt" to avoid conflict. To avoid being linked with a CSS file, the library will use the inline style.

Here is the list of classes by element and by deep and with basic element (on which it's applied).

JsonTree

  • rejt-tree (div)

JsonObject

Collapsed

  • rejt-object-node (div)
    • rejt-name (span)
    • rejt-collapsed (span)
      • rejt-collapsed-text (span)
      • rejt-minus-menu (span)

Not Collapsed

  • rejt-object-node (div)
    • rejt-name (span)
    • rejt-not-collapsed (span)
      • rejt-not-collapsed-delimiter (span)
      • rejt-not-collapsed-list (ul)
      • rejt-not-collapsed-delimiter (span)
      • rejt-add-form (span)
      • rejt-plus-menu (span)
      • rejt-minus-menu (span)

JsonArray

Collapsed

  • rejt-array-node (div)
    • rejt-name (span)
    • rejt-collapsed (span)
      • rejt-collapsed-text (span)
      • rejt-minus-menu (span)

Not Collapsed

  • rejt-array-node (div)
    • rejt-name (span)
    • rejt-not-collapsed (span)
      • rejt-not-collapsed-delimiter (span)
      • rejt-not-collapsed-list (ul)
      • rejt-not-collapsed-delimiter (span)
      • rejt-add-form (span)
      • rejt-plus-menu (span)
      • rejt-minus-menu (span)

JsonAddValue

  • rejt-add-value-node (span)

JsonFunctionValue

  • rejt-function-value-node (li)
    • rejt-name (span)
    • rejt-edit-form (span)
    • rejt-value (span)
    • rejt-minus-menu (span)

JsonValue

  • rejt-value-node (li)
    • rejt-name (span)
    • rejt-edit-form (span)
    • rejt-value (span)
    • rejt-minus-menu (span)

Development

Serve

npm run serve

Release

npm run release

Inspired by

Thanks

  • My wife BH to support me doing this

Author

  • Oxyno-zeta (Havrileck Alexandre)

License

MIT (See in License.md)