1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 13:00:05 +08:00
SpaceVim/bundle/calendar.vim/autoload/calendar/task/local.vim
2022-05-28 15:29:51 +08:00

185 lines
5.1 KiB
VimL

" =============================================================================
" Filename: autoload/calendar/task/local.vim
" Author: itchyny
" License: MIT License
" Last Change: 2020/11/19 07:41:02.
" =============================================================================
let s:save_cpo = &cpo
set cpo&vim
function! calendar#task#local#new() abort
return deepcopy(s:self)
endfunction
let s:cache = calendar#cache#new('local')
let s:task_cache = s:cache.new('task')
let s:self = {}
function! s:self.get_taskList() dict abort
if has_key(self, 'localtasklist')
return self.localtasklist
else
let taskList = s:cache.get('taskList')
if type(taskList) == type({}) && has_key(taskList, 'items') && type(taskList.items) == type([])
let self.localtasklist = taskList
else
let self.localtasklist = { 'items': [{'id': calendar#util#id(), 'title': get(calendar#message#get('task'), 'title', 'Task')}] }
call s:cache.save('taskList', self.localtasklist)
endif
endif
return self.localtasklist
endfunction
function! s:self.get_task() dict abort
let taskList = self.get_taskList()
let task = []
if has_key(taskList, 'items') && type(taskList.items) == type([])
for item in taskList.items
call add(task, item)
let task[-1].items = []
unlet! cnt
let cnt = s:task_cache.new(item.id).get('information')
if type(cnt) == type({}) && cnt != {}
let i = 0
while type(cnt) == type({})
unlet! cnt
let cnt = s:task_cache.new(item.id).get(i)
if type(cnt) == type({}) && cnt != {} && has_key(cnt, 'items') && type(cnt.items) == type([])
call extend(task[-1].items, cnt.items)
endif
let i += 1
endwhile
endif
endfor
endif
let self.localtask = task
return task
endfunction
function! s:self.insert(listid, previous, parent, title, ...) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:previous) + 1
call insert(self.localtask[k].items, { 'title': a:title, 'id': calendar#util#id() }, j)
call self.save()
endif
endfunction
function! s:self.move(listid, taskid, previous, parent) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:taskid)
let pj = a:previous ==# '' ? 0 : self.get_index(k, a:previous)
if j >= 0 && pj >= 0
let task = deepcopy(self.localtask[k].items[j])
call remove(self.localtask[k].items, j)
let pj = a:previous ==# '' ? -1 : self.get_index(k, a:previous)
call insert(self.localtask[k].items, task, pj + 1)
call self.save()
endif
endif
endfunction
function! s:self.update(listid, taskid, title, ...) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:taskid)
if j >= 0
call extend(self.localtask[k].items[j], { 'title': a:title })
call self.save()
endif
endif
endfunction
function! s:self.complete(listid, taskid) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:taskid)
if j >= 0
call extend(self.localtask[0].items[j], { 'status': 'completed' })
call self.save()
endif
endif
endfunction
function! s:self.uncomplete(listid, taskid) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:taskid)
if j >= 0
if has_key(self.localtask[0].items[j], 'status')
call remove(self.localtask[0].items[j], 'status')
endif
call self.save()
endif
endif
endfunction
function! s:self.clear_completed(listid) dict abort
if has_key(self, 'localtask')
for task in self.localtask
call filter(task.items, 'get(v:val, "status", "") !=# "completed"')
endfor
call self.save()
endif
endfunction
function! s:self.delete(listid, taskid) dict abort
let k = self.get_tasklist_index(a:listid)
if k >= 0
let j = self.get_index(k, a:taskid)
if j >= 0
call remove(self.localtask[0].items, j)
call self.save()
endif
endif
endfunction
function! s:self.save() dict abort
if has_key(self, 'localtask')
for task in self.localtask
call s:task_cache.new(task.id).save(0, task)
call s:task_cache.new(task.id).save('information', { 'id': task.id, 'title': task.title })
endfor
endif
endfunction
function! s:self.get_tasklist_index(id) dict abort
if has_key(self, 'localtask')
let j = -1
for i in range(len(self.localtask))
if self.localtask[i].id ==# a:id
let j = i
break
endif
endfor
if j < 0 && len(self.localtask)
return 0
endif
return j
endif
return -1
endfunction
function! s:self.get_index(listindex, id) dict abort
if has_key(self, 'localtask')
if 0 <= a:listindex && a:listindex < len(self.localtask)
let j = -1
for i in range(len(self.localtask[a:listindex].items))
if self.localtask[0].items[i].id ==# a:id
let j = i
break
endif
endfor
return j
endif
endif
return -1
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo