Added filtering by blank part of speech, fixed part of speech dropdown for edits, added import template CSV to download, updated import test to test blank part of speech.
This commit is contained in:
parent
368fc8cd20
commit
9deb9087e6
20
IMPORT.form
20
IMPORT.form
|
@ -1,15 +1,17 @@
|
|||
<div class="settingsCol">
|
||||
<h2>Import</h2>
|
||||
<div id="importOptions">
|
||||
<h2>Import</h2>
|
||||
<div id="importOptions">
|
||||
<div class="settingsCol">
|
||||
<label>
|
||||
<span>Word List</span>
|
||||
</label>
|
||||
<p style="font-size:12px;">This process imports words in a CSV format to the currently loaded dictionary. <small>(You can save an Excel file as a CSV)</small></p>
|
||||
<p style="font-size:12px;">The CSV file must have a header line in this order: word,pronunciation,part of speech,equivalent,explanation. Your words must be formatted in the appropriate order.</p>
|
||||
<p style="font-size:12px;">Make sure the parts of speech for each word correspond to your dictionary's parts of speech or else it will be lost if you edit the word. If a part of speech is left blank, you can find the blanks using the "Blank" option in the Filter.</p>
|
||||
<p style="font-size:12px;">At a minimum, all of your words <em>must</em> have the "word" field <em>and</em> either the "equivalent" or "explanation" field filled out in the CSV file.</p>
|
||||
<input type="file" id="importWordsCSV" />
|
||||
<button type="button" onclick="ImportWords(); return false;">Import Words</button>
|
||||
<p style="font-size:12px;">This process imports words in a CSV format to the currently loaded dictionary. <small>(Note: You can save an Excel file as a CSV)</small></p>
|
||||
<p style="font-size:12px;">The CSV file must have a header line in this order: word,pronunciation,part of speech,equivalent,explanation. Your word data must be in the appropriate order according to the headers. You can use <span class="clickable inline-button" onclick="download('import_template.csv','word,pronunciation,part of speech,equivalent,explanation\n');">this CSV as a template</span> if you need help.</p>
|
||||
<p style="font-size:12px;">Make sure the parts of speech for each word correspond to your dictionary's parts of speech or else you won't be able to find it using a filter. If a part of speech is left blank, you can find the blanks using the "Blank" option in the Filter so you can clean up.</p>
|
||||
<p style="font-size:12px;">At a minimum, all of your words <em>must</em> have the "word" field <em>and</em> either the "equivalent" or "explanation" field filled out in the CSV file.</p>
|
||||
<input type="file" id="importWordsCSV" />
|
||||
<button type="button" onclick="ImportWords(); return false;">Import Words</button>
|
||||
</div>
|
||||
<div class="settingsCol">
|
||||
<label>
|
||||
<span>Full Dictionary</span>
|
||||
<p style="font-size:12px;">This process imports a full dictionary previously exported from Lexiconga in a .dict format.</p>
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
"word","pronunciation","part of speech","equivalent","explanation"
|
||||
"test","[tehst]","Noun","an example, per se!","no explanation required."
|
||||
test,"[tehst]","Verb","to test, i.e. to ""try to see"" if something works","no explanation required."
|
||||
"tested","[tehst-ehd]",Adjective,"of or relating to an example","no explanation required."
|
||||
|
||||
"testable","[tehst-uh-bull]","Adjective","Able to be have ""tests"" run on","explanation"
|
||||
word,pronunciation,part of speech,equivalent,explanation
|
||||
test0, [tehst], ,dah,
|
||||
test1, [tehst], a ,dah,
|
||||
test2, [tehst], a ,dah,
|
|
|
@ -68,7 +68,7 @@ function AddWord() {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
currentDictionary.words.push({name: word, pronunciation: pronunciation, partOfSpeech: partOfSpeech, simpleDefinition: simpleDefinition, longDefinition: longDefinition, wordId: currentDictionary.nextWordId++});
|
||||
currentDictionary.words.push({name: word, pronunciation: pronunciation, partOfSpeech: ((partOfSpeech.length > 0) ? partOfSpeech : " "), simpleDefinition: simpleDefinition, longDefinition: longDefinition, wordId: currentDictionary.nextWordId++});
|
||||
FocusAfterAddingNewWord();
|
||||
NewWordNotification(word);
|
||||
SaveAndUpdateDictionary(false);
|
||||
|
@ -103,7 +103,7 @@ function ShowWordEditForm(index) {
|
|||
<input type="text" id="pronunciation' + indexString + '" value="' + htmlEntitiesParse(word.pronunciation) + '" onkeydown="SubmitWordOnCtrlEnter(this)" />\
|
||||
</label>\
|
||||
<label><span>Part of Speech</span>\
|
||||
<select id="partOfSpeech' + indexString + '" value="' + htmlEntitiesParse(word.partOfSpeech) + '" onkeydown="SubmitWordOnCtrlEnter(this)"></select>\
|
||||
<select id="partOfSpeech' + indexString + '" onkeydown="SubmitWordOnCtrlEnter(this)"></select>\
|
||||
</label>\
|
||||
<label><span>Equivalent Word(s)</span>\
|
||||
<input type="text" id="simpleDefinition' + indexString + '" value="' + htmlEntitiesParse(word.simpleDefinition) + '" onkeydown="SubmitWordOnCtrlEnter(this)" />\
|
||||
|
@ -121,6 +121,7 @@ function ShowWordEditForm(index) {
|
|||
document.getElementById("entry" + indexString).innerHTML = editForm;
|
||||
|
||||
SetPartsOfSpeech("partOfSpeech" + indexString);
|
||||
document.getElementById("partOfSpeech" + indexString).value = htmlEntitiesParse(word.partOfSpeech);
|
||||
}
|
||||
|
||||
function CancelEditForm(index) {
|
||||
|
@ -160,7 +161,7 @@ function EditWord(indexString) {
|
|||
function UpdateWord(wordIndex, word, pronunciation, partOfSpeech, simpleDefinition, longDefinition) {
|
||||
currentDictionary.words[wordIndex].name = word;
|
||||
currentDictionary.words[wordIndex].pronunciation = pronunciation;
|
||||
currentDictionary.words[wordIndex].partOfSpeech = partOfSpeech;
|
||||
currentDictionary.words[wordIndex].partOfSpeech = ((partOfSpeech.length > 0) ? partOfSpeech : " ");
|
||||
currentDictionary.words[wordIndex].simpleDefinition = simpleDefinition;
|
||||
currentDictionary.words[wordIndex].longDefinition = longDefinition;
|
||||
|
||||
|
@ -690,13 +691,17 @@ function ImportWords() {
|
|||
header: true,
|
||||
step: function(row, parser) {
|
||||
currentRow++;
|
||||
if (row.errors.length == 0) {
|
||||
currentDictionary.words.push({name: htmlEntities(row.data[0]["word"]).trim(), pronunciation: htmlEntities(row.data[0]["pronunciation"]).trim(), partOfSpeech: htmlEntities(row.data[0]["part of speech"]).trim(), simpleDefinition: htmlEntities(row.data[0]["equivalent"]).trim(), longDefinition: htmlEntities(row.data[0]["explanation"]).trim(), wordId: currentDictionary.nextWordId++});
|
||||
// If there are no errors OR the word and either equivalent or explanation contain data, then import it.
|
||||
if ((row.data[0].word.trim().length > 0 && (row.data[0].equivalent.trim().length > 0 || row.data[0].explanation.trim().length > 0)) || row.errors.length == 0) {
|
||||
currentDictionary.words.push({name: htmlEntities(row.data[0]["word"]).trim(), pronunciation: htmlEntities(row.data[0]["pronunciation"]).trim(), partOfSpeech: ((htmlEntities(row.data[0]["part of speech"]).trim().length > 0) ? htmlEntities(row.data[0]["part of speech"]).trim() : " "), simpleDefinition: htmlEntities(row.data[0]["equivalent"]).trim(), longDefinition: htmlEntities(row.data[0]["explanation"]).trim(), wordId: currentDictionary.nextWordId++});
|
||||
resultsArea.innerHTML += "<p>Imported \"" + htmlEntitiesParse(htmlEntities(row.data[0]["word"])).trim() + "\" successfully</p>";
|
||||
rowsImported++;
|
||||
} else {
|
||||
for (var i = 0; i < row.errors.length; i++) {
|
||||
resultsArea.innerHTML += "<p>Error on record #" + currentRow.toString() + ": " + row.errors[i].message + "</p>";
|
||||
// If it's not just an empty line, give an error.
|
||||
if (row.data[0].word.trim().length > 0) {
|
||||
for (var i = 0; i < row.errors.length; i++) {
|
||||
resultsArea.innerHTML += "<p>Error on record #" + currentRow.toString() + ": " + row.errors[i].message + "</p>";
|
||||
}
|
||||
}
|
||||
}
|
||||
// Scroll to the bottom.
|
||||
|
|
20
js/ui.js
20
js/ui.js
|
@ -588,11 +588,17 @@ function SetPartsOfSpeech (selectId) {
|
|||
var wordFiltersSelected = GetSelectedFilters();
|
||||
|
||||
// Clear parts of speech.
|
||||
for (var i = partsOfSpeechSelect.options.length - 1; i >= 0; i--) {
|
||||
for (var i = partsOfSpeechSelect.options.length; i > 0; i--) {
|
||||
partsOfSpeechSelect.removeChild(partsOfSpeechSelect.options[i]);
|
||||
}
|
||||
wordFilterOptions.innerHTML = "";
|
||||
|
||||
// Insert blank part of speech as first dropdown option.
|
||||
var blankpartOfSpeechOption = document.createElement('option');
|
||||
blankpartOfSpeechOption.appendChild(document.createTextNode(""));
|
||||
blankpartOfSpeechOption.value = " ";
|
||||
partsOfSpeechSelect.appendChild(blankpartOfSpeechOption);
|
||||
|
||||
// Rebuild parts of speech
|
||||
var newPartsOfSpeech = htmlEntitiesParse(currentDictionary.settings.partsOfSpeech).trim().split(",");
|
||||
for (var j = 0; j < newPartsOfSpeech.length; j++) {
|
||||
|
@ -614,6 +620,18 @@ function SetPartsOfSpeech (selectId) {
|
|||
wordFilterLabel.appendChild(wordFilterCheckbox);
|
||||
wordFilterOptions.appendChild(wordFilterLabel);
|
||||
}
|
||||
|
||||
// Insert blank part of speech as last filter option
|
||||
var blankwordFilterLabel = document.createElement('label');
|
||||
blankwordFilterLabel.appendChild(document.createTextNode("Blanks "));
|
||||
blankwordFilterLabel['part-of-speech'] = " ";
|
||||
blankwordFilterLabel.className = 'filterOption';
|
||||
var blankwordFilterCheckbox = document.createElement('input');
|
||||
blankwordFilterCheckbox.type = 'checkbox';
|
||||
blankwordFilterCheckbox.onchange = function(){ShowDictionary()};
|
||||
if (wordFiltersSelected.indexOf(" ") > -1) blankwordFilterCheckbox.checked = true;
|
||||
blankwordFilterLabel.appendChild(blankwordFilterCheckbox);
|
||||
wordFilterOptions.appendChild(blankwordFilterLabel);
|
||||
}
|
||||
|
||||
function GetSelectedFilters() {
|
||||
|
|
Loading…
Reference in New Issue