@syncfusion/ej2-ribbon 30.2.4 → 31.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/ej2-ribbon.umd.min.js +1 -1
  2. package/dist/global/ej2-ribbon.min.js +1 -1
  3. package/dist/global/index.d.ts +1 -1
  4. package/dist/ts/index.d.ts +1 -0
  5. package/dist/ts/index.ts +3 -0
  6. package/dist/ts/ribbon/base/constant.d.ts +201 -0
  7. package/dist/ts/ribbon/base/constant.ts +204 -0
  8. package/dist/ts/ribbon/base/index.d.ts +8 -0
  9. package/dist/ts/ribbon/base/index.ts +8 -0
  10. package/dist/ts/ribbon/base/interface.d.ts +398 -0
  11. package/dist/ts/ribbon/base/interface.ts +424 -0
  12. package/dist/ts/ribbon/base/ribbon-model.d.ts +195 -0
  13. package/dist/ts/ribbon/base/ribbon.d.ts +608 -0
  14. package/dist/ts/ribbon/base/ribbon.ts +4896 -0
  15. package/dist/ts/ribbon/base/utils.d.ts +139 -0
  16. package/dist/ts/ribbon/base/utils.ts +341 -0
  17. package/dist/ts/ribbon/index.d.ts +7 -0
  18. package/dist/ts/ribbon/index.ts +7 -0
  19. package/dist/ts/ribbon/items/index.d.ts +8 -0
  20. package/dist/ts/ribbon/items/index.ts +8 -0
  21. package/dist/ts/ribbon/items/ribbon-button.d.ts +64 -0
  22. package/dist/ts/ribbon/items/ribbon-button.ts +160 -0
  23. package/dist/ts/ribbon/items/ribbon-checkbox.d.ts +55 -0
  24. package/dist/ts/ribbon/items/ribbon-checkbox.ts +130 -0
  25. package/dist/ts/ribbon/items/ribbon-colorpicker.d.ts +72 -0
  26. package/dist/ts/ribbon/items/ribbon-colorpicker.ts +228 -0
  27. package/dist/ts/ribbon/items/ribbon-combobox.d.ts +77 -0
  28. package/dist/ts/ribbon/items/ribbon-combobox.ts +201 -0
  29. package/dist/ts/ribbon/items/ribbon-dropdown.d.ts +128 -0
  30. package/dist/ts/ribbon/items/ribbon-dropdown.ts +400 -0
  31. package/dist/ts/ribbon/items/ribbon-gallery.d.ts +97 -0
  32. package/dist/ts/ribbon/items/ribbon-gallery.ts +773 -0
  33. package/dist/ts/ribbon/items/ribbon-groupbutton.d.ts +73 -0
  34. package/dist/ts/ribbon/items/ribbon-groupbutton.ts +531 -0
  35. package/dist/ts/ribbon/items/ribbon-splitbutton.d.ts +85 -0
  36. package/dist/ts/ribbon/items/ribbon-splitbutton.ts +257 -0
  37. package/dist/ts/ribbon/models/index.d.ts +42 -0
  38. package/dist/ts/ribbon/models/index.ts +44 -0
  39. package/dist/ts/ribbon/models/ribbon-back-button-model.d.ts +29 -0
  40. package/dist/ts/ribbon/models/ribbon-back-button.d.ts +24 -0
  41. package/dist/ts/ribbon/models/ribbon-back-button.ts +31 -0
  42. package/dist/ts/ribbon/models/ribbon-back-stage-settings-model.d.ts +83 -0
  43. package/dist/ts/ribbon/models/ribbon-back-stage-settings.d.ts +81 -0
  44. package/dist/ts/ribbon/models/ribbon-back-stage-settings.ts +109 -0
  45. package/dist/ts/ribbon/models/ribbon-backstage-item-model.d.ts +69 -0
  46. package/dist/ts/ribbon/models/ribbon-backstage-item.d.ts +80 -0
  47. package/dist/ts/ribbon/models/ribbon-backstage-item.ts +102 -0
  48. package/dist/ts/ribbon/models/ribbon-button-settings-model.d.ts +64 -0
  49. package/dist/ts/ribbon/models/ribbon-button-settings.d.ts +63 -0
  50. package/dist/ts/ribbon/models/ribbon-button-settings.ts +80 -0
  51. package/dist/ts/ribbon/models/ribbon-checkbox-settings-model.d.ts +57 -0
  52. package/dist/ts/ribbon/models/ribbon-checkbox-settings.d.ts +58 -0
  53. package/dist/ts/ribbon/models/ribbon-checkbox-settings.ts +74 -0
  54. package/dist/ts/ribbon/models/ribbon-collection-model.d.ts +30 -0
  55. package/dist/ts/ribbon/models/ribbon-collection.d.ts +33 -0
  56. package/dist/ts/ribbon/models/ribbon-collection.ts +45 -0
  57. package/dist/ts/ribbon/models/ribbon-colorpicker-settings-model.d.ts +137 -0
  58. package/dist/ts/ribbon/models/ribbon-colorpicker-settings.d.ts +129 -0
  59. package/dist/ts/ribbon/models/ribbon-colorpicker-settings.ts +165 -0
  60. package/dist/ts/ribbon/models/ribbon-combobox-settings-model.d.ts +275 -0
  61. package/dist/ts/ribbon/models/ribbon-combobox-settings.d.ts +257 -0
  62. package/dist/ts/ribbon/models/ribbon-combobox-settings.ts +313 -0
  63. package/dist/ts/ribbon/models/ribbon-contextual-tab-settings-model.d.ts +30 -0
  64. package/dist/ts/ribbon/models/ribbon-contextual-tab-settings.d.ts +33 -0
  65. package/dist/ts/ribbon/models/ribbon-contextual-tab-settings.ts +44 -0
  66. package/dist/ts/ribbon/models/ribbon-dropdown-settings-model.d.ts +114 -0
  67. package/dist/ts/ribbon/models/ribbon-dropdown-settings.d.ts +107 -0
  68. package/dist/ts/ribbon/models/ribbon-dropdown-settings.ts +139 -0
  69. package/dist/ts/ribbon/models/ribbon-file-menu-settings-model.d.ts +123 -0
  70. package/dist/ts/ribbon/models/ribbon-file-menu-settings.d.ts +173 -0
  71. package/dist/ts/ribbon/models/ribbon-file-menu-settings.ts +220 -0
  72. package/dist/ts/ribbon/models/ribbon-gallery-group-model.d.ts +44 -0
  73. package/dist/ts/ribbon/models/ribbon-gallery-group.d.ts +38 -0
  74. package/dist/ts/ribbon/models/ribbon-gallery-group.ts +50 -0
  75. package/dist/ts/ribbon/models/ribbon-gallery-item-model.d.ts +43 -0
  76. package/dist/ts/ribbon/models/ribbon-gallery-item.d.ts +38 -0
  77. package/dist/ts/ribbon/models/ribbon-gallery-item.ts +47 -0
  78. package/dist/ts/ribbon/models/ribbon-gallery-settings-model.d.ts +108 -0
  79. package/dist/ts/ribbon/models/ribbon-gallery-settings.d.ts +95 -0
  80. package/dist/ts/ribbon/models/ribbon-gallery-settings.ts +123 -0
  81. package/dist/ts/ribbon/models/ribbon-group-button-item-model.d.ts +64 -0
  82. package/dist/ts/ribbon/models/ribbon-group-button-item.d.ts +65 -0
  83. package/dist/ts/ribbon/models/ribbon-group-button-item.ts +85 -0
  84. package/dist/ts/ribbon/models/ribbon-group-button-settings-model.d.ts +32 -0
  85. package/dist/ts/ribbon/models/ribbon-group-button-settings.d.ts +29 -0
  86. package/dist/ts/ribbon/models/ribbon-group-button-settings.ts +38 -0
  87. package/dist/ts/ribbon/models/ribbon-group-model.d.ts +112 -0
  88. package/dist/ts/ribbon/models/ribbon-group.d.ts +105 -0
  89. package/dist/ts/ribbon/models/ribbon-group.ts +138 -0
  90. package/dist/ts/ribbon/models/ribbon-item-model.d.ts +144 -0
  91. package/dist/ts/ribbon/models/ribbon-item.d.ts +141 -0
  92. package/dist/ts/ribbon/models/ribbon-item.ts +190 -0
  93. package/dist/ts/ribbon/models/ribbon-splitbutton-settings-model.d.ts +114 -0
  94. package/dist/ts/ribbon/models/ribbon-splitbutton-settings.d.ts +107 -0
  95. package/dist/ts/ribbon/models/ribbon-splitbutton-settings.ts +140 -0
  96. package/dist/ts/ribbon/models/ribbon-tab-model.d.ts +44 -0
  97. package/dist/ts/ribbon/models/ribbon-tab.d.ts +45 -0
  98. package/dist/ts/ribbon/models/ribbon-tab.ts +61 -0
  99. package/dist/ts/ribbon/models/ribbon-tooltip-model.d.ts +43 -0
  100. package/dist/ts/ribbon/models/ribbon-tooltip.d.ts +36 -0
  101. package/dist/ts/ribbon/models/ribbon-tooltip.ts +47 -0
  102. package/dist/ts/ribbon/modules/index.d.ts +4 -0
  103. package/dist/ts/ribbon/modules/index.ts +5 -0
  104. package/dist/ts/ribbon/modules/ribbon-backstage.d.ts +117 -0
  105. package/dist/ts/ribbon/modules/ribbon-backstage.ts +620 -0
  106. package/dist/ts/ribbon/modules/ribbon-contextualtab.d.ts +27 -0
  107. package/dist/ts/ribbon/modules/ribbon-contextualtab.ts +93 -0
  108. package/dist/ts/ribbon/modules/ribbon-filemenu.d.ts +96 -0
  109. package/dist/ts/ribbon/modules/ribbon-filemenu.ts +353 -0
  110. package/dist/ts/ribbon/modules/ribbon-keytip.d.ts +56 -0
  111. package/dist/ts/ribbon/modules/ribbon-keytip.ts +580 -0
  112. package/package.json +55 -19
@@ -0,0 +1,620 @@
1
+ import { remove, append, Component, EventHandler, KeyboardEventArgs } from '@syncfusion/ej2-base';
2
+ import { Menu, MenuEventArgs } from '@syncfusion/ej2-navigations';
3
+ import { BackStageMenu, BackStageMenuModel, BackstageItemClickArgs, BackstageItemModel } from '../models/index';
4
+ import { commonProperties, getIndex, Ribbon, ribbonTooltipData } from '../base/index';
5
+ import { getTemplateFunction, isTooltipPresent } from '../base/utils';
6
+ import * as constants from '../base/constant';
7
+ import { Button } from '@syncfusion/ej2-buttons';
8
+ import { Popup } from '@syncfusion/ej2-popups';
9
+
10
+ /**
11
+ * Defines the items of Ribbon.
12
+ */
13
+ export class RibbonBackstage extends Component<HTMLElement> {
14
+ private parent: Ribbon;
15
+ private backstageButton: Button;
16
+ private popupEle: Popup;
17
+ private menuCtrl: Menu;
18
+ private footerMenuCtrl: Menu;
19
+ private backstageButtonEle: HTMLButtonElement;
20
+ private closeBtn: Button;
21
+ private popupHTMLElement: HTMLElement;
22
+ private backstageContentEle: HTMLElement;
23
+ private ulMenuElem: HTMLUListElement;
24
+ private isBackButtonClicked: boolean;
25
+ private menuWrapper: HTMLElement;
26
+ private contentItem: BackstageItemModel;
27
+ private backstageTempEle: HTMLElement;
28
+ private itemsWrapperEle: HTMLElement;
29
+ private menuIndex: number;
30
+ private isCloseBtn: boolean;
31
+
32
+ constructor(parent: Ribbon) {
33
+ super();
34
+ this.parent = parent;
35
+ }
36
+
37
+ /**
38
+ * @private
39
+ * @returns {void}
40
+ */
41
+ protected render(): void {
42
+ // render code
43
+ }
44
+
45
+ /**
46
+ * @private
47
+ * @returns {void}
48
+ */
49
+ protected preRender(): void {
50
+ // pre render code
51
+ }
52
+
53
+ protected getPersistData(): string {
54
+ return '';
55
+ }
56
+
57
+ /**
58
+ * This method is abstract member of the Component<HTMLElement>.
59
+ *
60
+ * @private
61
+ * @returns {void}
62
+ */
63
+ protected onPropertyChanged(): void {
64
+ // onProperty changes code
65
+ }
66
+
67
+ protected getModuleName(): string {
68
+ return 'ribbonBackstage';
69
+ }
70
+
71
+ protected destroy(): void {
72
+ if (this.backstageButton) {
73
+ this.destroyDDB();
74
+ }
75
+ this.parent = null;
76
+ }
77
+
78
+ /**
79
+ * Creates Backstage Menu
80
+ *
81
+ * @param {BackStageMenuModel} backStageOptions - Gets the property of backstage.
82
+ * @returns {void}
83
+ * @hidden
84
+ */
85
+ public createBackStage(backStageOptions: BackStageMenuModel): void {
86
+ if (!backStageOptions.visible) {
87
+ return;
88
+ }
89
+ this.backstageButtonEle = this.parent.createElement('button', {
90
+ id: this.parent.element.id + constants.RIBBON_BACKSTAGE_MENU_ID
91
+ });
92
+ const tabEle: HTMLElement = this.parent.tabObj.element;
93
+ const toolbarEle: HTMLElement = tabEle.querySelector('.e-toolbar');
94
+ tabEle.insertBefore(this.backstageButtonEle, toolbarEle);
95
+ this.backstageButton = new Button({
96
+ content: backStageOptions.text,
97
+ enableRtl: this.parent.enableRtl,
98
+ cssClass: constants.RIBBON_BACKSTAGE,
99
+ created: () => {
100
+ tabEle.style.setProperty(constants.RIBBON_FILE_MENU_WIDTH, this.backstageButtonEle.offsetWidth + 'px');
101
+ }
102
+ }, this.backstageButtonEle);
103
+ this.createBackStagePopup(backStageOptions);
104
+ if (this.parent.backStageMenu.template) {
105
+ this.createBackStageTemplate(this.parent.backStageMenu.template);
106
+ } else {
107
+ let footerItemCount: number = 0;
108
+ let itemCount: number = 0;
109
+ for (let i: number = 0; i < backStageOptions.items.length; i++) {
110
+ const item: BackstageItemModel = backStageOptions.items[parseInt(i.toString(), 10)];
111
+ if (item.isFooter) { footerItemCount++; }
112
+ else { itemCount++; }
113
+ }
114
+ if (itemCount > 0) { this.createBackstageMenu(backStageOptions, false); }
115
+ if (footerItemCount > 0) { this.createBackstageMenu(backStageOptions, true); }
116
+ if (this.menuCtrl) { this.checkMenuItems(this.menuCtrl.items); }
117
+ if (this.footerMenuCtrl) { this.checkMenuItems(this.footerMenuCtrl.items); }
118
+ }
119
+ this.backstageButtonEle.onclick = (e: MouseEvent): void => {
120
+ e.stopPropagation();
121
+ this.showBackstage();
122
+ this.popupHTMLElement.classList.add(constants.RIBBON_BACKSTAGE_OPEN);
123
+ const menuItem: HTMLElement = this.menuWrapper.querySelector('.e-menu-item.e-selected');
124
+ if (menuItem) { menuItem.classList.remove('e-selected'); }
125
+ for (let i: number = 0; i < backStageOptions.items.length; i++) {
126
+ const item: BackstageItemModel = backStageOptions.items[parseInt(i.toString(), 10)];
127
+ if (!item.isFooter && this.menuCtrl.items[0].text === item.text) {
128
+ const firstMenuEle: HTMLElement = this.popupHTMLElement.querySelector('#' + this.menuCtrl.items[0].id);
129
+ if (firstMenuEle) {
130
+ firstMenuEle.classList.add('e-selected');
131
+ firstMenuEle.focus();
132
+ this.menuIndex = 0;
133
+ this.isCloseBtn = false;
134
+ }
135
+ this.createBackStageContent(this.menuCtrl.items[0].id, item.content);
136
+ break;
137
+ }
138
+ else { continue; }
139
+ }
140
+ };
141
+ this.parent.tabObj.refreshActiveTabBorder();
142
+ this.addBackStageMenuTooltip(backStageOptions);
143
+ this.addBackStageMenuKeyTip(backStageOptions);
144
+ EventHandler.add(document, 'click', this.onClickEvent, this);
145
+ }
146
+
147
+ private onClickEvent(e: MouseEvent): void {
148
+ const targetEle: HTMLElement = e.target as HTMLElement;
149
+ if (this.popupHTMLElement.contains(targetEle)) { return; }
150
+ else { this.hideBackstage(); }
151
+ }
152
+
153
+ private addBackStageMenuTooltip(backStageOptions: BackStageMenuModel): void {
154
+ if (isTooltipPresent(backStageOptions.ribbonTooltipSettings)) {
155
+ this.backstageButtonEle.classList.add(constants.RIBBON_TOOLTIP_TARGET);
156
+ this.parent.tooltipData.push({ id: this.backstageButtonEle.id, data: backStageOptions.ribbonTooltipSettings });
157
+ }
158
+ }
159
+
160
+ private addBackStageMenuKeyTip(backStageOptions: BackStageMenuModel): void {
161
+ if (backStageOptions.keyTip) {
162
+ if (!((this.parent.keyTipElements as {[key: string]: object})['backstage'])) {
163
+ (this.parent.keyTipElements as {[key: string]: object})['backstage'] = [];
164
+ }
165
+ ((this.parent.keyTipElements as {[key: string]: object})['backstage'] as object[]).push({ id: this.backstageButtonEle.id, type: 'backstage', keyTip: backStageOptions.keyTip});
166
+ }
167
+ if (backStageOptions.items && backStageOptions.items.length) {
168
+ if (!((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'])) {
169
+ (this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] = [];
170
+ }
171
+ for (let i: number = 0; i < backStageOptions.items.length; i++) {
172
+ if (backStageOptions.items[parseInt(i.toString(), 10)].keyTip) {
173
+ ((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] as object[]).push({ id: backStageOptions.items[parseInt(i.toString(), 10)].id, type: 'backstageMenu', keyTip: backStageOptions.items[parseInt(i.toString(), 10)].keyTip});
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ private checkMenuItems(backStageItems: BackstageItemModel[]): void {
180
+ for (let i: number = 0; i < backStageItems.length; i++) {
181
+ const item: BackstageItemModel = backStageItems[parseInt(i.toString(), 10)];
182
+ if (!item.iconCss) {
183
+ const menuItemEle: HTMLElement = this.popupHTMLElement.querySelector('#' + item.id);
184
+ menuItemEle.classList.add(constants.RIBBON_BACKSTAGE_TEXT_MENU);
185
+ }
186
+ }
187
+ }
188
+
189
+ private createBackStagePopup(backStageOptions: BackStageMenuModel): void {
190
+ this.popupHTMLElement = this.parent.createElement('div', {
191
+ id: this.parent.element.id + constants.RIBBON_BACKSTAGE_POPUP_ID,
192
+ className: constants.RIBBON_BACKSTAGE_POPUP
193
+ });
194
+ let targetEle: HTMLElement;
195
+ if (backStageOptions.target) {
196
+ targetEle = backStageOptions.target instanceof HTMLElement ? backStageOptions.target :
197
+ document.querySelector(backStageOptions.target);
198
+ targetEle.appendChild(this.popupHTMLElement);
199
+ }
200
+ else {
201
+ this.parent.element.appendChild(this.popupHTMLElement);
202
+ }
203
+ this.popupEle = new Popup(this.popupHTMLElement as HTMLElement, {
204
+ height: backStageOptions.height,
205
+ width: backStageOptions.width,
206
+ relateTo: backStageOptions.target || this.parent.element,
207
+ enableRtl: this.parent.enableRtl
208
+ });
209
+ if (this.parent.enableRtl) { this.updatePopupPositionOnRtl(this.parent.enableRtl); }
210
+ this.hideBackstage();
211
+ EventHandler.add(this.popupHTMLElement, 'keyup', (e: KeyboardEventArgs) => {
212
+ if (e.code === 'Escape') { this.hideBackstage(); }
213
+ this.handleNavigation(e);
214
+ }, this);
215
+ }
216
+
217
+ private handleNavigation(e: KeyboardEventArgs): void {
218
+ const closeBtnEle: HTMLElement = this.popupHTMLElement.querySelector('.e-ribbon-close-btn');
219
+ const menuItems: NodeListOf<Element> = this.popupHTMLElement.querySelectorAll('.e-menu-item');
220
+ const arrowUp: boolean = e.key === 'ArrowUp';
221
+ const arrowDown: boolean = e.key === 'ArrowDown';
222
+ if (arrowUp || arrowDown) {
223
+ if ((arrowUp && this.menuIndex > 0) || (arrowDown && this.menuIndex < menuItems.length - 1 && !this.isCloseBtn)) {
224
+ this.menuIndex = arrowUp ? this.menuIndex - 1 : this.menuIndex + 1;
225
+ } else {
226
+ if (closeBtnEle && !this.isCloseBtn) {
227
+ closeBtnEle.focus();
228
+ this.isCloseBtn = true;
229
+ } else {
230
+ this.menuIndex = arrowUp ? menuItems.length - 1 : 0;
231
+ this.isCloseBtn = false;
232
+ }
233
+ }
234
+ for (let i: number = 0; i < menuItems.length; i++) {
235
+ menuItems[parseInt(i.toString(), 10)].classList.remove('e-focused');
236
+ }
237
+ if (!this.isCloseBtn) {
238
+ if (arrowUp && menuItems[this.menuIndex].classList.contains('e-separator')) {
239
+ this.menuIndex--;
240
+ } else if (arrowDown && menuItems[this.menuIndex].classList.contains('e-separator')) {
241
+ this.menuIndex++;
242
+ }
243
+ menuItems[this.menuIndex].classList.add('e-focused');
244
+ (menuItems[this.menuIndex] as HTMLElement).focus();
245
+ }
246
+ }
247
+ }
248
+
249
+ private updatePopupPositionOnRtl (enableRtl: boolean): void {
250
+ const popupStyle: CSSStyleDeclaration = this.popupHTMLElement.style;
251
+ if (enableRtl) {
252
+ popupStyle.right = popupStyle.left;
253
+ popupStyle.left = 'unset';
254
+ }
255
+ else {
256
+ popupStyle.left = popupStyle.right;
257
+ popupStyle.right = 'unset';
258
+ }
259
+ }
260
+
261
+ private createBackstageMenu(menuOptions: BackStageMenuModel, isFooter: boolean): void {
262
+ const wrapperEle: HTMLElement = this.popupHTMLElement.querySelector('#' + this.parent.element.id + '_wrapper');
263
+ if (!wrapperEle) {
264
+ this.menuWrapper = this.parent.createElement('div', {
265
+ id: this.parent.element.id + '_wrapper',
266
+ className: constants.RIBBON_BACKSTAGE_MENU_WRAPPER
267
+ });
268
+ this.popupHTMLElement.appendChild(this.menuWrapper);
269
+ }
270
+ if (menuOptions.backButton.visible && !isFooter) {
271
+ const closeBtnEle: HTMLButtonElement = this.parent.createElement('button', {
272
+ id: this.parent.element.id + '_close',
273
+ className: 'e-ribbon-close-btn'
274
+ });
275
+ this.closeBtn = new Button({
276
+ content: menuOptions.backButton.text,
277
+ iconCss: menuOptions.backButton.iconCss ? menuOptions.backButton.iconCss : constants.BACKSTAGE_CLOSE_ICON,
278
+ enableRtl: this.parent.enableRtl
279
+ }, closeBtnEle);
280
+ this.menuWrapper.append(closeBtnEle);
281
+ closeBtnEle.onclick = (): void => {
282
+ this.popupHTMLElement.classList.remove(constants.RIBBON_BACKSTAGE_OPEN);
283
+ this.hideBackstage();
284
+ this.isBackButtonClicked = true;
285
+ };
286
+ }
287
+ const itemsWrapperEle: HTMLElement = this.popupHTMLElement.querySelector('#' + this.parent.element.id + '_itemswrapper');
288
+ if (!itemsWrapperEle) {
289
+ this.itemsWrapperEle = this.parent.createElement('div', {
290
+ id: this.parent.element.id + '_itemswrapper',
291
+ className: constants.RIBBON_BACKSTAGE_ITEMS_WRAPPER
292
+ });
293
+ this.menuWrapper.append(this.itemsWrapperEle);
294
+ }
295
+ let ulFooterElem: HTMLUListElement;
296
+ if (isFooter) {
297
+ ulFooterElem = this.parent.createElement('ul', {
298
+ id: this.parent.element.id + constants.RIBBON_FOOTER_MENU_LIST
299
+ });
300
+ this.itemsWrapperEle.appendChild(ulFooterElem);
301
+ }
302
+ else {
303
+ this.ulMenuElem = this.parent.createElement('ul', {
304
+ id: this.parent.element.id + constants.RIBBON_MENU_LIST
305
+ });
306
+ this.itemsWrapperEle.appendChild(this.ulMenuElem);
307
+ }
308
+ if (!isFooter) {
309
+ this.menuCtrl = new Menu({
310
+ orientation: 'Vertical',
311
+ enableRtl: this.parent.enableRtl,
312
+ cssClass: constants.RIBBON_BACKSTAGE_MENU,
313
+ items: this.cloneMenuItem(menuOptions.items),
314
+ select: this.menuSelect.bind(this, menuOptions)
315
+ }, this.ulMenuElem);
316
+ }
317
+ else {
318
+ this.footerMenuCtrl = new Menu({
319
+ orientation: 'Vertical',
320
+ enableRtl: this.parent.enableRtl,
321
+ cssClass: constants.RIBBON_BACKSTAGE_MENU,
322
+ items: this.cloneFooterMenuItem(menuOptions.items),
323
+ select: this.menuSelect.bind(this, menuOptions)
324
+ }, ulFooterElem);
325
+ }
326
+ }
327
+
328
+ private cloneMenuItem(items: BackstageItemModel[]): BackstageItemModel[] {
329
+ const itemsList: BackstageItemModel[] = [];
330
+ for (let i: number = 0; i < items.length; i++) {
331
+ const item: BackstageItemModel = items[parseInt(i.toString(), 10)];
332
+ if (item.isFooter) { continue; }
333
+ else {
334
+ itemsList.push({
335
+ id: item.id,
336
+ iconCss: item.iconCss,
337
+ separator: item.separator,
338
+ text: item.text
339
+ });
340
+ }
341
+ }
342
+ return itemsList;
343
+ }
344
+
345
+ private cloneFooterMenuItem(items: BackstageItemModel[]): BackstageItemModel[] {
346
+ const itemsList: BackstageItemModel[] = [];
347
+ for (let i: number = 0; i < items.length; i++) {
348
+ const item: BackstageItemModel = items[parseInt(i.toString(), 10)];
349
+ if (!item.isFooter) { continue; }
350
+ else {
351
+ itemsList.push({
352
+ id: item.id,
353
+ iconCss: item.iconCss,
354
+ separator: item.separator,
355
+ text: item.text
356
+ });
357
+ }
358
+ }
359
+ return itemsList;
360
+ }
361
+
362
+ private createBackStageContent(itemId: string | Object, content: string | Function): string | Function {
363
+ const templateName: string = 'backstageContent';
364
+ this.clearTemplate([templateName]);
365
+ if (!this.backstageContentEle) {
366
+ this.backstageContentEle = this.parent.createElement('div', {
367
+ id: itemId + constants.CONTENT_ID,
368
+ className: constants.RIBBON_BACKSTAGE_CONTENT
369
+ });
370
+ }
371
+ else {
372
+ this.backstageContentEle.innerHTML = '';
373
+ this.backstageContentEle.id = itemId + constants.CONTENT_ID;
374
+ }
375
+ const templateFunction: Function = getTemplateFunction(content);
376
+ append(templateFunction({}, this, templateName, 'backstageContent', this.parent.isStringTemplate), this.backstageContentEle);
377
+ if (content) {
378
+ this.popupHTMLElement.append(this.backstageContentEle);
379
+ }
380
+ this.renderReactTemplates();
381
+ return templateFunction;
382
+ }
383
+
384
+ private createBackStageTemplate(template: string | Function): string | Function {
385
+ const templateName: string = 'backstageTemplate';
386
+ this.clearTemplate([templateName]);
387
+ this.backstageTempEle = this.parent.createElement('div', {
388
+ id: this.parent.element.id + constants.RIBBON_BACKSTAGE_MENU_ID + '_template',
389
+ className: constants.RIBBON_BACKSTAGE_TEMPLATE
390
+ });
391
+ const templateFunction: Function = getTemplateFunction(template);
392
+ append(templateFunction({}, this, templateName, 'backstageTemplate', this.parent.isStringTemplate), this.backstageTempEle);
393
+ this.popupHTMLElement.append(this.backstageTempEle);
394
+ this.renderReactTemplates();
395
+ return templateFunction;
396
+ }
397
+
398
+ private menuSelect(menuOptions: BackStageMenuModel, args: MenuEventArgs): void {
399
+ for (let i: number = 0; i < menuOptions.items.length; i++) {
400
+ const item: BackstageItemModel = menuOptions.items[parseInt(i.toString(), 10)];
401
+ if (item.text === args.item.text) {
402
+ this.contentItem = item;
403
+ this.menuIndex = i;
404
+ break;
405
+ }
406
+ }
407
+ this.createBackStageContent(args.item.id, this.contentItem.content);
408
+ const eventArgs: BackstageItemClickArgs = { cancel: false, target: args.element,
409
+ item: this.contentItem, isBackButton: this.isBackButtonClicked };
410
+ if (this.contentItem.backStageItemClick) { this.contentItem.backStageItemClick.call(this, eventArgs); }
411
+ if (eventArgs.cancel) { return; }
412
+ }
413
+
414
+ /**
415
+ * setRtl
416
+ *
417
+ * @param {commonProperties} commonProp - Get the common property of ribbon.
418
+ * @returns {void}
419
+ * @hidden
420
+ */
421
+ public setCommonProperties(commonProp: commonProperties): void {
422
+ if (this.backstageButton) {
423
+ this.backstageButton.setProperties(commonProp);
424
+ if (this.popupEle) {
425
+ this.popupEle.setProperties(commonProp);
426
+ if (this.popupHTMLElement) { this.updatePopupPositionOnRtl(commonProp.enableRtl); }
427
+ if (this.menuCtrl) {
428
+ this.menuCtrl.setProperties(commonProp);
429
+ if (this.closeBtn) {
430
+ this.closeBtn.setProperties(commonProp);
431
+ }
432
+ }
433
+ if (this.footerMenuCtrl) {
434
+ this.footerMenuCtrl.setProperties(commonProp);
435
+ }
436
+ }
437
+ }
438
+ }
439
+
440
+ /**
441
+ * Update Backstage menu
442
+ *
443
+ * @param {BackStageMenuModel} backStageOptions - Gets the property of backstage menu.
444
+ * @returns {void}
445
+ * @hidden
446
+ */
447
+ public updateBackStageMenu(backStageOptions: BackStageMenuModel): void {
448
+ if (backStageOptions.visible) {
449
+ if (this.backstageButton) {
450
+ if (backStageOptions.text) {
451
+ this.backstageButton.setProperties({
452
+ content: backStageOptions.text
453
+ });
454
+ this.parent.tabObj.element.style.setProperty(constants.RIBBON_FILE_MENU_WIDTH, this.backstageButtonEle.offsetWidth + 'px');
455
+ }
456
+ if (this.popupEle) {
457
+ this.popupEle.setProperties({
458
+ height: backStageOptions.height,
459
+ width: backStageOptions.width,
460
+ target: backStageOptions.target || this.parent.element
461
+ });
462
+ }
463
+ if (backStageOptions.template) {
464
+ if (this.backstageTempEle) {
465
+ remove(this.backstageTempEle);
466
+ this.backstageTempEle = null;
467
+ }
468
+ this.createBackStageTemplate(backStageOptions.template);
469
+ }
470
+ else {
471
+ if (this.menuCtrl) {
472
+ this.menuCtrl.setProperties({
473
+ items: this.cloneMenuItem(backStageOptions.items)
474
+ });
475
+ }
476
+ if (this.footerMenuCtrl) {
477
+ this.footerMenuCtrl.setProperties({
478
+ items: this.cloneFooterMenuItem(backStageOptions.items)
479
+ });
480
+ }
481
+ else {
482
+ let footerItemCount: number = 0;
483
+ let itemCount: number = 0;
484
+ for (let i: number = 0; i < backStageOptions.items.length; i++) {
485
+ const item: BackstageItemModel = backStageOptions.items[parseInt(i.toString(), 10)];
486
+ if (item.isFooter) { footerItemCount++; }
487
+ else { itemCount++; }
488
+ }
489
+ if (itemCount > 0) { this.createBackstageMenu(backStageOptions, false); }
490
+ if (footerItemCount > 0) { this.createBackstageMenu(backStageOptions, true); }
491
+ }
492
+ }
493
+ this.removeBackstageMenuTooltip();
494
+ this.removeBackstageMenuKeyTip();
495
+ this.addBackStageMenuTooltip(backStageOptions);
496
+ this.addBackStageMenuKeyTip(backStageOptions);
497
+ }
498
+ else {
499
+ this.createBackStage(backStageOptions);
500
+ }
501
+ }
502
+ else if (this.backstageButton) {
503
+ this.destroyDDB();
504
+ }
505
+ this.parent.tabObj.refreshActiveTabBorder();
506
+ }
507
+
508
+ private destroyMenu(): void {
509
+ if (this.menuCtrl) {
510
+ this.menuCtrl.destroy();
511
+ this.menuCtrl = null;
512
+ }
513
+ }
514
+
515
+ private destroyDDB(): void {
516
+ this.removeBackstageMenuTooltip();
517
+ this.removeBackstageMenuKeyTip();
518
+ const tabEle: HTMLElement = this.parent.tabObj.element;
519
+ tabEle.style.removeProperty(constants.RIBBON_FILE_MENU_WIDTH);
520
+ this.destroyMenu();
521
+ this.backstageButton.destroy();
522
+ this.backstageButton = null;
523
+ remove(this.backstageButtonEle);
524
+ this.backstageButtonEle = null;
525
+ EventHandler.remove(document, 'click', this.onClickEvent);
526
+ }
527
+
528
+ private removeBackstageMenuTooltip(): void {
529
+ const index: number = getIndex(this.parent.tooltipData, (e: ribbonTooltipData) => { return e.id === this.backstageButtonEle.id; });
530
+ if (index !== -1) {
531
+ this.backstageButtonEle.classList.remove(constants.RIBBON_TOOLTIP_TARGET);
532
+ this.parent.tooltipData.splice(index, 1);
533
+ }
534
+ }
535
+ private removeBackstageMenuKeyTip(): void {
536
+ if ((this.parent.keyTipElements as {[key: string]: object})['backstage'] && ((this.parent.keyTipElements as {[key: string]: object})['backstage'] as object[]).length) {
537
+ const index: number = getIndex((this.parent.keyTipElements as {[key: string]: object})['backstage'] as {id : string}[], (e: {id: string }) => { return e.id === this.backstageButtonEle.id; });
538
+ if (index !== -1) {
539
+ ((this.parent.keyTipElements as {[key: string]: object})['backstage'] as object[]).splice(index, 1);
540
+ }
541
+ }
542
+ if ((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] && ((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] as object[]).length) {
543
+ for (let i: number = 0; i < ((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] as object[]).length; i++) {
544
+ ((this.parent.keyTipElements as {[key: string]: object})['backstageMenu'] as object[]).splice(i, 1);
545
+ i--;
546
+ }
547
+ }
548
+ }
549
+
550
+ /**
551
+ * Add items to Backstage Menu.
552
+ *
553
+ * @param {BackstageItemModel[]} items - Gets the items to be added.
554
+ * @param {string} target - Gets the target item to add the items.
555
+ * @param {boolean} isAfter - Gets the boolean value to add the items after or before the target item.
556
+ * @param {boolean} isUniqueId - Gets whether the target provided is uniqueId or not.
557
+ * @returns {void}
558
+ */
559
+ public addBackstageItems(items: BackstageItemModel[], target: string, isAfter: boolean, isUniqueId?: boolean): void {
560
+ for (let i: number = 0; i < items.length; i++) {
561
+ const item: BackstageItemModel = items[parseInt(i.toString(), 10)];
562
+ if (item.isFooter) {
563
+ if (isAfter) { this.footerMenuCtrl.insertAfter(items, target, isUniqueId); }
564
+ else { this.footerMenuCtrl.insertBefore(items, target, isUniqueId); }
565
+ }
566
+ else {
567
+ if (isAfter) { this.menuCtrl.insertAfter(items, target, isUniqueId); }
568
+ else { this.menuCtrl.insertBefore(items, target, isUniqueId); }
569
+ }
570
+ }
571
+ const backstageItems: BackStageMenuModel[] = ([] as BackStageMenuModel[]).concat(this.menuCtrl.items, this.footerMenuCtrl.items);
572
+ const backStageOptions: BackStageMenuModel = this.parent.backStageMenu;
573
+ for (let i: number = 0; i < backStageOptions.items.length; i++) {
574
+ const item: BackstageItemModel = backStageOptions.items[parseInt(i.toString(), 10)];
575
+ for (let i: number = 0; i < backstageItems.length; i++) {
576
+ const item1: BackstageItemModel = backstageItems[parseInt(i.toString(), 10)];
577
+ if (item.text === item1.text) {
578
+ item1.content = item.content;
579
+ break;
580
+ }
581
+ }
582
+ }
583
+ (this.parent.backStageMenu as BackStageMenu).setProperties({ items: backstageItems }, true);
584
+ }
585
+
586
+ /**
587
+ * Remove items from Backstage Menu.
588
+ *
589
+ * @param {string[]} items - Gets the items to be removed.
590
+ * @param {boolean} isUniqueId - Gets whether the target provided is uniqueId or not.
591
+ * @returns {void}
592
+ */
593
+ public removeBackstageItems(items: string[], isUniqueId?: boolean): void {
594
+ this.menuCtrl.removeItems(items, isUniqueId);
595
+ this.footerMenuCtrl.removeItems(items, isUniqueId);
596
+ const backstageItems: BackStageMenuModel[] = ([] as BackStageMenuModel[]).concat(this.menuCtrl.items, this.footerMenuCtrl.items);
597
+ (this.parent.backStageMenu as BackStageMenu).setProperties({ items: backstageItems }, true);
598
+ }
599
+
600
+ /**
601
+ * Renders the backstage dynamically.
602
+ *
603
+ * @returns {void}
604
+ */
605
+ public showBackstage(): void {
606
+ this.popupEle.show();
607
+ }
608
+
609
+ /**
610
+ * Hides the backstage dynamically.
611
+ *
612
+ * @returns {void}
613
+ */
614
+ public hideBackstage(): void {
615
+ if (this.popupEle.element.classList.contains(constants.RIBBON_BACKSTAGE_OPEN)) {
616
+ this.popupEle.element.classList.remove(constants.RIBBON_BACKSTAGE_OPEN);
617
+ }
618
+ this.popupEle.hide();
619
+ }
620
+ }
@@ -0,0 +1,27 @@
1
+ import { Ribbon } from '../base/ribbon';
2
+ import { RibbonContextualTabSettingsModel } from '../models/ribbon-contextual-tab-settings-model';
3
+ /**
4
+ * Defines the ribbon contextual tab.
5
+ */
6
+ export declare class RibbonContextualTab {
7
+ private parent;
8
+ constructor(parent: Ribbon);
9
+ protected getModuleName(): string;
10
+ protected destroy(): void;
11
+ /**
12
+ * Creates Contextual tab.
13
+ *
14
+ * @returns {void}
15
+ * @hidden
16
+ */
17
+ addContextualTabs(): void;
18
+ /**
19
+ * Updates Contextual tab.
20
+ *
21
+ * @param {RibbonContextualTabSettingsModel} newProp - Specifies new properties.
22
+ * @param {RibbonContextualTabSettingsModel} contextualTab - Gets the property of contextual tab.
23
+ * @returns {void}
24
+ * @hidden
25
+ */
26
+ updateContextualTabs(newProp: RibbonContextualTabSettingsModel, contextualTab: RibbonContextualTabSettingsModel): void;
27
+ }