/* eslint import/no-unresolved: ["off"] */
/* eslint import/extensions: ["off"] */
import Utils from '../utils/utils';
import Mixins from '../utils/mixins';
import F7Badge from './badge';
import F7Icon from './icon';
/* phenome-dts-imports
import { Tooltip as TooltipNamespace } from 'framework7/components/tooltip/tooltip';
import { SmartSelect as SmartSelectNamespace } from 'framework7/components/smart-select/smart-select';
*/
/* phenome-dts-instance
f7Tooltip: TooltipNamespace.Tooltip
f7SmartSelect: SmartSelectNamespace.SmartSelect
*/
export default {
name: 'f7-link',
props: {
id: [String, Number],
className: String, // phenome-react-line
style: Object, // phenome-react-line
noLinkClass: Boolean,
noFastClick: Boolean,
noFastclick: Boolean,
text: String,
tabLink: [Boolean, String],
tabLinkActive: Boolean,
tabbarLabel: Boolean,
iconOnly: Boolean,
badge: [String, Number],
badgeColor: [String],
iconBadge: [String, Number],
href: {
type: [String, Boolean],
default: '#',
},
target: String,
tooltip: String,
// Smart Select
smartSelect: Boolean,
smartSelectParams: Object,
...Mixins.colorProps,
...Mixins.linkIconProps,
...Mixins.linkRouterProps,
...Mixins.linkActionsProps,
},
state(props) {
return {
isTabbarLabel: props.tabbarLabel,
};
},
render() {
const self = this;
const props = self.props;
const {
text,
badge,
badgeColor,
iconOnly,
iconBadge,
icon,
iconColor,
iconSize,
iconMaterial,
iconIon,
iconFa,
iconF7,
iconIfMd,
iconIfIos,
iconMd,
iconIos,
id,
style,
} = props;
const defaultSlots = self.slots.default;
let iconEl;
let textEl;
let badgeEl;
let iconBadgeEl;
if (text) {
if (badge) badgeEl = ({badge});
textEl = (
{text}
{badgeEl}
);
}
const mdThemeIcon = iconIfMd || iconMd;
const iosThemeIcon = iconIfIos || iconIos;
if (icon || iconMaterial || iconIon || iconFa || iconF7 || mdThemeIcon || iosThemeIcon) {
if (iconBadge) {
iconBadgeEl = {iconBadge};
}
iconEl = (
{iconBadgeEl}
);
}
if (
iconOnly
|| (!text && defaultSlots && defaultSlots.length === 0)
|| (!text && !defaultSlots)
) {
self.iconOnlyComputed = true;
} else {
self.iconOnlyComputed = false;
}
return (
{iconEl}
{textEl}
{defaultSlots}
);
},
watch: {
'props.tooltip': function watchTooltip(newText) {
const self = this;
if (!newText || !self.f7Tooltip) return;
self.f7Tooltip.setText(newText);
},
},
componentDidCreate() {
const self = this;
self.onClick = self.onClick.bind(self);
},
componentDidMount() {
const self = this;
const el = self.refs.el;
el.addEventListener('click', self.onClick);
const { tabbarLabel, tabLink, tooltip, smartSelect, smartSelectParams, routeProps } = self.props;
let isTabbarLabel = false;
if (tabbarLabel
|| (
(tabLink || tabLink === '')
&& self.$$(el).parents('.tabbar-labels').length
)
) {
isTabbarLabel = true;
}
self.setState({ isTabbarLabel });
if (routeProps) el.f7RouteProps = routeProps;
self.$f7ready((f7) => {
if (smartSelect) {
const ssParams = Utils.extend(
{ el },
smartSelectParams || {},
);
self.f7SmartSelect = f7.smartSelect.create(ssParams);
}
if (tooltip) {
self.f7Tooltip = f7.tooltip.create({
targetEl: el,
text: tooltip,
});
}
});
},
componentDidUpdate() {
const self = this;
const el = self.refs.el;
const { routeProps } = self.props;
if (routeProps) {
el.f7RouteProps = routeProps;
}
},
componentWillUnmount() {
const self = this;
const el = self.refs.el;
el.removeEventListener('click', self.onClick);
delete el.f7RouteProps;
if (self.f7SmartSelect && self.f7SmartSelect.destroy) {
self.f7SmartSelect.destroy();
}
if (self.f7Tooltip && self.f7Tooltip.destroy) {
self.f7Tooltip.destroy();
self.f7Tooltip = null;
delete self.f7Tooltip;
}
},
computed: {
attrs() {
const self = this;
const props = self.props;
const { href, target, tabLink } = props;
let hrefComputed = href;
if (href === true) hrefComputed = '#';
if (href === false) hrefComputed = undefined; // no href attribute
return Utils.extend(
{
href: hrefComputed,
target,
'data-tab': (Utils.isStringProp(tabLink) && tabLink) || undefined,
},
Mixins.linkRouterAttrs(props),
Mixins.linkActionsAttrs(props),
);
},
classes() {
const self = this;
const props = self.props;
const {
noFastclick,
noFastClick,
tabLink,
tabLinkActive,
noLinkClass,
smartSelect,
className,
} = props;
return Utils.classNames(
className,
{
link: !(noLinkClass || self.state.isTabbarLabel),
'icon-only': self.iconOnlyComputed,
'tab-link': tabLink || tabLink === '',
'tab-link-active': tabLinkActive,
'no-fastclick': noFastclick || noFastClick,
'smart-select': smartSelect,
},
Mixins.colorClasses(props),
Mixins.linkRouterClasses(props),
Mixins.linkActionsClasses(props),
);
},
},
methods: {
onClick(event) {
this.dispatchEvent('click', event);
},
},
};