summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/issue_show/components/app.vue13
-rw-r--r--app/assets/javascripts/issue_show/components/fields/confidential_checkbox.vue23
-rw-r--r--app/assets/javascripts/issue_show/components/form.vue4
-rw-r--r--app/assets/javascripts/issue_show/index.js3
-rw-r--r--app/assets/javascripts/issue_show/stores/index.js1
-rw-r--r--app/views/projects/issues/show.html.haml1
-rw-r--r--spec/javascripts/issue_show/components/app_spec.js1
7 files changed, 45 insertions, 1 deletions
diff --git a/app/assets/javascripts/issue_show/components/app.vue b/app/assets/javascripts/issue_show/components/app.vue
index b4034849c71..a4d517ddded 100644
--- a/app/assets/javascripts/issue_show/components/app.vue
+++ b/app/assets/javascripts/issue_show/components/app.vue
@@ -41,6 +41,10 @@ export default {
required: false,
default: '',
},
+ isConfidential: {
+ type: Boolean,
+ required: true,
+ },
},
data() {
const store = new Store({
@@ -70,6 +74,7 @@ export default {
this.showForm = true;
this.store.formState = {
title: this.state.titleText,
+ confidential: this.isConfidential,
};
},
closeForm() {
@@ -77,7 +82,13 @@ export default {
},
updateIssuable() {
this.service.updateIssuable(this.store.formState)
- .then(() => {
+ .then((res) => {
+ const data = res.json();
+
+ if (data.confidential !== this.isConfidential) {
+ location.reload();
+ }
+
eventHub.$emit('close.form');
})
.catch(() => {
diff --git a/app/assets/javascripts/issue_show/components/fields/confidential_checkbox.vue b/app/assets/javascripts/issue_show/components/fields/confidential_checkbox.vue
new file mode 100644
index 00000000000..ce0471d499a
--- /dev/null
+++ b/app/assets/javascripts/issue_show/components/fields/confidential_checkbox.vue
@@ -0,0 +1,23 @@
+<script>
+ export default {
+ props: {
+ formState: {
+ type: Object,
+ required: true,
+ },
+ },
+ };
+</script>
+
+<template>
+ <fieldset class="checkbox">
+ <label for="issue_confidential">
+ <input
+ type="checkbox"
+ value="1"
+ id="issue_confidential"
+ v-model="formState.confidential" />
+ This issue is confidential and should only be visible to team members with at least Reporter access.
+ </label>
+ </fieldset>
+</template>
diff --git a/app/assets/javascripts/issue_show/components/form.vue b/app/assets/javascripts/issue_show/components/form.vue
index 7dd8ffb5af2..862558562e5 100644
--- a/app/assets/javascripts/issue_show/components/form.vue
+++ b/app/assets/javascripts/issue_show/components/form.vue
@@ -1,6 +1,7 @@
<script>
import titleField from './fields/title.vue';
import editActions from './edit_actions.vue';
+ import confidentialCheckbox from './fields/confidential_checkbox.vue';
export default {
props: {
@@ -16,6 +17,7 @@
components: {
titleField,
editActions,
+ confidentialCheckbox,
},
};
</script>
@@ -24,6 +26,8 @@
<form>
<title-field
:form-state="formState" />
+ <confidential-checkbox
+ :form-state="formState" />
<edit-actions
:can-destroy="canDestroy" />
</form>
diff --git a/app/assets/javascripts/issue_show/index.js b/app/assets/javascripts/issue_show/index.js
index a2ad1a0e034..b1e8f467979 100644
--- a/app/assets/javascripts/issue_show/index.js
+++ b/app/assets/javascripts/issue_show/index.js
@@ -25,6 +25,7 @@ document.addEventListener('DOMContentLoaded', () => {
canDestroy,
endpoint,
issuableRef,
+ isConfidential,
} = issuableElement.dataset;
return {
@@ -35,6 +36,7 @@ document.addEventListener('DOMContentLoaded', () => {
initialTitle: issuableTitleElement.innerHTML,
initialDescriptionHtml: issuableDescriptionElement ? issuableDescriptionElement.innerHTML : '',
initialDescriptionText: issuableDescriptionTextarea ? issuableDescriptionTextarea.textContent : '',
+ isConfidential: gl.utils.convertPermissionToBoolean(isConfidential),
};
},
render(createElement) {
@@ -47,6 +49,7 @@ document.addEventListener('DOMContentLoaded', () => {
initialTitle: this.initialTitle,
initialDescriptionHtml: this.initialDescriptionHtml,
initialDescriptionText: this.initialDescriptionText,
+ isConfidential: this.isConfidential,
},
});
},
diff --git a/app/assets/javascripts/issue_show/stores/index.js b/app/assets/javascripts/issue_show/stores/index.js
index 0ab52c307a0..5af63369211 100644
--- a/app/assets/javascripts/issue_show/stores/index.js
+++ b/app/assets/javascripts/issue_show/stores/index.js
@@ -14,6 +14,7 @@ export default class Store {
};
this.formState = {
title: '',
+ confidential: false,
};
}
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index d0783009a58..c21cea259a1 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -55,6 +55,7 @@
"can-update" => can?(current_user, :update_issue, @issue).to_s,
"can-destroy" => can?(current_user, :destroy_issue, @issue).to_s,
"issuable-ref" => @issue.to_reference,
+ "is-confidential" => @issue.confidential.to_s,
} }
%h2.title= markdown_field(@issue, :title)
- if @issue.description.present?
diff --git a/spec/javascripts/issue_show/components/app_spec.js b/spec/javascripts/issue_show/components/app_spec.js
index 7dea9c04b7b..ce90ac0b4ac 100644
--- a/spec/javascripts/issue_show/components/app_spec.js
+++ b/spec/javascripts/issue_show/components/app_spec.js
@@ -35,6 +35,7 @@ describe('Issuable output', () => {
initialDescriptionHtml: '',
initialDescriptionText: '',
showForm: false,
+ isConfidential: false,
},
}).$mount();
});