houston-roadmaps 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +24 -0
  4. data/Gemfile.lock +358 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +31 -0
  7. data/Rakefile +25 -0
  8. data/app/assets/images/houston/roadmaps/.gitkeep +0 -0
  9. data/app/assets/javascripts/houston/roadmaps/app.coffee +2 -0
  10. data/app/assets/javascripts/houston/roadmaps/application.js +14 -0
  11. data/app/assets/javascripts/houston/roadmaps/handlebars_helpers.coffee +22 -0
  12. data/app/assets/javascripts/houston/roadmaps/jquery_extensions.coffee +4 -0
  13. data/app/assets/javascripts/houston/roadmaps/models/goal.coffee +11 -0
  14. data/app/assets/javascripts/houston/roadmaps/models/milestone.coffee +124 -0
  15. data/app/assets/javascripts/houston/roadmaps/models/roadmap.coffee +16 -0
  16. data/app/assets/javascripts/houston/roadmaps/models/viewport.coffee +3 -0
  17. data/app/assets/javascripts/houston/roadmaps/resize_listener.js +67 -0
  18. data/app/assets/javascripts/houston/roadmaps/views/_gantt_chart.coffee +224 -0
  19. data/app/assets/javascripts/houston/roadmaps/views/_show_milestone_view.coffee +204 -0
  20. data/app/assets/javascripts/houston/roadmaps/views/edit_gantt_chart.coffee +405 -0
  21. data/app/assets/javascripts/houston/roadmaps/views/edit_milestone_view.coffee +97 -0
  22. data/app/assets/javascripts/houston/roadmaps/views/edit_roadmap_view.coffee +80 -0
  23. data/app/assets/javascripts/houston/roadmaps/views/gantt_thumbnail_view.coffee +173 -0
  24. data/app/assets/javascripts/houston/roadmaps/views/goal_view.coffee +18 -0
  25. data/app/assets/javascripts/houston/roadmaps/views/project_goals_view.coffee +30 -0
  26. data/app/assets/javascripts/houston/roadmaps/views/roadmap_history_view.coffee +67 -0
  27. data/app/assets/javascripts/houston/roadmaps/views/roadmap_view.coffee +12 -0
  28. data/app/assets/javascripts/houston/roadmaps/views/roadmaps_view.coffee +29 -0
  29. data/app/assets/stylesheets/houston/roadmaps/application.css +13 -0
  30. data/app/assets/stylesheets/houston/roadmaps/colors.scss.erb +41 -0
  31. data/app/assets/stylesheets/houston/roadmaps/goals.scss +20 -0
  32. data/app/assets/stylesheets/houston/roadmaps/milestone.scss +58 -0
  33. data/app/assets/stylesheets/houston/roadmaps/roadmap.scss +276 -0
  34. data/app/assets/stylesheets/houston/roadmaps/roadmap_history.scss +42 -0
  35. data/app/assets/stylesheets/houston/roadmaps/roadmaps.scss +89 -0
  36. data/app/assets/templates/houston/roadmaps/goals/edit.hbs +6 -0
  37. data/app/assets/templates/houston/roadmaps/goals/index.hbs +9 -0
  38. data/app/assets/templates/houston/roadmaps/goals/new.hbs +27 -0
  39. data/app/assets/templates/houston/roadmaps/goals/show.hbs +6 -0
  40. data/app/assets/templates/houston/roadmaps/milestone/edit.hbs +67 -0
  41. data/app/assets/templates/houston/roadmaps/milestone/show.hbs +53 -0
  42. data/app/assets/templates/houston/roadmaps/milestone/ticket.hbs +28 -0
  43. data/app/assets/templates/houston/roadmaps/roadmap/goal.hbs +6 -0
  44. data/app/assets/templates/houston/roadmaps/roadmap/history.hbs +22 -0
  45. data/app/assets/templates/houston/roadmaps/roadmap/show.hbs +12 -0
  46. data/app/assets/templates/houston/roadmaps/roadmaps/index.hbs +2 -0
  47. data/app/assets/templates/houston/roadmaps/roadmaps/show.hbs +11 -0
  48. data/app/controllers/houston/roadmaps/api/v1/roadmap_controller.rb +20 -0
  49. data/app/controllers/houston/roadmaps/dashboard_controller.rb +34 -0
  50. data/app/controllers/houston/roadmaps/milestones_controller.rb +118 -0
  51. data/app/controllers/houston/roadmaps/project_goals_controller.rb +24 -0
  52. data/app/controllers/houston/roadmaps/roadmap_milestones_controller.rb +36 -0
  53. data/app/controllers/houston/roadmaps/roadmaps_controller.rb +77 -0
  54. data/app/helpers/houston/roadmaps/application_helper.rb +4 -0
  55. data/app/models/roadmap.rb +9 -0
  56. data/app/models/roadmap_commit.rb +35 -0
  57. data/app/models/roadmap_milestone.rb +29 -0
  58. data/app/models/roadmap_milestone_version.rb +8 -0
  59. data/app/presenters/houston/roadmaps/milestone_api_presenter.rb +27 -0
  60. data/app/presenters/houston/roadmaps/milestone_presenter.rb +74 -0
  61. data/app/presenters/houston/roadmaps/roadmap_milestone_presenter.rb +70 -0
  62. data/app/presenters/houston/roadmaps/roadmap_presenter.rb +37 -0
  63. data/app/presenters/houston/roadmaps/ticket_presenter.rb +20 -0
  64. data/app/views/houston/roadmaps/dashboard/show.html.erb +42 -0
  65. data/app/views/houston/roadmaps/milestones/show.html.erb +40 -0
  66. data/app/views/houston/roadmaps/project_goals/index.html.erb +42 -0
  67. data/app/views/houston/roadmaps/roadmaps/_form.html.erb +29 -0
  68. data/app/views/houston/roadmaps/roadmaps/edit.html.erb +8 -0
  69. data/app/views/houston/roadmaps/roadmaps/history.html.erb +41 -0
  70. data/app/views/houston/roadmaps/roadmaps/index.html.erb +24 -0
  71. data/app/views/houston/roadmaps/roadmaps/new.html.erb +7 -0
  72. data/app/views/houston/roadmaps/roadmaps/show.html.erb +27 -0
  73. data/app/views/houston/roadmaps/roadmaps/show_editable.html.erb +35 -0
  74. data/app/views/layouts/houston/roadmaps/application.html.erb +10 -0
  75. data/app/views/layouts/houston/roadmaps/dashboard.html.erb +9 -0
  76. data/bin/rails +8 -0
  77. data/config/database.yml +13 -0
  78. data/config/initializers/add_navigation_renderer.rb +13 -0
  79. data/config/routes.rb +37 -0
  80. data/db/.keep +0 -0
  81. data/db/migrate/20140831210254_add_band_to_milestones.rb +5 -0
  82. data/db/migrate/20140907212311_add_end_date_to_milestones.rb +19 -0
  83. data/db/migrate/20140916230539_add_locked_to_milestone.rb +5 -0
  84. data/db/migrate/20140927154728_add_closed_ticket_count_to_milestones.rb +11 -0
  85. data/db/migrate/20140929024130_create_roadmap_commits.rb +29 -0
  86. data/db/migrate/20141012023628_add_user_id_to_milestone_versions.rb +11 -0
  87. data/db/migrate/20150102192805_add_lanes_to_milestones.rb +5 -0
  88. data/db/migrate/20150119155145_add_goal_and_feedback_query_to_milestones.rb +6 -0
  89. data/db/migrate/20150524203903_add_project_id_to_roadmap_commits.rb +17 -0
  90. data/db/migrate/20150603203744_add_timestamps_to_roadmap_commits.rb +20 -0
  91. data/db/migrate/20160206214746_rename_roadmap_feature_to_milestones.rb +25 -0
  92. data/db/migrate/20160207154530_create_roadmaps.rb +125 -0
  93. data/db/structure.sql +2557 -0
  94. data/houston-roadmaps.gemspec +29 -0
  95. data/lib/houston-roadmaps.rb +1 -0
  96. data/lib/houston/roadmaps.rb +15 -0
  97. data/lib/houston/roadmaps/configuration.rb +14 -0
  98. data/lib/houston/roadmaps/engine.rb +27 -0
  99. data/lib/houston/roadmaps/milestone_ext.rb +14 -0
  100. data/lib/houston/roadmaps/project_ext.rb +20 -0
  101. data/lib/houston/roadmaps/railtie.rb +17 -0
  102. data/lib/houston/roadmaps/version.rb +5 -0
  103. data/lib/tasks/roadmap_tasks.rake +4 -0
  104. data/test/acceptance/houston_dummy_test.rb +17 -0
  105. data/test/dummy/houston.rb +23 -0
  106. data/test/fixtures/projects.yml +3 -0
  107. data/test/fixtures/users.yml +10 -0
  108. data/test/test_helper.rb +43 -0
  109. data/test/unit/fixtures_test.rb +11 -0
  110. metadata +227 -0
@@ -0,0 +1,12 @@
1
+ class Roadmaps.RoadmapView extends Backbone.View
2
+
3
+ initialize: ->
4
+ @setMilestones @options.milestones
5
+
6
+ setMilestones: (@milestones)->
7
+ @roadmap = new Roadmaps.GanttChart(@milestones, @options)
8
+ @
9
+
10
+ render: ->
11
+ @roadmap.render()
12
+ @
@@ -0,0 +1,29 @@
1
+ class Roadmaps.RoadmapsView extends Backbone.View
2
+
3
+ initialize: ->
4
+ @roadmaps = @options.roadmaps
5
+ @template = HandlebarsTemplates['houston/roadmaps/roadmaps/index']
6
+ @renderRoadmap = HandlebarsTemplates['houston/roadmaps/roadmaps/show']
7
+ super
8
+
9
+ render: ->
10
+ @$el.html @template()
11
+ $ol = @$el.find("#roadmaps")
12
+ @roadmaps.each (roadmap) =>
13
+ $li = $(@renderRoadmap(roadmap.toJSON()))
14
+ $ol.append $li
15
+
16
+ $preview = $li.find(".roadmap-preview")
17
+ milestones = roadmap.milestones()
18
+ if milestones.length > 0
19
+ roadmapView = new Roadmaps.GanttChart milestones,
20
+ el: $preview[0]
21
+ viewport: roadmap.viewport()
22
+ showThumbnail: false
23
+ linkMilestones: false
24
+ bandHeight: 8
25
+ bandMargin: 2
26
+ roadmapView.render()
27
+ else
28
+ $preview.html '<span class="roadmap-empty">Click to add milestones to this roadmap</span>'
29
+ @
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,41 @@
1
+ // Add percentage of white to a color
2
+ @function tint($color, $percent){
3
+ @return mix(white, $color, $percent);
4
+ }
5
+
6
+ // Add percentage of black to a color
7
+ @function shade($color, $percent){
8
+ @return mix(black, $color, $percent);
9
+ }
10
+
11
+ <% Houston.config.project_colors.each do |name, value| %>
12
+ $<%= name %>: <%= value.rgb %>;
13
+ <% end %>
14
+
15
+ .roadmap-milestone, .roadmap-milestone-placeholder {
16
+ <% Houston.config.project_colors.each do |name, value| %>
17
+ &.<%= name %> {
18
+ &::before { background: <%= value.rgb %>; }
19
+ }
20
+ <% end %>
21
+ }
22
+
23
+ body.dashboard .roadmap-milestone {
24
+ <% Houston.config.project_colors.each do |name, value| %>
25
+ &.<%= name %> {
26
+ border-color: <%= value.rgb %>;
27
+ & > span { color: hsl(hue($<%= name %>), saturation($<%= name %>), 80); }
28
+ .roadmap-milestone-progress { background: shade($<%= name %>, 25%); }
29
+
30
+ &.completed {
31
+ .roadmap-milestone-progress { background: $<%= name %>; }
32
+ & > span { color: black; }
33
+ }
34
+
35
+ &.upcoming {
36
+ border-color: shade(<%= value.rgb %>, 50%);
37
+ & > span { color: shade(hsl(hue($<%= name %>), saturation($<%= name %>), 80), 50%); }
38
+ }
39
+ }
40
+ <% end %>
41
+ }
@@ -0,0 +1,20 @@
1
+ .goal {
2
+ &.neat-interactive:hover td {
3
+ background-color: rgba(128, 212, 255, 0.1);
4
+ cursor: pointer;
5
+ }
6
+
7
+ td {
8
+ padding: 4px 8px;
9
+ border-bottom: 0;
10
+ }
11
+
12
+ .goal-name {
13
+ input {
14
+ margin: 0;
15
+ width: 100%;
16
+ box-sizing: border-box;
17
+ height: 30px;
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,58 @@
1
+ #find_or_create_ticket {
2
+ width: 100%;
3
+ box-sizing: border-box;
4
+ height: 34px;
5
+ margin-bottom: 0;
6
+ padding: 0.5em 1em;
7
+ }
8
+
9
+ #milestone_view {
10
+ #show_completed_tickets { margin-bottom: 12px; }
11
+ &.hide-completed .ticket-closed { display: none; }
12
+ }
13
+
14
+ .ui-sortable tr.ticket {
15
+ &:hover td { background-color: rgba(128, 212, 255, 0.1); }
16
+ }
17
+ .table .ui-sortable-helper td { border-bottom: none; background: white; }
18
+
19
+ .editable td.ticket-handle {
20
+ background-image: image-url("drag-grip.png");
21
+ background-repeat: no-repeat;
22
+ background-position: 9px 50%;
23
+ cursor: pointer;
24
+ width: 6px;
25
+ }
26
+
27
+ .readonly .remove-ticket-button { display: none; }
28
+
29
+ td.ticket-status { white-space: nowrap; }
30
+
31
+ td, th {
32
+ &.ticket-number, &.ticket-effort, &.ticket-progress { text-align: right; }
33
+ }
34
+
35
+ .milestone-progress {
36
+ float: right;
37
+ margin-top: 30.1px !important;
38
+ }
39
+
40
+ .milestone-goal, .milestone-feedback {
41
+ &.inline-editable {
42
+ input, textarea, button { display: none; }
43
+
44
+ .inline-editable-link:hover { color: #005580; }
45
+
46
+ .blank { font-style: italic; }
47
+
48
+ &.in-edit {
49
+ input, button { display: inline-block; vertical-align: top; }
50
+ textarea {
51
+ display: block;
52
+ width: 100%;
53
+ height: 8em;
54
+ }
55
+ .inline-editable-link { display: none; }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,276 @@
1
+ $roadmap-padding: 1.33em;
2
+
3
+ .callout.roadmap {
4
+ padding-left: 0;
5
+ padding-right: 0;
6
+ border-top: 0;
7
+ padding-top: 0;
8
+ padding-bottom: $roadmap-padding;
9
+ }
10
+
11
+
12
+ #roadmap {
13
+ position: relative;
14
+ overflow: hidden; // so the roadmap can't be scrolled left and right
15
+ -moz-user-select: none;
16
+ -webkit-user-select: none;
17
+ -ms-user-select: none;
18
+ user-select: none;
19
+
20
+ &.drag-create {
21
+ cursor: ew-resize;
22
+ cursor: col-resize;
23
+ }
24
+
25
+ .roadmap-axis {
26
+ position: absolute;
27
+ bottom: 0;
28
+ width: 100%;
29
+ }
30
+ }
31
+
32
+ .roadmap-band {
33
+ position: relative;
34
+
35
+ &.sort-active {
36
+ &::before {
37
+ content: '.';
38
+ color: transparent;
39
+ position: absolute;
40
+ top: -6px;
41
+ left: -6px;
42
+ right: -6px;
43
+ bottom: -6px;
44
+ background: #f8f8f8;
45
+ box-shadow: inset 0 0 3px #ccc;
46
+ }
47
+ }
48
+ }
49
+
50
+ body.dashboard {
51
+ .roadmap-band {
52
+ margin: 4px 0;
53
+ height: 34px;
54
+ }
55
+
56
+ .roadmap-milestone {
57
+ background: black;
58
+ border-width: 1px;
59
+ border-style: solid;
60
+ border-radius: 4px;
61
+ font-size: 11px;
62
+ font-weight: 500;
63
+ line-height: 1.25em;
64
+ padding: 0;
65
+
66
+ & > span {
67
+ -webkit-font-smoothing: antialiased;
68
+ white-space: normal;
69
+
70
+ display: block;
71
+ overflow: hidden;
72
+ height: 100%;
73
+ }
74
+
75
+ &::before { display: none; }
76
+ }
77
+
78
+ .roadmap-marker, .roadmap-today {
79
+ background: rgba(255, 255, 255, 0.15);
80
+ width: 3px;
81
+ }
82
+ }
83
+
84
+ @-webkit-keyframes progress
85
+ {
86
+ to {background-position: 30px 0;}
87
+ }
88
+ @-moz-keyframes progress
89
+ {
90
+ to {background-position: 30px 0;}
91
+ }
92
+
93
+ @keyframes progress
94
+ {
95
+ to {background-position: 30px 0;}
96
+ }
97
+
98
+ .roadmap-milestone, .roadmap-milestone-placeholder {
99
+ position: absolute;
100
+ border: 1px solid #ccc;
101
+ background: #ddd;
102
+ border-radius: 2px;
103
+ text-align: center;
104
+ cursor: default;
105
+ padding: 4px 2px 4px 8px;
106
+ box-sizing: border-box;
107
+ z-index: 2;
108
+
109
+ &.unlocked {
110
+ border: 2px dashed #ccc;
111
+ background: #e4e4e4;
112
+ border-radius: 4px;
113
+ padding-top: 3px;
114
+ padding-bottom: 3px;
115
+
116
+ &::before {
117
+ border-top-left-radius: 2px;
118
+ border-bottom-left-radius: 2px;
119
+ }
120
+ }
121
+
122
+ &::before {
123
+ content: '.';
124
+ color: transparent;
125
+ display: block;
126
+ position: absolute;
127
+ top: 1px;
128
+ left: 1px;
129
+ bottom: 1px;
130
+ width: 5px;
131
+ }
132
+ }
133
+
134
+ rect.roadmap-thumbnail-milestone.completed { opacity: 0.5; }
135
+
136
+ .roadmap-milestone > span {
137
+ display: block;
138
+ width: 100%;
139
+ white-space: nowrap;
140
+ overflow: hidden;
141
+ text-overflow: ellipsis;
142
+ }
143
+
144
+ a.roadmap-milestone {
145
+ -moz-user-select: none;
146
+ -webkit-user-select: none;
147
+ -ms-user-select: none;
148
+ user-select: none;
149
+
150
+ display: block;
151
+ color: inherit;
152
+ text-decoration: none;
153
+ cursor: pointer;
154
+ }
155
+
156
+ body:not(.dashboard) {
157
+ .roadmap-milestone {
158
+ &.clickable:hover {
159
+ background: #DAE7EA;
160
+ color: #254a53;
161
+ border-color: #BACFD4;
162
+
163
+ &::before {
164
+ background: #89A6AD !important;
165
+ }
166
+ }
167
+ }
168
+ }
169
+
170
+ .roadmap-milestone:focus {
171
+ outline: 0;
172
+ }
173
+
174
+ .roadmap-milestone.dropdown-open {
175
+ background: #d3e4e8;
176
+ color: #254a53;
177
+ border-color: #5b7a82;
178
+ }
179
+
180
+ .roadmap-milestone-placeholder {
181
+ cursor: col-resize;
182
+
183
+ &.creating {
184
+ background: #d8d8d8;
185
+ -webkit-animation: progress 1s linear infinite;
186
+ animation: progress 1s linear infinite;
187
+ background-size: 30px 30px;
188
+ background-repeat: repeat-x;
189
+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.20) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.20) 50%, rgba(255, 255, 255, 0.20) 75%, transparent 75%, transparent);
190
+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.20) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.20) 50%, rgba(255, 255, 255, 0.20) 75%, transparent 75%, transparent);
191
+ }
192
+ }
193
+
194
+ .roadmap-milestone {
195
+ .ui-resizable-e {
196
+ cursor: ew-resize;
197
+ cursor: col-resize;
198
+ width: 14px;
199
+ }
200
+
201
+ .ui-resizable-s {
202
+ cursor: ns-resize;
203
+ cursor: row-resize;
204
+ }
205
+
206
+ .ui-resizable-se {
207
+ right: -2px;
208
+ bottom: -2px;
209
+ height: 16px;
210
+ width: 16px;
211
+ background: none;
212
+ }
213
+
214
+ &.locked .ui-resizable-handle { display: none; }
215
+
216
+ &.ui-resizable-resizing {
217
+ z-index: 10;
218
+ }
219
+ }
220
+
221
+ .roadmap-milestone-progress {
222
+ position: absolute;
223
+ top: 0;
224
+ bottom: 0;
225
+ left: 0;
226
+ z-index: -1;
227
+ }
228
+
229
+ .roadmap-thumbnail {
230
+ margin-bottom: $roadmap-padding;
231
+
232
+ svg { width: 100%; }
233
+ .axis text { font-size: 11px; }
234
+ .roadmap-thumbnail-band { fill: rgba(0,0,0,0.1); }
235
+ }
236
+
237
+ .roadmap-thumbnail-viewer {
238
+ position: absolute;
239
+ background: rgba(0, 0, 40, 0.1);
240
+ border: 1px solid black;
241
+ }
242
+
243
+ .roadmap-bands {
244
+ position: relative;
245
+ padding: 1px 0 24px;
246
+ }
247
+
248
+ .roadmap-marker, .roadmap-today {
249
+ position: absolute;
250
+ top: 0;
251
+ bottom: 24px;
252
+ width: 2px;
253
+ background: rgba(0, 0, 0, 0.5);
254
+ z-index: 101;
255
+ }
256
+
257
+ .roadmap-weekend {
258
+ background: rgba(255, 255, 255, 0.4);
259
+ position: absolute;
260
+ top: 1px;
261
+ bottom: 24px;
262
+ }
263
+
264
+ #goals_view {
265
+ position: fixed;
266
+ border-top: 2px solid;
267
+ bottom: 46px;
268
+ left: 0;
269
+ right: 0;
270
+ padding: 0 20px;
271
+ overflow-y: scroll;
272
+
273
+ .goal-project {
274
+ width: 9em;
275
+ }
276
+ }