summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/environments/components/environment.js.es612
-rw-r--r--app/assets/javascripts/environments/components/environment_item.js.es62
-rw-r--r--app/assets/javascripts/environments/components/environments_table.js.es64
-rw-r--r--app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es62
-rw-r--r--app/assets/javascripts/vue_shared/components/pipelines_table.js.es62
-rw-r--r--app/assets/stylesheets/framework/header.scss33
-rw-r--r--app/assets/stylesheets/pages/environments.scss187
-rw-r--r--app/assets/stylesheets/pages/pipelines.scss1
-rw-r--r--app/views/layouts/header/_default.html.haml4
-rw-r--r--app/views/projects/tags/index.html.haml2
-rw-r--r--changelogs/unreleased/27934-left-align-logo.yml4
-rw-r--r--changelogs/unreleased/6073_project_api.yml4
-rw-r--r--changelogs/unreleased/issue-tags-layout.yml4
-rw-r--r--doc/api/projects.md4
-rw-r--r--doc/development/frontend.md5
-rw-r--r--lib/api/projects.rb3
-rw-r--r--lib/api/v3/projects.rb3
-rw-r--r--spec/requests/api/projects_spec.rb33
-rw-r--r--spec/requests/api/v3/projects_spec.rb33
19 files changed, 194 insertions, 148 deletions
diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6
index 4b700a39d44..5869323d1e2 100644
--- a/app/assets/javascripts/environments/components/environment.js.es6
+++ b/app/assets/javascripts/environments/components/environment.js.es6
@@ -145,7 +145,7 @@ module.exports = Vue.component('environment-component', {
</div>
</div>
- <div class="environments-container">
+ <div class="content-list environments-container">
<div class="environments-list-loading text-center" v-if="isLoading">
<i class="fa fa-spinner fa-spin"></i>
</div>
@@ -181,12 +181,12 @@ module.exports = Vue.component('environment-component', {
:terminal-icon-svg="terminalIconSvg"
:commit-icon-svg="commitIconSvg">
</environment-table>
-
- <table-pagination v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
- :change="changePage"
- :pageInfo="state.paginationInformation">
- </table-pagination>
</div>
+
+ <table-pagination v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
+ :change="changePage"
+ :pageInfo="state.paginationInformation">
+ </table-pagination>
</div>
</div>
`,
diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6
index 5d780bddb0e..3f782742c56 100644
--- a/app/assets/javascripts/environments/components/environment_item.js.es6
+++ b/app/assets/javascripts/environments/components/environment_item.js.es6
@@ -503,7 +503,7 @@ module.exports = Vue.component('environment-item', {
</span>
</td>
- <td class="hidden-xs environments-actions">
+ <td class="environments-actions">
<div v-if="!model.isFolder" class="btn-group pull-right" role="group">
<actions-component v-if="hasManualActions && canCreateDeployment"
:play-icon-svg="playIconSvg"
diff --git a/app/assets/javascripts/environments/components/environments_table.js.es6 b/app/assets/javascripts/environments/components/environments_table.js.es6
index fd35d77fd3d..33ebca19f5d 100644
--- a/app/assets/javascripts/environments/components/environments_table.js.es6
+++ b/app/assets/javascripts/environments/components/environments_table.js.es6
@@ -46,7 +46,7 @@ module.exports = Vue.component('environment-table-component', {
},
template: `
- <table class="table ci-table environments">
+ <table class="table ci-table">
<thead>
<tr>
<th class="environments-name">Environment</th>
@@ -54,7 +54,7 @@ module.exports = Vue.component('environment-table-component', {
<th class="environments-build">Job</th>
<th class="environments-commit">Commit</th>
<th class="environments-date">Updated</th>
- <th class="hidden-xs environments-actions"></th>
+ <th class="environments-actions"></th>
</tr>
</thead>
<tbody>
diff --git a/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6 b/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
index e20085d1fd2..b50afe7c594 100644
--- a/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
+++ b/app/assets/javascripts/vue_pipelines_index/pipeline_actions.js.es6
@@ -32,7 +32,7 @@
},
},
template: `
- <td class="pipeline-actions hidden-xs">
+ <td class="pipeline-actions">
<div class="pull-right">
<div class="btn-group">
<div class="btn-group" v-if="actions">
diff --git a/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6 b/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
index 4bdaef31ee9..34d3bbdd80d 100644
--- a/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
+++ b/app/assets/javascripts/vue_shared/components/pipelines_table.js.es6
@@ -44,7 +44,7 @@ require('./pipelines_table_row');
<th class="js-pipeline-commit pipeline-commit">Commit</th>
<th class="js-pipeline-stages pipeline-stages">Stages</th>
<th class="js-pipeline-date pipeline-date"></th>
- <th class="js-pipeline-actions pipeline-actions hidden-xs"></th>
+ <th class="js-pipeline-actions pipeline-actions"></th>
</tr>
</thead>
<tbody>
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 3945a789c82..685a4847731 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -148,16 +148,11 @@ header {
}
.header-logo {
- position: absolute;
- left: 50%;
+ display: inline-block;
+ margin: 0 8px 0 3px;
+ position: relative;
top: 7px;
transition-duration: .3s;
- z-index: 999;
-
- #logo {
- position: relative;
- left: -50%;
- }
svg,
img {
@@ -167,15 +162,6 @@ header {
&:hover {
cursor: pointer;
}
-
- @media (max-width: $screen-xs-max) {
- right: 20px;
- left: auto;
-
- #logo {
- left: auto;
- }
- }
}
.title {
@@ -183,7 +169,6 @@ header {
padding-right: 20px;
margin: 0;
font-size: 18px;
- max-width: 385px;
display: inline-block;
line-height: $header-height;
font-weight: normal;
@@ -193,14 +178,18 @@ header {
vertical-align: top;
white-space: nowrap;
- @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
- max-width: 300px;
- }
-
@media (max-width: $screen-xs-max) {
max-width: 190px;
}
+ @media (min-width: $screen-sm-min) and (max-width: $screen-md-max) {
+ max-width: 428px;
+ }
+
+ @media (min-width: $screen-lg-min) {
+ max-width: 685px;
+ }
+
a {
color: $gl-text-color;
diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss
index f789ae1ccd3..77e09e66340 100644
--- a/app/assets/stylesheets/pages/environments.scss
+++ b/app/assets/stylesheets/pages/environments.scss
@@ -15,112 +15,97 @@
padding-top: 20px;
}
-@media (max-width: $screen-xs-max) {
- .environments-container {
+.environments-container {
+ .table-holder {
width: 100%;
overflow: auto;
}
-}
-
-.environments {
- table-layout: fixed;
-
- .environments-commit,
- .environments-actions,
- .environments-deploy,
- .environments-build,
- .environments-date {
- position: static;
- float: none;
- display: table-cell;
- }
-
- .environments-commit,
- .environments-actions {
- width: 20%;
- }
-
- .environments-date {
- width: 10%;
- }
- .environments-name,
- .environments-deploy,
- .environments-build {
- width: 15%;
- }
-
- .environment-name,
- .environments-build-cell,
- .deployment-column {
- word-break: break-all;
- }
-
- .deployment-column {
- .avatar {
- float: none;
+ .table.ci-table {
+ .environments-actions {
+ min-width: 200px;
}
- }
- .btn-group {
+ .environments-commit,
+ .environments-actions {
+ width: 20%;
+ }
- > a {
- color: $gl-text-color-secondary;
+ .environments-date {
+ width: 10%;
}
- svg path {
- fill: $gl-text-color-secondary;
+ .environments-name,
+ .environments-deploy,
+ .environments-build {
+ width: 15%;
}
- .dropdown {
- outline: none;
+ .deployment-column {
+ > span {
+ word-break: break-all;
+ }
+
+ .avatar {
+ float: none;
+ }
}
- }
+ .btn-group {
- .commit-title {
- margin: 0;
- }
+ > a {
+ color: $gl-text-color-secondary;
+ }
- .avatar-image-container {
- text-decoration: none;
- }
+ svg path {
+ fill: $gl-text-color-secondary;
+ }
- .icon-play {
- height: 13px;
- width: 12px;
- }
+ .dropdown {
+ outline: none;
+ }
+ }
- .external-url,
- .dropdown-new {
- color: $gl-text-color-secondary;
- }
+ .commit-title {
+ margin: 0;
+ }
- .dropdown-menu {
+ .avatar-image-container {
+ text-decoration: none;
+ }
- .fa {
- margin-right: 6px;
- color: $gl-text-color-secondary;
+ .icon-play {
+ height: 13px;
+ width: 12px;
}
- }
- .build-link,
- .branch-name {
- color: $gl-text-color;
- }
+ .external-url,
+ .dropdown-new {
+ color: $gl-text-color-secondary;
+ }
- .stop-env-link,
- .external-url {
- color: $gl-text-color-secondary;
+ .dropdown-menu {
+ .fa {
+ margin-right: 6px;
+ color: $gl-text-color-secondary;
+ }
+ }
- .stop-env-icon {
- font-size: 14px;
+ .build-link,
+ .branch-name {
+ color: $gl-text-color;
}
- }
- .deployment {
- .build-column {
+ .stop-env-link,
+ .external-url {
+ color: $gl-text-color-secondary;
+
+ .stop-env-icon {
+ font-size: 14px;
+ }
+ }
+ .deployment .build-column {
.build-link {
color: $gl-text-color;
}
@@ -129,34 +114,32 @@
float: none;
}
}
- }
-
- .folder-icon {
- margin-right: 3px;
- color: $gl-text-color-secondary;
- display: inline-block;
- .fa:nth-child(1) {
+ .folder-icon {
margin-right: 3px;
+ color: $gl-text-color-secondary;
+ display: inline-block;
+
+ .fa:nth-child(1) {
+ margin-right: 3px;
+ }
}
- }
- .folder-name {
- cursor: pointer;
- color: $gl-text-color-secondary;
- display: inline-block;
- }
-}
+ .folder-name {
+ cursor: pointer;
+ color: $gl-text-color-secondary;
+ display: inline-block;
+ }
-.table.ci-table.environments {
- .icon-container {
- width: 20px;
- text-align: center;
- }
+ .icon-container {
+ width: 20px;
+ text-align: center;
+ }
- .branch-commit {
- .commit-id {
- margin-right: 0;
+ .branch-commit {
+ .commit-id {
+ margin-right: 0;
+ }
}
}
}
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index f4707f71208..69eea1b2217 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -105,6 +105,7 @@
@media (max-width: $screen-md-max) {
.content-list {
&.pipelines,
+ &.environments-container,
&.builds-content-list {
width: 100%;
overflow: auto;
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 66f5204a5c8..c28661c2351 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -65,12 +65,12 @@
%div
= link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success'
- %h1.title= title
-
.header-logo
= link_to root_path, class: 'home', title: 'Dashboard', id: 'logo' do
= brand_header_logo
+ %h1.title= title
+
= yield :header_content
= render 'shared/outdated_browser'
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index e2f132f7742..7f9a44e565f 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -3,7 +3,7 @@
= render "projects/commits/head"
.flex-list{ class: container_class }
- .top-area.flex-row
+ .top-area.adjust
.nav-text.row-main-content
Tags give the ability to mark specific points in history as being important
diff --git a/changelogs/unreleased/27934-left-align-logo.yml b/changelogs/unreleased/27934-left-align-logo.yml
new file mode 100644
index 00000000000..d4e5e169465
--- /dev/null
+++ b/changelogs/unreleased/27934-left-align-logo.yml
@@ -0,0 +1,4 @@
+---
+title: Left align logo
+merge_request:
+author:
diff --git a/changelogs/unreleased/6073_project_api.yml b/changelogs/unreleased/6073_project_api.yml
new file mode 100644
index 00000000000..fd6792a406e
--- /dev/null
+++ b/changelogs/unreleased/6073_project_api.yml
@@ -0,0 +1,4 @@
+---
+title: 'API project create: Make name or path required'
+merge_request: 9416
+author:
diff --git a/changelogs/unreleased/issue-tags-layout.yml b/changelogs/unreleased/issue-tags-layout.yml
new file mode 100644
index 00000000000..abf4a609932
--- /dev/null
+++ b/changelogs/unreleased/issue-tags-layout.yml
@@ -0,0 +1,4 @@
+---
+title: Fix 'New Tag' layout on Tags page
+merge_request:
+author: Robert Marcano
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 1a8c0ae758f..5de23908b42 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -435,8 +435,8 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `name` | string | yes | The name of the new project |
-| `path` | string | no | Custom repository name for new project. By default generated based on name |
+| `name` | string | yes if path is not provided | The name of the new project. Equals path if not provided. |
+| `path` | string | yes if name is not provided | Repository name for new project. Generated based on name if not provided (generated lowercased with dashes). |
| `namespace_id` | integer | no | Namespace for the new project (defaults to the current user's namespace) |
| `description` | string | no | Short project description |
| `issues_enabled` | boolean | no | Enable issues for this project |
diff --git a/doc/development/frontend.md b/doc/development/frontend.md
index ba47998de49..9ba820eaee5 100644
--- a/doc/development/frontend.md
+++ b/doc/development/frontend.md
@@ -238,6 +238,9 @@ readability.
See the relevant style guides for our guidelines and for information on linting:
- [SCSS][scss-style-guide]
+- JavaScript - We defer to [AirBnb][airbnb-js-style-guide] on most style-related
+conventions and enforce them with eslint. See [our current .eslintrc][eslistrc]
+for specific rules and patterns.
## Testing
@@ -434,3 +437,5 @@ Scenario: Developer can approve merge request
[state-management]: https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch
[vue-resource-repo]: https://github.com/pagekit/vue-resource
[issue-boards-service]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/app/assets/javascripts/boards/services/board_service.js.es6
+[airbnb-js-style-guide]: https://github.com/airbnb/javascript
+[eslintrc]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/.eslintrc
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 310a896e958..b8a8cee0cea 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -94,8 +94,9 @@ module API
success Entities::Project
end
params do
- requires :name, type: String, desc: 'The name of the project'
+ optional :name, type: String, desc: 'The name of the project'
optional :path, type: String, desc: 'The path of the repository'
+ at_least_one_of :name, :path
use :optional_params
use :create_params
end
diff --git a/lib/api/v3/projects.rb b/lib/api/v3/projects.rb
index f3cd0b22e9b..881d52e4aa4 100644
--- a/lib/api/v3/projects.rb
+++ b/lib/api/v3/projects.rb
@@ -172,8 +172,9 @@ module API
success ::API::Entities::Project
end
params do
- requires :name, type: String, desc: 'The name of the project'
+ optional :name, type: String, desc: 'The name of the project'
optional :path, type: String, desc: 'The path of the repository'
+ at_least_one_of :name, :path
use :optional_params
use :create_params
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index d2acce90a24..3a00d974633 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -269,10 +269,37 @@ describe API::Projects, api: true do
end
end
- it 'creates new project without path and return 201' do
- expect { post api('/projects', user), name: 'foo' }.
+ it 'creates new project without path but with name and returns 201' do
+ expect { post api('/projects', user), name: 'Foo Project' }.
+ to change { Project.count }.by(1)
+ expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('Foo Project')
+ expect(project.path).to eq('foo-project')
+ end
+
+ it 'creates new project without name but with path and returns 201' do
+ expect { post api('/projects', user), path: 'foo_project' }.
to change { Project.count }.by(1)
expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('foo_project')
+ expect(project.path).to eq('foo_project')
+ end
+
+ it 'creates new project name and path and returns 201' do
+ expect { post api('/projects', user), path: 'foo-Project', name: 'Foo Project' }.
+ to change { Project.count }.by(1)
+ expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('Foo Project')
+ expect(project.path).to eq('foo-Project')
end
it 'creates last project before reaching project limit' do
@@ -281,7 +308,7 @@ describe API::Projects, api: true do
expect(response).to have_http_status(201)
end
- it 'does not create new project without name and return 400' do
+ it 'does not create new project without name or path and returns 400' do
expect { post api('/projects', user) }.not_to change { Project.count }
expect(response).to have_http_status(400)
end
diff --git a/spec/requests/api/v3/projects_spec.rb b/spec/requests/api/v3/projects_spec.rb
index 662be3f3531..34940b2f1c7 100644
--- a/spec/requests/api/v3/projects_spec.rb
+++ b/spec/requests/api/v3/projects_spec.rb
@@ -309,10 +309,37 @@ describe API::V3::Projects, api: true do
end
end
- it 'creates new project without path and return 201' do
- expect { post v3_api('/projects', user), name: 'foo' }.
+ it 'creates new project without path but with name and returns 201' do
+ expect { post v3_api('/projects', user), name: 'Foo Project' }.
to change { Project.count }.by(1)
expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('Foo Project')
+ expect(project.path).to eq('foo-project')
+ end
+
+ it 'creates new project without name but with path and returns 201' do
+ expect { post v3_api('/projects', user), path: 'foo_project' }.
+ to change { Project.count }.by(1)
+ expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('foo_project')
+ expect(project.path).to eq('foo_project')
+ end
+
+ it 'creates new project name and path and returns 201' do
+ expect { post v3_api('/projects', user), path: 'foo-Project', name: 'Foo Project' }.
+ to change { Project.count }.by(1)
+ expect(response).to have_http_status(201)
+
+ project = Project.first
+
+ expect(project.name).to eq('Foo Project')
+ expect(project.path).to eq('foo-Project')
end
it 'creates last project before reaching project limit' do
@@ -321,7 +348,7 @@ describe API::V3::Projects, api: true do
expect(response).to have_http_status(201)
end
- it 'does not create new project without name and return 400' do
+ it 'does not create new project without name or path and return 400' do
expect { post v3_api('/projects', user) }.not_to change { Project.count }
expect(response).to have_http_status(400)
end