evwt
Version:
167 lines (146 loc) • 4.51 kB
JavaScript
import Gutter from './Gutter'
import { getOption } from './util'
const getTrackOption = (options, track, defaultValue) => {
if (track in options) {
return options[track]
}
return defaultValue
}
const createGutter = (direction, options) => gutterOptions => {
if (gutterOptions.track < 1) {
throw Error(
`Invalid track index: ${gutterOptions.track}. Track must be between two other tracks.`,
)
}
const trackMinSizes =
direction === 'column'
? options.columnMinSizes || {}
: options.rowMinSizes || {}
const trackMinSize = direction === 'column' ? 'columnMinSize' : 'rowMinSize'
return new Gutter(
direction,
{
minSizeStart: getTrackOption(
trackMinSizes,
gutterOptions.track - 1,
getOption(
options,
trackMinSize,
getOption(options, 'minSize', 0),
),
),
minSizeEnd: getTrackOption(
trackMinSizes,
gutterOptions.track + 1,
getOption(
options,
trackMinSize,
getOption(options, 'minSize', 0),
),
),
...gutterOptions,
},
options,
)
}
class Grid {
constructor(options) {
this.columnGutters = {}
this.rowGutters = {}
this.options = {
columnGutters: options.columnGutters || [],
rowGutters: options.rowGutters || [],
columnMinSizes: options.columnMinSizes || {},
rowMinSizes: options.rowMinSizes || {},
...options,
}
this.options.columnGutters.forEach(gutterOptions => {
this.columnGutters[options.track] = createGutter(
'column',
this.options,
)(gutterOptions)
})
this.options.rowGutters.forEach(gutterOptions => {
this.rowGutters[options.track] = createGutter(
'row',
this.options,
)(gutterOptions)
})
}
addColumnGutter(element, track) {
if (this.columnGutters[track]) {
this.columnGutters[track].destroy()
}
this.columnGutters[track] = createGutter(
'column',
this.options,
)({
element,
track,
})
}
addRowGutter(element, track) {
if (this.rowGutters[track]) {
this.rowGutters[track].destroy()
}
this.rowGutters[track] = createGutter(
'row',
this.options,
)({
element,
track,
})
}
removeColumnGutter(track, immediate = true) {
if (this.columnGutters[track]) {
this.columnGutters[track].destroy(immediate, () => {
delete this.columnGutters[track]
})
}
}
removeRowGutter(track, immediate = true) {
if (this.rowGutters[track]) {
this.rowGutters[track].destroy(immediate, () => {
delete this.rowGutters[track]
})
}
}
handleDragStart(e, direction, track) {
if (direction === 'column') {
if (this.columnGutters[track]) {
this.columnGutters[track].destroy()
}
this.columnGutters[track] = createGutter(
'column',
this.options,
)({
track,
})
this.columnGutters[track].startDragging(e)
} else if (direction === 'row') {
if (this.rowGutters[track]) {
this.rowGutters[track].destroy()
}
this.rowGutters[track] = createGutter(
'row',
this.options,
)({
track,
})
this.rowGutters[track].startDragging(e)
}
}
destroy(immediate = true) {
Object.keys(this.columnGutters).forEach(track =>
this.columnGutters[track].destroy(immediate, () => {
delete this.columnGutters[track]
}),
)
Object.keys(this.rowGutters).forEach(track =>
this.rowGutters[track].destroy(immediate, () => {
delete this.rowGutters[track]
}),
)
}
}
export default options => new Grid(options)