angular-gridster2
Angular implementation of angular-gridster Demo
Angular 5.x library is 5.x branch v4.6.3
Angular 4.x library is 4.x branch v3.19.0 (no longer maintained)
Angular 2.x library is 2.4.x branch v2.4.20 (no longer maintained)
AngularJS >=1.5.x library is 1.x branch v1.21.0 (no longer maintained)
Install
npm install angular-gridster2 --save
Should work out of the box with webpack, respectively angular-cli.
import { GridsterModule } from 'angular-gridster2';
@NgModule({
imports: [ GridsterModule ],
...
})
Browser support
What Angular supports here
How to use
<gridster [options]="options">
<gridster-item [item]="item" *ngFor="let item of dashboard">
</gridster-item>
</gridster>
Initialize a simple dashboard:
import { GridsterConfig, GridsterItem } from 'angular-gridster2';
options: GridsterConfig;
dashboard: Array<GridsterItem>;
static itemChange(item, itemComponent) {
console.info('itemChanged', item, itemComponent);
}
static itemResize(item, itemComponent) {
console.info('itemResized', item, itemComponent);
}
ngOnInit() {
this.options = {
itemChangeCallback: AppComponent.itemChange,
itemResizeCallback: AppComponent.itemResize,
};
this.dashboard = [
{cols: 2, rows: 1, y: 0, x: 0},
{cols: 2, rows: 2, y: 0, x: 2}
];
}
changedOptions() {
this.options.api.optionsChanged();
}
removeItem(item) {
this.dashboard.splice(this.dashboard.indexOf(item), 1);
}
addItem() {
this.dashboard.push({});
}
Note: The gridster will take all the available space from the parent. It will not size depending on content. The parent of the component needs to have a size.
Default Grid Options:
import { GridsterConfig } from 'angular-gridster2';
export const GridsterConfigService: GridsterConfig = {
gridType: 'fit',
fixedColWidth: 250,
fixedRowHeight: 250,
keepFixedHeightInMobile: false,
keepFixedWidthInMobile: false,
compactType: 'none',
mobileBreakpoint: 640,
minCols: 1,
maxCols: 100,
minRows: 1,
maxRows: 100,
defaultItemCols: 1,
defaultItemRows: 1,
maxItemCols: 50,
maxItemRows: 50,
minItemCols: 1,
minItemRows: 1,
minItemArea: 1,
maxItemArea: 2500,
margin: 10,
outerMargin: true,
outerMarginTop: null,
outerMarginRight: null,
outerMarginBottom: null,
outerMarginLeft: null,
scrollSensitivity: 10,
scrollSpeed: 20,
initCallback: undefined,
destroyCallback: undefined,
itemChangeCallback: undefined,
itemResizeCallback: undefined,
itemInitCallback: undefined,
itemRemovedCallback: undefined,
enableEmptyCellClick: false,
enableEmptyCellContextMenu: false,
enableEmptyCellDrop: false,
enableEmptyCellDrag: false,
emptyCellClickCallback: undefined,
emptyCellContextMenuCallback: undefined,
emptyCellDropCallback: undefined,
emptyCellDragCallback: undefined,
emptyCellDragMaxCols: 50,
emptyCellDragMaxRows: 50,
ignoreMarginInRow: false,
draggable: {
delayStart: 0,
enabled: false,
ignoreContentClass: 'gridster-item-content',
ignoreContent: false,
dragHandleClass: 'drag-handler',
stop: undefined,
start: undefined
},
resizable: {
delayStart: 0,
enabled: false,
handles: {
s: true,
e: true,
n: true,
w: true,
se: true,
ne: true,
sw: true,
nw: true
},
stop: undefined,
start: undefined
},
swap: true,
pushItems: false,
disablePushOnDrag: false,
disablePushOnResize: false,
pushDirections: {north: true, east: true, south: true, west: true},
pushResizeItems: false,
displayGrid: 'onDrag&Resize',
disableWindowResize: false,
disableWarnings: false,
scrollToNewItems: false
};
Gridster options api
this.options.api.resize();
this.options.api.optionsChanged();
this.options.api.getNextPossiblePosition(item: GridsterItem);
this.options.api.getFirstPossiblePosition(item: GridsterItem);
this.options.api.getLastPossiblePosition(item: GridsterItem);
import {GridsterItemComponent, GridsterPush, GridsterPushResize, GridsterSwap} from 'gridster'
myMethod(gridsterItemComponent: GridsterItemComponent) {
const push = new GridsterPush(gridsterItemComponent);
gridsterItemComponent.$item.rows += 1;
if (push.pushItems(push.fromNorth)) {
push.checkPushBack();
push.setPushedItems();
gridsterItemComponent.setSize(true);
gridsterItemComponent.checkItemChanges(gridsterItemComponent.$item, gridsterItemComponent.item);
} else {
gridsterItemComponent.$item.rows -= 1;
push.restoreItems();
}
push.destroy();
}
Gridster item options:
export interface GridsterItem {
x?: number;
y?: number;
rows?: number;
cols?: number;
initCallback?: Function;
dragEnabled?: boolean;
resizeEnabled?: boolean;
compactEnabled?: boolean;
maxItemRows?: number;
minItemRows?: number;
maxItemCols?: number;
minItemCols?: number;
minItemArea?: number;
maxItemArea?: number;
}
Load dynamic components inside the gridster-item
You can load dynamic components in Angular4+ with the help of ng-dynamic-component
library
Having iFrame in widgets content
iFrames can interfere with drag/resize of widgets. For a workaround please read this issue #233
Interact with content without dragging
Option 1 (without text selection):
<gridster-item>
<div (mousedown)="$event.stopPropagation()" (touchstart)="$event.stopPropagation()">
Some content to click without dragging the widget
</div>
<div class="item-buttons">
<button md-icon-button md-raised-button class="drag-handler">
<md-icon>open_with</md-icon>
</button>
<button md-icon-button md-raised-button class="remove-button" (click)="removeItem($event, item)"
(touchstart)="removeItem($event, item)" mdTooltip="Remove">
<md-icon>clear</md-icon>
</button>
</div>
</gridster-item>
Option 2 (with text selection):
<gridster-item>
<div class="gridster-item-content">
Some content to select and click without dragging the widget
</div>
<div class="item-buttons">
<button md-icon-button md-raised-button class="drag-handler">
<md-icon>open_with</md-icon>
</button>
<button md-icon-button md-raised-button class="remove-button" (click)="removeItem($event, item)"
(touchstart)="removeItem($event, item)" mdTooltip="Remove">
<md-icon>clear</md-icon>
</button>
</div>
</gridster-item>
License
The MIT License
Copyright (c) 2018 Tiberiu Zuld