Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve JSON documentation & output #13

Closed
hdaggett opened this issue Jan 13, 2020 · 6 comments
Closed

Improve JSON documentation & output #13

hdaggett opened this issue Jan 13, 2020 · 6 comments
Labels
documentation Improvements or additions to documentation enhancement Improvements to be made good first issue Good for newcomers

Comments

@hdaggett
Copy link

I couldn't find any examples of what the JSON format looked like, and I wanted to be sure the format was relatively independent of Craft itself. However, the JSON uses node IDs instead of nesting the nodes themselves, which I find confusing.

For example, with these Frame contents:

<Frame>
  <Canvas is={CraftContainer}>
    <CraftComponent>
      <TextComponent text="my text here" />
    </CraftComponent>
  </Canvas>
</Frame>

The JSON output from query.serialize() is:

{
  "canvas-ROOT": {
    "type": {
      "resolvedName": "CraftContainer"
    },
    "isCanvas": true,
    "props": {},
    "displayName": "Canvas",
    "custom": {},
    "nodes": [
      "node-yxVcZGJj"
    ]
  },
  "node-yxVcZGJj": {
    "type": {
      "resolvedName": "CraftComponent"
    },
    "props": {
      "children": [
        {
          "type": {},
          "props": {
            "text": "text component"
          }
        }
      ]
    },
    "displayName": "CraftComponent",
    "custom": {},
    "parent": "canvas-ROOT",
    "_childCanvas": {
      "d02fab54-ddf2-4356-b79d-5660d54915df": "canvas-u-wv625gX"
    }
  },
  "canvas-u-wv625gX": {
    "type": {
      "resolvedName": "CraftContainer"
    },
    "isCanvas": true,
    "props": {},
    "displayName": "Canvas",
    "custom": {},
    "parent": "node-yxVcZGJj",
    "nodes": [
      "node-aKYJYqPZ0"
    ]
  },
  "node-aKYJYqPZ0": {
    "type": {},
    "props": {
      "text": "my text here"
    },
    "displayName": "TextComponent",
    "custom": {},
    "parent": "canvas-u-wv625gX"
  }
}

I would expect something more like:

[
  {
    "type": "CraftContainer",
    "nodes": [
      {
        "type": "CraftComponent",
        "nodes": [
          {
            "type": "TextComponent",
            "props": {
              "text": "my text here"
            }
          }
        ]
      }
    ]
  }
]

It would also be nice to have some examples of implementing custom serializers, like SlateJS does. I'm currently using SlateJS as a WYSIWYG React editor, but I'd love to switch to Craft for the nicer drag & drop functionality.

@prevwong prevwong added documentation Improvements or additions to documentation good first issue Good for newcomers labels Jan 14, 2020
@prevwong
Copy link
Owner

prevwong commented Jan 14, 2020

Thank you for the suggestion. I like the idea of having the cleaner serialised output, will look into it for sure!

Unfortunately, we currently do not support custom serialisers. If you'd like, could you file a new feature request for it ?

@prevwong prevwong added the enhancement Improvements to be made label Jan 14, 2020
@prateekrastogi

This comment has been minimized.

@Hyperkid123
Copy link

@hdaggett @prevwong I am intrigued by this library. A hierarchical output of the state would be really nice. I think it can be done in consumer libraries/apps, but I also think that for generating the UI from the state, the nested JSON would be a preferable format than a flat object.

I would love to try it out and use this library for a form builder component for dynamic form library we are developing using in our projects. So I am more than willing to create a PR with this feature if you haven't started working on it yet.

@hdaggett
Copy link
Author

@Hyperkid123 Yes, please create a PR if @prevwong isn't already on it! A cleaner, hierarchical JSON format would make this much more powerful.

@prateekrastogi
Copy link

@hdaggett @Hyperkid123 PR is much needed herein

@prevwong
Copy link
Owner

@Hyperkid123 Sure, go ahead! 👌🏽

@prevwong prevwong assigned prevwong and unassigned prevwong Jan 16, 2020
mresposito added a commit that referenced this issue Apr 27, 2020
* change query to create and parse a tree, small code style nits

* parse an entire tree from jsx instead of just a single node

* implement adding the tree recursively

* fix dropping shadow

* improve the renderNode function to render nodes among children if there are any

* prevent nodes from being stripped from state if they are not in a canvas node
prevwong added a commit that referenced this issue May 16, 2020
* Add prepush hook, some small nits to the craft project setup (#1)

* add test staged

* add prepush hook

* Add onStateChanged hook (#2)

* improve unit tests setup, refactor and move some unit tests. Also add a callback for nodes

* add pull request template

* add unit tests for frame, improve handling of frame

* Editor state get & set (#3)

* Adds nodes state get and set methods

* Fixes over-shadowing bug

* Add private @candulabs scope for release

* Switches whole repo to point to @candulabs fork

* Updates tests

* Bumps up core version

* Update README.md

Adds warning about using this fork instead of official release

* Sync changes from main repo (#4)

* add test staged

* add prepush hook

* run prettier

* change unit test matcher

* ignore Canvas root id test

Caused by Subscriber, to be fixed

* v0.1.0-beta.4

* Update contributing

* update naming

* update version number

* package naming

Co-authored-by: Prev Wong <prevwong@gmail.com>

* Adds github workflow (#5)

* Adds test workflow

* Fixes shell linter

* Refactors flow to use node step

* Adds build step

* Corrects dep version

* Removes bad dependency

* Fixes potential case sensitive typo

* Configures lerna version

* Reset fork versions for lerna

* v0.1.5

* Adds optional publish step

* Adds better name to workflow

* Removes redundant job name

* Improves naming further

* Actions - second attempt (#6)

* Adds test workflow

* Fixes shell linter

* Refactors flow to use node step

* Adds build step

* Corrects dep version

* Removes bad dependency

* Fixes potential case sensitive typo

* Configures lerna version

* Reset fork versions for lerna

* v0.1.5

* Adds optional publish step

* Adds better name to workflow

* Removes redundant job name

* Improves naming further

* Introduces split workflow

* v0.1.6

* Adds npmrc

* Moves env to job level

* v0.1.7

* Sync changes from main repo (#8)

* add test staged

* add prepush hook

* run prettier

* change unit test matcher

* ignore Canvas root id test

Caused by Subscriber, to be fixed

* v0.1.0-beta.4

* Update contributing

* fix: allow Subscriber to collect state when created (#52)

* fix: add types for subscriber

* docs: update styling

* docs: fix typos

* docs: add example for drop indicator colours

* chore: add open collective

* docs: add layers gif

* chore: update README

* docs: fix Frame props description

Co-authored-by: Michele Riccardo Esposito <mresposito5@gmail.com>
Co-authored-by: Prev Wong <prevwong@gmail.com>

* v0.1.8

* expose use node context (#9)

* v0.1.9

* Rewrite actions.delete and actions.add plus unit tests (#10)

* tidy up the style inside actions

* add unit tests for action

* improve actions.add and actions.delete functions

* fix drag selection

* v0.1.10

* Refactor event handler to add more unit tests and make it more readable (#11)

* couple small style improvements

* refactor event handlers

* sort the query methods by name

* v0.1.11

* Local development with yalc (#12)

* Adds setup for local development with yalc

* Adds nodemon config file to npmignore

* v0.1.12

* Parse entire tree when dropping a node (#13)

* change query to create and parse a tree, small code style nits

* parse an entire tree from jsx instead of just a single node

* implement adding the tree recursively

* fix dropping shadow

* improve the renderNode function to render nodes among children if there are any

* prevent nodes from being stripped from state if they are not in a canvas node

* v0.1.13

* Adds check if resolver has isCanvas set (#14)

* v0.1.14

* fix: use Subscriber to handle onStateChange (#15)

* v0.1.15

* add enzyme deps

* pr review

* feat: Improvements to PR-69 (#72)

* Add parseNodeFromNodeData method in query, deprecate query.createNode (#18)

* rename query.createNode to query.parseNodeFromReactNode

* refactor transformJSXToNode and create node

* some light refactoring for readibiliyt

* try up the code

* add a couple unit tests, fix some small bugs

* fix fromEntries on node
# Conflicts:
#	packages/core/src/render/Frame.tsx
#	packages/core/src/render/tests/Frame.test.tsx
#	packages/utils/src/tests/History.test.ts

* fix: remove support for adding child nodes in non-Canvas

This will be added when the Element component is introduced

* fix: resetting parent nodes, re-added support for childCanvas

* chore: move event() to utils

* feat: PR improvements

* chore: rename SerialisedNodeData

* chore

* nit

Co-authored-by: Michele Riccardo Esposito <mresposito5@gmail.com>

Co-authored-by: Mateusz Drulis <mateusz.drulis@gmail.com>
Co-authored-by: Prev Wong <prevwong@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Prev Wong <prevwong@icloud.com>
prevwong added a commit that referenced this issue Jun 12, 2020
* Add prepush hook, some small nits to the craft project setup (#1)

* add test staged

* add prepush hook

* Add onStateChanged hook (#2)

* improve unit tests setup, refactor and move some unit tests. Also add a callback for nodes

* add pull request template

* add unit tests for frame, improve handling of frame

* Editor state get & set (#3)

* Adds nodes state get and set methods

* Fixes over-shadowing bug

* Add private @candulabs scope for release

* Switches whole repo to point to @candulabs fork

* Updates tests

* Bumps up core version

* Update README.md

Adds warning about using this fork instead of official release

* Sync changes from main repo (#4)

* add test staged

* add prepush hook

* run prettier

* change unit test matcher

* ignore Canvas root id test

Caused by Subscriber, to be fixed

* v0.1.0-beta.4

* Update contributing

* update naming

* update version number

* package naming

Co-authored-by: Prev Wong <prevwong@gmail.com>

* Adds github workflow (#5)

* Adds test workflow

* Fixes shell linter

* Refactors flow to use node step

* Adds build step

* Corrects dep version

* Removes bad dependency

* Fixes potential case sensitive typo

* Configures lerna version

* Reset fork versions for lerna

* v0.1.5

* Adds optional publish step

* Adds better name to workflow

* Removes redundant job name

* Improves naming further

* Actions - second attempt (#6)

* Adds test workflow

* Fixes shell linter

* Refactors flow to use node step

* Adds build step

* Corrects dep version

* Removes bad dependency

* Fixes potential case sensitive typo

* Configures lerna version

* Reset fork versions for lerna

* v0.1.5

* Adds optional publish step

* Adds better name to workflow

* Removes redundant job name

* Improves naming further

* Introduces split workflow

* v0.1.6

* Adds npmrc

* Moves env to job level

* v0.1.7

* Sync changes from main repo (#8)

* add test staged

* add prepush hook

* run prettier

* change unit test matcher

* ignore Canvas root id test

Caused by Subscriber, to be fixed

* v0.1.0-beta.4

* Update contributing

* fix: allow Subscriber to collect state when created (#52)

* fix: add types for subscriber

* docs: update styling

* docs: fix typos

* docs: add example for drop indicator colours

* chore: add open collective

* docs: add layers gif

* chore: update README

* docs: fix Frame props description

Co-authored-by: Michele Riccardo Esposito <mresposito5@gmail.com>
Co-authored-by: Prev Wong <prevwong@gmail.com>

* v0.1.8

* expose use node context (#9)

* v0.1.9

* Rewrite actions.delete and actions.add plus unit tests (#10)

* tidy up the style inside actions

* add unit tests for action

* improve actions.add and actions.delete functions

* fix drag selection

* v0.1.10

* Refactor event handler to add more unit tests and make it more readable (#11)

* couple small style improvements

* refactor event handlers

* sort the query methods by name

* v0.1.11

* Local development with yalc (#12)

* Adds setup for local development with yalc

* Adds nodemon config file to npmignore

* v0.1.12

* Parse entire tree when dropping a node (#13)

* change query to create and parse a tree, small code style nits

* parse an entire tree from jsx instead of just a single node

* implement adding the tree recursively

* fix dropping shadow

* improve the renderNode function to render nodes among children if there are any

* prevent nodes from being stripped from state if they are not in a canvas node

* v0.1.13

* Adds check if resolver has isCanvas set (#14)

* v0.1.14

* fix: use Subscriber to handle onStateChange (#15)

* v0.1.15

* add enzyme deps

* pr review

* feat: add deprecation util

* feat: add normaliser to createNode/transformJSX

* feat: refactor actions

* feat: refactor rendering

* feat: deprecate Canvas with Element

* cleanup

* fix: render node bug when node deleted

* fix tests

* fix: remove timeout hack

* feat: deprecate adding array of Nodes

* fix: simplify RenderNode

* nit: cleanup unused vars

* nit: remove comments

* chore: add yalc

* fix: Element rehydration

* chore: refactor parseNodeDataFromJSX

* fix: api scheme

* chore: remove capture/debounce handlers

* chore: handle deprecated _childNodes

* chore: hidden => isHidden

* chore: _childCanvas => linkedNodes

* nit: cleanup

* feat: add hydrationTimestamp

* chore: cleanup

* nit: rename Tree => NodeTree

* fix: deprecate decendants

* feat: move connectors to context

* fix: RenderNode

* fix: deserialisation

* feat: update hooks exposed actions

* fix: update action

* chore: cleanup

* chore: update api in test

* feat: refactor NodeHelpers

* nit: update element isCanvas => canvas

* fix: typo

* fix: NodeHelpers

* feat: refactor queries

* chore: cleanup

* fix: remove drag

* chore: update docs

* fix: remove drag

* feat: rename addTree => addNodeTree

* chore: rename onStateChange => onNodesChange

* feat: update linkednode parent

* chore: update docs

* feat: change to click event

* feat: remove id prefix and rename root node

* cleanup

* chore

* chore: remove isHidden

* chore: cleanup API

* chore: add test watch command

* chore: fix docs

* nit

* nit: cleanup

* nit: pr

* feat: deprecate craft name/defaultProps

* feat: ensure dragged element is selected

* chore: update docs

* fix: ensure events exist

* nit(layers): use updated API

* fix: existing node in element

* nit: cleanup

* nit: cleanup

Co-authored-by: Michele Riccardo Esposito <mresposito5@gmail.com>
Co-authored-by: Mateusz Drulis <mateusz.drulis@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation enhancement Improvements to be made good first issue Good for newcomers
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants