[TASK] Migrate TYPO3/CMS/Recordlist/* to TypeScript 97/59697/14
authorFrank Naegler <frank.naegler@typo3.org>
Wed, 13 Feb 2019 13:46:38 +0000 (14:46 +0100)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Fri, 1 Mar 2019 15:52:31 +0000 (16:52 +0100)
Resolves: #87708
Releases: master
Change-Id: I5870f39805e2bd89c8ea57566e949c40620e389f
Reviewed-on: https://review.typo3.org/c/59697
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
30 files changed:
Build/types/TYPO3/index.d.ts
typo3/sysext/backend/Resources/Public/JavaScript/LegacyTree.js
typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseDatabase.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFiles.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFolders.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/ElementBrowser.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/FieldSelectBox.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/FileLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/LinkBrowser.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/MailLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/PageLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/RecordLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/Recordlist.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/TelephoneLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/Tooltip.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Private/TypeScript/UrlLinkHandler.ts [new file with mode: 0644]
typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseDatabase.js
typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFiles.js
typo3/sysext/recordlist/Resources/Public/JavaScript/BrowseFolders.js
typo3/sysext/recordlist/Resources/Public/JavaScript/ElementBrowser.js
typo3/sysext/recordlist/Resources/Public/JavaScript/FieldSelectBox.js
typo3/sysext/recordlist/Resources/Public/JavaScript/FileLinkHandler.js
typo3/sysext/recordlist/Resources/Public/JavaScript/LinkBrowser.js
typo3/sysext/recordlist/Resources/Public/JavaScript/MailLinkHandler.js
typo3/sysext/recordlist/Resources/Public/JavaScript/PageLinkHandler.js
typo3/sysext/recordlist/Resources/Public/JavaScript/RecordLinkHandler.js
typo3/sysext/recordlist/Resources/Public/JavaScript/Recordlist.js
typo3/sysext/recordlist/Resources/Public/JavaScript/TelephoneLinkHandler.js
typo3/sysext/recordlist/Resources/Public/JavaScript/Tooltip.js
typo3/sysext/recordlist/Resources/Public/JavaScript/UrlLinkHandler.js

index b2c6207..6e09bf0 100644 (file)
@@ -109,6 +109,10 @@ declare module 'TYPO3/CMS/Core/Contrib/imagesloaded.pkgd.min' {
   export = imagesloaded;
 }
 
+
+declare module 'TYPO3/CMS/Recordlist/LinkBrowser';
+declare module 'TYPO3/CMS/Backend/LegacyTree';
+
 declare module 'cm/lib/codemirror';
 declare module 'moment';
 
index 693ef5c..389e535 100644 (file)
@@ -113,6 +113,15 @@ define(['jquery'], function($) {
     highlightClass: 'active',
     pageID: 0,
 
+    noop: function() {
+      //  yes, this function is nearly useless, but wait...
+      // ... It happened at a time when people still wrote event handlers
+      // in the markup. Times to which onclick="..." were normal.
+      // For such legacies is this method, because modern TypeScript can not
+      // know that and removes components that seemingly are not needed.
+      // For such cases, this method can be called simply and the world is alright again.
+    },
+
     // reloads a part of the page tree (useful when "expand" / "collapse")
     load: function(params, isExpand, obj, scopeData, scopeHash) {
       var $obj = $(obj);
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseDatabase.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseDatabase.ts
new file mode 100644 (file)
index 0000000..bcdc845
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import ElementBrowser = require('./ElementBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/BrowseDatabase
+ * Database record selection
+ * @exports TYPO3/CMS/Recordlist/BrowseDatabase
+ */
+class BrowseDatabase {
+  constructor() {
+    $((): void => {
+      $('[data-close]').on('click', (event: JQueryEventObject): void => {
+        event.preventDefault();
+        const data = $(event.currentTarget).parents('span').data();
+
+        ElementBrowser.insertElement(
+          data.table,
+          data.uid,
+          'db',
+          data.title,
+          '',
+          '',
+          data.icon,
+          '',
+          parseInt($(event.currentTarget).data('close'), 10) === 1,
+        );
+      });
+    });
+
+    // adjust searchbox layout
+    const searchbox: HTMLElement = document.getElementById('db_list-searchbox-toolbar');
+    searchbox.style.display = 'block';
+    searchbox.style.position = 'relative';
+  }
+}
+
+export = new BrowseDatabase();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFiles.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFiles.ts
new file mode 100644 (file)
index 0000000..7a71a9d
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import ElementBrowser = require('./ElementBrowser');
+// Yes we really need this import, because Tree... is used in inline markup...
+import Tree = require('TYPO3/CMS/Backend/LegacyTree');
+
+interface LinkElement {
+  fileExt: string;
+  fileIcon: string;
+  fileName: string;
+  filePath: any;
+  table: string;
+  type: string;
+  uid: number;
+}
+
+interface LinkElementStorage {
+  [s: string]: LinkElement;
+}
+
+class BrowseFiles {
+  public static elements: LinkElementStorage;
+
+  public static File: File;
+  public static Selector: Selector;
+
+  constructor() {
+    // as long we use onclick attributes, we need the Tree component
+    Tree.noop();
+    BrowseFiles.File = new File();
+    BrowseFiles.Selector = new Selector();
+
+    $((): void => {
+      BrowseFiles.elements = $('body').data('elements');
+
+      $('[data-close]').on('click', (e: JQueryEventObject): void => {
+        e.preventDefault();
+        BrowseFiles.File.insertElement(
+          'file_' + $(e.currentTarget).data('fileIndex'),
+          parseInt($(e.currentTarget).data('close'), 10) === 1,
+        );
+      });
+
+      $('#t3js-importSelection').on('click', BrowseFiles.Selector.handle);
+      $('#t3js-toggleSelection').on('click', BrowseFiles.Selector.toggle);
+    });
+  }
+}
+
+class File {
+  /**
+   * @param {String} index
+   * @param  {Boolean} close
+   */
+  public insertElement(index: string, close?: boolean): boolean {
+    let result = false;
+    if (typeof BrowseFiles.elements[index] !== 'undefined') {
+      const element: LinkElement = BrowseFiles.elements[index];
+      result = ElementBrowser.insertElement(
+        element.table,
+        element.uid,
+        element.type,
+        element.fileName,
+        element.filePath,
+        element.fileExt,
+        element.fileIcon,
+        '',
+        close,
+      );
+    }
+    return result;
+  }
+
+  /**
+   * @param {Array} list
+   */
+  public insertElementMultiple(list: Array<any>): void {
+    for (let i = 0, n = list.length; i < n; i++) {
+      if (typeof BrowseFiles.elements[list[i]] !== 'undefined') {
+        const element: LinkElement = BrowseFiles.elements[list[i]];
+        ElementBrowser.insertMultiple('sys_file', element.uid);
+      }
+    }
+  }
+}
+
+class Selector {
+  /**
+   * Toggle selection button is pressed
+   *
+   * @param {JQueryEventObject} e
+   */
+  public toggle = (e: JQueryEventObject): void => {
+    e.preventDefault();
+    const items = this.getItems();
+    if (items.length) {
+      items.each((position: number, item: any): void => {
+        item.checked = (item.checked ? null : 'checked');
+      });
+    }
+  }
+
+  /**
+   * Import selection button is pressed
+   *
+   * @param {JQueryEventObject} e
+   */
+  public handle = (e: JQueryEventObject): void => {
+    e.preventDefault();
+    const items: JQuery = this.getItems();
+    const selectedItems: Array<string> = [];
+    if (items.length) {
+      items.each((position: number, item: any): void => {
+        if (item.checked && item.name) {
+          selectedItems.push(item.name);
+        }
+      });
+      if (selectedItems.length > 0) {
+        if (ElementBrowser.hasActionMultipleCode) {
+          BrowseFiles.File.insertElementMultiple(selectedItems);
+        } else {
+          for (let i = 0; i < selectedItems.length; i++) {
+            BrowseFiles.File.insertElement(selectedItems[i]);
+          }
+        }
+      }
+      ElementBrowser.focusOpenerAndClose();
+    }
+  }
+
+  public getItems(): JQuery {
+    return $('#typo3-filelist').find('.typo3-bulk-item');
+  }
+}
+
+export = new BrowseFiles();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFolders.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/BrowseFolders.ts
new file mode 100644 (file)
index 0000000..661a44c
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import ElementBrowser = require('./ElementBrowser');
+import Modal = require('TYPO3/CMS/Backend/Modal');
+import Severity = require('TYPO3/CMS/Backend/Severity');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/BrowseFolders
+ * Folder selection
+ * @exports TYPO3/CMS/Recordlist/BrowseFolders
+ */
+class BrowseFolders {
+  constructor() {
+    $(() => {
+      $('[data-folder-id]').on('click', (event: JQueryEventObject): void => {
+        event.preventDefault();
+        const $element: JQuery = $(event.currentTarget);
+        const folderId = $element.data('folderId');
+        const close = parseInt($element.data('close'), 10) === 1;
+        ElementBrowser.insertElement('', folderId, 'folder', folderId, folderId, '', '', '', close);
+      });
+
+      $('.t3js-folderIdError').on('click', (event: JQueryEventObject): void => {
+        event.preventDefault();
+        Modal.confirm('', $(event.currentTarget).data('message'), Severity.error, [], []);
+      });
+    });
+  }
+}
+
+export = new BrowseFolders();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/ElementBrowser.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/ElementBrowser.ts
new file mode 100644 (file)
index 0000000..be3b2f2
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import Modal = require('TYPO3/CMS/Backend/Modal');
+
+interface RTESettings {
+  parameters: string;
+  configuration: string;
+}
+
+interface InlineSettings {
+  objectId: number;
+  checkUniqueAction: string;
+  addAction: string;
+  insertAction: string;
+}
+
+declare global {
+  interface Document {
+    list_frame: Window;
+  }
+  interface Window {
+    jumpToUrl: Function;
+    setFormValueFromBrowseWin: Function;
+    editform: any;
+    content: any;
+    group_change: any;
+  }
+}
+
+/**
+ * Module: TYPO3/CMS/Recordlist/ElementBrowser
+ * @exports TYPO3/CMS/Recordlist/ElementBrowser
+ * ElementBrowser communication with parent windows
+ */
+class ElementBrowser {
+  public hasActionMultipleCode: boolean = false;
+
+  private thisScriptUrl: string = '';
+  private mode: string = '';
+  private formFieldName: string = '';
+  private fieldReference: string = '';
+  private fieldReferenceSlashed: string = '';
+  private targetDoc: Window;
+  private elRef: Element;
+  private rte: RTESettings = {
+    parameters: '',
+    configuration: '',
+  };
+  private irre: InlineSettings = {
+    objectId: 0,
+    checkUniqueAction: '',
+    addAction: '',
+    insertAction: '',
+  };
+
+  constructor() {
+    $((): void => {
+      const data = $('body').data();
+      this.thisScriptUrl = data.thisScriptUrl;
+      this.mode = data.mode;
+      this.formFieldName = data.formFieldName;
+      this.fieldReference = data.fieldReference;
+      this.fieldReferenceSlashed = data.fieldReferenceSlashed;
+      this.rte.parameters = data.rteParameters;
+      this.rte.configuration = data.rteConfiguration;
+      this.irre.checkUniqueAction = data.irreCheckUniqueAction;
+      this.irre.addAction = data.irreAddAction;
+      this.irre.insertAction = data.irreInsertAction;
+      this.irre.objectId = data.irreObjectId;
+      this.hasActionMultipleCode = (this.irre.objectId > 0 && this.irre.insertAction !== '');
+    });
+
+    /**
+     * Global jumpTo function
+     *
+     * Used by tree implementation
+     *
+     * @param {String} URL
+     * @param {String} anchor
+     * @returns {Boolean}
+     */
+    window.jumpToUrl = (URL: string, anchor?: string): boolean => {
+      if (URL.charAt(0) === '?') {
+        URL = this.thisScriptUrl + URL.substring(1);
+      }
+      const add_mode = URL.indexOf('mode=') === -1 ? '&mode=' + encodeURIComponent(this.mode) : '';
+      window.location.href = URL + add_mode + (typeof (anchor) === 'string' ? anchor : '');
+      return false;
+    };
+
+  }
+
+  public setReferences(): boolean {
+    if (this.getParent() && this.getParent().content && this.getParent().content.document.editform
+      && this.getParent().content.document.editform[this.formFieldName]) {
+      this.targetDoc = this.getParent().content.document;
+      this.elRef = this.targetDoc.editform[this.formFieldName];
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * Dynamically calls a function on a given context object.
+   */
+  public executeFunctionByName(functionName: string, context: any, ...args: Array<any>): any {
+    const namespaces = functionName.split('.');
+    const func = namespaces.pop();
+    for (let i = 0; i < namespaces.length; i++) {
+      context = context[namespaces[i]];
+    }
+    return context[func].apply(context, args);
+  }
+
+  /**
+   * Returns the parent document object
+   */
+  public getParent(): Window | null {
+    let opener: Window = null;
+    if (
+      typeof window.parent !== 'undefined' &&
+      typeof window.parent.document.list_frame !== 'undefined' &&
+      window.parent.document.list_frame.parent.document.querySelector('.t3js-modal-iframe') !== null
+    ) {
+      opener = window.parent.document.list_frame;
+    } else if (
+      typeof window.parent !== 'undefined' &&
+      typeof window.parent.frames.list_frame !== 'undefined' &&
+      window.parent.frames.list_frame.parent.document.querySelector('.t3js-modal-iframe') !== null
+    ) {
+      opener = window.parent.frames.list_frame;
+    } else if (
+      typeof window.frames !== 'undefined' &&
+      typeof window.frames.frameElement !== 'undefined' &&
+      window.frames.frameElement !== null &&
+      window.frames.frameElement.classList.contains('t3js-modal-iframe')
+    ) {
+      opener = (<HTMLFrameElement>window.frames.frameElement).contentWindow.parent;
+    } else if (window.opener) {
+      opener = window.opener;
+    }
+    return opener;
+  }
+
+  public insertElement(
+    table: string,
+    uid: number,
+    type: string,
+    filename: string,
+    fp: string,
+    filetype: string,
+    imagefile: string,
+    action: string,
+    close: boolean,
+  ): boolean {
+    let performAction = true;
+
+    // Call a check function in the opener window (e.g. for uniqueness handling):
+    if (this.irre.objectId && this.irre.checkUniqueAction) {
+      if (this.getParent()) {
+        const res = this.executeFunctionByName(this.irre.checkUniqueAction, this.getParent(), this.irre.objectId, table, uid, type);
+        if (!res.passed) {
+          if (res.message) {
+            alert(res.message);
+          }
+          performAction = false;
+        }
+      } else {
+        alert('Error - reference to main window is not set properly!');
+        this.focusOpenerAndClose();
+      }
+    }
+    // Call performing function and finish this action:
+    if (performAction) {
+      // Call helper function to manage data in the opener window:
+      if (this.irre.objectId && this.irre.addAction) {
+        if (this.getParent()) {
+          this.executeFunctionByName(
+            this.irre.addAction, this.getParent(), this.irre.objectId,
+            table, uid, type, this.fieldReferenceSlashed,
+          );
+        } else {
+          alert('Error - reference to main window is not set properly!');
+          this.focusOpenerAndClose();
+        }
+      }
+      if (this.irre.objectId && this.irre.insertAction) {
+        if (this.getParent()) {
+          this.executeFunctionByName(this.irre.insertAction, this.getParent(), this.irre.objectId, table, uid, type);
+          if (close) {
+            this.focusOpenerAndClose();
+          }
+        } else {
+          alert('Error - reference to main window is not set properly!');
+          if (close) {
+            this.focusOpenerAndClose();
+          }
+        }
+      } else if (this.fieldReference && !this.rte.parameters && !this.rte.configuration) {
+        this.addElement(filename, table + '_' + uid, fp, close);
+      } else {
+        if (
+          this.getParent() && this.getParent().content && this.getParent().content.document.editform
+          && this.getParent().content.document.editform[this.formFieldName]
+        ) {
+          this.getParent().group_change(
+            'add',
+            this.fieldReference,
+            this.rte.parameters,
+            this.rte.configuration,
+            this.targetDoc.editform[this.formFieldName],
+            this.getParent().content.document,
+          );
+        } else {
+          alert('Error - reference to main window is not set properly!');
+        }
+        if (close) {
+          this.focusOpenerAndClose();
+        }
+      }
+    }
+    return false;
+  }
+
+  public insertMultiple(table: string, uid: number): boolean {
+    let type = '';
+    if (this.irre.objectId && this.irre.insertAction) {
+      // Call helper function to manage data in the opener window:
+      if (this.getParent()) {
+        this.executeFunctionByName(
+          this.irre.insertAction + 'Multiple', this.getParent(),
+          this.irre.objectId, table, uid, type, this.fieldReference,
+        );
+      } else {
+        alert('Error - reference to main window is not set properly!');
+        this.focusOpenerAndClose();
+      }
+    }
+    return false;
+  }
+
+  public addElement(elName: string, elValue: string, altElValue: string, close: boolean): void {
+    if (this.getParent() && this.getParent().setFormValueFromBrowseWin) {
+      this.getParent().setFormValueFromBrowseWin(this.fieldReference, altElValue ? altElValue : elValue, elName);
+      if (close) {
+        this.focusOpenerAndClose();
+      }
+    } else {
+      alert('Error - reference to main window is not set properly!');
+      this.focusOpenerAndClose();
+    }
+  }
+
+  public focusOpenerAndClose = (): void => {
+    if (this.getParent()) {
+      this.getParent().focus();
+    }
+    Modal.dismiss();
+    close();
+  }
+}
+
+export = new ElementBrowser();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/FieldSelectBox.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/FieldSelectBox.ts
new file mode 100644 (file)
index 0000000..c066de6
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+
+/**
+ * Module: TYPO3/CMS/Recordlist/FieldSelectBox
+ * Check-all / uncheck-all for the Database Recordlist fieldSelectBox
+ * @exports TYPO3/CMS/Recordlist/FieldSelectBox
+ */
+class FieldSelectBox {
+  constructor() {
+    $(() => {
+      $('.fieldSelectBox .checkAll').change((event: JQueryEventObject): void => {
+        const checked = $(event.currentTarget).prop('checked');
+        const $checkboxes = $('.fieldSelectBox tbody').find(':checkbox');
+        $checkboxes.each((index: number, elem: Element): void => {
+          if (!$(elem).prop('disabled')) {
+            $(elem).prop('checked', checked);
+          }
+        });
+      });
+    });
+  }
+}
+
+export = new FieldSelectBox();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/FileLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/FileLinkHandler.ts
new file mode 100644 (file)
index 0000000..2781657
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+// Yes we really need this import, because Tree... is used in inline markup...
+import Tree = require('TYPO3/CMS/Backend/LegacyTree');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/FileLinkHandler
+ * File link interaction
+ * @exports TYPO3/CMS/Recordlist/FileLinkHandler
+ */
+class FileLinkHandler {
+  currentLink: string = '';
+
+  constructor() {
+    // until we use onclick attributes, we need the Tree component
+    Tree.noop();
+    $(() => {
+      this.currentLink = $('body').data('currentLink');
+      $('a.t3js-fileLink').on('click', this.linkFile);
+      $('input.t3js-linkCurrent').on('click', this.linkCurrent);
+    });
+  }
+
+  public linkFile = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    LinkBrowser.finalizeFunction($(event.currentTarget).attr('href'));
+  }
+
+  public linkCurrent = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    LinkBrowser.finalizeFunction(this.currentLink);
+  }
+}
+
+export = new FileLinkHandler();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/LinkBrowser.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/LinkBrowser.ts
new file mode 100644 (file)
index 0000000..04a03c4
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+
+interface LinkAttributes {
+  [s: string]: any;
+}
+
+declare global {
+  interface Window {
+    jumpToUrl: Function;
+  }
+}
+
+/**
+ * Module: TYPO3/CMS/Recordlist/LinkBrowser
+ * API for tooltip windows powered by Twitter Bootstrap.
+ * @exports TYPO3/CMS/Recordlist/Tooltip
+ */
+class LinkBrowser {
+  private thisScriptUrl: string = '';
+  private urlParameters: Object = {};
+  private parameters: Object = {};
+  private addOnParams: string = '';
+  private linkAttributeFields: Array<any>;
+  private additionalLinkAttributes: LinkAttributes = {};
+
+  constructor() {
+    $((): void => {
+      const data = $('body').data();
+
+      this.thisScriptUrl = data.thisScriptUrl;
+      this.urlParameters = data.urlParameters;
+      this.parameters = data.parameters;
+      this.addOnParams = data.addOnParams;
+      this.linkAttributeFields = data.linkAttributeFields;
+
+      $('.t3js-targetPreselect').on('change', this.loadTarget);
+      $('form.t3js-dummyform').on('submit', (evt: JQueryEventObject): void => {
+        evt.preventDefault();
+      });
+    });
+
+    /**
+     * Global jumpTo function
+     *
+     * Used by tree implementation
+     *
+     * @param {String} URL
+     * @param {String} anchor
+     * @returns {Boolean}
+     */
+    window.jumpToUrl = (URL: string, anchor?: string) => {
+      if (URL.charAt(0) === '?') {
+        URL = this.thisScriptUrl + URL.substring(1);
+      }
+      const urlParameters = this.encodeGetParameters(this.urlParameters, '', URL);
+      const parameters = this.encodeGetParameters(this.getLinkAttributeValues(), 'linkAttributes', '');
+
+      window.location.href = URL + urlParameters + parameters + this.addOnParams + (typeof(anchor) === 'string' ? anchor : '');
+      return false;
+    };
+  }
+
+  public getLinkAttributeValues(): Object {
+    const attributeValues: LinkAttributes = {};
+    $.each(this.linkAttributeFields, (index: number, fieldName: string) => {
+      const val: string = $('[name="l' + fieldName + '"]').val();
+      if (val) {
+        attributeValues[fieldName] = val;
+      }
+    });
+    $.extend(attributeValues, this.additionalLinkAttributes);
+    return attributeValues;
+  }
+
+  public loadTarget = (evt: JQueryEventObject): void => {
+    const $element = $(evt.currentTarget);
+    $('.t3js-linkTarget').val($element.val());
+    (<HTMLSelectElement>$element.get(0)).selectedIndex = 0;
+  }
+
+  /**
+   * Encode objects to GET parameter arrays in PHP notation
+   */
+  public encodeGetParameters(obj: LinkAttributes, prefix: string, url: string): string {
+    const str = [];
+    for (let p in obj) {
+      if (obj.hasOwnProperty(p)) {
+        const k: string = prefix ? prefix + '[' + p + ']' : p;
+        const v: any = obj[p];
+        if (url.indexOf(k + '=') === -1) {
+          str.push(
+            typeof v === 'object'
+              ? this.encodeGetParameters(v, k, url)
+              : encodeURIComponent(k) + '=' + encodeURIComponent(v),
+          );
+        }
+      }
+    }
+    return '&' + str.join('&');
+  }
+
+  /**
+   * Set an additional attribute for the link
+   */
+  public setAdditionalLinkAttribute(name: string, value: any): void {
+    this.additionalLinkAttributes[name] = value;
+  }
+
+  /**
+   * Stores the final link
+   *
+   * This method MUST be overridden in the actual implementation of the link browser.
+   * The function is responsible for encoding the link (and possible link attributes) and
+   * returning it to the caller (e.g. FormEngine, RTE, etc)
+   *
+   * @param {String} link The select element or anything else which identifies the link (e.g. "page:<pageUid>" or "file:<uid>")
+   */
+  public finalizeFunction(link: string): void {
+    throw 'The link browser requires the finalizeFunction to be set. Seems like you discovered a major bug.';
+  }
+}
+
+export = new LinkBrowser();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/MailLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/MailLinkHandler.ts
new file mode 100644 (file)
index 0000000..a7e3908
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/MailLinkHandler
+ * @exports TYPO3/CMS/Recordlist/MailLinkHandler
+ * Mail link interaction
+ */
+class MailLinkHandler {
+  constructor() {
+    $((): void => {
+      $('#lmailform').on('submit', (event: JQueryEventObject): void => {
+        event.preventDefault();
+
+        let value = $(event.currentTarget).find('[name="lemail"]').val();
+        if (value === 'mailto:') {
+          return;
+        }
+
+        while (value.substr(0, 7) === 'mailto:') {
+          value = value.substr(7);
+        }
+
+        LinkBrowser.finalizeFunction('mailto:' + value);
+      });
+    });
+  }
+}
+
+export = new MailLinkHandler();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/PageLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/PageLinkHandler.ts
new file mode 100644 (file)
index 0000000..4d5c64e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/PageLinkHandler
+ * @exports TYPO3/CMS/Recordlist/PageLinkHandler
+ * Page link interaction
+ */
+class PageLinkHandler {
+  private currentLink: string = '';
+
+  constructor() {
+    $((): void => {
+      this.currentLink = $('body').data('currentLink');
+      $('a.t3js-pageLink').on('click', this.linkPage);
+      $('input.t3js-linkCurrent').on('click', this.linkCurrent);
+      $('input.t3js-pageLink').on('click', this.linkPageByTextfield);
+    });
+  }
+
+  /**
+   * @param {JQueryEventObject} event
+   */
+  public linkPage = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    LinkBrowser.finalizeFunction($(event.currentTarget).attr('href'));
+  }
+
+  /**
+   * @param {JQueryEventObject} event
+   */
+  public linkPageByTextfield = (event: JQueryEventObject): void => {
+    event.preventDefault();
+
+    const value = $('#luid').val();
+    if (!value) {
+      return;
+    }
+
+    LinkBrowser.finalizeFunction(value);
+  }
+
+  /**
+   * @param {JQueryEventObject} event
+   */
+  public linkCurrent = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    LinkBrowser.finalizeFunction(this.currentLink);
+  }
+}
+
+export = new PageLinkHandler();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/RecordLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/RecordLinkHandler.ts
new file mode 100644 (file)
index 0000000..deaeb2c
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/RecordLinkHandler
+ * record link interaction
+ */
+class RecordLinkHandler {
+  private currentLink: string = '';
+  private identifier: string = '';
+
+  constructor() {
+    $((): void => {
+      const body = $('body');
+      this.currentLink = body.data('currentLink');
+      this.identifier = body.data('identifier');
+
+      // adjust searchbox layout
+      const searchbox: HTMLElement = document.getElementById('db_list-searchbox-toolbar');
+      searchbox.style.display = 'block';
+      searchbox.style.position = 'relative';
+
+      $('[data-close]').on('click', this.linkRecord);
+      $('input.t3js-linkCurrent').on('click', this.linkCurrent);
+    });
+  }
+
+  /**
+   * @param {JQueryEventObject} event
+   */
+  public linkRecord = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    const data = $(event.currentTarget).parents('span').data();
+    LinkBrowser.finalizeFunction(this.identifier + data.uid);
+  }
+
+  /**
+   * @param {JQueryEventObject} event
+   */
+  public linkCurrent = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    LinkBrowser.finalizeFunction(this.currentLink);
+  }
+}
+
+export = new RecordLinkHandler();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/Recordlist.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/Recordlist.ts
new file mode 100644 (file)
index 0000000..464666d
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import PersistentStorage = require('TYPO3/CMS/Backend/Storage/Persistent');
+import Icons = require('TYPO3/CMS/Backend/Icons');
+
+declare global {
+  const T3_THIS_LOCATION: string;
+  const editList: Function;
+}
+
+interface IconIdentifier {
+  collapse: string;
+  expand: string;
+  editMultiple: string;
+}
+interface RecordlistIdentifier {
+  entity: string;
+  toggle: string;
+  icons: IconIdentifier;
+}
+
+/**
+ * Module: TYPO3/CMS/Recordlist/Recordlist
+ * Usability improvements for the record list
+ * @exports TYPO3/CMS/Recordlist/Recordlist
+ */
+class Recordlist {
+  identifier: RecordlistIdentifier = {
+    entity: '.t3js-entity',
+    toggle: '.t3js-toggle-recordlist',
+    icons: {
+      collapse: 'actions-view-list-collapse',
+      expand: 'actions-view-list-expand',
+      editMultiple: '.t3js-record-edit-multiple',
+    },
+  };
+
+  constructor() {
+    $(document).on('click', this.identifier.toggle, this.toggleClick);
+    $(document).on('click', this.identifier.icons.editMultiple, this.onEditMultiple);
+  }
+
+  public toggleClick = (e: JQueryEventObject): void => {
+    e.preventDefault();
+
+    const $me = $(e.currentTarget);
+    const table = $me.data('table');
+    const $target = $($me.data('target'));
+    const isExpanded = $target.data('state') === 'expanded';
+    const $collapseIcon = $me.find('.collapseIcon');
+    const toggleIcon = isExpanded ? this.identifier.icons.expand : this.identifier.icons.collapse;
+
+    Icons.getIcon(toggleIcon, Icons.sizes.small).done((icon: string): void => {
+      $collapseIcon.html(icon);
+    });
+
+    // Store collapse state in UC
+    let storedModuleDataList = {};
+
+    if (PersistentStorage.isset('moduleData.list')) {
+      storedModuleDataList = PersistentStorage.get('moduleData.list');
+    }
+
+    const collapseConfig: any = {};
+    collapseConfig[table] = isExpanded ? 1 : 0;
+
+    $.extend(true, storedModuleDataList, collapseConfig);
+    PersistentStorage.set('moduleData.list', storedModuleDataList).done((): void => {
+      $target.data('state', isExpanded ? 'collapsed' : 'expanded');
+    });
+  }
+
+  /**
+   * Handles editing multiple records.
+   */
+  public onEditMultiple = (event: JQueryEventObject): void => {
+    event.preventDefault();
+    let $tableContainer: JQuery;
+    let tableName: string;
+    let entityIdentifiers: string;
+    let uri: string;
+    let patterns: RegExpMatchArray;
+
+    $tableContainer = $(event.currentTarget).closest('[data-table]');
+    if ($tableContainer.length === 0) {
+      return;
+    }
+
+    uri = $(event.currentTarget).data('uri');
+    tableName = $tableContainer.data('table');
+    entityIdentifiers = $tableContainer
+      .find(this.identifier.entity + '[data-uid][data-table="' + tableName + '"]')
+      .map((index: number, entity: Element): void => {
+        return $(entity).data('uid');
+      })
+      .toArray()
+      .join(',');
+
+    patterns = uri.match(/{[^}]+}/g);
+    $.each(patterns, (patternIndex: string, pattern: string) => {
+      const expression: string = pattern.substr(1, pattern.length - 2);
+      const pipes: Array<string> = expression.split(':');
+      const name: string = pipes.shift();
+      let value: string;
+
+      switch (name) {
+        case 'entityIdentifiers':
+          value = entityIdentifiers;
+          break;
+        case 'T3_THIS_LOCATION':
+          value = T3_THIS_LOCATION;
+          break;
+        default:
+          return;
+      }
+
+      $.each(pipes, (pipeIndex: string, pipe: string): void => {
+        if (pipe === 'editList') {
+          value = editList(tableName, value);
+        }
+      });
+
+      uri = uri.replace(pattern, value);
+    });
+
+    window.location.href = uri;
+  }
+}
+
+export = new Recordlist();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/TelephoneLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/TelephoneLinkHandler.ts
new file mode 100644 (file)
index 0000000..f57be98
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/TelephoneLinkHandler
+ * @exports TYPO3/CMS/Recordlist/TelephoneLinkHandler
+ * Telephone link interaction
+ */
+class TelephoneLinkHandler {
+  constructor() {
+    $((): void => {
+      $('#ltelephoneform').on('submit', (event: JQueryEventObject): void => {
+        event.preventDefault();
+
+        let value = $(event.currentTarget).find('[name="ltelephone"]').val();
+        if (value === 'tel:') {
+          return;
+        }
+        if (value.indexOf('tel:') === 0) {
+          value = value.substr(4);
+        }
+
+        LinkBrowser.finalizeFunction('tel:' + value);
+      });
+    });
+  }
+}
+
+export = new TelephoneLinkHandler();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/Tooltip.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/Tooltip.ts
new file mode 100644 (file)
index 0000000..abe5de8
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import BackendTooltip = require('TYPO3/CMS/Backend/Tooltip');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/Tooltip
+ * API for tooltip windows powered by Twitter Bootstrap.
+ * @exports TYPO3/CMS/Recordlist/Tooltip
+ */
+class Tooltip {
+  constructor() {
+    $((): void => {
+      BackendTooltip.initialize('.table-fit a[title]', {
+        delay: {
+          show: 500,
+          hide: 100,
+        },
+        trigger: 'hover',
+        container: 'body',
+      });
+    });
+  }
+}
+
+export = new Tooltip();
diff --git a/typo3/sysext/recordlist/Resources/Private/TypeScript/UrlLinkHandler.ts b/typo3/sysext/recordlist/Resources/Private/TypeScript/UrlLinkHandler.ts
new file mode 100644 (file)
index 0000000..f782981
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import * as $ from 'jquery';
+import LinkBrowser = require('./LinkBrowser');
+
+/**
+ * Module: TYPO3/CMS/Recordlist/UrlLinkHandler
+ * @exports TYPO3/CMS/Recordlist/UrlLinkHandler
+ * URL link interaction
+ */
+class UrlLinkHandler {
+  constructor() {
+    $((): void => {
+      $('#lurlform').on('submit', this.link);
+    });
+  }
+
+  public link = (event: JQueryEventObject): void => {
+    event.preventDefault();
+
+    const value = $(event.currentTarget).find('[name="lurl"]').val();
+    if (value === '') {
+      return;
+    }
+    LinkBrowser.finalizeFunction(value);
+  }
+}
+
+export = new UrlLinkHandler();
index 2ab2f5e..0376961 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/BrowseDatabase
- * Database record selection
- * @exports TYPO3/CMS/Recordlist/BrowseDatabase
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/ElementBrowser'], function($, ElementBrowser) {
-  'use strict';
-
-  $(function() {
-    $('[data-close]').on('click', function(event) {
-      event.preventDefault();
-      var data = $(this).parents('span').data();
-
-      ElementBrowser.insertElement(
-        data.table,
-        data.uid,
-        'db',
-        data.title,
-        '',
-        '',
-        data.icon,
-        '',
-        $(this).data('close')
-      );
-    });
-
-    // adjust searchbox layout
-    var searchbox = document.getElementById('db_list-searchbox-toolbar');
-    searchbox.style.display = 'block';
-    searchbox.style.position = 'relative';
-  });
-
-});
+define(["require","exports","jquery","./ElementBrowser"],function(e,t,n,r){"use strict";return new function(){n(function(){n("[data-close]").on("click",function(e){e.preventDefault();var t=n(e.currentTarget).parents("span").data();r.insertElement(t.table,t.uid,"db",t.title,"","",t.icon,"",1===parseInt(n(e.currentTarget).data("close"),10))})});var e=document.getElementById("db_list-searchbox-toolbar");e.style.display="block",e.style.position="relative"}});
\ No newline at end of file
index 1c1df55..c8602d2 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/BrowseFiles
- * File selection
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/ElementBrowser', 'TYPO3/CMS/Backend/LegacyTree'], function($, ElementBrowser, Tree) {
-  'use strict';
-
-  /**
-   *
-   * @type {{elements: {}}}
-   * @exports TYPO3/CMS/Recordlist/BrowseFiles
-   */
-  var BrowseFiles = {
-    elements: {}
-  };
-
-  /**
-   * when selecting one or multiple files, this action is called
-   *
-   * @type {{insertElement: Function, insertElementMultiple: Function}}
-   */
-  BrowseFiles.File = {
-    insertElement: function(index, close) {
-      var result = false;
-      if (typeof BrowseFiles.elements[index] !== 'undefined') {
-        var element = BrowseFiles.elements[index];
-        result = ElementBrowser.insertElement(element.table, element.uid, element.type, element.fileName, element.filePath, element.fileExt, element.fileIcon, '', close);
-      }
-      return result;
-    },
-    insertElementMultiple: function(list) {
-      var uidList = [];
-      for (var i = 0, n = list.length; i < n; i++) {
-        if (typeof BrowseFiles.elements[list[i]] !== 'undefined') {
-          var element = BrowseFiles.elements[list[i]];
-          uidList.push(element.uid);
-        }
-      }
-      ElementBrowser.insertMultiple('sys_file', uidList);
-    }
-  };
-
-  /**
-   * Selector when using "Import selection" and "Toggle selection"
-   */
-  BrowseFiles.Selector = {
-    // Toggle selection button is pressed
-    toggle: function(e) {
-      e.preventDefault();
-      var items = BrowseFiles.Selector.getItems();
-      if (items.length) {
-        items.each(function(position, item) {
-          item.checked = (item.checked ? null : 'checked');
-        });
-      }
-    },
-    // Import selection button is pressed
-    handle: function(e) {
-      e.preventDefault();
-      var items = BrowseFiles.Selector.getItems();
-      var selectedItems = [];
-      if (items.length) {
-        items.each(function(position, item) {
-          if (item.checked && item.name) {
-            selectedItems.push(item.name);
-          }
-        });
-        if (selectedItems.length > 0) {
-          if (ElementBrowser.hasActionMultipleCode) {
-            BrowseFiles.File.insertElementMultiple(selectedItems);
-          } else {
-            for (var i = 0; i < selectedItems.length; i++) {
-              BrowseFiles.File.insertElement(selectedItems[i]);
-            }
-          }
-        }
-        ElementBrowser.focusOpenerAndClose(true);
-      }
-    },
-    getItems: function() {
-      return $('#typo3-filelist').find('.typo3-bulk-item');
-    }
-  };
-
-  $(function() {
-    $.extend(BrowseFiles.elements, $('body').data('elements'));
-
-    $('[data-close]').on('click', function(e) {
-      e.preventDefault();
-      BrowseFiles.File.insertElement('file_' + $(this).data('fileIndex'), $(this).data('close'));
-    });
-
-    $('#t3js-importSelection').on('click', BrowseFiles.Selector.handle);
-    $('#t3js-toggleSelection').on('click', BrowseFiles.Selector.toggle);
-  });
-
-  return BrowseFiles;
-});
+define(["require","exports","jquery","./ElementBrowser","TYPO3/CMS/Backend/LegacyTree"],function(e,t,n,i,l){"use strict";var r=function e(){l.noop(),e.File=new o,e.Selector=new c,n(function(){e.elements=n("body").data("elements"),n("[data-close]").on("click",function(t){t.preventDefault(),e.File.insertElement("file_"+n(t.currentTarget).data("fileIndex"),1===parseInt(n(t.currentTarget).data("close"),10))}),n("#t3js-importSelection").on("click",e.Selector.handle),n("#t3js-toggleSelection").on("click",e.Selector.toggle)})},o=function(){function e(){}return e.prototype.insertElement=function(e,t){var n=!1;if(void 0!==r.elements[e]){var l=r.elements[e];n=i.insertElement(l.table,l.uid,l.type,l.fileName,l.filePath,l.fileExt,l.fileIcon,"",t)}return n},e.prototype.insertElementMultiple=function(e){for(var t=0,n=e.length;t<n;t++)if(void 0!==r.elements[e[t]]){var l=r.elements[e[t]];i.insertMultiple("sys_file",l.uid)}},e}(),c=function(){function e(){var e=this;this.toggle=function(t){t.preventDefault();var n=e.getItems();n.length&&n.each(function(e,t){t.checked=t.checked?null:"checked"})},this.handle=function(t){t.preventDefault();var n=e.getItems(),l=[];if(n.length){if(n.each(function(e,t){t.checked&&t.name&&l.push(t.name)}),l.length>0)if(i.hasActionMultipleCode)r.File.insertElementMultiple(l);else for(var o=0;o<l.length;o++)r.File.insertElement(l[o]);i.focusOpenerAndClose()}}}return e.prototype.getItems=function(){return n("#typo3-filelist").find(".typo3-bulk-item")},e}();return new r});
\ No newline at end of file
index 1b73340..20f1f34 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/BrowseFolders
- * Folder selection
- * @exports TYPO3/CMS/Recordlist/BrowseFolders
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/ElementBrowser', 'TYPO3/CMS/Backend/Modal', 'TYPO3/CMS/Backend/Severity'], function($, ElementBrowser, Modal, Severity) {
-  'use strict';
-
-  $(function() {
-    $('[data-folder-id]').on('click', function(event) {
-      event.preventDefault();
-      var folderId = $(this).data('folderId');
-      var close = $(this).data('close');
-      ElementBrowser.insertElement('', folderId, 'folder', folderId, folderId, '', '', '', close);
-    });
-
-    $('.t3js-folderIdError').on('click', function(event) {
-      event.preventDefault();
-      Modal.confirm('', $(this).data('message'), Severity.error, [], []);
-    });
-  });
-
-});
+define(["require","exports","jquery","./ElementBrowser","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Severity"],function(e,r,t,n,a,o){"use strict";return new function(){t(function(){t("[data-folder-id]").on("click",function(e){e.preventDefault();var r=t(e.currentTarget),a=r.data("folderId"),o=1===parseInt(r.data("close"),10);n.insertElement("",a,"folder",a,a,"","","",o)}),t(".t3js-folderIdError").on("click",function(e){e.preventDefault(),a.confirm("",t(e.currentTarget).data("message"),o.error,[],[])})})}});
\ No newline at end of file
index 2f4cd6c..2a0253e 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/ElementBrowser
- * ElementBrowser communication with parent windows
- */
-define([
-  'jquery',
-  'TYPO3/CMS/Backend/Modal'
-], function($, Modal) {
-  'use strict';
-
-  /**
-   *
-   * @type {{thisScriptUrl: string, mode: string, formFieldName: string, hasActionMultipleCode: boolean, fieldReference: string, fieldReferenceSlashed: string, rte: {parameters: string, configuration: string}, irre: {objectId: number, checkUniqueAction: string, addAction: string, insertAction: string}}}
-   * @exports TYPO3/CMS/Recordlist/ElementBrowser
-   */
-  var ElementBrowser = {
-    thisScriptUrl: '',
-    mode: '',
-    formFieldName: '',
-    hasActionMultipleCode: false,
-    fieldReference: '',
-    fieldReferenceSlashed: '',
-    rte: {
-      parameters: '',
-      configuration: ''
-    },
-    irre: {
-      objectId: 0,
-      checkUniqueAction: '',
-      addAction: '',
-      insertAction: ''
-    }
-  };
-
-  /**
-   *
-   * @returns {Boolean}
-   */
-  ElementBrowser.setReferences = function() {
-    if (
-      ElementBrowser.getParent() && ElementBrowser.getParent().content && ElementBrowser.getParent().content.document.editform
-      && ElementBrowser.getParent().content.document.editform[ElementBrowser.formFieldName]
-    ) {
-      ElementBrowser.targetDoc = ElementBrowser.getParent().content.document;
-      ElementBrowser.elRef = ElementBrowser.targetDoc.editform[ElementBrowser.formFieldName];
-      return true;
-    } else {
-      return false;
-    }
-  };
-
-  /**
-   * Dynamically calls a function on a given context object.
-   *
-   * @param {String} functionName e.g. "inline.somefunc"
-   * @param {Object} context e.g. window
-   * @returns {*}
-   */
-  ElementBrowser.executeFunctionByName = function(functionName, context /*, args */) {
-    var args = Array.prototype.slice.call(arguments, 2);
-    var namespaces = functionName.split(".");
-    var func = namespaces.pop();
-    for (var i = 0; i < namespaces.length; i++) {
-      context = context[namespaces[i]];
-    }
-    return context[func].apply(context, args);
-  };
-
-  /**
-   * Returns the parent document object
-   */
-  ElementBrowser.getParent = function() {
-    var opener = null;
-    if (
-      typeof window.parent !== 'undefined' &&
-      typeof window.parent.document.list_frame !== 'undefined' &&
-      window.parent.document.list_frame.parent.document.querySelector('.t3js-modal-iframe') !== null
-    ) {
-      opener = window.parent.document.list_frame;
-    } else if (
-      typeof window.parent !== 'undefined' &&
-      typeof window.parent.frames.list_frame !== 'undefined' &&
-      window.parent.frames.list_frame.parent.document.querySelector('.t3js-modal-iframe') !== null
-    ) {
-      opener = window.parent.frames.list_frame;
-    } else if (
-      typeof window.frames !== 'undefined' &&
-      typeof window.frames.frameElement !== 'undefined' &&
-      window.frames.frameElement !== null &&
-      window.frames.frameElement.classList.contains('t3js-modal-iframe')
-    ) {
-      opener = window.frames.frameElement.contentWindow.parent;
-    } else if (window.opener) {
-      opener = window.opener;
-    }
-    return opener;
-  };
-
-  /**
-   *
-   * @param {String} table
-   * @param {Number} uid
-   * @param {String} type
-   * @param {String} filename
-   * @param {String} fp
-   * @param {String} filetype
-   * @param {String} imagefile
-   * @param {String} action
-   * @param {String} close
-   * @returns {Boolean}
-   */
-  ElementBrowser.insertElement = function(table, uid, type, filename, fp, filetype, imagefile, action, close) {
-    var performAction = true;
-
-    // Call a check function in the opener window (e.g. for uniqueness handling):
-    if (ElementBrowser.irre.objectId && ElementBrowser.irre.checkUniqueAction) {
-      if (ElementBrowser.getParent()) {
-        var res = ElementBrowser.executeFunctionByName(ElementBrowser.irre.checkUniqueAction, ElementBrowser.getParent(), ElementBrowser.irre.objectId, table, uid, type);
-        if (!res.passed) {
-          if (res.message) {
-            alert(res.message);
-          }
-          performAction = false;
-        }
-      } else {
-        alert("Error - reference to main window is not set properly!");
-        ElementBrowser.focusOpenerAndClose();
-      }
-    }
-    // Call performing function and finish this action:
-    if (performAction) {
-      // Call helper function to manage data in the opener window:
-      if (ElementBrowser.irre.objectId && ElementBrowser.irre.addAction) {
-        if (ElementBrowser.getParent()) {
-          ElementBrowser.executeFunctionByName(ElementBrowser.irre.addAction, ElementBrowser.getParent(), ElementBrowser.irre.objectId, table, uid, type, ElementBrowser.fieldReferenceSlashed);
-        } else {
-          alert("Error - reference to main window is not set properly!");
-          ElementBrowser.focusOpenerAndClose();
-        }
-      }
-      if (ElementBrowser.irre.objectId && ElementBrowser.irre.insertAction) {
-        if (ElementBrowser.getParent()) {
-          ElementBrowser.executeFunctionByName(ElementBrowser.irre.insertAction, ElementBrowser.getParent(), ElementBrowser.irre.objectId, table, uid, type);
-          if (close) {
-            ElementBrowser.focusOpenerAndClose();
-          }
-        } else {
-          alert("Error - reference to main window is not set properly!");
-          if (close) {
-            ElementBrowser.focusOpenerAndClose();
-          }
-        }
-      } else if (ElementBrowser.fieldReference && !ElementBrowser.rte.parameters && !ElementBrowser.rte.configuration) {
-        ElementBrowser.addElement(filename, table + "_" + uid, fp, close);
-      } else {
-        if (
-          ElementBrowser.getParent() && ElementBrowser.getParent().content && ElementBrowser.getParent().content.document.editform
-          && ElementBrowser.getParent().content.document.editform[ElementBrowser.formFieldName]
-        ) {
-          ElementBrowser.getParent().group_change(
-            "add",
-            ElementBrowser.fieldReference,
-            ElementBrowser.rte.parameters,
-            ElementBrowser.rte.configuration,
-            ElementBrowser.targetDoc.editform[ElementBrowser.formFieldName],
-            ElementBrowser.getParent().content.document
-          );
-        } else {
-          alert("Error - reference to main window is not set properly!");
-        }
-        if (close) {
-          ElementBrowser.focusOpenerAndClose();
-        }
-      }
-    }
-    return false;
-  };
-
-  /**
-   *
-   * @param {String} table
-   * @param {Number} uid
-   * @returns {Boolean}
-   */
-  ElementBrowser.insertMultiple = function(table, uid) {
-    var type = "";
-    if (ElementBrowser.irre.objectId && ElementBrowser.irre.insertAction) {
-      // Call helper function to manage data in the opener window:
-      if (ElementBrowser.getParent()) {
-        ElementBrowser.executeFunctionByName(ElementBrowser.irre.insertAction + 'Multiple', ElementBrowser.getParent(), ElementBrowser.irre.objectId, table, uid, type, ElementBrowser.fieldReference);
-      } else {
-        alert("Error - reference to main window is not set properly!");
-        ElementBrowser.focusOpenerAndClose();
-      }
-    }
-    return false;
-  };
-
-  /**
-   *
-   * @param {String} elName
-   * @param {String} elValue
-   * @param {String} altElValue
-   * @param {String} close
-   */
-  ElementBrowser.addElement = function(elName, elValue, altElValue, close) {
-    if (ElementBrowser.getParent() && ElementBrowser.getParent().setFormValueFromBrowseWin) {
-      ElementBrowser.getParent().setFormValueFromBrowseWin(ElementBrowser.fieldReference, altElValue ? altElValue : elValue, elName);
-      if (close) {
-        ElementBrowser.focusOpenerAndClose();
-      }
-    } else {
-      alert("Error - reference to main window is not set properly!");
-      ElementBrowser.focusOpenerAndClose();
-    }
-  };
-
-  /**
-   *
-   */
-  ElementBrowser.focusOpenerAndClose = function() {
-    if (ElementBrowser.getParent()) {
-      ElementBrowser.getParent().focus();
-    }
-    Modal.dismiss();
-    close();
-  };
-
-  $(function() {
-    var data = $('body').data();
-
-    ElementBrowser.thisScriptUrl = data.thisScriptUrl;
-    ElementBrowser.mode = data.mode;
-    ElementBrowser.formFieldName = data.formFieldName;
-    ElementBrowser.fieldReference = data.fieldReference;
-    ElementBrowser.fieldReferenceSlashed = data.fieldReferenceSlashed;
-    ElementBrowser.rte.parameters = data.rteParameters;
-    ElementBrowser.rte.configuration = data.rteConfiguration;
-    ElementBrowser.irre.checkUniqueAction = data.irreCheckUniqueAction;
-    ElementBrowser.irre.addAction = data.irreAddAction;
-    ElementBrowser.irre.insertAction = data.irreInsertAction;
-    ElementBrowser.irre.objectId = data.irreObjectId;
-    ElementBrowser.hasActionMultipleCode = ElementBrowser.irre.objectId && ElementBrowser.irre.insertAction;
-  });
-
-  /**
-   * Global jumpTo function
-   *
-   * Used by tree implementation
-   *
-   * @param {String} URL
-   * @param {String} anchor
-   * @returns {Boolean}
-   */
-  window.jumpToUrl = function(URL, anchor) {
-    if (URL.charAt(0) === '?') {
-      URL = ElementBrowser.thisScriptUrl + URL.substring(1);
-    }
-    var add_mode = URL.indexOf("mode=") === -1 ? '&mode=' + encodeURIComponent(ElementBrowser.mode) : "";
-    window.location.href = URL + add_mode + (typeof(anchor) === "string" ? anchor : '');
-    return false;
-  };
-
-  return ElementBrowser;
-});
+define(["require","exports","jquery","TYPO3/CMS/Backend/Modal"],function(e,t,r,i){"use strict";return new(function(){function e(){var e=this;this.hasActionMultipleCode=!1,this.thisScriptUrl="",this.mode="",this.formFieldName="",this.fieldReference="",this.fieldReferenceSlashed="",this.rte={parameters:"",configuration:""},this.irre={objectId:0,checkUniqueAction:"",addAction:"",insertAction:""},this.focusOpenerAndClose=function(){e.getParent()&&e.getParent().focus(),i.dismiss(),close()},r(function(){var t=r("body").data();e.thisScriptUrl=t.thisScriptUrl,e.mode=t.mode,e.formFieldName=t.formFieldName,e.fieldReference=t.fieldReference,e.fieldReferenceSlashed=t.fieldReferenceSlashed,e.rte.parameters=t.rteParameters,e.rte.configuration=t.rteConfiguration,e.irre.checkUniqueAction=t.irreCheckUniqueAction,e.irre.addAction=t.irreAddAction,e.irre.insertAction=t.irreInsertAction,e.irre.objectId=t.irreObjectId,e.hasActionMultipleCode=e.irre.objectId>0&&""!==e.irre.insertAction}),window.jumpToUrl=function(t,r){"?"===t.charAt(0)&&(t=e.thisScriptUrl+t.substring(1));var i=-1===t.indexOf("mode=")?"&mode="+encodeURIComponent(e.mode):"";return window.location.href=t+i+("string"==typeof r?r:""),!1}}return e.prototype.setReferences=function(){return!!(this.getParent()&&this.getParent().content&&this.getParent().content.document.editform&&this.getParent().content.document.editform[this.formFieldName])&&(this.targetDoc=this.getParent().content.document,this.elRef=this.targetDoc.editform[this.formFieldName],!0)},e.prototype.executeFunctionByName=function(e,t){for(var r=[],i=2;i<arguments.length;i++)r[i-2]=arguments[i];for(var n=e.split("."),o=n.pop(),s=0;s<n.length;s++)t=t[n[s]];return t[o].apply(t,r)},e.prototype.getParent=function(){var e=null;return void 0!==window.parent&&void 0!==window.parent.document.list_frame&&null!==window.parent.document.list_frame.parent.document.querySelector(".t3js-modal-iframe")?e=window.parent.document.list_frame:void 0!==window.parent&&void 0!==window.parent.frames.list_frame&&null!==window.parent.frames.list_frame.parent.document.querySelector(".t3js-modal-iframe")?e=window.parent.frames.list_frame:void 0!==window.frames&&void 0!==window.frames.frameElement&&null!==window.frames.frameElement&&window.frames.frameElement.classList.contains("t3js-modal-iframe")?e=window.frames.frameElement.contentWindow.parent:window.opener&&(e=window.opener),e},e.prototype.insertElement=function(e,t,r,i,n,o,s,a,c){var d=!0;if(this.irre.objectId&&this.irre.checkUniqueAction)if(this.getParent()){var f=this.executeFunctionByName(this.irre.checkUniqueAction,this.getParent(),this.irre.objectId,e,t,r);f.passed||(f.message&&alert(f.message),d=!1)}else alert("Error - reference to main window is not set properly!"),this.focusOpenerAndClose();return d&&(this.irre.objectId&&this.irre.addAction&&(this.getParent()?this.executeFunctionByName(this.irre.addAction,this.getParent(),this.irre.objectId,e,t,r,this.fieldReferenceSlashed):(alert("Error - reference to main window is not set properly!"),this.focusOpenerAndClose())),this.irre.objectId&&this.irre.insertAction?this.getParent()?(this.executeFunctionByName(this.irre.insertAction,this.getParent(),this.irre.objectId,e,t,r),c&&this.focusOpenerAndClose()):(alert("Error - reference to main window is not set properly!"),c&&this.focusOpenerAndClose()):!this.fieldReference||this.rte.parameters||this.rte.configuration?(this.getParent()&&this.getParent().content&&this.getParent().content.document.editform&&this.getParent().content.document.editform[this.formFieldName]?this.getParent().group_change("add",this.fieldReference,this.rte.parameters,this.rte.configuration,this.targetDoc.editform[this.formFieldName],this.getParent().content.document):alert("Error - reference to main window is not set properly!"),c&&this.focusOpenerAndClose()):this.addElement(i,e+"_"+t,n,c)),!1},e.prototype.insertMultiple=function(e,t){return this.irre.objectId&&this.irre.insertAction&&(this.getParent()?this.executeFunctionByName(this.irre.insertAction+"Multiple",this.getParent(),this.irre.objectId,e,t,"",this.fieldReference):(alert("Error - reference to main window is not set properly!"),this.focusOpenerAndClose())),!1},e.prototype.addElement=function(e,t,r,i){this.getParent()&&this.getParent().setFormValueFromBrowseWin?(this.getParent().setFormValueFromBrowseWin(this.fieldReference,r||t,e),i&&this.focusOpenerAndClose()):(alert("Error - reference to main window is not set properly!"),this.focusOpenerAndClose())},e}())});
\ No newline at end of file
index 3d2b2b9..6ed04ad 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/FieldSelectBox
- * Check-all / uncheck-all for the Database Recordlist fieldSelectBox
- * @exports TYPO3/CMS/Recordlist/FieldSelectBox
- */
-define(['jquery'], function($) {
-  'use strict';
-
-  $(function() {
-    $('.fieldSelectBox .checkAll').change(function() {
-      var checked = $(this).prop('checked');
-      var $checkboxes = $('.fieldSelectBox tbody').find(':checkbox');
-      $checkboxes.each(function() {
-        if (!$(this).prop('disabled')) {
-          $(this).prop('checked', checked);
-        }
-      });
-    });
-  });
-
-});
+define(["require","exports","jquery"],function(e,c,n){"use strict";return new function(){n(function(){n(".fieldSelectBox .checkAll").change(function(e){var c=n(e.currentTarget).prop("checked");n(".fieldSelectBox tbody").find(":checkbox").each(function(e,r){n(r).prop("disabled")||n(r).prop("checked",c)})})})}});
\ No newline at end of file
index 3a64c06..d433e99 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/FileLinkHandler
- * File link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser', 'TYPO3/CMS/Backend/LegacyTree'], function($, LinkBrowser, Tree) {
-  'use strict';
-
-  /**
-   *
-   * @type {{currentLink: string}}
-   * @exports TYPO3/CMS/Recordlist/FileLinkHandler
-   */
-  var FileLinkHandler = {
-    currentLink: ''
-  };
-
-  /**
-   *
-   * @param {Event} event
-   */
-  FileLinkHandler.linkFile = function(event) {
-    event.preventDefault();
-    LinkBrowser.finalizeFunction($(this).attr('href'));
-  };
-
-  /**
-   *
-   * @param {Event} event
-   */
-  FileLinkHandler.linkCurrent = function(event) {
-    event.preventDefault();
-    LinkBrowser.finalizeFunction(FileLinkHandler.currentLink);
-  };
-
-  $(function() {
-    FileLinkHandler.currentLink = $('body').data('currentLink');
-    $('a.t3js-fileLink').on('click', FileLinkHandler.linkFile);
-    $('input.t3js-linkCurrent').on('click', FileLinkHandler.linkCurrent);
-  });
-
-  return FileLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser","TYPO3/CMS/Backend/LegacyTree"],function(n,e,i,t,r){"use strict";return new function(){var n=this;this.currentLink="",this.linkFile=function(n){n.preventDefault(),t.finalizeFunction(i(n.currentTarget).attr("href"))},this.linkCurrent=function(e){e.preventDefault(),t.finalizeFunction(n.currentLink)},r.noop(),i(function(){n.currentLink=i("body").data("currentLink"),i("a.t3js-fileLink").on("click",n.linkFile),i("input.t3js-linkCurrent").on("click",n.linkCurrent)})}});
\ No newline at end of file
index a75b9c1..db5d515 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/LinkBrowser
- * LinkBrowser communication with parent window
- */
-define(['jquery'], function($) {
-  'use strict';
-
-  /**
-   *
-   * @type {{thisScriptUrl: string, urlParameters: {}, parameters: {}, addOnParams: string, linkAttributeFields: Array, additionalLinkAttributes: {}, finalizeFunction: null}}
-   * @exports TYPO3/CMS/Recordlist/LinkBrowser
-   */
-  var LinkBrowser = {
-    thisScriptUrl: '',
-    urlParameters: {},
-    parameters: {},
-    addOnParams: '',
-    linkAttributeFields: [],
-    additionalLinkAttributes: {},
-    finalizeFunction: null
-  };
-
-  /**
-   * Collect the link attributes values as object
-   *
-   * @returns {Object}
-   */
-  LinkBrowser.getLinkAttributeValues = function() {
-    var attributeValues = {};
-    $.each(LinkBrowser.linkAttributeFields, function(index, fieldName) {
-      var val = $('[name="l' + fieldName + '"]').val();
-      if (val) {
-        attributeValues[fieldName] = val;
-      }
-    });
-    $.extend(attributeValues, LinkBrowser.additionalLinkAttributes);
-    return attributeValues;
-  };
-
-  /**
-   *
-   */
-  LinkBrowser.loadTarget = function() {
-    $('.t3js-linkTarget').val($(this).val());
-    this.selectedIndex = 0;
-  };
-
-  /**
-   * Encode objects to GET parameter arrays in PHP notation
-   *
-   * @param {Object} obj
-   * @param {String} prefix
-   * @param {String} url
-   * @returns {String}
-   */
-  LinkBrowser.encodeGetParameters = function(obj, prefix, url) {
-    var str = [];
-    for (var p in obj) {
-      if (obj.hasOwnProperty(p)) {
-        var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
-        if (url.indexOf(k + "=") === -1) {
-          str.push(
-            typeof v === "object"
-              ? LinkBrowser.encodeGetParameters(v, k, url)
-              : encodeURIComponent(k) + "=" + encodeURIComponent(v)
-          );
-        }
-      }
-    }
-    return '&' + str.join("&");
-  };
-
-  /**
-   * Set an additional attribute for the link
-   *
-   * @param {String} name
-   * @param value
-   */
-  LinkBrowser.setAdditionalLinkAttribute = function(name, value) {
-    LinkBrowser.additionalLinkAttributes[name] = value;
-  };
-
-  /**
-   * Stores the final link
-   *
-   * This method MUST be overridden in the actual implementation of the link browser.
-   * The function is responsible for encoding the link (and possible link attributes) and
-   * returning it to the caller (e.g. FormEngine, RTE, etc)
-   *
-   * @param {String} link The select element or anything else which identifies the link (e.g. "page:<pageUid>" or "file:<uid>")
-   */
-  LinkBrowser.finalizeFunction = function(link) {
-    throw 'The link browser requires the finalizeFunction to be set. Seems like you discovered a major bug.';
-  };
-
-  $(function() {
-    var data = $('body').data();
-
-    LinkBrowser.thisScriptUrl = data.thisScriptUrl;
-    LinkBrowser.urlParameters = data.urlParameters;
-    LinkBrowser.parameters = data.parameters;
-    LinkBrowser.addOnParams = data.addOnParams;
-    LinkBrowser.linkAttributeFields = data.linkAttributeFields;
-
-    $('.t3js-targetPreselect').on('change', LinkBrowser.loadTarget);
-    $('form.t3js-dummyform').on('submit', function(evt) {
-      evt.preventDefault();
-    });
-  });
-
-  /**
-   * Global jumpTo function
-   *
-   * Used by tree implementation
-   *
-   * @param {String} URL
-   * @param {String} anchor
-   * @returns {Boolean}
-   */
-  window.jumpToUrl = function(URL, anchor) {
-    if (URL.charAt(0) === '?') {
-      URL = LinkBrowser.thisScriptUrl + URL.substring(1);
-    }
-    var urlParameters = LinkBrowser.encodeGetParameters(LinkBrowser.urlParameters, '', URL);
-    var parameters = LinkBrowser.encodeGetParameters(LinkBrowser.getLinkAttributeValues(), 'linkAttributes', '');
-
-    window.location.href = URL + urlParameters + parameters + LinkBrowser.addOnParams + (typeof(anchor) === "string" ? anchor : '');
-    return false;
-  };
-
-  return LinkBrowser;
-});
+define(["require","exports","jquery"],function(t,e,r){"use strict";return new(function(){function t(){var t=this;this.thisScriptUrl="",this.urlParameters={},this.parameters={},this.addOnParams="",this.additionalLinkAttributes={},this.loadTarget=function(t){var e=r(t.currentTarget);r(".t3js-linkTarget").val(e.val()),e.get(0).selectedIndex=0},r(function(){var e=r("body").data();t.thisScriptUrl=e.thisScriptUrl,t.urlParameters=e.urlParameters,t.parameters=e.parameters,t.addOnParams=e.addOnParams,t.linkAttributeFields=e.linkAttributeFields,r(".t3js-targetPreselect").on("change",t.loadTarget),r("form.t3js-dummyform").on("submit",function(t){t.preventDefault()})}),window.jumpToUrl=function(e,r){"?"===e.charAt(0)&&(e=t.thisScriptUrl+e.substring(1));var i=t.encodeGetParameters(t.urlParameters,"",e),n=t.encodeGetParameters(t.getLinkAttributeValues(),"linkAttributes","");return window.location.href=e+i+n+t.addOnParams+("string"==typeof r?r:""),!1}}return t.prototype.getLinkAttributeValues=function(){var t={};return r.each(this.linkAttributeFields,function(e,i){var n=r('[name="l'+i+'"]').val();n&&(t[i]=n)}),r.extend(t,this.additionalLinkAttributes),t},t.prototype.encodeGetParameters=function(t,e,r){var i=[];for(var n in t)if(t.hasOwnProperty(n)){var a=e?e+"["+n+"]":n,o=t[n];-1===r.indexOf(a+"=")&&i.push("object"==typeof o?this.encodeGetParameters(o,a,r):encodeURIComponent(a)+"="+encodeURIComponent(o))}return"&"+i.join("&")},t.prototype.setAdditionalLinkAttribute=function(t,e){this.additionalLinkAttributes[t]=e},t.prototype.finalizeFunction=function(t){throw"The link browser requires the finalizeFunction to be set. Seems like you discovered a major bug."},t}())});
\ No newline at end of file
index 8dfff93..bcc8c6d 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/MailLinkHandler
- * Mail link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {
-  'use strict';
-
-  /**
-   *
-   * @type {{}}
-   * @exports TYPO3/CMS/Recordlist/MailLinkHandler
-   */
-  var MailLinkHandler = {};
-
-  $(function() {
-    $('#lmailform').on('submit', function(event) {
-      event.preventDefault();
-
-      var value = $(this).find('[name="lemail"]').val();
-      if (value === 'mailto:') {
-        return;
-      }
-
-      while (value.substr(0, 7) === 'mailto:') {
-        value = value.substr(7);
-      }
-
-      LinkBrowser.finalizeFunction('mailto:' + value);
-    });
-  });
-
-  return MailLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser"],function(n,i,t,e){"use strict";return new function(){t(function(){t("#lmailform").on("submit",function(n){n.preventDefault();var i=t(n.currentTarget).find('[name="lemail"]').val();if("mailto:"!==i){for(;"mailto:"===i.substr(0,7);)i=i.substr(7);e.finalizeFunction("mailto:"+i)}})})}});
\ No newline at end of file
index f7488cc..607909d 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/PageLinkHandler
- * Page link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {
-  'use strict';
-
-  /**
-   *
-   * @type {{currentLink: string}}
-   * @exports TYPO3/CMS/Recordlist/PageLinkHandler
-   */
-  var PageLinkHandler = {
-    currentLink: ''
-  };
-
-  /**
-   *
-   * @param {Event} event
-   */
-  PageLinkHandler.linkPage = function(event) {
-    event.preventDefault();
-    LinkBrowser.finalizeFunction($(this).attr('href'));
-  };
-
-  /**
-   *
-   * @param {Event} event
-   */
-  PageLinkHandler.linkPageByTextfield = function(event) {
-    event.preventDefault();
-
-    var value = $('#luid').val();
-    if (!value) {
-      return;
-    }
-
-    LinkBrowser.finalizeFunction(value);
-  };
-
-  /**
-   *
-   * @param {Event} event
-   */
-  PageLinkHandler.linkCurrent = function(event) {
-    event.preventDefault();
-    LinkBrowser.finalizeFunction(PageLinkHandler.currentLink);
-  };
-
-  $(function() {
-    PageLinkHandler.currentLink = $('body').data('currentLink');
-
-    $('a.t3js-pageLink').on('click', PageLinkHandler.linkPage);
-    $('input.t3js-linkCurrent').on('click', PageLinkHandler.linkCurrent);
-    $('input.t3js-pageLink').on('click', PageLinkHandler.linkPageByTextfield);
-  });
-
-  return PageLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser"],function(n,i,t,e){"use strict";return new function(){var n=this;this.currentLink="",this.linkPage=function(n){n.preventDefault(),e.finalizeFunction(t(n.currentTarget).attr("href"))},this.linkPageByTextfield=function(n){n.preventDefault();var i=t("#luid").val();i&&e.finalizeFunction(i)},this.linkCurrent=function(i){i.preventDefault(),e.finalizeFunction(n.currentLink)},t(function(){n.currentLink=t("body").data("currentLink"),t("a.t3js-pageLink").on("click",n.linkPage),t("input.t3js-linkCurrent").on("click",n.linkCurrent),t("input.t3js-pageLink").on("click",n.linkPageByTextfield)})}});
\ No newline at end of file
index f7a904e..9d4f941 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/RecordLinkHandler
- * record link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {
-  'use strict';
-
-  /**
-   * @type {{currentLink: string, identifier: string, linkRecord: function, linkCurrent: function}}
-   */
-  var RecordLinkHandler = {
-    currentLink: '',
-    identifier: '',
-
-    /**
-     * @param {Event} event
-     */
-    linkRecord: function(event) {
-      event.preventDefault();
-
-      var data = $(this).parents('span').data();
-      LinkBrowser.finalizeFunction(RecordLinkHandler.identifier + data.uid);
-    },
-
-    /**
-     * @param {Event} event
-     */
-    linkCurrent: function(event) {
-      event.preventDefault();
-
-      LinkBrowser.finalizeFunction(RecordLinkHandler.currentLink);
-    }
-  };
-
-  $(function() {
-    var body = $('body');
-    RecordLinkHandler.currentLink = body.data('currentLink');
-    RecordLinkHandler.identifier = body.data('identifier');
-
-    // adjust searchbox layout
-    var searchbox = document.getElementById('db_list-searchbox-toolbar');
-    searchbox.style.display = 'block';
-    searchbox.style.position = 'relative';
-
-    $('[data-close]').on('click', RecordLinkHandler.linkRecord);
-    $('input.t3js-linkCurrent').on('click', RecordLinkHandler.linkCurrent);
-  });
-
-  return RecordLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser"],function(n,i,t,e){"use strict";return new function(){var n=this;this.currentLink="",this.identifier="",this.linkRecord=function(i){i.preventDefault();var r=t(i.currentTarget).parents("span").data();e.finalizeFunction(n.identifier+r.uid)},this.linkCurrent=function(i){i.preventDefault(),e.finalizeFunction(n.currentLink)},t(function(){var i=t("body");n.currentLink=i.data("currentLink"),n.identifier=i.data("identifier");var e=document.getElementById("db_list-searchbox-toolbar");e.style.display="block",e.style.position="relative",t("[data-close]").on("click",n.linkRecord),t("input.t3js-linkCurrent").on("click",n.linkCurrent)})}});
\ No newline at end of file
index 86f9c5f..6d8b599 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/Recordlist
- * Usability improvements for the record list
- */
-define(['jquery', 'TYPO3/CMS/Backend/Storage/Persistent', 'TYPO3/CMS/Backend/Icons'], function($, PersistentStorage, Icons) {
-  'use strict';
-
-  /**
-   * @type {Object}
-   * @exports TYPO3/CMS/Recordlist/Recordlist
-   */
-  var Recordlist = {
-    identifier: {
-      entity: '.t3js-entity',
-      toggle: '.t3js-toggle-recordlist',
-      icons: {
-        collapse: 'actions-view-list-collapse',
-        expand: 'actions-view-list-expand',
-        editMultiple: '.t3js-record-edit-multiple'
-      }
-    }
-  };
-
-  /**
-   * @param {MouseEvent} e
-   */
-  Recordlist.toggleClick = function(e) {
-    e.preventDefault();
-
-    var $me = $(this),
-      table = $me.data('table'),
-      $target = $($me.data('target')),
-      isExpanded = $target.data('state') === 'expanded',
-      $collapseIcon = $me.find('.collapseIcon'),
-      toggleIcon = isExpanded ? Recordlist.identifier.icons.expand : Recordlist.identifier.icons.collapse;
-
-    Icons.getIcon(toggleIcon, Icons.sizes.small).done(function(toggleIcon) {
-      $collapseIcon.html(toggleIcon);
-    });
-
-    // Store collapse state in UC
-    var storedModuleDataList = {};
-
-    if (PersistentStorage.isset('moduleData.list')) {
-      storedModuleDataList = PersistentStorage.get('moduleData.list');
-    }
-
-    var collapseConfig = {};
-    collapseConfig[table] = isExpanded ? 1 : 0;
-
-    $.extend(true, storedModuleDataList, collapseConfig);
-    PersistentStorage.set('moduleData.list', storedModuleDataList).done(function() {
-      $target.data('state', isExpanded ? 'collapsed' : 'expanded');
-    });
-  };
-
-  /**
-   * Handles editing multiple records.
-   *
-   * @param {MouseEvent} event
-   */
-  Recordlist.onEditMultiple = function(event) {
-    event.preventDefault();
-
-    var $tableContainer, tableName, entityIdentifiers, uri, patterns;
-
-    $tableContainer = $(this).closest('[data-table]');
-    if ($tableContainer.length === 0) {
-      return;
-    }
-
-    uri = $(this).data('uri');
-    tableName = $tableContainer.data('table');
-    entityIdentifiers = $tableContainer
-      .find(Recordlist.identifier.entity + '[data-uid][data-table="' + tableName + '"]')
-      .map(function(index, entity) {
-        return $(entity).data('uid');
-      })
-      .toArray()
-      .join(',');
-
-    patterns = uri.match(/{[^}]+}/g);
-    $.each(patterns, function(patternIndex, pattern) {
-      var expression = pattern.substr(1, pattern.length - 2);
-      var pipes = expression.split(':');
-      var name = pipes.shift();
-      var value;
-
-      switch (name) {
-        case 'entityIdentifiers':
-          value = entityIdentifiers;
-          break;
-        case 'T3_THIS_LOCATION':
-          value = T3_THIS_LOCATION;
-          break;
-        default:
-          return;
-      }
-
-      $.each(pipes, function(pipeIndex, pipe) {
-        if (pipe === 'editList') {
-          value = editList(tableName, value);
-        }
-      });
-
-      uri = uri.replace(pattern, value);
-    });
-
-    window.location.href = uri;
-  };
-
-  $(document).on('click', Recordlist.identifier.toggle, Recordlist.toggleClick);
-  $(document).on('click', Recordlist.identifier.icons.editMultiple, Recordlist.onEditMultiple);
-
-  return Recordlist;
-});
+define(["require","exports","jquery","TYPO3/CMS/Backend/Storage/Persistent","TYPO3/CMS/Backend/Icons"],function(t,e,i,a,n){"use strict";return new function(){var t=this;this.identifier={entity:".t3js-entity",toggle:".t3js-toggle-recordlist",icons:{collapse:"actions-view-list-collapse",expand:"actions-view-list-expand",editMultiple:".t3js-record-edit-multiple"}},this.toggleClick=function(e){e.preventDefault();var l=i(e.currentTarget),s=l.data("table"),d=i(l.data("target")),r="expanded"===d.data("state"),o=l.find(".collapseIcon"),c=r?t.identifier.icons.expand:t.identifier.icons.collapse;n.getIcon(c,n.sizes.small).done(function(t){o.html(t)});var u={};a.isset("moduleData.list")&&(u=a.get("moduleData.list"));var f={};f[s]=r?1:0,i.extend(!0,u,f),a.set("moduleData.list",u).done(function(){d.data("state",r?"collapsed":"expanded")})},this.onEditMultiple=function(e){var a,n,l,s,d;e.preventDefault(),0!==(a=i(e.currentTarget).closest("[data-table]")).length&&(s=i(e.currentTarget).data("uri"),n=a.data("table"),l=a.find(t.identifier.entity+'[data-uid][data-table="'+n+'"]').map(function(t,e){return i(e).data("uid")}).toArray().join(","),d=s.match(/{[^}]+}/g),i.each(d,function(t,e){var a,d=e.substr(1,e.length-2).split(":");switch(d.shift()){case"entityIdentifiers":a=l;break;case"T3_THIS_LOCATION":a=T3_THIS_LOCATION;break;default:return}i.each(d,function(t,e){"editList"===e&&(a=editList(n,a))}),s=s.replace(e,a)}),window.location.href=s)},i(document).on("click",this.identifier.toggle,this.toggleClick),i(document).on("click",this.identifier.icons.editMultiple,this.onEditMultiple)}});
\ No newline at end of file
index 461363e..0f970f6 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/TelephoneLinkHandler
- * Telephone link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {
-  'use strict';
-
-  /**
-   *
-   * @type {{}}
-   * @exports TYPO3/CMS/Recordlist/TelephoneLinkHandler
-   */
-  var TelephoneLinkHandler = {};
-
-  $(function() {
-    $('#ltelephoneform').on('submit', function(event) {
-      event.preventDefault();
-
-      var value = $(this).find('[name="ltelephone"]').val();
-      if (value === 'tel:') {
-        return;
-      }
-      if (value.indexOf('tel:') === 0) {
-        value = value.substr(4);
-      }
-
-      LinkBrowser.finalizeFunction('tel:' + value);
-    });
-  });
-
-  return TelephoneLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser"],function(e,n,t,r){"use strict";return new function(){t(function(){t("#ltelephoneform").on("submit",function(e){e.preventDefault();var n=t(e.currentTarget).find('[name="ltelephone"]').val();"tel:"!==n&&(0===n.indexOf("tel:")&&(n=n.substr(4)),r.finalizeFunction("tel:"+n))})})}});
\ No newline at end of file
index e7887c3..6f20ee1 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/Tooltip
- * API for tooltip windows powered by Twitter Bootstrap.
- * @exports TYPO3/CMS/Recordlist/Tooltip
- */
-define(['jquery', 'TYPO3/CMS/Backend/Tooltip'], function($, Tooltip) {
-  'use strict';
-
-  $(function() {
-    Tooltip.initialize('.table-fit a[title]', {
-      delay: {
-        show: 500,
-        hide: 100
-      },
-      trigger: 'hover',
-      container: 'body'
-    });
-  });
-
-});
+define(["require","exports","jquery","TYPO3/CMS/Backend/Tooltip"],function(e,i,t,n){"use strict";return new function(){t(function(){n.initialize(".table-fit a[title]",{delay:{show:500,hide:100},trigger:"hover",container:"body"})})}});
\ No newline at end of file
index 6b5495d..4834144 100644 (file)
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Recordlist/UrlLinkHandler
- * URL link interaction
- */
-define(['jquery', 'TYPO3/CMS/Recordlist/LinkBrowser'], function($, LinkBrowser) {
-  'use strict';
-
-  /**
-   *
-   * @type {{}}
-   * @exports TYPO3/CMS/Recordlist/UrlLinkHandler
-   */
-  var UrlLinkHandler = {};
-
-  /**
-   *
-   * @param {Event} event
-   */
-  UrlLinkHandler.link = function(event) {
-    event.preventDefault();
-
-    var value = $(this).find('[name="lurl"]').val();
-    if (value === "") {
-       return;
-    }
-
-    LinkBrowser.finalizeFunction(value);
-  };
-
-  $(function() {
-    $('#lurlform').on('submit', UrlLinkHandler.link);
-  });
-
-  return UrlLinkHandler;
-});
+define(["require","exports","jquery","./LinkBrowser"],function(n,r,e,i){"use strict";return new function(){var n=this;this.link=function(n){n.preventDefault();var r=e(n.currentTarget).find('[name="lurl"]').val();""!==r&&i.finalizeFunction(r)},e(function(){e("#lurlform").on("submit",n.link)})}});
\ No newline at end of file