Skip to content

Commit

Permalink
Merge pull request #58 from jh3y/develop
Browse files Browse the repository at this point in the history
Address #57
  • Loading branch information
jh3y authored Sep 16, 2016
2 parents 45d29d5 + 2d55b20 commit 7b62df6
Show file tree
Hide file tree
Showing 84 changed files with 2,230 additions and 1,731 deletions.
3 changes: 3 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"presets": ["es2015", "react"]
}
3 changes: 3 additions & 0 deletions LOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ Log ![alt tag](https://raw.github.com/jh3y/tyto/master/src/img/tyto.png)
* __23/05/14__: V1.4.0. Introduction of Grunt and Bower.̨
* __01/08/15__: V2.0.0. Complete overhaul of design and functionality. Move to MV* framework and introduction of minimal UI using MDL.
* __02/10/15__: Documentation reduction.
* __05/10/15__: Add markdown support + bug fixes.
* __17/10/15__: Implement dynamic linking between entities via Markdown `#`.
* __16/09/16__: V3.0.0 Removal of CoffeeScript in favor of Babel ES6 + various bug fixes/improvements.
49 changes: 24 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,42 @@ just visit [jh3y.github.io/tyto](http://jh3y.github.io/tyto)!

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/app_three_cols.png)

###Features
### Features
* minimal UI
* no accounts necessary
* intuitive
* extensible
* localStorage persistence
* time tracking
* sortable UI
* task linking
* Markdown support
* etc.

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/add_task.gif)

###Why tyto? What's it for?
Tyto arose from a desire of my own and members of my then team. The desire for an intuitive and simple tool for easy workflow/task management. Whether it be managing tasks in the current sprint or your weekly schedule. An ability to share was also vital.
### Why tyto? What's it for?

Tyto arose from the want for an electronic post-it board without the need for accounts. Something simple and intuitive that could be easily shared.

It's also the product of my own curiosity being used as an opportunity to pick up new tech stacks. It started as a vanilla JS app utilising one file and experimenting with HTML5 drag and drop. It then grew a little more, and a little more after that. Now it uses Backbone w/ Marionette. The next step? Most likely Angular 2.0 or React.

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/edit_view.png)

In truth, most organisations have some form of tool for this. In my experience though, most are cumbersome and clunky. Employees tend to dislike internal tools. Whiteboards and walls etc. are still covered in sticky notes.
In truth, most organisations have some form of tool for what Tyto is doing. In my experience though, they can be cumbersome, clunky and just a bit noisy. Some employees tend to dislike internal tools. You still see whiteboards and walls plastered in sticky notes.

This is why tyto came about. It's intuitive and minimal. No accounts are necessary. On top of that, the source isn't too hard to grasp making it rather easy to extend and customise.
This is where Tyto came from, It's my personal intuitive and minimal TodoMVC. No accounts necessary and the source isn't too hard to grasp making it rather easy to extend and customise.

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/edit_task.gif)

###Who's it for?
Developer and project managers were the original target audience. A means to share project progression on a more personal level. As opposed to an automated message from an internal system.
### Who's it for?
Developer and project managers were the original target audience. A means to share project progression on a more _personal_ level. As opposed to publicly through an internal system. Almost like a complimentary attachment to an email.

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/linking.gif)

For example; a developer may track the different stages of a task. They may also want to track time spent on different tasks and then email this to a project manager.
Tyto isn't restricting. It has use in a multitude of scenarios. Not quite right out of the box? Extensibility provides a means to create a bespoke version based on theme or functionality.
There are no restrictions though, it's open source. Not quite right out of the box? Change it :smile:

Examples:
* the plan for the week ahead.
* ingredient lists.
* priority lists etc.
* managing your xmas shopping
Extensibility provides a means to create a bespoke version based on theme or functionality.

Tyto is a personal pet of mine and if it can help others, that's great!

Expand All @@ -59,12 +60,10 @@ Changes are persistent thanks to `localStorage`.

Want to move to a different browser or machine though? Use the export utility to export a json file. Load this using the import utility.

A persistent workflow across devices? I'm afraid I haven't implemented that. Accounts is not something I am keen on implementing. I think it diverts from my original intention with tyto.


A persistent workflow across devices? I'm afraid I haven't implemented that. Accounts is _not_ something I am keen on implementing/hosting right now. I think it diverts from my original intention with Tyto.

####Your own environment
#####Prerequisites
#### Your own environment
##### Prerequisites
If you're cloning the repo and setting up the codebase you are going to need __[node]__, __[bower]__ and __[gulp]__ installed.
#####Set up
1. Clone the repo.
Expand All @@ -81,14 +80,14 @@ If you're cloning the repo and setting up the codebase you are going to need __[

gulp

####Hosting
#### Hosting
I would suggest just taking a snapshot of the `gh-pages` branch and ftp'ing this onto your desired server or web space. Alternatively, follow the set up procedure and FTP the contents of the `public` directory.

If you wish to host on Github. Follow the set up procedure first(ideally, with a fork). When happy with your version, use the `deploy` task. This will require familiarity with `gulp-gh-pages` in order to publish to the correct location if other than `gh-pages`.

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/speed_dial.gif)

###Development
### Development
A strength of tyto is extensibility. Making changes whether it be functional or aesthetic is straightforward once familiar with the codebase.

Any queries as to how things work in the codebase? Feel free to raise an issue with a question!
Expand All @@ -106,15 +105,15 @@ There are a range of technologies being used under the hood.
* Marked
* Jade
* Stylus
* CoffeeScript
* Babel
* Gulp

![alt tag](https://raw.github.com/jh3y/pics/master/tyto/move_task.gif)

###License
### License

MIT

If you wish to use __tyto__ please star, fork or share the repo! It aids with project presence.
---------------------------

[@jh3y](https://github.com/jh3y) (c) 2015.
Made with :sparkles: [@jh3y](https://twitter.com/@_jh3y) 2016
4 changes: 2 additions & 2 deletions bower.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "tyto",
"version": "2.2.2",
"version": "3.0.0",
"homepage": "https://github.com/jh3y/tyto",
"authors": [
"jh3y <jh3y@live.co.uk>"
"jh3y <jh3y@users.noreply.github.com>"
],
"description": "manage and organise things",
"keywords": [
Expand Down
50 changes: 50 additions & 0 deletions build-tasks/assets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
var gulp = require('gulp'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var assets = {
scripts: function() {
var yapFilter = plugins.filter([
'**/*.js',
'!**/yap.min.js'
]);
return gulp.src(sources.vendor.js)
.pipe(plugins.plumber())
.pipe(env.dist ? yapFilter: plugins.gUtil.noop())
.pipe(plugins.concat('vendor.js'))
.pipe(gulp.dest(destinations.js))
.pipe(plugins.uglify(pluginOpts.uglify))
.pipe(plugins.rename(pluginOpts.rename))
.pipe(gulp.dest(destinations.js));
},
fonts: function() {
return gulp.src(sources.vendor.fonts)
.pipe(plugins.plumber())
.pipe(gulp.dest(destinations.fonts));
},
styles: function() {
return gulp.src(sources.vendor.css)
.pipe(plugins.plumber())
.pipe(plugins.concat('vendor.css'))
.pipe(gulp.dest(destinations.css))
.pipe(plugins.minify(pluginOpts.minify))
.pipe(plugins.rename(pluginOpts.rename))
.pipe(gulp.dest(destinations.css));
},
img: function() {
return gulp.src(sources.img)
.pipe(plugins.plumber())
.pipe(gulp.dest(destinations.img));
},
json: function() {
return gulp.src(sources.json)
.pipe(plugins.plumber())
.pipe(gulp.dest(destinations.js));
}
};

module.exports = assets;
16 changes: 16 additions & 0 deletions build-tasks/deploy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var gulp = require('gulp'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var deploy = {
deploy: function () {
return gulp.src(sources.overwatch)
.pipe(plugins.deploy());
}
};

module.exports = deploy;
21 changes: 21 additions & 0 deletions build-tasks/markup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
var gulp = require('gulp'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var markup = {
compile: function() {
return gulp.src(sources.docs)
.pipe(plugins.plumber())
.pipe(plugins.pug(pluginOpts.pug))
.pipe(gulp.dest(destinations.html));
},
watch: function() {
gulp.watch(sources.markup, ['markup:compile']);
}
};

module.exports = markup;
45 changes: 45 additions & 0 deletions build-tasks/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
var gulp = require('gulp'),
browserify = require('browserify'),
source = require('vinyl-source-stream'),
buffer = require('vinyl-buffer'),
fs = require('fs'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var scripts = {
compile: function () {
var b = browserify({
entries: [
'./src/script/app.js'
],
transform: 'babelify',
extensions: '.js',
debug: env.mapped ? true: false
});

return b.bundle()
.pipe(plugins.plumber())
.pipe(source(gConfig.pkg.name + '.js'))
.pipe(buffer())
.pipe(env.mapped ? plugins.sourcemaps.init({loadMaps: true}): plugins.gUtil.noop())
.pipe(plugins.wrap(pluginOpts.wrap))
.pipe(plugins.header(fs.readFileSync('./LICENSE', 'utf-8')))
.pipe(env.stat ? plugins.size(pluginOpts.gSize): plugins.gUtil.noop())
.pipe(gulp.dest(destinations.js))
.pipe(plugins.uglify(pluginOpts.uglify))
.pipe(plugins.rename(pluginOpts.rename))
.pipe(env.mapped ? plugins.sourcemaps.write('./'): plugins.gUtil.noop())
.pipe(env.stat ? plugins.size(pluginOpts.gSize): plugins.gUtil.noop())
.pipe(gulp.dest(env.dist ? destinations.dist: destinations.js));

},
watch: function() {
gulp.watch(sources.script, ['script:compile']);
}
};

module.exports = scripts;
29 changes: 29 additions & 0 deletions build-tasks/serve.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
var gulp = require('gulp'),
browsersync = require('browser-sync'),
vss = require('vinyl-source-stream'),
vb = require('vinyl-buffer'),
vf = require('vinyl-file'),
gConfig = require('../gulp-config'),
opts = gConfig.pluginOpts,
src = gConfig.paths.sources,
dest = gConfig.paths.destinations;
/*
start; creates local static livereload server using browser-sync.
*/
var server = {
start: function() {
var server = browsersync.create();
server.init(opts.browserSync);
return server.watch(src.overwatch, function(evt, file) {
if (evt === 'change' && file.indexOf('.css') === -1)
server.reload();
if (evt === 'change' && file.indexOf('.css') !== -1)
vf.readSync(file)
.pipe(vss(file))
.pipe(vb())
.pipe(server.stream());
});
}
};

module.exports = server;
27 changes: 27 additions & 0 deletions build-tasks/style.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
var gulp = require('gulp'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var style = {
compile: function() {
return gulp.src(sources.style, {base: 'src/style'})
.pipe(plugins.plumber())
.pipe(plugins.order(pluginOpts.order.stylus))
.pipe(plugins.concat(gConfig.pkg.name + '.styl'))
.pipe(plugins.stylus())
.pipe(plugins.prefix(pluginOpts.prefix))
.pipe(gulp.dest(destinations.css))
.pipe(plugins.minify())
.pipe(plugins.rename(pluginOpts.rename))
.pipe(gulp.dest(destinations.css));
},
watch: function() {
gulp.watch(sources.style, ['style:compile']);
}
};

module.exports = style;
29 changes: 29 additions & 0 deletions build-tasks/tmpl.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
var gulp = require('gulp'),
gConfig = require('../gulp-config'),
pluginOpts = gConfig.pluginOpts,
sources = gConfig.paths.sources,
destinations = gConfig.paths.destinations,
env = require('./utils').getEnv(),
plugins = require('gulp-load-plugins')(pluginOpts.load);

var tmpl = {
compile: function(){
return gulp.src(sources.templates)
.pipe(plugins.plumber())
.pipe(plugins.pug(pluginOpts.pug))
.pipe(plugins.template({
name: 'templates.js',
base: 'src/markup/templates/',
variable: 'module.exports',
options: {
variable: 'tyto'
}
}))
.pipe(gulp.dest(destinations.templates));
},
watch: function() {
gulp.watch(sources.templates, ['tmpl:compile']);
}
};

module.exports = tmpl;
18 changes: 18 additions & 0 deletions build-tasks/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
var getEnv = function() {
var gutil = require('gulp-util'),
activeEnvs = {},
envs = [
'dist',
'dev',
'deploy',
'mapped',
'stat'
];
for (var i = 0; i < envs.length; i++) {
activeEnvs[envs[i]] = (gutil.env[envs[i]]) ? true: false;
}
return activeEnvs;
};
module.exports = {
getEnv: getEnv
};
Loading

0 comments on commit 7b62df6

Please sign in to comment.