/**
* @global
*/
/**
* Top level store for table related data. It's mounted as 'table_space' under the application state
* @typedef {object} TableSpace
* @prop {Object.<string, TableModel>} data repository for table model; keyed by tbl_id
* @prop {Object.<string, TableGroup>} results repository for table group information; keyed by tbl_group name
* @prop {Object.<string, Object>} ui repository for table UI state; keyed by tbl_ui_id
*
* @global
* @public
*/
/**
* Table model. The top level table data object with meta info.
* @typedef {object} TableModel
* @prop {string} tbl_id unique ID of this table.
* @prop {string} title title, used on label.
* @prop {TableRequest} request the request used to create this table
* @prop {TableKeywords} keywords a list of all meta from the original source, including comments and duplicates
* @prop {TableMeta} tableMeta additional meta added and keywords as key/value pair. comments and duplicates are no longer here.
* @prop {TableData} tableData table's meta information stored as key/value pair.
* @prop {number} totalRows total number of rows.
* @prop {number} highlightedRow the current highlighted row index. index is natural order starting from 0.
* @prop {object} selectInfo selection information. use SelectInfo.newInstance take advantage of helper's functions.
* @prop {boolean} isFetching true if data is being fetched and not ready for display.
* @prop {string} error error message if the request fail to create a table.
* @prop {Group[]} groups groups is any.
* @prop {Link[]} links links is any.
* @prop {PARAM[]} params params is any.
*
* @global
* @public
*/
/**
* Table data. Table data object.
* @typedef {object} TableData
* @prop {TableColumn[]} columns table column definition.
* @prop {string[][]} data 2D array containing the table data
*/
/**
* Table column information.
* @typedef {object} TableColumn
* @prop {string} name name of the column
* @prop {string} label display name of the column
* @prop {string} type data type
* @prop {string} units data units
* @prop {string} nullString string used to represent null value
* @prop {string} desc description of the column
* @prop {number} width max width needed to display data.
* @prop {number} prefWidth preferred width, regardless of the data.
* @prop {boolean} sortable true if undefined
* @prop {boolean} filterable true if undefined
* @prop {string} visibility show, hide, or hidden. hidden columns are not viewable by users.
* @prop {string} sortByCols for multi-columns sorting. column names separated by comma(',').
* @prop {string} enumVals contains only values in this list. values are seprated by comma(',')
* @prop {string} ID ID used to reference this column.
* @prop {string} precision applies only to floating point numbers.
* A string Tn where T is either F, E, or G
* If T is not present, it defaults to F.
* When T is F or E, n is the number of significant figures after the decimal point.
* When T is G, n is the number of significant digits
* @prop {string} UCD UCD of this column.
* @prop {string} utype UType of this column.
* @prop {string} ref refer to this column for declarations.
* @prop {string} value static value of this column for all of the rows in this table
* @prop {string} maxValue maximum value.
* @prop {string} minValue minimum value.
* @prop {LINK[]} links links if any.
*
* @global
* @public
*/
/**
* PARAM may have everything TableColumn has plus 'value'
* @typedef {object} PARAM
* @prop {string} value value of this PARAM
*
* @global
* @public
*/
/**
* Table group info
* @typedef {object} Group
* @prop {string} ID ID used to reference this group.
* @prop {string} name href of this group.
* @prop {string} desc description
* @prop {PARAM[]} params params if any
* @prop {REF[]} paramRefs reference to params
* @prop {REF[]} columnRefs reference to columns
*
* @global
* @public
*/
/**
* Table link info
* @typedef {object} LINK
* @prop {string} ID ID used to reference this LINK.
* @prop {string} href href of this LINK.
* @prop {string} value text of this LINK.
* @prop {string} title title/label of this LINK.
* @prop {string} role role, see VOTable content-role
* @prop {string} type type, see VOTable content-type
* @prop {string} action see VOTable LINK action
*
* @global
* @public
*/
/**
* reference to another object, i.e TableColumn, PARAM, LINK
* @typedef {object} REF
* @prop {string} ref ID if the referenced object
* @prop {string} UCD UCD, see VOTable
* @prop {string} utype utype, see VOTable
*
* @global
* @public
*/
/**
* The full list of meta info for this table. It includes the original meta from source, comments, duplicates, and additional meta inserted
* @typedef {object} TableKeywords
* @prop {string} key meta key
* @prop {string} value meta value
* @prop {boolean} isKeyword true if this entry is from the original source.
*
* @global
* @public
*/
/**
* Table meta information. Below is only a small set of predefined meta used by table.
* The meta information in this object are used by many components for many reasons. ie catalog overlay.
* @typedef {object} TableMeta
* @prop {string} Loading-Status COMPLETED or INPROGRESS
* @prop {string} resultSetID ID for this table. If sorted or filtered, a new one will be generated.
* @prop {string} source path of the original table source before any operations were performed. ie sort, filter, etc. this may not be fully supported.
* @prop {string} relatedCols highlight related rows based on this column's value.
*
* @global
* @public
*/
/**
* Table request. Below is a list of predefined parameters available for table request. All of the options are optional.
* These parameters let you control what data and how it will be returned.
* @typedef {object} TableRequest
* @prop {number} startIdx the starting index to fetch. defaults to zero.
* @prop {number} pageSize the number of rows per page. defaults to 100.
* @prop {string} filters list of conditions separted by comma(,). Format: (col_name|index) operator value.
* operator is one of '> < = ! >= <= IN'. See DataGroupQueryStatement.java doc for more details.
* @prop {string} sortInfo sort information. Format: (ASC|DESC),col_name[,col_name]*
* @prop {string} inclCols list of columns to select. Column names separted by comma(,)
* @prop {object} META_INFO meta information passed as key/value pair to server then returned as tableMeta.
* @prop {string} use one of 'catalog_overlay', 'catalog_primary', 'data_primary'.
* @prop {string} tbl_id unique id of the table. auto-create if not given.
*
* @global
* @public
*/
/**
* Table group. Define a group of tables used by the UI.
* @typedef {Object} TableGroup
* @prop {string} name unique name of this group
* @prop {string} active tbl_id of the active table in this group
* @prop {Object.<string, TableGroupItem>} tables a map of TableGroupItem(s) keyed by tbl_id
*
* @global
* @public
*/
/**
* Table group item. Contains enough key information to identify the table data as well as the UI data associate with this item.
* @typedef {Object} TableGroupItem
* @prop {string} tbl_group table group name
* @prop {string} tbl_id unique id of the table data
* @prop {string} tbl_ui_id unique id of the table's UI data
* @prop {string} title title or label of the table
* @prop {boolean} removable true if this item can be removed from group.
* @prop {Object.<string, *>} options table options, ie. selectable, expandable
*
* @global
* @public
*/
/**
* Download request. Below is a list of predefined parameters available for a download request. All of the options are optional.
* These parameters let you control what data and how it will be returned.
* @typedef {object} DownloadRequest
* @prop {number} FilePrefix
* @prop {number} BaseFileName
* @prop {string} Title
* @prop {string} TitlePrefix
* @prop {string} Email
* @prop {string} MaxBundleSize
* @prop {object} DataSource
* @prop {TableRequest} tableRequest
* @prop {string} selectionInfo
*
* @global
* @public
*/
/**
* Available options when a table is added.
* @global
* @public
* @typedef {object} TblOptions
* @prop {string} [tbl_group] the group this table belongs to. Defaults to 'main'.
* @prop {boolean} [backgroundable=false] true if this search can be sent to background. Defaults to false.
* @prop {string} [title] title of this table.
* @prop {boolean} [setAsActive=true] make this the active table once it's added to the UI.
* @prop {number} [pageSize] the starting page size. Will use the request's pageSize if not given.
* @prop {boolean} [selectable=true]
* @prop {boolean} [expandable=true]
* @prop {boolean} [removable=true] true if this table can be removed from view.
* @prop {boolean} [border=true]
* @prop {boolean} [showToolbar=true] when false, showFilters, showTitle, showPaging, showSave, and showFilterButton will be false as well.
* @prop {boolean} [showFilters=false]
* @prop {boolean} [showTitle=true]
* @prop {boolean} [showPaging=true] enable/disable paging feature. When false, all data will be displayed.
* @prop {boolean} [showSave=true]
* @prop {boolean} [showFilterButton=true]
* @prop {boolean} [showInfoButton=false] when true, shows additional information about table, if available
* @prop {boolean} [showOptionButton=true]
* @prop {boolean} [showUnits=true]
* @prop {boolean} [allowUnits=true] enable/disable the use of units in a table.
* @prop {function[]} [leftButtons] an array of functions that returns a button-like component laid out on the left side of this table header.
* @prop {function[]} [rightButtons] an array of functions that returns a button-like component laid out on the right side of this table header.
*/