function entry(data){ var id = ko.utils.unwrapObservable(data.id); var value_date = ko.utils.unwrapObservable(data.value_date); var operation_date = ko.utils.unwrapObservable(data.operation_date); var label = ko.utils.unwrapObservable(data.label); var value = ko.utils.unwrapObservable(data.value); var account = ko.utils.unwrapObservable(data.account); var sold = ko.utils.unwrapObservable(data.sold); var pointedSold = ko.utils.unwrapObservable(data.pointedSold); this.id=ko.observable(id ? id : null); this.value_date=ko.observable(value_date ? value_date : null); this.operation_date=ko.observable(operation_date ? operation_date : null); this.label=ko.observable(label ? label : null); this.value=ko.observable(value ? value : null); this.account=ko.observable(account ? account : null); this.sold=ko.observable(sold ? sold : null); this.pointedSold=ko.observable(pointedSold ? pointedSold : null); } function message(alertType, title, message) { $(".alert").alert('close'); $("#message-placeholder").append('

' + title + '

' + message + '
'); } var ListViewModel = function() { var self = this; window.viewModel = self; self.account = ko.observable(); self.accounts = ko.observableArray([]); self.entries = ko.observableArray([]); self.months = ko.observableArray(); self.month = ko.observable(); self.pointedSold = ko.observable(); self.futureSold = ko.observable(); self.currentSold = ko.observable(); self.selectedItem = ko.observable(); self.savedItem = ko.observable(); self.loadEntries = function() { $.post("api/entry.php", {action: "get_entries", account: self.account().id, year: self.month().year, month:self.month().month}, function(data) { self.entries.removeAll(); self.selectedItem(null); $.each(data, function(index, element) { self.entries.push(new entry({ id: element.id, value_date: new Date(element.value_date), operation_date: element.operation_date ? new Date(element.operation_date) : null, label: element.label, value: element.value, account: element.account_id, sold: element.sold, pointedSold: element.operation_date ? element.pointedsold : '' })); }); }); }; self.loadAccounts = function() { $.post("api/entry.php", {action: "get_accounts"}).success(function (result) { self.accounts(result); if(!self.account()){ self.account(result[0]); } }); }; self.loadMonths = function(account){ $.post("api/entry.php", {action: "get_months", account: account.id}).success(function (result) { self.months(result); self.month(result[result.length - 1]); }); }; self.templateToUse = function (item) { return self.selectedItem() === item ? 'editTmpl' : 'itemsTmpl'; }; self.edit = function(item) { if(self.savedItem() != null) { self.cancel(); } self.savedItem(new entry(item)); self.selectedItem(item); $("#value_date").datepicker({format: "yyyy-mm-dd"}).on('changeDate', function(ev){ self.selectedItem().value_date(new Date(ev.date.valueOf())); }); $("#operation_date").datepicker({format: "yyyy-mm-dd"}).on('changeDate', function(ev){ self.selectedItem().operation_date(new Date(ev.date.valueOf())); }); $("#operation_date_clear").click(function(e){ self.selectedItem().operation_date(null); }); }; self.cancel = function() { if(self.selectedItem() && self.savedItem()) { self.selectedItem().id(self.savedItem().id()); self.selectedItem().operation_date(self.savedItem().operation_date()); self.selectedItem().value_date(self.savedItem().value_date()); self.selectedItem().label(self.savedItem().label()); self.selectedItem().value(self.savedItem().value()); self.selectedItem().account(self.savedItem().account()); } // This item was just added. if(self.selectedItem() && !self.selectedItem().id()) { self.entries.remove(self.selectedItem()); } self.savedItem(null); self.selectedItem(null); }; self.add = function() { newEntry = new entry({ account: self.account().id }); this.entries.unshift(newEntry); self.selectedItem(newEntry); $("#value_date").datepicker({format: "yyyy-mm-dd"}).on('changeDate', function(ev){ self.selectedItem().value_date(new Date(ev.date.valueOf())); }); $("#operation_date").datepicker({format: "yyyy-mm-dd"}).on('changeDate', function(ev){ self.selectedItem().operation_date(new Date(ev.date.valueOf())); }); $("#operation_date_clear").click(function(e){ self.selectedItem().operation_date(null); }); }; self.save = function() { var item = new entry(self.selectedItem()); if(item.value_date()) { item.value_date(dateToString(item.value_date())); } if(item.operation_date()) { item.operation_date(dateToString(item.operation_date())); } $.post("api/entry.php", {action: "save_entry", entry:item}).success(function(data) { message("success", "Save", data.message); self.selectedItem(null); self.loadEntries(); }).error(function() { message("error", "Error.", "Unexpected error."); }); }; self.remove = function (item) { if (item.id()) { if (confirm('Are you sure you wish to delete this item?')) { $.post("api/entry.php", {action: "remove_entry", entry:item}).success(function (result) { self.selectedItem(null); self.loadAccounts(); }); } } else { self.entries.remove(item); } }; self.selectMonth = function(month) { self.month(month); }; self.selectAccount = function(account) { self.account(account); }; self.account.subscribe(self.loadMonths); self.month.subscribe(self.loadEntries); $(document).ready(self.loadAccounts); }; function dateToString(date) { if(date) { var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); dateStr = year + "-" + (month < 10 ? '0' : '') + month + "-" + (day < 10 ? '0' : '') + day; return dateStr;; } else { return ''; } }; ko.bindingHandlers.date = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { var unwrap = ko.utils.unwrapObservable; var dataSource = valueAccessor(); value = dataSource ? unwrap(dataSource) : null; if(value) { $(element).text(dateToString(value)); } else { $(element).text(''); } }, update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var unwrap = ko.utils.unwrapObservable; var dataSource = valueAccessor(); value = dataSource ? unwrap(dataSource) : null; if(value) { $(element).text(dateToString(value)); } else { $(element).text(''); } } }; ko.bindingHandlers.dateValue = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { var unwrap = ko.utils.unwrapObservable; var dataSource = valueAccessor(); value = dataSource ? unwrap(dataSource) : null; if(value) { $(element).val(dateToString(value)); } else { $(element).val(''); } }, update: function (element, valueAccessor, allBindingsAccessor, viewModel) { var unwrap = ko.utils.unwrapObservable; var dataSource = valueAccessor(); value = dataSource ? unwrap(dataSource) : null; if(value) { $(element).val(dateToString(value)); } else { $(element).val(''); } } }; ko.applyBindings(new ListViewModel());