angular-gridster2
Angular implementation of angular-gridster Demo
AngularJS 1.x library is 1.x branch
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,
scrollSensitivity: 10,
scrollSpeed: 20,
initCallback: undefined,
itemChangeCallback: undefined,
itemResizeCallback: undefined,
itemInitCallback: undefined,
enableEmptyCellClick: false,
enableEmptyCellDrop: false,
enableEmptyCellDrag: false,
emptyCellClickCallback: undefined,
emptyCellDropCallback: undefined,
emptyCellDragCallback: undefined,
emptyCellDragMaxCols: 50,
emptyCellDragMaxRows: 50,
draggable: {
enabled: false,
ignoreContentClass: 'gridster-item-content',
ignoreContent: false,
dragHandleClass: 'drag-handler',
stop: undefined,
start: undefined
},
resizable: {
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,
pushResizeItems: false,
displayGrid: 'onDrag&Resize',
disableWindowResize: false
};
Gridster options api
this.options.api.resize();
this.options.api.optionsChanged();
this.options.api.getNextPossiblePosition(item: GridsterItem);
Gridster item options:
export interface GridsterItem {
x?: number;
y?: number;
rows?: number;
cols?: number;
initCallback?: Function;
dragEnabled?: boolean;
resizeEnabled?: boolean;
maxItemRows?: number;
minItemRows?: number;
maxItemCols?: number;
minItemCols?: number;
minItemArea?: number;
maxItemArea?: number;
}
Events
Gridster Item
@Output() itemChange: EventEmitter<GridsterItem> = new EventEmitter();
@Output() itemResize: EventEmitter<GridsterItem> = new EventEmitter();
....
this.itemChange.emit(this.state.item);
this.itemResize.emit(this.state.item);
Note: When a item changes cols/rows both events get triggered
Load dynamic components inside the gridster-item
You can load dynamic components in Angular4+ with the help of ng-dynamic-component
library
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) 2017 Tiberiu Zuld