181 lines
5.0 KiB
JavaScript
181 lines
5.0 KiB
JavaScript
import uuid from 'node-uuid';
|
|
|
|
|
|
export default class _wordset {
|
|
constructor() {
|
|
this.sets = {};
|
|
let wordsets = localStorage.getItem("wordsets");
|
|
if (wordsets) {
|
|
this.sets = JSON.parse(wordsets);
|
|
}
|
|
}
|
|
save() {
|
|
localStorage.setItem("wordsets", JSON.stringify(this.sets));
|
|
}
|
|
get _inner() {
|
|
return this.sets;
|
|
}
|
|
get _firstClass(){
|
|
return Object.keys(this.sets)[0] || null;
|
|
}
|
|
get _allclass(){
|
|
return Object.keys(this.sets);
|
|
}
|
|
get _allsets(){
|
|
return Object.values(this.sets);
|
|
}
|
|
getClass(class_name) {
|
|
if (this.sets[class_name]) {
|
|
return this.sets[class_name];
|
|
}
|
|
else return null;
|
|
}
|
|
getSetStatus(class_name,id){
|
|
let set_class = this.getClass(class_name);
|
|
if(set_class){
|
|
for(let i of set_class){
|
|
if(i.id === id){
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
getId(class_name,id){
|
|
let set_class = this.sets[class_name];
|
|
for(let index in set_class){
|
|
if(set_class[index].id === id){
|
|
return index;
|
|
}
|
|
}
|
|
}
|
|
getSet(id) {
|
|
let sets = JSON.parse(localStorage.getItem(id));
|
|
if (sets) {
|
|
return sets;
|
|
}
|
|
else return [];
|
|
}
|
|
delSet(class_name, index) {
|
|
let set_class = this.sets[class_name];
|
|
if (set_class) {
|
|
if (set_class[index]) {
|
|
localStorage.removeItem(set_class[index].id);
|
|
this.sets[class_name].splice(index, 1);
|
|
if (!this.sets[class_name].length) {
|
|
delete this.sets[class_name];
|
|
}
|
|
localStorage.setItem("wordsets", JSON.stringify(this.sets));
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
addSet(class_name,name) {
|
|
if (!this.sets[class_name]) {
|
|
this.sets[class_name] = [];
|
|
}
|
|
let id = uuid.v1();
|
|
let time = (new Date()).getTime()
|
|
this.sets[class_name].push({
|
|
name: name,
|
|
id: id,
|
|
created: time,
|
|
});
|
|
localStorage.setItem(id, JSON.stringify([]));
|
|
this.save();
|
|
return id;
|
|
}
|
|
saveSet(id,data){
|
|
localStorage.setItem(id, JSON.stringify(data));
|
|
}
|
|
renameSet(class_name,id,new_name){
|
|
let set_class = this.getClass(class_name);
|
|
if(set_class){
|
|
for(let i of set_class){
|
|
if(i.id === id){
|
|
i.name = new_name;
|
|
this.save();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
addSetTo(origin_id,dest_id){
|
|
let origin_set = this.getSet(origin_id);
|
|
let dest_set = this.getSet(dest_id);
|
|
let set={};
|
|
origin_set.forEach(element => {
|
|
set[element.word] = element;
|
|
});
|
|
dest_set.forEach(element => {
|
|
set[element.word] = element;
|
|
});
|
|
set = Object.values(set);
|
|
this.saveSet(dest_id,set);
|
|
return origin_set.length + dest_set.length - set.length;
|
|
}
|
|
fromArray(arr,class_name,name){
|
|
let id = this.addSet(class_name,name);
|
|
this.saveSet(id,arr);
|
|
}
|
|
async import_set(callback){
|
|
let [fileHandle] = await window.showOpenFilePicker({
|
|
types: [
|
|
{
|
|
description: "JSON file",
|
|
accept: {
|
|
'text/json': ['.json'],
|
|
},
|
|
},
|
|
],
|
|
});
|
|
let file = await fileHandle.getFile();
|
|
let data = JSON.parse(await file.text());
|
|
let cnt = 0;
|
|
for (let i of Object.keys(data.wordsets)) {
|
|
for (let j of data.wordsets[i]) {
|
|
if (!localStorage.getItem(j.id)) {
|
|
if (!this.sets[i]) this.sets[i] = [];
|
|
this.sets[i].push(j);
|
|
localStorage.setItem(j.id, data.words[j.id]);
|
|
cnt++;
|
|
}
|
|
}
|
|
}
|
|
this.save();
|
|
if(typeof callback === "function"){
|
|
callback(cnt);
|
|
}
|
|
}
|
|
async export_set(callback) {
|
|
let fileHandle = await window.showSaveFilePicker({
|
|
types: [
|
|
{
|
|
description: "JSON file",
|
|
accept: {
|
|
'text/json': ['.json'],
|
|
},
|
|
},
|
|
],
|
|
});
|
|
let writestream = await fileHandle.createWritable();
|
|
let data = {
|
|
wordsets: this.sets,
|
|
words: {}
|
|
};
|
|
let cnt = 0;
|
|
for (let i of Object.values(this.sets)) {
|
|
for (let j of i) {
|
|
let temp = localStorage.getItem(j.id);
|
|
data.words[j.id] = temp;
|
|
cnt++;
|
|
}
|
|
}
|
|
writestream.write(JSON.stringify(data));
|
|
writestream.close();
|
|
if(typeof callback === "function"){
|
|
callback(cnt);
|
|
}
|
|
}
|
|
} |