houston-core 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +94 -69
- data/app/adapters/houston/adapters/deployment/engineyard.rb +4 -3
- data/app/adapters/houston/adapters/version_control/git_adapter.rb +36 -42
- data/app/adapters/houston/adapters/version_control/git_adapter/github_repo.rb +2 -2
- data/app/adapters/houston/adapters/version_control/git_adapter/remote_repo.rb +23 -11
- data/app/adapters/houston/adapters/version_control/git_adapter/repo.rb +18 -8
- data/app/adapters/houston/adapters/version_control/null_repo.rb +8 -0
- data/app/assets/javascripts/core/handlebars_helpers.coffee +3 -3
- data/app/assets/stylesheets/application/github_repos.scss +77 -0
- data/app/assets/stylesheets/application/navigation.scss +2 -0
- data/app/assets/stylesheets/application/pull_requests.scss +44 -58
- data/app/assets/stylesheets/core/avatars.scss +5 -0
- data/app/assets/stylesheets/core/colors.scss.erb +10 -7
- data/app/concerns/commit_synchronizer.rb +3 -0
- data/app/controllers/github/pulls_controller.rb +12 -0
- data/app/controllers/project_tests_controller.rb +3 -3
- data/app/controllers/projects_controller.rb +45 -1
- data/app/controllers/releases_controller.rb +42 -26
- data/app/helpers/application_helper.rb +8 -0
- data/app/helpers/avatar_helper.rb +2 -2
- data/app/helpers/commit_helper.rb +2 -2
- data/app/helpers/oembed_helper.rb +8 -0
- data/app/helpers/project_helper.rb +4 -5
- data/app/helpers/release_helper.rb +11 -0
- data/app/helpers/timeline_helper.rb +1 -1
- data/app/helpers/url_helper.rb +0 -18
- data/app/interactors/cache_key_dependencies.rb +28 -0
- data/app/jobs/sync_all_tickets_job.rb +1 -0
- data/app/mailers/view_mailer.rb +0 -1
- data/app/models/commit.rb +1 -1
- data/app/models/github/pull_request.rb +82 -26
- data/app/models/github/pull_request_event.rb +2 -2
- data/app/models/milestone.rb +1 -0
- data/app/models/project.rb +14 -0
- data/app/models/project_dependencies.rb +5 -3
- data/app/models/task.rb +1 -1
- data/app/models/user.rb +41 -0
- data/app/views/commits/show.html.erb +9 -1
- data/app/views/github/pulls/index.html.erb +102 -0
- data/app/views/project_notification/new_release.html.erb +6 -0
- data/app/views/project_tickets/index.xls.erb +0 -7
- data/app/views/projects/_form.html.erb +29 -17
- data/app/views/projects/index.html.erb +3 -3
- data/app/views/projects/new_from_github.html.erb +67 -0
- data/app/views/releases/_commits.html.erb +1 -1
- data/app/views/releases/show.html.erb +9 -0
- data/app/views/users/_form.html.erb +35 -19
- data/config/application.rb +12 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/routes.rb +17 -3
- data/db/migrate/20151201042126_require_projects_to_have_name_and_slug.rb +6 -0
- data/db/migrate/20151202005557_add_head_sha_to_projects.rb +24 -0
- data/db/migrate/20151202011812_require_projects_to_have_color.rb +13 -0
- data/db/migrate/20151205204922_require_project_slugs_to_be_unique.rb +5 -0
- data/db/migrate/20151205214647_add_avatar_url_to_pull_requests.rb +5 -0
- data/db/migrate/20151209004458_add_json_labels_to_pull_requests.rb +5 -0
- data/db/migrate/20151209030113_add_timestamps_to_pull_requests.rb +6 -0
- data/db/structure.sql +31 -5
- data/houston.gemspec +7 -7
- data/lib/configuration.rb +3 -2
- data/lib/houston/version.rb +1 -1
- data/lib/rack/oembed.rb +23 -0
- data/templates/new-instance/config/jobs/cache_key_dependencies.rb +3 -0
- data/templates/new-instance/config/triggers/tests/slack_when_analyzed.rb +1 -4
- data/templates/new-instance/config/triggers/tests/slack_when_completed.rb +1 -1
- data/templates/new-instance/lib/slack_helpers.rb +1 -1
- data/test/integration/ticket_tasks_api_test.rb +1 -1
- data/test/unit/adapters/git_adapter_test.rb +29 -8
- data/test/unit/adapters/version_control_adapters_api_test.rb +2 -0
- data/test/unit/controllers/hooks_controller_test.rb +4 -4
- data/test/unit/models/commit_test.rb +2 -2
- data/test/unit/models/project_test.rb +2 -2
- data/test/unit/models/pull_request_test.rb +9 -4
- data/test/unit/models/task_test.rb +1 -1
- data/test/unit/models/ticket_test.rb +1 -1
- metadata +31 -16
@@ -35,8 +35,8 @@ module Github
|
|
35
35
|
return unless pr && pr.persisted?
|
36
36
|
|
37
37
|
case action
|
38
|
-
when "labeled" then pr.add_label! payload["label"]
|
39
|
-
when "unlabeled" then pr.remove_label! payload["label"]
|
38
|
+
when "labeled" then pr.add_label! payload["label"], as: actor
|
39
|
+
when "unlabeled" then pr.remove_label! payload["label"], as: actor
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
data/app/models/milestone.rb
CHANGED
data/app/models/project.rb
CHANGED
@@ -15,6 +15,7 @@ class Project < ActiveRecord::Base
|
|
15
15
|
has_many :roles, -> { joins(:user).merge(User.unretired) }, dependent: :destroy, validate: false
|
16
16
|
has_many :value_statements, dependent: :destroy
|
17
17
|
has_many :pull_requests, class_name: "Github::PullRequest"
|
18
|
+
belongs_to :head, class_name: "Commit", foreign_key: "head_sha", primary_key: "sha"
|
18
19
|
|
19
20
|
Houston.config.project_roles.each do |role|
|
20
21
|
collection_name = role.downcase.gsub(' ', '_').pluralize
|
@@ -27,6 +28,9 @@ class Project < ActiveRecord::Base
|
|
27
28
|
reject_if: proc { |attrs| attrs[:user_id].blank? or attrs[:name].blank? }
|
28
29
|
accepts_nested_attributes_for :value_statements, :allow_destroy => true
|
29
30
|
|
31
|
+
before_validation :generate_default_slug, :set_default_color
|
32
|
+
validates_presence_of :name, :slug, :color
|
33
|
+
|
30
34
|
|
31
35
|
|
32
36
|
has_adapter :TicketTracker,
|
@@ -248,4 +252,14 @@ class Project < ActiveRecord::Base
|
|
248
252
|
|
249
253
|
|
250
254
|
|
255
|
+
private
|
256
|
+
|
257
|
+
def generate_default_slug
|
258
|
+
self.slug = self.name.to_s.underscore.gsub("/", "-").dasherize.gsub(".", "").gsub(/\s+/, "_") unless slug
|
259
|
+
end
|
260
|
+
|
261
|
+
def set_default_color
|
262
|
+
self.color = "default" unless color
|
263
|
+
end
|
264
|
+
|
251
265
|
end
|
@@ -41,10 +41,12 @@ class ProjectDependencies < SimpleDelegator
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def lockfile
|
44
|
-
return
|
44
|
+
return @lockfile if defined?(@lockfile)
|
45
|
+
return "" unless repo.exists?
|
45
46
|
|
46
|
-
|
47
|
-
|
47
|
+
Houston.benchmark "[project_dependencies.lockfile] #{slug}" do
|
48
|
+
@lockfile = read_file("Gemfile.lock", commit: head_sha)
|
49
|
+
end
|
48
50
|
rescue Houston::Adapters::VersionControl::FileNotFound
|
49
51
|
@lockfile = ""
|
50
52
|
end
|
data/app/models/task.rb
CHANGED
data/app/models/user.rb
CHANGED
@@ -117,6 +117,47 @@ class User < ActiveRecord::Base
|
|
117
117
|
|
118
118
|
|
119
119
|
|
120
|
+
# Extract to Houston::GitHub
|
121
|
+
# ------------------------------------------------------------------------- #
|
122
|
+
|
123
|
+
def self.find_by_github_username(username)
|
124
|
+
# If we can already identify the user who has the given username, return them
|
125
|
+
user = ::User.where(["view_options->'github_username' = ?", username]).first
|
126
|
+
return user if user
|
127
|
+
|
128
|
+
# Look up the email address of the GitHub user and see if we can
|
129
|
+
# identify the Houston user by the GitHub user's email address.
|
130
|
+
user = Houston.github.user(username)
|
131
|
+
user = find_by_email_address user.email if user
|
132
|
+
|
133
|
+
# We couldn't find the user by their email address, now
|
134
|
+
# we'll look at their nicknames
|
135
|
+
user = find_by_nickname username unless user
|
136
|
+
|
137
|
+
# We've failed to identify this user
|
138
|
+
unless user
|
139
|
+
Rails.logger.warn "\e[31m[pulls] Unable to identify a user for the GitHub username \e[1m#{username}\e[0m"
|
140
|
+
return nil
|
141
|
+
end
|
142
|
+
|
143
|
+
# If we have identified the user, store their username so that
|
144
|
+
# we can skip the email-lookup step in the future.
|
145
|
+
user.set_github_username! username
|
146
|
+
user
|
147
|
+
end
|
148
|
+
|
149
|
+
def github_username
|
150
|
+
view_options["github_username"]
|
151
|
+
end
|
152
|
+
|
153
|
+
def set_github_username!(username)
|
154
|
+
update_column :view_options, view_options.merge("github_username" => username)
|
155
|
+
end
|
156
|
+
|
157
|
+
# ------------------------------------------------------------------------- #
|
158
|
+
|
159
|
+
|
160
|
+
|
120
161
|
# LDAP Overrides
|
121
162
|
# ------------------------------------------------------------------------- #
|
122
163
|
|
@@ -1,3 +1,11 @@
|
|
1
|
+
<% content_for :meta do %>
|
2
|
+
<%= tag "meta", property: "og:type", content: "website" %>
|
3
|
+
<%= tag "meta", property: "og:site_name", content: "#{@project.slug} / commit" %>
|
4
|
+
<%= tag "meta", property: "og:title", content: @commit.summary %>
|
5
|
+
<%= tag "meta", property: "og:description", content: @commit.description %>
|
6
|
+
<%= tag "meta", property: "og:url", content: commit_url(@commit) %>
|
7
|
+
<% end %>
|
8
|
+
|
1
9
|
<%= render partial: "projects/header", locals: {project: @project, postfix: @commit.sha[0...8]} %>
|
2
10
|
|
3
11
|
<div class="commit-profile">
|
@@ -16,7 +24,7 @@
|
|
16
24
|
<%= div_for(release) do %>
|
17
25
|
<p class="release-header">
|
18
26
|
<%= release.released_at.strftime("%l:%M %p") %>
|
19
|
-
<%= link_to "details →".html_safe, release %>
|
27
|
+
<%= link_to "details →".html_safe, release_url(release) %>
|
20
28
|
|
21
29
|
<% if can?(:read, @project.commits.build) %>
|
22
30
|
<span class="commit-range"><%= link_to_release_commit_range(release) %></span>
|
@@ -0,0 +1,102 @@
|
|
1
|
+
<% content_for :title do %>
|
2
|
+
<h1 class="project-banner space-below">
|
3
|
+
<span id="pull_request_count" class="light"><%= @pulls.count %></span>
|
4
|
+
Pull Requests
|
5
|
+
</h1>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<div class="pull-request-labels pull-request-labels-toggle">
|
9
|
+
<% @labels.each do |label| %>
|
10
|
+
<%= check_box_tag label["name"], "1", @selected_labels.member?(label["name"]) %><%= label_tag label["name"] do %>
|
11
|
+
<%= pull_request_label(label) %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="nomargin">
|
17
|
+
<table id="pull_requests" class="table table-sortable table-striped">
|
18
|
+
<thead>
|
19
|
+
<tr>
|
20
|
+
<td class="table-margin"></td>
|
21
|
+
<td class="pull-request-avatar"></td>
|
22
|
+
<th class="pull-request-project">Project</th>
|
23
|
+
<th class="pull-request-title">Title</th>
|
24
|
+
<th class="pull-request-labels">Labels</th>
|
25
|
+
<th class="pull-request-age sort-asc">Age</th>
|
26
|
+
<td class="table-margin"></td>
|
27
|
+
</tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
<% @pulls.each do |pull| %>
|
31
|
+
<tr class="pull-request <%= pull.labels.map { |label| "pull-request-label-#{label["name"]}" }.join(" ") %>">
|
32
|
+
<td class="table-margin"></td>
|
33
|
+
<td class="pull-request-avatar">
|
34
|
+
<% if pull.user %>
|
35
|
+
<%= avatar_for pull.user, size: 32 %>
|
36
|
+
<% elsif pull.avatar_url %>
|
37
|
+
<%= image_tag pull.avatar_url, size: "32", alt: pull.username, class: "avatar avatar-not-our-user" %>
|
38
|
+
<% end %>
|
39
|
+
</td>
|
40
|
+
<td class="pull-request-project"><%= pull.project.slug %></td>
|
41
|
+
<td class="pull-request-title">
|
42
|
+
<%= link_to emojify(pull.title), pull.url, target: "_blank" %>
|
43
|
+
</td>
|
44
|
+
<td class="pull-request-labels">
|
45
|
+
<% pull.json_labels.each do |label| %>
|
46
|
+
<%= pull_request_label(label) %>
|
47
|
+
<% end %>
|
48
|
+
</td>
|
49
|
+
<td class="pull-request-age" data-timestamp="<%= pull.created_at.iso8601 if pull.created_at %>">
|
50
|
+
<%= format_time_ago(pull.created_at) %>
|
51
|
+
</td>
|
52
|
+
<td class="table-margin"></td>
|
53
|
+
</tr>
|
54
|
+
<% end %>
|
55
|
+
</tbody>
|
56
|
+
</table>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<% content_for :javascripts do %>
|
60
|
+
<script type="text/javascript">
|
61
|
+
$.tablesorter.addParser({
|
62
|
+
id: 'labels',
|
63
|
+
type: 'text',
|
64
|
+
is: function(s) { return false; }, // return false so this parser is not auto detected
|
65
|
+
format: function(s, table, td) {
|
66
|
+
var $td = $(td),
|
67
|
+
labels = _.map($td.find('.label'), function(el) { return $(el).text() });
|
68
|
+
return labels.sort().join(',');
|
69
|
+
}
|
70
|
+
});
|
71
|
+
|
72
|
+
$(function() {
|
73
|
+
$('#pull_requests').tablesorter({
|
74
|
+
headers: {
|
75
|
+
4: {sorter: 'labels'},
|
76
|
+
5: {sorter: 'timestamp'}
|
77
|
+
}
|
78
|
+
});
|
79
|
+
|
80
|
+
function filterPullRequests() {
|
81
|
+
var visibleClasses = $('.pull-request-labels-toggle :checkbox:checked').map(function(el) {
|
82
|
+
return 'pull-request-label-' + $(this).attr('name');
|
83
|
+
});
|
84
|
+
|
85
|
+
$('.pull-request').each(function() {
|
86
|
+
var $pull = $(this),
|
87
|
+
classes = $pull.attr('class').split(' '); classes.shift();
|
88
|
+
$pull.toggle(_.all(classes, function(cssClass) {
|
89
|
+
return _.contains(visibleClasses, cssClass);
|
90
|
+
}));
|
91
|
+
});
|
92
|
+
|
93
|
+
$('#pull_request_count').html($('.pull-request:visible').length);
|
94
|
+
}
|
95
|
+
filterPullRequests();
|
96
|
+
|
97
|
+
$('.pull-request-labels-toggle :checkbox').click(function(e) {
|
98
|
+
filterPullRequests();
|
99
|
+
});
|
100
|
+
});
|
101
|
+
</script>
|
102
|
+
<% end %>
|
@@ -49,13 +49,11 @@
|
|
49
49
|
<Column ss:AutoFitWidth="0" ss:Width="700"/>
|
50
50
|
<Column ss:AutoFitWidth="0" ss:Width="85"/>
|
51
51
|
<Column ss:AutoFitWidth="0" ss:Width="85"/>
|
52
|
-
<Column ss:AutoFitWidth="0" ss:Width="85"/>
|
53
52
|
<Row ss:StyleID="s65">
|
54
53
|
<Cell><Data ss:Type="String">Number</Data></Cell>
|
55
54
|
<Cell><Data ss:Type="String">Type</Data></Cell>
|
56
55
|
<Cell><Data ss:Type="String">Reporter Name</Data></Cell>
|
57
56
|
<Cell><Data ss:Type="String">Summary</Data></Cell>
|
58
|
-
<Cell><Data ss:Type="String">Effort</Data></Cell>
|
59
57
|
<Cell><Data ss:Type="String">Opened</Data></Cell>
|
60
58
|
<Cell><Data ss:Type="String">Closed</Data></Cell>
|
61
59
|
</Row>
|
@@ -65,11 +63,6 @@
|
|
65
63
|
<Cell><Data ss:Type="String"><%= ticket.type %></Data></Cell>
|
66
64
|
<Cell><Data ss:Type="String"><%= ticket.reporter_name %></Data></Cell>
|
67
65
|
<Cell><Data ss:Type="String"><%= ticket.summary %></Data></Cell>
|
68
|
-
<% if ticket.effort.blank? %>
|
69
|
-
<Cell />
|
70
|
-
<% else %>
|
71
|
-
<Cell><Data ss:Type="Number"><%= ticket.effort %></Data></Cell>
|
72
|
-
<% end %>
|
73
66
|
<Cell ss:StyleID="s64"><Data ss:Type="DateTime"><%= xls_time ticket.opened_at %></Data></Cell>
|
74
67
|
<% if ticket.closed_at %>
|
75
68
|
<Cell ss:StyleID="s64"><Data ss:Type="DateTime"><%= xls_time ticket.closed_at %></Data></Cell>
|
@@ -1,23 +1,23 @@
|
|
1
|
-
<%= form_for @project, :html => { :class =>
|
1
|
+
<%= form_for @project, :html => { :class => "form-horizontal" } do |f| %>
|
2
2
|
<fieldset>
|
3
3
|
<div class="control-group">
|
4
|
-
<%= f.label :name, :class =>
|
4
|
+
<%= f.label :name, :class => "control-label" %>
|
5
5
|
<div class="controls">
|
6
|
-
<%= f.text_field :name, :class =>
|
6
|
+
<%= f.text_field :name, :class => "text_field" %>
|
7
7
|
</div>
|
8
8
|
</div>
|
9
9
|
|
10
10
|
<div class="control-group">
|
11
|
-
<%= f.label :slug, :class =>
|
11
|
+
<%= f.label :slug, :class => "control-label" %>
|
12
12
|
<div class="controls">
|
13
|
-
<%= f.text_field :slug, :class =>
|
13
|
+
<%= f.text_field :slug, :class => "text_field" %>
|
14
14
|
</div>
|
15
15
|
</div>
|
16
16
|
|
17
17
|
<div class="control-group">
|
18
|
-
<%= f.label :color, :class =>
|
18
|
+
<%= f.label :color, :class => "control-label" %>
|
19
19
|
<div class="controls">
|
20
|
-
<%= f.select :color, Houston.config.project_colors.keys.map { |name| [name.titleize, name] }, :class =>
|
20
|
+
<%= f.select :color, [["None", "default"]] + Houston.config.project_colors.keys.map { |name| [name.titleize, name] }, :class => "select_field" %>
|
21
21
|
<% if Project.count > 0 %>
|
22
22
|
(Unused colors: <%= (Houston.config.project_colors.keys - Project.pluck(:color).uniq).map(&:titleize).join(", ") %>)
|
23
23
|
<% end %>
|
@@ -42,7 +42,7 @@
|
|
42
42
|
<div class="project-adapter-fields" data-adapter="<%= name %>">
|
43
43
|
<% adapter.namespace.adapter(name).parameters.each do |parameter| %>
|
44
44
|
<% errors = @project.errors[parameter].flatten %>
|
45
|
-
<%= label_tag "project[extended_attributes][#{parameter}]", parameter.to_s.gsub(
|
45
|
+
<%= label_tag "project[extended_attributes][#{parameter}]", parameter.to_s.gsub("_", " ").gsub(/\b('?[a-z])/) { $1.capitalize } %>
|
46
46
|
<%= text_field_tag "project[extended_attributes][#{parameter}]", @project.extended_attributes[parameter.to_s], :class => "text_field #{"error" if errors.any?}" %>
|
47
47
|
<% if errors.any? %>
|
48
48
|
<span class="help-inline"> <%= errors.to_sentence %></span>
|
@@ -58,9 +58,9 @@
|
|
58
58
|
<hr />
|
59
59
|
|
60
60
|
<div class="control-group">
|
61
|
-
<%= f.label :code_climate_repo_token, "Code Climate Repo Token", :class =>
|
61
|
+
<%= f.label :code_climate_repo_token, "Code Climate Repo Token", :class => "control-label" %>
|
62
62
|
<div class="controls">
|
63
|
-
<%= f.text_field :code_climate_repo_token, :class =>
|
63
|
+
<%= f.text_field :code_climate_repo_token, :class => "text_field" %>
|
64
64
|
</div>
|
65
65
|
</div>
|
66
66
|
|
@@ -95,7 +95,7 @@
|
|
95
95
|
<hr />
|
96
96
|
|
97
97
|
<div class="control-group">
|
98
|
-
<%= f.label :roles, "Teammates", :class =>
|
98
|
+
<%= f.label :roles, "Teammates", :class => "control-label" %>
|
99
99
|
<div class="controls changes-nested-editor">
|
100
100
|
<%= f.nested_editor_for :roles do |f| -%>
|
101
101
|
<%= f.select :user_id, [nil] + User.all.map { |user| [user.name, user.id] } %>
|
@@ -105,16 +105,19 @@
|
|
105
105
|
</div>
|
106
106
|
|
107
107
|
<div class="control-group">
|
108
|
-
<%= f.label :min_passing_verdicts, "Min. Passing Verdicts", :class =>
|
108
|
+
<%= f.label :min_passing_verdicts, "Min. Passing Verdicts", :class => "control-label" %>
|
109
109
|
<div class="controls">
|
110
|
-
<%= f.text_field :min_passing_verdicts, :class =>
|
110
|
+
<%= f.text_field :min_passing_verdicts, :class => "text_field" %>
|
111
111
|
</div>
|
112
112
|
</div>
|
113
113
|
|
114
114
|
<div class="form-actions">
|
115
|
-
<%= f.submit nil, :class =>
|
116
|
-
<%= link_to
|
117
|
-
|
115
|
+
<%= f.submit nil, :class => "btn btn-primary" %>
|
116
|
+
<%= link_to "Cancel", projects_path, :class => "btn" %>
|
117
|
+
|
118
|
+
<% if @project.persisted? && can?(:destroy, @project) %>
|
119
|
+
<button class="btn btn-delete btn-danger" id="retire_project_button">Retire</button>
|
120
|
+
<% end %>
|
118
121
|
</div>
|
119
122
|
</fieldset>
|
120
123
|
<% end %>
|
@@ -125,7 +128,7 @@
|
|
125
128
|
NestedEditorFor.init();
|
126
129
|
|
127
130
|
function dasherize(string) {
|
128
|
-
return inflect.dasherize(inflect.underscore(string));
|
131
|
+
return inflect.dasherize(inflect.underscore(string)).replace(/\./g, '').replace(/\s+/g, '_');
|
129
132
|
}
|
130
133
|
|
131
134
|
var $name = $('#project_name'),
|
@@ -166,6 +169,15 @@
|
|
166
169
|
|
167
170
|
$('.project-feature').click(showProjectFeatureParameters);
|
168
171
|
showProjectFeatureParameters();
|
172
|
+
|
173
|
+
<% if @project.persisted? && can?(:destroy, @project) %>
|
174
|
+
$('#retire_project_button').click(function(e) {
|
175
|
+
e.preventDefault();
|
176
|
+
$.put('<%= retire_project_path(@project) %>')
|
177
|
+
.success(function() { window.location = '/projects'; })
|
178
|
+
.error(function() { console.log(arguments); });
|
179
|
+
});
|
180
|
+
<% end %>
|
169
181
|
});
|
170
182
|
</script>
|
171
183
|
<% end %>
|
@@ -2,7 +2,8 @@
|
|
2
2
|
<h1 class="project-banner space-below">
|
3
3
|
Projects
|
4
4
|
<%= link_to "New Project", new_project_path, :class => "btn btn-primary" if can?(:create, Project) %>
|
5
|
-
|
5
|
+
<%= link_to "Add Projects from GitHub", add_github_projects_path, :class => "btn btn-primary" if can?(:create, Project) %>
|
6
|
+
|
6
7
|
<%= render partial: "projects/keyboard_shortcuts" %>
|
7
8
|
</h1>
|
8
9
|
<% end %>
|
@@ -75,9 +76,8 @@
|
|
75
76
|
</td>
|
76
77
|
|
77
78
|
<% KeyDependency.all.each do |dependency| %>
|
78
|
-
<% version = ProjectDependency.new(project, dependency).version %>
|
79
79
|
<td class="project-dependency">
|
80
|
-
<%=
|
80
|
+
<%= project.extended_attributes["key_dependency.#{dependency.slug}"] %>
|
81
81
|
</td>
|
82
82
|
<% end %>
|
83
83
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<% content_for :title do %>
|
2
|
+
<h1 class="project-banner space-below">
|
3
|
+
Add Projects from GitHub
|
4
|
+
</h1>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<p>Select the repos to create projects for in Houston</p>
|
8
|
+
|
9
|
+
<%= form_tag do %>
|
10
|
+
<ul id="repos">
|
11
|
+
<% @repos.each do |repo| %>
|
12
|
+
<li class="repo <%= "disabled" if repo[:project] %> <%= "retired" if repo[:project] && repo[:project].retired? %>">
|
13
|
+
<% if repo[:project] %>
|
14
|
+
<input type="checkbox" checked disabled />
|
15
|
+
<% else %>
|
16
|
+
<input type="checkbox" name="repos[]" value="<%= repo[:full_name] %>" id="<%= repo[:full_name] %>" />
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<label for="<%= repo[:full_name] %>">
|
20
|
+
<span class="repo-visibility">
|
21
|
+
<% if repo[:private] %>
|
22
|
+
<i class="fa fa-lock"></i>
|
23
|
+
<% else %>
|
24
|
+
<i class="fa fa-unlock"></i>
|
25
|
+
<% end %>
|
26
|
+
</span>
|
27
|
+
<span class="repo-owner">
|
28
|
+
<%= repo[:owner] %>
|
29
|
+
</span>
|
30
|
+
<span class="repo-name">
|
31
|
+
<% if repo[:project] %>
|
32
|
+
<span class="label <%= repo[:project].color %>">
|
33
|
+
<%= repo[:name] %>
|
34
|
+
</span>
|
35
|
+
<% else %>
|
36
|
+
<b><%= repo[:name] %></b>
|
37
|
+
<% end %>
|
38
|
+
</span>
|
39
|
+
</label>
|
40
|
+
</li>
|
41
|
+
<% end %>
|
42
|
+
</ul>
|
43
|
+
|
44
|
+
<div class="form-actions">
|
45
|
+
<button type="submit" class="btn btn-primary">Add</button>
|
46
|
+
</div>
|
47
|
+
<% end %>
|
48
|
+
|
49
|
+
<% content_for :javascripts do %>
|
50
|
+
<script type="text/javascript">
|
51
|
+
$(function() {
|
52
|
+
$(':checkbox').click(function(e) {
|
53
|
+
var $checkbox = $(e.target);
|
54
|
+
$checkbox.closest('.repo').toggleClass('selected', $checkbox.prop('checked'));
|
55
|
+
});
|
56
|
+
|
57
|
+
$('[type="submit"]').click(function(e) {
|
58
|
+
e.preventDefault();
|
59
|
+
$(e.target)
|
60
|
+
.prop('disabled', true)
|
61
|
+
.html('<i class="fa fa-spinner fa-spin"></i> Adding Projects...')
|
62
|
+
.closest('form')
|
63
|
+
.submit();
|
64
|
+
});
|
65
|
+
});
|
66
|
+
</script>
|
67
|
+
<% end %>
|