/* eslint import/no-unresolved: ["off"] */ /* eslint import/extensions: ["off"] */ import Utils from '../utils/utils'; import F7ListItemContent from './list-item-content'; import Mixins from '../utils/mixins'; /* phenome-dts-imports import { SmartSelect as SmartSelectNamespace } from 'framework7/components/smart-select/smart-select'; */ /* phenome-dts-instance f7SmartSelect: SmartSelectNamespace.SmartSelect */ export default { name: 'f7-list-item', props: { id: [String, Number], className: String, // phenome-react-line style: Object, // phenome-react-line title: [String, Number], text: [String, Number], media: String, subtitle: [String, Number], header: [String, Number], footer: [String, Number], // Link Props link: [Boolean, String], target: String, noFastclick: Boolean, noFastClick: Boolean, after: [String, Number], badge: [String, Number], badgeColor: String, mediaItem: Boolean, mediaList: Boolean, divider: Boolean, groupTitle: Boolean, swipeout: Boolean, swipeoutOpened: Boolean, sortable: Boolean, accordionItem: Boolean, accordionItemOpened: Boolean, // Smart Select smartSelect: Boolean, smartSelectParams: Object, // Links Chevron (Arrow) Icon noChevron: Boolean, chevronCenter: Boolean, // Inputs checkbox: Boolean, radio: Boolean, checked: Boolean, defaultChecked: Boolean, name: String, value: [String, Number, Array], readonly: Boolean, required: Boolean, disabled: Boolean, itemInput: Boolean, itemInputWithInfo: Boolean, inlineLabel: Boolean, virtualListIndex: Number, ...Mixins.colorProps, ...Mixins.linkRouterProps, ...Mixins.linkActionsProps, }, state(props) { return { isMedia: props.mediaItem || props.mediaList, isSortable: props.sortable, isSimple: false, }; }, render() { const self = this; let linkEl; let itemContentEl; const props = self.props; const { id, style, className, title, text, media, subtitle, header, footer, link, href, target, noFastclick, noFastClick, after, badge, badgeColor, mediaItem, mediaList, divider, groupTitle, swipeout, accordionItem, accordionItemOpened, smartSelect, checkbox, radio, checked, defaultChecked, name, value, readonly, required, disabled, itemInput, itemInputWithInfo, inlineLabel, sortable, noChevron, chevronCenter, virtualListIndex, } = props; const isMedia = mediaItem || mediaList || self.state.isMedia; const isSortable = sortable || self.state.isSortable; const isSimple = self.state.isSimple; if (!isSimple) { // Item Content const needsEvents = !(link || href || accordionItem || smartSelect); itemContentEl = ( {swipeout || accordionItem ? null : self.slots.default} ); // Link if (link || href || accordionItem || smartSelect) { const linkAttrs = Utils.extend( { href: link === true || accordionItem || smartSelect ? '#' : link || href, target, }, Mixins.linkRouterAttrs(props), Mixins.linkActionsAttrs(props), ); const linkClasses = Utils.classNames( { 'item-link': true, 'no-fastclick': noFastclick || noFastClick, 'smart-select': smartSelect, }, Mixins.linkRouterClasses(props), Mixins.linkActionsClasses(props), ); linkEl = ( {itemContentEl} ); } } const liClasses = Utils.classNames( className, { 'item-divider': divider, 'list-group-title': groupTitle, 'media-item': isMedia, swipeout, 'accordion-item': accordionItem, 'accordion-item-opened': accordionItemOpened, disabled: disabled && !(radio || checkbox), 'no-chevron': noChevron, 'chevron-center': chevronCenter, }, Mixins.colorClasses(props), ); if (divider || groupTitle) { return (
  • {title}
  • ); } if (isSimple) { return (
  • {title}
  • ); } const linkItemEl = (link || href || smartSelect || accordionItem) ? linkEl : itemContentEl; return (
  • {swipeout ? (
    {linkItemEl}
    ) : linkItemEl } {isSortable && (
    )} {(swipeout || accordionItem) && self.slots.default}
  • ); }, watch: { 'props.swipeoutOpened': function watchSwipeoutOpened(opened) { const self = this; if (!self.props.swipeout) return; const el = self.refs.el; if (opened) { self.$f7.swipeout.open(el); } else { self.$f7.swipeout.close(el); } }, }, componentDidCreate() { const self = this; self.onClick = self.onClick.bind(self); self.onChange = self.onChange.bind(self); self.onSwipeoutOpen = self.onSwipeoutOpen.bind(self); self.onSwipeoutOpened = self.onSwipeoutOpened.bind(self); self.onSwipeoutClose = self.onSwipeoutClose.bind(self); self.onSwipeoutClosed = self.onSwipeoutClosed.bind(self); self.onSwipeoutDelete = self.onSwipeoutDelete.bind(self); self.onSwipeoutDeleted = self.onSwipeoutDeleted.bind(self); self.onSwipeoutOverswipeEnter = self.onSwipeoutOverswipeEnter.bind(self); self.onSwipeoutOverswipeExit = self.onSwipeoutOverswipeExit.bind(self); self.onSwipeout = self.onSwipeout.bind(self); self.onAccBeforeOpen = self.onAccBeforeOpen.bind(self); self.onAccOpen = self.onAccOpen.bind(self); self.onAccOpened = self.onAccOpened.bind(self); self.onAccBeforeClose = self.onAccBeforeClose.bind(self); self.onAccClose = self.onAccClose.bind(self); self.onAccClosed = self.onAccClosed.bind(self); }, componentDidMount() { const self = this; const { el, linkEl } = self.refs; if (!el) return; const { link, href, smartSelect, swipeout, swipeoutOpened, accordionItem, smartSelectParams, routeProps } = self.props; const needsEvents = !(link || href || accordionItem || smartSelect); if (!needsEvents && linkEl) { linkEl.addEventListener('click', self.onClick); } if (linkEl && routeProps) { linkEl.f7RouteProps = routeProps; } self.$listEl = self.$$(el).parents('.list, .list-group').eq(0); if (self.$listEl.length) { self.setState({ isMedia: self.$listEl.hasClass('media-list'), isSimple: self.$listEl.hasClass('simple-list'), isSortable: self.$listEl.hasClass('sortable'), }); } if (swipeout) { el.addEventListener('swipeout:open', self.onSwipeoutOpen); el.addEventListener('swipeout:opened', self.onSwipeoutOpened); el.addEventListener('swipeout:close', self.onSwipeoutClose); el.addEventListener('swipeout:closed', self.onSwipeoutClosed); el.addEventListener('swipeout:delete', self.onSwipeoutDelete); el.addEventListener('swipeout:deleted', self.onSwipeoutDeleted); el.addEventListener('swipeout:overswipeenter', self.onSwipeoutOverswipeEnter); el.addEventListener('swipeout:overswipeexit', self.onSwipeoutOverswipeExit); el.addEventListener('swipeout', self.onSwipeout); } if (accordionItem) { el.addEventListener('accordion:beforeopen', self.onAccBeforeOpen); el.addEventListener('accordion:open', self.onAccOpen); el.addEventListener('accordion:opened', self.onAccOpened); el.addEventListener('accordion:beforeclose', self.onAccBeforeClose); el.addEventListener('accordion:close', self.onAccClose); el.addEventListener('accordion:closed', self.onAccClosed); } self.$f7ready((f7) => { if (smartSelect) { const ssParams = Utils.extend( { el: el.querySelector('a.smart-select') }, smartSelectParams || {}, ); self.f7SmartSelect = f7.smartSelect.create(ssParams); } if (swipeoutOpened) { f7.swipeout.open(el); } }); }, componentDidUpdate() { const self = this; const { $listEl } = self; const { linkEl } = self.refs; const { routeProps } = self.props; if (linkEl && routeProps) { linkEl.f7RouteProps = routeProps; } if (!$listEl || ($listEl && $listEl.length === 0)) return; const isMedia = $listEl.hasClass('media-list'); const isSimple = $listEl.hasClass('simple-list'); const isSortable = $listEl.hasClass('sortable'); if (isMedia !== self.state.isMedia) { self.setState({ isMedia }); } if (isSimple !== self.state.isSimple) { self.setState({ isSimple }); } if (isSortable !== self.state.isSortable) { self.setState({ isSortable }); } }, componentWillUnmount() { const self = this; const { el, linkEl } = self.refs; const { link, href, smartSelect, swipeout, accordionItem } = self.props; const needsEvents = !(link || href || accordionItem || smartSelect); if (linkEl) { if (!needsEvents) { linkEl.removeEventListener('click', self.onClick); } delete linkEl.f7RouteProps; } if (el) { if (swipeout) { el.removeEventListener('swipeout:open', self.onSwipeoutOpen); el.removeEventListener('swipeout:opened', self.onSwipeoutOpened); el.removeEventListener('swipeout:close', self.onSwipeoutClose); el.removeEventListener('swipeout:closed', self.onSwipeoutClosed); el.removeEventListener('swipeout:delete', self.onSwipeoutDelete); el.removeEventListener('swipeout:deleted', self.onSwipeoutDeleted); el.removeEventListener('swipeout:overswipeenter', self.onSwipeoutOverswipeEnter); el.removeEventListener('swipeout:overswipeexit', self.onSwipeoutOverswipeExit); el.removeEventListener('swipeout', self.onSwipeout); } if (accordionItem) { el.removeEventListener('accordion:beforeopen', self.onAccBeforeOpen); el.removeEventListener('accordion:open', self.onAccOpen); el.removeEventListener('accordion:opened', self.onAccOpened); el.removeEventListener('accordion:beforeclose', self.onAccBeforeClose); el.removeEventListener('accordion:close', self.onAccClose); el.removeEventListener('accordion:closed', self.onAccClosed); } } if (smartSelect && self.f7SmartSelect) { self.f7SmartSelect.destroy(); } }, methods: { onClick(event) { const self = this; if (event.target.tagName.toLowerCase() !== 'input') { self.dispatchEvent('click', event); } }, onSwipeoutOverswipeEnter(event) { this.dispatchEvent('swipeout:overswipeenter swipeoutOverswipeEnter', event); }, onSwipeoutOverswipeExit(event) { this.dispatchEvent('swipeout:overswipeexit swipeoutOverswipeExit', event); }, onSwipeoutDeleted(event) { this.dispatchEvent('swipeout:deleted swipeoutDeleted', event); }, onSwipeoutDelete(event) { this.dispatchEvent('swipeout:delete swipeoutDelete', event); }, onSwipeoutClose(event) { this.dispatchEvent('swipeout:close swipeoutClose', event); }, onSwipeoutClosed(event) { this.dispatchEvent('swipeout:closed swipeoutClosed', event); }, onSwipeoutOpen(event) { this.dispatchEvent('swipeout:open swipeoutOpen', event); }, onSwipeoutOpened(event) { this.dispatchEvent('swipeout:opened swipeoutOpened', event); }, onSwipeout(event) { this.dispatchEvent('swipeout', event); }, onAccBeforeClose(event) { this.dispatchEvent('accordion:beforeclose accordionBeforeClose', event, event.detail.prevent); }, onAccClose(event) { this.dispatchEvent('accordion:close accordionClose', event); }, onAccClosed(event) { this.dispatchEvent('accordion:closed accordionClosed', event); }, onAccBeforeOpen(event) { this.dispatchEvent('accordion:beforeopen accordionBeforeOpen', event, event.detail.prevent); }, onAccOpen(event) { this.dispatchEvent('accordion:open accordionOpen', event); }, onAccOpened(event) { this.dispatchEvent('accordion:opened accordionOpened', event); }, onChange(event) { this.dispatchEvent('change', event); }, onInput(event) { this.dispatchEvent('input', event); }, }, };