Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code refactoring #8

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
8 changes: 6 additions & 2 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ module.exports = function(grunt) {
'<%= grunt.template.today("yyyy-mm-dd") %>\n' +
'<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
'* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' +
' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> \n*/\n' +
' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> \n*/\n' +
';(function (Backbone, _) {',
footer : 'taxi.version = "<%= pkg.version %>";\n})(Backbone.noConflict(), _.noConflict());'
},
Expand Down Expand Up @@ -49,7 +49,11 @@ module.exports = function(grunt) {
'dist/vendor.js': [
'vendor/jquery*.js',
'vendor/underscore*.js',
'vendor/backbone*.js'
'vendor/backbone*.js',
'vendor/codemirror*.js'
],
'dist/vendor.css': [
'vendor/codemirror*.css'
],
'dist/<%= name %>-complete.js' : [
'dist/vendor.js',
Expand Down
1 change: 1 addition & 0 deletions examples/bdd.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<html>
<head>
<link rel="stylesheet" href="../dist/taxi.css" />
<link rel="stylesheet" href="../dist/vendor.css" />
<script type="text/javascript" src="../dist/vendor.js"></script>
<script type="text/javascript" src="../dist/taxi.js"></script>
<script type="text/javascript">
Expand Down
9 changes: 3 additions & 6 deletions examples/bdd.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
driver('Component One', function () {
passenger('One Default', function (options) {
var
$container = options.$container;
var $container = options.$container;
$container.html('hello world');
});
passenger('One Special', function (options) {
var
$container = options.$container;
var $container = options.$container;
$container.html('hello world');
});
});
Expand All @@ -21,8 +19,7 @@ driver('Component Two', function () {
});
driver('Error Component', function () {
passenger('native error', function () {
var
object = {};
var object = {};
object.test();
});
passenger('custom error', function () {
Expand Down
7 changes: 3 additions & 4 deletions examples/example.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<html>
<head>
<link rel="stylesheet" href="../dist/taxi.css" />
<link rel="stylesheet" href="../dist/vendor.css" />
<script type="text/javascript" src="../dist/vendor.js"></script>
<script type="text/javascript" src="../dist/taxi.js"></script>
<script type="text/javascript" src="example.js"></script>
Expand All @@ -23,17 +24,15 @@
key : 'case-one',
name : 'One Default',
callback : function (options) {
var
$container = options.$container;
var $container = options.$container;
$container.html('hello world');
}
},
{
key : 'case-two',
name : 'One Special',
callback : function (options) {
var
$container = options.$container;
var $container = options.$container;
$container.html('hello world <br /> Longer Content');
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/DriverListView.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ taxi.DriverListView = Backbone.View.extend({
className : 'taxi-driver-list',
render : function () {
var
data = this.getRenderData(),
html = taxi.templates.driver_list(data);
html = taxi.templates.driver_list(this.getRenderData());
this.$el.html(html);
return this;
},
Expand Down
85 changes: 28 additions & 57 deletions src/DriverView.js
Original file line number Diff line number Diff line change
@@ -1,86 +1,57 @@
taxi.DriverView = Backbone.View.extend({
className : 'taxi-driver',
contexts : {},
initialize : function (options) {
this.runner = options.runner;
this.passenger = options.passenger;
this.passengerViews = [];
},
destroy : function () {
var
runners = this.model.get('passengers'),
afterEach = this.model.get('afterEach'),
contexts = this.contexts;
if (afterEach) {
_.each(runners, function (runner) {
try {
afterEach.call(contexts[runner.key]);
} catch (e) {
console.error(e);
}
});
}
remove : function () {
_.invoke(this.passengerViews, 'remove');
this.passengerViews = [];
return Backbone.View.prototype.remove.apply(this, arguments);
},
render : function () {
var
data = this.getRenderData(),
html = taxi.templates.driver(data);
html = taxi.templates.driver(this.getRenderData());
this.$el.html(html);
this.$runners = this.$el.find('.taxi-driver-runners');
this.renderRunners();
this.$passengers = this.$('.taxi-driver-passengers');
this.renderPassengers();
return this;
},
renderRunners : function () {
renderPassengers : function () {
var
runner = this.runner,
runners = this.model.get('passengers');
if (runner) {
this.renderRunner(_.find(runners, function (config) {
return config.key === runner;
passenger = this.passenger,
passengers = this.model.get('passengers');
if (passenger) {
this.renderPassenger(_.find(passengers, function (config) {
return config.key === passenger;
}));
} else {
_.each(runners, this.renderRunner, this);
_.each(passengers, this.renderPassenger, this);
}
},
renderRunner : function (runner) {
renderPassenger : function (passenger) {
var
key = this.model.get('key'),
$runners = this.$runners,
beforeEach = this.model.get('beforeEach'),
contexts = this.contexts,
context = {},
$html = $(taxi.templates.runner({
'runner' : runner,
'driver_key' : key
})),
$container = $html.find('.taxi-runner-container'),
options = {
$container : $container
};

try {
if (beforeEach) {
beforeEach.call(context, options);
}
if (runner.callback) {
runner.callback.call(context, options);
}
} catch (e) {
$container
.addClass('taxi-error')
.text(e.stack || e.toString());
console.error(e);
}
afterEach = this.model.get('afterEach'),
passengerView = new taxi.PassengerView({
model : passenger,
driverKey : key,
before : beforeEach,
after : afterEach
});

$runners.append($html);
contexts[runner.key] = context;
this.passengerViews.push(passengerView);
this.$passengers.append(passengerView.render().$el);
},
getRenderData : function () {
return this.model.toJSON();
},
scroll : function (key) {
var
selector = '[data-key="' + key + '"]',
$runner = this.$runners.children().filter(selector),
position = $runner.position();
$passenger = this.$passengers.children().filter(selector),
position = $passenger.position();
if (position) {
this.$el.scrollTop(position.top);
}
Expand Down
90 changes: 90 additions & 0 deletions src/PassengerView.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
taxi.PassengerView = Backbone.View.extend({
tagName : 'li',
className : 'taxi-passenger',
emptyFunction : 'function (options) {\n}',
events : {
'click .tab' : 'onTab'
},
initialize : function (options) {
this.driverKey = options.driverKey;
this.before = options.before;
this.after = options.after;
this.editors = [];
this.context = {};
},
remove : function () {
if (this.after) {
try {
this.after.call(this.context);
} catch (e) {
console.error(e);
}
}
return Backbone.View.prototype.remove.apply(this, arguments);
},
render : function () {
this.$el.html(taxi.templates.passenger({
passenger : this.model,
driver_key : this.driverKey
}));
this.$tabs = this.$('.tabs');
this.createEditors();
this.executeCallbacks();
return this;
},
createEditors : function () {
this.editors['callback-editor'] = this.createEditor('.callback-editor',
this.model.callback || this.emptyFunction);
},
createEditor : function (classSelector, value) {
return CodeMirror(this.$(classSelector)[0], {
value: value.toString(),
mode: 'text/javascript',
lineNumbers: true,
tabSize: 2,
lineWrapping: true,
viewportMargin: Infinity,
autofocus: true
});
},
executeCallbacks : function () {
var
$container = this.$('.taxi-passenger-container'),
options = {
$container : $container
};
try {
if (this.before) {
this.before.call(this.context, options);
}

if (this.model.callback) {
this.model.callback.call(this.context, options);
}
} catch (e) {
$container
.addClass('taxi-error')
.text(e.stack || e.toString());
console.error(e);
}
},
onTab : function (event) {
var
$lastActive = this.$tabs.children('.active'),
lastActiveClassName = $lastActive.data('control'),
$active = this.$(event.currentTarget),
activeClassName = $active.data('control');

$lastActive.removeClass('active');
$active.addClass('active');

this.$('.' + lastActiveClassName).hide();
this.$('.' + activeClassName).show();
if (activeClassName === 'taxi-passenger-container') {
this.model.callback = eval('(' + this.editors['callback-editor'].getValue() + ')');
this.render();
} else {
this.editors[activeClassName].refresh();
}
}
});
12 changes: 6 additions & 6 deletions src/TaxiRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ taxi.TaxiRouter = Backbone.Router.extend({
routes : {
'' : 'home',
'driver/:driver' : 'driver',
'driver/:driver/:runner' : 'driver',
'single/:driver/:runner' : 'driver'
'driver/:driver/:passenger' : 'driver',
'single/:driver/:passenger' : 'driver'
},
initialize : function (options) {
this.config = options.config;
Expand All @@ -18,17 +18,17 @@ taxi.TaxiRouter = Backbone.Router.extend({
this.application.setView(view);
this.application.setTitle();
},
driver : function (driver, runner) {
driver : function (driver, passenger) {
var
model = this.drivers.get(driver),
view = new taxi.DriverView({
model : model,
runner : runner
passenger : passenger
});
this.application.setView(view);
this.application.setTitle(
'<a href="#driver/'+model.get('key')+'">'+model.get('name')+' Driver</a>'
'<a href="#driver/' + model.get('key') + '">' + model.get('name') + ' Driver</a>'
);
//view.scroll(runner);
//view.scroll(passenger);
}
});
20 changes: 8 additions & 12 deletions src/TaxiView.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,20 @@ taxi.TaxiView = Backbone.View.extend({
collection : this.config.drivers
});
},
destroy : function () {
this.menu.destroy();
remove : function () {
this.menu.remove();
return Backbone.View.prototype.remove.apply(this, arguments);
},
render : function () {
var
menu = this.menu,
$el = this.$el;
menu.render();
this.$el.html(taxi.templates.taxi());
this.$content = $el.find('.taxi-view');
this.$title = $el.find('.taxi-title');
this.$menu = menu.$el;
$el.find('.taxi-menu').append(menu.$el);
this.$content = this.$('.taxi-view');
this.$title = this.$('.taxi-title');
this.$('.taxi-menu').append(this.menu.render().$el);
return this;
},
setView : function (view) {
if (this.view && this.view.destroy) {
this.view.destroy();
if (this.view) {
this.view.remove();
}
if (view) {
this.view = view;
Expand Down
Loading