Skip to content

Commit f20aef8

Browse files
committed
Improve action menu labels for text blocks
Show "Delete selection" and "Duplicate selection" labels when text block handles the action itself (operating on selected paragraphs rather than the whole element). Also make section duplicate label more explicit. REDMINE-21205
1 parent aae1afb commit f20aef8

File tree

4 files changed

+67
-4
lines changed

4 files changed

+67
-4
lines changed

entry_types/scrolled/config/locales/de.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1157,8 +1157,10 @@ de:
11571157
destroy_content_element_menu_item:
11581158
confirm_destroy: Element wirklich löschen?
11591159
destroy: Element löschen
1160+
selection_label: Auswahl löschen
11601161
duplicate_content_element_menu_item:
11611162
label: Element duplizieren
1163+
selection_label: Auswahl duplizieren
11621164
destroy_section_menu_item:
11631165
confirm_destroy: Abschnitt inklusive aller Elemente wirklich löschen?
11641166
destroy: Abschnitt löschen
@@ -1292,7 +1294,7 @@ de:
12921294
scrollOver: Überlagern
12931295
section_menu_items:
12941296
copy_permalink: Permalink kopieren
1295-
duplicate: Duplizieren
1297+
duplicate: Abschnitt duplizieren
12961298
hide: Außerhalb des Editors ausblenden
12971299
insert_section_above: Abschnitt oberhalb einfügen
12981300
insert_section_below: Abschnitt unterhalb einfügen

entry_types/scrolled/config/locales/en.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1141,8 +1141,10 @@ en:
11411141
destroy_content_element_menu_item:
11421142
confirm_destroy: Really delete this element?
11431143
destroy: Delete element
1144+
selection_label: Delete selection
11441145
duplicate_content_element_menu_item:
11451146
label: Duplicate element
1147+
selection_label: Duplicate selection
11461148
destroy_section_menu_item:
11471149
confirm_destroy: Really delete this section including all its elements?
11481150
destroy: Delete section
@@ -1276,7 +1278,7 @@ en:
12761278
scrollOver: Scroll over
12771279
section_menu_items:
12781280
copy_permalink: Copy permalink
1279-
duplicate: Duplicate
1281+
duplicate: Duplicate section
12801282
hide: Hide outside of the editor
12811283
insert_section_above: Insert section above
12821284
insert_section_below: Insert section below

entry_types/scrolled/package/spec/editor/models/contentElementMenuItems-spec.js

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {factories, normalizeSeed} from 'support';
77
describe('ContentElementMenuItems', () => {
88
describe('DuplicateContentElementMenuItem', () => {
99
useFakeTranslations({
10-
'pageflow_scrolled.editor.duplicate_content_element_menu_item.label': 'Duplicate element'
10+
'pageflow_scrolled.editor.duplicate_content_element_menu_item.label': 'Duplicate element',
11+
'pageflow_scrolled.editor.duplicate_content_element_menu_item.selection_label': 'Duplicate selection'
1112
});
1213

1314
it('has Duplicate element label', () => {
@@ -18,6 +19,7 @@ describe('ContentElementMenuItems', () => {
1819
})
1920
});
2021
const contentElement = entry.contentElements.get(1);
22+
editor.contentElementTypes.register('textBlock', {});
2123

2224
const menuItem = new DuplicateContentElementMenuItem({}, {
2325
contentElement,
@@ -28,6 +30,25 @@ describe('ContentElementMenuItems', () => {
2830
expect(menuItem.get('label')).toBe('Duplicate element');
2931
});
3032

33+
it('has Duplicate selection label when handleDuplicate is defined', () => {
34+
const editor = factories.editorApi();
35+
const entry = factories.entry(ScrolledEntry, {}, {
36+
entryTypeSeed: normalizeSeed({
37+
contentElements: [{id: 1, typeName: 'textBlock'}]
38+
})
39+
});
40+
const contentElement = entry.contentElements.get(1);
41+
editor.contentElementTypes.register('textBlock', {handleDuplicate() {}});
42+
43+
const menuItem = new DuplicateContentElementMenuItem({}, {
44+
contentElement,
45+
entry,
46+
editor
47+
});
48+
49+
expect(menuItem.get('label')).toBe('Duplicate selection');
50+
});
51+
3152
it('calls duplicateContentElement on entry when selected', () => {
3253
const editor = factories.editorApi();
3354
const entry = factories.entry(ScrolledEntry, {}, {
@@ -78,6 +99,7 @@ describe('ContentElementMenuItems', () => {
7899
describe('DestroyContentElementMenuItem', () => {
79100
useFakeTranslations({
80101
'pageflow_scrolled.editor.destroy_content_element_menu_item.destroy': 'Delete element',
102+
'pageflow_scrolled.editor.destroy_content_element_menu_item.selection_label': 'Delete selection',
81103
'pageflow_scrolled.editor.destroy_content_element_menu_item.confirm_destroy': 'Really delete this element?'
82104
});
83105

@@ -89,6 +111,7 @@ describe('ContentElementMenuItems', () => {
89111
})
90112
});
91113
const contentElement = entry.contentElements.get(1);
114+
editor.contentElementTypes.register('textBlock', {});
92115

93116
const menuItem = new DestroyContentElementMenuItem({}, {
94117
contentElement,
@@ -99,6 +122,25 @@ describe('ContentElementMenuItems', () => {
99122
expect(menuItem.get('label')).toBe('Delete element');
100123
});
101124

125+
it('has Delete selection label when handleDestroy is defined', () => {
126+
const editor = factories.editorApi();
127+
const entry = factories.entry(ScrolledEntry, {}, {
128+
entryTypeSeed: normalizeSeed({
129+
contentElements: [{id: 1, typeName: 'textBlock'}]
130+
})
131+
});
132+
const contentElement = entry.contentElements.get(1);
133+
editor.contentElementTypes.register('textBlock', {handleDestroy() {}});
134+
135+
const menuItem = new DestroyContentElementMenuItem({}, {
136+
contentElement,
137+
entry,
138+
editor
139+
});
140+
141+
expect(menuItem.get('label')).toBe('Delete selection');
142+
});
143+
102144
it('calls deleteContentElement on entry when confirmed', () => {
103145
const editor = factories.editorApi();
104146
const entry = factories.entry(ScrolledEntry, {}, {

entry_types/scrolled/package/src/editor/models/contentElementMenuItems.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@ export const DuplicateContentElementMenuItem = Backbone.Model.extend({
77
this.contentElement = options.contentElement;
88
this.entry = options.entry;
99
this.editor = options.editor;
10-
this.set('label', I18n.t('pageflow_scrolled.editor.duplicate_content_element_menu_item.label'));
10+
11+
const contentElementType =
12+
this.editor.contentElementTypes.findByTypeName(this.contentElement.get('typeName'));
13+
14+
this.set('label', I18n.t(
15+
contentElementType.handleDuplicate ?
16+
'pageflow_scrolled.editor.duplicate_content_element_menu_item.selection_label' :
17+
'pageflow_scrolled.editor.duplicate_content_element_menu_item.label'
18+
));
1119
},
1220

1321
selected() {
@@ -32,6 +40,15 @@ export const DestroyContentElementMenuItem = DestroyMenuItem.extend({
3240
this.editor = options.editor;
3341

3442
DestroyMenuItem.prototype.initialize.call(this, attributes, options);
43+
44+
const contentElementType =
45+
this.editor.contentElementTypes.findByTypeName(this.contentElement.get('typeName'));
46+
47+
if (contentElementType.handleDestroy) {
48+
this.set('label', I18n.t(
49+
'pageflow_scrolled.editor.destroy_content_element_menu_item.selection_label'
50+
));
51+
}
3552
},
3653

3754
destroyModel() {

0 commit comments

Comments
 (0)