UNPKG

framework7-vue

Version:

Build full featured iOS & Android apps using Framework7 & Vue

337 lines (301 loc) 8.87 kB
import Utils from '../utils/utils'; import Mixins from '../utils/mixins'; import F7Input from './input'; import F7Link from './link'; import __vueComponentDispatchEvent from '../runtime-helpers/vue-component-dispatch-event.js'; import __vueComponentProps from '../runtime-helpers/vue-component-props.js'; export default { name: 'f7-messagebar', props: Object.assign({ id: [String, Number], sheetVisible: Boolean, attachmentsVisible: Boolean, top: Boolean, resizable: { type: Boolean, default: true }, bottomOffset: { type: Number, default: 0 }, topOffset: { type: Number, default: 0 }, maxHeight: Number, resizePage: { type: Boolean, default: true }, sendLink: String, value: [String, Number, Array], disabled: Boolean, readonly: Boolean, textareaId: [Number, String], name: String, placeholder: { type: String, default: 'Message' }, init: { type: Boolean, default: true } }, Mixins.colorProps), created() { Utils.bindMethods(this, ['onChange', 'onInput', 'onFocus', 'onBlur', 'onClick', 'onDeleteAttachment', 'onClickAttachment', 'onResizePage']); }, render() { const _h = this.$createElement; const self = this; const { placeholder, disabled, name, readonly, resizable, value, sendLink, id, style } = self.props; const { default: slotsDefault, 'before-inner': slotsBeforeInner, 'after-inner': slotsAfterInner, 'send-link': slotsSendLink, 'inner-start': slotsInnerStart, 'inner-end': slotsInnerEnd, 'before-area': slotsBeforeArea, 'after-area': slotsAfterArea } = self.$slots; const innerEndEls = []; let messagebarAttachmentsEl; let messagebarSheetEl; if (slotsDefault) { slotsDefault.forEach(child => { if (typeof child === 'undefined') return; let tag; tag = child.tag; if (tag && (tag.indexOf('messagebar-attachments') >= 0 || tag === 'F7MessagebarAttachments' || tag === 'f7-messagebar-attachments')) { messagebarAttachmentsEl = child; } else if (tag && (tag.indexOf('messagebar-sheet') >= 0 || tag === 'F7MessagebarSheet' || tag === 'f7-messagebar-sheet')) { messagebarSheetEl = child; } else { innerEndEls.push(child); } }); } return _h('div', { ref: 'el', style: style, class: self.classes, attrs: { id: id } }, [slotsBeforeInner, _h('div', { class: 'toolbar-inner' }, [slotsInnerStart, _h('div', { class: 'messagebar-area' }, [slotsBeforeArea, messagebarAttachmentsEl, _h(F7Input, { ref: 'area', on: { input: self.onInput, change: self.onChange, focus: self.onFocus, blur: self.onBlur }, attrs: { type: 'textarea', wrap: false, placeholder: placeholder, disabled: disabled, name: name, readonly: readonly, resizable: resizable, value: value } }), slotsAfterArea]), (sendLink && sendLink.length > 0 || slotsSendLink) && _h(F7Link, { on: { click: self.onClick } }, [slotsSendLink || sendLink]), slotsInnerEnd, innerEndEls]), slotsAfterInner, messagebarSheetEl]); }, computed: { classes() { const self = this; const props = self.props; const { className, attachmentsVisible, sheetVisible } = props; return Utils.classNames(className, 'toolbar', 'messagebar', { 'messagebar-attachments-visible': attachmentsVisible, 'messagebar-sheet-visible': sheetVisible }, Mixins.colorClasses(props)); }, props() { return __vueComponentProps(this); } }, watch: { 'props.sheetVisible': function watchSheetVisible() { const self = this; if (!self.props.resizable || !self.f7Messagebar) return; self.updateSheetVisible = true; }, 'props.attachmentsVisible': function watchAttachmentsVisible() { const self = this; if (!self.props.resizable || !self.f7Messagebar) return; self.updateAttachmentsVisible = true; } }, mounted() { const self = this; const { init, top, resizePage, bottomOffset, topOffset, maxHeight } = self.props; if (!init) return; const el = self.$refs.el; if (!el) return; el.addEventListener('messagebar:attachmentdelete', self.onDeleteAttachment); el.addEventListener('messagebar:attachmentclick', self.onClickAttachment); el.addEventListener('messagebar:resizepage', self.onResizePage); const params = Utils.noUndefinedProps({ el, top, resizePage, bottomOffset, topOffset, maxHeight }); self.$f7ready(() => { self.f7Messagebar = self.$f7.messagebar.create(params); }); }, updated() { const self = this; if (!self.f7Messagebar) return; const { sheetVisible, attachmentsVisible } = self.props; if (self.updateSheetVisible) { self.updateSheetVisible = false; self.f7Messagebar.sheetVisible = sheetVisible; self.f7Messagebar.resizePage(); } if (self.updateAttachmentsVisible) { self.updateAttachmentsVisible = false; self.f7Messagebar.attachmentsVisible = attachmentsVisible; self.f7Messagebar.resizePage(); } }, beforeDestroy() { const self = this; if (self.f7Messagebar && self.f7Messagebar.destroy) self.f7Messagebar.destroy(); const el = self.$refs.el; if (!el) return; el.removeEventListener('messagebar:attachmentdelete', self.onDeleteAttachment); el.removeEventListener('messagebar:attachmentclick', self.onClickAttachment); el.removeEventListener('messagebar:resizepage', self.onResizePage); }, methods: { clear(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.clear(...args); }, getValue(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.getValue(...args); }, setValue(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.setValue(...args); }, setPlaceholder(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.setPlaceholder(...args); }, resize(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.resizePage(...args); }, focus(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.focus(...args); }, blur(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.blur(...args); }, attachmentsShow(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.attachmentsShow(...args); }, attachmentsHide(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.attachmentsHide(...args); }, attachmentsToggle(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.attachmentsToggle(...args); }, sheetShow(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.sheetShow(...args); }, sheetHide(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.sheetHide(...args); }, sheetToggle(...args) { if (!this.f7Messagebar) return undefined; return this.f7Messagebar.sheetToggle(...args); }, onChange(event) { this.dispatchEvent('change', event); }, onInput(event) { this.dispatchEvent('input', event); }, onFocus(event) { this.dispatchEvent('focus', event); }, onBlur(event) { this.dispatchEvent('blur', event); }, onClick(event) { const self = this; let value; { value = self.$refs.area.$refs.inputEl.value; } const clear = self.f7Messagebar ? () => { self.f7Messagebar.clear(); } : () => {}; this.dispatchEvent('submit', value, clear); this.dispatchEvent('send', value, clear); this.dispatchEvent('click', event); }, onDeleteAttachment(event) { this.dispatchEvent('messagebar:attachmentdelete messagebarAttachmentDelete', event); }, onClickAttachment(event) { this.dispatchEvent('messagebar:attachmentclick messagebarAttachmentClick', event); }, onResizePage(event) { this.dispatchEvent('messagebar:resizepage messagebarResizePage', event); }, dispatchEvent(events, ...args) { __vueComponentDispatchEvent(this, events, ...args); } } };