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());