[BUGFIX] Render „create new content element“ wizard in modal
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Resources / Private / TypeScript / ContextMenuActions.ts
1 /*
2  * This file is part of the TYPO3 CMS project.
3  *
4  * It is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU General Public License, either version 2
6  * of the License, or any later version.
7  *
8  * For the full copyright and license information, please read the
9  * LICENSE.txt file that was distributed with this source code.
10  *
11  * The TYPO3 project - inspiring people to share!
12  */
13
14 import {SeverityEnum} from './Enum/Severity';
15 import * as $ from 'jquery';
16 import InfoWindow = require('./InfoWindow');
17 import Modal = require('./Modal');
18 import ModuleMenu = require('./ModuleMenu');
19 import Viewport = require('./Viewport');
20
21 /**
22  * @exports TYPO3/CMS/Backend/ContextMenuActions
23  */
24 class ContextMenuActions {
25   /**
26    * @returns {string}
27    */
28   public static getReturnUrl(): string {
29     return top.rawurlencode(top.list_frame.document.location.pathname + top.list_frame.document.location.search);
30   }
31
32   /**
33    * @param {string} table
34    * @param {number} uid
35    */
36   public static editRecord(table: string, uid: number): void {
37     Viewport.ContentContainer.setUrl(
38       top.TYPO3.settings.FormEngine.moduleUrl + '&edit[' + table + '][' + uid + ']=edit&returnUrl=' + ContextMenuActions.getReturnUrl()
39     );
40   }
41
42   /**
43    * @param {string} table
44    * @param {number} uid
45    */
46   public static viewRecord(table: string, uid: number): void {
47     const $viewUrl = $(this).data('preview-url');
48     if ($viewUrl) {
49       const previewWin = window.open($viewUrl, 'newTYPO3frontendWindow');
50       previewWin.focus();
51     }
52   }
53
54   /**
55    * @param {string} table
56    * @param {number} uid
57    */
58   public static openInfoPopUp(table: string, uid: number): void {
59     InfoWindow.showItem(table, uid);
60   }
61
62   /**
63    * @param {string} table
64    * @param {number} uid
65    */
66   public static mountAsTreeRoot(table: string, uid: number): void {
67     if (table === 'pages') {
68       Viewport.NavigationContainer.PageTree.setTemporaryMountPoint(uid);
69     }
70   }
71
72   /**
73    * @param {string} table
74    * @param {number} uid
75    */
76   public static newPageWizard(table: string, uid: number): void {
77     Viewport.ContentContainer.setUrl(
78       top.TYPO3.settings.NewRecord.moduleUrl + '&id=' + uid + '&pagesOnly=1&returnUrl=' + ContextMenuActions.getReturnUrl()
79     );
80   }
81
82   /**
83    * @param {string} table
84    * @param {number} uid
85    */
86   public static newContentWizard(table: string, uid: number): void {
87     const $me = $(this);
88     let $wizardUrl = $me.data('new-wizard-url');
89     if ($wizardUrl) {
90       $wizardUrl += '&returnUrl=' + ContextMenuActions.getReturnUrl();
91       Modal.advanced({
92         title: $me.data('title'),
93         type: Modal.types.ajax,
94         size: Modal.sizes.medium,
95         content: $wizardUrl,
96         severity: SeverityEnum.notice
97       });
98     }
99   }
100
101   /**
102    * @param {string} table
103    * @param {number} uid
104    */
105   public static newRecord(table: string, uid: number): void {
106     Viewport.ContentContainer.setUrl(
107       top.TYPO3.settings.FormEngine.moduleUrl + '&edit[' + table + '][-' + uid + ']=new&returnUrl=' + ContextMenuActions.getReturnUrl()
108     );
109   }
110
111   /**
112    * @param {string} table
113    * @param {number} uid
114    */
115   public static openHistoryPopUp(table: string, uid: number): void {
116     Viewport.ContentContainer.setUrl(
117       top.TYPO3.settings.RecordHistory.moduleUrl + '&element=' + table + ':' + uid + '&returnUrl=' + ContextMenuActions.getReturnUrl()
118     );
119   }
120
121   /**
122    * @param {string} table
123    * @param {number} uid
124    */
125   public static openListModule(table: string, uid: number): void {
126     const pageId = table === 'pages' ? uid : $(this).data('page-uid');
127     ModuleMenu.App.showModule('web_list', 'id=' + pageId);
128   }
129
130   /**
131    * @param {string} table
132    * @param {number} uid
133    */
134   public static pagesSort(table: string, uid: number): void {
135     const pagesSortUrl = $(this).data('pages-sort-url');
136     if (pagesSortUrl) {
137       Viewport.ContentContainer.setUrl(pagesSortUrl);
138     }
139   }
140
141   /**
142    * @param {string} table
143    * @param {number} uid
144    */
145   public static pagesNewMultiple(table: string, uid: number): void {
146     const pagesSortUrl = $(this).data('pages-new-multiple-url');
147     if (pagesSortUrl) {
148       Viewport.ContentContainer.setUrl(pagesSortUrl);
149     }
150   }
151
152   /**
153    * @param {string} table
154    * @param {number} uid
155    */
156   public static disableRecord(table: string, uid: number): void {
157     Viewport.ContentContainer.setUrl(
158       top.TYPO3.settings.RecordCommit.moduleUrl
159       + '&data[' + table + '][' + uid + '][hidden]=1'
160       + '&redirect=' + ContextMenuActions.getReturnUrl()
161     ).done((): void => {
162       Viewport.NavigationContainer.PageTree.refreshTree();
163     });
164   }
165
166   /**
167    * @param {string} table
168    * @param {number} uid
169    */
170   public static enableRecord(table: string, uid: number): void {
171     Viewport.ContentContainer.setUrl(
172       top.TYPO3.settings.RecordCommit.moduleUrl
173       + '&data[' + table + '][' + uid + '][hidden]=0'
174       + '&redirect=' + ContextMenuActions.getReturnUrl()
175     ).done((): void => {
176       Viewport.NavigationContainer.PageTree.refreshTree();
177     });
178   }
179
180   /**
181    * @param {string} table
182    * @param {number} uid
183    */
184   public static deleteRecord(table: string, uid: number): void {
185     const $anchorElement = $(this);
186     const $modal = Modal.confirm(
187       $anchorElement.data('title'),
188       $anchorElement.data('message'),
189       SeverityEnum.warning, [
190         {
191           text: $(this).data('button-close-text') || TYPO3.lang['button.cancel'] || 'Cancel',
192           active: true,
193           btnClass: 'btn-default',
194           name: 'cancel'
195         },
196         {
197           text: $(this).data('button-ok-text') || TYPO3.lang['button.delete'] || 'Delete',
198           btnClass: 'btn-warning',
199           name: 'delete'
200         }
201       ]);
202
203     $modal.on('button.clicked', (e: JQueryEventObject): void => {
204       if (e.target.getAttribute('name') === 'delete') {
205         Viewport.ContentContainer.setUrl(
206           top.TYPO3.settings.RecordCommit.moduleUrl
207           + '&redirect=' + ContextMenuActions.getReturnUrl()
208           + '&cmd[' + table + '][' + uid + '][delete]=1'
209         ).done((): void => {
210           if (table === 'pages' && Viewport.NavigationContainer.PageTree) {
211             Viewport.NavigationContainer.PageTree.refreshTree();
212           }
213         });
214       }
215       Modal.dismiss();
216     });
217   }
218
219   /**
220    * @param {string} table
221    * @param {number} uid
222    */
223   public static copy(table: string, uid: number): void {
224     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
225       + '&CB[el][' + table + '%7C' + uid + ']=1'
226       + '&CB[setCopyMode]=1';
227
228     $.ajax(url).always((): void => {
229       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
230     });
231   }
232
233   /**
234    * @param {string} table
235    * @param {number} uid
236    */
237   public static clipboardRelease(table: string, uid: number): void {
238     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
239       + '&CB[el][' + table + '%7C' + uid + ']=0';
240
241     $.ajax(url).always((): void => {
242       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
243     });
244   }
245
246   /**
247    * @param {string} table
248    * @param {number} uid
249    */
250   public static cut(table: string, uid: number): void {
251     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
252       + '&CB[el][' + table + '%7C' + uid + ']=1'
253       + '&CB[setCopyMode]=0';
254
255     $.ajax(url).always((): void => {
256       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
257     });
258   }
259
260   /**
261    * @param {string} iframeUrl
262    */
263   public static triggerRefresh(iframeUrl: string): void {
264     if (iframeUrl.indexOf('record%2Fedit') === -1) {
265       Viewport.ContentContainer.refresh(true);
266     }
267   }
268
269   /**
270    * Clear cache for given page uid
271    *
272    * @param {string} table pages table
273    * @param {number} uid uid of the page
274    */
275   public static clearCache(table: string, uid: number): void {
276     const url = top.TYPO3.settings.WebLayout.moduleUrl
277       + '&id=' + uid + '&clear_cache=1';
278     $.ajax(url);
279   }
280
281   /**
282    * Paste db record after another
283    *
284    * @param {string} table any db table except sys_file
285    * @param {number} uid uid of the record after which record from the cliboard will be pasted
286    */
287   public static pasteAfter(table: string, uid: number): void {
288     ContextMenuActions.pasteInto.bind($(this))(table, -uid);
289   }
290
291   /**
292    * Paste page into another page
293    *
294    * @param {string} table any db table except sys_file
295    * @param {number} uid uid of the record after which record from the cliboard will be pasted
296    */
297   public static pasteInto(table: string, uid: number): void {
298     const $anchorElement = $(this);
299     const performPaste = (): void => {
300       const url = '&CB[paste]=' + table + '%7C' + uid
301         + '&CB[pad]=normal'
302         + '&redirect=' + ContextMenuActions.getReturnUrl();
303
304       Viewport.ContentContainer.setUrl(
305         top.TYPO3.settings.RecordCommit.moduleUrl + url
306       ).done((): void => {
307         if (table === 'pages' && Viewport.NavigationContainer.PageTree) {
308           Viewport.NavigationContainer.PageTree.refreshTree();
309         }
310       });
311     };
312     if (!$anchorElement.data('title')) {
313       performPaste();
314       return;
315     }
316     const $modal = Modal.confirm(
317       $anchorElement.data('title'),
318       $anchorElement.data('message'),
319       SeverityEnum.warning, [
320         {
321           text: $(this).data('button-close-text') || TYPO3.lang['button.cancel'] || 'Cancel',
322           active: true,
323           btnClass: 'btn-default',
324           name: 'cancel'
325         },
326         {
327           text: $(this).data('button-ok-text') || TYPO3.lang['button.ok'] || 'OK',
328           btnClass: 'btn-warning',
329           name: 'ok'
330         }
331       ]);
332
333     $modal.on('button.clicked', (e: JQueryEventObject): void => {
334       if (e.target.getAttribute('name') === 'ok') {
335         performPaste();
336       }
337       Modal.dismiss();
338     });
339   }
340 }
341
342 export = ContextMenuActions;