diff --git a/app/assets/javascripts/backbone/models/habit.js.coffee b/app/assets/javascripts/backbone/models/habit.js.coffee new file mode 100644 index 0000000000..363444f285 --- /dev/null +++ b/app/assets/javascripts/backbone/models/habit.js.coffee @@ -0,0 +1,16 @@ +class HabitTracker.Models.Habit extends Backbone.Model + paramRoot: 'habit' + + defaults: + name: null + habit_type: null + score: null + notes: null + up: null + down: null + done: null + position: null + +class HabitTracker.Collections.HabitsCollection extends Backbone.Collection + model: HabitTracker.Models.Habit + url: '/habits' diff --git a/app/assets/javascripts/backbone/routers/habits_router.js.coffee b/app/assets/javascripts/backbone/routers/habits_router.js.coffee new file mode 100644 index 0000000000..d7bd2047dd --- /dev/null +++ b/app/assets/javascripts/backbone/routers/habits_router.js.coffee @@ -0,0 +1,31 @@ +class HabitTracker.Routers.HabitsRouter extends Backbone.Router + initialize: (options) -> + @habits = new HabitTracker.Collections.HabitsCollection() + @habits.reset options.habits + + routes: + "/new" : "newHabit" + "/index" : "index" + "/:id/edit" : "edit" + "/:id" : "show" + ".*" : "index" + + newHabit: -> + @view = new HabitTracker.Views.Habits.NewView(collection: @habits) + $("#habits").html(@view.render().el) + + index: -> + @view = new HabitTracker.Views.Habits.IndexView(habits: @habits) + $("#habits").html(@view.render().el) + + show: (id) -> + habit = @habits.get(id) + + @view = new HabitTracker.Views.Habits.ShowView(model: habit) + $("#habits").html(@view.render().el) + + edit: (id) -> + habit = @habits.get(id) + + @view = new HabitTracker.Views.Habits.EditView(model: habit) + $("#habits").html(@view.render().el) diff --git a/app/assets/javascripts/backbone/templates/habits/edit.jst.ejs b/app/assets/javascripts/backbone/templates/habits/edit.jst.ejs new file mode 100644 index 0000000000..46967283ce --- /dev/null +++ b/app/assets/javascripts/backbone/templates/habits/edit.jst.ejs @@ -0,0 +1,50 @@ +
| Name | +Habit type | +Score | +Notes | +Up | +Down | +Done | +Position | ++ | + | + |
|---|
+ Name: + <%= name %> +
+ ++ Habit type: + <%= habit_type %> +
+ ++ Score: + <%= score %> +
+ ++ Notes: + <%= notes %> +
+ ++ Up: + <%= up %> +
+ ++ Down: + <%= down %> +
+ ++ Done: + <%= done %> +
+ ++ Position: + <%= position %> +
+ + +Back \ No newline at end of file diff --git a/app/assets/javascripts/backbone/views/habits/edit_view.js.coffee b/app/assets/javascripts/backbone/views/habits/edit_view.js.coffee new file mode 100644 index 0000000000..8bae18d02d --- /dev/null +++ b/app/assets/javascripts/backbone/views/habits/edit_view.js.coffee @@ -0,0 +1,24 @@ +HabitTracker.Views.Habits ||= {} + +class HabitTracker.Views.Habits.EditView extends Backbone.View + template : JST["backbone/templates/habits/edit"] + + events : + "submit #edit-habit" : "update" + + update : (e) -> + e.preventDefault() + e.stopPropagation() + + @model.save(null, + success : (habit) => + @model = habit + window.location.hash = "/#{@model.id}" + ) + + render : -> + $(@el).html(@template(@model.toJSON() )) + + this.$("form").backboneLink(@model) + + return this diff --git a/app/assets/javascripts/backbone/views/habits/habit_view.js.coffee b/app/assets/javascripts/backbone/views/habits/habit_view.js.coffee new file mode 100644 index 0000000000..89733694c4 --- /dev/null +++ b/app/assets/javascripts/backbone/views/habits/habit_view.js.coffee @@ -0,0 +1,19 @@ +HabitTracker.Views.Habits ||= {} + +class HabitTracker.Views.Habits.HabitView extends Backbone.View + template: JST["backbone/templates/habits/habit"] + + events: + "click .destroy" : "destroy" + + tagName: "tr" + + destroy: () -> + @model.destroy() + this.remove() + + return false + + render: -> + $(@el).html(@template(@model.toJSON() )) + return this diff --git a/app/assets/javascripts/backbone/views/habits/index_view.js.coffee b/app/assets/javascripts/backbone/views/habits/index_view.js.coffee new file mode 100644 index 0000000000..4712ca9b0b --- /dev/null +++ b/app/assets/javascripts/backbone/views/habits/index_view.js.coffee @@ -0,0 +1,20 @@ +HabitTracker.Views.Habits ||= {} + +class HabitTracker.Views.Habits.IndexView extends Backbone.View + template: JST["backbone/templates/habits/index"] + + initialize: () -> + @options.habits.bind('reset', @addAll) + + addAll: () => + @options.habits.each(@addOne) + + addOne: (habit) => + view = new HabitTracker.Views.Habits.HabitView({model : habit}) + @$("tbody").append(view.render().el) + + render: => + $(@el).html(@template(habits: @options.habits.toJSON() )) + @addAll() + + return this diff --git a/app/assets/javascripts/backbone/views/habits/new_view.js.coffee b/app/assets/javascripts/backbone/views/habits/new_view.js.coffee new file mode 100644 index 0000000000..ef89617fb0 --- /dev/null +++ b/app/assets/javascripts/backbone/views/habits/new_view.js.coffee @@ -0,0 +1,37 @@ +HabitTracker.Views.Habits ||= {} + +class HabitTracker.Views.Habits.NewView extends Backbone.View + template: JST["backbone/templates/habits/new"] + + events: + "submit #new-habit": "save" + + constructor: (options) -> + super(options) + @model = new @collection.model() + + @model.bind("change:errors", () => + this.render() + ) + + save: (e) -> + e.preventDefault() + e.stopPropagation() + + @model.unset("errors") + + @collection.create(@model.toJSON(), + success: (habit) => + @model = habit + window.location.hash = "/#{@model.id}" + + error: (habit, jqXHR) => + @model.set({errors: $.parseJSON(jqXHR.responseText)}) + ) + + render: -> + $(@el).html(@template(@model.toJSON() )) + + this.$("form").backboneLink(@model) + + return this diff --git a/app/assets/javascripts/backbone/views/habits/show_view.js.coffee b/app/assets/javascripts/backbone/views/habits/show_view.js.coffee new file mode 100644 index 0000000000..bc8654ea25 --- /dev/null +++ b/app/assets/javascripts/backbone/views/habits/show_view.js.coffee @@ -0,0 +1,8 @@ +HabitTracker.Views.Habits ||= {} + +class HabitTracker.Views.Habits.ShowView extends Backbone.View + template: JST["backbone/templates/habits/show"] + + render: -> + $(@el).html(@template(@model.toJSON() )) + return this