ng-devui
Version:
DevUI components based on Angular
1 lines • 76.1 kB
Source Map (JSON)
{"version":3,"file":"ng-devui-dashboard.mjs","sources":["../../devui/dashboard/grid-stack.config.ts","../../devui/dashboard/grid-stack.service.ts","../../devui/dashboard/polyfill.ts","../../devui/dashboard/widget/widget.component.ts","../../devui/dashboard/widget/widget.component.html","../../devui/dashboard/dashboard.component.ts","../../devui/dashboard/dashboard.component.html","../../devui/dashboard/widget-library/library-panel.directive.ts","../../devui/dashboard/widget-library/library-trash.directive.ts","../../devui/dashboard/widget-library/library-widget.directive.ts","../../devui/dashboard/dashboard.module.ts","../../devui/dashboard/ng-devui-dashboard.ts"],"sourcesContent":["import { GridStackNode, GridStackOptions } from 'gridstack';\nconst isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n window.navigator.userAgent\n);\nconst dragDropOption = {\n alwaysShowResizeHandle: isMobile,\n resizable: {\n autoHide: !isMobile,\n handles: 'se'\n },\n acceptWidgets: '.grid-stack-new-item',\n dragIn: '.grid-stack-new-item', // class that can be dragged from outside\n dragInOptions: { revert: 'invalid', scroll: true, appendTo: 'body', helper: 'clone' },\n removable: '.grid-stack-library-trash', // drag-out delete class\n removeTimeout: 10,\n};\nconst displayOption = {\n column: 12,\n cellHeight: 160,\n margin: 8,\n float: true,\n};\nexport const DashBoardGridStackDefaultOption: GridStackOptions = {\n ...displayOption,\n ...dragDropOption,\n disableDrag: false,\n disableResize: false,\n animate: true\n};\nexport interface GridStackNodeCompatibleWithV2 {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\nexport interface GridStackNodeCompatible extends GridStackNode, GridStackNodeCompatibleWithV2 {}\n","import { Injectable, isDevMode } from '@angular/core';\r\nimport { DDGridStack, GridItemHTMLElement, GridStack, GridStackNode, Utils } from 'gridstack';\r\nimport { DDElement } from 'gridstack/dist/dd-element';\r\nimport { DashboardComponent } from './dashboard.component';\r\nimport { DashboardLibraryTrashDirective } from './widget-library/library-trash.directive';\r\nimport { DashboardLibraryWidgetDirective } from './widget-library/library-widget.directive';\r\n@Injectable()\r\nexport class GridStackService {\r\n gridStack: GridStack;\r\n dragInWidget: DashboardLibraryWidgetDirective;\r\n lastColumn: number;\r\n lastStyleSheet: CSSStyleSheet;\r\n\r\n getDD() {\r\n return DDGridStack.get() as DDGridStack;\r\n }\r\n\r\n static cleanDragIn(el: HTMLElement) {\r\n if (el.classList.contains('ui-draggable')) {\r\n (DDGridStack.get() as DDGridStack).draggable(el, 'destroy');\r\n }\r\n }\r\n static isDraggable(el: HTMLElement) {\r\n return Boolean(el.classList.contains('ui-draggable'));\r\n }\r\n static isDroppable(el: HTMLElement) {\r\n return Boolean(el.classList.contains('ui-droppable'));\r\n }\r\n static enableDrag(el: HTMLElement) {\r\n if (!GridStackService.isDraggable(el)) {\r\n return;\r\n }\r\n (DDGridStack.get() as DDGridStack).draggable(el, 'enable');\r\n }\r\n static disableDrag(el: HTMLElement) {\r\n if (!GridStackService.isDraggable(el)) {\r\n return;\r\n }\r\n (DDGridStack.get() as DDGridStack).draggable(el, 'disable');\r\n }\r\n static enableDrop(el: HTMLElement) {\r\n if (!GridStackService.isDroppable(el)) {\r\n return;\r\n }\r\n (DDGridStack.get() as DDGridStack).droppable(el, 'enable');\r\n }\r\n static disableDrop(el: HTMLElement) {\r\n if (!GridStackService.isDroppable(el)) {\r\n return;\r\n }\r\n (DDGridStack.get() as DDGridStack).droppable(el, 'disable');\r\n }\r\n _itemRemoving = (el: GridItemHTMLElement, remove: boolean) => {\r\n const node = el ? el.gridstackNode : undefined;\r\n if (!node || !node.grid) {\r\n return;\r\n }\r\n remove ? ((node as any)._isAboutToRemove = true) : delete (node as any)._isAboutToRemove;\r\n remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\r\n };\r\n resetAcceptWidget(dashboard: DashboardComponent) {\r\n if (!this.gridStack) {\r\n if (isDevMode()) {\r\n console.warn('call resetAcceptWidget after gridStack init');\r\n }\r\n return;\r\n }\r\n if (this.gridStack.opts.staticGrid || !this.gridStack.opts.acceptWidgets) {\r\n return;\r\n }\r\n if (!this.getDD().isDroppable(this.gridStack.el)) {\r\n const that = this.gridStack;\r\n this.getDD().droppable(that.el, {\r\n accept: (el: GridItemHTMLElement) => {\r\n const node: GridStackNode = el.gridstackNode;\r\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\r\n if (node && node.grid === that) {\r\n return true;\r\n }\r\n if (!that.opts.acceptWidgets) {\r\n return false;\r\n }\r\n // check for accept method or class matching\r\n let canAccept = true;\r\n if (typeof that.opts.acceptWidgets === 'function') {\r\n canAccept = that.opts.acceptWidgets(el);\r\n } else {\r\n const selector = that.opts.acceptWidgets === true ? '.grid-stack-item' : (that.opts.acceptWidgets as string);\r\n canAccept = el.matches(selector);\r\n }\r\n // finally check to make sure we actually have space left #1571\r\n if (canAccept && node && that.opts.maxRow) {\r\n const n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition\r\n canAccept = that.engine.willItFit(n);\r\n }\r\n return canAccept;\r\n },\r\n });\r\n }\r\n this.getDD()\r\n .off(this.gridStack.el, 'dropout')\r\n .on(this.gridStack.el, 'dropout', (event, el: GridItemHTMLElement, helper) => {\r\n // 覆盖这个方法是因为 float模式下 dropout影响了原来的布局\r\n const that: any = this.gridStack;\r\n const node = el.gridstackNode;\r\n if (!node.grid || node.grid === that) {\r\n that._leave(el, helper);\r\n }\r\n this.getDD().off(el, 'drag');\r\n return false;\r\n })\r\n .off(this.gridStack.el, 'drop')\r\n .on(this.gridStack.el, 'drop', (event, el: GridItemHTMLElement, helper: GridItemHTMLElement) => {\r\n // 覆盖这个方法是因为 drop的情况不想让它放进去而是只发射通知\r\n const that: any = this.gridStack;\r\n\r\n const node: GridStackNode = el.gridstackNode;\r\n if (node && node.grid === that && !(node as any)._isExternal) {\r\n return false;\r\n }\r\n\r\n const wasAdded = !!that.placeholder.parentElement;\r\n that.placeholder.remove();\r\n\r\n const origNode = (el as any)._gridstackNodeOrig;\r\n delete (el as any)._gridstackNodeOrig;\r\n\r\n if (!node) {\r\n return false;\r\n }\r\n if (wasAdded) {\r\n that.engine.cleanupNode(node); // 好像没用\r\n node.grid = that;\r\n }\r\n\r\n if (helper !== el) {\r\n helper.remove();\r\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\r\n } else {\r\n Utils.removePositioningStyles(el);\r\n }\r\n\r\n this.getDD().off(el, 'drag');\r\n that.engine.removeNode(node);\r\n\r\n that._updateContainerHeight();\r\n\r\n dashboard.handleDragInNode(node, origNode, this.dragInWidget);\r\n });\r\n }\r\n resetRemoveDrop(dashboard: DashboardComponent) {\r\n if (!this.gridStack) {\r\n if (isDevMode()) {\r\n console.warn('call resetDragDrop after gridStack init');\r\n }\r\n return;\r\n }\r\n if (!(!this.gridStack.opts.staticGrid && typeof this.gridStack.opts.removable === 'string')) {\r\n return;\r\n }\r\n const trashZone = document.querySelector(this.gridStack.opts.removable) as HTMLElement;\r\n if (!trashZone) {\r\n return;\r\n }\r\n if (this.getDD().isDroppable(trashZone)) {\r\n // 清理掉了dropover和dropout 直接重新绑定对应的逻辑\r\n this.getDD().off(trashZone, 'dropover').off(trashZone, 'dropout');\r\n }\r\n }\r\n /* 设置新的可拖入的widget */\r\n setupDragIn(\r\n el: HTMLElement,\r\n widget: DashboardLibraryWidgetDirective,\r\n helper?: ((event: any) => HTMLElement) | string,\r\n notify?: (eventType: string) => (...args: any) => void\r\n ) {\r\n const _ddElement = DDElement.init(el);\r\n _ddElement.setupDraggable({\r\n ...widget.targetDashboard.finalOption.dragInOptions,\r\n ...{ helper: helper || widget.targetDashboard.finalOption.dragInOptions.helper, handle: this.gridStack.opts.handle },\r\n ...{\r\n start: () => {\r\n this.dragInWidget = widget;\r\n if (notify) {\r\n notify('dragStart')();\r\n }\r\n },\r\n stop: () => {\r\n // TODO: 升级gridstack@6.0.0后drop内dragInWidget一直为undefined ,因此删掉了 this.dragInWidget = undefined;\r\n if (notify) {\r\n notify('dragStop')();\r\n }\r\n },\r\n },\r\n });\r\n }\r\n destroyDragIn(el: HTMLElement) {\r\n this.getDD().draggable(el, 'destroy');\r\n }\r\n\r\n /* 设置自定义的回收站 */\r\n setupRemoveDropArea(trashZone: HTMLElement, dashboard: DashboardComponent, trash?: DashboardLibraryTrashDirective) {\r\n if (!this.gridStack) {\r\n if (isDevMode()) {\r\n console.warn('call setupRemoveDropArea after gridStack init');\r\n }\r\n return;\r\n }\r\n const trashEl = trashZone;\r\n this.getDD()\r\n .droppable(trashEl, this.gridStack.opts.removableOptions)\r\n .on(trashEl, 'dropover', (event, el) => this._itemRemoving(el, true))\r\n .on(trashEl, 'dropout', (event, el) => this._itemRemoving(el, false));\r\n }\r\n\r\n /* 清理自定义的回收站 */\r\n destroyRemoveDropAreas(trashZone: HTMLElement) {\r\n if (!this.gridStack) {\r\n console.warn('call destroyRemoveDropAreas after gridStack init');\r\n return;\r\n }\r\n const that = this.gridStack;\r\n if (!this.getDD().isDroppable(trashZone)) {\r\n return;\r\n }\r\n this.getDD().off(trashZone, 'dropover').off(trashZone, 'dropout').off(trashZone, 'drop');\r\n }\r\n\r\n // 设置背景\r\n updateBackgroundGridBlock() {\r\n if (this.gridStack) {\r\n if (!this.lastStyleSheet) {\r\n this.lastStyleSheet = Utils.createStylesheet(\r\n `d-dashboard-${(this.gridStack.opts as any)._styleSheetClass}`,\r\n this.gridStack.el.parentElement\r\n );\r\n } else {\r\n this.lastStyleSheet.removeRule(0);\r\n }\r\n const column = this.gridStack.opts.column as number;\r\n const margin = this.gridStack.opts.margin as number;\r\n const marginUnit = this.gridStack.opts.marginUnit;\r\n const cellHeight = this.gridStack.opts.cellHeight as number;\r\n const cellHeightUnit = this.gridStack.opts.cellHeightUnit;\r\n const prefix = `.${(this.gridStack.opts as any)._styleSheetClass}`;\r\n if (!this.lastStyleSheet) {\r\n return;\r\n }\r\n\r\n Utils.addCSSRule(\r\n this.lastStyleSheet,\r\n `${prefix}.d-dashboard-show-grid-block::before`,\r\n `\r\n background-image:\r\n linear-gradient(#fff 0, #fff ${margin * 2}${marginUnit},\r\n transparent ${margin * 2}${marginUnit}, transparent 100%),\r\n linear-gradient(90deg, #fff 0, #fff ${margin * 2}${marginUnit},\r\n transparent ${margin * 2}${marginUnit}, transparent 100%),\r\n linear-gradient(#f8f8f8 0 , #f8f8f8 100%);\r\n background-image:\r\n linear-gradient(var(--devui-base-bg, #fff) 0, var(--devui-base-bg, #fff) ${margin * 2}${marginUnit},\r\n transparent ${margin * 2}${marginUnit}, transparent 100%),\r\n linear-gradient(90deg, var(--devui-base-bg, #fff) 0, var(--devui-base-bg, #fff) ${margin * 2}${marginUnit},\r\n transparent ${margin * 2}${marginUnit}, transparent 100%),\r\n linear-gradient(var(--devui-area, #f8f8f8) 0 , var(--devui-area, #f8f8f8) 100%);\r\n background-size: ${100 / column}% ${cellHeight}${cellHeightUnit};\r\n background-position: -${margin}${marginUnit} -${margin}${marginUnit};\r\n `\r\n );\r\n this.lastColumn = column;\r\n }\r\n }\r\n\r\n setBackgroundGridBlockIfColumnChange() {\r\n if (this.gridStack?.opts?.column !== this.lastColumn) {\r\n this.updateBackgroundGridBlock();\r\n }\r\n }\r\n\r\n removeBackgroundGridBlockStyleSheet() {\r\n if (this.lastStyleSheet) {\r\n Utils.removeStylesheet(`d-dashboard-${(this.gridStack.opts as any)._class}`);\r\n }\r\n }\r\n}\r\n","/* eslint-disable */\r\n// Source: https://github.com/jserz/js_piece/blob/master/DOM/ParentNode/append()/append().md\r\nexport default ((...rest) => {\r\n const arr = rest[0];\r\n arr.forEach((item) => {\r\n if (Object.prototype.hasOwnProperty.call(item, 'append')) {\r\n return;\r\n }\r\n Object.defineProperty(item, 'append', {\r\n configurable: true,\r\n enumerable: true,\r\n writable: true,\r\n value: function append() {\r\n const argArr = [...rest];\r\n const docFrag = document.createDocumentFragment();\r\n\r\n argArr.forEach((argItem) => {\r\n const isNode = argItem instanceof Node;\r\n docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));\r\n });\r\n\r\n this.appendChild(docFrag);\r\n },\r\n });\r\n });\r\n})([Element.prototype, Document.prototype, DocumentFragment.prototype]);\r\n","import {\n Component,\n ElementRef,\n Input,\n ChangeDetectionStrategy,\n HostBinding,\n EventEmitter,\n Output,\n OnChanges,\n SimpleChanges,\n Optional,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport { GridStackNode, GridStackWidget } from 'gridstack';\nimport { GridStackNodeCompatible } from '../grid-stack.config';\nimport { GridStackService } from '../grid-stack.service';\n\nexport type DashboardWidget = GridStackWidget & {\n widgetData?: any;\n [prop: string]: any;\n};\n\n@Component({\n selector: 'd-dashboard-widget',\n templateUrl: './widget.component.html',\n styleUrls: ['./widget.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'dDashboardWidget',\n preserveWhitespaces: false\n})\nexport class DashboardWidgetComponent implements GridStackNode, OnChanges, AfterViewInit, OnDestroy {\n static autoNumberedId = 0;\n @HostBinding('attr.gs-x')\n @Input()\n x: number;\n @Output() xChange = new EventEmitter<number>();\n\n @HostBinding('attr.gs-y')\n @Input()\n y: number;\n @Output() yChange = new EventEmitter<number>();\n\n @HostBinding('attr.gs-w')\n @Input()\n width: number;\n @Output() widthChange = new EventEmitter<number>();\n\n @HostBinding('attr.gs-h')\n @Input()\n height: number;\n @Output() heightChange = new EventEmitter<number>();\n\n @HostBinding('attr.gs-id')\n @Input()\n id: string;\n\n @HostBinding('attr.gs-max-w')\n @Input()\n maxWidth: number;\n\n @HostBinding('attr.gs-max-h')\n @Input()\n maxHeight: number;\n\n @HostBinding('attr.gs-min-w')\n @Input()\n minWidth: number;\n\n @HostBinding('attr.gs-min-h')\n @Input()\n minHeight: number;\n\n @HostBinding('attr.gs-no-resize')\n @Input()\n noResize: boolean;\n\n @HostBinding('attr.gs-no-move')\n @Input()\n noMove: boolean;\n\n @HostBinding('attr.gs-auto-position')\n @Input()\n autoPosition: boolean; // 仅初始化有效,默认为false\n\n @HostBinding('attr.gs-locked')\n @Input()\n locked: boolean;\n\n @Input() widgetData;\n\n @Output() widgetInit = new EventEmitter(true);\n @Output() widgetResize = new EventEmitter<{ width: number; height: number } | null>(true);\n @Output() widgetDestroy = new EventEmitter();\n\n @HostBinding('class.grid-stack-item')\n hostBinding = true;\n\n generatedId: string = (DashboardWidgetComponent.autoNumberedId++).toString();\n\n constructor(public elem: ElementRef, @Optional() private gridStackService: GridStackService) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.gridStackService && this.gridStackService.gridStack) {\n if (changes.x || changes.y || changes.width || changes.height) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { x: this.x, y: this.y, w: this.width, h: this.height });\n }\n if (changes.noResize) {\n this.gridStackService.gridStack.resizable(this.elem.nativeElement, !this.noResize);\n }\n if (changes.noMove) {\n this.gridStackService.gridStack.movable(this.elem.nativeElement, !this.noMove);\n }\n if (changes.locked) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { locked: !!this.locked });\n }\n if (changes.maxWidth) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { maxW: this.maxWidth });\n }\n if (changes.maxHeight) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { maxH: this.maxHeight });\n }\n if (changes.minWidth) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { minW: this.minWidth });\n }\n if (changes.minHeight) {\n this.gridStackService.gridStack.update(this.elem.nativeElement, { minH: this.minHeight });\n }\n }\n }\n\n ngAfterViewInit() {\n this.widgetInit.emit();\n }\n ngOnDestroy() {\n this.widgetDestroy.emit();\n }\n\n handleChange({ x, y, width, height }: GridStackNodeCompatible) {\n const change = { x, y, width, height};\n const beforeChange = { width: this.width, height: this.height };\n Object.keys(change).forEach((key) => {\n if (change[key] !== this[key]) {\n this[key] = change[key];\n const eventEmitter = this[key + 'Change'] as EventEmitter<number>;\n if (eventEmitter) {\n eventEmitter.emit(change[key]);\n }\n }\n });\n if (change.width !== beforeChange.width || change.height !== beforeChange.height) {\n this.widgetResize.emit({ width, height});\n }\n }\n}\n","<div class=\"grid-stack-item-content d-dashboard-widget devui-scrollbar\">\n <ng-content></ng-content>\n</div>\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n isDevMode,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n QueryList,\r\n Renderer2,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { GridStack, GridStackNode, GridStackOptions } from 'gridstack';\r\nimport { DashBoardGridStackDefaultOption, GridStackNodeCompatible } from './grid-stack.config';\r\nimport { GridStackService } from './grid-stack.service';\r\nimport './polyfill';\r\nimport { DashboardLibraryTrashDirective } from './widget-library/library-trash.directive';\r\nimport { DashboardLibraryWidgetDirective } from './widget-library/library-widget.directive';\r\nimport { DashboardWidgetComponent } from './widget/widget.component';\r\n\r\nexport type DashboardWidgetEvent = Array<{\r\n widget?: DashboardWidgetComponent; // change, remove\r\n node?: GridStackNodeCompatible & {\r\n widgetData?: any; // add\r\n willItFit?: boolean;\r\n trashData?: any; // remove\r\n };\r\n origNode?: GridStackNodeCompatible;\r\n}>;\r\n\r\n@Component({\r\n selector: 'd-dashboard',\r\n templateUrl: './dashboard.component.html',\r\n styleUrls: ['./dashboard.component.scss'],\r\n providers: [GridStackService],\r\n exportAs: 'dDashboard',\r\n preserveWhitespaces: false,\r\n})\r\nexport class DashboardComponent implements OnChanges, AfterViewInit, OnDestroy {\r\n public get gridStack() {\r\n return this.gridStackService?.gridStack;\r\n }\r\n @ContentChildren(DashboardWidgetComponent, { descendants: true }) widgetComponents: QueryList<DashboardWidgetComponent>;\r\n @Input() initOptions: GridStackOptions;\r\n\r\n /* move resize setting*/\r\n @Input() static: boolean;\r\n @Input() float: boolean;\r\n @Input() animate: boolean;\r\n @Input() widgetMoveable: boolean;\r\n @Input() widgetResizable: boolean;\r\n\r\n @HostBinding('class.d-dashboard-show-grid-block')\r\n @Input()\r\n showGridBlock = false;\r\n\r\n /* layout setting */\r\n @Input() column: number;\r\n @HostBinding('attr.gs-min-row')\r\n @Input()\r\n minRow: number;\r\n @HostBinding('attr.gs-max-row')\r\n @Input()\r\n maxRow: number;\r\n @Input() cellHeight: number | string;\r\n @Input() margin: number | string;\r\n\r\n @Output() widgetAdded = new EventEmitter<DashboardWidgetEvent>();\r\n @Output() widgetChanged = new EventEmitter<DashboardWidgetEvent>();\r\n @Output() widgetRemoved = new EventEmitter<DashboardWidgetEvent>();\r\n @Output() dashboardInit = new EventEmitter();\r\n\r\n finalOption: GridStackOptions;\r\n renderedWidgets: Array<DashboardWidgetComponent>;\r\n\r\n @HostBinding('class.grid-stack') addClass = true;\r\n\r\n constructor(\r\n public el: ElementRef,\r\n private cdr: ChangeDetectorRef,\r\n private renderer: Renderer2,\r\n public gridStackService: GridStackService\r\n ) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (this.gridStack) {\r\n if (changes.static) {\r\n this.gridStack.setStatic(!!this.static);\r\n if (!this.static) {\r\n this.gridStackService.resetAcceptWidget(this);\r\n }\r\n }\r\n if (changes.float) {\r\n this.gridStack.float(!!this.float);\r\n }\r\n if (changes.animate) {\r\n this.gridStack.setAnimation(!!this.animate);\r\n }\r\n if (changes.widgetMoveable) {\r\n this.gridStack.enableMove(!this.static && this.widgetMoveable);\r\n }\r\n if (changes.widgetResizable) {\r\n this.gridStack.enableResize(!this.static && this.widgetResizable);\r\n }\r\n if (changes.column && this.column !== undefined) {\r\n this.gridStack.column(this.column);\r\n this.gridStackService.updateBackgroundGridBlock();\r\n }\r\n if (changes.maxRow) {\r\n this.gridStack.engine.maxRow = this.maxRow || 0;\r\n }\r\n if (changes.cellHeight) {\r\n this.gridStack.cellHeight(this.cellHeight, true);\r\n this.gridStackService.updateBackgroundGridBlock();\r\n }\r\n if (changes.margin) {\r\n this.gridStack.margin(this.margin);\r\n this.gridStackService.updateBackgroundGridBlock();\r\n }\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.finalOption = { ...DashBoardGridStackDefaultOption, ...this.initOptions, ...this.getTransformOption() };\r\n this.renderer.addClass(this.el.nativeElement, 'grid-stack-' + this.finalOption.column);\r\n this.gridStackService.gridStack = GridStack.init(this.finalOption, this.el.nativeElement);\r\n this.gridStackService.resetAcceptWidget(this);\r\n this.gridStackService.resetRemoveDrop(this);\r\n this.gridStackService.updateBackgroundGridBlock();\r\n\r\n this.renderedWidgets = this.widgetComponents.toArray();\r\n setTimeout(() => {\r\n this.renderedWidgets.forEach((widget) =>\r\n widget.handleChange(this.addGridStackNodeCompatible(widget.elem.nativeElement.gridstackNode))\r\n );\r\n });\r\n this.widgetComponents.changes.subscribe((changes) => {\r\n this.handleItemChanges(this.renderedWidgets, this.widgetComponents.toArray());\r\n this.renderedWidgets = this.widgetComponents.toArray();\r\n });\r\n this.dashboardInit.emit();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.gridStackService && this.gridStackService.gridStack) {\r\n this.gridStackService.removeBackgroundGridBlockStyleSheet();\r\n this.gridStackService.gridStack.destroy();\r\n }\r\n }\r\n\r\n private getTransformOption() {\r\n const option = {};\r\n const getOppositeKeepUndefined = (v) => {\r\n if (v === undefined) {\r\n return undefined;\r\n }\r\n return !v;\r\n };\r\n\r\n Object.assign(option, {\r\n column: this.column,\r\n cellHeight: this.cellHeight,\r\n margin: this.margin,\r\n minRow: this.minRow,\r\n maxRow: this.maxRow,\r\n staticGrid: this.static,\r\n float: this.float,\r\n animate: this.animate,\r\n disableDrag: getOppositeKeepUndefined(this.widgetMoveable),\r\n disableResize: getOppositeKeepUndefined(this.widgetResizable),\r\n });\r\n\r\n Object.keys(option).forEach((k) => {\r\n if (option[k] === undefined) {\r\n delete option[k];\r\n }\r\n });\r\n return option;\r\n }\r\n\r\n private handleItemChanges(renderedItems: DashboardWidgetComponent[], items: DashboardWidgetComponent[]): void {\r\n const itemsToAdd = items.filter((i) => !renderedItems.some((w) => w === i));\r\n const itemsToRemove = renderedItems.filter((w) => !items.some((i) => w === i));\r\n this.gridStack.batchUpdate();\r\n itemsToAdd.forEach((i) => this.gridStack.addWidget(i.elem.nativeElement));\r\n itemsToRemove.forEach((i) => this.gridStack.removeWidget(i.elem.nativeElement));\r\n this.gridStack.commit();\r\n }\r\n\r\n public batchUpdate() {\r\n this.cdr.detach();\r\n }\r\n public commit() {\r\n this.cdr.detectChanges();\r\n this.cdr.reattach();\r\n }\r\n\r\n @HostListener('added', ['$event', '$event.detail'])\r\n public addedHandler = (event, items: GridStackNode[]) => {\r\n setTimeout(() => {\r\n const all = items.map((item) => ({\r\n node: this.addGridStackNodeCompatible(item),\r\n widget: this.widgetComponents.toArray().find((widget) => item.el === widget.elem.nativeElement),\r\n }));\r\n\r\n // 处理ContentChildren数据推送进来的\r\n all\r\n .filter((wd) => wd.widget)\r\n .forEach(({ node, widget }) => {\r\n widget.handleChange(node);\r\n });\r\n });\r\n };\r\n\r\n @HostListener('change', ['$event', '$event.detail'])\r\n public changeHandler = (event, items: GridStackNode[]) => {\r\n if (!this.gridStack) {\r\n return;\r\n }\r\n if (!(this.gridStack as any)._oneColumnMode) {\r\n setTimeout(() => {\r\n const all = items.map((item) => ({\r\n node: this.addGridStackNodeCompatible(item),\r\n widget: this.renderedWidgets.find((widget) => item.el === widget.elem.nativeElement),\r\n }));\r\n // 处理UI操作调整大小/调整位置\r\n all\r\n .filter((w) => w.widget)\r\n .forEach(({ node, widget }) => {\r\n widget.handleChange(node);\r\n });\r\n if (isDevMode() && all.some((w) => !w.widget)) {\r\n console.warn('remove: something wrong, not handled by dashboard');\r\n }\r\n this.widgetChanged.emit(all.filter((w) => w.widget));\r\n });\r\n }\r\n if (this.showGridBlock) {\r\n this.gridStackService.setBackgroundGridBlockIfColumnChange();\r\n }\r\n };\r\n\r\n @HostListener('removed', ['$event', '$event.detail'])\r\n public removedHandler = (event, items: GridStackNode[]) => {\r\n const all = items.map((item) => ({\r\n node: this.addGridStackNodeCompatible(item),\r\n widget: this.renderedWidgets.find((widget) => item.el === widget.elem.nativeElement),\r\n }));\r\n // 不做处理仅提醒部分组件的移除不能被dashboard所理解\r\n if (isDevMode() && all.some((wd) => !wd.widget)) {\r\n console.warn('remove: something wrong, not handled by dashboard');\r\n }\r\n };\r\n\r\n handleDragInNode(node: GridStackNode, origNode: GridStackNode, widget: DashboardLibraryWidgetDirective) {\r\n this.widgetAdded.emit([\r\n {\r\n node: {\r\n ...this.addGridStackNodeCompatible(node),\r\n widgetData: widget.widgetData,\r\n willItFit: this.willItFit(node.x, node.y, widget.width, widget.height),\r\n },\r\n // origNode: this.addGridStackNodeCompatible(origNode),\r\n },\r\n ]);\r\n }\r\n\r\n handleDragOutNode(node: GridStackNode, dropArea: DashboardLibraryTrashDirective) {\r\n this.widgetRemoved.emit([\r\n {\r\n widget: this.renderedWidgets.find((widget) => node.el === widget.elem.nativeElement),\r\n node: {\r\n ...this.addGridStackNodeCompatible(node),\r\n trashData: dropArea.trashData,\r\n },\r\n },\r\n ]);\r\n }\r\n\r\n private addGridStackNodeCompatible(item: GridStackNode): GridStackNodeCompatible {\r\n return {\r\n ...item,\r\n ...{\r\n x: item.x,\r\n y: item.y,\r\n width: item.w,\r\n height: item.h,\r\n },\r\n };\r\n }\r\n\r\n public getCurrentColumn() {\r\n if (!this.gridStack) {\r\n return null;\r\n }\r\n return this.gridStack.getColumn();\r\n }\r\n public getCurrentRow() {\r\n if (!this.gridStack) {\r\n return null;\r\n }\r\n return this.gridStack.getRow();\r\n }\r\n public getCurrentColumnWidth() {\r\n if (!this.gridStack) {\r\n return null;\r\n }\r\n return this.gridStack.cellWidth();\r\n }\r\n public getCurrentCellHeight() {\r\n if (!this.gridStack) {\r\n return null;\r\n }\r\n return this.gridStack.getCellHeight();\r\n }\r\n public getCurrentMargin() {\r\n if (!this.gridStack) {\r\n return null;\r\n }\r\n return this.gridStack.getMargin();\r\n }\r\n\r\n public compact() {\r\n if (!this.gridStack) {\r\n return;\r\n }\r\n this.gridStack.compact();\r\n }\r\n\r\n public willItFit(x: number, y: number, width: number, height: number, autoPosition = false): boolean {\r\n if (!this.gridStack) {\r\n return;\r\n }\r\n return this.gridStack.willItFit({ x, y, w: width, h: height, autoPosition });\r\n }\r\n}\r\n","<ng-content></ng-content>\n","import { Directive, EventEmitter, Output } from '@angular/core';\n\n@Directive({\n selector: '[dDashboardLibraryPanel]',\n})\nexport class DashboardLibraryPanelDirective {\n @Output() widgetDragStart = new EventEmitter();\n @Output() widgetDragStop = new EventEmitter();\n dragStartHandler() {\n this.widgetDragStart.emit();\n }\n dragStopHandler() {\n this.widgetDragStop.emit();\n }\n}\n","import { AfterViewInit, Directive, ElementRef, HostBinding, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { DashboardComponent } from '../dashboard.component';\nimport { GridStackService } from '../grid-stack.service';\n\n@Directive({\n selector: '[dDashboardLibraryTrash]',\n})\nexport class DashboardLibraryTrashDirective implements OnChanges, OnDestroy, AfterViewInit {\n @Input() targetDashboard: DashboardComponent;\n @Input() trashData;\n @Input() dropDisabled = false;\n\n @HostBinding('class.grid-stack-library-trash')\n hostBinding = true;\n\n isSetup = false;\n\n get gridStackService() {\n return this.targetDashboard?.gridStackService;\n }\n\n constructor (private el: ElementRef) {}\n ngAfterViewInit() {\n this.setup();\n }\n ngOnChanges(changes: SimpleChanges) {\n if (changes.targetDashBoard) {\n this.setup();\n }\n if (changes.dropDisabled) {\n if (this.dropDisabled) {\n GridStackService.disableDrop(this.el.nativeElement);\n } else {\n GridStackService.enableDrop(this.el.nativeElement);\n }\n }\n }\n\n ngOnDestroy() {\n if (this.gridStackService && this.isSetup) {\n this.gridStackService.destroyRemoveDropAreas(this.el.nativeElement);\n }\n }\n\n setup() {\n if (this.targetDashboard && !this.isSetup) {\n setTimeout(() => {\n if (this.gridStackService) {\n this.gridStackService.setupRemoveDropArea(this.el.nativeElement, this.targetDashboard, this);\n if (this.dropDisabled) {\n GridStackService.disableDrop(this.el.nativeElement);\n }\n }\n });\n this.isSetup = true;\n }\n }\n}\n","import { DomPortalOutlet, TemplatePortal } from '@angular/cdk/portal';\nimport {\n AfterViewInit, ApplicationRef, ComponentFactoryResolver, Directive, ElementRef, HostBinding, Injector,\n Input, OnChanges, OnDestroy, Optional, SimpleChanges, TemplateRef, ViewContainerRef\n} from '@angular/core';\nimport { DashboardComponent } from '../dashboard.component';\nimport { GridStackService } from '../grid-stack.service';\nimport { DashboardLibraryPanelDirective } from '../widget-library/library-panel.directive';\n\n@Directive({\n selector: '[dDashboardLibraryWidget]',\n})\nexport class DashboardLibraryWidgetDirective implements OnChanges, AfterViewInit, OnDestroy {\n @HostBinding('attr.gs-w')\n @Input()\n width: number;\n\n @HostBinding('attr.gs-h')\n @Input()\n height: number;\n\n @Input() widgetData;\n\n @Input() dragMode: 'copy' | 'move' = 'copy';\n @Input() dragTemplate: TemplateRef<any>;\n @Input() dragDisabled = false;\n @Input() dragCopyStyle = false;\n\n @HostBinding('class.grid-stack-new-item')\n hostBinding = true;\n\n @HostBinding('class.grid-stack-item-content')\n hostBindingHandler = true;\n\n @HostBinding('attr.gs-instance')\n gridStackId;\n\n @Input() targetDashboard: DashboardComponent;\n isSetup = false;\n get gridStackService(): GridStackService {\n return this.targetDashboard?.gridStackService;\n }\n constructor(\n private el: ElementRef,\n private cfr: ComponentFactoryResolver,\n private appRef: ApplicationRef,\n private injector: Injector,\n private vcf: ViewContainerRef,\n @Optional() private libraryPanel: DashboardLibraryPanelDirective\n ) { }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.targetDashboard) {\n this.setup();\n }\n if (changes.dragDisabled) {\n if (this.dragDisabled) {\n GridStackService.disableDrag(this.el.nativeElement);\n } else {\n GridStackService.enableDrag(this.el.nativeElement);\n }\n }\n }\n ngAfterViewInit() {\n if (!this.isSetup) {\n GridStackService.cleanDragIn(this.el.nativeElement);\n this.setup();\n }\n }\n\n ngOnDestroy() {\n if (this.gridStackService) {\n this.gridStackService.destroyDragIn(this.el.nativeElement);\n }\n }\n\n setup() {\n if (this.targetDashboard && !this.isSetup) {\n setTimeout(() => {\n if (this.gridStackService && this.gridStackService.gridStack) {\n GridStackService.cleanDragIn(this.el.nativeElement);\n this.gridStackService.setupDragIn(this.el.nativeElement, this, this.helper, this.notify);\n if (this.dragDisabled) {\n GridStackService.disableDrag(this.el.nativeElement);\n }\n }\n });\n this.isSetup = true;\n }\n }\n notify = (event: 'dragStart' | 'dragStop' | string) => {\n if (this.libraryPanel) {\n if (event === 'dragStart') {\n return (...args) => {\n this.libraryPanel.dragStartHandler();\n };\n }\n if (event === 'dragStop') {\n return (...args) => {\n this.libraryPanel.dragStopHandler();\n };\n }\n } else {\n return () => { };\n }\n };\n\n helper = (event) => {\n if (this.dragMode === 'move') {\n // grid stack 有高度变化的bug, 暂时就不解决了\n return this.el.nativeElement;\n }\n if (!this.dragTemplate) {\n const el = this.el.nativeElement.cloneNode(true);\n el.style.zIndex = '1060';\n this.copyCanvas(this.el.nativeElement, el);\n if (this.dragCopyStyle) {\n this.copyStyle(this.el.nativeElement, el);\n }\n return el;\n } else {\n const el = document.createElement('div');\n el.classList.add('grid-stack-item-adding-item-template');\n el.style.zIndex = '1060';\n if (this.width !== undefined) {\n el.setAttribute('gs-w', `${this.width}`);\n }\n if (this.height !== undefined) {\n el.setAttribute('gs-h', `${this.height}`);\n }\n this.setDragWidthHeight(el);\n const domPortalOutlet = new DomPortalOutlet(el, this.cfr, this.appRef, this.injector);\n domPortalOutlet.attachTemplatePortal(\n new TemplatePortal(this.dragTemplate, this.vcf, {\n $implicit: this.widgetData,\n width: this.width,\n height: this.height,\n })\n );\n const result = el.cloneNode(true);\n this.copyCanvas(el, result);\n if (this.dragCopyStyle) {\n this.copyStyle(el, result);\n }\n domPortalOutlet.detach();\n domPortalOutlet.dispose();\n return result;\n }\n };\n\n copyCanvas(origin, target) {\n // 拷贝canvas的内容\n const originCanvasArr = origin.querySelectorAll('canvas');\n const targetCanvasArr = target.querySelectorAll('canvas');\n [].forEach.call(targetCanvasArr, (canvas, index) => {\n canvas.getContext('2d').drawImage(originCanvasArr[index], 0, 0);\n });\n }\n\n setDragWidthHeight(el) {\n const columnWidth = this.targetDashboard.getCurrentColumnWidth();\n const cellHeight = this.targetDashboard.getCurrentCellHeight();\n const margin = this.targetDashboard.getCurrentMargin();\n if (this.width) {\n el.style.width = columnWidth * (this.width || 1) - margin * ((this.width || 1) - 1) + 'px';\n }\n if (this.height) {\n el.style.height = cellHeight * (this.height || 1) - margin * 2 + 'px';\n }\n }\n copyStyle(source, target) {\n ['id', 'style', 'draggable'].forEach((att) => {\n target.removeAttribute(att);\n });\n\n // copy style (without transitions)\n const computedStyle = getComputedStyle(source);\n for (let i = 0; i < computedStyle.length; i++) {\n const key = computedStyle[i];\n if (key.indexOf('transition') < 0) {\n target.style[key] = computedStyle[key];\n }\n }\n target.style.pointerEvents = 'none';\n // and repeat for all children\n for (let i = 0; i < source.children.length; i++) {\n this.copyStyle(source.children[i], target.children[i]);\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { DashboardComponent } from './dashboard.component';\nimport { DashboardLibraryPanelDirective } from './widget-library/library-panel.directive';\nimport { DashboardLibraryTrashDirective } from './widget-library/library-trash.directive';\nimport { DashboardLibraryWidgetDirective } from './widget-library/library-widget.directive';\nimport { DashboardWidgetComponent } from './widget/widget.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ],\n exports: [\n DashboardComponent,\n DashboardWidgetComponent,\n DashboardLibraryWidgetDirective,\n DashboardLibraryTrashDirective,\n DashboardLibraryPanelDirective,\n ],\n declarations: [\n DashboardComponent,\n DashboardWidgetComponent,\n DashboardLibraryWidgetDirective,\n DashboardLibraryTrashDirective,\n DashboardLibraryPanelDirective,\n ]\n})\nexport class DashboardModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GridStackService","i1.DashboardLibraryPanelDirective"],"mappings":"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