refact: FocusTable Singleton Model

no longer "selectedTable" in Tables Model
This commit is contained in:
Joshua Shoemaker 2020-07-30 10:38:03 -05:00
parent 9ab0abb574
commit 021f3c7e4b
4 changed files with 40 additions and 19 deletions

View File

@ -1,8 +1,10 @@
import Tables from '../Models/Tables' import Tables from '../Models/Tables'
import FocusTable from '../Models/FocusTable'
class TableListController { class TableListController {
constructor() { constructor() {
this.tables = new Tables() this.tables = new Tables()
this.focusTable = new FocusTable()
this.updatedTablesEvent = new Event('updateTables') this.updatedTablesEvent = new Event('updateTables')
this.setSelectedTableEvent = new Event('setSelectedTable') this.setSelectedTableEvent = new Event('setSelectedTable')
} }
@ -13,7 +15,8 @@ class TableListController {
} }
selectTableToView = id => { selectTableToView = id => {
this.tables.setSelectedTableById(id) const table = this.tables.getById(id)
this.focusTable.table = table
document.dispatchEvent(this.setSelectedTableEvent) document.dispatchEvent(this.setSelectedTableEvent)
} }
} }

26
src/Models/FocusTable.js Normal file
View File

@ -0,0 +1,26 @@
let instance = null
class FocusTable {
constructor (table) {
if (instance === null) instance = this
this._value = table
return instance
}
set table (table) {
if (table.type === 'Nodule' || table.type === 'Table') this._value = table
else {
this._value = null
console.error('Focus Tablw value must be of type "Nodule" or "Table"')
}
}
get table () {
if (this._value.type === 'Table') return this._value
else if (this._value.type === 'Nodule') return this._value.asTable()
else return {}
}
}
export default FocusTable

View File

@ -7,7 +7,6 @@ class Tables {
constructor () { constructor () {
if (!instance) instance = this if (!instance) instance = this
this.collection = [] this.collection = []
this.selectedTable = null
return instance return instance
} }
@ -32,12 +31,6 @@ class Tables {
getCollectionProps = () => this.collection.map(table => table.getProperties()) getCollectionProps = () => this.collection.map(table => table.getProperties())
getById = id => this.collection.find(t => id === t.id) getById = id => this.collection.find(t => id === t.id)
setSelectedTableById = id => {
const table = this.collection.find(t => id === t.id)
if (table) this.selectedTable = table
else this.selectedTable = null
}
} }
export default Tables export default Tables

View File

@ -2,25 +2,27 @@ import React, { Component } from 'react'
import { Table } from 'semantic-ui-react' import { Table } from 'semantic-ui-react'
import Tables from '../../Models/Tables' import Tables from '../../Models/Tables'
import FocusTable from '../../Models/FocusTable'
class DataTable extends Component { class DataTable extends Component {
constructor (props) { constructor (props) {
super(props) super(props)
this.tables = new Tables() this.tables = new Tables()
this.focusTable = new FocusTable()
this.state = { this.state = {
headers: [], headers: [],
tableData: [] tableData: []
} }
document.addEventListener('setSelectedTable', this.setSelectedTable) document.addEventListener('setSelectedTable', this.setFocusTable)
} }
setSelectedTable = () => { setFocusTable = () => {
const selectedTable = this.tables.selectedTable const focusTable = this.focusTable.table
if (selectedTable) { if (focusTable) {
this.setState({ this.setState({
headers: selectedTable.headers, headers: focusTable.headers,
tableData: selectedTable.rows tableData: focusTable.rows
}) })
} }
} }
@ -39,11 +41,8 @@ class DataTable extends Component {
renderTableRowElements = () => { renderTableRowElements = () => {
const { tableData, headers } = this.state const { tableData } = this.state
const tableRowElements = tableData.map(d => { const tableRowElements = tableData.map(d => <Table.Row>{ this.renderCellElements(d) }</Table.Row> )
return <Table.Row>{ this.renderCellElements(d) }</Table.Row>
})
return tableRowElements return tableRowElements
} }