From 21236b14c60f99d3cdbb93d9eeb695a6128febd6 Mon Sep 17 00:00:00 2001 From: Samantha Ming Date: Mon, 3 Feb 2020 23:00:08 -0800 Subject: [PATCH] Display target branch in rules of project settings - Display branches select component in rule form - Populate dropdown from API - Add search to dropdown & load initial selected branch - Support invalid branches on form submit in dropdown - Apply text change - Update & add specs --- app/assets/javascripts/api.js | 17 ++ app/assets/stylesheets/framework/selects.scss | 3 +- .../javascripts/approvals/components/app.vue | 8 +- .../approvals/components/branches_select.vue | 115 +++++++++++++ .../components/modal_rule_create.vue | 6 +- .../components/mr_edit/empty_rule.vue | 12 ++ .../components/project_settings/app.vue | 2 +- .../project_settings/project_rules.vue | 13 +- .../approvals/components/rule_branches.vue | 26 +++ .../approvals/components/rule_form.vue | 51 +++++- .../approvals/components/rules.vue | 20 ++- .../assets/javascripts/approvals/mappers.js | 3 + .../460-fe-protected-branches-api-search.yml | 5 + .../components/rule_branches_spec.js | 51 ++++++ .../components/branches_select_spec.js | 151 ++++++++++++++++++ .../approvals/components/rule_form_spec.js | 100 ++++++++++++ locale/gitlab.pot | 12 ++ 17 files changed, 586 insertions(+), 9 deletions(-) create mode 100644 ee/app/assets/javascripts/approvals/components/branches_select.vue create mode 100644 ee/app/assets/javascripts/approvals/components/rule_branches.vue create mode 100644 ee/changelogs/unreleased/460-fe-protected-branches-api-search.yml create mode 100644 ee/spec/frontend/approvals/components/rule_branches_spec.js create mode 100644 ee/spec/javascripts/approvals/components/branches_select_spec.js diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 76f3020c5c2cf9..4dc4ce543e979c 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -24,6 +24,7 @@ const Api = { projectMergeRequestChangesPath: '/api/:version/projects/:id/merge_requests/:mrid/changes', projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions', projectRunnersPath: '/api/:version/projects/:id/runners', + projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches', mergeRequestsPath: '/api/:version/merge_requests', groupLabelsPath: '/groups/:namespace_path/-/labels', issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key', @@ -220,6 +221,22 @@ const Api = { return axios.get(url, config); }, + projectProtectedBranches(id, query = '') { + const url = Api.buildUrl(Api.projectProtectedBranchesPath).replace( + ':id', + encodeURIComponent(id), + ); + + return axios + .get(url, { + params: { + search: query, + per_page: DEFAULT_PER_PAGE, + }, + }) + .then(({ data }) => data); + }, + mergeRequests(params = {}) { const url = Api.buildUrl(Api.mergeRequestsPath); diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss index bd0134a82d3aa1..a8244219b10c7b 100644 --- a/app/assets/stylesheets/framework/selects.scss +++ b/app/assets/stylesheets/framework/selects.scss @@ -63,7 +63,8 @@ display: block; } - .select2-choices { + .select2-choices, + .select2-choice { border-color: $red-500; } } diff --git a/ee/app/assets/javascripts/approvals/components/app.vue b/ee/app/assets/javascripts/approvals/components/app.vue index fe26600f9cbc0f..248872ebf28792 100644 --- a/ee/app/assets/javascripts/approvals/components/app.vue +++ b/ee/app/assets/javascripts/approvals/components/app.vue @@ -11,6 +11,12 @@ export default { GlButton, GlLoadingIcon, }, + props: { + isMrEdit: { + type: Boolean, + default: true, + }, + }, computed: { ...mapState({ settings: 'settings', @@ -53,7 +59,7 @@ export default { - + diff --git a/ee/app/assets/javascripts/approvals/components/branches_select.vue b/ee/app/assets/javascripts/approvals/components/branches_select.vue new file mode 100644 index 00000000000000..1d4f43e76c2982 --- /dev/null +++ b/ee/app/assets/javascripts/approvals/components/branches_select.vue @@ -0,0 +1,115 @@ + + + diff --git a/ee/app/assets/javascripts/approvals/components/modal_rule_create.vue b/ee/app/assets/javascripts/approvals/components/modal_rule_create.vue index 2ae0b0f872ad94..a43029d5d5796a 100644 --- a/ee/app/assets/javascripts/approvals/components/modal_rule_create.vue +++ b/ee/app/assets/javascripts/approvals/components/modal_rule_create.vue @@ -14,6 +14,10 @@ export default { type: String, required: true, }, + isMrEdit: { + type: Boolean, + default: true, + }, }, computed: { ...mapState('createModal', { @@ -41,6 +45,6 @@ export default { :cancel-title="__('Cancel')" @ok.prevent="submit" > - + diff --git a/ee/app/assets/javascripts/approvals/components/mr_edit/empty_rule.vue b/ee/app/assets/javascripts/approvals/components/mr_edit/empty_rule.vue index 080a9ec66805e1..998a20468fae2f 100644 --- a/ee/app/assets/javascripts/approvals/components/mr_edit/empty_rule.vue +++ b/ee/app/assets/javascripts/approvals/components/mr_edit/empty_rule.vue @@ -1,15 +1,19 @@ diff --git a/ee/app/assets/javascripts/approvals/components/project_settings/project_rules.vue b/ee/app/assets/javascripts/approvals/components/project_settings/project_rules.vue index 87b4946091447f..7da90f9603e2d0 100644 --- a/ee/app/assets/javascripts/approvals/components/project_settings/project_rules.vue +++ b/ee/app/assets/javascripts/approvals/components/project_settings/project_rules.vue @@ -7,6 +7,7 @@ import Rules from '../rules.vue'; import RuleControls from '../rule_controls.vue'; import EmptyRule from '../mr_edit/empty_rule.vue'; import RuleInput from '../mr_edit/rule_input.vue'; +import RuleBranches from '../rule_branches.vue'; export default { components: { @@ -15,6 +16,7 @@ export default { UserAvatarList, EmptyRule, RuleInput, + RuleBranches, }, computed: { ...mapState(['settings']), @@ -91,17 +93,21 @@ export default {