mirror of https://github.com/artf/grapesjs.git
nocodeframeworkdrag-and-dropsite-buildersite-generatortemplate-builderui-builderweb-builderweb-builder-frameworkwebsite-builderno-codepage-builder
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.2 KiB
42 lines
1.2 KiB
import { isArray, contains } from 'underscore';
|
|
|
|
export default {
|
|
run(ed, s, opts = {}) {
|
|
const em = ed.getModel();
|
|
const clp = em.get('clipboard');
|
|
const selected = ed.getSelected();
|
|
const sorter = ed.BlockManager.getConfig().getSorter();
|
|
|
|
if (clp && selected) {
|
|
ed.getSelectedAll().forEach(comp => {
|
|
if (!comp) return;
|
|
|
|
const coll = comp.collection;
|
|
if (!coll) return;
|
|
|
|
let added;
|
|
const at = coll.indexOf(comp) + 1;
|
|
const addOpts = { at, action: opts.action || 'paste-component' };
|
|
const copyable = clp.filter(cop => cop.get('copyable'));
|
|
const pasteable = copyable.filter(cop => {
|
|
return sorter.validTarget(cop.getEl(), selected.getEl()).valid
|
|
|| sorter.validTarget(cop.parent()?.getEl(), selected.getEl()).valid;
|
|
});
|
|
|
|
if (contains(clp, comp) && comp.get('copyable')) {
|
|
added = coll.add(comp.clone(), addOpts);
|
|
} else {
|
|
added = coll.add(
|
|
pasteable.map(cop => cop.clone()),
|
|
addOpts
|
|
);
|
|
}
|
|
|
|
added = isArray(added) ? added : [added];
|
|
added.forEach(add => ed.trigger('component:paste', add));
|
|
});
|
|
|
|
selected.emitUpdate();
|
|
}
|
|
},
|
|
};
|
|
|