parent
b5cc47a9d1
commit
371c07ab1f
@ -148,6 +148,79 @@ class Database {
|
|||||||
return this.db.dictionaries.toArray();
|
return this.db.dictionaries.toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deleteDictionary(title, callback) {
|
||||||
|
if (this.db === null) {
|
||||||
|
return Promise.reject('database not initialized');
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.db.dictionaries.where('title').equals(title).first(info => {
|
||||||
|
if (!info) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let termCounter = Promise.resolve(0);
|
||||||
|
if (info.hasTerms) {
|
||||||
|
termCounter = this.db.terms.where('dictionary').equals(title).count();
|
||||||
|
}
|
||||||
|
|
||||||
|
let kanjiCounter = Promise.resolve(0);
|
||||||
|
if (info.hasKanji) {
|
||||||
|
kanjiCounter = this.db.kanji.where('dictionary').equals(title).count();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all([termCounter, kanjiCounter]).then(([termCount, kanjiCount]) => {
|
||||||
|
const totalCount = termCount + kanjiCount;
|
||||||
|
let deletedCount = 0;
|
||||||
|
|
||||||
|
let termDeleter = Promise.resolve();
|
||||||
|
if (info.hasTerms) {
|
||||||
|
const termDeleterFunc = () => {
|
||||||
|
return this.db.terms.where('dictionary').equals(title).limit(1000).delete().then(count => {
|
||||||
|
if (count === 0) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
deletedCount += count;
|
||||||
|
if (callback) {
|
||||||
|
callback(totalCount, deletedCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
return termDeleterFunc();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
termDeleter = termDeleterFunc();
|
||||||
|
}
|
||||||
|
|
||||||
|
let kanjiDeleter = Promise.resolve();
|
||||||
|
if (info.hasKanji) {
|
||||||
|
const kanjiDeleterFunc = () => {
|
||||||
|
return this.db.kanji.where('dictionary').equals(title).limit(1000).delete().then(count => {
|
||||||
|
if (count === 0) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
deletedCount += count;
|
||||||
|
if (callback) {
|
||||||
|
callback(totalCount, deletedCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
return kanjiDeleterFunc();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
kanjiDeleter = kanjiDeleterFunc();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all([termDeleter, kanjiDeleter]);
|
||||||
|
});
|
||||||
|
}).then(() => {
|
||||||
|
return this.db.entities.where('dictionary').equals(title).delete();
|
||||||
|
}).then(() => {
|
||||||
|
return this.db.dictionaries.where('title').equals(title).delete();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
importDictionary(indexUrl, callback) {
|
importDictionary(indexUrl, callback) {
|
||||||
if (this.db === null) {
|
if (this.db === null) {
|
||||||
return Promise.reject('database not initialized');
|
return Promise.reject('database not initialized');
|
||||||
|
@ -141,6 +141,7 @@ function populateDictionaries(opts) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$('.dict-enable-terms, .dict-enable-kanji').change(onOptionsChanged);
|
$('.dict-enable-terms, .dict-enable-kanji').change(onOptionsChanged);
|
||||||
|
$('.dict-delete').click(onDictionaryDelete);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
dictError.show().find('span').text(error);
|
dictError.show().find('span').text(error);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
@ -148,6 +149,36 @@ function populateDictionaries(opts) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onDictionaryDelete() {
|
||||||
|
const dictGroup = $(this).closest('.dict-group');
|
||||||
|
|
||||||
|
const dictError = $('#dict-error');
|
||||||
|
dictError.hide();
|
||||||
|
|
||||||
|
const dictSpinner = $('#dict-spinner');
|
||||||
|
dictSpinner.show();
|
||||||
|
|
||||||
|
const dictProgress = dictGroup.find('.dict-delete-progress');
|
||||||
|
dictProgress.show();
|
||||||
|
|
||||||
|
const dictControls = dictGroup.find('.dict-controls');
|
||||||
|
dictControls.hide();
|
||||||
|
|
||||||
|
const callback = (total, current) => {
|
||||||
|
dictProgress.find('div').css('width', `${current / total * 100.0}%`);
|
||||||
|
};
|
||||||
|
|
||||||
|
database().deleteDictionary(dictGroup.data('title'), callback).then(() => {
|
||||||
|
dictGroup.slideUp();
|
||||||
|
}).catch(error => {
|
||||||
|
dictError.show().find('span').text(error);
|
||||||
|
}).then(() => {
|
||||||
|
dictSpinner.hide();
|
||||||
|
dictProgress.hide();
|
||||||
|
dictControls.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function onDictionaryImport() {
|
function onDictionaryImport() {
|
||||||
const dictImport = $(this);
|
const dictImport = $(this);
|
||||||
dictImport.prop('disabled', true);
|
dictImport.prop('disabled', true);
|
||||||
@ -155,7 +186,7 @@ function onDictionaryImport() {
|
|||||||
const dictError = $('#dict-error');
|
const dictError = $('#dict-error');
|
||||||
dictError.hide();
|
dictError.hide();
|
||||||
|
|
||||||
const dictProgress = $('.dict-progress');
|
const dictProgress = $('.dict-import-progress');
|
||||||
dictProgress.show();
|
dictProgress.show();
|
||||||
|
|
||||||
const dictSpinner = $('#dict-spinner');
|
const dictSpinner = $('#dict-spinner');
|
||||||
|
@ -9,17 +9,17 @@ templates['dictionary.html'] = template({"1":function(container,depth0,helpers,p
|
|||||||
|
|
||||||
return "<div class=\"dict-group well well-sm\" data-title=\""
|
return "<div class=\"dict-group well well-sm\" data-title=\""
|
||||||
+ alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper)))
|
+ alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper)))
|
||||||
+ "\">\n <h4><span class=\"text-muted glyphicon glyphicon-book\"></span> "
|
+ "\">\n <div class=\"row\">\n <div class=\"col-xs-8\">\n <h4><span class=\"text-muted glyphicon glyphicon-book\"></span> "
|
||||||
+ alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper)))
|
+ alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper)))
|
||||||
+ " <small>v."
|
+ " <small>v."
|
||||||
+ alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"version","hash":{},"data":data}) : helper)))
|
+ alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"version","hash":{},"data":data}) : helper)))
|
||||||
+ "</small></h4>\n <div class=\"checkbox "
|
+ "</small></h4>\n </div>\n <div class=\"col-xs-4 text-right disabled\">\n <button type=\"button\" class=\"dict-controls dict-delete btn btn-danger\">Delete</button>\n </div>\n </div>\n <div class=\"dict-delete-progress\">Dictionary data is being deleted, please be patient...</div>\n <div class=\"progress dict-delete-progress\">\n <div class=\"progress-bar progress-bar-striped progress-bar-danger\" style=\"width: 0%\"></div>\n </div>\n <div class=\"checkbox dict-controls "
|
||||||
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasTerms : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasTerms : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
+ "\">\n <label><input type=\"checkbox\" class=\"dict-enable-terms\" "
|
+ "\">\n <label><input type=\"checkbox\" class=\"dict-enable-terms\" "
|
||||||
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasTerms : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasTerms : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
+ " "
|
+ " "
|
||||||
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.enableTerms : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
+ ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.enableTerms : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
+ "> Enable term search</label>\n </div>\n <div class=\"checkbox "
|
+ "> Enable term search</label>\n </div>\n <div class=\"checkbox dict-controls "
|
||||||
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasKanji : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasKanji : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
+ "\">\n <label><input type=\"checkbox\" class=\"dict-enable-kanji\" "
|
+ "\">\n <label><input type=\"checkbox\" class=\"dict-enable-kanji\" "
|
||||||
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasKanji : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
+ ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.hasKanji : depth0),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "")
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="../lib/bootstrap-3.3.6-dist/css/bootstrap-theme.min.css">
|
<link rel="stylesheet" type="text/css" href="../lib/bootstrap-3.3.6-dist/css/bootstrap-theme.min.css">
|
||||||
<style>
|
<style>
|
||||||
#anki-spinner, #anki-general, #anki-error,
|
#anki-spinner, #anki-general, #anki-error,
|
||||||
#dict-spinner, .dict-progress,
|
#dict-spinner, .dict-import-progress, .dict-delete-progress,
|
||||||
#options-advanced {
|
#options-advanced {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -75,8 +75,8 @@
|
|||||||
<span></span>
|
<span></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="dict-progress">Dictionary data is being imported, please be patient...</div>
|
<div class="dict-import-progress">Dictionary data is being imported, please be patient...</div>
|
||||||
<div class="progress dict-progress">
|
<div class="progress dict-import-progress">
|
||||||
<div class="progress-bar progress-bar-striped" style="width: 0%"></div>
|
<div class="progress-bar progress-bar-striped" style="width: 0%"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,9 +1,20 @@
|
|||||||
<div class="dict-group well well-sm" data-title="{{title}}">
|
<div class="dict-group well well-sm" data-title="{{title}}">
|
||||||
<h4><span class="text-muted glyphicon glyphicon-book"></span> {{title}} <small>v.{{version}}</small></h4>
|
<div class="row">
|
||||||
<div class="checkbox {{#unless hasTerms}}disabled{{/unless}}">
|
<div class="col-xs-8">
|
||||||
|
<h4><span class="text-muted glyphicon glyphicon-book"></span> {{title}} <small>v.{{version}}</small></h4>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-4 text-right disabled">
|
||||||
|
<button type="button" class="dict-controls dict-delete btn btn-danger">Delete</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dict-delete-progress">Dictionary data is being deleted, please be patient...</div>
|
||||||
|
<div class="progress dict-delete-progress">
|
||||||
|
<div class="progress-bar progress-bar-striped progress-bar-danger" style="width: 0%"></div>
|
||||||
|
</div>
|
||||||
|
<div class="checkbox dict-controls {{#unless hasTerms}}disabled{{/unless}}">
|
||||||
<label><input type="checkbox" class="dict-enable-terms" {{#unless hasTerms}}disabled{{/unless}} {{#if enableTerms}}checked{{/if}}> Enable term search</label>
|
<label><input type="checkbox" class="dict-enable-terms" {{#unless hasTerms}}disabled{{/unless}} {{#if enableTerms}}checked{{/if}}> Enable term search</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="checkbox {{#unless hasKanji}}disabled{{/unless}}">
|
<div class="checkbox dict-controls {{#unless hasKanji}}disabled{{/unless}}">
|
||||||
<label><input type="checkbox" class="dict-enable-kanji" {{#unless hasKanji}}disabled{{/unless}} {{#if enableKanji}}checked{{/if}}> Enable Kanji search</label>
|
<label><input type="checkbox" class="dict-enable-kanji" {{#unless hasKanji}}disabled{{/unless}} {{#if enableKanji}}checked{{/if}}> Enable Kanji search</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user