{"version":3,"file":"pebula-ngrid-clipboard.mjs","sources":["../../../../libs/ngrid/clipboard/src/lib/clipboard.plugin.ts","../../../../libs/ngrid/clipboard/src/lib/clipboard.module.ts","../../../../libs/ngrid/clipboard/src/pebula-ngrid-clipboard.ts"],"sourcesContent":["import { filter } from 'rxjs/operators';\nimport { Directive, Injector, OnDestroy, Input } from '@angular/core';\n\nimport { Clipboard } from '@angular/cdk/clipboard';\n\nimport { unrx } from '@pebula/ngrid/core';\nimport { PblNgridComponent, PblNgridPluginController, PblNgridConfigService } from '@pebula/ngrid';\n\ndeclare module '@pebula/ngrid/lib/ext/types' {\n  interface PblNgridPluginExtension {\n    clipboard?: PblNgridClipboardPlugin;\n  }\n  interface PblNgridPluginExtensionFactories {\n    clipboard: keyof typeof PblNgridClipboardPlugin;\n  }\n}\n\ndeclare module '@pebula/ngrid/core/lib/configuration/type' {\n  interface PblNgridConfig {\n    clipboard?: {\n      /** When set to true will enable the clipboard plugin on all grid instances by default. */\n      autoEnable?: boolean;\n      /**\n       * The separator to use when multiple cells are copied\n       * @default \\t\n       */\n      cellSeparator?: string;\n      /**\n       * The separator to use when multiple rows are copied\n       * @default \\n\n       */\n      rowSeparator?: string;\n    };\n  }\n}\n\nconst IS_OSX = /^mac/.test(navigator.platform.toLowerCase())\nconst DEFAULT_CELL_SEP = '\\t';\nconst DEFAULT_ROW_SEP = '\\n';\n\nexport const PLUGIN_KEY: 'clipboard' = 'clipboard';\n\n@Directive({ selector: 'pbl-ngrid[clipboard]', exportAs: 'pblNgridClipboard' })\nexport class PblNgridClipboardPlugin implements OnDestroy {\n\n  static create(grid: PblNgridComponent, injector: Injector): PblNgridClipboardPlugin {\n    const pluginCtrl = PblNgridPluginController.find(grid);\n    return new PblNgridClipboardPlugin(grid, injector, pluginCtrl);\n  }\n\n  /**\n   * The separator to use when multiple cells are copied.\n   * If not set, taken from `PblNgridConfig.clipboard.cellSeparator`\n   * @default \\t\n   */\n  @Input() clpCellSep: string;\n\n  /**\n   * The separator to use when multiple rows are copied\n   * If not set, taken from `PblNgridConfig.clipboard.rowSeparator`\n   * @default \\n\n   */\n  @Input() clpRowSep: string;\n\n  private config: PblNgridConfigService;\n  private clipboard: Clipboard;\n  private _removePlugin: (grid: PblNgridComponent) => void;\n\n  constructor(public grid: PblNgridComponent<any>, protected injector: Injector, protected pluginCtrl: PblNgridPluginController) {\n    this.config = injector.get(PblNgridConfigService)\n    this.clipboard = injector.get(Clipboard);\n    this.init();\n  }\n\n  ngOnDestroy(): void {\n    unrx.kill(this);\n    this._removePlugin(this.grid);\n  }\n\n  protected isCopyEvent(event: Event): boolean {\n    if (event instanceof KeyboardEvent && event.key === 'c') {\n      if ((!IS_OSX && event.ctrlKey) || (IS_OSX && event.metaKey)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  protected doCopy(): void {\n    const { cellSeparator, rowSeparator } = this.config.get('clipboard', {});\n    const { rows, minIndex } = this.getSelectedRowData(this.grid);\n    const createRow = (row: any[]) => row.slice(minIndex).join(this.clpCellSep || cellSeparator || DEFAULT_CELL_SEP);\n    // For each row (collection of items), slice the initial items that are not copied across all selections\n\n    this.clipboard.copy(rows.map(createRow).join(this.clpRowSep || rowSeparator || DEFAULT_ROW_SEP));\n    // TODO: Consider using `beginCopy` to support large copy operations\n  }\n\n  protected getSelectedRowData(grid: PblNgridComponent) {\n    const { columnApi, contextApi } = grid;\n    const data = new Map<any, any[]>();\n\n    // The minIndex represents the first column being copied out of all visible columns (0 being the first visible column).\n    // For every selected cell, the column is tracked and it's index is being set to `minIndex` if it is lower then the current `minIndex` (Math.Min).\n    // We start with the biggest int but right away get a valid column index...\n    // Later on, each row is sliced to remove the items in indices lower then the `minIndex`.\n    //\n    // All of this is to make the paste start without leading cell separators.\n    let minIndex = Number.MAX_SAFE_INTEGER;\n\n    for (const point of contextApi.selectedCells) {\n      const col = columnApi.columns[point.colIndex];\n      if (col) {\n        const colIndex = columnApi.renderIndexOf(col);\n        if (colIndex > -1) {\n          const rowIndex = contextApi.findRowInCache(point.rowIdent).dsIndex;\n          const dataItem = col.getValue(grid.ds.source[rowIndex]);\n          const row = data.get(point.rowIdent) || [];\n          row[colIndex] = dataItem;\n          data.set(point.rowIdent, row);\n          minIndex = Math.min(minIndex, colIndex);\n        }\n      }\n    }\n\n    // contextApi.selectedCells are un-ordered, their order is based on the order in which user have selected cells.\n    // It means that the row's will not paste in the proper order unless we re-order them based on the data index.\n    // This is a very native and simple implementation that will hold most copy actions 1k +-\n    // TODO: Consider a better logic, taking performance into consideration.\n\n    const entries = Array.from(data.entries());\n    entries.sort((a, b) => {\n      const aIndex = contextApi.findRowInCache(a[0]).dsIndex;\n      const bIndex = contextApi.findRowInCache(b[0]).dsIndex;\n      if (aIndex < bIndex) {\n        return -1;\n      } else {\n        return 1;\n      }\n    });\n\n    return {\n      minIndex,\n      rows: entries.map( e => e[1] ),\n    };\n  }\n\n  private init(): void {\n    this._removePlugin = this.pluginCtrl.setPlugin(PLUGIN_KEY, this);\n\n    this.pluginCtrl.ensurePlugin('targetEvents');\n\n    const targetEvents = this.pluginCtrl.getPlugin('targetEvents');\n    targetEvents.keyDown\n      .pipe(\n        filter( event => this.isCopyEvent(event.source) ),\n        unrx(this)\n      )\n      .subscribe( event => this.doCopy() );\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { PblNgridModule, PblNgridConfigService, PblNgridPluginController, ngridPlugin } from '@pebula/ngrid';\nimport { PblNgridTargetEventsModule } from '@pebula/ngrid/target-events';\n\nimport { PLUGIN_KEY, PblNgridClipboardPlugin } from './clipboard.plugin';\n\n@NgModule({\n  imports: [ CommonModule, PblNgridModule, PblNgridTargetEventsModule ],\n  declarations: [ PblNgridClipboardPlugin ],\n  exports: [ PblNgridClipboardPlugin ],\n})\nexport class PblNgridClipboardPluginModule {\n\n  static readonly NGRID_PLUGIN = ngridPlugin({ id: PLUGIN_KEY, factory: 'create' }, PblNgridClipboardPlugin);\n\n  constructor(configService: PblNgridConfigService) {\n    PblNgridPluginController.onCreatedSafe(\n      PblNgridClipboardPluginModule,\n      (grid, controller) => {\n        const config = configService.get(PLUGIN_KEY, {});\n        if (config.autoEnable === true) {\n          controller.onInit()\n            .subscribe(() => {\n              if (!controller.hasPlugin(PLUGIN_KEY)) {\n                controller.createPlugin(PLUGIN_KEY);\n              }\n            });\n        }\n      },\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;AAoCA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;AAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,eAAe,GAAG,IAAI,CAAC;AAEtB,MAAM,UAAU,GAAgB,YAAY;MAGtC,uBAAuB,CAAA;AAyBlC,IAAA,WAAA,CAAmB,IAA4B,EAAY,QAAkB,EAAY,UAAoC,EAAA;AAA1G,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAwB;AAAY,QAAA,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;AAAY,QAAA,IAAU,CAAA,UAAA,GAAV,UAAU,CAA0B;QAC3H,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QACjD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;KACb;AA3BD,IAAA,OAAO,MAAM,CAAC,IAAuB,EAAE,QAAkB,EAAA;QACvD,MAAM,UAAU,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,IAAI,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;KAChE;IA0BD,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;AAES,IAAA,WAAW,CAAC,KAAY,EAAA;QAChC,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACvD,YAAA,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE;AAC3D,gBAAA,OAAO,IAAI,CAAC;AACb,aAAA;AACF,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;IAES,MAAM,GAAA;AACd,QAAA,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACzE,QAAA,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,CAAC,GAAU,KAAK,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,IAAI,gBAAgB,CAAC,CAAC;;QAGjH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,IAAI,eAAe,CAAC,CAAC,CAAC;;KAElG;AAES,IAAA,kBAAkB,CAAC,IAAuB,EAAA;AAClD,QAAA,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;;;;;;;AAQnC,QAAA,IAAI,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEvC,QAAA,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,aAAa,EAAE;YAC5C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9C,YAAA,IAAI,GAAG,EAAE;gBACP,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC9C,gBAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE;AACjB,oBAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;AACnE,oBAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxD,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC3C,oBAAA,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;oBACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC9B,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzC,iBAAA;AACF,aAAA;AACF,SAAA;;;;;QAOD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACpB,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,IAAI,MAAM,GAAG,MAAM,EAAE;gBACnB,OAAO,CAAC,CAAC,CAAC;AACX,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,CAAC,CAAC;AACV,aAAA;AACH,SAAC,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ;AACR,YAAA,IAAI,EAAE,OAAO,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE;SAC/B,CAAC;KACH;IAEO,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAEjE,QAAA,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AAC/D,QAAA,YAAY,CAAC,OAAO;aACjB,IAAI,CACH,MAAM,CAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAE,EACjD,IAAI,CAAC,IAAI,CAAC,CACX;aACA,SAAS,CAAE,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAE,CAAC;KACxC;;uIApHU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;2HAAvB,uBAAuB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;YAAC,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAA;sKAanE,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAOG,SAAS,EAAA,CAAA;sBAAjB,KAAK;;;MCjDK,6BAA6B,CAAA;AAIxC,IAAA,WAAA,CAAY,aAAoC,EAAA;QAC9C,wBAAwB,CAAC,aAAa,CACpC,6BAA6B,EAC7B,CAAC,IAAI,EAAE,UAAU,KAAI;YACnB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACjD,YAAA,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE;gBAC9B,UAAU,CAAC,MAAM,EAAE;qBAChB,SAAS,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;AACrC,wBAAA,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AACrC,qBAAA;AACH,iBAAC,CAAC,CAAC;AACN,aAAA;AACH,SAAC,CACF,CAAC;KACH;;AAjBe,6BAAA,CAAA,YAAY,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;6IAFhG,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;8IAA7B,6BAA6B,EAAA,YAAA,EAAA,CAHxB,uBAAuB,CAD5B,EAAA,OAAA,EAAA,CAAA,YAAY,EAAE,cAAc,EAAE,0BAA0B,CAAA,EAAA,OAAA,EAAA,CAExD,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAEvB,mBAAA,6BAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,EAJ7B,OAAA,EAAA,CAAA,YAAY,EAAE,cAAc,EAAE,0BAA0B,CAAA,EAAA,CAAA,CAAA;2FAIxD,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAE,YAAY,EAAE,cAAc,EAAE,0BAA0B,CAAE;oBACrE,YAAY,EAAE,CAAE,uBAAuB,CAAE;oBACzC,OAAO,EAAE,CAAE,uBAAuB,CAAE;iBACrC,CAAA;;;ACZD;;AAEG;;;;"}