UNPKG

lifetracker

Version:

Keep track of events and trends in your life.

245 lines (234 loc) 6.91 kB
var exports = module.exports = {}; // exports.groups = _.keys(config.presets); exports.groups = _.map(config.presets, (value, key) => { return value.pageTitle; }); exports.groupsObj = _.fromPairs(_.map(exports.groups, (group) => { return [group, ""]; })); exports.savePresetModal = function() { let $modal = $("<div />", { id: "save-preset-modal", class: "modal" }); let $content = $("<div />", { id: "save-preset-content", class: "modal-content" }) .append($("<h2 />", { text: "Save as a quick entry?" })) .append(makePresetSaveForm()); let $cancelBtn = $("<button />", { class: "btn-flat modal-cancel modal-close", text: "Cancel" }); let $submitBtn = $("<button />", { id: "submit-preset", class: "btn-flat", text: "Save preset" }); $submitBtn.click(() => { console.log("click"); $("#save-preset-modal").modal("close"); let serialized = $("#save-preset-form input").serializeArray(); let data = _.transform(serialized, (acc, o) => { acc[o.name] = o.value; }, {}); data.group = _.camelCase(data.groupName); // The checkbox will always say its value is "on"; see if it's checked. data.saveTimes = $("#save-times").prop("checked"); if (config.presets[data.group] && config.presets[data.group][data.presetId]) { exports.showConfirmOverwrite(data); } else { savePreset(data); } }); let $footer = $("<div />", { class: "modal-footer" }).append($cancelBtn) .append($submitBtn); $modal.append($content) .append($footer); return $modal; }; exports.makeConfirmOverwrite = function() { let $overwriteBtn = $("<button />", { class: "btn-flat modal-cancel modal-close", id: "overwrite-btn", text: "Overwrite" }); let $backBtn = $("<buton />", { class: "btn-flat modal-close", id: "back-btn", text: "Back" }); $overwriteBtn.click(() => { savePreset(); }); $backBtn.click(() => { $("#save-preset-modal").modal("open"); }); let $content = $("<div />", { id: "confirm-overwrite-content", class: "modal-content" }); let $foot = $("<div />", { class: "modal-footer" }); $foot.append($overwriteBtn).append($backBtn); let $modal = $("<div />", { class: "modal", id: "confirm-overwrite" }).append($content) .append($foot); return $modal; }; exports.showConfirmOverwrite = function(data) { let group = data.group; let presetId = data.presetId; let message = `There is already a quick entry called "${presetId}" in the ${group} group. Do you want to overwrite it?`; let $message = $("<p />", { text: message }); $("#confirm-overwrite-content").append($message); $("#confirm-overwrite").modal("open"); }; function makePresetSaveForm() { let $presetTitle = makeInput("Entry title", { id: "preset-title", name: "presetTitle" }); let $presetId = $("<div />", { class: "form-group input-field", }); let $presetIdInput = $("<input />", { class: "form-control", id: "preset-identifier", name: "presetId", type: "text" }); let $presetIdLabel = $("<label />", { for: "preset-identifier", text: "Entry identifier" }); let $presetIdTooltip = $("<i />", { class: "tooltipped material-icons", text: "help", "data-position": "right", "data-tooltip": "This is how the program will identify the quick entry. It should start with a lowercase letter and contain only letters and numbers, and it should be unique within a group." }); $presetIdLabel.append("&nbsp;") .append($presetIdTooltip); $presetId.append($presetIdLabel) .append($presetIdInput); let $presetGroup = makeInput("Group", { id: "preset-group", name: "groupName", class: "form-control autocomplete" }); let $checkboxContainer = $("<label />", { for: "save-time" }); let $checkbox = $("<input />", { id: "save-time", name: "saveTime", type: "checkbox", class: "filled-in" }); let $checkboxText = $("<span>Save entered times?</span>"); $checkboxContainer.append($checkbox) .append($checkboxText); let $saveTimes = $("<div />", { class: "form-group" }).append($checkboxContainer); let $form = $("<form />", { id: "save-preset-form" }).append($presetTitle) .append($presetId) .append($presetGroup) .append($saveTimes); return $form; } function makeInput(labelText, specifics) { let defaults = { class: "form-control", type: "text", name: specifics.id, id: specifics.name }; let specs = _.defaults(specifics, defaults); let $div = $("<div />", { class: "form-group input-field" }) .append($("<label />", { for: specs.id, text: labelText })) .append($("<input />", specs)); return $div; } function savePreset(info) { let presetData = {}; let $fields = $("#form-body").find(".form-group"); // presetData.formTitle = info.presetTitle; $fields.each(function() { let fieldInfo = {}; let $input = $(this).find(".form-control"); let $label = $(this).find("label"); if (!$input.attr("id")) { // This should just be the button row, which doesn't need to be saved. return; } fieldInfo.label = $label.text(); fieldInfo.type = $input.attr("type"); fieldInfo.value = $input.val(); if ($input.attr("placeholder")) { fieldInfo.placeholder = $input.attr("placeholder"); } if (_.includes(["range", "number"], fieldInfo.type)) { fieldInfo.min = $input.attr("min"); fieldInfo.max = $input.attr("max"); } else if ($input.hasClass("timepicker")) { fieldInfo.class = "timepicker"; if (!info.saveTimes) { fieldInfo.value = ""; } } else if ($input.hasClass("datepicker")) { fieldInfo.class = "datepicker"; fieldInfo.value = ""; } else if ($input.tagName === "TEXTAREA") { fieldInfo.type = "textarea"; } presetData[$input.attr("id")] = fieldInfo; }); if (!config.presets[info.group]) { config.presets[info.group] = { pageTitle: info.groupName }; } config.presets[info.group][info.presetId] = { formTitle: info.presetTitle, fields: presetData }; console.log(config.presets); return writePresets(config.presets).then(() => { populate.updateSidebarPresets(); $("#message").text("Saved quick entry!"); let $tgt = $("#form-body"); let selector = ".form-control"; $tgt.on("change", selector, (e) => { populate.clearMessage($tgt, selector, e); }); }); } function writePresets(obj) { console.log("writing presets"); console.log(obj); // stringify doesn't have structure to be promisified. return CSON.createCSONStringAsync(obj) .then((presetsString) => { console.log(presetsString); return fs.writeFileAsync(path.join(config.system.configDir, "presets.cson"), presetsString); }); }