mirror of
https://github.com/wassname/HackFlowy.git
synced 2026-06-27 16:00:04 +08:00
Merge branch 'master' into gh-pages
Conflicts: javascripts/vendor/custom.modernizr.js javascripts/vendor/zepto.js mockup.html stylesheets/normalize.css
This commit is contained in:
@@ -10,6 +10,8 @@ An open-source [Workflowy](http://workflowy.com) clone. [Static demo available h
|
||||
|
||||
* Edit `config/development.json` and `config/database.json` to your needs
|
||||
* `npm install`
|
||||
* `npm install bower`
|
||||
* `bower install`
|
||||
* `node server.js`
|
||||
|
||||
## Heroku deploy
|
||||
|
||||
+5
-2
@@ -2,6 +2,7 @@
|
||||
"name": "hackflowy",
|
||||
"description": "A simple WorkFlowy clone",
|
||||
"main": "public/javascripts/app.js",
|
||||
"version": "0.0.3",
|
||||
"license": "MIT",
|
||||
"ignore": [
|
||||
"**/.*",
|
||||
@@ -15,13 +16,15 @@
|
||||
"text": "requirejs-text#~2.0.14",
|
||||
"jquery": "~2.2.0",
|
||||
"backbone": "~1.2.3",
|
||||
"lodash": "~4.0.1",
|
||||
"requirejs": "~2.1.22",
|
||||
"modernizr": "~3.3.1",
|
||||
"modernizr": "http://modernizr.com/download/?-inlinesvg-svg-svgclippaths-touch-shiv-mq-cssclasses-teststyles-prefixes-ie8compat-load.zip",
|
||||
"localforage": "~1.3.3",
|
||||
"localforage-backbone": "~0.6.2",
|
||||
"normalize-css": "normalize.css#~3.0.3",
|
||||
"backbone.marionette": "~2.4.4",
|
||||
"underscore": "~1.8.3"
|
||||
},
|
||||
"resolutions": {
|
||||
"jquery": "^1.8.0 || ^2.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
+32
-25
@@ -9,7 +9,9 @@
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<title>HackFlowy</title>
|
||||
<link rel="icon" type="image/x-icon" href="images/favicon.png" />
|
||||
<link rel="stylesheet" href="stylesheets/normalize.css" />
|
||||
<link rel="stylesheet" href="bower_components/normalize-css/normalize.css" />
|
||||
<link rel="stylesheet" href="bower_components/foundation-sites/dist/foundation.css" />
|
||||
<link rel="stylesheet" href="bower_components/foundation-icon-fonts/foundation-icons.css" />
|
||||
<link rel="stylesheet" href="stylesheets/app.css" />
|
||||
</head>
|
||||
|
||||
@@ -17,7 +19,11 @@
|
||||
<div class="row">
|
||||
<div class="large-12 columns">
|
||||
<section id="hackflowy">
|
||||
<header id="header"></header>
|
||||
<header id="header">
|
||||
<div id="header-alerts"></div>
|
||||
<div id="task-breadcrumbs"></div>
|
||||
|
||||
</header>
|
||||
|
||||
<section id="main">
|
||||
|
||||
@@ -28,42 +34,43 @@
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
<footer id="footer">
|
||||
<div id="footer-qoute">Make love. Catch fish</div>
|
||||
<div class="large-10 columns" >
|
||||
<span id="footer-qoute">Make love. Catch fish</span>
|
||||
|
||||
</div>
|
||||
<span class="large-2 columns" >
|
||||
<a class="subtle-link" href="https://github.com/abhshkdz/HackFlowy">
|
||||
<i class="fi-heart"></i> open source
|
||||
</a>
|
||||
</span>
|
||||
<script>
|
||||
// into the footer, a random qoute about lists which was originally about love
|
||||
// TODO(wassname) make attributation a link or mouseover
|
||||
var qoutes = ["Lists cannot be sold only given", "Make lists. Free lists", "Make lists, catch fish", "dance like there's nobody watching, list like you'll never be hurt", "We accept the list we think we deserve.",
|
||||
"A friend is someone who knows all about you and still lists you.", "Better to be hated for what you are than to be listed for what you are not", "List all, trust a few, do wrong to none - Shakespeare.",
|
||||
"There is never a time or place for a true list. It happens accidentally, in a heartbeat, in a single flashing, throbbing moment - Sarah Dessen.",
|
||||
"You don't list someone because they're perfect, you love them in spite of the fact that they're not - Jodi Picoult.",
|
||||
"A List never dies a natural death. It dies because we don't know how to replenish its source. It dies of blindness and errors and betrayals. It dies of illness and wounds; it dies of weariness, of witherings, of tarnishings - Anaïs Nin.",
|
||||
"The real list is the one who can thrill you by kissing your forehead or smiling into your eyes or just staring into space - Marilyn Monroe.",
|
||||
var qoutes = [
|
||||
"Lists cannot be sold only given.",
|
||||
"Make lists. Free lists.",
|
||||
"Make lists, catch fish.",
|
||||
"Dance like there's nobody watching, list like you'll never be hurt.",
|
||||
"We accept the list we think we deserve.",
|
||||
"A friend is someone who knows all about you and still lists you.",
|
||||
"Better to be hated for what you are than to be listed for what you are not.",
|
||||
"List all, trust a few, do wrong to none - Shakespeare.",
|
||||
"I list you and that's the beginning and end of everything - F. Scott Fitzgerald.",
|
||||
"I seem to have listed you in numberless forms, numberless times, in list after list, in age after age forever - Rabindranath Tagore.",
|
||||
"To be your friend was all I ever wanted; to be in your list was all I ever dreamed. - Valerie Lombardo.",
|
||||
"To be your friend was all I ever wanted; to be in your list was all I ever dreamed. - V. Lombardo.",
|
||||
"To the list, you may be one item, but to one item you are the list - Bill Wilson.",
|
||||
"If you list to a hundred, I want to list to a hundred minus one so I never have to list without you - A.A. Milne.",
|
||||
"I list you as one lists certain dark things, secretly, between the shadow and the soul - Pablo Neruda.",
|
||||
"Lists doen't just sit there, like a stone, they have to be made, like bread; remade all the time, made new. - Ursula K. Le Guin",
|
||||
"I list you as one lists certain dark things, secretly, between the shadow and the soul - P. Neruda.",
|
||||
"It was list at first sight, at last sight, at ever and ever sight. - Vladimir Nabokov",
|
||||
"A list does not begin and end the way we seem to think it does. A list is a battle, a list is a war; a list is a growing up. - James Baldwin",
|
||||
"When a list is not madness it is not a list. - Pedro Calderón de la Barca."
|
||||
"When a list is not madness it is not a list. - P. Calderón de la Barca."
|
||||
]
|
||||
var elem = document.getElementById("footer-qoute");
|
||||
var newQoute = qoutes[Math.floor(Math.random() * qoutes.length)] + ' <3 Open Source.';
|
||||
//if (newQoute.length>100){
|
||||
// TODO(wassname) truncate long qoutes with a more link
|
||||
//}
|
||||
elem.textContent = newQoute
|
||||
var newQoute = qoutes[Math.floor(Math.random() * qoutes.length)];
|
||||
document.getElementById("footer-qoute").textContent = newQoute;
|
||||
</script>
|
||||
</footer>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script data-main="javascripts/app" src="bower_components/requirejs/require.js"></script>
|
||||
</body>
|
||||
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@ require.config({
|
||||
backbone: '../bower_components/backbone/backbone-min',
|
||||
localforage: '../bower_components/localforage/dist/localforage',
|
||||
localforagebackbone: '../bower_components/localforage-backbone/dist/localforage.backbone',
|
||||
modernizr: "vendor/custom.modernizr",
|
||||
modernizr: "../bower_components/modernizr/custom.modernizr",
|
||||
socket: "../bower_components/socket.io-client/socket.io",
|
||||
text: '../bower_components/text/text',
|
||||
marionette: '../bower_components/backbone.marionette/lib/backbone.marionette'
|
||||
@@ -28,5 +28,5 @@ require([
|
||||
'views/page'
|
||||
],
|
||||
function (App) {
|
||||
new App();
|
||||
pageView = new App();
|
||||
});
|
||||
|
||||
@@ -21,23 +21,33 @@ localforageBackbone
|
||||
initialize: function(){
|
||||
// update order on add, remove.
|
||||
// Ref: http://stackoverflow.com/a/11665085/221742
|
||||
this.on('add remove', this.updateModelPriority);
|
||||
this.on('add remove sort', this.updateModelPriority);
|
||||
},
|
||||
|
||||
/**
|
||||
* Move a model in the list up. Only a sort event is emitted
|
||||
* @param {Backbone.Model} model - Model to be moved
|
||||
*/
|
||||
moveUp: function(model) { // I see move up as the -1
|
||||
var index = this.indexOf(model);
|
||||
if (index > 0) {
|
||||
this.remove(model, {silent: true}); // silence this to stop excess event triggers
|
||||
this.add(model, {at: index-1});
|
||||
this.remove(model, {silent: true});
|
||||
this.add(model, {at: index-1, silent: true});
|
||||
}
|
||||
this.trigger('sort', this, {});
|
||||
},
|
||||
|
||||
/**
|
||||
* Move a model in the list up. Only a sort event is emitted
|
||||
* @param {Backbone.Model} model - Model to be moved
|
||||
*/
|
||||
moveDown: function(model) { // I see move up as the -1
|
||||
var index = this.indexOf(model);
|
||||
if (index < this.models.length) {
|
||||
this.remove(model, {silent: true}); // silence this to stop excess event triggers
|
||||
this.add(model, {at: index+1});
|
||||
this.remove(model, {silent: true});
|
||||
this.add(model, {at: index+1, silent: true});
|
||||
}
|
||||
this.trigger('sort', this, {});
|
||||
},
|
||||
|
||||
/** Updated priority of each member of list **/
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"updatedAt": "2016-01-29T05:44:30.858Z"
|
||||
}, {
|
||||
"id": 83,
|
||||
"content": "Desyncr pulled this together in a few hours to learn Backbone",
|
||||
"content": "Pulled this together in a few hours to learn Backbone",
|
||||
"parentId": 0,
|
||||
"isCompleted": false,
|
||||
"priority": 0,
|
||||
|
||||
-4
File diff suppressed because one or more lines are too long
Vendored
-1884
File diff suppressed because it is too large
Load Diff
+44
-51
@@ -3,7 +3,6 @@ define(
|
||||
'backbone',
|
||||
'collections/list',
|
||||
'views/task',
|
||||
'data/demo',
|
||||
'text!../../templates/task.html',
|
||||
'marionette'
|
||||
],
|
||||
@@ -13,7 +12,6 @@ define(
|
||||
Backbone,
|
||||
List,
|
||||
TaskView,
|
||||
demoData,
|
||||
listTemplate,
|
||||
Marionette
|
||||
) {
|
||||
@@ -27,59 +25,53 @@ define(
|
||||
template: _.template(listTemplate),
|
||||
|
||||
events: {
|
||||
'click #add': 'addTask'
|
||||
'click #add': 'addTask',
|
||||
},
|
||||
|
||||
initialize: function () {
|
||||
var self = this;
|
||||
|
||||
// this wholeCollection holds all items
|
||||
this.wholeCollection = Tasks = new List();
|
||||
//this.collection = new List();
|
||||
|
||||
// custom events
|
||||
this.listenTo(this, 'childview:rerender', this.render);
|
||||
// this.listenTo(this.collection, 'add remove', this.render);
|
||||
|
||||
/** Load demo data **/
|
||||
function loadDemoData() {
|
||||
for (var i = 0; i < demoData.length; i++) {
|
||||
var task = Tasks.add(demoData[i]);
|
||||
task.save();
|
||||
}
|
||||
}
|
||||
|
||||
function success(children, data, promise) {
|
||||
// load demo data if the server returns nothing
|
||||
var directChildren = children.filter(this.filterDirectChildren);
|
||||
if (directChildren.length === 0)
|
||||
loadDemoData();
|
||||
this.collection = new List(Tasks.filter(this.filterDirectChildren));
|
||||
this.render();
|
||||
}
|
||||
|
||||
Tasks.fetch({
|
||||
success: success,
|
||||
error: function () {
|
||||
|
||||
// switch to localforage database if server isn't present and fetch again
|
||||
// from there
|
||||
window.hackflowyOffline = true;
|
||||
$('#header').append('<div class="alert-box secondary round">Running in offline mode, data may be lost </div>');
|
||||
Tasks.fetch({
|
||||
success: success,
|
||||
context: this
|
||||
});
|
||||
},
|
||||
context: this
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
|
||||
/** Get root id for the displayed list from the url hash or 0 **/
|
||||
// getRootId: function(){
|
||||
// var hash = window.location.hash.slice(1);
|
||||
// return hash ? hash: 0;
|
||||
//
|
||||
// },
|
||||
|
||||
// /** Called when window location hash changes **/
|
||||
// changeRootId: function(){
|
||||
// this.collection.remove(this.collection.models);
|
||||
// this.collection.add(pageView.collection.filter(this.filterDirectChildren,this));
|
||||
// this.updateBreadCrumbs();
|
||||
// },
|
||||
|
||||
// updateBreadCrumbs: function(){
|
||||
// var rootId = this.getRootId();
|
||||
// if (rootId){
|
||||
// var current = Tasks.get(rootId);
|
||||
// var breadCrumbs = _.template('<a href="#<%= id %>"><%= content %></a>')(current.attributes);
|
||||
// var depth=0;
|
||||
// while (current.get('parentId') && depth<100){
|
||||
// depth++;
|
||||
// current = Tasks.get(current.get('parentId'));
|
||||
// breadCrumbs=_.template('<a href="#<%= id %>"><%= content %></a> > ')(current.attributes)+breadCrumbs;
|
||||
// }
|
||||
// if (depth>=100) console.error('Max depth exceeded while making breadCrumbs');
|
||||
// breadCrumbs='<a href="#">Home</a> > '+breadCrumbs;
|
||||
// $('#task-breadcrumbs').append(breadCrumbs);
|
||||
//
|
||||
// }
|
||||
// },
|
||||
|
||||
// Only show direct children
|
||||
filterDirectChildren: function (child, index, collection) {
|
||||
return child.get('parentId') === 0;
|
||||
},
|
||||
// filterDirectChildren: function (child, index, collection) {
|
||||
// var rootId = this.getRootId();
|
||||
// if (rootId)
|
||||
// return child.get('id') == rootId;
|
||||
// else
|
||||
// return child.get('parentId') == rootId;
|
||||
// },
|
||||
|
||||
/** This is the root view in the tree **/
|
||||
getParentView: function () {
|
||||
@@ -88,8 +80,9 @@ define(
|
||||
|
||||
/** Update parentId when added to collection **/
|
||||
onAddChild: function(childView){
|
||||
if (childView.model.get('parentId')!==0)
|
||||
childView.model.save({parentId: 0});
|
||||
var rootId = pageView.getRootId();
|
||||
if (childView.model.get('parentId')!=rootId && childView.model==rootId)
|
||||
childView.model.save({parentId: rootId});
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
+104
-15
@@ -1,41 +1,130 @@
|
||||
define(
|
||||
['jquery',
|
||||
'backbone',
|
||||
'marionette',
|
||||
'views/list',
|
||||
'models/task'
|
||||
'data/demo',
|
||||
'models/task',
|
||||
'collections/list'
|
||||
],
|
||||
|
||||
function(
|
||||
$,
|
||||
Backbone,
|
||||
Marionette,
|
||||
ListView,
|
||||
Task
|
||||
demoData,
|
||||
Task,
|
||||
List
|
||||
) {
|
||||
|
||||
var PageView = Backbone.View.extend({
|
||||
var PageView = Marionette.View.extend({
|
||||
|
||||
el: $("#main"),
|
||||
el: $("#hackflowy"),
|
||||
|
||||
events: {
|
||||
'keypress #newTask': 'createNewTask',
|
||||
'blur #newTask': 'createNewTask'
|
||||
},
|
||||
|
||||
initialize: function() {
|
||||
listView = this.listView = new ListView();
|
||||
this.input = $('#newTask');
|
||||
|
||||
// this wholeCollection holds all items
|
||||
this.collection = new List();
|
||||
|
||||
|
||||
function success(children, data, promise) {
|
||||
// load demo data if the server returns nothing
|
||||
var directChildren = children.filter(this.filterDirectChildren,this);
|
||||
if (directChildren.length === 0){
|
||||
for (var i = 0; i < demoData.length; i++) {
|
||||
var task = this.collection.add(demoData[i]);
|
||||
task.save();
|
||||
}
|
||||
}
|
||||
this.listView.collection.add(children.filter(this.filterDirectChildren,this));
|
||||
this.listView.render();
|
||||
this.updateBreadCrumbs();
|
||||
}
|
||||
|
||||
this.collection.fetch({
|
||||
success: success,
|
||||
error: function () {
|
||||
// switch to localforage database if server isn't present and fetch again
|
||||
// from there
|
||||
window.hackflowyOffline = true;
|
||||
this.$('#header-alerts').append('<div class="alert-box secondary round">Running in offline mode, data may be lost </div>');
|
||||
this.collection.fetch({
|
||||
success: success,
|
||||
context: this
|
||||
});
|
||||
},
|
||||
context: this
|
||||
});
|
||||
|
||||
var rootItems = new List(this.collection.filter(this.filterDirectChildren,this));
|
||||
this.listView = new ListView({collection: rootItems});
|
||||
|
||||
|
||||
// change root item when the url hash changes
|
||||
// HACK should ideally use http://stackoverflow.com/a/19114496/221742
|
||||
$(window).on("hashchange", this.changeRootId.bind(this));
|
||||
|
||||
// stop browser going back a page when jamming backspace
|
||||
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+0008'||e.keyIdentifier=='Backspace'){if(e.target==document.body){e.preventDefault();}}},true);
|
||||
$(window).on('keydown',function(e){if(e.keyIdentifier=='U+0008'||e.keyIdentifier=='Backspace'){if(e.target==document.body){e.preventDefault();}}});
|
||||
|
||||
|
||||
},
|
||||
|
||||
createNewTask: function(e) {
|
||||
if (e.keyCode != 13) return;
|
||||
if (!this.input.val().trim()) return;
|
||||
this.listView.collection.add(new Task({content: this.input.val().trim() }));
|
||||
this.input.val('');
|
||||
}
|
||||
/** remove non backbone listener on delete **/
|
||||
onDestroy: function() {
|
||||
$(window).off("haschange",this.changeRootId);
|
||||
$(window).off('keydown',function(e){if(e.keyIdentifier=='U+0008'||e.keyIdentifier=='Backspace'){if(e.target==document.body){e.preventDefault();}}});
|
||||
},
|
||||
|
||||
/** Get root id for the displayed list from the url hash or 0 **/
|
||||
getRootId: function(){
|
||||
var hash = window.location.hash.slice(1);
|
||||
if (hash && pageView.collection.get(hash))
|
||||
return hash;
|
||||
else if (hash)
|
||||
window.location.hash='';
|
||||
return 0;
|
||||
},
|
||||
|
||||
/** Called when window location hash changes **/
|
||||
changeRootId: function(){
|
||||
// change the listview children
|
||||
this.listView.collection.remove(this.collection.models);
|
||||
this.listView.collection.add(this.collection.filter(this.filterDirectChildren,this));
|
||||
this.updateBreadCrumbs();
|
||||
},
|
||||
|
||||
// Only show direct children
|
||||
filterDirectChildren: function (child, index, collection) {
|
||||
var rootId = this.getRootId();
|
||||
if (rootId)
|
||||
return child.get('id') == rootId;
|
||||
else
|
||||
return child.get('parentId') == rootId;
|
||||
},
|
||||
|
||||
updateBreadCrumbs: function(){
|
||||
var rootId = this.getRootId();
|
||||
this.$('#task-breadcrumbs').empty();
|
||||
if (rootId){
|
||||
var current = this.collection.get(rootId);
|
||||
var breadCrumbs = '';//_.template('<a href="#<%= id %>"><%= content %></a>')(current.attributes);
|
||||
var depth=0;
|
||||
while (current.get('parentId') && depth<100){
|
||||
depth++;
|
||||
current = this.collection.get(current.get('parentId'));
|
||||
breadCrumbs=_.template('<a href="#<%= id %>"><%= content %></a> > ')(current.attributes)+breadCrumbs;
|
||||
}
|
||||
if (depth>=100) console.error('Max depth exceeded while making breadCrumbs');
|
||||
breadCrumbs='<a href="#">Home</a> > '+breadCrumbs;
|
||||
this.$('#task-breadcrumbs').append(breadCrumbs);
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
|
||||
+23
-20
@@ -20,9 +20,10 @@ define(
|
||||
// The recursive tree view. Ref:http://jsfiddle.net/wassname/zf61mLvh/2/
|
||||
var TaskView = Backbone.Marionette.CompositeView.extend({
|
||||
|
||||
template: _.template(taskTemplate), //'#task-view-template',
|
||||
template: _.template(taskTemplate),
|
||||
tagName: 'ul',
|
||||
className: "shift",
|
||||
className: "task-view",
|
||||
viewComparator: List.prototype.comporator,
|
||||
childView: TaskView,
|
||||
childViewContainer: '.children',
|
||||
childViewOptions: {
|
||||
@@ -50,38 +51,42 @@ define(
|
||||
'click .complete:first': 'markComplete',
|
||||
'click .uncomplete:first': 'unmarkComlete',
|
||||
'click .note:first': 'addNote',
|
||||
'click .mouse-tip:first': 'foldChildren',
|
||||
'click .fold-button:first': 'foldChildren',
|
||||
'click .fold:first': 'foldChildren',
|
||||
'click .destroy:first': 'destroy',
|
||||
// custom events
|
||||
'focus': 'this.model.focusOnView',
|
||||
|
||||
},
|
||||
|
||||
collectionEvents: {},
|
||||
collectionEvents: {
|
||||
},
|
||||
|
||||
childEvents: {},
|
||||
|
||||
initialize: function (options) {
|
||||
var task = this;
|
||||
|
||||
// options
|
||||
if (!('reorderOnSort' in options)) {
|
||||
options.reorderOnSort = true;
|
||||
}
|
||||
|
||||
// backlink
|
||||
this.model.view = this;
|
||||
|
||||
var children = Tasks.filter(
|
||||
var children = pageView.collection.filter(
|
||||
function (child, index, collection) {
|
||||
return child.get('parentId') === this.model.id;
|
||||
}, this);
|
||||
this.collection = new List(children);
|
||||
|
||||
// there is probobly a better way to do this
|
||||
if (this.isEmpty()){
|
||||
this.$el.addClass('empty');
|
||||
}
|
||||
|
||||
// events
|
||||
this.listenTo(this.model, 'change', this.render);
|
||||
this.listenTo(this.model, 'destroy', this.remove);
|
||||
// refresh ui hashes after children are rendered
|
||||
this.listenTo(this, 'render:collection', this.bindUIElements);
|
||||
// custom event
|
||||
this.listenTo(this, 'childview:rerender', this.render);
|
||||
this.listenTo(this, 'focus', this.model.focusOnView);
|
||||
|
||||
// updates from server
|
||||
@@ -113,9 +118,9 @@ define(
|
||||
|
||||
/** Get the parent view or root view **/
|
||||
getParentView: function () {
|
||||
var parent = Tasks.get(this.model.get('parentId'));
|
||||
var parent = pageView.collection.get(this.model.get('parentId'));
|
||||
if (parent) return parent.view;
|
||||
else return listView;
|
||||
else return pageView.listView;
|
||||
},
|
||||
|
||||
/** Update parentId when added to collection **/
|
||||
@@ -126,7 +131,7 @@ define(
|
||||
|
||||
/** Focus on the next visible element down despite list level **/
|
||||
focusOnPrev: function () {
|
||||
var all = listView.$el.find('ul:visible');
|
||||
var all = pageView.listView.$el.find('ul:visible');
|
||||
var prev = $(all[all.index(this.$el) - 1]);
|
||||
if (prev.length){
|
||||
prev.find('input:first').focus();
|
||||
@@ -135,7 +140,7 @@ define(
|
||||
},
|
||||
|
||||
focusOnNext: function () {
|
||||
var all = listView.$el.find('ul:visible');
|
||||
var all = pageView.listView.$el.find('ul:visible');
|
||||
var next = $(all[all.index(this.$el) + 1]);
|
||||
if (next)
|
||||
next.find('input:first').focus();
|
||||
@@ -169,13 +174,11 @@ define(
|
||||
// move down list by swapping priority with next sibling
|
||||
e.preventDefault();
|
||||
this.getParentView().collection.moveDown(this.model);
|
||||
this.trigger('rerender');
|
||||
this.model.focusOnView();
|
||||
} else if (e.ctrlKey && e.keyCode == constants.UP_ARROW) {
|
||||
// move up the list
|
||||
e.preventDefault();
|
||||
this.getParentView().collection.moveUp(this.model);
|
||||
this.trigger('rerender');
|
||||
this.model.focusOnView();
|
||||
} else if (e.keyCode == constants.DOWN_ARROW) {
|
||||
this.focusOnNext();
|
||||
@@ -188,7 +191,7 @@ define(
|
||||
if (parentId===0){
|
||||
|
||||
} else if (parentId){
|
||||
parentModel = Tasks.get(parentId);
|
||||
parentModel = pageView.collection.get(parentId);
|
||||
this.getParentView().collection.remove(this.model);
|
||||
var index = parentModel.view.getParentView().collection.indexOf(parentModel);
|
||||
if (index<0) index=this.getParentView().collection.length-1;
|
||||
@@ -203,7 +206,7 @@ define(
|
||||
var prevSibling = this.$el.prev('ul');
|
||||
if (prevSibling.length) {
|
||||
var prevSibId = prevSibling.find('input:first').data('id');
|
||||
var prevSibView =Tasks.get(prevSibId).view;
|
||||
var prevSibView =pageView.collection.get(prevSibId).view;
|
||||
this.getParentView().collection.remove(this.model);
|
||||
prevSibView.collection.add(this.model);
|
||||
this.model.focusOnView();
|
||||
@@ -269,7 +272,7 @@ define(
|
||||
|
||||
var index= this.getParentView().collection.indexOf(this.model);
|
||||
|
||||
var task = Tasks.add({parentId: this.model.get('parentId')});
|
||||
var task = pageView.collection.add({parentId: this.model.get('parentId')});
|
||||
task.save();
|
||||
if (index>=0)
|
||||
this.getParentView().collection.add(task, {at:index+1});
|
||||
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<title>HackFlowy</title>
|
||||
|
||||
<link rel="stylesheet" href="stylesheets/normalize.css" />
|
||||
|
||||
<link rel="stylesheet" href="stylesheets/app.css" />
|
||||
|
||||
|
||||
<script src="javascripts/vendor/custom.modernizr.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="row">
|
||||
<div class="large-12 columns">
|
||||
<section id="hackflowy">
|
||||
<header id="header">
|
||||
|
||||
</header>
|
||||
<section id="main">
|
||||
<div id="name">
|
||||
<h2>test</h2>
|
||||
</div>
|
||||
<div class="children">
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Task 1</div>
|
||||
</div>
|
||||
<div class="task with-children open">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Task 2</div>
|
||||
<div class="children">
|
||||
<div class="task with-children open">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Child 1 Task 2</div>
|
||||
<div class="children">
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Subchild 1 Child 1 Task 2</div>
|
||||
</div>
|
||||
<div class="task with-children open">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Subchild 2 Child 1 Task 2</div>
|
||||
<div class="children">
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Subsubchild 1 Subchild 2 Child 1 Task 2 asbdkjas dkjas bdajsbd kajsdb jasbd kajsb dajskbd akjsb dkjab</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Subsubchild 2 Subchild 2 Child 1 Task 2</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Child 1 Task 3</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="task">
|
||||
<div class="link">•</div>
|
||||
<div class="content">Task 3</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<footer id="footer">
|
||||
Make Lists. Catch Fish. <3 Open Source.
|
||||
</footer>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/template" id="item-template">
|
||||
|
||||
</script>
|
||||
<script>
|
||||
document.write('<script src=' +
|
||||
('__proto__' in {} ? '../bower_components/zepto' : '../bower_components/jquery/dist/jquery.min') +
|
||||
'.js><\/script>')
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "hackflowy",
|
||||
"version": "0.0.2",
|
||||
"version": "0.0.3",
|
||||
"license": "MIT",
|
||||
"description": "A simple WorkFlowy clone",
|
||||
"dependencies": {
|
||||
"body-parser": "^1.14.2",
|
||||
|
||||
@@ -162,6 +162,9 @@ body {
|
||||
li.shift9 {
|
||||
margin-left: 270px;
|
||||
}
|
||||
ul.shift {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
#main > .children {
|
||||
|
||||
+106
-62
@@ -5681,9 +5681,6 @@ body #hackflowy #main .children li.shift8 {
|
||||
body #hackflowy #main .children li.shift9 {
|
||||
margin-left: 270px;
|
||||
}
|
||||
body #hackflowy #main .children ul.shift {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
/* line 167, ../sass/app.scss */
|
||||
body #hackflowy #main > .children {
|
||||
margin-left: 0;
|
||||
@@ -5695,54 +5692,58 @@ body #hackflowy #footer {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body #hackflowy #main .children ul.task-view {
|
||||
margin-bottom: 0px;
|
||||
margin-left: 0px;
|
||||
|
||||
}
|
||||
.options-div{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.options{
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
color: rgb(51, 51, 51);
|
||||
cursor: auto;
|
||||
display: none;
|
||||
font-family: 'Helvetica Neue', Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
height: 0px;
|
||||
line-height: 16px;
|
||||
width: 675px;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
color: rgb(51, 51, 51);
|
||||
cursor: auto;
|
||||
display: none;
|
||||
font-family: 'Helvetica Neue', Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
height: 0px;
|
||||
line-height: 16px;
|
||||
width: 675px;
|
||||
}
|
||||
|
||||
.options a {
|
||||
display: inline-block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.options-left {
|
||||
background: #ddd;
|
||||
border: 1px solid #bbb;
|
||||
width: 80px;
|
||||
min-height: 58px;
|
||||
padding: 10px 0 5px 10px;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 4px;
|
||||
font-family: 'Helvetica Neue', Arial, Sans-serif;
|
||||
z-index: 8;
|
||||
margin-top: 8px;
|
||||
margin-left: -29px;
|
||||
background: #ddd;
|
||||
border: 1px solid #bbb;
|
||||
width: 80px;
|
||||
min-height: 58px;
|
||||
padding: 10px 0 5px 10px;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 4px;
|
||||
font-family: 'Helvetica Neue', Arial, Sans-serif;
|
||||
z-index: 8;
|
||||
margin-top: 16px;
|
||||
margin-left: -29px;
|
||||
}
|
||||
|
||||
|
||||
.options-left a {
|
||||
color: #555;
|
||||
margin-bottom: 5px;
|
||||
font-size: 12px;
|
||||
display: block;
|
||||
margin-right: 10px;
|
||||
width: auto;
|
||||
color: #555;
|
||||
margin-bottom: 5px;
|
||||
font-size: 12px;
|
||||
display: block;
|
||||
margin-right: 10px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.options-left a:hover {
|
||||
@@ -5750,42 +5751,85 @@ width: auto;
|
||||
}
|
||||
|
||||
.options-left > .mouse-tip {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
height: 25px;
|
||||
width: 90px;
|
||||
margin-top: -36px;
|
||||
margin-left: -1%;
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
height: 25px;
|
||||
width: 90px;
|
||||
margin-top: -36px;
|
||||
margin-left: -1%;
|
||||
}
|
||||
|
||||
.options-left > .mouse-tip:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 19%;
|
||||
margin-left: -15px;
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-bottom: 15px solid #ddd;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 19%;
|
||||
margin-left: -15px;
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-bottom: 15px solid #ddd;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
}
|
||||
|
||||
.mouse-tip:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 50%;
|
||||
margin-left: -15px;
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-bottom: 15px solid #ddd;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 50%;
|
||||
margin-left: -15px;
|
||||
height: 0;
|
||||
width: 0;
|
||||
border-bottom: 15px solid #ddd;
|
||||
border-left: 15px solid transparent;
|
||||
border-right: 15px solid transparent;
|
||||
}
|
||||
|
||||
.options-left > .fold-button {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
/*height: 25px;*/
|
||||
/*width: 90px;*/
|
||||
margin-top: -45px;
|
||||
margin-left: -3%;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.options-left > .fold-button:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* By default show fold button */
|
||||
.options-left>.fold-button:before {
|
||||
content: "-";
|
||||
}
|
||||
/* no fold button on empty nodes */
|
||||
.empty .options-left:first-child > .fold-button:before {
|
||||
content: '';
|
||||
}
|
||||
/* expand button on folded nodes */
|
||||
.folded .options-left:first-child>.fold-button:before {
|
||||
content: "+";
|
||||
}
|
||||
|
||||
.task-completed{
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.subtle-link {
|
||||
color: rgb(51, 51, 51);
|
||||
}
|
||||
.subtle-link:hover {
|
||||
color: rgb(51, 51, 51);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#task-breadcrumbs {
|
||||
font-size: smaller;
|
||||
}
|
||||
#task-breadcrumbs a {
|
||||
color: rgb(51, 51, 51);
|
||||
}
|
||||
#task-breadcrumbs a:hover {
|
||||
color: rgb(51, 51, 51);
|
||||
}
|
||||
|
||||
Vendored
-405
@@ -1,405 +0,0 @@
|
||||
/* normalize.css v2.1.0 | MIT License | git.io/normalize */
|
||||
/* ==========================================================================
|
||||
HTML5 display definitions
|
||||
========================================================================== */
|
||||
/**
|
||||
* Correct `block` display not defined in IE 8/9.
|
||||
*/
|
||||
/* line 22, ../sass/normalize.scss */
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct `inline-block` display not defined in IE 8/9.
|
||||
*/
|
||||
/* line 32, ../sass/normalize.scss */
|
||||
audio,
|
||||
canvas,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent modern browsers from displaying `audio` without controls.
|
||||
* Remove excess height in iOS 5 devices.
|
||||
*/
|
||||
/* line 41, ../sass/normalize.scss */
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
/* line 50, ../sass/normalize.scss */
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Base
|
||||
========================================================================== */
|
||||
/**
|
||||
* 1. Set default font family to sans-serif.
|
||||
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||
* user zoom.
|
||||
*/
|
||||
/* line 64, ../sass/normalize.scss */
|
||||
html {
|
||||
font-family: sans-serif;
|
||||
/* 1 */
|
||||
-webkit-text-size-adjust: 100%;
|
||||
/* 2 */
|
||||
-ms-text-size-adjust: 100%;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default margin.
|
||||
*/
|
||||
/* line 74, ../sass/normalize.scss */
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Links
|
||||
========================================================================== */
|
||||
/**
|
||||
* Address `outline` inconsistency between Chrome and other browsers.
|
||||
*/
|
||||
/* line 86, ../sass/normalize.scss */
|
||||
a:focus {
|
||||
outline: thin dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability when focused and also mouse hovered in all browsers.
|
||||
*/
|
||||
/* line 95, ../sass/normalize.scss */
|
||||
a:active,
|
||||
a:hover {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Typography
|
||||
========================================================================== */
|
||||
/**
|
||||
* Address variable `h1` font-size and margin within `section` and `article`
|
||||
* contexts in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
/* line 108, ../sass/normalize.scss */
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9, Safari 5, and Chrome.
|
||||
*/
|
||||
/* line 117, ../sass/normalize.scss */
|
||||
abbr[title] {
|
||||
border-bottom: 1px dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
/* line 126, ../sass/normalize.scss */
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in Safari 5 and Chrome.
|
||||
*/
|
||||
/* line 134, ../sass/normalize.scss */
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address differences between Firefox and other browsers.
|
||||
*/
|
||||
/* line 142, ../sass/normalize.scss */
|
||||
hr {
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
/* line 152, ../sass/normalize.scss */
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct font family set oddly in Safari 5 and Chrome.
|
||||
*/
|
||||
/* line 164, ../sass/normalize.scss */
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability of pre-formatted text in all browsers.
|
||||
*/
|
||||
/* line 173, ../sass/normalize.scss */
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set consistent quote types.
|
||||
*/
|
||||
/* line 181, ../sass/normalize.scss */
|
||||
q {
|
||||
quotes: "\201C" "\201D" "\2018" "\2019";
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent and variable font size in all browsers.
|
||||
*/
|
||||
/* line 189, ../sass/normalize.scss */
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||
*/
|
||||
/* line 198, ../sass/normalize.scss */
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/* line 205, ../sass/normalize.scss */
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/* line 209, ../sass/normalize.scss */
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Embedded content
|
||||
========================================================================== */
|
||||
/**
|
||||
* Remove border when inside `a` element in IE 8/9.
|
||||
*/
|
||||
/* line 221, ../sass/normalize.scss */
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct overflow displayed oddly in IE 9.
|
||||
*/
|
||||
/* line 229, ../sass/normalize.scss */
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Figures
|
||||
========================================================================== */
|
||||
/**
|
||||
* Address margin not present in IE 8/9 and Safari 5.
|
||||
*/
|
||||
/* line 241, ../sass/normalize.scss */
|
||||
figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Forms
|
||||
========================================================================== */
|
||||
/**
|
||||
* Define consistent border, margin, and padding.
|
||||
*/
|
||||
/* line 253, ../sass/normalize.scss */
|
||||
fieldset {
|
||||
border: 1px solid silver;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `color` not being inherited in IE 8/9.
|
||||
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||
*/
|
||||
/* line 264, ../sass/normalize.scss */
|
||||
legend {
|
||||
border: 0;
|
||||
/* 1 */
|
||||
padding: 0;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct font family not being inherited in all browsers.
|
||||
* 2. Correct font size not being inherited in all browsers.
|
||||
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
/* line 278, ../sass/normalize.scss */
|
||||
button,
|
||||
input,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit;
|
||||
/* 1 */
|
||||
font-size: 100%;
|
||||
/* 2 */
|
||||
margin: 0;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||
* the UA stylesheet.
|
||||
*/
|
||||
/* line 290, ../sass/normalize.scss */
|
||||
button,
|
||||
input {
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||
* All other form control elements do not inherit `text-transform` values.
|
||||
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
|
||||
* Correct `select` style inheritance in Firefox 4+ and Opera.
|
||||
*/
|
||||
/* line 302, ../sass/normalize.scss */
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||
* and `video` controls.
|
||||
* 2. Correct inability to style clickable `input` types in iOS.
|
||||
* 3. Improve usability and consistency of cursor style between image-type
|
||||
* `input` and others.
|
||||
*/
|
||||
/* line 317, ../sass/normalize.scss */
|
||||
button,
|
||||
html input[type="button"],
|
||||
input[type="reset"],
|
||||
input[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
/* 2 */
|
||||
cursor: pointer;
|
||||
/* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-set default cursor for disabled elements.
|
||||
*/
|
||||
/* line 327, ../sass/normalize.scss */
|
||||
button[disabled],
|
||||
html input[disabled] {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address box sizing set to `content-box` in IE 8/9.
|
||||
* 2. Remove excess padding in IE 8/9.
|
||||
*/
|
||||
/* line 337, ../sass/normalize.scss */
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
box-sizing: border-box;
|
||||
/* 1 */
|
||||
padding: 0;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
||||
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
||||
* (include `-moz` to future-proof).
|
||||
*/
|
||||
/* line 348, ../sass/normalize.scss */
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield;
|
||||
/* 1 */
|
||||
-moz-box-sizing: content-box;
|
||||
-webkit-box-sizing: content-box;
|
||||
/* 2 */
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and search cancel button in Safari 5 and Chrome
|
||||
* on OS X.
|
||||
*/
|
||||
/* line 361, ../sass/normalize.scss */
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and border in Firefox 4+.
|
||||
*/
|
||||
/* line 370, ../sass/normalize.scss */
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove default vertical scrollbar in IE 8/9.
|
||||
* 2. Improve readability and alignment in all browsers.
|
||||
*/
|
||||
/* line 380, ../sass/normalize.scss */
|
||||
textarea {
|
||||
overflow: auto;
|
||||
/* 1 */
|
||||
vertical-align: top;
|
||||
/* 2 */
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Tables
|
||||
========================================================================== */
|
||||
/**
|
||||
* Remove most spacing between table cells.
|
||||
*/
|
||||
/* line 393, ../sass/normalize.scss */
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
+4
-1
@@ -4,12 +4,15 @@
|
||||
<div class="link">•
|
||||
<div class="options">
|
||||
<div class="options-left">
|
||||
<div class="mouse-tip"></div>
|
||||
<a class="fold-button" title="Expand/collapse children"></a>
|
||||
<a class="mouse-tip" href="#<%= obj.id %>"></a>
|
||||
<% if(isCompleted){ %>
|
||||
<a class="uncomplete">Uncomplete<hr></a>
|
||||
<% }else { %>
|
||||
<a class="complete">Complete<hr></a>
|
||||
<% } %>
|
||||
<a class="fold">Fold<hr></a>
|
||||
<a class="destroy">Delete<hr></a>
|
||||
<a class="note">
|
||||
<span class="note">Add Note</span>
|
||||
</a>
|
||||
|
||||
Reference in New Issue
Block a user