diff --git a/frontend/src/components/WildcardSelect.vue b/frontend/src/components/WildcardSelect.vue index 6b2d89c50d..9faf56bf5c 100644 --- a/frontend/src/components/WildcardSelect.vue +++ b/frontend/src/components/WildcardSelect.vue @@ -18,6 +18,7 @@ limitations under the License.
+ @@ -108,41 +118,63 @@ export default { textFieldClass () { return this.wildcardSelectedValue.startsWithWildcard ? 'textFieldStartClass' : 'textFieldEndClass' }, + selectClass () { + if (this.wildcardSelectedValue.customWildcard) { + return 'selectSmallClass' + } + return undefined + }, wildcardSelectItemObjects () { return map(this.wildcardSelectItems, item => { let startsWithWildcard = false let endsWithWildcard = false + let customWildcard = false const value = trim(item, '*') let pattern = value - if (startsWith(item, '*')) { + if (item === '*') { + customWildcard = true + pattern = '.*' + } else if (startsWith(item, '*')) { startsWithWildcard = true - pattern = '.+' + pattern - } - if (endsWith(item, '*')) { + pattern = '.*' + pattern + } else if (endsWith(item, '*')) { endsWithWildcard = true - pattern = pattern + '.+' + pattern = pattern + '.*' } return { - text: value, value, startsWithWildcard, endsWithWildcard, - isWildcard: startsWithWildcard || endsWithWildcard, + customWildcard, + isWildcard: startsWithWildcard || endsWithWildcard || customWildcard, regex: new RegExp('^' + pattern + '$') } }) }, wildcardTextFieldLabel () { - return this.wildcardSelectedValue.startsWithWildcard ? 'Prefix' : 'Suffix' + if (this.wildcardSelectedValue.startsWithWildcard) { + return 'Prefix' + } + if (this.wildcardSelectedValue.endsWithWildcard) { + return 'Suffix' + } + if (this.wildcardSelectedValue.customWildcard) { + return `Custom ${this.wildcardSelectLabel}` + } + return undefined }, wildcardSelectHint () { if (!this.wildcardSelectedValue.isWildcard) { return undefined } - const label = this.wildcardSelectedValue.startsWithWildcard ? 'prefix' : 'suffix' - return `Selected wildcard value requires a ${label} which needs to be specified` + if (this.wildcardSelectedValue.customWildcard) { + return `Specify custom ${this.wildcardSelectLabel}` + } else { + const label = this.wildcardSelectedValue.startsWithWildcard ? 'prefix' : 'suffix' + return `Selected wildcard value requires a ${label} which needs to be specified` + } }, internalValue () { if (this.wildcardSelectedValue.startsWithWildcard) { @@ -151,6 +183,9 @@ export default { if (this.wildcardSelectedValue.endsWithWildcard) { return `${this.wildcardSelectedValue.value}${this.wildcardVariablePart}` } + if (this.wildcardSelectedValue.customWildcard) { + return this.wildcardVariablePart + } return this.wildcardSelectedValue.value } }, @@ -174,6 +209,21 @@ export default { matches.sort(function (a, b) { return b.value.length - a.value.length }) + matches.sort(function (a, b) { + if (a.isWildcard && !b.isWildcard) { + return 1 + } + if (b.isWildcard && !a.isWildcard) { + return -1 + } + if (a.customWildcard && !b.customWildcard) { + return 1 + } + if (b.customWildcard && !a.customWildcard) { + return -1 + } + return 0 + }) const bestMatch = head(matches) if (!bestMatch) { @@ -215,4 +265,7 @@ export default { order: 2; margin-left: 5px; } + .selectSmallClass { + max-width: 120px; + } diff --git a/frontend/tests/unit/WildcardSelect.spec.js b/frontend/tests/unit/WildcardSelect.spec.js index d948e34252..c1c07acffa 100644 --- a/frontend/tests/unit/WildcardSelect.spec.js +++ b/frontend/tests/unit/WildcardSelect.spec.js @@ -27,6 +27,7 @@ Vue.use(Vuelidate) const sampleWildcardItems = [ '*Foo', 'Foo', + '*', 'Bar*', 'BarBla' ] @@ -83,4 +84,31 @@ describe('WildcardSelect.vue', function () { expect(wildcardSelectedValue.isWildcard).to.be.false expect(wildcardVariablePart).to.equal('') }) + + it('should select wildcard if inital value is wildcard', function () { + const wildcardSelect = createWildcardSelecteComponent('Bar*') + const wildcardSelectedValue = wildcardSelect.wildcardSelectedValue + const wildcardVariablePart = wildcardSelect.wildcardVariablePart + expect(wildcardSelectedValue.value).to.equal('Bar') + expect(wildcardSelectedValue.endsWithWildcard).to.be.true + expect(wildcardVariablePart).to.equal('') + }) + + it('Should select initial custom wildcard value', function () { + const wildcardSelect = createWildcardSelecteComponent('*') + const wildcardSelectedValue = wildcardSelect.wildcardSelectedValue + const wildcardVariablePart = wildcardSelect.wildcardVariablePart + expect(wildcardSelectedValue.value).to.equal('') + expect(wildcardSelectedValue.customWildcard).to.be.true + expect(wildcardVariablePart).to.equal('') + }) + + it('Should select custom wildcard', function () { + const wildcardSelect = createWildcardSelecteComponent('RandomValue') + const wildcardSelectedValue = wildcardSelect.wildcardSelectedValue + const wildcardVariablePart = wildcardSelect.wildcardVariablePart + expect(wildcardSelectedValue.value).to.equal('') + expect(wildcardSelectedValue.customWildcard).to.be.true + expect(wildcardVariablePart).to.equal('RandomValue') + }) })