[FIX] better control on value mutation
This commit is contained in:
parent
383191cafc
commit
ae1e4de286
|
@ -48,6 +48,8 @@ export default Ember.Component.extend(UtilsMixin, DomHelpersMixin, KeyboardMixin
|
||||||
fullWidthOnMobile: false,
|
fullWidthOnMobile: false,
|
||||||
castInteger: false,
|
castInteger: false,
|
||||||
allowAny: false,
|
allowAny: false,
|
||||||
|
allowValueMutation: true,
|
||||||
|
autoSelectFirst: true,
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
this._super();
|
this._super();
|
||||||
|
@ -56,13 +58,6 @@ export default Ember.Component.extend(UtilsMixin, DomHelpersMixin, KeyboardMixin
|
||||||
this.setProperties({ filterable: false, autoFilterable: false });
|
this.setProperties({ filterable: false, autoFilterable: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNone(this.get("none")) && isEmpty(this.get("value")) && !isEmpty(this.get("content"))) {
|
|
||||||
Ember.run.scheduleOnce("sync", () => {
|
|
||||||
const firstValue = this.get(`content.0.${this.get("valueAttribute")}`);
|
|
||||||
this.set("value", firstValue);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this._previousScrollParentOverflow = "auto";
|
this._previousScrollParentOverflow = "auto";
|
||||||
this._previousCSSContext = {};
|
this._previousCSSContext = {};
|
||||||
},
|
},
|
||||||
|
@ -171,12 +166,13 @@ export default Ember.Component.extend(UtilsMixin, DomHelpersMixin, KeyboardMixin
|
||||||
|
|
||||||
@computed("content.[]")
|
@computed("content.[]")
|
||||||
computedContent(content) {
|
computedContent(content) {
|
||||||
|
this._mutateValue();
|
||||||
return this.formatContents(content || []);
|
return this.formatContents(content || []);
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed("value", "none", "computedContent.firstObject.value")
|
@computed("value", "none", "computedContent.firstObject.value")
|
||||||
computedValue(value, none, firstContentValue) {
|
computedValue(value, none, firstContentValue) {
|
||||||
if (isNone(value) && isNone(none)) {
|
if (isNone(value) && isNone(none) && this.get("autoSelectFirst") === true) {
|
||||||
return this._castInteger(firstContentValue);
|
return this._castInteger(firstContentValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,10 +272,7 @@ export default Ember.Component.extend(UtilsMixin, DomHelpersMixin, KeyboardMixin
|
||||||
|
|
||||||
@computed("filter", "computedFilterable", "computedContent.[]", "computedValue.[]")
|
@computed("filter", "computedFilterable", "computedContent.[]", "computedValue.[]")
|
||||||
filteredContent(filter, computedFilterable, computedContent, computedValue) {
|
filteredContent(filter, computedFilterable, computedContent, computedValue) {
|
||||||
if (computedFilterable === false) {
|
if (computedFilterable === false) { return computedContent; }
|
||||||
return computedContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.filterFunction(computedContent)(this, computedValue);
|
return this.filterFunction(computedContent)(this, computedValue);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -470,5 +463,23 @@ export default Ember.Component.extend(UtilsMixin, DomHelpersMixin, KeyboardMixin
|
||||||
width: this.$().width(),
|
width: this.$().width(),
|
||||||
height: headerHeight + this.$body().outerHeight(false)
|
height: headerHeight + this.$body().outerHeight(false)
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
@on("didReceiveAttrs")
|
||||||
|
_mutateValue() {
|
||||||
|
if (this.get("allowValueMutation") !== true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const none = isNone(this.get("none"));
|
||||||
|
const emptyValue = isEmpty(this.get("value"));
|
||||||
|
const notEmptyContent = !isEmpty(this.get("content"));
|
||||||
|
|
||||||
|
if (none && emptyValue && notEmptyContent) {
|
||||||
|
Ember.run.scheduleOnce("sync", () => {
|
||||||
|
const firstValue = this.get(`content.0.${this.get("valueAttribute")}`);
|
||||||
|
this.set("value", firstValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -7,6 +7,8 @@ export default ComboBoxComponent.extend({
|
||||||
classNames: "topic-footer-mobile-dropdown",
|
classNames: "topic-footer-mobile-dropdown",
|
||||||
filterable: false,
|
filterable: false,
|
||||||
autoFilterable: false,
|
autoFilterable: false,
|
||||||
|
allowValueMutation: false,
|
||||||
|
autoSelectFirst: false,
|
||||||
|
|
||||||
@on("didReceiveAttrs")
|
@on("didReceiveAttrs")
|
||||||
_setTopicFooterMobileDropdownOptions() {
|
_setTopicFooterMobileDropdownOptions() {
|
||||||
|
|
|
@ -275,3 +275,19 @@ componentTest('supports keyboard events', {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
componentTest('supports mutating value when no value given', {
|
||||||
|
template: '{{select-box-kit value=value content=content}}',
|
||||||
|
|
||||||
|
beforeEach() {
|
||||||
|
this.set("value", "");
|
||||||
|
this.set("content", [{ id: "1", name: "robin"}, {id: "2", name: "régis" }]);
|
||||||
|
},
|
||||||
|
|
||||||
|
test(assert) {
|
||||||
|
andThen(() => {
|
||||||
|
assert.equal(this.get("value"), "1");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -23,6 +23,13 @@ componentTest('default', {
|
||||||
assert.equal(selectBox().header.name(), "Topic Controls");
|
assert.equal(selectBox().header.name(), "Topic Controls");
|
||||||
assert.equal(selectBox().rowByIndex(0).name(), "Bookmark");
|
assert.equal(selectBox().rowByIndex(0).name(), "Bookmark");
|
||||||
assert.equal(selectBox().rowByIndex(1).name(), "Share");
|
assert.equal(selectBox().rowByIndex(1).name(), "Share");
|
||||||
|
assert.equal(selectBox().selectedRow.el.length, 0, "it doesn’t preselect first row");
|
||||||
|
});
|
||||||
|
|
||||||
|
selectBoxSelectRow("share");
|
||||||
|
|
||||||
|
andThen(() => {
|
||||||
|
assert.equal(this.get("value"), null, "it resets the value");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue