Skip to content

Commit 6610feb

Browse files
committed
feat(vue): support open-in functionality with vue components route
1 parent 8894a77 commit 6610feb

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

src/vue/shared/components-router.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint no-underscore-dangle: "off" */
22
import { f7events, f7routers } from './f7';
33
import { extend, getComponentId } from './utils';
4+
import { routerOpenIn } from './router-open-in';
45

56
const getChildrenArray = (el) => {
67
const arr = [];
@@ -18,6 +19,9 @@ const hasSameChildren = (childrenBefore, childrenAfter) => {
1819

1920
export default {
2021
proto: {
22+
openIn(router, navigateUrl, options) {
23+
return routerOpenIn(router, navigateUrl, options);
24+
},
2125
pageComponentLoader({ routerEl, component, options, resolve, reject }) {
2226
const router = this;
2327
const routerId = router.id;

src/vue/shared/router-open-in.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { h } from 'vue';
2+
import Popup from '../components/popup';
3+
import View from '../components/view';
4+
import LoginScreen from '../components/login-screen';
5+
import Sheet from '../components/sheet';
6+
import Popover from '../components/popover';
7+
import Panel from '../components/panel';
8+
9+
export const routerOpenIn = (router, url, options) => {
10+
const navigateOptions = {
11+
url,
12+
route: {
13+
path: url,
14+
options: {
15+
...options,
16+
openIn: undefined,
17+
},
18+
},
19+
};
20+
const params = {
21+
...options,
22+
};
23+
24+
if (options.openIn === 'popup') {
25+
params.component = {
26+
setup() {
27+
return () =>
28+
h(Popup, { class: 'popup-router-open-in', 'data-url': url }, [
29+
h(View, { linksView: router.view.selector, url, ignoreOpenIn: true }),
30+
]);
31+
},
32+
};
33+
navigateOptions.route.popup = params;
34+
}
35+
if (options.openIn === 'loginScreen') {
36+
params.component = {
37+
setup() {
38+
return () =>
39+
h(LoginScreen, { class: 'login-screen-router-open-in', 'data-url': url }, [
40+
h(View, { linksView: router.view.selector, url, ignoreOpenIn: true }),
41+
]);
42+
},
43+
};
44+
navigateOptions.route.loginScreen = params;
45+
}
46+
if (options.openIn === 'sheet') {
47+
params.component = {
48+
setup() {
49+
return () =>
50+
h(Sheet, { class: 'sheet-modal-router-open-in', 'data-url': url }, [
51+
h(View, { linksView: router.view.selector, url, ignoreOpenIn: true }),
52+
]);
53+
},
54+
};
55+
navigateOptions.route.sheet = params;
56+
}
57+
if (options.openIn === 'popover') {
58+
params.targetEl = options.clickedEl || options.targetEl;
59+
params.component = {
60+
setup() {
61+
return () =>
62+
h(
63+
Popover,
64+
{
65+
class: 'popover-router-open-in',
66+
'data-url': url,
67+
targetEl: options.clickedEl || options.targetEl,
68+
},
69+
[h(View, { linksView: router.view.selector, url, ignoreOpenIn: true })],
70+
);
71+
},
72+
};
73+
navigateOptions.route.popover = params;
74+
}
75+
if (options.openIn.indexOf('panel') >= 0) {
76+
const parts = options.openIn.split(':');
77+
const side = parts[1] || 'left';
78+
const effect = parts[2] || 'cover';
79+
params.targetEl = options.clickedEl || options.targetEl;
80+
params.component = {
81+
setup() {
82+
return () =>
83+
h(Panel, { class: 'panel-router-open-in', 'data-url': url, side, effect }, [
84+
h(View, { linksView: router.view.selector, url, ignoreOpenIn: true }),
85+
]);
86+
},
87+
};
88+
navigateOptions.route.panel = params;
89+
}
90+
return router.navigate(navigateOptions);
91+
};

0 commit comments

Comments
 (0)