2019-04-17 15:58:15 +02:00
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
|
|
|
|
|
import '../../../src/stylus/components/_expansion-panel.styl';
|
|
|
|
import Themeable from '../../mixins/themeable';
|
|
|
|
import { provide as RegistrableProvide } from '../../mixins/registrable';
|
|
|
|
import mixins from '../../util/mixins';
|
|
|
|
/* @vue/component */
|
|
|
|
export default mixins(Themeable, RegistrableProvide('expansionPanel')).extend({
|
|
|
|
name: 'v-expansion-panel',
|
|
|
|
provide: function provide() {
|
|
|
|
return {
|
|
|
|
expansionPanel: this
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
|
|
|
props: {
|
|
|
|
disabled: Boolean,
|
|
|
|
readonly: Boolean,
|
|
|
|
expand: Boolean,
|
|
|
|
focusable: Boolean,
|
|
|
|
inset: Boolean,
|
|
|
|
popout: Boolean,
|
|
|
|
value: {
|
|
|
|
type: [Number, Array],
|
|
|
|
default: function _default() {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
data: function data() {
|
|
|
|
return {
|
|
|
|
items: [],
|
|
|
|
open: []
|
|
|
|
};
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
classes: function classes() {
|
|
|
|
return _extends({
|
|
|
|
'v-expansion-panel--focusable': this.focusable,
|
|
|
|
'v-expansion-panel--popout': this.popout,
|
|
|
|
'v-expansion-panel--inset': this.inset
|
|
|
|
}, this.themeClasses);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
expand: function expand(v) {
|
|
|
|
var openIndex = -1;
|
|
|
|
if (!v) {
|
|
|
|
// Close all panels unless only one is open
|
|
|
|
var openCount = this.open.reduce(function (acc, val) {
|
|
|
|
return val ? acc + 1 : acc;
|
|
|
|
}, 0);
|
|
|
|
var open = Array(this.items.length).fill(false);
|
|
|
|
if (openCount === 1) {
|
|
|
|
openIndex = this.open.indexOf(true);
|
|
|
|
}
|
|
|
|
if (openIndex > -1) {
|
|
|
|
open[openIndex] = true;
|
|
|
|
}
|
|
|
|
this.open = open;
|
|
|
|
}
|
|
|
|
this.$emit('input', v ? this.open : openIndex > -1 ? openIndex : null);
|
|
|
|
},
|
|
|
|
value: function value(v) {
|
|
|
|
this.updateFromValue(v);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
mounted: function mounted() {
|
|
|
|
this.value !== null && this.updateFromValue(this.value);
|
|
|
|
},
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
updateFromValue: function updateFromValue(v) {
|
|
|
|
if (Array.isArray(v) && !this.expand) return;
|
|
|
|
var open = Array(this.items.length).fill(false);
|
|
|
|
if (typeof v === 'number') {
|
|
|
|
open[v] = true;
|
|
|
|
} else if (v !== null) {
|
|
|
|
open = v;
|
|
|
|
}
|
|
|
|
this.updatePanels(open);
|
|
|
|
},
|
|
|
|
updatePanels: function updatePanels(open) {
|
|
|
|
this.open = open;
|
|
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
|
|
this.items[i].toggle(open && open[i]);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
panelClick: function panelClick(uid) {
|
|
|
|
var open = this.expand ? this.open.slice() : Array(this.items.length).fill(false);
|
|
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
|
|
if (this.items[i]._uid === uid) {
|
|
|
|
open[i] = !this.open[i];
|
|
|
|
!this.expand && this.$emit('input', open[i] ? i : null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.updatePanels(open);
|
|
|
|
if (this.expand) this.$emit('input', open);
|
|
|
|
},
|
|
|
|
register: function register(content) {
|
|
|
|
var i = this.items.push(content) - 1;
|
|
|
|
this.value !== null && this.updateFromValue(this.value);
|
|
|
|
content.toggle(!!this.open[i]);
|
|
|
|
},
|
|
|
|
unregister: function unregister(content) {
|
|
|
|
var index = this.items.findIndex(function (i) {
|
|
|
|
return i._uid === content._uid;
|
|
|
|
});
|
|
|
|
this.items.splice(index, 1);
|
|
|
|
this.open.splice(index, 1);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
render: function render(h) {
|
|
|
|
return h('ul', {
|
|
|
|
staticClass: 'v-expansion-panel',
|
|
|
|
class: this.classes
|
|
|
|
}, this.$slots.default);
|
|
|
|
}
|
|
|
|
});
|
2019-06-04 14:29:48 +02:00
|
|
|
//# sourceMappingURL=VExpansionPanel.js.map
|