feat: nodule create and delete
This commit is contained in:
parent
5fb7ed01c6
commit
4f27a64abc
@ -27,14 +27,12 @@ class Nodules {
|
|||||||
|
|
||||||
removeById = id => {
|
removeById = id => {
|
||||||
const indexToRemove = this.collection.findIndex(n => n.id === id)
|
const indexToRemove = this.collection.findIndex(n => n.id === id)
|
||||||
if (this.collection.length === 1 && indexToRemove > -1) {
|
if (indexToRemove > -1) this.collection.splice(indexToRemove, 1)
|
||||||
this.collection = []
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const modifiedCollection = this.collection.splice(indexToRemove, 1)
|
|
||||||
this.collection = modifiedCollection
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getCollectionProps = () => this.collection.map(nodule => nodule.getProperties())
|
||||||
|
|
||||||
|
getTableByLabel = label => this.collection.find(n => label === n.label)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Nodules
|
export default Nodules
|
@ -20,12 +20,11 @@ class CreateNoduleController {
|
|||||||
filterParams,
|
filterParams,
|
||||||
tables
|
tables
|
||||||
})
|
})
|
||||||
console.log(this.nodules)
|
|
||||||
document.dispatchEvent(this.updatedNodulesEvent)
|
document.dispatchEvent(this.updatedNodulesEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteNodule = id => {
|
deleteNodule = id => {
|
||||||
this.nodules.removeTableById(id)
|
this.nodules.removeById(id)
|
||||||
document.dispatchEvent(this.updatedNodulesEvent)
|
document.dispatchEvent(this.updatedNodulesEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
src/Controllers/NoduleListController.js
Normal file
15
src/Controllers/NoduleListController.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import Nodules from '../Collections/Nodules'
|
||||||
|
|
||||||
|
class NoduleistController {
|
||||||
|
constructor() {
|
||||||
|
this.nodules = new Nodules()
|
||||||
|
this.updatedNodulesEvent = new Event('updateNodules')
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteTable = id => {
|
||||||
|
this.nodules.removeById(id)
|
||||||
|
document.dispatchEvent(this.updatedNodulesEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NoduleistController
|
@ -7,7 +7,7 @@ class TableListController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
deleteTable = id => {
|
deleteTable = id => {
|
||||||
this.tables.removeTableById(id)
|
this.tables.removeById(id)
|
||||||
document.dispatchEvent(this.updatedTablesEvent)
|
document.dispatchEvent(this.updatedTablesEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,7 @@ import App from './views/App'
|
|||||||
import * as serviceWorker from './serviceWorker'
|
import * as serviceWorker from './serviceWorker'
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<React.StrictMode>
|
<App />,
|
||||||
<App />
|
|
||||||
</React.StrictMode>,
|
|
||||||
document.getElementById('root')
|
document.getElementById('root')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import 'semantic-ui-css/semantic.min.css'
|
|||||||
import CreateTableForm from './CreateTable/CreateTableForm'
|
import CreateTableForm from './CreateTable/CreateTableForm'
|
||||||
import TableList from './TableList/TableList'
|
import TableList from './TableList/TableList'
|
||||||
import CreateNodule from './CreateNodule/CreateNodule'
|
import CreateNodule from './CreateNodule/CreateNodule'
|
||||||
|
import NoduleList from './NoduleList/NoduleList'
|
||||||
|
|
||||||
class App extends Component {
|
class App extends Component {
|
||||||
render = () => {
|
render = () => {
|
||||||
@ -12,6 +13,7 @@ class App extends Component {
|
|||||||
<CreateTableForm />
|
<CreateTableForm />
|
||||||
<CreateNodule />
|
<CreateNodule />
|
||||||
<TableList />
|
<TableList />
|
||||||
|
<NoduleList />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1,44 +1,48 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
import { Input, Dropdown, Grid } from 'semantic-ui-react'
|
import { Input, Dropdown, Grid, Button, Icon, List } from 'semantic-ui-react'
|
||||||
import './CreateNodule.css'
|
import './CreateNodule.css'
|
||||||
|
|
||||||
class CreateFilterNoduleForm extends Component {
|
class CreateFilterNoduleForm extends Component {
|
||||||
constructor () {
|
constructor () {
|
||||||
super()
|
super()
|
||||||
this.state = { filterType: '' }
|
this.state = {
|
||||||
|
filterType: '',
|
||||||
|
filterParams: {}
|
||||||
|
}
|
||||||
|
|
||||||
this.keyInput1 = React.createRef()
|
this.keyInput = React.createRef()
|
||||||
this.keyInput2 = React.createRef()
|
this.valueInput = React.createRef()
|
||||||
this.keyInput3 = React.createRef()
|
|
||||||
this.valueInput1 = React.createRef()
|
|
||||||
this.valueInput2 = React.createRef()
|
|
||||||
this.valueInput3 = React.createRef()
|
|
||||||
document.addEventListener('updateTables', this.updateTableList)
|
document.addEventListener('updateTables', this.updateTableList)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addKeyValueInput = () => {
|
||||||
|
let filterParams = this.state.filterParams || {}
|
||||||
|
|
||||||
|
if (this.keyInput.current.inputRef.current.value)
|
||||||
|
filterParams[this.keyInput.current.inputRef.current.value] = this.valueInput.current.inputRef.current.value
|
||||||
|
|
||||||
|
this.setState({ filterParams: filterParams })
|
||||||
|
}
|
||||||
|
|
||||||
handleChange = (e, value) => {
|
handleChange = (e, value) => {
|
||||||
this.setState({ filterType: value.value })
|
this.setState({ filterType: value.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
getFilterProperties = () => {
|
renderFilterParams = () => {
|
||||||
let filterParams = {}
|
const { filterParams } = this.state
|
||||||
|
|
||||||
if (this.keyInput1.current.inputRef.current.value)
|
let filterKeyElements = []
|
||||||
filterParams[this.keyInput1.current.inputRef.current.value] = this.valueInput1.current.inputRef.current.value
|
let filterValueElements = []
|
||||||
|
for (let key in filterParams) {
|
||||||
if (this.keyInput2.current.inputRef.current.value)
|
filterKeyElements.push(<List.Item>{key}</List.Item>)
|
||||||
filterParams[this.keyInput2.current.inputRef.current.value] = this.valueInput2.current.inputRef.current.value
|
filterValueElements.push(<List.Item>{filterParams[key]}</List.Item>)
|
||||||
|
|
||||||
if (this.keyInput3.current.inputRef.current.value)
|
|
||||||
filterParams[this.keyInput3.current.inputRef.current.value] = this.valueInput3.current.inputRef.current.value
|
|
||||||
|
|
||||||
return {
|
|
||||||
filterType: this.state.filterType,
|
|
||||||
filterParams
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return { filterKeyElements, filterValueElements }
|
||||||
}
|
}
|
||||||
|
|
||||||
render = () => {
|
render = () => {
|
||||||
|
const filterParamElements = this.renderFilterParams()
|
||||||
return (
|
return (
|
||||||
<div className='CreateFiltrerNoduleForm'>
|
<div className='CreateFiltrerNoduleForm'>
|
||||||
<Dropdown
|
<Dropdown
|
||||||
@ -57,14 +61,20 @@ class CreateFilterNoduleForm extends Component {
|
|||||||
|
|
||||||
<Grid columns={2} relaxed='very' stackable>
|
<Grid columns={2} relaxed='very' stackable>
|
||||||
<Grid.Column>
|
<Grid.Column>
|
||||||
<Input placeholder='Key' ref={this.keyInput1} style={{ width: '115px' }} />
|
<List celled>
|
||||||
<Input placeholder='Key' ref={this.keyInput2} style={{ width: '115px' }} />
|
{ filterParamElements.filterKeyElements }
|
||||||
<Input placeholder='Key' ref={this.keyInput3} style={{ width: '115px' }} />
|
</List>
|
||||||
|
<Input placeholder='Key' ref={this.keyInput} style={{ width: '115px' }} />
|
||||||
</Grid.Column>
|
</Grid.Column>
|
||||||
<Grid.Column>
|
<Grid.Column>
|
||||||
<Input placeholder='Value' ref={this.valueInput1} style={{ width: '115px' }} />
|
<List celled>
|
||||||
<Input placeholder='Value' ref={this.valueInput2} style={{ width: '115px' }} />
|
{ filterParamElements.filterValueElements }
|
||||||
<Input placeholder='Value' ref={this.valueInput3} style={{ width: '115px' }} />
|
</List>
|
||||||
|
<Input placeholder='Key' ref={this.valueInput} style={{ width: '115px' }} />
|
||||||
|
<Button animated='vertical' onClick={this.addKeyValueInput}>
|
||||||
|
<Button.Content hidden><Icon name='add' /></Button.Content>
|
||||||
|
<Button.Content visible>Add</Button.Content>
|
||||||
|
</Button>
|
||||||
</Grid.Column>
|
</Grid.Column>
|
||||||
</Grid>
|
</Grid>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import React, { Component } from 'react'
|
import React, { Component } from 'react'
|
||||||
import { Button, Input, Header, Dropdown, Table } from 'semantic-ui-react'
|
import { Button, Input, Header, Dropdown } from 'semantic-ui-react'
|
||||||
import CreateFilterNoduleForm from './CreateFilterNoduleForm'
|
import CreateFilterNoduleForm from './CreateFilterNoduleForm'
|
||||||
import './CreateNodule.css'
|
import './CreateNodule.css'
|
||||||
|
|
||||||
@ -20,6 +20,8 @@ class CreateNodule extends Component {
|
|||||||
this.controller = new CreateNoduleController()
|
this.controller = new CreateNoduleController()
|
||||||
|
|
||||||
this.filterNoduleForm = React.createRef()
|
this.filterNoduleForm = React.createRef()
|
||||||
|
this.tableSelect = React.createRef()
|
||||||
|
this.noduleLabelInput = React.createRef()
|
||||||
|
|
||||||
document.addEventListener('updateTables', this.updateTableList)
|
document.addEventListener('updateTables', this.updateTableList)
|
||||||
}
|
}
|
||||||
@ -29,8 +31,19 @@ class CreateNodule extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleSubmit = () => {
|
handleSubmit = () => {
|
||||||
if (this.state.noduleType === 'filter')
|
|
||||||
console.log(this.filterNoduleForm.current.getFilterProperties())
|
const noduleLabel = this.noduleLabelInput.current.inputRef.current.value
|
||||||
|
const selectedTableLabels = this.tableSelect.current.getSelectedTableLabels()
|
||||||
|
|
||||||
|
if (this.state.noduleType === 'filter') {
|
||||||
|
const filterProperties = this.filterNoduleForm.current.getFilterProperties()
|
||||||
|
this.controller.addNewFilterNodule({
|
||||||
|
label: noduleLabel,
|
||||||
|
tablesToImportByLabel: selectedTableLabels,
|
||||||
|
filterType: filterProperties.filterType,
|
||||||
|
filterParams: filterProperties.filterParams
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTableList = () => {
|
updateTableList = () => {
|
||||||
@ -49,7 +62,7 @@ class CreateNodule extends Component {
|
|||||||
|
|
||||||
<Input
|
<Input
|
||||||
placeholder='Nodule Label'
|
placeholder='Nodule Label'
|
||||||
ref={this.tableLabelInput}
|
ref={this.noduleLabelInput}
|
||||||
icon='tags'
|
icon='tags'
|
||||||
style={{ width: '300px' }}
|
style={{ width: '300px' }}
|
||||||
/>
|
/>
|
||||||
@ -68,7 +81,7 @@ class CreateNodule extends Component {
|
|||||||
onChange={this.handleChange}
|
onChange={this.handleChange}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<TableSelect />
|
<TableSelect ref={this.tableSelect} />
|
||||||
|
|
||||||
{ this.renderNoduleForm() }
|
{ this.renderNoduleForm() }
|
||||||
|
|
||||||
|
0
src/views/NoduleList/NoduleList.css
Normal file
0
src/views/NoduleList/NoduleList.css
Normal file
54
src/views/NoduleList/NoduleList.js
Normal file
54
src/views/NoduleList/NoduleList.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import React, { Component } from 'react'
|
||||||
|
import { Card, Icon, CardContent } from 'semantic-ui-react'
|
||||||
|
import './NoduleList.css'
|
||||||
|
|
||||||
|
import Nodule from '../../Collections/Nodules'
|
||||||
|
import NoduleListController from '../../Controllers/NoduleListController'
|
||||||
|
|
||||||
|
class NoduleList extends Component {
|
||||||
|
constructor () {
|
||||||
|
super()
|
||||||
|
|
||||||
|
this.nodules = new Nodule()
|
||||||
|
this.controller = new NoduleListController()
|
||||||
|
this.state = { nodules: this.nodules.getCollectionProps() }
|
||||||
|
|
||||||
|
document.addEventListener('updateNodules', this.updateNoduleList)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateNoduleList = () => {
|
||||||
|
this.setState({nodules: this.nodules.getCollectionProps()})
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTableListElements = () => {
|
||||||
|
const { nodules } = this.state
|
||||||
|
const noduleListElements = nodules.map(n =>
|
||||||
|
<Card key={n.id} id={n.id}>
|
||||||
|
<Card.Content>
|
||||||
|
<Card.Header>{ n.label }</Card.Header>
|
||||||
|
<Card.Meta>{`${n.tables.length} tables`}</Card.Meta>
|
||||||
|
</Card.Content>
|
||||||
|
<CardContent
|
||||||
|
extra
|
||||||
|
onClick={() => { this.controller.deleteNodule(n.id) }}
|
||||||
|
style={{ cursor: 'pointer' }}
|
||||||
|
>
|
||||||
|
Delete <Icon name='trash' />
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
)
|
||||||
|
return noduleListElements
|
||||||
|
}
|
||||||
|
|
||||||
|
render = () => {
|
||||||
|
return (
|
||||||
|
<div className='TableList'>
|
||||||
|
<Card.Group>
|
||||||
|
{ this.renderTableListElements() }
|
||||||
|
</Card.Group>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NoduleList
|
Loading…
x
Reference in New Issue
Block a user