UNPKG

framework7-vue

Version:

Build full featured iOS & Android apps using Framework7 & Vue

171 lines (151 loc) 4.32 kB
import Utils from '../utils/utils'; import Mixins from '../utils/mixins'; import F7CardHeader from './card-header'; import F7CardContent from './card-content'; import F7CardFooter from './card-footer'; import __vueComponentDispatchEvent from '../runtime-helpers/vue-component-dispatch-event.js'; import __vueComponentProps from '../runtime-helpers/vue-component-props.js'; export default { name: 'f7-card', props: Object.assign({ id: [String, Number], title: [String, Number], content: [String, Number], footer: [String, Number], outline: Boolean, expandable: Boolean, expandableAnimateWidth: Boolean, expandableOpened: Boolean, noShadow: Boolean, noBorder: Boolean, padding: { type: Boolean, default: true } }, Mixins.colorProps), watch: { 'props.expandableOpened': function watchOpened(expandableOpened) { const self = this; if (opened) { self.open(); } else { self.close(); } } }, created() { Utils.bindMethods(this, 'onBeforeOpen onOpen onOpened onClose onClosed'.split(' ')); }, mounted() { const self = this; if (!self.props.expandable) return; const el = self.$refs.el; if (!el) return; el.addEventListener('card:beforeopen', self.onBeforeOpen); el.addEventListener('card:open', self.onOpen); el.addEventListener('card:opened', self.onOpened); el.addEventListener('card:close', self.onClose); el.addEventListener('card:closed', self.onClosed); if (self.props.expandable && self.props.expandableOpened) { self.$f7ready(() => { self.$f7.card.open(el, false); }); } }, beforeDestroy() { const self = this; if (!self.props.expandable) return; const el = self.$refs.el; if (!el) return; el.removeEventListener('card:beforeopen', self.onBeforeOpen); el.removeEventListener('card:open', self.onOpen); el.removeEventListener('card:opened', self.onOpened); el.removeEventListener('card:close', self.onClose); el.removeEventListener('card:closed', self.onClosed); }, render() { const _h = this.$createElement; const self = this; const props = self.props; const { className, id, style, title, content, footer, padding, outline, expandable, expandableAnimateWidth, noShadow, noBorder } = props; let headerEl; let contentEl; let footerEl; const classes = Utils.classNames(className, 'card', { 'card-outline': outline, 'card-expandable': expandable, 'card-expandable-animate-width': expandableAnimateWidth, 'no-shadow': noShadow, 'no-border': noBorder }, Mixins.colorClasses(props)); if (title || self.$slots && self.$slots.header) { headerEl = _h(F7CardHeader, [title, this.$slots['header']]); } if (content || self.$slots && self.$slots.content) { contentEl = _h(F7CardContent, { attrs: { padding: padding } }, [content, this.$slots['content']]); } if (footer || self.$slots && self.$slots.footer) { footerEl = _h(F7CardFooter, [footer, this.$slots['footer']]); } return _h('div', { style: style, class: classes, ref: 'el', attrs: { id: id } }, [headerEl, contentEl, footerEl, this.$slots['default']]); }, methods: { open() { const self = this; if (!self.$refs.el) return; self.$f7.card.open(self.$refs.el); }, close() { const self = this; if (!self.$refs.el) return; self.$f7.card.close(self.$refs.el); }, onBeforeOpen(e) { this.dispatchEvent('cardBeforeOpen card:beforeopen', e.target, e.detail.prevent); }, onOpen(e) { this.dispatchEvent('cardOpen card:open', e.target); }, onOpened(e) { this.dispatchEvent('cardOpened card:opened', e.target); }, onClose(e) { this.dispatchEvent('cardClose card:close', e.target); }, onClosed(e) { this.dispatchEvent('cardClosed card:closed', e.target); }, dispatchEvent(events, ...args) { __vueComponentDispatchEvent(this, events, ...args); } }, computed: { props() { return __vueComponentProps(this); } } };