de2513c1a4558284ad80fdba33ec2d7d5755c908
[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 ModuleMenu = require('./ModuleMenu');
18 import Severity = require('./Severity');
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     let $wizardUrl = $(this).data('new-wizard-url');
88     if ($wizardUrl) {
89       $wizardUrl += '&returnUrl=' + ContextMenuActions.getReturnUrl();
90       Viewport.ContentContainer.setUrl($wizardUrl);
91     }
92   }
93
94   /**
95    * @param {string} table
96    * @param {number} uid
97    */
98   public static newRecord(table: string, uid: number): void {
99     Viewport.ContentContainer.setUrl(
100       top.TYPO3.settings.FormEngine.moduleUrl + '&edit[' + table + '][-' + uid + ']=new&returnUrl=' + ContextMenuActions.getReturnUrl()
101     );
102   }
103
104   /**
105    * @param {string} table
106    * @param {number} uid
107    */
108   public static openHistoryPopUp(table: string, uid: number): void {
109     Viewport.ContentContainer.setUrl(
110       top.TYPO3.settings.RecordHistory.moduleUrl + '&element=' + table + ':' + uid + '&returnUrl=' + ContextMenuActions.getReturnUrl()
111     );
112   }
113
114   /**
115    * @param {string} table
116    * @param {number} uid
117    */
118   public static openListModule(table: string, uid: number): void {
119     const pageId = table === 'pages' ? uid : $(this).data('page-uid');
120     ModuleMenu.App.showModule('web_list', 'id=' + pageId);
121   }
122
123   /**
124    * @param {string} table
125    * @param {number} uid
126    */
127   public static pagesSort(table: string, uid: number): void {
128     const pagesSortUrl = $(this).data('pages-sort-url');
129     if (pagesSortUrl) {
130       Viewport.ContentContainer.setUrl(pagesSortUrl);
131     }
132   }
133
134   /**
135    * @param {string} table
136    * @param {number} uid
137    */
138   public static pagesNewMultiple(table: string, uid: number): void {
139     const pagesSortUrl = $(this).data('pages-new-multiple-url');
140     if (pagesSortUrl) {
141       Viewport.ContentContainer.setUrl(pagesSortUrl);
142     }
143   }
144
145   /**
146    * @param {string} table
147    * @param {number} uid
148    */
149   public static disableRecord(table: string, uid: number): void {
150     Viewport.ContentContainer.setUrl(
151       top.TYPO3.settings.RecordCommit.moduleUrl
152       + '&data[' + table + '][' + uid + '][hidden]=1'
153       + '&redirect=' + ContextMenuActions.getReturnUrl()
154     ).done((): void => {
155       Viewport.NavigationContainer.PageTree.refreshTree();
156     });
157   }
158
159   /**
160    * @param {string} table
161    * @param {number} uid
162    */
163   public static enableRecord(table: string, uid: number): void {
164     Viewport.ContentContainer.setUrl(
165       top.TYPO3.settings.RecordCommit.moduleUrl
166       + '&data[' + table + '][' + uid + '][hidden]=0'
167       + '&redirect=' + ContextMenuActions.getReturnUrl()
168     ).done((): void => {
169       Viewport.NavigationContainer.PageTree.refreshTree();
170     });
171   }
172
173   /**
174    * @param {string} table
175    * @param {number} uid
176    */
177   public static deleteRecord(table: string, uid: number): void {
178     const $anchorElement = $(this);
179     const $modal = Modal.confirm(
180       $anchorElement.data('title'),
181       $anchorElement.data('message'),
182       Severity.warning, [
183         {
184           text: $(this).data('button-close-text') || TYPO3.lang['button.cancel'] || 'Cancel',
185           active: true,
186           btnClass: 'btn-default',
187           name: 'cancel'
188         },
189         {
190           text: $(this).data('button-ok-text') || TYPO3.lang['button.delete'] || 'Delete',
191           btnClass: 'btn-warning',
192           name: 'delete'
193         }
194       ]);
195
196     $modal.on('button.clicked', (e: JQueryEventObject): void => {
197       if (e.target.getAttribute('name') === 'delete') {
198         Viewport.ContentContainer.setUrl(
199           top.TYPO3.settings.RecordCommit.moduleUrl
200           + '&redirect=' + ContextMenuActions.getReturnUrl()
201           + '&cmd[' + table + '][' + uid + '][delete]=1'
202         ).done((): void => {
203           if (table === 'pages' && Viewport.NavigationContainer.PageTree) {
204             Viewport.NavigationContainer.PageTree.refreshTree();
205           }
206         });
207       }
208       Modal.dismiss();
209     });
210   }
211
212   /**
213    * @param {string} table
214    * @param {number} uid
215    */
216   public static copy(table: string, uid: number): void {
217     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
218       + '&CB[el][' + table + '%7C' + uid + ']=1'
219       + '&CB[setCopyMode]=1';
220
221     $.ajax(url).always((): void => {
222       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
223     });
224   }
225
226   /**
227    * @param {string} table
228    * @param {number} uid
229    */
230   public static clipboardRelease(table: string, uid: number): void {
231     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
232       + '&CB[el][' + table + '%7C' + uid + ']=0';
233
234     $.ajax(url).always((): void => {
235       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
236     });
237   }
238
239   /**
240    * @param {string} table
241    * @param {number} uid
242    */
243   public static cut(table: string, uid: number): void {
244     const url = TYPO3.settings.ajaxUrls.contextmenu_clipboard
245       + '&CB[el][' + table + '%7C' + uid + ']=1'
246       + '&CB[setCopyMode]=0';
247
248     $.ajax(url).always((): void => {
249       ContextMenuActions.triggerRefresh(Viewport.ContentContainer.get().location.href);
250     });
251   }
252
253   /**
254    * @param {string} iframeUrl
255    */
256   public static triggerRefresh(iframeUrl: string): void {
257     if (iframeUrl.indexOf('record%2Fedit') === -1) {
258       Viewport.ContentContainer.refresh(true);
259     }
260   }
261
262   /**
263    * Clear cache for given page uid
264    *
265    * @param {string} table pages table
266    * @param {number} uid uid of the page
267    */
268   public static clearCache(table: string, uid: number): void {
269     const url = top.TYPO3.settings.WebLayout.moduleUrl
270       + '&id=' + uid + '&clear_cache=1';
271     $.ajax(url);
272   }
273
274   /**
275    * Paste db record after another
276    *
277    * @param {string} table any db table except sys_file
278    * @param {number} uid uid of the record after which record from the cliboard will be pasted
279    */
280   public static pasteAfter(table: string, uid: number): void {
281     ContextMenuActions.pasteInto.bind($(this))(table, -uid);
282   }
283
284   /**
285    * Paste page into another page
286    *
287    * @param {string} table any db table except sys_file
288    * @param {number} uid uid of the record after which record from the cliboard will be pasted
289    */
290   public static pasteInto(table: string, uid: number): void {
291     const $anchorElement = $(this);
292     const performPaste = (): void => {
293       const url = '&CB[paste]=' + table + '%7C' + uid
294         + '&CB[pad]=normal'
295         + '&redirect=' + ContextMenuActions.getReturnUrl();
296
297       Viewport.ContentContainer.setUrl(
298         top.TYPO3.settings.RecordCommit.moduleUrl + url
299       ).done((): void => {
300         if (table === 'pages' && Viewport.NavigationContainer.PageTree) {
301           Viewport.NavigationContainer.PageTree.refreshTree();
302         }
303       });
304     };
305     if (!$anchorElement.data('title')) {
306       performPaste();
307       return;
308     }
309     const $modal = Modal.confirm(
310       $anchorElement.data('title'),
311       $anchorElement.data('message'),
312       Severity.warning, [
313         {
314           text: $(this).data('button-close-text') || TYPO3.lang['button.cancel'] || 'Cancel',
315           active: true,
316           btnClass: 'btn-default',
317           name: 'cancel'
318         },
319         {
320           text: $(this).data('button-ok-text') || TYPO3.lang['button.ok'] || 'OK',
321           btnClass: 'btn-warning',
322           name: 'ok'
323         }
324       ]);
325
326     $modal.on('button.clicked', (e: JQueryEventObject): void => {
327       if (e.target.getAttribute('name') === 'ok') {
328         performPaste();
329       }
330       Modal.dismiss();
331     });
332   }
333 }
334
335 export = ContextMenuActions;