Skip to content

Commit f1272ef

Browse files
authored
Merge pull request #2371 from umbraco/v15/feature/rte/tiptap/toolbar-manifest-tweaks
Tiptap: Toolbar manifest tweaks
2 parents bacf0e5 + 13a488e commit f1272ef

File tree

6 files changed

+108
-89
lines changed

6 files changed

+108
-89
lines changed

src/assets/lang/en.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,4 +2628,10 @@ export default {
26282628
wordWrapConfigLabel: 'Word wrap',
26292629
wordWrapConfigDescription: 'Enable word wrapping in the code editor.',
26302630
},
2631+
tiptap: {
2632+
extGroup_formatting: 'Text formatting',
2633+
extGroup_interactive: 'Interactive elements',
2634+
extGroup_media: 'Embeds and media',
2635+
extGroup_structure: 'Content structure',
2636+
}
26312637
} as UmbLocalizationDictionary;

src/packages/rte/tiptap/extensions/core/manifests.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
1111
meta: {
1212
icon: 'icon-blockquote',
1313
label: 'Blockquote',
14-
group: 'Content Structure',
14+
group: '#tiptap_extGroup_structure',
1515
},
1616
},
1717
{
@@ -24,7 +24,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
2424
meta: {
2525
icon: 'icon-bold',
2626
label: 'Bold',
27-
group: 'Text Formatting',
27+
group: '#tiptap_extGroup_formatting',
2828
},
2929
},
3030
{
@@ -37,7 +37,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
3737
meta: {
3838
icon: 'icon-code',
3939
label: 'Code Block',
40-
group: 'Content Structure',
40+
group: '#tiptap_extGroup_structure',
4141
},
4242
},
4343
{
@@ -49,7 +49,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
4949
meta: {
5050
icon: 'icon-embed',
5151
label: '#general_embed',
52-
group: 'Media and Embeds',
52+
group: '#tiptap_extGroup_media',
5353
},
5454
},
5555
{
@@ -61,7 +61,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
6161
meta: {
6262
icon: 'icon-link',
6363
label: '#defaultdialogs_urlLinkPicker',
64-
group: 'Interactive Elements',
64+
group: '#tiptap_extGroup_interactive',
6565
},
6666
},
6767
{
@@ -73,7 +73,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
7373
meta: {
7474
icon: 'icon-frame',
7575
label: 'Figure',
76-
group: 'Media and Embeds',
76+
group: '#tiptap_extGroup_media',
7777
},
7878
},
7979
{
@@ -86,7 +86,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
8686
meta: {
8787
icon: 'icon-horizontal-rule',
8888
label: 'Horizontal Rule',
89-
group: 'Content Structure',
89+
group: '#tiptap_extGroup_structure',
9090
},
9191
},
9292
{
@@ -97,7 +97,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
9797
meta: {
9898
icon: 'icon-picture',
9999
label: 'Image',
100-
group: 'Media and Embeds',
100+
group: '#tiptap_extGroup_media',
101101
},
102102
},
103103
{
@@ -110,7 +110,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
110110
meta: {
111111
icon: 'icon-italic',
112112
label: 'Italic',
113-
group: 'Text Formatting',
113+
group: '#tiptap_extGroup_formatting',
114114
},
115115
},
116116
{
@@ -123,7 +123,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
123123
meta: {
124124
icon: 'icon-strikethrough',
125125
label: 'Strike',
126-
group: 'Text Formatting',
126+
group: '#tiptap_extGroup_formatting',
127127
},
128128
},
129129
{
@@ -162,7 +162,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
162162
meta: {
163163
icon: 'icon-table',
164164
label: 'Table',
165-
group: 'Interactive Elements',
165+
group: '#tiptap_extGroup_interactive',
166166
},
167167
},
168168
{
@@ -175,7 +175,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
175175
meta: {
176176
icon: 'icon-underline',
177177
label: 'Underline',
178-
group: 'Text Formatting',
178+
group: '#tiptap_extGroup_formatting',
179179
},
180180
},
181181
{
@@ -186,7 +186,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
186186
meta: {
187187
icon: 'icon-heading-1',
188188
label: 'Heading',
189-
group: 'Text Formatting',
189+
group: '#tiptap_extGroup_formatting',
190190
},
191191
},
192192
{
@@ -197,7 +197,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
197197
meta: {
198198
icon: 'icon-ordered-list',
199199
label: 'Ordered List',
200-
group: 'Content Structure',
200+
group: '#tiptap_extGroup_structure',
201201
},
202202
},
203203
{
@@ -208,7 +208,7 @@ export const manifests: Array<ManifestTiptapExtension> = [
208208
meta: {
209209
icon: 'icon-text-align-justify',
210210
label: 'Text Align',
211-
group: 'Content Structure',
211+
group: '#tiptap_extGroup_structure',
212212
},
213213
},
214214
];

src/packages/rte/tiptap/extensions/manifests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ const umbExtensions: Array<ManifestTiptapExtension> = [
8585
meta: {
8686
icon: 'icon-image-up',
8787
label: 'Media upload',
88-
group: 'Media and Embeds',
88+
group: '#tiptap_extGroup_media',
8989
},
9090
},
9191
];

src/packages/rte/tiptap/plugins/manifests.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ export const manifests: Array<ManifestTiptapExtension | ManifestTiptapToolbarExt
88
name: 'Block Tiptap Extension',
99
api: () => import('./block.extension.js'),
1010
meta: {
11-
icon: 'icon-block',
11+
icon: 'icon-plugin',
1212
label: 'Block',
13-
group: 'Interactive Elements',
13+
group: '#tiptap_extGroup_interactive',
1414
},
1515
},
1616
{

src/packages/rte/tiptap/property-editors/property-editor-ui-tiptap-extensions-configuration.element.ts

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ type ExtensionConfig = {
1616
group: string;
1717
};
1818

19-
type ExtensionCategoryItem = {
19+
type ExtensionGroupItem = {
2020
alias: string;
2121
label: string;
2222
icon?: string;
2323
selected: boolean;
2424
};
2525

26-
type ExtensionCategory = {
27-
category: string;
28-
extensions: ExtensionCategoryItem[];
26+
type ExtensionGroup = {
27+
group: string;
28+
extensions: ExtensionGroupItem[];
2929
};
3030

3131
@customElement('umb-property-editor-ui-tiptap-extensions-configuration')
@@ -47,7 +47,7 @@ export class UmbPropertyEditorUiTiptapExtensionsConfigurationElement
4747
config?: UmbPropertyEditorConfigCollection;
4848

4949
@state()
50-
private _extensionCategories: ExtensionCategory[] = [];
50+
private _extensionCategories: ExtensionGroup[] = [];
5151

5252
@state()
5353
private _extensionConfigs: ExtensionConfig[] = [];
@@ -56,14 +56,16 @@ export class UmbPropertyEditorUiTiptapExtensionsConfigurationElement
5656
super.firstUpdated(_changedProperties);
5757

5858
this.observe(umbExtensionsRegistry.byType('tiptapExtension'), (extensions) => {
59-
this._extensionConfigs = extensions.map((ext) => {
60-
return {
61-
alias: ext.alias,
62-
label: ext.meta.label,
63-
icon: ext.meta.icon,
64-
group: ext.meta.group,
65-
};
66-
});
59+
this._extensionConfigs = extensions
60+
.sort((a, b) => a.alias.localeCompare(b.alias))
61+
.map((ext) => {
62+
return {
63+
alias: ext.alias,
64+
label: ext.meta.label,
65+
icon: ext.meta.icon,
66+
group: ext.meta.group,
67+
};
68+
});
6769

6870
if (!this.value) {
6971
// The default value is all extensions enabled
@@ -84,21 +86,19 @@ export class UmbPropertyEditorUiTiptapExtensionsConfigurationElement
8486
};
8587
});
8688

87-
const grouped = withSelectedProperty.reduce((acc: any, item) => {
88-
const group = item.group || 'Uncategorized'; // Assign to "Uncategorized" if no group
89-
if (!acc[group]) {
90-
acc[group] = [];
91-
}
92-
acc[group].push(item);
93-
return acc;
94-
}, {});
95-
this._extensionCategories = Object.keys(grouped).map((group) => ({
96-
category: group.charAt(0).toUpperCase() + group.slice(1).replace(/-/g, ' '),
97-
extensions: grouped[group],
98-
}));
89+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
90+
// @ts-expect-error
91+
const grouped = Object.groupBy(withSelectedProperty, (item: ExtensionConfig) => item.group || 'Uncategorized');
92+
93+
this._extensionCategories = Object.keys(grouped)
94+
.sort((a, b) => a.localeCompare(b))
95+
.map((key) => ({
96+
group: key,
97+
extensions: grouped[key],
98+
}));
9999
}
100100

101-
#onExtensionClick(item: ExtensionCategoryItem) {
101+
#onExtensionClick(item: ExtensionGroupItem) {
102102
item.selected = !item.selected;
103103

104104
if (!this.value) {
@@ -120,29 +120,34 @@ export class UmbPropertyEditorUiTiptapExtensionsConfigurationElement
120120
<div class="extensions">
121121
${repeat(
122122
this._extensionCategories,
123-
(category) => html`
124-
<div class="category">
125-
<p class="category-name">${category.category}</p>
123+
(group) => html`
124+
<div class="group">
125+
<p class="group-name">${this.localize.string(group.group)}</p>
126126
${repeat(
127-
category.extensions,
128-
(item) =>
129-
html`<div class="extension-item">
127+
group.extensions,
128+
(item) => html`
129+
<div class="extension-item">
130130
<uui-button
131131
compact
132-
look="outline"
133132
class=${item.selected ? 'selected' : ''}
134-
label=${item.label}
133+
label=${this.localize.string(item.label)}
134+
look="outline"
135135
.value=${item.alias}
136-
@click=${() => this.#onExtensionClick(item)}
137-
><umb-icon name=${item.icon ?? ''}></umb-icon
138-
></uui-button>
139-
<span>${item.label}</span>
140-
</div>`,
136+
@click=${() => this.#onExtensionClick(item)}>
137+
<umb-icon name=${item.icon ?? ''}></umb-icon>
138+
</uui-button>
139+
<uui-button
140+
compact
141+
label=${this.localize.string(item.label)}
142+
look="default"
143+
style="--uui-button-content-align:left;"
144+
@click=${() => this.#onExtensionClick(item)}></uui-button>
145+
</div>
146+
`,
141147
)}
142148
</div>
143149
`,
144150
)}
145-
</div>
146151
</div>
147152
`;
148153
}
@@ -156,38 +161,43 @@ export class UmbPropertyEditorUiTiptapExtensionsConfigurationElement
156161
display: flex;
157162
vertical-align: unset;
158163
}
164+
159165
uui-button.selected {
160166
--uui-button-border-color: var(--uui-color-selected);
161167
--uui-button-border-width: 2px;
162168
}
169+
163170
.extensions {
164171
display: flex;
165172
flex-wrap: wrap;
166173
gap: 16px;
167174
margin-top: 16px;
168175
}
176+
169177
.extension-item {
170178
display: grid;
171179
grid-template-columns: 36px 1fr;
172180
grid-template-rows: 1fr;
173181
align-items: center;
174182
gap: 9px;
175183
}
176-
.category {
184+
185+
.group {
177186
flex: 1;
178-
background-color: var(--uui-color-surface-alt);
179-
padding: 12px;
180-
border-radius: 6px;
181187
display: flex;
182188
flex-direction: column;
183189
gap: 6px;
190+
padding: 12px;
191+
background-color: var(--uui-color-surface-alt);
184192
border: 1px solid var(--uui-color-border);
193+
border-radius: 6px;
185194
}
186-
.category-name {
195+
196+
.group-name {
187197
grid-column: 1 / -1;
188-
margin: 0;
189-
font-weight: bold;
190198
display: flex;
199+
font-weight: bold;
200+
margin: 0;
191201
}
192202
`,
193203
];

0 commit comments

Comments
 (0)