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 🙏

© 2026 – Pkg Stats / Ryan Hefner

strapi-plugin-dynamic-zone-tools

v1.0.0

Published

Dynamic zone productivity tools for Strapi 5: copy dynamic zones from other records and duplicate, copy, or insert individual component blocks.

Readme

Strapi Dynamic Zone Tools Plugin

A productivity plugin for Strapi 5 that makes dynamic zones faster to work with in the Content Manager.

Copy full page sections from another entry, append selected blocks, duplicate existing blocks, or copy and insert individual components without leaving the edit view. It is especially useful for page builders, landing pages, reusable content sections, campaign pages, and any Strapi setup where editors work with large dynamic zones.

⚠️ Version Compatibility

  • v1.x: Supports Strapi v5.41.0 and newer

✨ Features

  • 🎯 Copy Dynamic Zones Between Entries: Fill a dynamic zone from another record in the Content Manager
  • Replace or Append Modes: Replace the current zone or append selected blocks to the end
  • Block-Level Selection: Choose exactly which source blocks should be copied
  • 🧩 Duplicate Individual Blocks: Duplicate a dynamic zone component directly in the current entry
  • 📋 Copy and Insert Blocks: Copy a block and paste it above or below another compatible block
  • 🛡️ Schema-Aware Copying: Automatically skips components that are not allowed in the target dynamic zone
  • 🔗 Nested Data Support: Preserves nested components, media, and relation references when preparing copied data
  • 🌍 i18n and Draft/Publish Aware: Works with localized content and draft or published source records
  • 🔐 Permission-Protected Source Fetching: Protects the source-document lookup endpoint with a dedicated admin permission
  • ✍️ No Auto-Save: Applies changes to the form only, so editors can review before saving

🚀 Installation

Using npm

npm install strapi-plugin-dynamic-zone-tools

Using yarn

yarn add strapi-plugin-dynamic-zone-tools

⚙️ Configuration

Enable the plugin in config/plugins.js:

module.exports = {
  "dynamic-zone-tools": {
    enabled: true,
  },
};

For TypeScript projects, use config/plugins.ts:

export default {
  "dynamic-zone-tools": {
    enabled: true,
  },
};

After installation, rebuild and restart Strapi:

npm run build
npm run develop

🔧 Setup

  1. Install and enable the plugin.
  2. Rebuild and restart your Strapi application.
  3. Go to Settings -> Roles.
  4. Select the role that should use the plugin.
  5. Under Plugins -> Dynamic Zone Tools, enable Fill Dynamic Zone.
  6. Save the role.

The fill-from-record workflow uses this permission for its source-document lookup. Inline duplicate/copy/insert actions run inside the Content Manager form and are ultimately governed by the editor's normal Content Manager save permissions.

🎯 Usage

Copy a dynamic zone from another record

Use this when an editor wants to reuse an existing page layout, campaign structure, FAQ section, landing page blocks, or any dynamic zone content from another entry.

  1. Open a Content Manager entry that has at least one dynamic zone field.
  2. Click the Copy dynamic zone data header action.
  3. Select the target dynamic zone in the current entry.
  4. Choose Replace current zone or Append to current zone.
  5. Select the source collection type.
  6. Select the source dynamic zone field.
  7. Select the source record.
  8. If relevant, choose the source locale and draft/published version.
  9. Select the source blocks you want to copy.
  10. Confirm the action, review the edited form, and save when ready.

When copying between different dynamic zones, components that are not allowed by the target schema are skipped automatically.

Duplicate, copy, or insert individual blocks

Use this when an editor wants to quickly create a similar section inside the same entry or move a reusable block pattern into another compatible dynamic zone.

  1. Open a Content Manager entry with a dynamic zone.
  2. Use the block row actions inside the dynamic zone field.
  3. Click Duplicate component to duplicate the current block.
  4. Click Copy block to copy a block.
  5. Use Insert on another block row to paste the copied block above or below.
  6. Save the entry when the form looks correct.

Copied blocks can only be inserted into compatible dynamic zones.

🔐 Permissions

The plugin uses Strapi's admin role permission system for source-document lookup.

| Permission | Description | | --- | --- | | Fill Dynamic Zone | Allows users to fetch source document data for the fill-from-record workflow. |

Current behavior:

  • The fill-from-record workflow calls the plugin admin API, so it requires an authenticated admin user with the Fill Dynamic Zone permission.
  • The duplicate/copy/insert block actions are client-side Content Manager form actions. They do not call the plugin API; the resulting changes are saved only if the user has normal Content Manager permissions to save the entry.

🔌 API Endpoint

The plugin uses an admin-authenticated endpoint for source document lookup:

| Method | Endpoint | Description | | --- | --- | --- | | GET | /dynamic-zone-tools/source-document/:contentType/:id | Fetch a source record with deeply populated dynamic zone data. |

This endpoint is intended for the plugin UI, not for public API access. Content type and record list data is read through Strapi's authenticated Content Manager APIs.

🧠 How It Handles Copied Data

Dynamic zones can contain nested components, media fields, relations, localized content, and draft/published versions. The plugin prepares copied data before inserting it into the edit form:

  • Removes transient identifiers that should not be reused in a new block
  • Preserves component structure and allowed relation references
  • Filters out component types that are not allowed by the target dynamic zone
  • Keeps changes in the unsaved form state until the editor saves the entry

🛠️ Troubleshooting

Plugin action is not visible

  1. Confirm the content type has at least one dynamic zone field.
  2. Confirm your admin role has the Fill Dynamic Zone permission.
  3. Rebuild and restart Strapi after installing or changing plugin configuration.

A copied block is skipped or cannot be pasted

The block's component type is probably not allowed in the target dynamic zone. Update the target dynamic zone schema or copy into a compatible field.

Source records are missing

Check whether the source content type uses draft/publish or i18n. The plugin scopes source records by the selected version and locale.

🧑‍💻 Development

From the plugin directory:

npm run build
npm run verify
npm run test:ts:front
npm run test:ts:back

For local Strapi testing, enable the plugin with resolve in the parent Strapi application, then run the parent app build/develop commands.

📦 Package Contents

The npm package includes:

  • Built admin and server output in dist/
  • Source folders used by Strapi plugin development workflows
  • strapi-admin.js and strapi-server.js entry files
  • README, changelog, contributing guide, and license

🤝 Contributing

Issues and pull requests are welcome. Please include your Strapi version, reproduction steps, and any relevant content type schema details.

📄 License

MIT