import { createNamespace } from '../utils'; import Tab from '../tab'; import Tabs from '../tabs'; import Icon from '../icon'; const [createComponent, bem] = createNamespace('cascader'); export default createComponent({ props: { title: String, value: [Number, String], options: Array, placeholder: String, activeColor: String, closeable: { type: Boolean, default: true, }, }, data() { return { tabs: [], activeTab: 0, }; }, watch: { options() { this.updateTabs(); }, value(value) { if (value) { const values = this.tabs.map((tab) => tab.selectedOption?.value); if (values.indexOf(value) !== -1) { return; } } this.updateTabs(); }, }, created() { this.updateTabs(); }, methods: { getSelectedOptionsByValue(options, value) { for (let i = 0; i < options.length; i++) { const option = options[i]; if (option.value === value) { return [option]; } if (option.children) { const selectedOptions = this.getSelectedOptionsByValue( option.children, value ); if (selectedOptions) { return [option, ...selectedOptions]; } } } }, updateTabs() { if (this.value) { const selectedOptions = this.getSelectedOptionsByValue( this.options, this.value ); if (selectedOptions) { let optionsCursor = this.options; this.tabs = selectedOptions.map((option) => { const tab = { options: optionsCursor, selectedOption: option, }; const next = optionsCursor.filter( (item) => item.value === option.value ); if (next.length) { optionsCursor = next[0].children; } return tab; }); if (optionsCursor) { this.tabs.push({ options: optionsCursor, selectedOption: null, }); } this.activeTab = this.tabs.length - 1; return; } } this.tabs = [ { options: this.options, selectedOption: null, }, ]; }, onSelect(option, tabIndex) { this.tabs[tabIndex].selectedOption = option; if (this.tabs.length > tabIndex + 1) { this.tabs = this.tabs.slice(0, tabIndex + 1); } if (option.children) { const nextTab = { options: option.children, selectedOption: null, }; if (this.tabs[tabIndex + 1]) { this.$set(this.tabs, tabIndex + 1, nextTab); } else { this.tabs.push(nextTab); } this.$nextTick(() => { this.activeTab++; }); } const eventParams = { value: option.value, tabIndex, selectedOptions: this.tabs.map((tab) => tab.selectedOption), }; this.$emit('input', option.value); this.$emit('change', eventParams); if (!option.children) { this.$emit('finish', eventParams); } }, onClose() { this.$emit('close'); }, renderHeader() { return (