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