v-grid-layoutis a grid layout system, like Gridster, for Vue.- This is a bare-clone fork of
vue-grid-layoutwhich supports nesting theGridIteminside any other component(s)
- Draggable widgets
- Resizable widgets
- Static widgets
- Bounds checking for dragging and resizing
- Widgets may be added or removed without rebuilding grid
- Layout can be serialized and restored
- Automatic RTL support (resizing not working with RTL on 2.2.0)
- Responsive
# install with npm
$ npm install @geospoc/v-grid-layoutImport the library
import VueGridLayout from '@geospoc/v-grid-layout';Add to other Vue components
export default {
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem
},
// ... data, methods, mounted (), etc.
}Include the browser-ready bundle (download from releases) in your page. The components will be automatically available.
<script src="v-grid-layout.umd.min.js"></script>var testLayout = [
{ x: 0, y: 0, w: 2, h: 2, i: '0' },
{ x: 2, y: 0, w: 2, h: 4, i: '1' },
{ x: 4, y: 0, w: 2, h: 5, i: '2' },
{ x: 6, y: 0, w: 2, h: 3, i: '3' },
{ x: 8, y: 0, w: 2, h: 3, i: '4' },
{ x: 10, y: 0, w: 2, h: 3, i: '5' },
{ x: 0, y: 5, w: 2, h: 5, i: '6' },
{ x: 2, y: 5, w: 2, h: 5, i: '7' },
{ x: 4, y: 5, w: 2, h: 5, i: '8' },
{ x: 6, y: 3, w: 2, h: 4, i: '9' },
{ x: 8, y: 4, w: 2, h: 4, i: '10' },
{ x: 10, y: 4, w: 2, h: 4, i: '11' },
{ x: 0, y: 10, w: 2, h: 5, i: '12' },
{ x: 2, y: 10, w: 2, h: 5, i: '13' },
{ x: 4, y: 8, w: 2, h: 4, i: '14' },
{ x: 6, y: 8, w: 2, h: 4, i: '15' },
{ x: 8, y: 10, w: 2, h: 5, i: '16' },
{ x: 10, y: 4, w: 2, h: 2, i: '17' },
{ x: 0, y: 9, w: 2, h: 3, i: '18' },
{ x: 2, y: 6, w: 2, h: 2, i: '19' },
];
new Vue({
el: '#app',
data: {
layout: testLayout,
},
});<grid-layout
:layout.sync="layout"
:col-num="12"
:row-height="30"
:is-draggable="true"
:is-resizable="true"
:is-mirrored="false"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
>
<grid-item
v-for="item in layout"
:key="item.i"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
>
{{ item.i }}
</grid-item>
</grid-layout>-
layout
- type:
Array - required:
true
This is the initial layout of the grid.
The value must be an
ArrayofObjectitems. Each item must havei,x,y,wandhproperties. Please refer to the documentation forGridItembelow for more information. - type:
-
responsiveLayouts
- type:
Object - required:
false - default :
{}
This is the initial layouts of the grid per breakpoint if
responsiveis set totrue. The keys of theObjectare breakpoint names and each value is anArrayofObjectitems as defined bylayoutprop. eg:{ lg:[layout items], md:[layout items] }. Setting the prop after the creation of the GridLayout has no effect. - type:
-
colNum
- type:
Number - required:
false - default:
12
Says how many columns the grid has.
The value should be a natural number.
- type:
-
rowHeight
- type:
Number - required:
false - default:
150
Says what is a height of a single row in pixels.
- type:
-
maxRows
- type:
Number - required:
false - default:
Infinity
Says what is a maximal number of rows in the grid.
- type:
-
margin
- type:
Array - required:
false - default:
[10, 10]
Says what are the margins of elements inside the grid.
The value must be a two-element
ArrayofNumber. Each value is expressed in pixels. The first element is a margin horizontally, the second element is a vertical margin. - type:
-
isDraggable
- type:
Boolean - required:
false - default:
true
Says if the grids items are draggable.
- type:
-
isResizable
- type:
Boolean - required:
false - default:
true
Says if the grids items are resizable.
- type:
-
isMirrored
- type:
Boolean - required:
false - default:
false
Says if the RTL/LTR should be reversed.
- type:
-
autoSize
- type:
Boolean - required:
false - default:
true
Says if the container height should swells and contracts to fit contents.
- type:
-
verticalCompact
- type:
Boolean - required:
false - default:
true
Says if the layout should be compact vertically.
- type:
-
preventCollision
- type:
Boolean - required:
false - default:
false
Says if grid items will move when being dragged over.
- type:
-
useCssTransforms
- type:
Boolean - required:
false - default:
true
Says if the CSS
transition-property: transform;should be used. - type:
-
responsive
- type:
Boolean - required:
false - default:
false
Says if the layout should be responsive to window width
- type:
-
breakpoints
- type:
Object - required:
false - default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }
Breakpoints defined for responsive layout. Sets widths on wich column number changes
- type:
-
cols
- type:
Object - required:
false - default: { lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }
Defines number of columns for each breakpoint
- type:
-
i
- type:
String - required:
true
This is the unique identifier of the item.
- type:
-
x
- type:
Number - required:
true
Says what is a initial horizontal position of the item (in which column it should be placed).
The value must be a whole number.
- type:
-
y
- type:
Number - required:
true
Says what is a initial vertical position of the item (in which row it should be placed).
The value must be a whole number.
- type:
-
w
- type:
Number - required:
true
Says what is a initial width of the item.
The value is a number that is multiplied by
colWidth. - type:
-
h
- type:
Number - required:
true
Says what is a initial height of the item.
The value is a number that is multiplied by
rowHeight. - type:
-
minW
- type:
Number - required:
false - default:
1
Says what is a minimal width of the item. If
wwill be smaller thenminWthenwwill be set tominW.The value is a number that is multiplied by
colWidth. - type:
-
minH
- type:
Number - required:
false - default:
1
Says what is a minimal hieght of the item. If
hwill be smaller thenminHthenhwill be set tominH.The value is a number that is multiplied by
rowHeight. - type:
-
maxW
- type:
Number - required:
false - default:
Infinity
Says what is a maximal width of the item. If
wwill be bigger thenmaxWthenwwill be set tomaxW.The value is a number that is multiplied by
colWidth. - type:
-
maxH
- type:
Number - required:
false - default:
Infinity
Says what is a maximal height of the item. If
hwill be bigger thenmaxHthenhwill be set tomaxH.The value is a number that is multiplied by
rowHeight - type:
-
isDraggable
- type:
Boolean - required:
false - default:
null
Says if item is draggable.
If default value is
nullthen it's inherited from parent. - type:
-
isResizable
- type:
Boolean - required:
false - default:
null
Says if item is resizable.
If default value is
nullthen it's inherited from parent. - type:
-
static
- type:
Boolean - required:
false - default:
false
Says if item is static (won't be draggable, resizable or moved by other items).
- type:
-
dragIgnoreFrom
- type:
String - required:
false - default:
'a, button'
Says which elements of the item shouldn't trigger drag event of the item.
The value is
css-likeselector string.For more info please refer to
ignoreFromin interact.js docs. - type:
-
dragAllowFrom
- type:
String - required:
false - default:
null
Says which elements of the item should trigger drag event of the item.
The value is
css-likeselector string.If
nullthen one can drag by any (excludingdragIgnoreFrom) element of the item.For more info please refer to
allowFromin interact.js docs. - type:
-
resizeIgnoreFrom
- type:
String - required:
false - default:
'a, button'
Says which elements of the item shouldn't trigger resize event of the item.
The value is
css-likeselector string.For more info please refer to
ignoreFromin interact.js docs. - type:
Move and resize event listeners can be added to each grid-item, so that the parent Vue can be notified when a grid element is being moved or resized. Moved and resized event listeners can be added, if the only notification needed is when an item is finished moving or resizing.
Working example here
<grid-layout
:layout="layout"
:col-num="12"
:row-height="30"
:is-draggable="true"
:is-resizable="true"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
@layout-created="layoutCreatedEvent"
@layout-before-mount="layoutBeforeMountEvent"
@layout-mounted="layoutMountedEvent"
@layout-ready="layoutReadyEvent"
@layout-updated="layoutUpdatedEvent"
@breakpoint-changed="breakpointChangedEvent"
>
<grid-item
v-for="item in layout"
:key="item.i"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
{{ item.i }}
</grid-item>
</grid-layout>-
layoutCreatedEvent
Layout created event
Emited on the component created lifecycle hook
layoutCreatedEvent(newLayout) {
console.log("Created layout: ", newLayout)
}-
layoutBeforeMountEvent
Layout beforeMount event
Emited on the component beforeMount lifecycle hook
layoutBeforeMountEvent(newLayout) {
console.log("beforeMount layout: ", newLayout)
}-
layoutMountedEvent
Layout mounted event
Emited on the component mounted lifecycle hook
layoutMountedEvent(newLayout) {
console.log("Mounted layout: ", newLayout)
}-
layoutReadyEvent
Layout ready event
Emited when all the operations on the mount hook finish
layoutReadyEvent(newLayout) {
console.log("Ready layout: ", newLayout)
}-
layoutUpdatedEvent
Layout updated event
Every time the layout has finished updating and positions of all grid-items are recalculated
layoutUpdatedEvent(newLayout) {
console.log("Updated layout: ", newLayout)
}-
moveEvent
Move event
Every time an item is being moved and changes position
moveEvent(i, newX, newY) {
console.log("MOVE i=" + i + ", X=" + newX + ", Y=" + newY);
},-
resizeEvent
Resize event
Every time an item is being resized and changes size
resizeEvent(i, newH, newW, newHPx, newWPx) {
console.log("RESIZE i=" + i + ", H=" + newH + ", W=" + newW + ", H(px)=" + newHPx + ", W(px)=" + newWPx);
},-
movedEvent
Moved event
Every time an item is finished being moved and changes position
movedEvent(i, newX, newY) {
console.log("MOVED i=" + i + ", X=" + newX + ", Y=" + newY);
},-
resizedEvent
Resized event
Every time an item is finished being resized and changes size
/**
*
* @param i the item id/index
* @param newH new height in grid rows
* @param newW new width in grid columns
* @param newHPx new height in pixels
* @param newWPx new width in pixels
*
*/
resizedEvent(i, newH, newW, newHPx, newWPx) {
console.log("RESIZED i=" + i + ", H=" + newH + ", W=" + newW + ", H(px)=" + newHPx + ", W(px)=" + newWPx);
},-
containerResizedEvent
Container Resized event
Every time the grid item/layout container changes size (browser window or other)
/**
*
* @param i the item id/index
* @param newH new height in grid rows
* @param newW new width in grid columns
* @param newHPx new height in pixels
* @param newWPx new width in pixels
*
*/
containerResizedEvent(i, newH, newW, newHPx, newWPx) {
console.log("CONTAINER RESIZED i=" + i + ", H=" + newH + ", W=" + newW + ", H(px)=" + newHPx + ", W(px)=" + newWPx);
},-
breakpointChangedEvent
Breakpoint Changed event
Every time the breakpoint value changes due to window resize
/**
*
* @param newBreakpoint the breakpoint name
* @param newLayout the chosen layout for the breakpoint
*
*/
breakpointChangedEvent(newBreakpoint, newLayout) {
console.log("BREAKPOINT CHANGED breakpoint=", newBreakpoint, ", layout: ", newLayout );
},Note: Commits & PRs will be allowed only if the commit messages & PR titles follow a particular standard format, read more about it here
Please contribute using Github Flow. Create a new branch from the default branch, add commits, and open a pull request
Thanks goes to these wonderful people (emoji key):
Vinayak Kulkarni |
swaprenge 💻 🚧 💡 |
This project follows the all-contributors specification. Contributions of any kind welcome!