pakkajs
Version:
The idea is to provide few pakka simple UI tools.
303 lines (286 loc) • 9.65 kB
JavaScript
var app = pakka.create({
elementsSelector: '#todoapp'
});
var todoItem = pakka({
name: 'todo-item',
html: document.getElementById('todo-item-template').innerHTML,
controller: function(context) {
var removeCallback = function() {};
context.$set('data', {
isSelected: false,
text: '',
notes: []
});
context.remove = function(event) {
event && event.preventDefault();
// removeItem(context);
detach(context);
}
context.$watch('data.text', function(value) {
saveData();
});
context.$watch('data.isSelected', function(value) {
if (value == true) {
context.$set('stateClass', {
'selected': true
})
} else {
context.$set('stateClass', {
'selected': false
})
}
saveData();
});
context.copyToClipboard = function(event) {
if (document.selection) {
var range = document.body.createTextRange();
range.moveToElementText(context.$get('inputElement'));
range.select().createTextRange();
document.execCommand("Copy");
} else if (window.getSelection) {
var range = document.createRange();
range.selectNode(context.$get('inputElement'));
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
document.execCommand("Copy");
}
}
context.checkKey = function(event) {
var key = event.keyCode || event.charCode;
if (key == 13) {
event.preventDefault();
var item = new todoItem();
appendAfter(context.parent, item, context);
item.focus();
saveData();
return false;
} else if ((key == 8 || key == 46) && (!event.target.innerText || event.target.innerText == "")) {
event.preventDefault();
var nextItem = context.nextItem,
prevItem = context.prevItem;
detach(context);
key == 46 && nextItem && nextItem.focus();
key == 8 && prevItem && prevItem.focus();
saveData();
return false;
} else if (key == 9 && !event.shiftKey) {
event.preventDefault();
var parent = context.prevItem;
if (parent) {
detach(context);
appendAfter(parent, context);
}
context.focus();
saveData();
return false;
} else if (key == 9 && event.shiftKey) {
event.preventDefault();
var after = context.parent;
if (after != app) {
var parent = after.parent;
if (parent) {
detach(context);
appendAfter(parent, context, after);
}
}
context.focus();
saveData();
return false;
} else if (key == 38 && !event.shiftKey) {
event.preventDefault();
var prevItem = context.prevItem;
if (!prevItem) {
prevItem = context.parent;
} else {
while (prevItem.lastItem) {
prevItem = prevItem.lastItem;
}
}
prevItem && prevItem != app && prevItem.focus();
saveData();
return false;
} else if (key == 40 && !event.shiftKey) {
event.preventDefault();
var nextItem;
if (!nextItem) {
nextItem = context.lastItem;
if (nextItem) {
while (nextItem.prevItem) {
nextItem = nextItem.prevItem;
}
}
}
if (!nextItem) {
nextItem = context.nextItem;
}
if (!nextItem) {
nextItem = context;
while (!nextItem.nextItem && nextItem.parent) {
nextItem = nextItem.parent;
}
nextItem = nextItem.nextItem;
}
nextItem && nextItem.focus();
saveData();
return false;
} else if (key == 38 && event.shiftKey) {
event.preventDefault();
var prevItem = context.prevItem;
if (prevItem && prevItem != app) {
detach(context);
appendBefore(prevItem.parent, context, prevItem);
context.focus();
saveData();
}
return false;
} else if (key == 40 && event.shiftKey) {
event.preventDefault();
var nextItem = context.nextItem;
if (nextItem) {
detach(context);
appendAfter(nextItem.parent, context, nextItem);
context.focus();
saveData();
}
return false;
} else if (key == 32 && event.shiftKey) {
event.preventDefault();
context.$set('data.isSelected', !context.$get('data.isSelected'));
return false;
}
};
context.focus = function(isStart) {
var el = context.$get('inputElement'),
text = context.$get('data.text') || "",
textLength = isStart ? 0 : text.length;
if (textLength > 0) {
var range = document.createRange(),
sel = window.getSelection();
if (el.childNodes && el.childNodes.length > 0) {
range.setStart(el.childNodes[0], textLength);
}
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
el.focus();
}
}
})
var todoItems = [];
app.addItem = function(event) {
event && event.preventDefault();
var item = new todoItem();
appendAfter(app, item);
item.focus();
};
var appendBefore = function(parent, item, before) {
if (!before) {
before = parent.lastItem;
while (before.prevItem) {
before = before.prevItem;
}
}
if (before) {
item.prevItem = before.prevItem;
before.prevItem = item;
item.nextItem = before;
} else {
item.prevItem = null;
item.nextItem = null;
}
item.parent = parent;
renderItems(parent, item);
}
var appendAfter = function(parent, item, after, isSilent) {
after = after || parent.lastItem;
if (after) {
item.nextItem = after.nextItem;
after.nextItem = item;
item.prevItem = after;
} else {
item.prevItem = null;
item.nextItem = null;
}
if (parent.lastItem == after) {
parent.lastItem = item;
}
item.parent = parent;
renderItems(parent, item, isSilent);
};
var detach = function(item) {
var prevItem = item.prevItem,
nextItem = item.nextItem,
parent = item.parent;
item.parent = null;
prevItem && (prevItem.nextItem = nextItem);
nextItem && (nextItem.prevItem = prevItem);
item.nextItem = null;
item.prevItem = null;
item.parent = null;
if (item == parent.lastItem) {
parent.lastItem = nextItem || prevItem;
}
renderItems(parent, prevItem || nextItem || parent.lastItem);
};
var getData = function(item) {
return item.$properties.data;
};
var renderItems = function(parent, item, isSilent) {
var list = [],
data = isSilent ? [] : parent.$properties.data.notes;
while (data.length > 0) {
data.pop();
}
if (item) {
var prevItem = item.prevItem,
nextItem = item.nextItem;
list.push(item);
data.push(getData(item));
while (prevItem) {
list.unshift(prevItem);
data.unshift(getData(prevItem));
prevItem = prevItem.prevItem;
}
while (nextItem) {
list.push(nextItem);
data.push(getData(nextItem));
nextItem = nextItem.nextItem;
}
}
parent.$set('todoItems', list);
};
var saveData = function() {},
setData = function(parent, notes) {
pakka.each(notes, function(data) {
var item = new todoItem();
item.$set('data', data);
if (data.notes.length > 0) {
setData(item, data.notes);
}
appendAfter(parent, item, null, true);
})
},
startFresh = function() {
app.$set('data', {
notes: []
})
app.addItem();
};
if (localStorage) {
saveData = function() {
localStorage.setItem('todoapp2', JSON.stringify(app.$properties.data.notes))
}
data = localStorage.getItem('todoapp2');
if (data) {
data = JSON.parse(data);
app.$set('data', {
notes: data
});
setData(app, data);
} else {
startFresh();
}
} else {
startFresh();
}