Skip to content

Commit ae45a72

Browse files
authored
feat: tabs action (#114)
1 parent c55bb6c commit ae45a72

File tree

3 files changed

+60
-5
lines changed

3 files changed

+60
-5
lines changed

src/extensions/yfm/YfmTabs/YfmTabsSpecs/spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const getSpec: (opts: YfmTabsSpecsOptions) => Record<TabsNode, NodeSpec>
1010
[TabsNode.Tab]: {
1111
attrs: {
1212
[TabAttrs.id]: {default: 'unknown'},
13-
[TabAttrs.class]: {default: 'unknown'},
13+
[TabAttrs.class]: {default: 'yfm-tab'},
1414
[TabAttrs.role]: {default: 'unknown'},
1515
[TabAttrs.ariaControls]: {default: 'unknown'},
1616
[TabAttrs.ariaSelected]: {default: 'unknown'},
@@ -35,7 +35,7 @@ export const getSpec: (opts: YfmTabsSpecsOptions) => Record<TabsNode, NodeSpec>
3535
[TabsNode.TabPanel]: {
3636
attrs: {
3737
[TabPanelAttrs.id]: {default: 'unknown'},
38-
[TabPanelAttrs.class]: {default: 'unknown'},
38+
[TabPanelAttrs.class]: {default: 'yfm-tab-panel'},
3939
[TabPanelAttrs.role]: {default: 'unknown'},
4040
[TabPanelAttrs.dataTitle]: {default: 'unknown'},
4141
[TabPanelAttrs.ariaLabelledby]: {default: 'unknown'},
@@ -53,7 +53,7 @@ export const getSpec: (opts: YfmTabsSpecsOptions) => Record<TabsNode, NodeSpec>
5353
},
5454

5555
[TabsNode.Tabs]: {
56-
attrs: {[TabsAttrs.class]: {default: 'unknown'}},
56+
attrs: {[TabsAttrs.class]: {default: 'yfm-tabs'}},
5757
content: 'yfm_tabs_list yfm_tab_panel+',
5858
group: 'block',
5959
parseDOM: [{tag: 'div.yfm-tabs'}],
@@ -65,7 +65,7 @@ export const getSpec: (opts: YfmTabsSpecsOptions) => Record<TabsNode, NodeSpec>
6565

6666
[TabsNode.TabsList]: {
6767
attrs: {
68-
[TabsListAttrs.class]: {default: 'unknown'},
68+
[TabsListAttrs.class]: {default: 'yfm-tab-list'},
6969
[TabsListAttrs.role]: {default: 'unknown'},
7070
},
7171
content: 'yfm_tab*',
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import {generateID} from '@doc-tools/transform/lib/plugins/utils';
2+
import type {Command} from 'prosemirror-state';
3+
import {tabPanelType, tabsListType, tabsType, tabType} from '.';
4+
import {pType} from '../../base/BaseSchema';
5+
import {tabActiveClassname, tabPanelActiveClassname} from './const';
6+
import {TabAttrs, TabPanelAttrs} from './YfmTabsSpecs/const';
7+
8+
export const createYfmTabsCommand: Command = (state, dispatch) => {
9+
if (dispatch) {
10+
const {schema} = state;
11+
12+
const tabId = generateID();
13+
const panelId = generateID();
14+
const yfmTabsList = tabsListType(schema);
15+
const yfmTabs = tabsType(schema);
16+
17+
const yfmTabPanel = tabPanelType(state.schema).create(
18+
{
19+
[TabPanelAttrs.ariaLabelledby]: tabId,
20+
[TabPanelAttrs.id]: panelId,
21+
[TabPanelAttrs.class]: tabPanelActiveClassname,
22+
},
23+
pType(state.schema).createAndFill(),
24+
);
25+
const yfmTab = tabType(state.schema).create({
26+
[TabAttrs.id]: tabId,
27+
[TabAttrs.class]: tabActiveClassname,
28+
[TabAttrs.ariaControls]: panelId,
29+
});
30+
31+
const tabs = yfmTabs.create(null, [yfmTabsList.create(null, [yfmTab]), yfmTabPanel]);
32+
33+
dispatch(state.tr.replaceSelectionWith(tabs).scrollIntoView());
34+
}
35+
36+
return true;
37+
};
38+
39+
export const createYfmTabs = {
40+
isEnable: createYfmTabsCommand,
41+
run: createYfmTabsCommand,
42+
};

src/extensions/yfm/YfmTabs/index.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {ExtensionAuto} from '../../../core';
1+
import type {Action, ExtensionAuto} from '../../../core';
22

33
import {
44
joinBackwardToOpenTab,
@@ -11,9 +11,12 @@ import {YfmTabsSpecs} from './YfmTabsSpecs';
1111
import {chainCommands} from 'prosemirror-commands';
1212

1313
import {tabPanelView, tabView} from './views';
14+
import {createYfmTabs} from './actions';
1415

1516
export {TabsNode, tabType, tabsType, tabsListType, tabPanelType} from './YfmTabsSpecs';
1617

18+
const actionName = 'toYfmTabs';
19+
1720
export const YfmTabs: ExtensionAuto = (builder) => {
1821
builder.use(YfmTabsSpecs, {
1922
tabView: () => tabView,
@@ -29,4 +32,14 @@ export const YfmTabs: ExtensionAuto = (builder) => {
2932
}),
3033
builder.Priority.High,
3134
);
35+
36+
builder.addAction(actionName, () => createYfmTabs);
3237
};
38+
39+
declare global {
40+
namespace YfmEditor {
41+
interface Actions {
42+
[actionName]: Action;
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)