diff --git a/client/galaxy/scripts/components/RuleBuilder/ColumnSelector.vue b/client/galaxy/scripts/components/RuleBuilder/ColumnSelector.vue
new file mode 100644
index 00000000000..195d777edc3
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/ColumnSelector.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
{{ label }}
+
+
+ -
+ {{ colHeaders[targetEl] }}
+
+
+
+
+ -
+
+ ... {{ l("Assign Another Column") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/IdentifierDisplay.vue b/client/galaxy/scripts/components/RuleBuilder/IdentifierDisplay.vue
new file mode 100644
index 00000000000..54f1ce1ca4b
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/IdentifierDisplay.vue
@@ -0,0 +1,54 @@
+
+
+ Set {{ columnsLabel }} as {{ typeDisplay }}
+
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RegularExpressionInput.vue b/client/galaxy/scripts/components/RuleBuilder/RegularExpressionInput.vue
new file mode 100644
index 00000000000..36f65600040
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RegularExpressionInput.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleComponent.vue b/client/galaxy/scripts/components/RuleBuilder/RuleComponent.vue
new file mode 100644
index 00000000000..474e6cbc4a4
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleComponent.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleDisplay.vue b/client/galaxy/scripts/components/RuleBuilder/RuleDisplay.vue
new file mode 100644
index 00000000000..1d52daf8011
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleDisplay.vue
@@ -0,0 +1,54 @@
+
+
+
+ {{ title }}
+
+
+
+
+ {{ rule.warn }}
+
+
+ {{ rule.error }}
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleModalFooter.vue b/client/galaxy/scripts/components/RuleBuilder/RuleModalFooter.vue
new file mode 100644
index 00000000000..fc2a3bfe739
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleModalFooter.vue
@@ -0,0 +1,10 @@
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleModalHeader.vue b/client/galaxy/scripts/components/RuleBuilder/RuleModalHeader.vue
new file mode 100644
index 00000000000..9ea12aefa61
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleModalHeader.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleModalMiddle.vue b/client/galaxy/scripts/components/RuleBuilder/RuleModalMiddle.vue
new file mode 100644
index 00000000000..35fca19d00a
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleModalMiddle.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/RuleTargetComponent.vue b/client/galaxy/scripts/components/RuleBuilder/RuleTargetComponent.vue
new file mode 100644
index 00000000000..aeb4d07d1df
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/RuleTargetComponent.vue
@@ -0,0 +1,34 @@
+
+ {{ title }}
+
+
+
diff --git a/client/galaxy/scripts/components/RuleBuilder/StateDiv.vue b/client/galaxy/scripts/components/RuleBuilder/StateDiv.vue
new file mode 100644
index 00000000000..2f06d8daf7f
--- /dev/null
+++ b/client/galaxy/scripts/components/RuleBuilder/StateDiv.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/client/galaxy/scripts/components/RuleCollectionBuilder.vue b/client/galaxy/scripts/components/RuleCollectionBuilder.vue
index d27dd94ccad..185ae53f7eb 100644
--- a/client/galaxy/scripts/components/RuleCollectionBuilder.vue
+++ b/client/galaxy/scripts/components/RuleCollectionBuilder.vue
@@ -576,360 +576,22 @@ import RuleDefs from "mvc/rules/rule-definitions";
import Vue from "vue";
import BootstrapVue from "bootstrap-vue";
import Select2 from "components/Select2";
+import ColumnSelector from "components/RuleBuilder/ColumnSelector";
+import RegularExpressionInput from "components/RuleBuilder/RegularExpressionInput";
+import RuleDisplay from "components/RuleBuilder/RuleDisplay";
+import IdentifierDisplay from "components/RuleBuilder/IdentifierDisplay";
+import RuleTargetComponent from "components/RuleBuilder/RuleTargetComponent";
+import RuleComponent from "components/RuleBuilder/RuleComponent";
+import RuleModalHeader from "components/RuleBuilder/RuleModalHeader";
+import RuleModalMiddle from "components/RuleBuilder/RuleModalMiddle";
+import RuleModalFooter from "components/RuleBuilder/RuleModalFooter";
+import StateDiv from "components/RuleBuilder/StateDiv";
Vue.use(BootstrapVue);
const RULES = RuleDefs.RULES;
const MAPPING_TARGETS = RuleDefs.MAPPING_TARGETS;
-const ColumnSelector = {
- template: `
-
-
-
-
-
{{ label }}
-
-
- -
- {{ colHeaders[targetEl] }}
-
-
-
-
- -
-
- ... {{ l("Assign Another Column") }}
-
-
-
-
-
-
-
-
-
-
- `,
- data: function () {
- return {
- l: _l,
- };
- },
- props: {
- target: {
- required: true,
- },
- label: {
- required: false,
- type: String,
- default: _l("From Column"),
- },
- help: {
- required: false,
- },
- colHeaders: {
- type: Array,
- required: true,
- },
- multiple: {
- type: Boolean,
- required: false,
- default: false,
- },
- ordered: {
- type: Boolean,
- required: false,
- default: false,
- },
- valueAsList: {
- type: Boolean,
- required: false,
- default: false,
- },
- orderedEdit: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- computed: {
- remainingHeaders() {
- const colHeaders = this.colHeaders;
- if (!this.multiple) {
- return colHeaders;
- }
- const remaining = {};
- for (const key in colHeaders) {
- if (this.target.indexOf(parseInt(key)) === -1) {
- remaining[key] = colHeaders[key];
- }
- }
- return remaining;
- },
- title() {
- return _l("Select a column");
- },
- },
- methods: {
- handleInput(value) {
- if (this.multiple) {
- // https://stackoverflow.com/questions/262427/why-does-parseint-yield-nan-with-arraymap
- const val = value.map((idx) => parseInt(idx));
- this.$emit("update:target", val);
- } else {
- let val = parseInt(value);
- if (this.valueAsList) {
- val = [val];
- }
- this.$emit("update:target", val);
- }
- },
- handleAdd(value) {
- this.target.push(parseInt(value));
- this.$emit("update:orderedEdit", false);
- },
- handleRemove(index) {
- this.target.splice(index, 1);
- },
- moveUp(value) {
- const swapVal = this.target[value - 1];
- Vue.set(this.target, value - 1, this.target[value]);
- Vue.set(this.target, value, swapVal);
- },
- },
- components: {
- Select2,
- },
-};
-
-const RegularExpressionInput = {
- template: `
-
-
-
-
-
- `,
- props: {
- target: {
- required: true,
- },
- },
- computed: {
- label() {
- return _l("Regular Expression");
- },
- title() {
- return _l("Enter a regular expression.");
- },
- popoverTitle() {
- return _l("Regular Expressions");
- },
- popoverContent() {
- return _l(
- `Regular expressions are patterns used to match character combinations in strings. This input accepts Python-style regular expressions, find more information about these in this Python for Biologists tutorial.`
- );
- },
- },
-};
-
-const RuleDisplay = {
- template: `
-
-
- {{ title }}
-
-
-
-
- {{ rule.warn }}
-
-
- {{ rule.error }}
-
-
- `,
- props: {
- rule: {
- required: true,
- type: Object,
- },
- colHeaders: {
- type: Array,
- required: true,
- },
- },
- computed: {
- title() {
- const ruleType = this.rule.type;
- return RULES[ruleType].display(this.rule, this.colHeaders);
- },
- editTitle() {
- return _l("Edit this rule.");
- },
- removeTitle() {
- return _l("Remove this rule.");
- },
- },
- methods: {
- edit() {
- this.$emit("edit");
- },
- remove() {
- this.$emit("remove");
- },
- },
-};
-
-const IdentifierDisplay = {
- template: `
-
- Set {{ columnsLabel }} as {{ typeDisplay }}
-
-
-
- `,
- props: {
- type: {
- type: String,
- required: true,
- },
- columns: {
- required: true,
- },
- colHeaders: {
- type: Array,
- required: true,
- },
- },
- methods: {
- remove() {
- this.$emit("remove");
- },
- edit() {
- this.$emit("edit");
- },
- },
- computed: {
- typeDisplay() {
- return MAPPING_TARGETS[this.type].label;
- },
- help() {
- return MAPPING_TARGETS[this.type].help || "";
- },
- titleEdit() {
- return _l("Edit column definition");
- },
- titleRemove() {
- return _l("Remove this column definition");
- },
- columnsLabel() {
- return RuleDefs.columnDisplay(this.columns, this.colHeaders);
- },
- },
-};
-
-const RuleTargetComponent = {
- template: `{{title}}`,
- props: {
- ruleType: {
- type: String,
- required: true,
- },
- builder: {
- required: true,
- },
- },
- computed: {
- linkClassName() {
- return "rule-link-" + this.ruleType.replace(/_/g, "-");
- },
- title() {
- return RULES[this.ruleType].title;
- },
- },
-};
-
-const RuleComponent = {
- template: `
-
-
-
-
-
-
-
`,
- data: function () {
- return {
- applyLabel: _l("Apply"),
- cancelLabel: _l("Cancel"),
- };
- },
- props: {
- ruleType: {
- type: String,
- required: true,
- },
- displayRuleType: {
- required: true,
- },
- builder: {
- required: true,
- },
- },
- methods: {
- cancel() {
- this.builder.displayRuleType = null;
- },
- okay() {
- this.builder.handleRuleSave(this.ruleType);
- this.cancel();
- },
- },
- computed: {
- typeToClass() {
- return "rule-edit-" + this.ruleType.replace(/_/g, "-");
- },
- },
-};
-
-const StateDiv = {
- template: `
-
-
-
`,
-};
-
-const RuleModalHeader = {
- template: ``,
-};
-
-const RuleModalMiddle = {
- template: `
`,
-};
-
-const RuleModalFooter = {
- template: `
- `,
-};
-
export default {
data: function () {
let orientation = "vertical";