1
0
Fork 0
mirror of https://github.com/Alamantus/Lexiconga.git synced 2025-05-12 21:21:52 +02:00

Add WordsList and WordDisplay for displaying words

Need to figure out how to properly trigger a re-render of the list after
a word is added or updated.
This commit is contained in:
Robbie Antenesse 2017-05-18 23:43:29 -06:00
parent 74956c06f6
commit 55495f9f7f
7 changed files with 126 additions and 21 deletions

View file

@ -5,8 +5,9 @@ import {RightColumn} from './structure/RightColumn';
import {WordForm} from './management/WordForm'; import {WordForm} from './management/WordForm';
import {DictionaryDetails} from './display/DictionaryDetails'; import {DictionaryDetails} from './display/DictionaryDetails';
import {WordsList} from './display/WordsList';
export const MainDisplay = ({dictionaryInfo}) => { export const MainDisplay = ({dictionaryInfo, wordsToDisplayPromise}) => {
return ( return (
<section className='section'> <section className='section'>
<div className='container'> <div className='container'>
@ -31,6 +32,9 @@ export const MainDisplay = ({dictionaryInfo}) => {
] ]
}} }}
/> />
<WordsList
wordsPromise={wordsToDisplayPromise} />
</RightColumn> </RightColumn>
</div> </div>

View file

@ -0,0 +1,66 @@
import Inferno from 'inferno';
import Component from 'inferno-component';
import marked from 'marked';
import idManager from '../../managers/IDManager';
import {Word} from '../../managers/Word';
import {WordForm} from '../management/WordForm';
export class WordDisplay extends Component {
constructor (props) {
super(props);
this.state = {
isEditing: false
}
}
render () {
return (
<div className='card'>
<header className='card-header'>
<h3 className='card-header-title'>
{this.props.word.name}
</h3>
</header>
<section className='card-content'>
<div className='content'>
{(this.props.word.pronunciation || this.props.word.partOfSpeech)
&& (<p>
{(this.props.word.partOfSpeech)
? (<small>this.props.word.partOfSpeech</small>)
: ''}
{(this.props.word.partOfSpeech && this.props.word.pronunciation)
? ' | '
: ''}
{(this.props.word.pronunciation)
? (<small>this.props.word.pronunciation</small>)
: ''}
</p>
)}
{(this.props.word.definition)
&& (
<p>
{this.props.word.definition}
</p>
)}
{(this.props.word.details)
&& (
<p>
{this.props.word.details}
</p>
)}
</div>
</section>
</div>
);
}
}

View file

@ -0,0 +1,31 @@
import Inferno from 'inferno';
import Component from 'inferno-component';
import marked from 'marked';
import idManager from '../../managers/IDManager';
import {WordDisplay} from './WordDisplay';
export class WordsList extends Component {
constructor (props) {
super(props);
}
render () {
return (
<div className='box'>
{this.props.wordsPromise
&& this.props.wordsPromise.then(words => {
words.map(word => {
return (
<WordDisplay key={`word_${word.id}`}
word={word} />
);
})
})}
</div>
);
}
}

View file

@ -51,7 +51,7 @@ export class WordForm extends Component {
return nameIsValid == true && definitionIsValid == true && detailsIsValid == true; return nameIsValid == true && definitionIsValid == true && detailsIsValid == true;
} }
createWord () { submitWord () {
const word = new Word({ const word = new Word({
name: this.state.wordName name: this.state.wordName
, pronunciation: this.state.wordPronunciation , pronunciation: this.state.wordPronunciation
@ -62,12 +62,20 @@ export class WordForm extends Component {
if (this.isValidWord()) { if (this.isValidWord()) {
// Need to trigger a WordsList re-render after success.
if (this.props.wordId) {
word.update(this.props.wordId)
.then(() => {
this.props.callback();
})
} else {
word.create() word.create()
.then(() => { .then(() => {
this.clearForm(); this.clearForm();
}); });
} }
} }
}
clearForm () { clearForm () {
this.setState({ this.setState({
@ -160,7 +168,7 @@ export class WordForm extends Component {
<p className='control'> <p className='control'>
<a className='button is-primary' <a className='button is-primary'
onClick={() => { onClick={() => {
this.createWord(); this.submitWord();
}}> }}>
Create Create
</a> </a>

View file

@ -39,11 +39,11 @@ class App extends Component {
return info; return info;
} }
get wordsToDisplay () { get wordsToDisplayPromise () {
// const {searchIn, searchTerm, filteredPartsOfSpeech} = this.state.searchConfig; // const {searchIn, searchTerm, filteredPartsOfSpeech} = this.state.searchConfig;
// TODO: Sort out searching to remove this temporary solution. // TODO: Sort out searching to remove this temporary solution.
return dictionary.words; return dictionary.wordsPromise;
} }
search (searchConfig) { search (searchConfig) {
@ -60,7 +60,7 @@ class App extends Component {
<MainDisplay <MainDisplay
dictionaryInfo={this.dictionaryInfo} dictionaryInfo={this.dictionaryInfo}
wordsToDisplay={this.wordsToDisplay} /> wordsToDisplay={this.wordsToDisplayPromise} />
<Footer /> <Footer />
</div> </div>

View file

@ -70,7 +70,7 @@ class DictionaryData {
return store.set('Lexiconga', { partsOfSpeech: array }); return store.set('Lexiconga', { partsOfSpeech: array });
} }
get words () { get wordsPromise () {
return wordDb.words.toArray(); return wordDb.words.toArray();
} }

View file

@ -2,13 +2,6 @@ import assert from 'assert';
import store from 'store'; import store from 'store';
import wordDb from './WordDatabase'; import wordDb from './WordDatabase';
const defaultDictionary = {
name: 'New'
, specification: 'Dictionary'
, description: 'A new dictionary.'
, partsOfSpeech: ['Noun', 'Adjective', 'Verb']
}
export class Word { export class Word {
constructor ({name = '', pronunciation = '', partOfSpeech = '', definition = '', details = ''}) { constructor ({name = '', pronunciation = '', partOfSpeech = '', definition = '', details = ''}) {
this.name = name; this.name = name;
@ -33,13 +26,16 @@ export class Word {
}); });
} }
update (wordObject, wordId) { update (wordId) {
const timestampInSeconds = Math.round(Date.now() / 1000); const timestampInSeconds = Math.round(Date.now() / 1000);
this.modifiedTime = timestampInSeconds; this.modifiedTime = timestampInSeconds;
wordDb.words.put(wordObject, wordId) return wordDb.words.put(this, wordId)
.then(id => {
console.log('Word modified successfully');
})
.catch(error => { .catch(error => {
console.error(error);
}); });
} }
} }