From c2e9ba2abe88590c71f9ab2b1151ca1651b3f389 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sun, 26 Sep 2021 18:06:37 +0200 Subject: [PATCH] Update blocks module API --- docs/api/assets.md | 1 + docs/api/block_manager.md | 54 ++++++++++++++++++-------------------- docs/modules/Blocks.md | 3 ++- src/block_manager/index.js | 44 +++++++++++-------------------- 4 files changed, 43 insertions(+), 59 deletions(-) diff --git a/docs/api/assets.md b/docs/api/assets.md index 02ee44616..bbc3cffd1 100644 --- a/docs/api/assets.md +++ b/docs/api/assets.md @@ -22,6 +22,7 @@ const assetManager = editor.AssetManager; * `asset:open` - Asset Manager opened. * `asset:close` - Asset Manager closed. +* `asset:add` - Asset added. The [Asset] is passed as an argument to the callback. * `asset:remove` - Asset removed. The [Asset] is passed as an argument to the callback. * `asset:update` - Asset updated. The updated [Asset] and the object containing changes are passed as arguments to the callback. * `asset:upload:start` - Before the upload is started. diff --git a/docs/api/block_manager.md b/docs/api/block_manager.md index 65e1086a6..770de1ec5 100644 --- a/docs/api/block_manager.md +++ b/docs/api/block_manager.md @@ -12,16 +12,22 @@ const editor = grapesjs.init({ }) ``` -Once the editor is instantiated you can use its API. Before using these methods you should get the module from the instance +Once the editor is instantiated you can use its API and listen to its events. Before using these methods, you should get the module from the instance. ```js +// Listen to events +editor.on('block:add', (block) => { ... }); + +// Use the API const blockManager = editor.BlockManager; +blockManager.add(...); ``` ## Available Events -* `block:add` - New block added -* `block:remove` - Block removed +* `block:add` - Block added. The [Block] is passed as an argument to the callback. +* `block:remove` - Block removed. The [Block] is passed as an argument to the callback. +* `block:update` - Block updated. The [Block] and the object containing changes are passed as arguments to the callback. * `block:drag:start` - Started dragging block, model of the block is passed as an argument * `block:drag` - Dragging block, the block's model and the drag event are passed as arguments * `block:drag:stop` - Dragging of the block is stopped. As agruments for the callback you get, the dropped component model (if dropped successfully) and the model of the block @@ -46,27 +52,15 @@ Get configuration object Returns **[Object][11]** -## onLoad - -Load default blocks if the collection is empty - ## add -Add new block to the collection. +Add new block. ### Parameters -* `id` **[string][12]** Block id -* `opts` **[Object][11]** Options - - * `opts.label` **[string][12]** Name of the block - * `opts.content` **[string][12]** HTML content - * `opts.category` **([string][12] | [Object][11])** Group the block inside a category. - You should pass objects with id property, eg: - {id: 'some-uid', label: 'My category'} - The string will be converted in: - 'someid' => {id: 'someid', label: 'someid'} - * `opts.attributes` **[Object][11]** Block attributes (optional, default `{}`) +* `id` **[String][12]** Block ID +* `props` **[Block]** Block properties +* `opts` (optional, default `{}`) ### Examples @@ -85,11 +79,11 @@ Returns **[Block]** Added block ## get -Return the block by id +Get the block by id. ### Parameters -* `id` **[string][12]** Block id +* `id` **[String][12]** Block id ### Examples @@ -103,7 +97,7 @@ Returns **[Block]** ## getAll -Return all blocks +Return all blocks. ### Examples @@ -113,28 +107,30 @@ console.log(JSON.stringify(blocks)); // [{label: 'Heading', content: '

Put your ...'}, ...] ``` -Returns **Collection** +Returns **Collection<[Block]>** ## getAllVisible Return the visible collection, which containes blocks actually rendered -Returns **Collection** +Returns **Collection<[Block]>** ## remove -Remove a block by id +Remove block. ### Parameters -* `id` **[string][12]** Block id +* `block` **([String][12] | [Block])** Block or block ID +* `opts` (optional, default `{}`) ### Examples ```javascript -// Id of the block which need to be removed -const id = 'button'; -blockManager.remove(id); +const removed = blockManager.remove('BLOCK_ID'); +// or by passing the Block +const block = blockManager.get('BLOCK_ID'); +blockManager.remove(block); ``` Returns **[Block]** Removed block diff --git a/docs/modules/Blocks.md b/docs/modules/Blocks.md index 090b0e24e..6b59e5b64 100644 --- a/docs/modules/Blocks.md +++ b/docs/modules/Blocks.md @@ -307,7 +307,7 @@ For a complete list of available events, you can check it [here](/api/block_mana - + diff --git a/src/block_manager/index.js b/src/block_manager/index.js index 0a2a5c8b4..8382b25ee 100644 --- a/src/block_manager/index.js +++ b/src/block_manager/index.js @@ -22,6 +22,7 @@ * ## Available Events * * `block:add` - Block added. The [Block] is passed as an argument to the callback. * * `block:remove` - Block removed. The [Block] is passed as an argument to the callback. + * * `block:update` - Block updated. The [Block] and the object containing changes are passed as arguments to the callback. * * `block:drag:start` - Started dragging block, model of the block is passed as an argument * * `block:drag` - Dragging block, the block's model and the drag event are passed as arguments * * `block:drag:stop` - Dragging of the block is stopped. As agruments for the callback you get, the dropped component model (if dropped successfully) and the model of the block @@ -52,8 +53,8 @@ import BlocksView from './view/BlocksView'; export const evAll = 'block'; export const evPfx = `${evAll}:`; -export const evUpdate = `${evPfx}update`; export const evAdd = `${evPfx}add`; +export const evUpdate = `${evPfx}update`; export const evRemove = `${evPfx}remove`; export const evRemoveBefore = `${evRemove}:before`; // export const evCustom = `${evPfx}custom`; @@ -117,18 +118,11 @@ export default () => { return c; }, - /** - * Load default blocks if the collection is empty - */ onLoad() { const blocks = this.getAll(); !blocks.length && blocks.reset(c.blocks); }, - /** - * Executed once the main editor instance is rendered - * @private - */ postRender() { const collection = blocksVisible; blocksView = new BlocksView({ collection, categories }, c); @@ -142,17 +136,9 @@ export default () => { }, /** - * Add new block to the collection. - * @param {string} id Block id - * @param {Object} opts Options - * @param {string} opts.label Name of the block - * @param {string} opts.content HTML content - * @param {string|Object} opts.category Group the block inside a category. - * You should pass objects with id property, eg: - * {id: 'some-uid', label: 'My category'} - * The string will be converted in: - * 'someid' => {id: 'someid', label: 'someid'} - * @param {Object} [opts.attributes={}] Block attributes + * Add new block. + * @param {String} id Block ID + * @param {[Block]} props Block properties * @returns {[Block]} Added block * @example * blockManager.add('h1-block', { @@ -164,15 +150,15 @@ export default () => { * } * }); */ - add(id, opts) { - var obj = opts || {}; - obj.id = id; - return blocks.add(obj); + add(id, props, opts = {}) { + const prp = props || {}; + prp.id = id; + return blocks.add(prp, opts); }, /** - * Return the block by id - * @param {string} id Block id + * Get the block by id. + * @param {String} id Block id * @returns {[Block]} * @example * const block = blockManager.get('h1-block'); @@ -185,7 +171,7 @@ export default () => { /** * Return all blocks. - * @return {Collection<[Block]>} + * @returns {Collection<[Block]>} * @example * const blocks = blockManager.getAll(); * console.log(JSON.stringify(blocks)); @@ -197,7 +183,7 @@ export default () => { /** * Return the visible collection, which containes blocks actually rendered - * @return {Collection} + * @returns {Collection<[Block]>} */ getAllVisible() { return blocksVisible; @@ -213,8 +199,8 @@ export default () => { * const block = blockManager.get('BLOCK_ID'); * blockManager.remove(block); */ - remove(id, opts) { - return this.__remove(id, opts); + remove(block, opts = {}) { + return this.__remove(block, opts); }, /**