lifetracker
Version:
Keep track of events and trends in your life.
234 lines (217 loc) • 7.39 kB
JavaScript
var exports = module.exports = {};
var configHeader = `# Configuration file for LifeTracker.
# Edit this file to change your LifeTracker settings.
# To revert to the default settings, copy 'config-sample.cson' here.
`;
var sysConfigPath = path.join(__dirname, "..", "system_config.cson");
// vim doesn't like backticks, I guess.
var sysConfigHeader = "# System configuration file for LifeTracker.\n# The only reason to edit this file is to change the value of configDir.\n# Any other changes will be overwritten the next time you run LifeTracker.\n";
class ConfigError extends Error {
constructor(conf, ...args) {
super(...args);
this.config = conf;
this.code = "EBADCONFIG";
Error.captureStackTrace(this, ConfigError);
}
}
exports.makeDefaultConfig = function() {
exports.makeDefaultPaths();
exports.config = {
theme: "dark",
dataColumnOrder: ["startDate", "startTime", "endDate", "endTime", "whenDate", "whenTime", "title", "category"],
saveDir: exports.defaultSaveDir
};
exports.system = {
configDir: exports.defaultConfigDir
};
};
exports.makeDefaultPaths = function() {
let home = os.homedir();
let configFilesDir, dataDir;
// If Windows, save everything in Documents\LifeTracker.
// Otherwise, save config files in ~/.config/lifetracker and data in ~/Documents/LifeTracker/data.
if (process.platform === "win32") {
let pfx = path.join(home, "Documents", "LifeTracker");
exports.defaultConfigDir = path.join(pfx, "config");
exports.defaultSaveDir = path.join(pfx, "data");
} else {
exports.defaultConfigDir = path.join(home, ".config", "lifetracker");
exports.defaultSaveDir = path.join(home, "Documents", "LifeTracker", "data");
}
};
exports.loadSystemConfig = function() {
console.log(sysConfigPath);
return CSON.loadAsync(sysConfigPath)
.then((sysConfig) => {
return new Promise((resolve, reject) => {
if (!sysConfig.configDir) {
reject(new ConfigError(sysConfig));
} else {
exports.system = sysConfig;
resolve();
}
})
})
.catch((err) => {
if (err.code === "ENOENT" || err.code === "EBADCONFIG") {
console.log(err.code);
// Default should already be set.
if (err.config) { console.log(err.config); }
console.log("Using default system config.");
console.log(exports.system);
let sysConfigString = sysConfigHeader + CSON.stringify(exports.system);
return fs.writeFileAsync(sysConfigPath, sysConfigString);
} else {
return new Promise((resolve, reject) => {
reject(err);
});
}
})
.then(() => {
// Create user config directory if it doesn't already exist.
return makeConfigDir(exports.system.configDir);
});
}
exports.loadUserConfig = function() {
let configPath = path.join(exports.system.configDir, "config.cson");
return CSON.loadAsync(configPath)
.then((userConfig) => {
// exports.userConfig = userConfig;
_.assign(exports.config, userConfig);
return new Promise.resolve();
})
.catch((err) => {
console.log(`No user config found at '${configPath}'. Treating as though empty.`);
console.log("Stack:\n" + err.stack);
// Treat userConfig as an empty Object.
// exports.userConfig = {};
return saveConfig();
})
.then(() => {
// Create save directory if it doesn't already exist.
return makeConfigDir(exports.config.saveDir);
});
};
exports.loadForms = function() {
let formsPath = path.join(config.system.configDir, "forms.cson");
return CSON.requireFileAsync(formsPath)
.then((result) => {
exports.forms = result;
return new Promise.resolve();
})
.catch((err) => {
if (err.code === "ENOENT") {
return fs.copyFileAsync(path.join(__dirname, "..", "forms.cson"), formsPath)
.then(() => {
// Needs to stay in this block. Moving it outside would make the
// successful case run again.
return CSON.requireFileAsync(formsPath)
})
.then((result) => {
exports.forms = results;
return new Promise.resolve();
});
} else {
throw err;
}
});
};
exports.loadPresets = function() {
return CSON.requireFileAsync(path.join(config.system.configDir, "presets.cson"))
.then((result) => {
exports.presets = result;
console.log(exports.presets);
})
.catch((err) => {
exports.presets = [];
if (err.code === "ENOENT" || err instanceof SyntaxError) {
console.log(err);
} else {
throw err;
}
});
};
exports.updatePreferences = function() {
return new Promise((resolve, reject) => {
updateTheme();
updateSaveDir();
updateConfigDir();
resolve("Updated");
})
.then(() => {
saveConfig();
});
};
exports.selectDir = function($elem, defaultPath) {
dialog.showOpenDialog({
title: "Choose folder...",
defaultPath: defaultPath,
buttonLabel: "Select folder",
properties: ["openDirectory"]
}, (directory) => {
$elem.val(directory);
});
};
exports.applyTheme = function() {
let theme = exports.config.theme;
let themePath = themes[theme];
$("#theme").attr("href", `${themePath}`);
};
function makeConfigDir(path) {
// Makes the directories with mkdirp, but resolves to the path.
return mkdirp.mkdirpAsync(path).then(() => {
return new Promise((resolve, reject) => {
resolve(path);
});
});
}
function saveConfig() {
let configPath = path.join(exports.system.configDir, "config.cson");
var configString = CSON.stringify(exports.config);
let configContent = configHeader + configString;
// let sysConfigPath = path.join(__dirname, "..", "config.cson");
let sysConfigString = sysConfigHeader + CSON.stringify(exports.system);
let writeSysConfig = fs.writeFileAsync(sysConfigPath, sysConfigString);
let writeUserConfig = fs.writeFileAsync(configPath, configContent);
return Promise.join(writeSysConfig, writeUserConfig, () => {
console.log("Preferences saved.");
let $target = $("#save-prefs-message");
let selector = ".form-control";
$target.text("Preferences saved!");
$target.on("change", selector, (e) => {
populate.clearMessage($target, selector, e);
});
})
.catch((err) => {
console.log(err.stack);
console.log("Could not save preferences.");
});
}
function updateTheme() {
let theme = $("#theme-selection").val();
if (theme !== exports.config.theme) {
exports.userConfig.theme = exports.config.theme = theme;
exports.applyTheme();
}
}
function updateSaveDir() {
let $elem = $("#savedir");
let saveDir = $elem.val();
if (saveDir !== exports.config.saveDir) {
exports.userConfig.saveDir = exports.config.saveDir = saveDir;
dataProc.loadData().then((data) => {
// dataProc.getFields(data).then(console.log("Loaded fields."));
dataProc.getCategories(data).then(console.log("Loaded categories."));
// return Promise.join(dataProc.getFields(data), dataProc.getCategories(data) => {
//
// })
});
}
}
function updateConfigDir() {
let $elem = $("#configdir");
let configDir = $elem.val();
if (configDir !== exports.system.configDir) {
exports.system.configDir = configDir;
}
}