Start adding words to db via search form
This commit is contained in:
parent
dc0d7eff07
commit
80fdea0d4c
|
@ -47,7 +47,7 @@ export class SearchBox extends Component {
|
||||||
<span className='select'>
|
<span className='select'>
|
||||||
<select value={this.state.searchingIn}
|
<select value={this.state.searchingIn}
|
||||||
onChange={event => {
|
onChange={event => {
|
||||||
this.setState({searchingIn: event.target.value});
|
this.setState({ searchingIn: event.target.value });
|
||||||
}}>
|
}}>
|
||||||
<option value='name'>Word</option>
|
<option value='name'>Word</option>
|
||||||
<option value='definition'>Definition</option>
|
<option value='definition'>Definition</option>
|
||||||
|
@ -60,7 +60,7 @@ export class SearchBox extends Component {
|
||||||
value={this.state.searchTerm}
|
value={this.state.searchTerm}
|
||||||
onChange={event => {
|
onChange={event => {
|
||||||
console.log(event);
|
console.log(event);
|
||||||
this.setState({searchTerm: event.target.value});
|
this.setState({ searchTerm: event.target.value });
|
||||||
}} />
|
}} />
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,9 +1,81 @@
|
||||||
import Inferno from 'inferno';
|
import Inferno from 'inferno';
|
||||||
import Component from 'inferno-component';
|
import Component from 'inferno-component';
|
||||||
|
|
||||||
|
import {Word} from '../../managers/Word';
|
||||||
|
|
||||||
export class WordForm extends Component {
|
export class WordForm extends Component {
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
wordName: this.props.name || ''
|
||||||
|
, wordPronunciation: this.props.pronunciation || ''
|
||||||
|
, wordPartOfSpeech: this.props.partOfSpeech || ''
|
||||||
|
, wordDefinition: this.props.definition || ''
|
||||||
|
, wordDetails: this.props.details || ''
|
||||||
|
|
||||||
|
, nameIsValid: true
|
||||||
|
, pronunciationIsValid: true
|
||||||
|
, partOfSpeechIsValid: true
|
||||||
|
, definitionIsValid: true
|
||||||
|
, detailsIsValid: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isValidWord () {
|
||||||
|
let nameIsValid = true
|
||||||
|
, definitionIsValid = true
|
||||||
|
, detailsIsValid = true;
|
||||||
|
|
||||||
|
if (this.state.wordName === '') {
|
||||||
|
nameIsValid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.state.wordPartOfSpeech === '') {
|
||||||
|
// popup(?) confirming no part of speech.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.state.wordDefinition === ''
|
||||||
|
&& this.state.wordDetails === '') {
|
||||||
|
definitionIsValid = false;
|
||||||
|
detailsIsValid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
nameIsValid
|
||||||
|
, definitionIsValid
|
||||||
|
, detailsIsValid
|
||||||
|
});
|
||||||
|
|
||||||
|
return nameIsValid == true && definitionIsValid == true && detailsIsValid == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
createWord () {
|
||||||
|
const word = new Word({
|
||||||
|
name: this.state.wordName
|
||||||
|
, pronunciation: this.state.wordPronunciation
|
||||||
|
, partOfSpeech: this.state.wordPartOfSpeech
|
||||||
|
, definition: this.state.wordDefinition
|
||||||
|
, details: this.state.wordDetails
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if (this.isValidWord()) {
|
||||||
|
word.create()
|
||||||
|
.then(() => {
|
||||||
|
this.clearForm();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clearForm () {
|
||||||
|
this.setState({
|
||||||
|
wordName: ''
|
||||||
|
, wordPronunciation: ''
|
||||||
|
, wordPartOfSpeech: ''
|
||||||
|
, wordDefinition: ''
|
||||||
|
, wordDetails: ''
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
@ -12,14 +84,27 @@ export class WordForm extends Component {
|
||||||
<div className='field'>
|
<div className='field'>
|
||||||
<label className='label'>Word</label>
|
<label className='label'>Word</label>
|
||||||
<p className='control'>
|
<p className='control'>
|
||||||
<input className='input' type='text' placeholder='Required' />
|
<input className={`input${(!this.state.nameIsValid) ? ' is-danger' : ''}`}
|
||||||
|
type='text' placeholder='Required'
|
||||||
|
value={this.state.wordName}
|
||||||
|
onChange={(event) => {
|
||||||
|
this.setState({ wordName: event.target.value });
|
||||||
|
}} />
|
||||||
|
{(!this.state.nameIsValid)
|
||||||
|
? (
|
||||||
|
<span className='help is-danger'>You must specify the word.</span>
|
||||||
|
) : null}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='field'>
|
<div className='field'>
|
||||||
<label className='label'>Pronunciation</label>
|
<label className='label'>Pronunciation</label>
|
||||||
<p className='control'>
|
<p className='control'>
|
||||||
<input className='input' type='text' placeholder='[prəˌnʌnsiˈeɪʃən]' />
|
<input className='input' type='text' placeholder='[prəˌnʌnsiˈeɪʃən]'
|
||||||
|
value={this.state.wordPronunciation}
|
||||||
|
onChange={(event) => {
|
||||||
|
this.setState({ wordPronunciation: event.target.value });
|
||||||
|
}} />
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -27,8 +112,11 @@ export class WordForm extends Component {
|
||||||
<label className='label'>Part of Speech</label>
|
<label className='label'>Part of Speech</label>
|
||||||
<p className='control'>
|
<p className='control'>
|
||||||
<span className='select'>
|
<span className='select'>
|
||||||
<select>
|
<select value={this.state.wordPartOfSpeech}
|
||||||
<option></option>
|
onChange={event => {
|
||||||
|
this.setState({ wordPartOfSpeech: event.target.value });
|
||||||
|
}}>
|
||||||
|
<option value=''></option>
|
||||||
{this.props.partsOfSpeech.map((partOfSpeech) => {
|
{this.props.partsOfSpeech.map((partOfSpeech) => {
|
||||||
return (
|
return (
|
||||||
<option value={partOfSpeech}>{partOfSpeech}</option>
|
<option value={partOfSpeech}>{partOfSpeech}</option>
|
||||||
|
@ -42,14 +130,48 @@ export class WordForm extends Component {
|
||||||
<div className='field'>
|
<div className='field'>
|
||||||
<label className='label'>Definition</label>
|
<label className='label'>Definition</label>
|
||||||
<p className='control'>
|
<p className='control'>
|
||||||
<input className='input' type='text' placeholder='Text input' />
|
<input className={`input${(!this.state.definitionIsValid) ? ' is-danger' : ''}`}
|
||||||
|
type='text' placeholder='Equivalent word(s)'
|
||||||
|
value={this.state.wordDefinition}
|
||||||
|
onChange={(event) => {
|
||||||
|
this.setState({ wordDefinition: event.target.value })
|
||||||
|
}} />
|
||||||
|
{(!this.state.definitionIsValid)
|
||||||
|
? (
|
||||||
|
<span className='help is-danger'>
|
||||||
|
You must at least enter a Definition if excluding Details.
|
||||||
|
</span>
|
||||||
|
) : null}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='field'>
|
<div className='field'>
|
||||||
<label className='label'>Details</label>
|
<label className='label'>Details</label>
|
||||||
<p className='control'>
|
<p className='control'>
|
||||||
<textarea className='textarea' placeholder='Textarea' />
|
<textarea className={`textarea${(!this.state.detailsIsValid) ? ' is-danger' : ''}`}
|
||||||
|
placeholder='Explanation of word (Markdown enabled)'
|
||||||
|
onChange={(event) => {
|
||||||
|
this.setState({ wordDetails: event.target.value });
|
||||||
|
}}>
|
||||||
|
{this.state.wordDetails}
|
||||||
|
</textarea>
|
||||||
|
{(!this.state.detailsIsValid)
|
||||||
|
? (
|
||||||
|
<span className='help is-danger'>
|
||||||
|
You must at least enter Details if excluding a Definition.
|
||||||
|
</span>
|
||||||
|
) : null}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='field'>
|
||||||
|
<p className='control'>
|
||||||
|
<a className='button is-primary'
|
||||||
|
onClick={() => {
|
||||||
|
this.createWord();
|
||||||
|
}}>
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
import store from 'store';
|
import store from 'store';
|
||||||
import wordDb from './WordDatabase';
|
import wordDb from './WordDatabase';
|
||||||
|
import idManager from './IDManager';
|
||||||
|
|
||||||
const defaultDictionary = {
|
const defaultDictionary = {
|
||||||
name: 'New'
|
name: 'New'
|
||||||
|
@ -17,6 +18,15 @@ class DictionaryData {
|
||||||
|
|
||||||
if (!store.get('Lexiconga')) {
|
if (!store.get('Lexiconga')) {
|
||||||
store.set('Lexiconga', defaultDictionary);
|
store.set('Lexiconga', defaultDictionary);
|
||||||
|
} else {
|
||||||
|
const largestId = wordDb.words
|
||||||
|
.orderBy('id').reverse()
|
||||||
|
.first((word) => {
|
||||||
|
return word.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
idManager.setId('word', ++largestId);
|
||||||
|
console.log('First word ID: ' + idManager.next('word').toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
class IDManager {
|
||||||
|
constructor () {
|
||||||
|
this['key'] = 0;
|
||||||
|
this['word'] = 0;
|
||||||
|
// Add IDs here as needed.
|
||||||
|
}
|
||||||
|
|
||||||
|
setID (id, value) {
|
||||||
|
this[id] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
next (id) {
|
||||||
|
return this[id]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new IDManager;
|
|
@ -0,0 +1,45 @@
|
||||||
|
import assert from 'assert';
|
||||||
|
import store from 'store';
|
||||||
|
import wordDb from './WordDatabase';
|
||||||
|
|
||||||
|
const defaultDictionary = {
|
||||||
|
name: 'New'
|
||||||
|
, specification: 'Dictionary'
|
||||||
|
, description: 'A new dictionary.'
|
||||||
|
, partsOfSpeech: ['Noun', 'Adjective', 'Verb']
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Word {
|
||||||
|
constructor ({name = '', pronunciation = '', partOfSpeech = '', definition = '', details = ''}) {
|
||||||
|
this.name = name;
|
||||||
|
this.pronunciation = pronunciation;
|
||||||
|
this.partOfSpeech = partOfSpeech;
|
||||||
|
this.definition = definition;
|
||||||
|
this.details = details;
|
||||||
|
}
|
||||||
|
|
||||||
|
create () {
|
||||||
|
const timestampInSeconds = Math.round(Date.now() / 1000);
|
||||||
|
this.createdTime = timestampInSeconds;
|
||||||
|
this.modifiedTime = null;
|
||||||
|
|
||||||
|
return wordDb.words.add(this)
|
||||||
|
.then(id => {
|
||||||
|
this.id = id;
|
||||||
|
console.log('Word added successfully');
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
update (wordObject, wordId) {
|
||||||
|
const timestampInSeconds = Math.round(Date.now() / 1000);
|
||||||
|
this.modifiedTime = timestampInSeconds;
|
||||||
|
|
||||||
|
wordDb.words.put(wordObject, wordId)
|
||||||
|
.catch(error => {
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,16 @@
|
||||||
import Dexie from 'dexie';
|
import Dexie from 'dexie';
|
||||||
|
|
||||||
|
import {Word} from './Word';
|
||||||
|
|
||||||
const db = new Dexie('Lexiconga');
|
const db = new Dexie('Lexiconga');
|
||||||
db.version(1).stores({
|
db.version(1).stores({
|
||||||
words: '++id, name, partOfSpeech'
|
words: '++id, name, partOfSpeech, createdTime, modifiedTime'
|
||||||
});
|
});
|
||||||
|
|
||||||
if (['emptydb', 'donotsave'].includes(process.env.NODE_ENV)) {
|
if (['emptydb', 'donotsave'].includes(process.env.NODE_ENV)) {
|
||||||
db.words.clear();
|
db.words.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.words.mapToClass(Word);
|
||||||
|
|
||||||
export default db;
|
export default db;
|
||||||
|
|
Loading…
Reference in New Issue