Browse Source

Fix release pointer cancel in resizer (#6574)

* Fix release pointer cancellation

* Ensure strings in assets src
release-v0.22.12
Artur Arseniev 7 months ago
committed by GitHub
parent
commit
1555cf0957
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      packages/core/src/asset_manager/model/Asset.ts
  2. 5
      packages/core/src/editor/index.ts
  3. 11
      packages/core/src/editor/model/Editor.ts
  4. 10
      packages/core/src/editor/types.ts
  5. 3
      packages/core/src/editor/view/EditorView.ts
  6. 2
      packages/core/src/utils/Resizer.ts

4
packages/core/src/asset_manager/model/Asset.ts

@ -38,7 +38,7 @@ export default class Asset extends Model {
* asset.getSrc(); // -> 'https://.../image.png' * asset.getSrc(); // -> 'https://.../image.png'
* */ * */
getSrc() { getSrc() {
return this.get('src'); return this.get('src') || '';
} }
/** /**
@ -51,7 +51,7 @@ export default class Asset extends Model {
* asset.getFilename(); // -> 'image' * asset.getFilename(); // -> 'image'
* */ * */
getFilename() { getFilename() {
return this.get('src').split('/').pop().split('?').shift(); return this.getSrc().split('/').pop().split('?').shift();
} }
/** /**

5
packages/core/src/editor/index.ts

@ -567,11 +567,12 @@ export default class Editor implements IBaseModule<EditorConfig> {
/** /**
* Load data from the JSON project * Load data from the JSON project
* @param {Object} data Project to load * @param {Object} data Project to load
* @param {Object} [options] Custom options that could be passed to the project load events.
* @example * @example
* editor.loadProjectData({ pages: [...], styles: [...], ... }) * editor.loadProjectData({ pages: [...], styles: [...], ... })
*/ */
loadProjectData(data: ProjectData) { loadProjectData(data: ProjectData, options: EditorLoadOptions & Record<string, unknown> = {}) {
return this.em.loadData(data); return this.em.loadData(data, options);
} }
storeData() { storeData() {

11
packages/core/src/editor/model/Editor.ts

@ -71,11 +71,11 @@ const deps: (new (em: EditorModel) => IModule)[] = [
DataSourceManager, DataSourceManager,
]; ];
const storableDeps: (new (em: EditorModel) => IModule & IStorableModule)[] = [ const storableDeps: (new (em: EditorModel) => IModule & IStorableModule)[] = [
DataSourceManager, // Ensure DS are loaded before other modules
AssetManager, AssetManager,
CssComposer, CssComposer,
PageManager, PageManager,
ComponentManager, ComponentManager,
DataSourceManager,
]; ];
Extender({ $ }); Extender({ $ });
@ -115,6 +115,7 @@ export default class EditorModel extends Model {
events = EditorEvents; events = EditorEvents;
__skip = false; __skip = false;
defaultRunning = false; defaultRunning = false;
loadTriggered = false;
destroyed = false; destroyed = false;
_config: InitEditorConfig; _config: InitEditorConfig;
_storageTimeout?: ReturnType<typeof setTimeout>; _storageTimeout?: ReturnType<typeof setTimeout>;
@ -460,7 +461,7 @@ export default class EditorModel extends Model {
* */ * */
handleUpdates(model: any, val: any, opt: any = {}) { handleUpdates(model: any, val: any, opt: any = {}) {
// Component has been added temporarily - do not update storage or record changes // Component has been added temporarily - do not update storage or record changes
if (this.__skip || opt.temporary || opt.noCount || opt.avoidStore || opt.partial || !this.get('ready')) { if (this.__skip || !this.loadTriggered || opt.temporary || opt.noCount || opt.avoidStore || opt.partial) {
return; return;
} }
@ -906,14 +907,16 @@ export default class EditorModel extends Model {
return project; return project;
} }
loadData(project: ProjectData = {}, opts: EditorLoadOptions = {}): ProjectData { loadData(project: ProjectData = {}, options: EditorLoadOptions = {}): ProjectData {
const evData = { project, options, initial: !!options.initial };
let loaded = false; let loaded = false;
if (!isEmptyObj(project)) { if (!isEmptyObj(project)) {
this.storables.forEach((module) => module.clear()); this.storables.forEach((module) => module.clear());
this.storables.forEach((module) => module.load(project)); this.storables.forEach((module) => module.load(project));
loaded = true; loaded = true;
} }
this.trigger(EditorEvents.projectLoad, { project, loaded, initial: !!opts.initial }); this.trigger(EditorEvents.projectLoad, { ...evData, loaded });
loaded && this.trigger(EditorEvents.projectLoaded, evData);
return project; return project;
} }

10
packages/core/src/editor/types.ts

@ -35,6 +35,16 @@ export enum EditorEvents {
*/ */
projectLoad = 'project:load', projectLoad = 'project:load',
/**
* @event `project:loaded` Similar to `project:load`, but triggers only if the project is loaded successfully.
* @example
* editor.on('project:loaded', ({ project, initial }) => { ... });
*
* // Loading an empty project, won't trigger this event.
* editor.loadProjectData({});
*/
projectLoaded = 'project:loaded',
/** /**
* @event `project:get` Event triggered on request of the project data. This can be used to extend the project with custom data. * @event `project:get` Event triggered on request of the project data. This can be used to extend the project with custom data.
* @example * @example

3
packages/core/src/editor/view/EditorView.ts

@ -12,7 +12,6 @@ export default class EditorView extends View<EditorModel> {
model.once('change:ready', () => { model.once('change:ready', () => {
Panels.active(); Panels.active();
Panels.disableButtons(); Panels.disableButtons();
UndoManager.clear();
if (model.getConfig().telemetry) { if (model.getConfig().telemetry) {
this.sendTelemetryData().catch(() => { this.sendTelemetryData().catch(() => {
@ -22,6 +21,8 @@ export default class EditorView extends View<EditorModel> {
setTimeout(() => { setTimeout(() => {
model.trigger(EditorEvents.load, model.Editor); model.trigger(EditorEvents.load, model.Editor);
model.loadTriggered = true;
UndoManager.clear();
model.clearDirtyCount(); model.clearDirtyCount();
}); });
}); });

2
packages/core/src/utils/Resizer.ts

@ -581,7 +581,7 @@ export default class Resizer {
this.updateRect(true, ev); this.updateRect(true, ev);
} }
this.selectedHandler?.releasePointerCapture(ev.pointerId); ev.pointerId && this.selectedHandler?.releasePointerCapture(ev.pointerId);
this.toggleFrames(); this.toggleFrames();
this.onEnd?.(ev, { docs, config, el, resizer: this }); this.onEnd?.(ev, { docs, config, el, resizer: this });
this.moved = false; this.moved = false;

Loading…
Cancel
Save