Source: tables/table-row.js


import $ from '$qui/lib/jquery.module.js'

import ListItem   from '$qui/lists/list-item.js'
import * as Lists from '$qui/lists/lists.js'


/**
 * A table row.
 * @alias qui.tables.TableRow
 * @extends qui.lists.ListItem
 */
class TableRow extends ListItem {

    /**
     * @constructs
     * @param {qui.tables.TableCell[]} cells table cells
     * @param {Array} [initialValues] optional initial values
     * @param {...*} args parent class parameters
     */
    constructor({cells, initialValues = null, ...args}) {
        super(args)

        this._cells = cells
        this._initialValues = initialValues

        this._cells.forEach(c => this.prepareCell(c))
    }

    init() {

        if (this._initialValues != null) {
            this.setValues(this._initialValues)
            this._initialValues = null /* Don't waste memory */
        }
    }

    initHTML(html) {
        html.addClass('qui-table-row')
    }

    makeContent() {
        return this._cells.reduce((a, c) => a.add(c.getHTML()), $())
    }


    /* Cells */

    /**
     * Return row cells.
     * @returns {qui.tables.TableCell[]}
     */
    getCells() {
        return this._cells.slice()
    }

    /**
     * Prepare cell to be part of this row.
     * @param {qui.tables.TableCell} cell
     */
    prepareCell(cell) {
        cell.setRow(this)
    }

    /**
     * Return the index of the given cell. If the field does not belong to this row, `-1` is returned.
     * @param {qui.tables.TableCell} cell the cell
     * @returns {Number}
     */
    getCellIndex(cell) {
        return this._cells.indexOf(cell)
    }


    /* Values */

    /**
     * Return the current values of the cells.
     * @returns {Array}
     */
    getValues() {
        return this._cells.map(c => c.getValue())
    }

    /**
     * Set row values. If more values than needed are supplied, extra values are ignored. If less values are supplied,
     * extra cells are left unchanged.
     * @param {Array} values
     * @param {Number} [index] optional start index (defaults to `0`)
     */
    setValues(values, index = 0) {
        let cells = this._cells.slice(index, index + values.length)
        cells.forEach((c, i) => c.setValue(values[i]))
    }


    /* Selection */

    setSelectMode(selectMode) {
        /* Forward select mode to cells */
        this._cells.forEach(c => c.setSelectMode(selectMode))

        this.getHTML().toggleClass('qui-base-button', selectMode !== Lists.LIST_SELECT_MODE_DISABLED)
    }

    setSelected(selected) {
        super.setSelected(selected)

        this._cells.forEach(c => c.setSelected(selected))
    }


    /* Table */

    /**
     * Return the owning table.
     * @returns {qui.tables.Table}
     */
    getTable() {
        return /** @type qui.tables.Table */ this.getList()
    }

}


export default TableRow