summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/related_issues/stores/related_issues_store.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/related_issues/stores/related_issues_store.js')
-rw-r--r--app/assets/javascripts/related_issues/stores/related_issues_store.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/app/assets/javascripts/related_issues/stores/related_issues_store.js b/app/assets/javascripts/related_issues/stores/related_issues_store.js
new file mode 100644
index 00000000000..14d71628cad
--- /dev/null
+++ b/app/assets/javascripts/related_issues/stores/related_issues_store.js
@@ -0,0 +1,50 @@
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+
+class RelatedIssuesStore {
+ constructor() {
+ this.state = {
+ // Stores issue objects of the known related issues
+ relatedIssues: [],
+ // Stores references of the "staging area" related issues that are planned to be added
+ pendingReferences: [],
+ };
+ }
+
+ setRelatedIssues(issues = []) {
+ this.state.relatedIssues = convertObjectPropsToCamelCase(issues, { deep: true });
+ }
+
+ addRelatedIssues(issues = []) {
+ this.setRelatedIssues(this.state.relatedIssues.concat(issues));
+ }
+
+ removeRelatedIssue(issue) {
+ this.state.relatedIssues = this.state.relatedIssues.filter(x => x.id !== issue.id);
+ }
+
+ updateIssueOrder(oldIndex, newIndex) {
+ if (this.state.relatedIssues.length > 0) {
+ const updatedIssue = this.state.relatedIssues.splice(oldIndex, 1)[0];
+ this.state.relatedIssues.splice(newIndex, 0, updatedIssue);
+ }
+ }
+
+ setPendingReferences(issues) {
+ // Remove duplicates but retain order.
+ // If you don't do this, Vue will be confused by duplicates and refuse to delete them all.
+ this.state.pendingReferences = issues.filter((ref, idx) => issues.indexOf(ref) === idx);
+ }
+
+ addPendingReferences(references = []) {
+ const issues = this.state.pendingReferences.concat(references);
+ this.setPendingReferences(issues);
+ }
+
+ removePendingRelatedIssue(indexToRemove) {
+ this.state.pendingReferences = this.state.pendingReferences.filter(
+ (reference, index) => index !== indexToRemove,
+ );
+ }
+}
+
+export default RelatedIssuesStore;