UNPKG

nightscout

Version:

Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.

683 lines (598 loc) 25.9 kB
'use strict'; var init = function init () { //for the tests window isn't the global object var $ = window.$; var _ = window._; var Nightscout = window.Nightscout; var client = Nightscout.client; client.init(function loaded () { var translate = client.translate; var foodrec_template = { _id: '' , type: 'food' , category: '' , subcategory: '' , name: '' , portion: 0 , carbs: 0 , fat: 0 // in grams , protein: 0 // in grams , energy: 0 // in kJ , gi: 2 , unit: 'g' }; var foodunits = ['g', 'ml', 'pcs', 'oz']; var foodrec = _.cloneDeep(foodrec_template); var HIDDEN = 99999; var quickpickrec_template = { _id: '' , type: 'quickpick' , name: '' , foods: [] , carbs: 0 , hideafteruse: true , hidden: false , position: HIDDEN }; var filter = { category: '' , subcategory: '' , name: '' }; //https://www.iconfinder.com/iconsets/musthave //var icon_add = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABa0lEQVQ4T6WTzysEYRjHP+/Mrv2hHOTuqJRNOfgPSORHokg4OClHcnVzVygHF6WIcuHMnyCHVRyI3ZYxa23vzOzs7LzamaI0e5i89fTWt/f5vPV5n1cQsXLbHepvfLv5JaLORoZNwMbyFo5vYfsWB0c7xAasLa5T/vCg45Oj48P4gJWFVYxCA63L5PzkND5gfm4Jo+Chd5W5OrtsDYgS1pQ1OTuNUfTQO8tcX9xE+QugYnS/X81MzGP7MpTWkEFVZY1KxcVPV3h27zAtA+oCagIcDfWUCgEje31qfHwK06gHjaF5iXQcHCV5lHmqqgQCNEAI0IsavCVDwNBurxoeGwmaAkDDwvYsqtIh//6AJUoklP97s62BbJYeAqIcpJNZsoM+r2aVbKKOekiBL8An3BuAEiGg1SSKAYnttpFxPdR9Jv4zipxFTUuQKqsfYbFGWfTYuO06yRfxIyweoLuG+iMsFuBfvzFy7FqE33vs2BFqlfN5AAAAAElFTkSuQmCC'; var icon_remove = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACrElEQVQ4T42Ty2sTQRzHv5tmk2yyjRNtpfZhL8V6s2KoUNC2XqwgaCsVQcGiFqpHi0c9iRdR/ANE9KR40FIQX4cueKoPaKFoLdSYNtE0abKT1+5s9iW7aUMiHtzTzO7v85md+c6PA4DrHbsPCKIgOWO1pA7dT6YXnXH949SE/F63pqwZtRrO+SCKgjQ5NUV+azpmHj2krMwaJC4c8Erj+/eRyloMMwWFKgbn1nC3ervlK1evkXBLGBZT8SOewotnTylTNLdgeg/pDgZDC2cPHSR8bB22DVC9hFe0SG/H0xFXcHlykjRHRDBWgJcZSCY38Xx2lhqMnRYE34Px/sN9vlQWeoHBAx2yXsRruVAVuFsIBaSJ8+eJGPaBqQV4NROJjTzez89jLBoFn6FgybQL54wS3uTyVDFQ3cL2IYpBv3RhdJSIIQ80tQyv7gEqJvS8AmUlBs7UXPhtjtZgh3UFNYngk86NHCfNAg9dMwHVBPu+CpsVkTXKeJeVG+AGgTOZ3tt6MSKKjy+NjEBjFrR4ElZmA4pdxstMFsyyJu6tZZ7Ux9vwB6EAL50ZGiRECEPPUOixVTRxHlicgSVWxEdZpuZWfNuS2hk48NjwMIkIYZglBnV5Cbqtws/5IaAJmsfCglrEl2y2QeKmEBJ80tixKmxrFpSVr0gV0viQoxho2YUuPohmeFD22PiklLC4ma5JuBvdrfLJI0dJd0s7bM0ES8aR/BXDXGaTskqlL+D3Lwy0tZEePoAd4EA5YF4tYymdonfjmQh3s6dTPjU4SHYGwjAKecSXFyGlM1TdytntE56T+ts7SC/vhw3gm6njc2Kd3vm5Ub1IwQAvnYhGiZpYw1wiWYPrIw7wnBTt7CLOOwdmut14kQQvqt24tfK/utGR6LaF+iRqMf4N/O/8D28HiiCRYqzAAAAAAElFTkSuQmCC'; var icon_edit = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABEUlEQVQ4jZ3MMUsCYQDG8ee8IySQbNCLyyEKG/RLNAXicqvQcAeNLrcFLlE0+xHuNpt8wy04rrYm8Q4HQRE56BSC3lSqU1BwCoxM39dnffj9BWyxXvVeEzvtctBwHyRebNu2Nk2lzMlrgJB+qBEeTByiKYpihl+fIO8jTI9PDJEVF1+K2iw+M6PhDuyag4NkQi/c3FkCK5Z3ZbM76qLltpCbn+vXxq0FABsDy9hzPdBvqvtXvvXzrw1swmsDLPjfACteGeDBfwK8+FdgGwwAIgC0ncsjxGRSH/eiPBgAJADY2z8sJ4JBfNBsDqlADVYMANIzKalv/bHaefKsTH9iPFb8ISsGAJym0+Qinz3jQktbAHcxvx3559eSAAAAAElFTkSuQmCC'; var icon_up = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAH3SURBVDhPlZK/a1NRFMe/9/1KotLcwbYiipo2NqmDpTpoiJiguPgPCC7iYAcbYp0LxUGkxVr6Y6lgu6iLm4uCQszi4JS6FHQRFMRBDOJrcvPyEs+97+V3A+2Bw7nvcr6f973nXoZ+8RQTqCGn1hrSuIOCWneF5tfO8MWZ2Ax/NPmYB1kop/Z2iV6AL56O3eNj4TP4Lf7iVnSKm7ByWOuFdAJ88d14lp8Oj+P9jw/Y/vMFBgK4GbnNLUaQpU5Iawbt4gEpzqPiVmirprqi/BRKjo0XW5vFSkmkMevNxAM0bPvidyQuuwJuvUrbdTBWh6ZpGOOjEM4Onn/aKIoyQR6gwBriTHzGs/09j5Jbxo5rw67aEDWhfuOiCkM3cO7wWdQcB68+viyKfyKt4zq2s/H7/OJQEj9Lv6BrOkbCJ/H62xvYBHFAx2Aurh5LITJwAgfMIA6GDiEyPBL8/LVwg2GdPHbF/PllLGwtI2CYlBYsqteOp7H6dhFkxEvHqxqmyGB70szkeU2ya+l0eSQOmh5ECR9SzzzlE8oVsN53IKm0LQGmQRCTXBBAfitAV/QBMBLoTRfyKMqBtN0VfQFymAogXZB4Xw6YD9DJheGDDFrvHUDlytHLSB1J4tJwAonBCwSk1l0ArafciDm6Vtko07+qZrqUz9o1wH8prahHZgYc2gAAAABJRU5ErkJggg=='; var foodlist = []; var foodquickpick = []; var foodquickpicktodelete = []; var showhidden = false; var categories = {}; function restoreBoolValue(record,key) { if (typeof record[key] !== 'undefined') { record[key] = record[key] === 'true'; } } // Fetch data from mongo $('#fe_status').hide().text('Loading food database ...').fadeIn('slow'); $.ajax('/api/v1/food.json', { headers: client.headers() , success: function ajaxSuccess(records) { records.forEach(function processRecords(r) { restoreBoolValue(r,'hidden'); restoreBoolValue(r,'hideafteruse'); if (r.type === 'food') { foodlist.push(r); if (r.category && !categories[r.category]) { categories[r.category] = {}; } if (r.category && r.subcategory) { categories[r.category][r.subcategory] = true; } } else if (r.type === 'quickpick') { calculateCarbs(foodquickpick.push(r)-1); console.log('Loaded quick pick: ',r); } else { console.log('Unknown food database record'); } }); $('#fe_status').hide().text(translate('Database loaded')).fadeIn('slow'); foodquickpick.sort(function compare(a,b) { return cmp(parseInt(a.position),parseInt(b.position)) }); } , error: function ajaxError() { $('#fe_status').hide().text(translate('Error: Database failed to load')).fadeIn('slow'); } }).done(initeditor); function initeditor() { // Add handlers for gui $('#fe_editcreate').click(foodSubmit); $('#fe_clear').click(clearRec); $('#fe_id').change(updateSaveButton); $('#fe_quickpick_add').click(quickpickCreateRecord); $('#fe_quickpick_save').click(quickpickSave); $('#fe_filter_category').change(fillFilterSubcategories); $('#fe_filter_subcategory').change(doFilter); $('#fe_quickpick_showhidden').change(showHidden); $('#fe_filter_name').on('input',doFilter); $('#fe_category_list').change(function categoryListChange(event) { $('#fe_category').val($('#fe_category_list').val()); fillEditSubcategories(event); }); $('#fe_subcategory_list').change(function subcategoryListChange(event) { $('#fe_subcategory').val($('#fe_subcategory_list').val()); event.preventDefault(); }); $('#fe_unit').empty(); for (var u=0; u<foodunits.length; u++) { $('#fe_unit').append(new Option(translate(foodunits[u]),foodunits[u])); } // Set values from profile to html fillForm(); // show proper submit button updateSaveButton(); console.log('Done initeditor()'); } function updateSaveButton(event) { if($('#fe_id').val()==='') { $('#fe_editcreate').text(translate('Create new record')); } else { $('#fe_editcreate').text(translate('Save record')); } maybePreventDefault(event); } function fillFilterSubcategories(event) { var s; maybePreventDefault(event,GUIToObject); filter.subcategory = ''; $('#fe_filter_subcategory').empty().append(new Option(translate('(none)'),'')); if (filter.category !== '') { for (s in categories[filter.category]) { if (Object.prototype.hasOwnProperty.call(categories[filter.category],s)) { $('#fe_filter_subcategory').append(new Option(s,s)); } } } doFilter(); } function fillEditSubcategories(event) { maybePreventDefault(event,GUIToObject); var s; foodrec.subcategory = ''; $('#fe_subcategory_list').empty().append(new Option(translate('(none)'),'')); if (foodrec.category !== '') { for (s in categories[foodrec.category]) { if (Object.prototype.hasOwnProperty.call(categories[foodrec.category],s)) { $('#fe_subcategory_list').append(new Option(s,s)); } } } $('#fe_subcategory').val(''); } function doEdit(event) { var index = $(this).attr('index'); foodrec = _.cloneDeep(foodlist[index]); objectToGUI(); updateSaveButton(); maybePreventDefault(event); return false; } function updateFoodArray(newrec) { for (var i=0; i<foodlist.length; i++) { if (foodlist[i]._id === newrec._id) { foodlist[i] = _.cloneDeep(newrec); if (newrec.category && !categories[newrec.category]) { categories[newrec.category] = {}; } if (newrec.category && newrec.subcategory) { categories[newrec.category][newrec.subcategory] = true; } return; } } } function fillForm(event) { $('#fe_filter_category').empty().append(new Option(translate('(none)'),'')); $('#fe_category_list').empty().append(new Option(translate('(none)'),'')); for (var s in categories) { if (Object.prototype.hasOwnProperty.call(categories,s)) { $('#fe_filter_category').append(new Option(s,s)); $('#fe_category_list').append(new Option(s,s)); } } fillFilterSubcategories(); drawQuickpick(); objectToGUI(); maybePreventDefault(event); return false; } function doFilter(event) { if (event) { GUIToObject(); } $('#fe_data_header') .empty() .append($('<span>').attr('class','width50px')) .append($('<span>').attr('class','width200px').append(translate('Name'))) .append($('<span>').attr('class','width150px').css('text-align','center').append(translate('Portion'))) .append($('<span>').attr('class','width50px').css('text-align','center').append(translate('Unit'))) .append($('<span>').attr('class','width100px').css('text-align','center').append(translate('Carbs'))) .append($('<span>').attr('class','width100px').css('text-align','center').append(translate('GI')+' [1-3]')) .append($('<span>').attr('class','width150px').append(translate('Category'))) .append($('<span>').attr('class','width150px').append(translate('Subcategory'))) .append($('<span>').attr('class','width100px').append(translate('Fat [g]'))) .append($('<span>').attr('class','width100px').append(translate('Protein [g]'))) .append($('<span>').attr('class','width100px').append(translate('Energy [kJ]'))); $('#fe_data').empty(); for (var i=0; i<foodlist.length; i++) { if (filter.category !== '' && foodlist[i].category !== filter.category) { continue; } if (filter.subcategory !== '' && foodlist[i].subcategory !== filter.subcategory) { continue; } if (filter.name !== '' && foodlist[i].name.toLowerCase().indexOf(filter.name.toLowerCase()) < 0) { continue; } $('#fe_data') .append($('<div>').attr('index',i).addClass('draggablefood') .append($('<span>').addClass('width50px') .append($('<img>').attr('title',translate('Edit record')).attr('src',icon_edit).attr('index',i).attr('class','fe_editimg')) .append($('<img>').attr('title',translate('Delete record')).attr('src',icon_remove).attr('index',i).attr('class','fe_removeimg')) ) .append($('<span>').addClass('width200px').append(foodlist[i].name)) .append($('<span>').addClass('width150px').css('text-align','center').append(foodlist[i].portion)) .append($('<span>').addClass('width50px').css('text-align','center').append(foodlist[i].unit)) .append($('<span>').addClass('width100px').css('text-align','center').append(foodlist[i].carbs)) .append($('<span>').addClass('width100px').css('text-align','center').append(foodlist[i].gi)) .append($('<span>').addClass('width150px').append(foodlist[i].category)) .append($('<span>').addClass('width150px').append(foodlist[i].subcategory)) .append($('<span>').addClass('width100px').append(foodlist[i].fat)) .append($('<span>').addClass('width100px').append(foodlist[i].protein)) .append($('<span>').addClass('width100px').append(foodlist[i].energy)) ); } $('.fe_editimg').click(doEdit); $('.fe_removeimg').click(deleteFoodRecord); $('.draggablefood').draggable({ helper: function keepDraggedSize(){ return $(this).clone().width($(this).width()).height($(this).height()); }, scope: 'foodlist', revert: 'invalid' }); maybePreventDefault(event); } function deleteQuickpickRecord(event) { var index = $(this).attr('index'); foodquickpicktodelete.push(foodquickpick[index]._id); foodquickpick.splice(index,1); drawQuickpick(); maybePreventDefault(event); return false; } function deleteFoodRecord(event) { var index = $(this).attr('index'); deleteRecord(foodlist[index]._id); foodlist.splice(index,1); fillForm(); maybePreventDefault(event); return false; } function showHidden(event) { GUIToObject(); drawQuickpick(); maybePreventDefault(event); return false; } function drawQuickpick() { function addHeaderOrHint(q,i) { if (q.foods.length) { $('#fe_qpfieldset_'+i) .append($('<span>').addClass('width50px')) .append($('<span>').addClass('width200px').append(translate('Name'))) .append($('<span>').addClass('width150px').css('text-align','center').append(translate('Portion'))) .append($('<span>').addClass('width100px').css('text-align','center').append(translate('Carbs'))) .append($('<br>')); } else { $('#fe_qpfieldset_'+i) .append($('<i>').append('-&gt; ' + translate('Drag&drop food here'))); } } function addHiddenCount(hiddentotal) { $('#fe_quickpick_hiddencount').text(hiddentotal ? (' ('+hiddentotal+')') : ''); } var hiddentotal = 0; $('#fe_picklist').empty(); for (var i=0; i<foodquickpick.length; i++) { var q = foodquickpick[i]; if (showhidden === false && q.hidden) { hiddentotal++; continue; } $('#fe_picklist') .append($('<fieldset>').attr('id','fe_qpfieldset_'+i).addClass('sortablequickpick').attr('index',i).attr('_id',q._id) .append($('<legend>') .append($('<img>').attr('title',translate('Move to the top')).attr('src',icon_up).attr('index',i).addClass('fe_qpupimg')) .append(' | ') .append($('<img>').attr('title',translate('Delete record')).attr('src',icon_remove).attr('index',i).addClass('fe_qpremoveimg')) .append(' | ' + translate('Name') + ': ') .append($('<input type="text">').addClass('fe_qpname').attr('index',i).attr('value',q.name)) .append($('<input type="checkbox">').addClass('fq_hidden').attr('index',i).prop('checked',q.hidden)) .append(translate('Hidden')) .append($('<input type="checkbox">').addClass('fq_hideafteruse').attr('index',i).prop('checked',q.hideafteruse)) .append(translate('Hide after use')) .append(' | ' + translate('Carbs') + ': ' + q.carbs.toFixed(0) + ' g') ) ); addHeaderOrHint(q,i); for (var j=0;j<q.foods.length; j++) { var r = q.foods[j]; $('#fe_qpfieldset_'+i) .append($('<div>').attr('id','fqp_food_'+i+'_'+j).addClass('fe_foodinsideqp') .append($('<span>').addClass('width50px') .append($('<img>').attr('title',translate('Delete record')).attr('src',icon_remove).attr('index',i).attr('findex',j).addClass('fe_qpfoodremoveimg')) ) .append($('<span>').addClass('width200px').append(r.name)) .append($('<span>').addClass('width150px').css('text-align','center').append(r.portion)) .append($('<span>').addClass('width100px').css('text-align','center').append(r.carbs)) .append(translate('Portions')+': ') .append($('<input type="text">').attr('id','fq_portions_'+q._id+'_'+j).attr('index',i).attr('findex',j).attr('value',r.portions).addClass('fe_qpportions')) ); } } $('.fe_qpupimg').click(quickpickMoveToTop); $('.fe_qpremoveimg').click(deleteQuickpickRecord); $('.fe_qpfoodremoveimg').click(deleteQuickpickFood); $('.fe_qpportions').change(savePortions); addHiddenCount(hiddentotal); $('.fe_qpname').change(function nameChange(event) { var index = $(this).attr('index'); foodquickpick[index].name = $(this).val(); event.preventDefault(); }); $('.fq_hidden').change(function hiddenChange(event) { var index = $(this).attr('index'); foodquickpick[index].hidden = this.checked; if (!this.checked) { foodquickpick.splice(0, 0, foodquickpick.splice(index, 1)[0]); } drawQuickpick(); event.preventDefault(); }); $('.fq_hideafteruse').change(function hideAfterUseChange(event) { var index = $(this).attr('index'); foodquickpick[index].hideafteruse = this.checked; event.preventDefault(); }); $('.sortablequickpick').droppable({ hoverClass: 'ui-state-hover', drop: dropFood, scope: 'foodlist', greedy: true }); $('#fe_picklist').sortable({ revert: true , axis: 'y' , placeholder: 'highlight' , update: resortArray }); } function savePortions(event) { var index = $(this).attr('index'); var findex = $(this).attr('findex'); var val = parseFloat($(this).val().replace(/,/g,'.')); foodquickpick[index].foods[findex].portions=val; calculateCarbs(index); drawQuickpick(); event.preventDefault(); return false; } function deleteQuickpickFood(event) { var index = $(this).attr('index'); var findex = $(this).attr('findex'); foodquickpick[index].foods.splice(findex,1); calculateCarbs(index); drawQuickpick(); event.preventDefault(); return false; } function dropFood(event,ui) { var item = ui.draggable; var fi = foodlist[item.attr('index')]; var qi = $(this).attr('index'); var q = foodquickpick[qi]; fi.portions = 1; q.foods.push(fi); calculateCarbs(qi); drawQuickpick(); } function calculateCarbs(index) { var qp = foodquickpick[index]; qp.carbs = 0; if (qp.foods) { for (var j=0;j<qp.foods.length; j++) { qp.carbs += qp.foods[j].carbs * qp.foods[j].portions; } } else { qp.foods = []; } } function resortArray(event,ui) { var newHtmlIndex = ui.item.index(); var oldArrayIndex = ui.item.attr('index'); var draggeditem = foodquickpick.splice(oldArrayIndex, 1)[0]; foodquickpick.splice(newHtmlIndex, 0, draggeditem); event.stopPropagation(); drawQuickpick(); console.log(foodquickpick); return; } function quickpickMoveToTop(event) { var index = $(this).attr('index'); foodquickpick.splice(0, 0, foodquickpick.splice(index, 1)[0]); drawQuickpick(); maybePreventDefault(event); return false; } // fill GUI with values from object function objectToGUI() { $('#fe_filter_category').val(filter.category); $('#fe_filter_subcategory').val(filter.subcategory); $('#fe_filter_name').val(filter.name); $('#fe_id').val(foodrec._id); $('#fe_category').val(foodrec.category); $('#fe_subcategory').val(foodrec.subcategory); $('#fe_name').val(foodrec.name); $('#fe_portion').val(foodrec.portion ? foodrec.portion : ''); $('#fe_unit').val(foodrec.unit); $('#fe_carbs').val(foodrec.carbs ? foodrec.carbs : '') $('#fe_gi').val(foodrec.gi) $('#fe_fat').val(foodrec.fat ? foodrec.fat : '') $('#fe_protein').val(foodrec.protein ? foodrec.protein : '') $('#fe_energy').val(foodrec.energy ? foodrec.energy : ''); $('#fe_quickpick_showhidden').prop('checked',showhidden); console.info(JSON.stringify(foodrec)); } function GUIToObject() { // Grab values from html GUI to object filter.category = $('#fe_filter_category').val(); filter.subcategory = $('#fe_filter_subcategory').val(); filter.name = $('#fe_filter_name').val(); foodrec._id = $('#fe_id').val(); foodrec.category = $('#fe_category').val(); foodrec.subcategory = $('#fe_subcategory').val(); foodrec.name = $('#fe_name').val(); foodrec.portion = parseInt($('#fe_portion').val()); foodrec.portion = foodrec.portion || 0; foodrec.unit = $('#fe_unit').val(); foodrec.carbs = parseInt($('#fe_carbs').val()); foodrec.carbs = foodrec.carbs || 0; foodrec.fat = parseInt($('#fe_fat').val()); foodrec.fat = foodrec.fat || 0; foodrec.protein = parseInt($('#fe_protein').val()); foodrec.protein = foodrec.protein || 0; foodrec.energy = parseInt($('#fe_energy').val()); foodrec.energy = foodrec.energy || 0; foodrec.gi = parseInt($('#fe_gi').val()); showhidden = $('#fe_quickpick_showhidden').is(':checked'); } function clearRec(event) { foodrec = _.cloneDeep(foodrec_template); objectToGUI(); updateSaveButton(); maybePreventDefault(event); return false; } function foodSubmit(event) { GUIToObject(); if (!client.hashauth.isAuthenticated()) { alert(translate('Your device is not authenticated yet')); maybePreventDefault(event); return false; } if ($('#fe_editcreate').text().indexOf(translate('Create new record'))>-1) { // remove _id when creating new record delete foodrec._id; $.ajax({ method: 'POST', url: '/api/v1/food/', data: foodrec, headers: client.headers() }).done(function success (response) { $('#fe_status').hide().text('OK').fadeIn('slow'); foodrec._id = response[0]._id; foodlist.push(foodrec); if (foodrec.category && !categories[foodrec.category]) { categories[foodrec.category] = {}; } if (foodrec.category && foodrec.subcategory) { categories[foodrec.category][foodrec.subcategory] = true; } clearRec(); fillForm(); }).fail(function fail() { $('#fe_status').hide().text(translate('Error')).fadeIn('slow'); }); } else { // Update record $.ajax({ method: 'PUT', url: '/api/v1/food/', data: foodrec, headers: client.headers() }).done(function success () { $('#fe_status').hide().text('OK').fadeIn('slow'); updateFoodArray(foodrec); clearRec(); fillForm(); }).fail(function fail() { $('#fe_status').hide().text(translate('Error')).fadeIn('slow'); }); } maybePreventDefault(event); return false; } function deleteRecord(_id) { if (!client.hashauth.isAuthenticated()) { alert(translate('Your device is not authenticated yet')); maybePreventDefault(event); return false; } $.ajax({ method: 'DELETE', url: '/api/v1/food/'+_id, data: foodrec, headers: client.headers() }).done(function success () { $('#fe_status').hide().text('OK').fadeIn('slow'); }).fail(function fail() { $('#fe_status').hide().text(translate('Error')).fadeIn('slow'); }); return false; } function updateRecord(foodrec) { if (!client.hashauth.isAuthenticated()) { alert(translate('Your device is not authenticated yet')); maybePreventDefault(event); return false; } $.ajax({ method: 'PUT', url: '/api/v1/food/', data: foodrec, headers: client.headers() }).done(function success (response) { console.log('Updated record: ',response); }); } function quickpickCreateRecord(event) { var newrec = _.cloneDeep(quickpickrec_template); if (!client.hashauth.isAuthenticated()) { alert(translate('Your device is not authenticated yet')); maybePreventDefault(event); return false; } // remove _id when creating new record delete newrec._id; $.ajax({ method: 'POST', url: '/api/v1/food/', data: newrec, headers: client.headers() }).done(function success (response) { $('#fe_status').hide().text('OK').fadeIn('slow'); newrec._id = response[0]._id; foodquickpick.unshift(newrec); drawQuickpick(); }).fail(function fail() { $('#fe_status').hide().text(translate('Error')).fadeIn('slow'); }); maybePreventDefault(event); return false; } function quickpickSave(event) { if (!client.hashauth.isAuthenticated()) { alert(translate('Your device is not authenticated yet')); return false; } for (var i=0; i<foodquickpicktodelete.length; i++) { deleteRecord(foodquickpicktodelete[i]); } for (i=0; i<foodquickpick.length; i++) { var fqp = foodquickpick[i]; if (fqp.hidden) { fqp.position = HIDDEN; } else { fqp.position = i; } updateRecord(fqp); } maybePreventDefault(event); return false; } function cmp(v1,v2){ return (v1<v2?-1:(v1>v2?1:0)); } function maybePreventDefault(event,after) { if (event) { event.preventDefault(); } if (after) { after(); } } }); }; module.exports = init;