Fixing select2 re-rendering issues
This commit is contained in:
parent
25671c4e77
commit
4e54b21dd4
@ -100,7 +100,7 @@ OHIF.mixins.schemaData = new OHIF.Mixin({
|
|||||||
|
|
||||||
// Fill the items if it's an array schema
|
// Fill the items if it's an array schema
|
||||||
if (!data.items && Array.isArray(currentSchema.allowedValues)) {
|
if (!data.items && Array.isArray(currentSchema.allowedValues)) {
|
||||||
data.items = new ReactiveVar();
|
data.items = data.items instanceof ReactiveVar ? data.items : new ReactiveVar();
|
||||||
|
|
||||||
Tracker.autorun(() => {
|
Tracker.autorun(() => {
|
||||||
const schemaDefs = getCurrentSchemaDefs(parent, data.pathKey);
|
const schemaDefs = getCurrentSchemaDefs(parent, data.pathKey);
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { Template } from 'meteor/templating';
|
import { Template } from 'meteor/templating';
|
||||||
import { ReactiveVar } from 'meteor/reactive-var';
|
import { ReactiveVar } from 'meteor/reactive-var';
|
||||||
|
import { Tracker } from 'meteor/tracker';
|
||||||
import { _ } from 'meteor/underscore';
|
import { _ } from 'meteor/underscore';
|
||||||
import { $ } from 'meteor/jquery';
|
import { $ } from 'meteor/jquery';
|
||||||
import { OHIF } from 'meteor/ohif:core';
|
import { OHIF } from 'meteor/ohif:core';
|
||||||
@ -53,27 +54,54 @@ OHIF.mixins.select2 = new OHIF.Mixin({
|
|||||||
const instance = Template.instance();
|
const instance = Template.instance();
|
||||||
const component = instance.component;
|
const component = instance.component;
|
||||||
|
|
||||||
// Apply the select2 to the component
|
// Destroy and re-create the select2 instance
|
||||||
component.$element.select2(instance.data.options);
|
const rebuildSelect2 = () => {
|
||||||
|
// Destroy the select2 instance if exists and re-create it
|
||||||
// Store the select2 instance to allow its further destruction
|
if (component.select2Instance) {
|
||||||
component.select2Instance = component.$element.data('select2');
|
component.select2Instance.destroy();
|
||||||
|
|
||||||
// Get the focusable elements
|
|
||||||
const elements = [];
|
|
||||||
elements.push(component.$element[0]);
|
|
||||||
elements.push(component.$element.nextAll('.select2:first').find('.select2-selection')[0]);
|
|
||||||
|
|
||||||
// Attach focus and blur handlers to focusable elements
|
|
||||||
$(elements).on('focus', event => {
|
|
||||||
if (event.target === event.currentTarget) {
|
|
||||||
// Show the state message on elements focus
|
|
||||||
component.toggleMessage(true);
|
|
||||||
}
|
}
|
||||||
}).on('blur', event => {
|
|
||||||
if (event.target === event.currentTarget) {
|
// Apply the select2 to the component
|
||||||
// Hide the state message on elements blur
|
component.$element.select2(instance.data.options);
|
||||||
component.toggleMessage(false);
|
|
||||||
|
// Store the select2 instance to allow its further destruction
|
||||||
|
component.select2Instance = component.$element.data('select2');
|
||||||
|
|
||||||
|
// Get the focusable elements
|
||||||
|
const elements = [];
|
||||||
|
elements.push(component.$element[0]);
|
||||||
|
elements.push(component.$element.nextAll('.select2:first').find('.select2-selection')[0]);
|
||||||
|
|
||||||
|
// Attach focus and blur handlers to focusable elements
|
||||||
|
$(elements).on('focus', event => {
|
||||||
|
if (event.target === event.currentTarget) {
|
||||||
|
// Show the state message on elements focus
|
||||||
|
component.toggleMessage(true);
|
||||||
|
}
|
||||||
|
}).on('blur', event => {
|
||||||
|
if (event.target === event.currentTarget) {
|
||||||
|
// Hide the state message on elements blur
|
||||||
|
component.toggleMessage(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
instance.autorun(() => {
|
||||||
|
// Run this computation every time the reactive items suffer any changes
|
||||||
|
const isReactive = instance.data.items instanceof ReactiveVar;
|
||||||
|
if (isReactive) {
|
||||||
|
instance.data.items.dep.depend();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isReactive) {
|
||||||
|
// Keep the current value of the component
|
||||||
|
const currentValue = component.value();
|
||||||
|
Tracker.afterFlush(() => {
|
||||||
|
rebuildSelect2();
|
||||||
|
component.value(currentValue);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
rebuildSelect2();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user