69 lines
1.8 KiB
JavaScript
69 lines
1.8 KiB
JavaScript
'use strict'
|
|
const t = require('typical')
|
|
const Padding = require('./padding')
|
|
|
|
/**
|
|
* @module column
|
|
*/
|
|
|
|
const _padding = new WeakMap()
|
|
|
|
// setting any column property which is a factor of the width should trigger autoSize()
|
|
|
|
/**
|
|
* Represents a table column
|
|
*/
|
|
class Column {
|
|
constructor (column) {
|
|
/**
|
|
* @type {string}
|
|
*/
|
|
if (t.isDefined(column.name)) this.name = column.name
|
|
/**
|
|
* @type {number}
|
|
*/
|
|
if (t.isDefined(column.width)) this.width = column.width
|
|
if (t.isDefined(column.maxWidth)) this.maxWidth = column.maxWidth
|
|
if (t.isDefined(column.minWidth)) this.minWidth = column.minWidth
|
|
if (t.isDefined(column.noWrap)) this.noWrap = column.noWrap
|
|
if (t.isDefined(column.break)) this.break = column.break
|
|
if (t.isDefined(column.contentWrappable)) this.contentWrappable = column.contentWrappable
|
|
if (t.isDefined(column.contentWidth)) this.contentWidth = column.contentWidth
|
|
if (t.isDefined(column.minContentWidth)) this.minContentWidth = column.minContentWidth
|
|
this.padding = column.padding || { left: ' ', right: ' ' }
|
|
this.generatedWidth = null
|
|
}
|
|
|
|
set padding (padding) {
|
|
_padding.set(this, new Padding(padding))
|
|
}
|
|
get padding () {
|
|
return _padding.get(this)
|
|
}
|
|
|
|
/**
|
|
* the width of the content (excluding padding) after being wrapped
|
|
*/
|
|
get wrappedContentWidth () {
|
|
return Math.max(this.generatedWidth - this.padding.length(), 0)
|
|
}
|
|
|
|
isResizable () {
|
|
return !this.isFixed()
|
|
}
|
|
|
|
isFixed () {
|
|
return t.isDefined(this.width) || this.noWrap || !this.contentWrappable
|
|
}
|
|
|
|
generateWidth () {
|
|
this.generatedWidth = this.width || (this.contentWidth + this.padding.length())
|
|
}
|
|
|
|
generateMinWidth () {
|
|
this.minWidth = this.minContentWidth + this.padding.length()
|
|
}
|
|
}
|
|
|
|
module.exports = Column
|