{"version":3,"file":"Group.mjs","names":[],"sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n  TClassProperties,\n  TSVGReviver,\n  TOptions,\n  Abortable,\n} from '../typedefs';\nimport {\n  invertTransform,\n  multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n  enlivenObjectEnlivables,\n  enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n  ImperativeLayoutOptions,\n  LayoutBeforeEvent,\n  LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n  LAYOUT_TYPE_ADDED,\n  LAYOUT_TYPE_IMPERATIVE,\n  LAYOUT_TYPE_INITIALIZATION,\n  LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\nimport { escapeXml } from '../util/lang_string';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n  performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n  'layout:before': LayoutBeforeEvent;\n  'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n  subTargetCheck: boolean;\n  interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n  extends SerializedObjectProps, GroupOwnProps {\n  objects: SerializedObjectProps[];\n  layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n  layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n  strokeWidth: 0,\n  subTargetCheck: false,\n  interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n  extends createCollectionMixin(\n    FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n  )\n  implements GroupProps\n{\n  /**\n   * Used to optimize performance\n   * set to `false` if you don't need contained objects to be targets of events\n   * @type boolean\n   */\n  declare subTargetCheck: boolean;\n\n  /**\n   * Used to allow targeting of object inside groups.\n   * set to true if you want to select an object inside a group.\\\n   * **REQUIRES** `subTargetCheck` set to true\n   * This will be not removed but slowly replaced with a method setInteractive\n   * that will take care of enabling subTargetCheck and necessary object events.\n   * There is too much attached to group interactivity to just be evaluated by a\n   * boolean in the code\n   * @deprecated\n   * @type boolean\n   */\n  declare interactive: boolean;\n\n  declare layoutManager: LayoutManager;\n\n  /**\n   * Used internally to optimize performance\n   * Once an object is selected, instance is rendered without the selected object.\n   * This way instance is cached only once for the entire interaction with the selected object.\n   * @private\n   */\n  protected _activeObjects: FabricObject[] = [];\n\n  static type = 'Group';\n\n  static ownDefaults: Record<string, any> = groupDefaultValues;\n  private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n  private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n  static getDefaults(): Record<string, any> {\n    return {\n      ...super.getDefaults(),\n      ...Group.ownDefaults,\n    };\n  }\n\n  /**\n   * Constructor\n   *\n   * @param {FabricObject[]} [objects] instance objects\n   * @param {Object} [options] Options object\n   */\n  constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n    super();\n    Object.assign(this, Group.ownDefaults);\n    this.setOptions(options);\n    this.groupInit(objects, options);\n  }\n\n  /**\n   * Shared code between group and active selection\n   * Meant to be used by the constructor.\n   */\n  protected groupInit(\n    objects: FabricObject[],\n    options: {\n      layoutManager?: LayoutManager;\n      top?: number;\n      left?: number;\n    },\n  ) {\n    this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n    this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n      this,\n      true,\n    );\n    this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n      this,\n      false,\n    );\n\n    this.forEachObject((object) => {\n      this.enterGroup(object, false);\n    });\n\n    // perform initial layout\n    this.layoutManager = options.layoutManager ?? new LayoutManager();\n    this.layoutManager.performLayout({\n      type: LAYOUT_TYPE_INITIALIZATION,\n      target: this,\n      targets: [...objects],\n      // @TODO remove this concept from the layout manager.\n      // Layout manager will calculate the correct position,\n      // group options can override it later.\n      x: options.left,\n      y: options.top,\n    });\n  }\n\n  /**\n   * Checks if object can enter group and logs relevant warnings\n   * @private\n   * @param {FabricObject} object\n   * @returns\n   */\n  canEnterGroup(object: FabricObject) {\n    if (object === this || this.isDescendantOf(object)) {\n      //  prevent circular object tree\n      log(\n        'error',\n        'Group: circular object trees are not supported, this call has no effect',\n      );\n      return false;\n    } else if (this._objects.indexOf(object) !== -1) {\n      // is already in the objects array\n      log(\n        'error',\n        'Group: duplicate objects are not supported inside group, this call has no effect',\n      );\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Override this method to enhance performance (for groups with a lot of objects).\n   * If Overriding, be sure not pass illegal objects to group - it will break your app.\n   * @private\n   */\n  protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n    return objects.filter((object, index, array) => {\n      // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n      return this.canEnterGroup(object) && array.indexOf(object) === index;\n    });\n  }\n\n  /**\n   * Add objects\n   * @param {...FabricObject[]} objects\n   */\n  add(...objects: FabricObject[]) {\n    const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n    const size = super.add(...allowedObjects);\n    this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n    return size;\n  }\n\n  /**\n   * Inserts an object into collection at specified index\n   * @param {FabricObject[]} objects Object to insert\n   * @param {Number} index Index to insert object at\n   */\n  insertAt(index: number, ...objects: FabricObject[]) {\n    const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n    const size = super.insertAt(index, ...allowedObjects);\n    this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n    return size;\n  }\n\n  /**\n   * Remove objects\n   * @param {...FabricObject[]} objects\n   * @returns {FabricObject[]} removed objects\n   */\n  remove(...objects: FabricObject[]) {\n    const removed = super.remove(...objects);\n    this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n    return removed;\n  }\n\n  _onObjectAdded(object: FabricObject) {\n    this.enterGroup(object, true);\n    this.fire('object:added', { target: object });\n    object.fire('added', { target: this });\n  }\n\n  /**\n   * @private\n   * @param {FabricObject} object\n   * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n   */\n  _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n    this.exitGroup(object, removeParentTransform);\n    this.fire('object:removed', { target: object });\n    object.fire('removed', { target: this });\n  }\n\n  /**\n   * @private\n   * @param {'added'|'removed'} type\n   * @param {FabricObject[]} targets\n   */\n  _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n    this.layoutManager.performLayout({\n      type,\n      targets,\n      target: this,\n    });\n  }\n\n  _onStackOrderChanged() {\n    this._set('dirty', true);\n  }\n\n  /**\n   * @private\n   * @param {string} key\n   * @param {*} value\n   */\n  _set(key: string, value: any) {\n    const prev = this[key as keyof this];\n    super._set(key, value);\n    if (key === 'canvas' && prev !== value) {\n      (this._objects || []).forEach((object) => {\n        object._set(key, value);\n      });\n    }\n    return this;\n  }\n\n  /**\n   * @private\n   */\n  _shouldSetNestedCoords() {\n    return this.subTargetCheck;\n  }\n\n  /**\n   * Remove all objects\n   * @returns {FabricObject[]} removed objects\n   */\n  removeAll() {\n    this._activeObjects = [];\n    return this.remove(...this._objects);\n  }\n\n  /**\n   * keeps track of the selected objects\n   * @private\n   */\n  __objectSelectionMonitor<T extends boolean>(\n    selected: T,\n    {\n      target: object,\n    }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n  ) {\n    const activeObjects = this._activeObjects;\n    if (selected) {\n      activeObjects.push(object);\n      this._set('dirty', true);\n    } else if (activeObjects.length > 0) {\n      const index = activeObjects.indexOf(object);\n      if (index > -1) {\n        activeObjects.splice(index, 1);\n        this._set('dirty', true);\n      }\n    }\n  }\n\n  /**\n   * @private\n   * @param {boolean} watch\n   * @param {FabricObject} object\n   */\n  _watchObject(watch: boolean, object: FabricObject) {\n    //  make sure we listen only once\n    watch && this._watchObject(false, object);\n    if (watch) {\n      object.on('selected', this.__objectSelectionTracker);\n      object.on('deselected', this.__objectSelectionDisposer);\n    } else {\n      object.off('selected', this.__objectSelectionTracker);\n      object.off('deselected', this.__objectSelectionDisposer);\n    }\n  }\n\n  /**\n   * @private\n   * @param {FabricObject} object\n   * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n   */\n  enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n    object.group && object.group.remove(object);\n    object._set('parent', this);\n    this._enterGroup(object, removeParentTransform);\n  }\n\n  /**\n   * @private\n   * @param {FabricObject} object\n   * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n   */\n  _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n    if (removeParentTransform) {\n      // can this be converted to utils (sendObjectToPlane)?\n      applyTransformToObject(\n        object,\n        multiplyTransformMatrices(\n          invertTransform(this.calcTransformMatrix()),\n          object.calcTransformMatrix(),\n        ),\n      );\n    }\n    this._shouldSetNestedCoords() && object.setCoords();\n    object._set('group', this);\n    object._set('canvas', this.canvas);\n    this._watchObject(true, object);\n    const activeObject =\n      this.canvas &&\n      this.canvas.getActiveObject &&\n      this.canvas.getActiveObject();\n    // if we are adding the activeObject in a group\n    if (\n      activeObject &&\n      (activeObject === object || object.isDescendantOf(activeObject))\n    ) {\n      this._activeObjects.push(object);\n    }\n  }\n\n  /**\n   * @private\n   * @param {FabricObject} object\n   * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n   */\n  exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n    this._exitGroup(object, removeParentTransform);\n    object._set('parent', undefined);\n    object._set('canvas', undefined);\n  }\n\n  /**\n   * Executes the inner fabric logic of exiting a group.\n   * - Stop watching the object\n   * - Remove the object from the optimization map this._activeObjects\n   * - unset the group property of the object\n   * @protected\n   * @param {FabricObject} object\n   * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n   */\n  _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n    object._set('group', undefined);\n    if (!removeParentTransform) {\n      applyTransformToObject(\n        object,\n        multiplyTransformMatrices(\n          this.calcTransformMatrix(),\n          object.calcTransformMatrix(),\n        ),\n      );\n      object.setCoords();\n    }\n    this._watchObject(false, object);\n    const index =\n      this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n    if (index > -1) {\n      this._activeObjects.splice(index, 1);\n    }\n  }\n\n  /**\n   * Decide if the group should cache or not. Create its own cache level\n   * needsItsOwnCache should be used when the object drawing method requires\n   * a cache step.\n   * Generally you do not cache objects in groups because the group is already cached.\n   * @return {Boolean}\n   */\n  shouldCache() {\n    const ownCache = FabricObject.prototype.shouldCache.call(this);\n    if (ownCache) {\n      for (let i = 0; i < this._objects.length; i++) {\n        if (this._objects[i].willDrawShadow()) {\n          this.ownCaching = false;\n          return false;\n        }\n      }\n    }\n    return ownCache;\n  }\n\n  /**\n   * Check if this object or a child object will cast a shadow\n   * @return {Boolean}\n   */\n  willDrawShadow() {\n    if (super.willDrawShadow()) {\n      return true;\n    }\n    for (let i = 0; i < this._objects.length; i++) {\n      if (this._objects[i].willDrawShadow()) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Check if instance or its group are caching, recursively up\n   * @return {Boolean}\n   */\n  isOnACache(): boolean {\n    return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n  }\n\n  /**\n   * Execute the drawing operation for an object on a specified context\n   * @param {CanvasRenderingContext2D} ctx Context to render on\n   */\n  drawObject(\n    ctx: CanvasRenderingContext2D,\n    forClipping: boolean | undefined,\n    context: DrawContext,\n  ) {\n    this._renderBackground(ctx);\n    for (let i = 0; i < this._objects.length; i++) {\n      const obj = this._objects[i];\n      // TODO: handle rendering edge case somehow\n      if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n        ctx.save();\n        ctx.transform(...invertTransform(this.calcTransformMatrix()));\n        obj.render(ctx);\n        ctx.restore();\n      } else if (obj.group === this) {\n        obj.render(ctx);\n      }\n    }\n    this._drawClipPath(ctx, this.clipPath, context);\n  }\n\n  /**\n   * @override\n   * @return {Boolean}\n   */\n  setCoords() {\n    super.setCoords();\n    this._shouldSetNestedCoords() &&\n      this.forEachObject((object) => object.setCoords());\n  }\n\n  triggerLayout(options: ImperativeLayoutOptions = {}) {\n    this.layoutManager.performLayout({\n      target: this,\n      type: LAYOUT_TYPE_IMPERATIVE,\n      ...options,\n    });\n  }\n\n  /**\n   * Renders instance on a given context\n   * @param {CanvasRenderingContext2D} ctx context to render instance on\n   */\n  render(ctx: CanvasRenderingContext2D) {\n    this._transformDone = true;\n    super.render(ctx);\n    this._transformDone = false;\n  }\n\n  /**\n   *\n   * @private\n   * @param {'toObject'|'toDatalessObject'} [method]\n   * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @returns {FabricObject[]} serialized objects\n   */\n  __serializeObjects(\n    method: 'toObject' | 'toDatalessObject',\n    propertiesToInclude?: string[],\n  ) {\n    const _includeDefaultValues = this.includeDefaultValues;\n    return this._objects\n      .filter(function (obj) {\n        return !obj.excludeFromExport;\n      })\n      .map(function (obj) {\n        const originalDefaults = obj.includeDefaultValues;\n        obj.includeDefaultValues = _includeDefaultValues;\n        const data = obj[method || 'toObject'](propertiesToInclude);\n        obj.includeDefaultValues = originalDefaults;\n        // delete data.version;\n        return data;\n      });\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} object representation of an instance\n   */\n  toObject<\n    T extends Omit<\n      GroupProps & TClassProperties<this>,\n      keyof SerializedGroupProps\n    >,\n    K extends keyof T = never,\n  >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n    const layoutManager = this.layoutManager.toObject();\n\n    return {\n      ...super.toObject([\n        'subTargetCheck',\n        'interactive',\n        ...propertiesToInclude,\n      ]),\n      ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n        ? { layoutManager }\n        : {}),\n      objects: this.__serializeObjects(\n        'toObject',\n        propertiesToInclude as string[],\n      ),\n    };\n  }\n\n  toString() {\n    return `#<Group: (${this.complexity()})>`;\n  }\n\n  dispose() {\n    this.layoutManager.unsubscribeTargets({\n      targets: this.getObjects(),\n      target: this,\n    });\n    this._activeObjects = [];\n    this.forEachObject((object) => {\n      this._watchObject(false, object);\n      object.dispose();\n    });\n    super.dispose();\n  }\n\n  /**\n   * @private\n   */\n  _createSVGBgRect(reviver?: TSVGReviver) {\n    if (!this.backgroundColor) {\n      return '';\n    }\n    const fillStroke = Rect.prototype._toSVG.call(this);\n    const commons = fillStroke.indexOf('COMMON_PARTS');\n    fillStroke[commons] = 'for=\"group\" ';\n    const markup = fillStroke.join('');\n    return reviver ? reviver(markup) : markup;\n  }\n\n  /**\n   * Returns svg representation of an instance\n   * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n   * @return {String} svg representation of an instance\n   */\n  _toSVG(reviver?: TSVGReviver) {\n    const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n    const bg = this._createSVGBgRect(reviver);\n    bg && svgString.push('\\t\\t', bg);\n    for (let i = 0; i < this._objects.length; i++) {\n      svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n    }\n    svgString.push('</g>\\n');\n    return svgString;\n  }\n\n  /**\n   * Returns styles-string for svg-export, specific version for group\n   * @return {String}\n   */\n  getSvgStyles(): string {\n    const opacity =\n        typeof this.opacity !== 'undefined' && this.opacity !== 1\n          ? `opacity: ${escapeXml(this.opacity)};`\n          : '',\n      visibility = this.visible ? '' : ' visibility: hidden;';\n    return [opacity, this.getSvgFilter(), visibility].join('');\n  }\n\n  /**\n   * Returns svg clipPath representation of an instance\n   * @param {Function} [reviver] Method for further parsing of svg representation.\n   * @return {String} svg representation of an instance\n   */\n  toClipPathSVG(reviver?: TSVGReviver): string {\n    const svgString = [];\n    const bg = this._createSVGBgRect(reviver);\n    bg && svgString.push('\\t', bg);\n    for (let i = 0; i < this._objects.length; i++) {\n      svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n    }\n    return this._createBaseClipPathSVGMarkup(svgString, {\n      reviver,\n    });\n  }\n\n  /**\n   * @todo support loading from svg\n   * @private\n   * @param {Object} object Object to create a group from\n   * @returns {Promise<Group>}\n   */\n  static fromObject<T extends TOptions<SerializedGroupProps>>(\n    { type, objects = [], layoutManager, ...options }: T,\n    abortable?: Abortable,\n  ) {\n    return Promise.all([\n      enlivenObjects<FabricObject>(objects, abortable),\n      enlivenObjectEnlivables(options, abortable),\n    ]).then(([objects, hydratedOptions]) => {\n      const group = new this(objects, {\n        ...options,\n        ...hydratedOptions,\n        layoutManager: new NoopLayoutManager(),\n      });\n      if (layoutManager) {\n        const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n          layoutManager.type,\n        );\n        const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n          layoutManager.strategy,\n        );\n        group.layoutManager = new layoutClass(new strategyClass());\n      } else {\n        group.layoutManager = new LayoutManager();\n      }\n      group.layoutManager.subscribeTargets({\n        type: LAYOUT_TYPE_INITIALIZATION,\n        target: group,\n        targets: group.getObjects(),\n      });\n      group.setCoords();\n      return group;\n    });\n  }\n}\n\nclassRegistry.setClass(Group);\n"],"mappings":"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"}