mirror of https://github.com/espruino/BangleApps
feat: add app sorting functionality
parent
92c517e22f
commit
5c3bc8166f
|
@ -1,4 +1,4 @@
|
|||
const storage = require('Storage');
|
||||
const store = require('Storage');
|
||||
|
||||
const boolFormat = (v) => v ? "On" : "Off";
|
||||
|
||||
|
@ -12,25 +12,29 @@ function showMainMenu() {
|
|||
'Free': {
|
||||
value: undefined,
|
||||
format: (v) => {
|
||||
return storage.getFree();
|
||||
return store.getFree();
|
||||
},
|
||||
onchange: () => {}
|
||||
},
|
||||
'Compact': () => {
|
||||
E.showMessage('Compacting...');
|
||||
try {
|
||||
storage.compact();
|
||||
store.compact();
|
||||
} catch (e) {
|
||||
}
|
||||
m = showMainMenu();
|
||||
},
|
||||
'Apps': ()=> m = showApps(),
|
||||
'Sort Apps': () => m = showSortAppsMenu(),
|
||||
'< Back': ()=> {load();}
|
||||
};
|
||||
return E.showMenu(mainmenu);
|
||||
}
|
||||
|
||||
function isGlob(f) {return /[?*]/.test(f)}
|
||||
function isGlob(f) {
|
||||
return /[?*]/.test(f);
|
||||
}
|
||||
|
||||
function globToRegex(pattern) {
|
||||
const ESCAPE = '.*+-?^${}()|[]\\';
|
||||
const regex = pattern.replace(/./g, c => {
|
||||
|
@ -44,40 +48,41 @@ function globToRegex(pattern) {
|
|||
}
|
||||
|
||||
function eraseFiles(app) {
|
||||
app.files.split(",").forEach(f=>storage.erase(f));
|
||||
app.files.split(",").forEach(f=>store.erase(f));
|
||||
}
|
||||
|
||||
function eraseData(app) {
|
||||
if(!app.data) return;
|
||||
const d=app.data.split(';'),
|
||||
files=d[0].split(','),
|
||||
sFiles=(d[1]||'').split(',');
|
||||
let erase = f=>storage.erase(f);
|
||||
let erase = f=>store.erase(f);
|
||||
files.forEach(f=>{
|
||||
if (!isGlob(f)) erase(f);
|
||||
else storage.list(globToRegex(f)).forEach(erase);
|
||||
})
|
||||
erase = sf=>storage.open(sf,'r').erase();
|
||||
else store.list(globToRegex(f)).forEach(erase);
|
||||
});
|
||||
erase = sf=>store.open(sf,'r').erase();
|
||||
sFiles.forEach(sf=>{
|
||||
if (!isGlob(sf)) erase(sf);
|
||||
else storage.list(globToRegex(sf+'\u0001'))
|
||||
else store.list(globToRegex(sf+'\u0001'))
|
||||
.forEach(fs=>erase(fs.substring(0,fs.length-1)));
|
||||
})
|
||||
});
|
||||
}
|
||||
function eraseApp(app, files,data) {
|
||||
E.showMessage('Erasing\n' + app.name + '...');
|
||||
if (files) eraseFiles(app)
|
||||
if (data) eraseData(app)
|
||||
if (files) eraseFiles(app);
|
||||
if (data) eraseData(app);
|
||||
}
|
||||
function eraseOne(app, files,data){
|
||||
E.showPrompt('Erase\n'+app.name+'?').then((v) => {
|
||||
if (v) {
|
||||
Bangle.buzz(100, 1);
|
||||
eraseApp(app, files,data)
|
||||
eraseApp(app, files, data);
|
||||
showApps();
|
||||
} else {
|
||||
showAppMenu(app)
|
||||
showAppMenu(app);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
function eraseAll(apps, files,data) {
|
||||
E.showPrompt('Erase all?').then((v) => {
|
||||
|
@ -87,7 +92,7 @@ function eraseAll(apps, files,data) {
|
|||
eraseApp(apps[n], files,data);
|
||||
}
|
||||
showApps();
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function showAppMenu(app) {
|
||||
|
@ -96,13 +101,13 @@ function showAppMenu(app) {
|
|||
'title': app.name,
|
||||
},
|
||||
'< Back': () => m = showApps(),
|
||||
}
|
||||
};
|
||||
if (app.data) {
|
||||
appmenu['Erase Completely'] = () => eraseOne(app, true, true)
|
||||
appmenu['Erase App,Keep Data'] = () => eraseOne(app,true, false)
|
||||
appmenu['Only Erase Data'] = () => eraseOne(app,false, true)
|
||||
appmenu['Erase Completely'] = () => eraseOne(app, true, true);
|
||||
appmenu['Erase App,Keep Data'] = () => eraseOne(app, true, false);
|
||||
appmenu['Only Erase Data'] = () => eraseOne(app, false, true);
|
||||
} else {
|
||||
appmenu['Erase'] = () => eraseOne(app,true, false)
|
||||
appmenu['Erase'] = () => eraseOne(app, true, false);
|
||||
}
|
||||
return E.showMenu(appmenu);
|
||||
}
|
||||
|
@ -115,10 +120,10 @@ function showApps() {
|
|||
'< Back': () => m = showMainMenu(),
|
||||
};
|
||||
|
||||
var list = storage.list(/\.info$/).filter((a)=> {
|
||||
var list = store.list(/\.info$/).filter((a)=> {
|
||||
return a !== 'setting.info';
|
||||
}).sort().map((app) => {
|
||||
var ret = storage.readJSON(app,1)||{};
|
||||
var ret = store.readJSON(app,1)||{};
|
||||
ret[''] = app;
|
||||
return ret;
|
||||
});
|
||||
|
@ -147,4 +152,84 @@ function showApps() {
|
|||
return E.showMenu(appsmenu);
|
||||
}
|
||||
|
||||
function showSortAppsMenu() {
|
||||
const sorterMenu = {
|
||||
'': {
|
||||
'title': 'App Sorter',
|
||||
},
|
||||
'< Back': () => m = showMainMenu(),
|
||||
'Sort: manually': ()=> m = showSortAppsManually(),
|
||||
'Sort: alph. ASC': () => {
|
||||
E.showMessage('Sorting:\nAlphabetically\nascending ...');
|
||||
try {
|
||||
sortAlphabet(false);
|
||||
} catch (e) {
|
||||
}
|
||||
},
|
||||
'Sort: alph. DESC': () => {
|
||||
E.showMessage('Sorting:\nAlphabetically\ndescending ...');
|
||||
try {
|
||||
sortAlphabet(true);
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
};
|
||||
return E.showMenu(sorterMenu);
|
||||
}
|
||||
|
||||
function showSortAppsManually() {
|
||||
const appsSorterMenu = {
|
||||
'': {
|
||||
'title': 'Sort: manually',
|
||||
},
|
||||
'< Back': () => m = showSortAppsMenu(),
|
||||
};
|
||||
let appList = getAppsList();
|
||||
if (appList.length > 0) {
|
||||
appList.reduce((menu, app) => {
|
||||
menu[app.name] = {
|
||||
value: app.sortorder || 0,
|
||||
min: 0,
|
||||
max: appList.length,
|
||||
step: 1,
|
||||
onchange: val => setSortorder(app, val)
|
||||
};
|
||||
return menu;
|
||||
}, appsSorterMenu);
|
||||
} else {
|
||||
appsSorterMenu['...No Apps...'] = {
|
||||
value: undefined,
|
||||
format: ()=> '',
|
||||
onchange: ()=> {}
|
||||
};
|
||||
}
|
||||
return E.showMenu(appsSorterMenu);
|
||||
}
|
||||
|
||||
function setSortorder(app, val) {
|
||||
app.sortorder = val;
|
||||
store.writeJSON(app.id + '.info', app);
|
||||
}
|
||||
|
||||
function getAppsList() {
|
||||
return store.list('.info').map((a)=> {
|
||||
let app = store.readJSON(a, 1) || {};
|
||||
if (app.type !== 'widget') {
|
||||
return app;
|
||||
}
|
||||
}).filter((a) => a).sort(sortHelper());
|
||||
}
|
||||
|
||||
function sortAlphabet(desc) {
|
||||
let appsSorted = desc ? getAppsList().reverse() : getAppsList();
|
||||
appsSorted.forEach((a, i) => {
|
||||
setSortorder(a, i);
|
||||
});
|
||||
return showSortAppsMenu();
|
||||
}
|
||||
|
||||
function sortHelper() {
|
||||
return (a, b) => (a.name > b.name) - (a.name < b.name);
|
||||
}
|
||||
|
||||
m = showMainMenu();
|
Loading…
Reference in New Issue