sngrid - A grid editor for Bootstrap.
A grid manager for Bootstrap 3 written in TypeScript (js) and SASS (css).
For now, it can be mounted on any Bootstrap-powered layout that follows this hierarchy:
#grid > .container > .row > .col-md-x > .row > .col-md-x
/* You can name your wrapper the way your want, as long as you have one */
<div id="grid">
<div class="container">
<div class="row">
<div class="col-md-6">
</div>
<div class="col-md-6">
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
</div>
</div>
</div>
</div>
// Initialize the grid
var grid = sn.grid.Grid(document.getElementById("grid"), {
// row size (in columns)
size: 12,
// events prefix
eventPrefix: "sn:",
// swap animation speed (in miliseconds)
swapSpeed: 750,
// move animation speed (in miliseconds)
moveSpeed: 750,
// language
language: "en",
// restrict edition to these types only (null = all)
// ex.:
// allowedTypes: ["widgetarea", "widget"]
allowedTypes: null
});
// Enable edition
grid.setEnabled(true);
// Disable edition
grid.setEnabled(false);
// change device mode (xs, sm, md, lg)
grid.setBreakpoint("sm");
// export grid to json (for serialization purpose)
var grid_json = grid.toJSON();
// listen to an event
grid.on("elementActivated", function(event, element) {
console.log(event, element);
});
/*
create an element
@type: "column", "row", "container", "widget", etc...
@locationElement: the container or sibling of the new element
@locationFn: name of the JQuery function to use (appendTo, insertBefore, prependTo, insertAfter, etc...)
@content: boolean (do we clone children) or string (arbitrary html)
*/
createElement: function(locationElement: JQuery, type: string, locationFn: string, content: boolean | string)
// execute custom action
executeAction(actionName: string, element: JQuery, args?: any)
// if the grid is currently enabled or not
isEnabled: function(): boolean
// return currently selected element
getActiveElement: function(): JQuery
// return element by sn id
getElementById: function(id: string): JQuery
// get an element's css classes (excluding internal ones)
getElementClasses: function(element: JQuery): Object
// return position of element in its parent
getElementPosition: function(element: JQuery) : number
// get an element's type
getElementType: function(element: JQuery): string
// return uuid of element
getElementId: function(element: JQuery): string
// remove a listener
off: function(eventName: string, callback: any)
// register a listener to a specific internal custom event
on: function(eventName: string, callback: any)
// remove an element
removeElement: function(element: JQuery)
// toggle selected element
setActiveElement: function(element: JQuery)
// set css property
setElementStyle: function(element: JQuery, propertyName: string, value: any)
// set active device breakpoint
setBreakpoint: function(breakpoint: string)
// toggle enabled state
setEnabled: function(enabled: boolean)
// toggle currently hovered element
setHoveredElement: function(element: JQuery)
// export grid to json
toJSON(): Object
// toggle css class for a specific element
toggleElementClass: function(element: JQuery, className: string)
| Name | Args |
|---|---|
| elementMounted | element: Element, type: string |
| elementActivated | element: Element |
| elementDeactivated | element: Element |
| elementHoverOn | element: Element |
| elementHoverOff | |
| elementChanged | element: Element, className: string |
| elementRemoved | element: Element, type: string |
| elementCreated | element: Element, type: string |
| elementMoved | element: Element, type: string |
| elementSwapped | elementA: Element, elementB: Element |
// register a new editable element type sn.grid.registerType(name: string, options?: any) // return the definition of an editable element type sn.grid.getType(type: string) // define a new device breakpoint sn.grid.registerBreakpoint(id: string, options?: any) // get definition for a specific device breakpoint sn.grid.getBreakpoint(id: string) // get breakpoints sorted by device size sn.grid.getSortedBreakpoints() // register a new bindable action sn.grid.registerAction(id: string, options: any) // generate a unique UUID sn.grid.uuid()
// add support for large screens
sn.grid.registerBreakpoint("lg", {
// is it the default device
default: true,
// for sorting purpose
priority: 1,
// do we try to adjust siblings when adding/removing/resizing a column
autoResizeColumns: true
});
// add support for containers
sn.grid.registerType("container", {
// how elements of this type are stacked
orientation: Orientation.VERTICAL,
// jquery/sizzle selector
selector: "[class^='container']",
// which CSS class to apply to new elements
className: "container",
// which CSS class to apply to new elements that are fluid
classNameFluid: "container-fluid",
// which types can be contained in these elements
contains: ["row"],
// action buttons
buttons: { right: ["moveBefore", "moveAfter", "toggleFluid"] },
// action buttons to put in the dropdown menu
menu: [],
// label
label: name,
// dom tag
tagName: "div",
// do we copy these elements when parent is cloned
cloneable: true,
// can we move these elements freely with the mouse
movable: true,
// can be selected
selectable: true,
// custom creation function
create: null,
// custom removal function
remove: null,
// extra html elements to add after toolbar
extraElements: "",
// default children to add when creating a new element
defaultChildren: []
});
// register an action to move element before another one (up or left)
sn.grid.registerAction("moveBefore", {
// tooltip text
tooltip: "Swap with previous element",
// class name generator (or value)
className: function(element: JQuery, type: string, config): string {
let value = "sn-btn-move-before "
value += (config.orientation === Orientation.VERTICAL) ? "fa fa-arrow-up" : "fa fa-arrow-left"
return value
},
// main function
callback: function(element: JQuery, event: JQueryEventObject, api, args?: any)
{
let otherElement = element.prev(".sn-mounted")
if(otherElement.length > 0)
api.swapElements(element, otherElement)
},
// update function
update: function(element: JQuery)
{
let otherElement = element.prev(".sn-mounted")
if(otherElement.length > 0)
element.children(".sn-toolbar").find(".sn-btn-move-before").removeClass("hidden")
else
element.children(".sn-toolbar").find(".sn-btn-move-before").addClass("hidden")
},
// dom event that trigger action
on: "click",
})
Jean-Georges Guénard, <jg@sednove.com>
Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.
1.0 2014-09-09 21:24:14 laplante@sednove.com