Skip to content

Commit b1cc8d2

Browse files
artem-harbourArtem Nistuley
authored andcommitted
feat: toolbar to headless api (state and execute)
1 parent 4ba8992 commit b1cc8d2

File tree

14 files changed

+566
-1030
lines changed

14 files changed

+566
-1030
lines changed

apps/docs/modules/toolbar/built-in.mdx

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,12 @@ const superdoc = new SuperDoc({
484484

485485
### `setZoom`
486486

487-
Set the editor zoom level programmatically.
487+
Set the editor zoom level programmatically through the owning `SuperDoc` instance.
488488

489489
<CodeGroup>
490490

491491
```javascript Usage
492-
toolbar.setZoom(150); // 150%
492+
superdoc.setZoom(150); // 150%
493493
```
494494

495495
```javascript Full Example
@@ -501,8 +501,7 @@ const superdoc = new SuperDoc({
501501
document: yourFile,
502502
toolbar: '#toolbar',
503503
onReady: (superdoc) => {
504-
const toolbar = superdoc.toolbar;
505-
toolbar.setZoom(150); // 150%
504+
superdoc.setZoom(150); // 150%
506505
},
507506
});
508507
```
@@ -536,38 +535,6 @@ const superdoc = new SuperDoc({
536535

537536
</CodeGroup>
538537

539-
## Events
540-
541-
### `superdoc-command`
542-
543-
Fired when a SuperDoc-level command is executed (zoom, document mode).
544-
545-
<CodeGroup>
546-
547-
```javascript Usage
548-
toolbar.on('superdoc-command', ({ item, argument }) => {
549-
console.log(`Command: ${item.command}, arg: ${argument}`);
550-
});
551-
```
552-
553-
```javascript Full Example
554-
import { SuperDoc } from 'superdoc';
555-
import 'superdoc/style.css';
556-
557-
const superdoc = new SuperDoc({
558-
selector: '#editor',
559-
document: yourFile,
560-
toolbar: '#toolbar',
561-
onReady: (superdoc) => {
562-
const toolbar = superdoc.toolbar;
563-
toolbar.on('superdoc-command', ({ item, argument }) => {
564-
console.log(`Command: ${item.command}, arg: ${argument}`);
565-
});
566-
},
567-
});
568-
```
569-
570-
</CodeGroup>
571538

572539
### `exception`
573540

packages/super-editor/src/editors/v1/components/toolbar/constants.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,131 @@ export const TOOLBAR_FONT_SIZES = [
5353
{ label: '72', key: '72pt', props: { 'data-item': 'btn-fontSize-option' } },
5454
{ label: '96', key: '96pt', props: { 'data-item': 'btn-fontSize-option' } },
5555
];
56+
57+
export const HEADLESS_TOOLBAR_COMMANDS = [
58+
'bold',
59+
'italic',
60+
'underline',
61+
'strikethrough',
62+
'font-size',
63+
'font-family',
64+
'text-color',
65+
'highlight-color',
66+
'link',
67+
'text-align',
68+
'line-height',
69+
'linked-style',
70+
'bullet-list',
71+
'numbered-list',
72+
'indent-increase',
73+
'indent-decrease',
74+
'undo',
75+
'redo',
76+
'ruler',
77+
'zoom',
78+
'document-mode',
79+
'clear-formatting',
80+
'copy-format',
81+
'track-changes-accept-selection',
82+
'track-changes-reject-selection',
83+
'image',
84+
'table-insert',
85+
'table-add-row-before',
86+
'table-add-row-after',
87+
'table-delete-row',
88+
'table-add-column-before',
89+
'table-add-column-after',
90+
'table-delete-column',
91+
'table-delete',
92+
'table-merge-cells',
93+
'table-split-cell',
94+
'table-remove-borders',
95+
'table-fix',
96+
];
97+
98+
export const HEADLESS_ITEM_MAP = {
99+
undo: 'undo',
100+
redo: 'redo',
101+
bold: 'bold',
102+
italic: 'italic',
103+
underline: 'underline',
104+
strike: 'strikethrough',
105+
acceptTrackedChangeBySelection: 'track-changes-accept-selection',
106+
rejectTrackedChangeOnSelection: 'track-changes-reject-selection',
107+
ruler: 'ruler',
108+
zoom: 'zoom',
109+
documentMode: 'document-mode',
110+
link: 'link',
111+
fontFamily: 'font-family',
112+
fontSize: 'font-size',
113+
list: 'bullet-list',
114+
numberedlist: 'numbered-list',
115+
table: 'table-insert',
116+
image: 'image',
117+
color: 'text-color',
118+
highlight: 'highlight-color',
119+
textAlign: 'text-align',
120+
lineHeight: 'line-height',
121+
linkedStyles: 'linked-style',
122+
indentleft: 'indent-decrease',
123+
indentright: 'indent-increase',
124+
clearFormatting: 'clear-formatting',
125+
copyFormat: 'copy-format',
126+
};
127+
128+
export const TABLE_ACTION_COMMAND_IDS = [
129+
'table-add-row-before',
130+
'table-add-row-after',
131+
'table-delete-row',
132+
'table-add-column-before',
133+
'table-add-column-after',
134+
'table-delete-column',
135+
'table-delete',
136+
'table-merge-cells',
137+
'table-split-cell',
138+
'table-remove-borders',
139+
'table-fix',
140+
];
141+
142+
export const TABLE_ACTION_COMMAND_MAP = {
143+
addRowBefore: 'table-add-row-before',
144+
addRowAfter: 'table-add-row-after',
145+
deleteRow: 'table-delete-row',
146+
addColumnBefore: 'table-add-column-before',
147+
addColumnAfter: 'table-add-column-after',
148+
deleteColumn: 'table-delete-column',
149+
deleteTable: 'table-delete',
150+
deleteCellAndTableBorders: 'table-remove-borders',
151+
mergeCells: 'table-merge-cells',
152+
splitCell: 'table-split-cell',
153+
fixTables: 'table-fix',
154+
};
155+
156+
export const HEADLESS_EXECUTE_ITEMS = new Set([
157+
'undo',
158+
'redo',
159+
'clearFormatting',
160+
'copyFormat',
161+
'ruler',
162+
'list',
163+
'numberedlist',
164+
'acceptTrackedChangeBySelection',
165+
'rejectTrackedChangeOnSelection',
166+
'indentleft',
167+
'indentright',
168+
'textAlign',
169+
'lineHeight',
170+
'linkedStyles',
171+
'table',
172+
'color',
173+
'highlight',
174+
'bold',
175+
'italic',
176+
'underline',
177+
'strike',
178+
'image',
179+
'fontFamily',
180+
'fontSize',
181+
'documentMode',
182+
'zoom',
183+
]);

packages/super-editor/src/editors/v1/components/toolbar/defaultItems.js

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -697,14 +697,6 @@ export const makeDefaultItems = ({
697697
},
698698
});
699699

700-
// const overflowOptions = useToolbarItem({
701-
// type: 'options',
702-
// name: 'overflowOptions',
703-
// preCommand(self, argument) {
704-
// self.parentItem.active = false;
705-
// },
706-
// });
707-
708700
// zoom
709701
const zoom = useToolbarItem({
710702
type: 'dropdown',
@@ -767,20 +759,6 @@ export const makeDefaultItems = ({
767759
},
768760
});
769761

770-
// Track changes test buttons
771-
const toggleTrackChanges = useToolbarItem({
772-
type: 'button',
773-
disabled: false,
774-
name: 'toggleTrackChanges',
775-
tooltip: toolbarTexts.trackChanges,
776-
command: 'toggleTrackChanges',
777-
icon: toolbarIcons.trackChanges,
778-
group: 'left',
779-
attributes: {
780-
ariaLabel: 'Track changes',
781-
},
782-
});
783-
784762
const acceptTrackedChangeBySelection = useToolbarItem({
785763
type: 'button',
786764
disabled: false,
@@ -807,32 +785,6 @@ export const makeDefaultItems = ({
807785
},
808786
});
809787

810-
const toggleTrackChangesOriginal = useToolbarItem({
811-
type: 'button',
812-
disabled: false,
813-
name: 'toggleTrackChangesShowOriginal',
814-
tooltip: toolbarTexts.trackChangesOriginal,
815-
command: 'toggleTrackChangesShowOriginal',
816-
icon: toolbarIcons.trackChangesOriginal,
817-
group: 'left',
818-
attributes: {
819-
ariaLabel: 'Toggle tracked changes show original',
820-
},
821-
});
822-
823-
const toggleTrackChangesFinal = useToolbarItem({
824-
type: 'button',
825-
disabled: false,
826-
name: 'toggleTrackChangesShowFinal',
827-
tooltip: toolbarTexts.trackChangesFinal,
828-
command: 'toggleTrackChangesShowFinal',
829-
icon: toolbarIcons.trackChangesFinal,
830-
group: 'left',
831-
attributes: {
832-
ariaLabel: 'Toggle tracked changes show final',
833-
},
834-
});
835-
836788
const clearFormatting = useToolbarItem({
837789
type: 'button',
838790
name: 'clearFormatting',
@@ -1059,13 +1011,8 @@ export const makeDefaultItems = ({
10591011
let toolbarItems = [
10601012
undo,
10611013
redo,
1062-
1063-
// Dev - tracked changes
1064-
// toggleTrackChanges,
10651014
acceptTrackedChangeBySelection,
10661015
rejectTrackedChangeOnSelection,
1067-
// toggleTrackChangesOriginal,
1068-
// toggleTrackChangesFinal,
10691016

10701017
zoom,
10711018
fontButton,
@@ -1119,8 +1066,8 @@ export const makeDefaultItems = ({
11191066
toolbarItems = toolbarItems.filter((item) => !filterItems.includes(item.name.value));
11201067
}
11211068

1122-
// Track changes test buttons
1123-
const devItems = [toggleTrackChanges, toggleTrackChangesOriginal, toggleTrackChangesFinal];
1069+
// Track changes accept/reject are hidden outside dev mode for viewers.
1070+
const devItems = [];
11241071
if (!isDev) {
11251072
if (role === 'viewer') {
11261073
devItems.push(...[acceptTrackedChangeBySelection, rejectTrackedChangeOnSelection]);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { encodeMarksFromRPr } from '@core/super-converter/styles.js';
2+
3+
export const getParagraphFontFamilyFromProperties = (paragraphProps, convertedXml = {}) => {
4+
const fontFamilyProps = paragraphProps?.runProperties?.fontFamily;
5+
if (!fontFamilyProps) return null;
6+
const [markDef] = encodeMarksFromRPr({ fontFamily: fontFamilyProps }, convertedXml);
7+
return markDef?.attrs?.fontFamily ?? null;
8+
};
9+
10+
export const findElementBySelector = (selector) => {
11+
let el = null;
12+
13+
if (selector) {
14+
if (selector.startsWith('#') || selector.startsWith('.')) {
15+
el = document.querySelector(selector);
16+
} else {
17+
el = document.getElementById(selector);
18+
}
19+
20+
if (!el) {
21+
return null;
22+
}
23+
}
24+
25+
return el;
26+
};

0 commit comments

Comments
 (0)