Todo List Demo App
import QtQuick 2.0
import Felgo 3.0
Item {
property alias dispatcher: logicConnection.target
readonly property bool isBusy: api.busy
readonly property bool isFetchingTodos: _.isFetchingTodos
readonly property bool isStoringTodos: _.storeTodoRequests > 0
readonly property var todos: _.storedTodos.concat(_.todos)
readonly property alias todoDetails: _.todoDetails
readonly property alias draftTodos: _.draftTodos
readonly property alias numberOfPages: _.numberOfPages
readonly property int todosPerPage: 25
signal draftTodoCreated(var todo)
signal todoStored(int draftId, int todoId)
signal fetchTodosFailed(var error)
signal fetchTodoDetailsFailed(int id, var error)
signal storeDraftTodoFailed(var todo, var error)
Connections {
id: logicConnection
onFetchTodos: {
var cached = cache.getValue("todos")
if(cached)
_.todos = cached
_.isFetchingTodos = true
api.getTodos(
function(data) {
cache.setValue("todos",data)
_.todos = data.slice(0, numberOfPages * todosPerPage)
_.isFetchingTodos = false
},
function(error) {
if(!cached)
fetchTodosFailed(error)
_.isFetchingTodos = false
})
var stored = cache.getValue("storedTodos")
if(stored)
_.storedTodos = stored
}
onFetchTodoDetails: {
if(id < 0) {
_.draftTodos.forEach(function(item) {
if(item.id === id) {
_.todoDetails[id] = item
}
})
return
}
var cached = cache.getValue("todo_"+id)
if(cached) {
_.todoDetails[id] = cached
todoDetailsChanged()
}
api.getTodoById(id,
function(data) {
cache.setValue("todo_"+id, data)
_.todoDetails[id] = data
todoDetailsChanged()
},
function(error) {
if(!cached) {
fetchTodoDetailsFailed(id, error)
}
})
}
onFetchDraftTodos: {
var cached = cache.getValue("draftTodos")
if(cached)
_.draftTodos = cached
}
onCreateDraftTodo: {
var todoCopy = JSON.parse(JSON.stringify(todo))
var latestDraftNr = -(_.todosCount + _.draftTodos.length)
todoCopy["id"] = latestDraftNr - 1
_.draftTodos.unshift(todoCopy)
cache.setValue("draftTodos", _.draftTodos)
draftTodosChanged()
draftTodoCreated(todoCopy)
}
onStoreDraftTodo: {
var todoCopy = JSON.parse(JSON.stringify(todo))
delete todoCopy["id"]
_.storeTodoRequests++
api.addTodo(todoCopy,
function(data) {
data.id = (todo.id * -1)
cache.setValue("todo_"+data.id, data)
for(var i=0; i < _.draftTodos.length; i++) {
if(_.draftTodos[i].id === todo.id) {
_.draftTodos.splice(i, 1)
}
}
_.storedTodos.unshift(data)
cache.setValue("draftTodos", _.draftTodos)
cache.setValue("storedTodos", _.storedTodos)
draftTodosChanged()
_.storedTodosChanged()
todoStored(todo.id, data.id)
_.storeTodoRequests--
},
function(error) {
storeDraftTodoFailed(todo, error)
_.storeTodoRequests--
})
}
onClearCache: {
cache.clearValue("todos")
Object.keys(_.todoDetails).forEach(function(id) {
cache.clearValue("todo_"+id)
})
}
onIncrementNumberOfPages: _.numberOfPages++
}
function isDraft(todo) {
var isDraft = false
if(!!todo) {
for(var i = 0; i < _.draftTodos.length; i++) {
if(_.draftTodos[i].id === todo.id) {
isDraft = true
break
}
}
}
return isDraft
}
RestAPI {
id: api
maxRequestTimeout: 3000
}
Storage {
id: cache
}
Item {
id: _
property var todos: []
property var todoDetails: ({})
property var draftTodos: []
property var storedTodos: []
property int todosCount: 200 + storedTodos.length
property int storeTodoRequests: 0
property bool isFetchingTodos: false