[TASK] Split action buttons into two groups 88/34788/33
authorAndreas Fernandez <a.fernandez@scripting-base.de>
Sat, 29 Nov 2014 23:35:38 +0000 (00:35 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 7 Feb 2015 18:53:13 +0000 (19:53 +0100)
The buttons in Web>List are split into two different groups: "primary"
and "secondary". Primary buttons are always visible and represent the
default RUD actions (Show, edit, hide, delete).

This patch also modifies the "Extended view" (EV) behaviour, which
affects the secondary buttons:
If EV is disabled, the secondary buttons are invisible, but can be made
visibile by hovering the trigger button. If EV is enabled, the secondary
buttons are always visible.

CSS rules for buttons in tables are now streamlined with the
backend. The blue styling for checked checkboxes in tables is
removed in favor of a cleaner implementation.

Resolves: #63207
Releases: master
Change-Id: Id1bfd42e658e9dbe0a7c13066fed618539fd5ce0
Reviewed-on: http://review.typo3.org/34788
Reviewed-by: Benjamin Kott <info@bk2k.info>
Tested-by: Benjamin Kott <info@bk2k.info>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
26 files changed:
typo3/sysext/backend/Classes/Clipboard/Clipboard.php
typo3/sysext/beuser/Classes/ViewHelpers/RemoveUserViewHelper.php
typo3/sysext/beuser/Classes/ViewHelpers/SwitchUserViewHelper.php
typo3/sysext/beuser/Resources/Private/Partials/BackendUser/IndexListRow.html
typo3/sysext/beuser/Resources/Private/Partials/BackendUser/OnlineListRow.html
typo3/sysext/beuser/Resources/Private/Templates/BackendUser/Compare.html
typo3/sysext/core/Classes/Database/QueryView.php
typo3/sysext/core/Documentation/Changelog/master/Feature-63207-SplitActionButtonsIntoGroups.rst [new file with mode: 0644]
typo3/sysext/documentation/Classes/Slots/ExtensionManager.php
typo3/sysext/documentation/Classes/ViewHelpers/FormatsViewHelper.php
typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php
typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionDataViewHelper.php
typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php
typo3/sysext/extensionmanager/Classes/ViewHelpers/RemoveExtensionViewHelper.php
typo3/sysext/extensionmanager/Classes/ViewHelpers/UpdateScriptViewHelper.php
typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html
typo3/sysext/filelist/Classes/FileList.php
typo3/sysext/recordlist/Classes/RecordList.php
typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php
typo3/sysext/recycler/Resources/Private/Partials/RecordsTable/DeletedRecord.html
typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_animation.less [new file with mode: 0644]
typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_buttons.less [new file with mode: 0644]
typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_table.less
typo3/sysext/t3skin/Resources/Private/Styles/t3skin.less
typo3/sysext/t3skin/Resources/Public/Css/visual/t3skin.css
typo3/sysext/tstemplate/Classes/Controller/TypoScriptTemplateInformationModuleFunctionController.php

index bdb6ae3..ed6eb0d 100644 (file)
@@ -370,7 +370,7 @@ class Clipboard {
                                                                        <td nowrap="nowrap" width="95%">' . $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs($fileObject->getName(), $GLOBALS['BE_USER']->uc['titleLen'])), $fileObject->getName()) . ($pad == 'normal' ? ' <strong>(' . ($this->clipData['normal']['mode'] == 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) . ')</strong>' : '') . '&nbsp;' . $thumb . '</td>
                                                                        <td nowrap="nowrap" class="col-control">
                                                                                <div class="btn-group">
-                                                                                       <a class="btn" href="#" onclick="' . htmlspecialchars(('top.launchView(\'' . $table . '\', \'' . $v . '\'); return false;')) . '">' . IconUtility::getSpriteIcon('actions-document-info', array('title' => $this->clLabel('info', 'cm'))) . '</a>' . '<a class="btn" href="' . htmlspecialchars($this->removeUrl('_FILE', GeneralUtility::shortmd5($v))) . '#clip_head">' . IconUtility::getSpriteIcon('actions-selection-delete', array('title' => $this->clLabel('removeItem'))) . '</a>
+                                                                                       <a class="btn btn-default" href="#" onclick="' . htmlspecialchars(('top.launchView(\'' . $table . '\', \'' . $v . '\'); return false;')) . '">' . IconUtility::getSpriteIcon('actions-document-info', array('title' => $this->clLabel('info', 'cm'))) . '</a>' . '<a class="btn btn-default" href="' . htmlspecialchars($this->removeUrl('_FILE', GeneralUtility::shortmd5($v))) . '#clip_head">' . IconUtility::getSpriteIcon('actions-selection-delete', array('title' => $this->clLabel('removeItem'))) . '</a>
                                                                                </div>
                                                                        </td>
                                                                </tr>';
@@ -389,7 +389,7 @@ class Clipboard {
                                                                        <td nowrap="nowrap" width="95%">' . $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs(BackendUtility::getRecordTitle($table, $rec), $GLOBALS['BE_USER']->uc['titleLen'])), $rec, $table) . ($pad == 'normal' ? ' <strong>(' . ($this->clipData['normal']['mode'] == 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) . ')</strong>' : '') . '&nbsp;</td>
                                                                        <td nowrap="nowrap" class="col-control">
                                                                                <div class="btn-group">
-                                                                                       <a class="btn" href="#" onclick="' . htmlspecialchars(('top.launchView(\'' . $table . '\', \'' . (int)$uid . '\'); return false;')) . '">' . IconUtility::getSpriteIcon('actions-document-info', array('title' => $this->clLabel('info', 'cm'))) . '</a>' . '<a class="btn" href="' . htmlspecialchars($this->removeUrl($table, $uid)) . '#clip_head">' . IconUtility::getSpriteIcon('actions-selection-delete', array('title' => $this->clLabel('removeItem'))) . '</a>
+                                                                                       <a class="btn btn-default" href="#" onclick="' . htmlspecialchars(('top.launchView(\'' . $table . '\', \'' . (int)$uid . '\'); return false;')) . '">' . IconUtility::getSpriteIcon('actions-document-info', array('title' => $this->clLabel('info', 'cm'))) . '</a>' . '<a class="btn btn-default" href="' . htmlspecialchars($this->removeUrl($table, $uid)) . '#clip_head">' . IconUtility::getSpriteIcon('actions-selection-delete', array('title' => $this->clLabel('removeItem'))) . '</a>
                                                                                </div>
                                                                        </td>
                                                                </tr>';
index ba12f1f..15dc29f 100644 (file)
@@ -34,7 +34,7 @@ class RemoveUserViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractView
         */
        public function render(BackendUser $backendUser) {
                if ($backendUser->getUid() == $GLOBALS['BE_USER']->user['uid']) {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
 
                $redirectUrl = GeneralUtility::getIndpEnv('REQUEST_URI');
@@ -42,7 +42,7 @@ class RemoveUserViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractView
                $url = $GLOBALS['BACK_PATH'] . BackendUtility::getModuleUrl('tce_db') . '&' . $parameters . '&redirect=' .
                        ($redirectUrl == '' ? '\' + T3_THIS_LOCATION + \'' : rawurlencode($redirectUrl)) . '&vC=' .
                        rawurlencode($GLOBALS['BE_USER']->veriCode()) . BackendUtility::getUrlToken('tceAction') . '&prErr=1&uPT=1';
-               return '<a class="btn" href="' . $url . '"  onclick="return confirm(' .
+               return '<a class="btn btn-default" href="' . $url . '"  onclick="return confirm(' .
                        GeneralUtility::quoteJSvalue(LocalizationUtility::translate('confirm', 'beuser', array($backendUser->getUserName()))) .
                        ')">' . IconUtility::getSpriteIcon(('actions-edit-delete')) . '</a>';
        }
index 5facd97..653bcd0 100644 (file)
@@ -35,10 +35,10 @@ class SwitchUserViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractView
         */
        public function render(BackendUser $backendUser) {
                if ($backendUser->getUid() == $GLOBALS['BE_USER']->user['uid'] || !$backendUser->isActive()) {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
                $title = LocalizationUtility::translate('switchBackMode', 'beuser');
-               return '<a class="btn" href="' .
+               return '<a class="btn btn-default" href="' .
                        htmlspecialchars(GeneralUtility::linkThisScript(array('SwitchUser' => $backendUser->getUid()))) .
                        '" target="_top" title="' . htmlspecialchars($title) . '">' .
                        IconUtility::getSpriteIcon(('actions-system-backend-user-switch')) . '</a>';
index b85ee57..b6132c9 100644 (file)
                </f:if>
        </td>
        <td class="col-control">
-               <f:link.action action="addToCompareList" arguments="{uid: backendUser.uid}" class="btn"><bu:spriteManagerIcon iconName="actions-edit-add"/> <f:translate key="compare" /></f:link.action>
+               <f:link.action action="addToCompareList" arguments="{uid: backendUser.uid}" class="btn btn-default"><bu:spriteManagerIcon iconName="actions-edit-add"/> <f:translate key="compare" /></f:link.action>
                <div class="btn-group" role="group">
-                       <a class="btn" href="#" onclick="top.launchView('be_users', '{backendUser.uid}'); return false;"><bu:spriteManagerIcon iconName="actions-document-info" /></a>
-                       <a class="btn" href="alt_doc.php?edit[be_users][{backendUser.uid}]=edit&amp;returnUrl={returnUrl}"><bu:spriteManagerIcon iconName="actions-document-open" /></a>
+                       <a class="btn btn-default" href="#" onclick="top.launchView('be_users', '{backendUser.uid}'); return false;"><bu:spriteManagerIcon iconName="actions-document-info" /></a>
+                       <a class="btn btn-default" href="alt_doc.php?edit[be_users][{backendUser.uid}]=edit&amp;returnUrl={returnUrl}"><bu:spriteManagerIcon iconName="actions-document-open" /></a>
                        <f:if condition="{backendUser.currentlyLoggedIn} == 1">
                                <f:then>
-                                       <span class="btn disabled"><bu:spriteManagerIcon iconName="empty-empty" /></span>
+                                       <span class="btn btn-default disabled"><bu:spriteManagerIcon iconName="empty-empty" /></span>
                                </f:then>
                                <f:else>
                                        <f:if condition="{backendUser.isDisabled} == 1">
                                                <f:then>
-                                                       <a class="btn" href="{bu:issueCommand(parameters: 'data[be_users][{backendUser.uid}][disable]=0', redirectUrl: redirectUrl)}"><bu:spriteManagerIcon iconName="actions-edit-unhide" options="{title: 'unhide'}" /></a>
+                                                       <a class="btn btn-default" href="{bu:issueCommand(parameters: 'data[be_users][{backendUser.uid}][disable]=0', redirectUrl: redirectUrl)}"><bu:spriteManagerIcon iconName="actions-edit-unhide" options="{title: 'unhide'}" /></a>
                                                </f:then>
                                                <f:else>
-                                                       <a class="btn" href="{bu:issueCommand(parameters: 'data[be_users][{backendUser.uid}][disable]=1', redirectUrl: redirectUrl)}"><bu:spriteManagerIcon iconName="actions-edit-hide" options="{title: 'hide'}" /></a>
+                                                       <a class="btn btn-default" href="{bu:issueCommand(parameters: 'data[be_users][{backendUser.uid}][disable]=1', redirectUrl: redirectUrl)}"><bu:spriteManagerIcon iconName="actions-edit-hide" options="{title: 'hide'}" /></a>
                                                </f:else>
                                        </f:if>
                                </f:else>
index 698a071..feda270 100644 (file)
@@ -28,7 +28,7 @@
                                <f:if condition="{currentSessionId} == {session.id}">
                                        <f:else>
                                                <f:link.action
-                                                       class="btn"
+                                                       class="btn btn-default"
                                                        action="terminateBackendUserSession"
                                                        controller="BackendUser"
                                                        arguments="{backendUser: onlineUser.backendUser, sessionId: session.id}"
@@ -39,7 +39,7 @@
                                                </f:link.action>
                                        </f:else>
                                </f:if>
-                               <a class="btn" href="#" onclick="top.launchView('be_users', '{onlineUser.backendUser.uid}',''); return false;">
+                               <a class="btn btn-default" href="#" onclick="top.launchView('be_users', '{onlineUser.backendUser.uid}',''); return false;">
                                        <bu:SpriteManagerIcon iconName="actions-document-info" />
                                </a>
                        </div>
index 62cbad7..f16d989 100644 (file)
                                                <td>
                                                        <f:if condition="{compareUser.isDisabled} == 1">
                                                                <f:then>
-                                                                       <a class="btn" href="{bu:issueCommand(parameters: 'data[be_users][{compareUser.uid}][disable]=0', redirectUrl: redirectUrl)}">
+                                                                       <a class="btn btn-default" href="{bu:issueCommand(parameters: 'data[be_users][{compareUser.uid}][disable]=0', redirectUrl: redirectUrl)}">
                                                                                <bu:spriteManagerIcon iconName="actions-edit-unhide" options="{title: 'unhide'}" />
                                                                        </a>
                                                                </f:then>
                                                                <f:else>
-                                                                       <a class="btn" href="{bu:issueCommand(parameters: 'data[be_users][{compareUser.uid}][disable]=1', redirectUrl: redirectUrl)}">
+                                                                       <a class="btn btn-default" href="{bu:issueCommand(parameters: 'data[be_users][{compareUser.uid}][disable]=1', redirectUrl: redirectUrl)}">
                                                                                <bu:spriteManagerIcon iconName="actions-edit-hide" options="{title: 'hide'}" />
                                                                        </a>
                                                                </f:else>
index de72f9d..5536b70 100644 (file)
@@ -542,15 +542,15 @@ class QueryView {
                $params = '&edit[' . $table . '][' . $row['uid'] . ']=edit';
                $out .= '<td><div class="btn-group">';
                if (!$row['deleted']) {
-                       $out .= '<a class="btn" href="#" onClick="top.launchView(\'' . $table . '\',' . $row['uid'] . ',\'' . $GLOBALS['BACK_PATH'] . '\');return false;">' . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('status-dialog-information') . '</a>';
-                       $out .= '<a class="btn" href="#" onClick="' . BackendUtility::editOnClick($params, $GLOBALS['BACK_PATH'], (GeneralUtility::getIndpEnv('REQUEST_URI') . GeneralUtility::implodeArrayForUrl('SET', (array)GeneralUtility::_POST('SET')))) . '">' . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-document-open') . '</a>';
+                       $out .= '<a class="btn btn-default" href="#" onClick="top.launchView(\'' . $table . '\',' . $row['uid'] . ',\'' . $GLOBALS['BACK_PATH'] . '\');return false;">' . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('status-dialog-information') . '</a>';
+                       $out .= '<a class="btn btn-default" href="#" onClick="' . BackendUtility::editOnClick($params, $GLOBALS['BACK_PATH'], (GeneralUtility::getIndpEnv('REQUEST_URI') . GeneralUtility::implodeArrayForUrl('SET', (array)GeneralUtility::_POST('SET')))) . '">' . \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-document-open') . '</a>';
                } else {
-                       $out .= '<a class="btn" href="' . GeneralUtility::linkThisUrl(($GLOBALS['BACK_PATH'] . BackendUtility::getModuleUrl('tce_db')), array(
+                       $out .= '<a class="btn btn-default" href="' . GeneralUtility::linkThisUrl(($GLOBALS['BACK_PATH'] . BackendUtility::getModuleUrl('tce_db')), array(
                                        ('cmd[' . $table . '][' . $row['uid'] . '][undelete]') => '1',
                                        'redirect' => GeneralUtility::linkThisScript(array())
                                )) . BackendUtility::getUrlToken('tceAction') . '">';
                        $out .= \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-edit-restore', array('title' => 'undelete only')) . '</a>';
-                       $out .= '<a class="btn" href="' . GeneralUtility::linkThisUrl(($GLOBALS['BACK_PATH'] . BackendUtility::getModuleUrl('tce_db')), array(
+                       $out .= '<a class="btn btn-default" href="' . GeneralUtility::linkThisUrl(($GLOBALS['BACK_PATH'] . BackendUtility::getModuleUrl('tce_db')), array(
                                        ('cmd[' . $table . '][' . $row['uid'] . '][undelete]') => '1',
                                        'redirect' => GeneralUtility::linkThisUrl('alt_doc.php', array(
                                                ('edit[' . $table . '][' . $row['uid'] . ']') => 'edit',
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-63207-SplitActionButtonsIntoGroups.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-63207-SplitActionButtonsIntoGroups.rst
new file mode 100644 (file)
index 0000000..a74e34b
--- /dev/null
@@ -0,0 +1,36 @@
+===============================================
+Feature: #63207 - Split buttons into two groups
+===============================================
+
+Description
+===========
+
+The action buttons in Web>List for pages and content elements are split into two groups to organize
+the actions as primary and secondary actions. Primary action are common RUD actions:
+- Show
+- Edit
+- Hide
+- Delete
+- Move up/down
+
+Secondary actions keep any other action. If "Extended view" is disabled, the primary actions are now
+still displayed, the secondary action are collapsed but can be expanded by clicking the expand trigger.
+
+
+Impact
+======
+
+Existing hooks will work like before. If an action is added to one of the two sections, the icon
+on rootlevel must be reset, please see Migration_.
+
+
+Migration
+=========
+
+.. code-block:: php
+
+       unset($cells['edit']);
+       $cells['primary']['edit'] = '<a class="btn btn-default"><span class="t3-icon fa fa-trash"></span></a>';
+       $cells['secondary']['edit'] = '<a class="btn btn-default"><span class="t3-icon fa fa-trash"></span></a>';`
+
+Icons, that are not added into a section, will be sorted into the secondary group.
\ No newline at end of file
index 5fe528d..b583231 100644 (file)
@@ -61,9 +61,9 @@ class ExtensionManager {
                                $actions[] = $formatsViewHelper->render($documentTranslation);
                        }
                } else {
-                       $actions[] = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
-                       $actions[] = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
-                       $actions[] = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       $actions[] = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       $actions[] = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       $actions[] = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
        }
 
index e125748..0da8cfc 100644 (file)
@@ -33,9 +33,9 @@ class FormatsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHel
         */
        public function render(\TYPO3\CMS\Documentation\Domain\Model\DocumentTranslation $documentTranslation) {
                $icons = array(
-                       'html' => '<a class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>',
-                       'pdf' => '<a class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>',
-                       'sxw' => '<a class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>'
+                       'html' => '<a class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>',
+                       'pdf' => '<a class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>',
+                       'sxw' => '<a class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</a>'
                );
                $formats = $documentTranslation->getFormats();
 
@@ -48,13 +48,13 @@ class FormatsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHel
                        $extension = substr($uri, strrpos($uri, '.') + 1);
                        if (strlen($extension) < 5) {
                                // This is direct link to a file
-                               $output .= 'href="' . $uri . '" class="btn"';
+                               $output .= 'href="' . $uri . '" class="btn btn-default"';
                        } else {
                                $extension = $format->getFormat();
                                if ($extension === 'json') {
                                        $extension = 'js';
                                }
-                               $output .= 'href="#" onclick="top.TYPO3.Backend.ContentContainer.setUrl(\'' . $uri . '\')" class="btn"';
+                               $output .= 'href="#" onclick="top.TYPO3.Backend.ContentContainer.setUrl(\'' . $uri . '\')" class="btn btn-default"';
                        }
 
                        $xliff = 'LLL:EXT:documentation/Resources/Private/Language/locallang.xlf';
index 269834f..2ef8e1c 100644 (file)
@@ -59,7 +59,7 @@ class ConfigureExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\Act
                        $this->tag->setContent($content);
                        $content = $this->tag->render();
                } elseif ($forceConfiguration) {
-                       $content = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       $content = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
 
                return $content;
index 18f6c21..48a610e 100644 (file)
@@ -38,7 +38,7 @@ class DownloadExtensionDataViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\
        public function render($extension) {
                $filePrefix = PATH_site . $extension['siteRelPath'];
                if (!file_exists(($filePrefix . 'ext_tables.sql')) && !file_exists(($filePrefix . 'ext_tables_static+adt.sql'))) {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
                $uriBuilder = $this->controllerContext->getUriBuilder();
                $uriBuilder->reset();
@@ -46,7 +46,7 @@ class DownloadExtensionDataViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\
                        'extension' => $extension['key']
                ), 'Action');
                $this->tag->addAttribute('href', $uri);
-               $cssClass = 'downloadExtensionData btn';
+               $cssClass = 'downloadExtensionData btn btn-default';
                $this->tag->addAttribute('class', $cssClass);
                $this->tag->addAttribute('title', \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('extensionList.downloadsql', 'extensionmanager'));
                $this->tag->setContent(\TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-system-extension-sqldump'));
index b69f318..7794211 100644 (file)
@@ -55,7 +55,7 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\FormViewH
                $this->tag->addAttribute('data-href', $uri);
 
                // @TODO Clean-up
-               $iconClasses = 'btn fa fa-cloud-download';
+               $iconClasses = 'btn btn-default fa fa-cloud-download';
                $label = '<div class="btn-group"><button title="' . LocalizationUtility::translate('extensionList.downloadViewHelper.submit', 'extensionmanager') .
                        '" type="submit" class="' . $iconClasses . '" value="' .
                        LocalizationUtility::translate('extensionList.downloadViewHelper.submit', 'extensionmanager') . '" /></div>';
index 6eded9a..ab67f37 100644 (file)
@@ -37,13 +37,13 @@ class RemoveExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\Action
         */
        public function render($extension) {
                if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded($extension['key'])) {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
                if (
                        !in_array($extension['type'], \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::returnAllowedInstallTypes()) ||
                        $extension['type'] === 'System'
                ) {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
                $uriBuilder = $this->controllerContext->getUriBuilder();
                $action = 'removeExtension';
@@ -53,7 +53,7 @@ class RemoveExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\Action
                        'extension' => $extension['key']
                ), 'Action');
                $this->tag->addAttribute('href', $uri);
-               $cssClass = 'removeExtension btn';
+               $cssClass = 'removeExtension btn btn-default';
                $this->tag->addAttribute('class', $cssClass);
                $this->tag->addAttribute('title', \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('extensionList.remove', 'extensionmanager'));
                $this->tag->setContent(\TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-edit-delete'));
index 2e9425c..53b1603 100644 (file)
@@ -60,7 +60,7 @@ class UpdateScriptViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Link\ActionVie
                        $this->tag->setContent(\TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('extensions-extensionmanager-update-script'));
                        $tag = $this->tag->render();
                } else {
-                       return '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+                       return '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                }
                return $tag;
        }
index 679b05a..0e8521f 100644 (file)
@@ -18,7 +18,7 @@
        <f:render partial="List/UploadForm" />
 
        <form class="form-inline">
-               <div class="input-group">
+               <div class="form-group">
                        <f:form.textfield name="Tx_Extensionmanager_extensionkey" placeholder="{f:translate(key:'extensionList.search')}" id="Tx_Extensionmanager_extensionkey" value="{search}" class="form-control" />
                </div>
        </form>
                                <td class="icons nowrap">
                                        <div class="btn-group">
                                                <em:processAvailableActions extension="{extension}">
-                                                       <em:configureExtension class="btn" extension="{extension}"><f:be.buttons.icon icon="actions-system-extension-configure" title="{f:translate(key:'extensionList.configure')}" /></em:configureExtension>
-                                                       <em:updateScript class="btn" extensionKey="{extension.key}" />
-                                                       <em:removeExtension class="btn" extension="{extension}" />
-                                                       <span class="btn"><f:be.buttons.icon uri="{f:uri.action(action:'downloadExtensionZip',controller:'Action',arguments:'{extension:extension.key}')}" icon="actions-system-extension-download" title="{f:translate(key:'extensionList.downloadzip')}"/></span>
-                                                       <em:downloadExtensionData class="btn" extension="{extension}" />
+                                                       <em:configureExtension class="btn btn-default" extension="{extension}"><f:be.buttons.icon icon="actions-system-extension-configure" title="{f:translate(key:'extensionList.configure')}" /></em:configureExtension>
+                                                       <em:updateScript class="btn btn-default" extensionKey="{extension.key}" />
+                                                       <em:removeExtension class="btn btn-default" extension="{extension}" />
+                                                       <span class="btn btn-default"><f:be.buttons.icon uri="{f:uri.action(action:'downloadExtensionZip',controller:'Action',arguments:'{extension:extension.key}')}" icon="actions-system-extension-download" title="{f:translate(key:'extensionList.downloadzip')}"/></span>
+                                                       <em:downloadExtensionData class="btn btn-default" extension="{extension}" />
                                                </em:processAvailableActions>
                                        </div>
                                </td>
index da98c8f..e46fc33 100644 (file)
@@ -291,7 +291,7 @@ class FileList extends AbstractRecordList {
                if ($warning) {
                        $onClickEvent = 'if (confirm(' . GeneralUtility::quoteJSvalue($warning) . ')){' . $onClickEvent . '}';
                }
-               return '<a href="#" class="btn" onclick="' . htmlspecialchars($onClickEvent) . 'return false;">' . $string . '</a>';
+               return '<a href="#" class="btn btn-default" onclick="' . htmlspecialchars($onClickEvent) . 'return false;">' . $string . '</a>';
        }
 
        /**
@@ -302,7 +302,7 @@ class FileList extends AbstractRecordList {
         */
        public function getTable($rowlist) {
                // prepare space icon
-               $this->spaceIcon = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+               $this->spaceIcon = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
 
                // @todo use folder methods directly when they support filters
                $storage = $this->folderObject->getStorage();
@@ -401,14 +401,14 @@ class FileList extends AbstractRecordList {
                                                        }
                                                }
                                                if ($addPasteButton) {
-                                                       $cells[] = '<a class="btn" href="' . htmlspecialchars($this->clipObj->pasteUrl('_FILE', $this->folderObject->getCombinedIdentifier())) . '" onclick="return ' . htmlspecialchars($this->clipObj->confirmMsg('_FILE', $this->path, 'into', $elFromTable)) . '" title="' . $this->getLanguageService()->getLL('clip_paste', 1) . '">' . IconUtility::getSpriteIcon('actions-document-paste-after') . '</a>';
+                                                       $cells[] = '<a class="btn btn-default" href="' . htmlspecialchars($this->clipObj->pasteUrl('_FILE', $this->folderObject->getCombinedIdentifier())) . '" onclick="return ' . htmlspecialchars($this->clipObj->confirmMsg('_FILE', $this->path, 'into', $elFromTable)) . '" title="' . $this->getLanguageService()->getLL('clip_paste', 1) . '">' . IconUtility::getSpriteIcon('actions-document-paste-after') . '</a>';
                                                }
                                        }
                                        if ($this->clipObj->current != 'normal' && $iOut) {
                                                $cells[] = $this->linkClipboardHeaderIcon(IconUtility::getSpriteIcon('actions-edit-copy', array('title' => $this->getLanguageService()->getLL('clip_selectMarked', TRUE))), $table, 'setCB');
                                                $cells[] = $this->linkClipboardHeaderIcon(IconUtility::getSpriteIcon('actions-edit-delete', array('title' => $this->getLanguageService()->getLL('clip_deleteMarked'))), $table, 'delete', $this->getLanguageService()->getLL('clip_deleteMarkedWarning'));
                                                $onClick = 'checkOffCB(\'' . implode(',', $this->CBnames) . '\', this); return false;';
-                                               $cells[] = '<a class="btn" rel="" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $this->getLanguageService()->getLL('clip_markRecords', TRUE) . '">' . IconUtility::getSpriteIcon('actions-document-select') . '</a>';
+                                               $cells[] = '<a class="btn btn-default" rel="" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $this->getLanguageService()->getLL('clip_markRecords', TRUE) . '">' . IconUtility::getSpriteIcon('actions-document-select') . '</a>';
                                        }
                                        $theData[$v] = implode('', $cells);
                                } else {
@@ -683,7 +683,7 @@ class FileList extends AbstractRecordList {
                                                                                        'sys_file_metadata' => array($translations[$languageId]['uid'] => 'edit')
                                                                                );
                                                                                $editOnClick = BackendUtility::editOnClick(GeneralUtility::implodeArrayForUrl('edit', $data), $GLOBALS['BACK_PATH'], $this->listUrl());
-                                                                               $languageCode .= '<a href="#" class="btn" onclick="' . $editOnClick . '">' . $flagButtonIcon . '</a>';
+                                                                               $languageCode .= '<a href="#" class="btn btn-default" onclick="' . $editOnClick . '">' . $flagButtonIcon . '</a>';
                                                                        } else {
                                                                                $href = $GLOBALS['SOBE']->doc->issueCommand(
                                                                                        '&cmd[sys_file_metadata][' . $metaDataRecord['uid'] . '][localize]=' . $languageId,
@@ -695,14 +695,14 @@ class FileList extends AbstractRecordList {
                                                                                        array('title' => sprintf($GLOBALS['LANG']->getLL('createMetadataForLanguage'), $language['title'])),
                                                                                        array($flagIcon . '-overlay' => array())
                                                                                );
-                                                                               $languageCode .= '<a href="' . htmlspecialchars($href) . '" class="btn">' . $flagButtonIcon . '</a> ';
+                                                                               $languageCode .= '<a href="' . htmlspecialchars($href) . '" class="btn btn-default">' . $flagButtonIcon . '</a> ';
                                                                        }
                                                                }
 
                                                                // Hide flag button bar when not translated yet
                                                                $theData[$field] = ' <div class="localisationData btn-group" data-fileid="' . $fileObject->getUid() . '"' .
                                                                        (empty($translations) ? ' style="display: none;"' : '') . '>' . $languageCode . '</div>';
-                                                               $theData[$field] .= '<a class="btn filelist-translationToggler" data-fileid="' . $fileObject->getUid() . '">' .
+                                                               $theData[$field] .= '<a class="btn btn-default filelist-translationToggler" data-fileid="' . $fileObject->getUid() . '">' .
                                                                        IconUtility::getSpriteIcon(
                                                                                'mimetypes-x-content-page-language-overlay',
                                                                                array(
@@ -808,10 +808,10 @@ class FileList extends AbstractRecordList {
                // For normal clipboard, add copy/cut buttons:
                if ($this->clipObj->current == 'normal') {
                        $isSel = $this->clipObj->isSelected('_FILE', $md5);
-                       $cells[] = '<a class="btn" href="' . htmlspecialchars($this->clipObj->selUrlFile($fullIdentifier, 1, ($isSel == 'copy'))) . '">' . IconUtility::getSpriteIcon(('actions-edit-copy' . ($isSel == 'copy' ? '-release' : '')), array('title' => $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.copy', TRUE))) . '</a>';
+                       $cells[] = '<a class="btn btn-default"" href="' . htmlspecialchars($this->clipObj->selUrlFile($fullIdentifier, 1, ($isSel == 'copy'))) . '">' . IconUtility::getSpriteIcon(('actions-edit-copy' . ($isSel == 'copy' ? '-release' : '')), array('title' => $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.copy', TRUE))) . '</a>';
                        // we can only cut if file can be moved
                        if ($fileOrFolderObject->checkActionPermission('move')) {
-                               $cells[] = '<a class="btn" href="' . htmlspecialchars($this->clipObj->selUrlFile($fullIdentifier, 0, ($isSel == 'cut'))) . '">' . IconUtility::getSpriteIcon(('actions-edit-cut' . ($isSel == 'cut' ? '-release' : '')), array('title' => $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.cut', TRUE))) . '</a>';
+                               $cells[] = '<a class="btn btn-default" href="' . htmlspecialchars($this->clipObj->selUrlFile($fullIdentifier, 0, ($isSel == 'cut'))) . '">' . IconUtility::getSpriteIcon(('actions-edit-cut' . ($isSel == 'cut' ? '-release' : '')), array('title' => $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.cut', TRUE))) . '</a>';
                        } else {
                                $cells[] = $this->spaceIcon;
                        }
@@ -820,7 +820,7 @@ class FileList extends AbstractRecordList {
                        $n = '_FILE|' . $md5;
                        $this->CBnames[] = $n;
                        $checked = $this->clipObj->isSelected('_FILE', $md5) ? ' checked="checked"' : '';
-                       $cells[] = '<div class="btn-checkbox-holder"><input type="hidden" name="CBH[' . $n . ']" value="0" /><input type="checkbox" name="CBC[' . $n . ']" value="' . htmlspecialchars($fullIdentifier) . '" class="smallCheckboxes btn-checkbox" ' . $checked . ' /><span class="btn"><span class="t3-icon fa"></span></span></div>';
+                       $cells[] = '<label class="btn btn-default btn-checkbox"><input type="hidden" name="CBH[' . $n . ']" value="0" /><input type="checkbox" name="CBC[' . $n . ']" value="' . htmlspecialchars($fullIdentifier) . '" ' . $checked . ' /><span class="t3-icon fa"></span></label>';
                }
                // Display PASTE button, if directory:
                $elFromTable = $this->clipObj->elFromTable('_FILE');
@@ -833,11 +833,11 @@ class FileList extends AbstractRecordList {
                                }
                        }
                        if ($addPasteButton) {
-                               $cells[] = '<a class="btn" href="' . htmlspecialchars($this->clipObj->pasteUrl('_FILE', $fullIdentifier)) . '" onclick="return ' . htmlspecialchars($this->clipObj->confirmMsg('_FILE', $fullIdentifier, 'into', $elFromTable)) . '" title="' . $this->getLanguageService()->getLL('clip_pasteInto', TRUE) . '">' . IconUtility::getSpriteIcon('actions-document-paste-into') . '</a>';
+                               $cells[] = '<a class="btn btn-default" href="' . htmlspecialchars($this->clipObj->pasteUrl('_FILE', $fullIdentifier)) . '" onclick="return ' . htmlspecialchars($this->clipObj->confirmMsg('_FILE', $fullIdentifier, 'into', $elFromTable)) . '" title="' . $this->getLanguageService()->getLL('clip_pasteInto', TRUE) . '">' . IconUtility::getSpriteIcon('actions-document-paste-into') . '</a>';
                        }
                }
                // Compile items into a DIV-element:
-               return ' <div class="btn-group">' . implode('', $cells) . '</div>';
+               return ' <div class="btn-group" role="group">' . implode('', $cells) . '</div>';
        }
 
        /**
@@ -858,7 +858,7 @@ class FileList extends AbstractRecordList {
                                );
                                $editOnClick = BackendUtility::editOnClick(GeneralUtility::implodeArrayForUrl('edit', $data), $GLOBALS['BACK_PATH'], $this->listUrl());
                                $title = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.editMetadata'));
-                               $cells['editmetadata'] = '<a href="#" class="btn" onclick="' . $editOnClick . '" title="' . $title . '">'
+                               $cells['editmetadata'] = '<a href="#" class="btn btn-default" onclick="' . $editOnClick . '" title="' . $title . '">'
                                        . IconUtility::getSpriteIcon('actions-document-open') . '</a>';
                        } else {
                                $cells['editmetadata'] = $this->spaceIcon;
@@ -870,7 +870,7 @@ class FileList extends AbstractRecordList {
                if (is_a($fileOrFolderObject, File::class) && $fileOrFolderObject->checkActionPermission('write') && GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'], $fileOrFolderObject->getExtension())) {
                        $url = BackendUtility::getModuleUrl('file_edit', array('target' => $fullIdentifier));
                        $editOnClick = 'top.content.list_frame.location.href=top.TS.PATH_typo3+' . GeneralUtility::quoteJSvalue($url) . '+\'&returnUrl=\'+top.rawurlencode(top.content.list_frame.document.location.pathname+top.content.list_frame.document.location.search);return false;';
-                       $cells['edit'] = '<a href="#" class="btn" onclick="' . htmlspecialchars($editOnClick) . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.editcontent') . '">' . IconUtility::getSpriteIcon('actions-page-open') . '</a>';
+                       $cells['edit'] = '<a href="#" class="btn btn-default" onclick="' . htmlspecialchars($editOnClick) . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.editcontent') . '">' . IconUtility::getSpriteIcon('actions-page-open') . '</a>';
                } else {
                        $cells['edit'] = $this->spaceIcon;
                }
@@ -878,7 +878,7 @@ class FileList extends AbstractRecordList {
                if ($fileOrFolderObject->checkActionPermission('rename')) {
                        $url = BackendUtility::getModuleUrl('file_rename', array('target' => $fullIdentifier));
                        $renameOnClick = 'top.content.list_frame.location.href = top.TS.PATH_typo3+' . GeneralUtility::quoteJSvalue($url) . '+\'&returnUrl=\'+top.rawurlencode(top.content.list_frame.document.location.pathname+top.content.list_frame.document.location.search);return false;';
-                       $cells['rename'] = '<a href="#" class="btn" onclick="' . htmlspecialchars($renameOnClick) . '"  title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.rename') . '">' . IconUtility::getSpriteIcon('actions-edit-rename') . '</a>';
+                       $cells['rename'] = '<a href="#" class="btn btn-default" onclick="' . htmlspecialchars($renameOnClick) . '"  title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.rename') . '">' . IconUtility::getSpriteIcon('actions-edit-rename') . '</a>';
                } else {
                        $cells['rename'] = $this->spaceIcon;
                }
@@ -889,7 +889,7 @@ class FileList extends AbstractRecordList {
                        } elseif (is_a($fileOrFolderObject, File::class)) {
                                $infoOnClick = 'top.launchView( \'_FILE\', \'' . $fullIdentifier . '\');return false;';
                        }
-                       $cells['info'] = '<a href="#" class="btn" onclick="' . $infoOnClick . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.info') . '">' . IconUtility::getSpriteIcon('status-dialog-information') . '</a>';
+                       $cells['info'] = '<a href="#" class="btn btn-default" onclick="' . $infoOnClick . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.info') . '">' . IconUtility::getSpriteIcon('status-dialog-information') . '</a>';
                } else {
                        $cells['info'] = $this->spaceIcon;
                }
@@ -911,7 +911,7 @@ class FileList extends AbstractRecordList {
 
                        $removeOnClick = 'if (' . $confirmationCheck . ') { top.content.list_frame.location.href=top.TS.PATH_typo3+\'' . BackendUtility::getModuleUrl('tce_file') .'&file[delete][0][data]=' . rawurlencode($fileOrFolderObject->getCombinedIdentifier()) . '&vC=' . $this->getBackendUser()->veriCode() . BackendUtility::getUrlToken('tceAction') . '&redirect=\'+top.rawurlencode(top.content.list_frame.document.location.pathname+top.content.list_frame.document.location.search);};';
 
-                       $cells['delete'] = '<a href="#" class="btn" onclick="' . htmlspecialchars($removeOnClick) . '"  title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.delete') . '">' . IconUtility::getSpriteIcon('actions-edit-delete') . '</a>';
+                       $cells['delete'] = '<a href="#" class="btn btn-default" onclick="' . htmlspecialchars($removeOnClick) . '"  title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.delete') . '">' . IconUtility::getSpriteIcon('actions-edit-delete') . '</a>';
                } else {
                        $cells['delete'] = $this->spaceIcon;
                }
index 4478082..6b7dccf 100644 (file)
@@ -343,7 +343,7 @@ class RecordList {
                $dblist->clipObj->endClipboard();
                // This flag will prevent the clipboard panel in being shown.
                // It is set, if the clickmenu-layer is active AND the extended view is not enabled.
-               $dblist->dontShowClipControlPanels = (!$this->MOD_SETTINGS['bigControlPanel'] && $dblist->clipObj->current == 'normal' && !$this->modTSconfig['properties']['showClipControlPanelsDespiteOfCMlayers']);
+               $dblist->dontShowClipControlPanels = ($dblist->clipObj->current == 'normal' && !$this->modTSconfig['properties']['showClipControlPanelsDespiteOfCMlayers']);
                // If there is access to the page or root page is used for searching, then render the list contents and set up the document template object:
                if ($access || ($this->id === 0 && $this->search_levels > 0 && $this->search_field !== '')) {
                        // Deleting records...:
index 6a04f3b..61bf911 100644 (file)
@@ -330,7 +330,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        && !$GLOBALS['TCA'][$table]['ctrl']['transOrigPointerTable'];
                $tableCollapsed = (bool)$this->tablesCollapsed[$table];
                // prepare space icon
-               $this->spaceIcon = '<span class="btn disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
+               $this->spaceIcon = '<span class="btn btn-default disabled">' . IconUtility::getSpriteIcon('empty-empty') . '</span>';
                // Cleaning rowlist for duplicates and place the $titleCol as the first column always!
                $this->fieldArray = array();
                // title Column
@@ -417,6 +417,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                if (empty($fieldListFields) && $GLOBALS['TYPO3_CONF_VARS']['BE']['debug']) {
                        $message = sprintf($lang->sL('LLL:EXT:lang/locallang_mod_web_list.xlf:missingTcaColumnsMessage', TRUE), $table, $table);
                        $messageTitle = $lang->sL('LLL:EXT:lang/locallang_mod_web_list.xlf:missingTcaColumnsMessageTitle', TRUE);
+                       /** @var FlashMessage $flashMessage */
                        $flashMessage = GeneralUtility::makeInstance(
                                FlashMessage::class,
                                $message,
@@ -726,7 +727,8 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                $recTitle = BackendUtility::getRecordTitle($table, $row, FALSE, TRUE);
                                $warning = '';
                                // If the record is edit-locked by another user, we will show a little warning sign:
-                               if ($lockInfo = BackendUtility::isRecordLocked($table, $row['uid'])) {
+                               $lockInfo = BackendUtility::isRecordLocked($table, $row['uid']);
+                               if ($lockInfo) {
                                        $warning = '<a href="#" onclick="alert('
                                                . GeneralUtility::quoteJSvalue($lockInfo['msg']) . '); return false;" title="'
                                                . htmlspecialchars($lockInfo['msg']) . '">'
@@ -797,8 +799,8 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                }
                // Add classes to table cells
                $this->addElement_tdCssClass[$titleCol] = 'col-title' . $localizationMarkerClass;
-               if (!$this->dontShowClipControlPanels) {
-                       $this->addElement_tdCssClass['_CONTROL_'] = 'col-control';
+               $this->addElement_tdCssClass['_CONTROL_'] = 'col-control';
+               if ($this->getModule()->MOD_SETTINGS['clipBoard']) {
                        $this->addElement_tdCssClass['_CLIPBOARD_'] = 'col-clipboard';
                }
                $this->addElement_tdCssClass['_PATH_'] = 'col-path';
@@ -867,6 +869,9 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                        $theData[$fCol] = $lang->getLL('Localize', TRUE);
                                        break;
                                case '_CLIPBOARD_':
+                                       if (!$this->getModule()->MOD_SETTINGS['clipBoard']) {
+                                               break;
+                                       }
                                        // Clipboard:
                                        $cells = array();
                                        // If there are elements on the clipboard for this table, then display the
@@ -875,7 +880,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                        if (count($elFromTable)) {
                                                $href = htmlspecialchars($this->clipObj->pasteUrl($table, $this->id));
                                                $onClick = htmlspecialchars('return ' . $this->clipObj->confirmMsg('pages', $this->pageRow, 'into', $elFromTable));
-                                               $cells['pasteAfter'] = '<a class="btn" href="' . $href . '" onclick="' . $onClick
+                                               $cells['pasteAfter'] = '<a class="btn btn-default" href="' . $href . '" onclick="' . $onClick
                                                        . '" title="' . $lang->getLL('clip_paste', TRUE) . '">'
                                                        . IconUtility::getSpriteIcon('actions-document-paste-after') . '</a>';
                                        }
@@ -889,7 +894,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                                $editIdList = '\'+editList(\'' . $table . '\',\'' . $editIdList . '\')+\'';
                                                $params = '&edit[' . $table . '][' . $editIdList . ']=edit&disHelp=1';
                                                $onClick = htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1));
-                                               $cells['edit'] = '<a class="btn" href="#" onclick="' . $onClick . '" title="'
+                                               $cells['edit'] = '<a class="btn btn-default" href="#" onclick="' . $onClick . '" title="'
                                                        . $lang->getLL('clip_editMarked', TRUE) . '">'
                                                        . IconUtility::getSpriteIcon('actions-document-open') . '</a>';
                                                // The "Delete marked" link:
@@ -901,7 +906,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                                );
                                                // The "Select all" link:
                                                $onClick = htmlspecialchars(('checkOffCB(\'' . implode(',', $this->CBnames) . '\', this); return false;'));
-                                               $cells['markAll'] = '<a class="btn" rel="" href="#" onclick="' . $onClick . '" title="'
+                                               $cells['markAll'] = '<a class="btn btn-default" rel="" href="#" onclick="' . $onClick . '" title="'
                                                        . $lang->getLL('clip_markRecords', TRUE) . '">'
                                                        . IconUtility::getSpriteIcon('actions-document-select') . '</a>';
                                        } else {
@@ -923,13 +928,14 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                                        $cells = $hookObject->renderListHeaderActions($table, $currentIdList, $cells, $this);
                                                }
                                        }
-                                       $theData[$fCol] = '<div class="btn-group">' . implode('', $cells) . '</div>';
+                                       $theData[$fCol] = '<div class="btn-group" role="group">' . implode('', $cells) . '</div>';
                                        break;
                                case '_CONTROL_':
                                        // Control panel:
                                        if (!$GLOBALS['TCA'][$table]['ctrl']['readOnly']) {
                                                // If new records can be created on this page, add links:
-                                               if ($this->calcPerms & ($table === 'pages' ? 8 : 16) && $this->showNewRecLink($table)) {
+                                               $permsAdditional = ($table === 'pages' ? 8 : 16);
+                                               if ($this->calcPerms & $permsAdditional && $this->showNewRecLink($table)) {
                                                        $spriteIcon = $table === 'pages'
                                                                ? IconUtility::getSpriteIcon('actions-page-new')
                                                                : IconUtility::getSpriteIcon('actions-document-new');
@@ -965,10 +971,10 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                                                $editIdList = '\'+editList(\'' . $table . '\',\'' . $editIdList . '\')+\'';
                                                        }
                                                        $params = '&edit[' . $table . '][' . $editIdList . ']=edit&columnsOnly=' . implode(',', $this->fieldArray) . '&disHelp=1';
-                                                       $icon .= '<a class="btn" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
+                                                       $icon .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
                                                                . '" title="' . $lang->getLL('editShownColumns', TRUE) . '">'
                                                                . IconUtility::getSpriteIcon('actions-document-open') . '</a>';
-                                                       $icon = '<div class="btn-group">' . $icon . '</div>';
+                                                       $icon = '<div class="btn-group" role="group">' . $icon . '</div>';
                                                }
                                                // Add an empty entry, so column count fits again after moving this into $icon
                                                $theData[$fCol] = '&nbsp;';
@@ -993,7 +999,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                        if ($this->table && is_array($currentIdList)) {
                                                // If the numeric clipboard pads are selected, show duplicate sorting link:
                                                if ($this->clipNumPane()) {
-                                                       $theData[$fCol] .= '<a class="btn" href="' . htmlspecialchars($this->listURL('', -1) . '&duplicateField=' . $fCol)
+                                                       $theData[$fCol] .= '<a class="btn btn-default" href="' . htmlspecialchars($this->listURL('', -1) . '&duplicateField=' . $fCol)
                                                                . '" title="' . $lang->getLL('clip_duplicates', TRUE) . '">'
                                                                . IconUtility::getSpriteIcon('actions-document-duplicates-select') . '</a>';
                                                }
@@ -1006,12 +1012,12 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                                        }
                                                        $params = '&edit[' . $table . '][' . $editIdList . ']=edit&columnsOnly=' . $fCol . '&disHelp=1';
                                                        $iTitle = sprintf($lang->getLL('editThisColumn'), $sortLabel);
-                                                       $theData[$fCol] .= '<a class="btn" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
+                                                       $theData[$fCol] .= '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
                                                                . '" title="' . htmlspecialchars($iTitle) . '">'
                                                                . IconUtility::getSpriteIcon('actions-document-open') . '</a>';
                                                }
                                                if(strlen($theData[$fCol]) > 0){
-                                                       $theData[$fCol] = '<div class="btn-group">' . $theData[$fCol] . '</div> ';
+                                                       $theData[$fCol] = '<div class="btn-group" role="group">' . $theData[$fCol] . '</div> ';
                                                }
                                        }
                                        $theData[$fCol] .= $this->addSortLink($sortLabel, $fCol, $table);
@@ -1163,25 +1169,25 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
         * @return string HTML table with the control panel (unless disabled)
         */
        public function makeControl($table, $row) {
-               if ($this->dontShowClipControlPanels) {
-                       return '';
-               }
                $module = $this->getModule();
                $rowUid = $row['uid'];
                if (ExtensionManagementUtility::isLoaded('version') && isset($row['_ORIG_uid'])) {
                        $rowUid = $row['_ORIG_uid'];
                }
-               $cells = array();
+               $cells = array(
+                       'primary' => array(),
+                       'secondary' => array()
+               );
                // If the listed table is 'pages' we have to request the permission settings for each page:
                $localCalcPerms = 0;
                if ($table == 'pages') {
                        $localCalcPerms = $this->getBackendUserAuthentication()->calcPerms(BackendUtility::getRecord('pages', $row['uid']));
                }
                // This expresses the edit permissions for this particular element:
-               $permsEdit = $table == 'pages' && $localCalcPerms & 2 || $table != 'pages' && $this->calcPerms & 16;
+               $permsEdit = $table === 'pages' && $localCalcPerms & 2 || $table !== 'pages' && $this->calcPerms & 16;
                // "Show" link (only pages and tt_content elements)
                if ($table == 'pages' || $table == 'tt_content') {
-                       $cells['view'] = '<a class="btn" href="#" onclick="'
+                       $viewAction = '<a class="btn btn-default" href="#" onclick="'
                                . htmlspecialchars(
                                        BackendUtility::viewOnClick(
                                                ($table === 'tt_content' ? $this->id : $row['uid']),
@@ -1191,175 +1197,183 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                        )
                                ) . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage', TRUE) . '">'
                                . IconUtility::getSpriteIcon('actions-document-view') . '</a>';
+                       $this->addActionToCellGroup($cells, $viewAction, 'view');
                }
                // "Edit" link: ( Only if permissions to edit the page-record of the content of the parent page ($this->id)
                if ($permsEdit) {
                        $params = '&edit[' . $table . '][' . $row['uid'] . ']=edit';
-                       $spriteIcon = $GLOBALS['TCA'][$table]['ctrl']['readOnly']
-                               ? IconUtility::getSpriteIcon('actions-document-open-read-only')
-                               : IconUtility::getSpriteIcon('actions-document-open');
-                       $cells['edit'] = '<a class="btn" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
-                               . '" title="' . $this->getLanguageService()->getLL('edit', TRUE) . '">' . $spriteIcon . '</a>';
+                       $spriteIcon = ($GLOBALS['TCA'][$table]['ctrl']['readOnly'] ? 'actions-document-open-read-only' : 'actions-document-open');
+                       $editAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
+                               . '" title="' . $this->getLanguageService()->getLL('edit', TRUE) . '">' . IconUtility::getSpriteIcon($spriteIcon) . '</a>';
+                       $this->addActionToCellGroup($cells, $editAction, 'edit');
                }
+               // "Info": (All records)
+               $onClick = 'top.launchView(\'' . $table . '\', \'' . $row['uid'] . '\'); return false;';
+               $viewBigAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $this->getLanguageService()->getLL('showInfo', TRUE) . '">'
+                       . IconUtility::getSpriteIcon('actions-document-info') . '</a>';
+               $this->addActionToCellGroup($cells, $viewBigAction, 'viewBig');
                // "Move" wizard link for pages/tt_content elements:
-               if ($table == 'tt_content' && $permsEdit || $table == 'pages') {
+               if ($table === 'tt_content' && $permsEdit || $table === 'pages') {
                        $onClick = 'return jumpExt(\'' . $this->backPath . BackendUtility::getModuleUrl('move_element') . '&table=' . $table . '&uid=' . $row['uid'] . '\');';
                        $linkTitleLL = $this->getLanguageService()->getLL('move_' . ($table === 'tt_content' ? 'record' : 'page'), TRUE);
-                       $spriteIcon = $table === 'tt_content'
-                               ? IconUtility::getSpriteIcon('actions-document-move')
-                               : IconUtility::getSpriteIcon('actions-page-move');
-                       $cells['move'] = '<a class="btn" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $linkTitleLL . '">' . $spriteIcon . '</a>';
+                       $spriteIcon = $table === 'tt_content' ? 'actions-document-move' : 'actions-page-move';
+                       $moveAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $linkTitleLL . '">' . IconUtility::getSpriteIcon($spriteIcon) . '</a>';
+                       $this->addActionToCellGroup($cells, $moveAction, 'move');
                }
-               // If the extended control panel is enabled OR if we are seeing a single table:
-               if ($module->MOD_SETTINGS['bigControlPanel'] || $this->table) {
-                       // "Info": (All records)
-                       $onClick = 'top.launchView(\'' . $table . '\', \'' . $row['uid'] . '\'); return false;';
-                       $cells['viewBig'] = '<a class="btn" href="#" onclick="' . htmlspecialchars($onClick) . '" title="' . $this->getLanguageService()->getLL('showInfo', TRUE) . '">'
-                               . IconUtility::getSpriteIcon('actions-document-info') . '</a>';
-                       // If the table is NOT a read-only table, then show these links:
-                       if (!$GLOBALS['TCA'][$table]['ctrl']['readOnly']) {
-                               // "Revert" link (history/undo)
-                               $moduleUrl = BackendUtility::getModuleUrl('record_history', array('element' => $table . ':' . $row['uid']));
-                               $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue($this->backPath . $moduleUrl) . ',\'#latest\');';
-                               $cells['history'] = '<a class="btn" href="#" onclick="' . htmlspecialchars($onClick) . '" title="'
-                                       . $this->getLanguageService()->getLL('history', TRUE) . '">'
-                                       . IconUtility::getSpriteIcon('actions-document-history-open') . '</a>';
-                               // Versioning:
-                               if (ExtensionManagementUtility::isLoaded('version') && !ExtensionManagementUtility::isLoaded('workspaces')) {
-                                       $vers = BackendUtility::selectVersionsOfRecord($table, $row['uid'], 'uid', $this->getBackendUserAuthentication()->workspace, FALSE, $row);
-                                       // If table can be versionized.
-                                       if (is_array($vers)) {
-                                               $versionIcon = 'no-version';
-                                               if (count($vers) > 1) {
-                                                       $versionIcon = count($vers) - 1;
-                                               }
-                                               $href = $this->backPath . BackendUtility::getModuleUrl('web_txversionM1', array(
-                                                       'table' => $table, 'uid' => $row['uid']
-                                               ));
-                                               $cells['version'] = '<a class="btn" href="' . htmlspecialchars($href) . '" title="'
-                                                       . $this->getLanguageService()->getLL('displayVersions', TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon(('status-version-' . $versionIcon)) . '</a>';
+               // If the table is NOT a read-only table, then show these links:
+               if (!$GLOBALS['TCA'][$table]['ctrl']['readOnly']) {
+                       // "Revert" link (history/undo)
+                       $moduleUrl = BackendUtility::getModuleUrl('record_history', array('element' => $table . ':' . $row['uid']));
+                       $onClick = 'return jumpExt(' . GeneralUtility::quoteJSvalue($this->backPath . $moduleUrl) . ',\'#latest\');';
+                       $historyAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) . '" title="'
+                               . $this->getLanguageService()->getLL('history', TRUE) . '">'
+                               . IconUtility::getSpriteIcon('actions-document-history-open') . '</a>';
+                       $this->addActionToCellGroup($cells, $historyAction, 'history');
+                       // Versioning:
+                       if (ExtensionManagementUtility::isLoaded('version') && !ExtensionManagementUtility::isLoaded('workspaces')) {
+                               $vers = BackendUtility::selectVersionsOfRecord($table, $row['uid'], 'uid', $this->getBackendUserAuthentication()->workspace, FALSE, $row);
+                               // If table can be versionized.
+                               if (is_array($vers)) {
+                                       $versionIcon = 'no-version';
+                                       if (count($vers) > 1) {
+                                               $versionIcon = count($vers) - 1;
                                        }
+                                       $href = $this->backPath . BackendUtility::getModuleUrl('web_txversionM1', array(
+                                               'table' => $table, 'uid' => $row['uid']
+                                       ));
+                                       $versionAction = '<a class="btn btn-default" href="' . htmlspecialchars($href) . '" title="'
+                                               . $this->getLanguageService()->getLL('displayVersions', TRUE) . '">'
+                                               . IconUtility::getSpriteIcon(('status-version-' . $versionIcon)) . '</a>';
+                                       $this->addActionToCellGroup($cells, $versionAction, 'version');
                                }
-                               // "Edit Perms" link:
-                               if ($table === 'pages' && $this->getBackendUserAuthentication()->check('modules', 'system_BeuserTxPermission') && ExtensionManagementUtility::isLoaded('beuser')) {
-                                       $href = BackendUtility::getModuleUrl('system_BeuserTxPermission') . '&id=' . $row['uid'] . '&return_id=' . $row['uid'] . '&edit=1';
-                                       $cells['perms'] = '<a class="btn" href="' . htmlspecialchars($href) . '" title="'
-                                               . $this->getLanguageService()->getLL('permissions', TRUE) . '">'
-                                               . IconUtility::getSpriteIcon('status-status-locked') . '</a>';
-                               }
-                               // "New record after" link (ONLY if the records in the table are sorted by a "sortby"-row
-                               // or if default values can depend on previous record):
-                               if ($GLOBALS['TCA'][$table]['ctrl']['sortby'] || $GLOBALS['TCA'][$table]['ctrl']['useColumnsForDefaultValues']) {
-                                       if ($table !== 'pages' && $this->calcPerms & 16 || $table === 'pages' && $this->calcPerms & 8) {
-                                               if ($this->showNewRecLink($table)) {
-                                                       $params = '&edit[' . $table . '][' . -($row['_MOVE_PLH'] ? $row['_MOVE_PLH_uid'] : $row['uid']) . ']=new';
-                                                       $cells['new'] = '<a class="btn" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
-                                                               . '" title="' . $this->getLanguageService()->getLL('new' . ($table == 'pages ' ? 'Page' : 'Record'), TRUE) . '">'
-                                                               . ($table == 'pages' ? IconUtility::getSpriteIcon('actions-page-new') : IconUtility::getSpriteIcon('actions-document-new')) . '</a>';
-                                               }
+                       }
+                       // "Edit Perms" link:
+                       if ($table === 'pages' && $this->getBackendUserAuthentication()->check('modules', 'system_BeuserTxPermission') && ExtensionManagementUtility::isLoaded('beuser')) {
+                               $href = BackendUtility::getModuleUrl('system_BeuserTxPermission') . '&id=' . $row['uid'] . '&return_id=' . $row['uid'] . '&edit=1';
+                               $permsAction = '<a class="btn btn-default" href="' . htmlspecialchars($href) . '" title="'
+                                       . $this->getLanguageService()->getLL('permissions', TRUE) . '">'
+                                       . IconUtility::getSpriteIcon('status-status-locked') . '</a>';
+                               $this->addActionToCellGroup($cells, $permsAction, 'perms');
+                       }
+                       // "New record after" link (ONLY if the records in the table are sorted by a "sortby"-row
+                       // or if default values can depend on previous record):
+                       if ($GLOBALS['TCA'][$table]['ctrl']['sortby'] || $GLOBALS['TCA'][$table]['ctrl']['useColumnsForDefaultValues']) {
+                               if ($table !== 'pages' && $this->calcPerms & 16 || $table === 'pages' && $this->calcPerms & 8) {
+                                       if ($this->showNewRecLink($table)) {
+                                               $params = '&edit[' . $table . '][' . -($row['_MOVE_PLH'] ? $row['_MOVE_PLH_uid'] : $row['uid']) . ']=new';
+                                               $newAction = '<a class="btn btn-default" href="#" onclick="' . htmlspecialchars(BackendUtility::editOnClick($params, $this->backPath, -1))
+                                                       . '" title="' . $this->getLanguageService()->getLL('new' . ($table == 'pages ' ? 'Page' : 'Record'), TRUE) . '">'
+                                                       . ($table == 'pages' ? IconUtility::getSpriteIcon('actions-page-new') : IconUtility::getSpriteIcon('actions-document-new')) . '</a>';
+                                               $this->addActionToCellGroup($cells, $newAction, 'new');
                                        }
                                }
-                               // "Up/Down" links
-                               if ($permsEdit && $GLOBALS['TCA'][$table]['ctrl']['sortby'] && !$this->sortField && !$this->searchLevels) {
-                                       if (isset($this->currentTable['prev'][$row['uid']])) {
-                                               // Up
-                                               $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['prev'][$row['uid']];
-                                               $cells['moveUp'] = '<a class="btn" href="#" onclick="'
-                                                       . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
-                                                       . '" title="' . $this->getLanguageService()->getLL('moveUp', TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon('actions-move-up') . '</a>';
-                                       } else {
-                                               $cells['moveUp'] = $this->spaceIcon;
-                                       }
-                                       if ($this->currentTable['next'][$row['uid']]) {
-                                               // Down
-                                               $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['next'][$row['uid']];
-                                               $cells['moveDown'] = '<a class="btn" href="#" onclick="'
-                                                       . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
-                                                       . '" title="' . $this->getLanguageService()->getLL('moveDown', TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon('actions-move-down') . '</a>';
-                                       } else {
-                                               $cells['moveDown'] = $this->spaceIcon;
-                                       }
+                       }
+                       // "Up/Down" links
+                       if ($permsEdit && $GLOBALS['TCA'][$table]['ctrl']['sortby'] && !$this->sortField && !$this->searchLevels) {
+                               if (isset($this->currentTable['prev'][$row['uid']])) {
+                                       // Up
+                                       $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['prev'][$row['uid']];
+                                       $moveUpAction = '<a class="btn btn-default" href="#" onclick="'
+                                               . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
+                                               . '" title="' . $this->getLanguageService()->getLL('moveUp', TRUE) . '">'
+                                               . IconUtility::getSpriteIcon('actions-move-up') . '</a>';
+                               } else {
+                                       $moveUpAction = $this->spaceIcon;
                                }
-                               // "Hide/Unhide" links:
-                               $hiddenField = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'];
-                               if (
-                                       $permsEdit && $hiddenField && $GLOBALS['TCA'][$table]['columns'][$hiddenField]
-                                       && (!$GLOBALS['TCA'][$table]['columns'][$hiddenField]['exclude']
-                                               || $this->getBackendUserAuthentication()->check('non_exclude_fields', $table . ':' . $hiddenField))
-                               ) {
-                                       if ($row[$hiddenField]) {
-                                               $params = 'data[' . $table . '][' . $rowUid . '][' . $hiddenField . ']=0';
-                                               $cells['hide'] = '<a class="btn t3js-record-hide" data-state="hidden" href="#"'
-                                                       . ' data-params="' . htmlspecialchars($params) . '"'
-                                                       . ' title="' . $this->getLanguageService()->getLL(('unHide' . ($table == 'pages' ? 'Page' : '')), TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon('actions-edit-unhide') . '</a>';
-                                       } else {
-                                               $params = 'data[' . $table . '][' . $rowUid . '][' . $hiddenField . ']=1';
-                                               $cells['hide'] = '<a class="btn t3js-record-hide" data-state="visible" href="#"'
-                                                       . ' data-params="' . htmlspecialchars($params) . '"'
-                                                       . ' title="' . $this->getLanguageService()->getLL(('hide' . ($table == 'pages' ? 'Page' : '')), TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon('actions-edit-hide') . '</a>';
-                                       }
+                               $this->addActionToCellGroup($cells, $moveUpAction, 'moveUp');
+
+                               if ($this->currentTable['next'][$row['uid']]) {
+                                       // Down
+                                       $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['next'][$row['uid']];
+                                       $moveDownAction = '<a class="btn btn-default" href="#" onclick="'
+                                               . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
+                                               . '" title="' . $this->getLanguageService()->getLL('moveDown', TRUE) . '">'
+                                               . IconUtility::getSpriteIcon('actions-move-down') . '</a>';
+                               } else {
+                                       $moveDownAction = $this->spaceIcon;
+                               }
+                               $this->addActionToCellGroup($cells, $moveDownAction, 'moveDown');
+                       }
+                       // "Hide/Unhide" links:
+                       $hiddenField = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'];
+                       if (
+                               $permsEdit && $hiddenField && $GLOBALS['TCA'][$table]['columns'][$hiddenField]
+                               && (!$GLOBALS['TCA'][$table]['columns'][$hiddenField]['exclude']
+                                       || $this->getBackendUserAuthentication()->check('non_exclude_fields', $table . ':' . $hiddenField))
+                       ) {
+                               if ($row[$hiddenField]) {
+                                       $params = 'data[' . $table . '][' . $rowUid . '][' . $hiddenField . ']=0';
+                                       $hideAction = '<a class="btn btn-default t3js-record-hide" data-state="hidden" href="#"'
+                                               . ' data-params="' . htmlspecialchars($params) . '"'
+                                               . ' title="' . $this->getLanguageService()->getLL(('unHide' . ($table == 'pages' ? 'Page' : '')), TRUE) . '">'
+                                               . IconUtility::getSpriteIcon('actions-edit-unhide') . '</a>';
+                               } else {
+                                       $params = 'data[' . $table . '][' . $rowUid . '][' . $hiddenField . ']=1';
+                                       $hideAction = '<a class="btn btn-default t3js-record-hide" data-state="visible" href="#"'
+                                               . ' data-params="' . htmlspecialchars($params) . '"'
+                                               . ' title="' . $this->getLanguageService()->getLL(('hide' . ($table == 'pages' ? 'Page' : '')), TRUE) . '">'
+                                               . IconUtility::getSpriteIcon('actions-edit-hide') . '</a>';
+                               }
+                               $this->addActionToCellGroup($cells, $hideAction, 'hide');
+                       }
+                       // "Delete" link:
+                       if ($table === 'pages' && $localCalcPerms & 4 || $table !== 'pages' && $this->calcPerms & 16) {
+                               // Check if the record version is in "deleted" state, because that will switch the action to "restore"
+                               if ($this->getBackendUserAuthentication()->workspace > 0 && isset($row['t3ver_state']) && (int)$row['t3ver_state'] === 2) {
+                                       $actionName = 'restore';
+                                       $refCountMsg = '';
+                               } else {
+                                       $actionName = 'delete';
+                                       $refCountMsg = BackendUtility::referenceCount(
+                                               $table,
+                                               $row['uid'],
+                                               ' ' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.referencesToRecord'),
+                                               $this->getReferenceCount($table, $row['uid'])) . BackendUtility::translationCount($table, $row['uid'],
+                                               ' ' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.translationsOfRecord')
+                                       );
                                }
-                               // "Delete" link:
-                               if ($table == 'pages' && $localCalcPerms & 4 || $table != 'pages' && $this->calcPerms & 16) {
-                                       // Check if the record version is in "deleted" state, because that will switch the action to "restore"
-                                       if ($this->getBackendUserAuthentication()->workspace > 0 && isset($row['t3ver_state']) && (int)$row['t3ver_state'] === 2) {
-                                               $actionName = 'restore';
-                                               $refCountMsg = '';
-                                       } else {
-                                               $actionName = 'delete';
-                                               $refCountMsg = BackendUtility::referenceCount(
-                                                       $table,
-                                                       $row['uid'],
-                                                       ' ' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.referencesToRecord'),
-                                                       $this->getReferenceCount($table, $row['uid'])) . BackendUtility::translationCount($table, $row['uid'],
-                                                       ' ' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.translationsOfRecord')
-                                               );
-                                       }
 
-                                       $titleOrig = BackendUtility::getRecordTitle($table, $row, FALSE, TRUE);
-                                       $title = GeneralUtility::fixed_lgd_cs($titleOrig, $this->fixedL);
-                                       $warningText = $this->getLanguageService()->getLL($actionName . 'Warning') . ' "' . $title . '" ' . '[' . $table . ':' . $row['uid'] . ']' . $refCountMsg;
-
-                                       $params = 'cmd[' . $table . '][' . $row['uid'] . '][delete]=1';
-                                       $icon = IconUtility::getSpriteIcon('actions-edit-' . $actionName);
-                                       $linkTitle = $this->getLanguageService()->getLL($actionName, TRUE);
-                                       $cells['delete'] = '<a class="btn t3js-record-delete" href="#" '
-                                               . ' data-l10parent="' . htmlspecialchars($row['l10n_parent']) . '"'
-                                               . ' data-params="' . htmlspecialchars($params) . '" data-title="' . htmlspecialchars($titleOrig) . '"'
-                                               . ' data-message="' . htmlspecialchars($warningText) . '" title="' . $linkTitle . '"'
-                                               . '>' . $icon . '</a>';
+                               $titleOrig = BackendUtility::getRecordTitle($table, $row, FALSE, TRUE);
+                               $title = GeneralUtility::slashJS(GeneralUtility::fixed_lgd_cs($titleOrig, $this->fixedL), TRUE);
+                               $warningText = $this->getLanguageService()->getLL($actionName . 'Warning') . ' "' . $title . '" ' . '[' . $table . ':' . $row['uid'] . ']' . $refCountMsg;
+
+                               $params = 'cmd[' . $table . '][' . $row['uid'] . '][delete]=1';
+                               $icon = IconUtility::getSpriteIcon('actions-edit-' . $actionName);
+                               $linkTitle = $this->getLanguageService()->getLL($actionName, TRUE);
+                               $deleteAction = '<a class="btn btn-default t3js-record-delete" href="#" '
+                                       . ' data-l10parent="' . htmlspecialchars($row['l10n_parent']) . '"'
+                                       . ' data-params="' . htmlspecialchars($params) . '" data-title="' . htmlspecialchars($titleOrig) . '"'
+                                       . ' data-message="' . htmlspecialchars($warningText) . '" title="' . $linkTitle . '"'
+                                       . '>' . $icon . '</a>';
+                               $this->addActionToCellGroup($cells, $deleteAction, 'delete');
+                       }
+                       // "Levels" links: Moving pages into new levels...
+                       if ($permsEdit && $table == 'pages' && !$this->searchLevels) {
+                               // Up (Paste as the page right after the current parent page)
+                               if ($this->calcPerms & 8) {
+                                       $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . -$this->id;
+                                       $moveLeftAction = '<a class="btn btn-default" href="#" onclick="'
+                                               . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
+                                               . '" title="' . $this->getLanguageService()->getLL('prevLevel', TRUE) . '">'
+                                               . IconUtility::getSpriteIcon('actions-move-left') . '</a>';
+                                       $this->addActionToCellGroup($cells, $moveLeftAction, 'moveLeft');
                                }
-                               // "Levels" links: Moving pages into new levels...
-                               if ($permsEdit && $table == 'pages' && !$this->searchLevels) {
-                                       // Up (Paste as the page right after the current parent page)
-                                       if ($this->calcPerms & 8) {
-                                               $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . -$this->id;
-                                               $cells['moveLeft'] = '<a class="btn" href="#" onclick="'
+                               // Down (Paste as subpage to the page right above)
+                               if ($this->currentTable['prevUid'][$row['uid']]) {
+                                       $localCalcPerms = $this->getBackendUserAuthentication()->calcPerms(BackendUtility::getRecord('pages', $this->currentTable['prevUid'][$row['uid']]));
+                                       if ($localCalcPerms & 8) {
+                                               $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['prevUid'][$row['uid']];
+                                               $moveRightAction = '<a class="btn btn-default" href="#" onclick="'
                                                        . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
-                                                       . '" title="' . $this->getLanguageService()->getLL('prevLevel', TRUE) . '">'
-                                                       . IconUtility::getSpriteIcon('actions-move-left') . '</a>';
-                                       }
-                                       // Down (Paste as subpage to the page right above)
-                                       if ($this->currentTable['prevUid'][$row['uid']]) {
-                                               $localCalcPerms = $this->getBackendUserAuthentication()->calcPerms(BackendUtility::getRecord('pages', $this->currentTable['prevUid'][$row['uid']]));
-                                               if ($localCalcPerms & 8) {
-                                                       $params = '&cmd[' . $table . '][' . $row['uid'] . '][move]=' . $this->currentTable['prevUid'][$row['uid']];
-                                                       $cells['moveRight'] = '<a class="btn" href="#" onclick="'
-                                                               . htmlspecialchars('return jumpToUrl(\'' . $module->doc->issueCommand($params, -1) . '\');')
-                                                               . '" title="' . $this->getLanguageService()->getLL('nextLevel', TRUE) . '">'
-                                                               . IconUtility::getSpriteIcon('actions-move-right') . '</a>';
-                                               } else {
-                                                       $cells['moveRight'] = $this->spaceIcon;
-                                               }
+                                                       . '" title="' . $this->getLanguageService()->getLL('nextLevel', TRUE) . '">'
+                                                       . IconUtility::getSpriteIcon('actions-move-right') . '</a>';
                                        } else {
-                                               $cells['moveRight'] = $this->spaceIcon;
+                                               $moveRightAction = $this->spaceIcon;
                                        }
+                               } else {
+                                       $moveRightAction = $this->spaceIcon;
                                }
+                               $this->addActionToCellGroup($cells, $moveRightAction, 'moveRight');
                        }
                }
                /**
@@ -1371,7 +1385,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['recStatInfoHooks'] as $_funcRef) {
                                $stat .= GeneralUtility::callUserFunction($_funcRef, $_params, $this);
                        }
-                       $cells['stat'] = $stat;
+                       $this->addActionToCellGroup($cells, $stat, 'stat');
                }
                /**
                 * @hook makeControl: Allows to change control icons of records in list-module
@@ -1386,13 +1400,42 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                if (!$hookObject instanceof RecordListHookInterface) {
                                        throw new \UnexpectedValueException('$hookObject must implement interface ' . RecordListHookInterface::class, 1195567840);
                                }
+                               // for compatibility reason, we move all icons to the rootlevel
+                               // before calling the hook
+                               foreach ($cells as $section => $actions) {
+                                       foreach ($actions as $actionKey => $action) {
+                                               $cells[$actionKey] = $action;
+                                       }
+                               }
                                $cells = $hookObject->makeControl($table, $row, $cells, $this);
                        }
+                       // now sort icons again into primary and secondary sections
+                       // after all hooks are processed
+                       $hookCells = $cells;
+                       foreach ($hookCells as $key => $value) {
+                               if ($key === 'primary' || $key === 'secondary') {
+                                       continue;
+                               }
+                               $this->addActionToCellGroup($cells, $value, $key);
+                       }
                }
-               // Compile items into a DIV-element:
-               return '
-                                                                                       <!-- CONTROL PANEL: ' . $table . ':' . $row['uid'] . ' -->
-                                                                                       <div class="btn-group" role="group">' . implode('', $cells) . '</div>';
+               $output = '<!-- CONTROL PANEL: ' . $table . ':' . $row['uid'] . ' -->';
+               foreach($cells as $classification => $actions) {
+                       $visibilityClass = ($classification !== 'primary' && !$module->MOD_SETTINGS['bigControlPanel'] ? 'collapsed' : 'expanded');
+                       if ($visibilityClass === 'collapsed') {
+                               $cellOutput = '';
+                               foreach ($actions as $action) {
+                                       $cellOutput .= $action;
+                               }
+                               $output .= ' <div class="btn-group">' .
+                                       '<span id="actions_' . $table . '_' . $row['uid'] . '" class="btn-group collapse collapse-horizontal width">' . $cellOutput . '</span>' .
+                                       '<a href="#actions_' . $table . '_' . $row['uid'] . '" class="btn btn-default collapsed" data-toggle="collapse" aria-expanded="false"><span class="t3-icon fa fa-cog"></span></a>' .
+                                       '</div>';
+                       } else {
+                               $output .= ' <div class="btn-group" role="group">' . implode('', $actions) . '</div>';
+                       }
+               }
+               return $output;
        }
 
        /**
@@ -1405,7 +1448,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
         */
        public function makeClip($table, $row) {
                // Return blank, if disabled:
-               if ($this->dontShowClipControlPanels) {
+               if (!$this->getModule()->MOD_SETTINGS['clipBoard']) {
                        return '';
                }
                $cells = array();
@@ -1422,11 +1465,11 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                                $cells['copy'] = $this->spaceIcon;
                                $cells['cut'] = $this->spaceIcon;
                        } else {
-                               $cells['copy'] = '<a class="btn" href="#" onclick="'
+                               $cells['copy'] = '<a class="btn btn-default" href="#" onclick="'
                                        . htmlspecialchars('return jumpSelf(\'' . $this->clipObj->selUrlDB($table, $row['uid'], 1, ($isSel == 'copy'), array('returnUrl' => '')) . '\');')
                                        . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.copy', TRUE) . '">'
                                        . (!$isSel == 'copy' ? IconUtility::getSpriteIcon('actions-edit-copy') : IconUtility::getSpriteIcon('actions-edit-copy-release')) . '</a>';
-                               $cells['cut'] = '<a class="btn" href="#" onclick="'
+                               $cells['cut'] = '<a class="btn btn-default" href="#" onclick="'
                                        . htmlspecialchars('return jumpSelf(\'' . $this->clipObj->selUrlDB($table, $row['uid'], 0, ($isSel == 'cut'), array('returnUrl' => '')) . '\');')
                                        . '" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:cm.cut', TRUE) . '">'
                                        . (!$isSel == 'cut' ? IconUtility::getSpriteIcon('actions-edit-cut') : IconUtility::getSpriteIcon('actions-edit-cut-release')) . '</a>';
@@ -1449,8 +1492,8 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        // Adding the checkbox to the panel:
                        $cells['select'] = $isL10nOverlay
                                ? $this->spaceIcon
-                               : '<div class="btn-checkbox-holder"><input type="hidden" name="CBH[' . $n . ']" value="0" /><input type="checkbox"'
-                                       . ' name="CBC[' . $n . ']" value="1" class="smallCheckboxes btn-checkbox" ' . $checked . '/><span class="btn"><span class="t3-icon fa"></span></span></div>';
+                               : '<label class="btn btn-default btn-checkbox"><input type="hidden" name="CBH[' . $n . ']" value="0" /><input type="checkbox"'
+                                       . ' name="CBC[' . $n . ']" value="1" ' . $checked . '/><span class="t3-icon fa"></span></label>';
                }
                // Now, looking for selected elements from the current table:
                $elFromTable = $this->clipObj->elFromTable($table);
@@ -1458,7 +1501,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        // IF elements are found and they can be individually ordered, then add a "paste after" icon:
                        $cells['pasteAfter'] = $isL10nOverlay
                                ? $this->spaceIcon
-                               : '<a class="btn" href="' . htmlspecialchars($this->clipObj->pasteUrl($table, -$row['uid'])) . '" onclick="'
+                               : '<a class="btn btn-default" href="' . htmlspecialchars($this->clipObj->pasteUrl($table, -$row['uid'])) . '" onclick="'
                                        . htmlspecialchars(('return ' . $this->clipObj->confirmMsg($table, $row, 'after', $elFromTable)))
                                        . '" title="' . $this->getLanguageService()->getLL('clip_pasteAfter', TRUE) . '">'
                                        . IconUtility::getSpriteIcon('actions-document-paste-after') . '</a>';
@@ -1466,7 +1509,7 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                // Now, looking for elements in general:
                $elFromTable = $this->clipObj->elFromTable('');
                if ($table == 'pages' && count($elFromTable)) {
-                       $cells['pasteInto'] = '<a class="btn" href="' . htmlspecialchars($this->clipObj->pasteUrl('', $row['uid']))
+                       $cells['pasteInto'] = '<a class="btn btn-default" href="' . htmlspecialchars($this->clipObj->pasteUrl('', $row['uid']))
                                . '" onclick="' . htmlspecialchars('return ' . $this->clipObj->confirmMsg($table, $row, 'into', $elFromTable))
                                . '" title="' . $this->getLanguageService()->getLL('clip_pasteInto', TRUE) . '">'
                                . IconUtility::getSpriteIcon('actions-document-paste-into') . '</a>';
@@ -1488,8 +1531,8 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        }
                }
                // Compile items into a DIV-element:
-               return '                                                        <!-- CLIPBOARD PANEL: ' . $table . ':' . $row['uid'] . ' -->
-                                                                                       <div class="btn-group" role="group">' . implode('', $cells) . '</div>';
+               return '<!-- CLIPBOARD PANEL: ' . $table . ':' . $row['uid'] . ' -->
+                       <div class="btn-group" role="group">' . implode('', $cells) . '</div>';
        }
 
        /**
@@ -1589,17 +1632,12 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
                        $fL = is_array($GLOBALS['TCA'][$table]['columns'][$fN])
                                ? rtrim($lang->sL($GLOBALS['TCA'][$table]['columns'][$fN]['label']), ':')
                                : '[' . $fN . ']';
-                       $opt[] = '
-                                                                                       <option value="' . $fN . '"'
-                               . (in_array($fN, $setFields) ? ' selected="selected"' : '') . '>' . htmlspecialchars($fL) . '</option>';
+                       $opt[] = '<option value="' . $fN . '"' . (in_array($fN, $setFields) ? ' selected="selected"' : '') . '>'
+                               . htmlspecialchars($fL) . '</option>';
                }
                // Compile the options into a multiple selector box:
-               $lMenu = '
-                                                                               <select size="'
-                       . MathUtility::forceIntegerInRange(count($fields) + 1, 3, 20)
-                       . '" multiple="multiple" name="displayFields[' . $table . '][]">' . implode('', $opt) . '
-                                                                               </select>
-                               ';
+               $lMenu = '<select size="' . MathUtility::forceIntegerInRange(count($fields) + 1, 3, 20)
+                       . '" multiple="multiple" name="displayFields[' . $table . '][]">' . implode('', $opt) . '</select>';
                // Table with the field selector::
                $content = $formElements[0] . '
                        <!--
@@ -1813,6 +1851,27 @@ class DatabaseRecordList extends AbstractDatabaseRecordList {
        }
 
        /**
+        * add action into correct section
+        *
+        * @param array $cells
+        * @param string $action
+        * @param string $actionKey
+        */
+       public function addActionToCellGroup(&$cells, $action, $actionKey) {
+               $cellsMap = array(
+                       'primary' => array(
+                               'view', 'edit', 'hide', 'delete', 'stat'
+                       ),
+                       'secondary' => array(
+                               'viewBig', 'history', 'perms', 'new', 'move', 'moveUp', 'moveDown', 'moveLeft', 'moveRight', 'version'
+                       )
+               );
+               $classification = in_array($actionKey, $cellsMap['primary']) ? 'primary' : 'secondary';
+               $cells[$classification][$actionKey] = $action;
+               unset($cells[$actionKey]);
+       }
+
+       /**
         * @return DatabaseConnection
         */
        protected function getDatabaseConnection() {
index 0db4ea4..16ce89f 100644 (file)
@@ -1,20 +1,18 @@
 <tr data-uid="{record.uid}" data-table="{record.table}" data-recordtitle="{record.title}">
        <td>
                <div class="btn-group">
-                       <div class="btn-group btn-checkbox-holder">
-                               <input type="checkbox" class="smallCheckboxes btn-checkbox">
-                               <span class="btn">
-                                       <span class="t3-icon fa"></span>
-                               </span>
-                       </div>
-                       <a class="btn" data-action="expand" data-toggle="collapse" data-target="#{record.table}_{record.uid}">
+                       <label class="btn btn-default btn-checkbox">
+                               <input type="checkbox">
+                               <span class="t3-icon fa"></span>
+                       </label>
+                       <a class="btn btn-default" data-action="expand" data-toggle="collapse" data-target="#{record.table}_{record.uid}">
                                <f:be.buttons.icon icon="apps-pagetree-collapse" title="{f:translate(key: 'LLL:EXT:recycler/Resources/Private/Language/locallang.xlf:button.expand')}" />
                        </a>
-                       <a class="btn" data-action="undo">
+                       <a class="btn btn-default" data-action="undo">
                                <f:be.buttons.icon icon="actions-edit-undo" title="{f:translate(key: 'LLL:EXT:recycler/Resources/Private/Language/locallang.xlf:button.undo')}" />
                        </a>
                        <f:if condition="{allowDelete}">
-                               <a class="btn" data-action="delete">
+                               <a class="btn btn-default" data-action="delete">
                                        <f:be.buttons.icon icon="actions-edit-delete" title="{f:translate(key: 'LLL:EXT:recycler/Resources/Private/Language/locallang.xlf:button.delete')}" />
                                </a>
                        </f:if>
diff --git a/typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_animation.less b/typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_animation.less
new file mode 100644 (file)
index 0000000..0492f28
--- /dev/null
@@ -0,0 +1,18 @@
+//
+// Collapse horizontal
+//
+.collapse-horizontal {
+       height: auto;
+       width: 0;
+       vertical-align: middle;
+       overflow: hidden;
+       &.in {
+               display: inline-block;
+               width: auto;
+       }
+       &.collapsing {
+               display: inline-block;
+               width: 0;
+               .transition-property(~"width, visibility");
+       }
+}
diff --git a/typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_buttons.less b/typo3/sysext/t3skin/Resources/Private/Styles/TYPO3/_element_buttons.less
new file mode 100644 (file)
index 0000000..3ba15c8
--- /dev/null
@@ -0,0 +1,39 @@
+//
+// Button
+//
+.btn {
+       .t3-icon {
+               margin: 0;
+       }
+}
+
+//
+// Button Group
+//
+.btn-group {
+       .collapse + .btn.collapsed:last-child {
+               border-radius: @border-radius-base;
+       }
+}
+
+//
+// Button Checkbox and Radio
+//
+.btn-radio,
+.btn-checkbox {
+       input[type="radio"],
+    input[type="checkbox"] {
+               position: absolute;
+               clip: rect(0,0,0,0);
+               pointer-events: none;
+       }
+       .fa:before {
+               content: "\f096";
+       }
+       input[type=radio]:checked,
+       input[type=checkbox]:checked {
+               + .fa:before {
+                       content: "\f00c";
+               }
+       }
+}
index 4484d17..04903e1 100644 (file)
@@ -52,11 +52,9 @@ table {
 .table {
        background-color: @table-bg;
        border: 1px solid @table-border-color;
-
        * {
                box-sizing: border-box;
        }
-
        > thead,
        > tbody,
        > tfoot {
@@ -70,7 +68,6 @@ table {
                        }
                }
        }
-
        > thead > tr {
                background-color: darken(@table-bg, 5%);
                th,
@@ -81,123 +78,45 @@ table {
                        }
                }
        }
-
-       .btn {
-               .btn-sm();
-               color: #333;
-               background-color: darken(@table-bg-accent, 10%);
-               border-color: darken(@table-bg-accent, 20%);
-               margin-top: -2px;
-               margin-bottom: -2px;
-
-               &:hover {
-                       border-color: darken(@table-bg-accent, 30%);
-                       background-color: darken(@table-bg-accent, 20%);
-               }
-               .t3-icon {
-                       margin: 0;
-               }
-               &.btn-danger {
-                       .btn-danger();
-               }
-               &.btn-success {
-                       .btn-success();
-               }
-               &.btn-warning {
-                       .btn-warning();
-               }
-               &.btn-info {
-                       .btn-info();
-               }
-               &.btn-default {
-                       .btn-default();
-               }
-               &.btn-primary {
-                       .btn-primary();
-               }
-       }
-
        .btn-group {
-               font-size: 0;
-
-               .btn {
-                       font-size: 12px;
-                       float: none;
-               }
-       }
-
-       .btn-checkbox-holder {
-               position: relative;
-               display: inline-block;
-
-               &.btn-group {
+               > .btn-group,
+               > .btn {
                        float: none;
                }
-
-               .btn-checkbox {
-                       position: absolute;
-                       top: 0;
-                       height: 100%;
-                       width: 100%;
-                       opacity: 0;
-                       z-index: 10;
-               }
-               input[type=checkbox] + .btn {
-                       .t3-icon:before {
-                               content: "\f096";
-                       }
-               }
-               input[type=checkbox]:checked + .btn {
-                       .btn-primary();
-                       .t3-icon:before {
-                               content: "\f00c";
-                       }
-               }
        }
-
-       .btn-group {
-               .btn + .btn-checkbox-holder {
-                       margin-left: -1px;
-                       border-top-left-radius: 0;
-                       border-bottom-left-radius: 0;
-               }
+       .btn-default {
+               .button-variant(@btn-default-color; darken(@table-bg-accent, 10%); darken(@table-bg-accent, 20%));
        }
-
        .pagination {
                margin: 0;
        }
-
        .col-icon {
                text-align: center;
-
                .t3-icon {
                        margin: 0;
                }
-
                img {
                        margin: 0;
                        display: block;
                        height: 16px;
                        width: 16px;
                }
-
        }
-
        .col-icon,
        .col-checkbox {
                padding-right: 0;
        }
-
        .col-title {
                width: 99%;
        }
-
        .col-control,
        .col-clipboard {
                white-space: nowrap;
                text-align: right;
        }
-
+       .col-control {
+               padding: 4px 6px;
+       }
        .col-border-left {
                border-left: 1px solid @table-border-color;
        }
index e479282..4387663 100644 (file)
 @import "TYPO3/_main_type.less";
 
 @import "TYPO3/_debug_panel.less";
+@import "TYPO3/_element_animation.less";
 @import "TYPO3/_element_clipboard.less";
 @import "TYPO3/_element_csh.less";
 @import "TYPO3/_element_csm.less";
 @import "TYPO3/_element_tree.less";
 @import "TYPO3/_element_pagination.less";
 @import "TYPO3/_element_label.less";
+@import "TYPO3/_element_buttons.less";
 @import "TYPO3/_fonts.less";
 @import "TYPO3/_login_screen.less";
 @import "TYPO3/_main_body.less";
index 7475877..64df5f5 100644 (file)
@@ -7379,6 +7379,22 @@ button.close {
   top: 0;
   left: 0;
 }
+.collapse-horizontal {
+  height: auto;
+  width: 0;
+  vertical-align: middle;
+  overflow: hidden;
+}
+.collapse-horizontal.in {
+  display: inline-block;
+  width: auto;
+}
+.collapse-horizontal.collapsing {
+  display: inline-block;
+  width: 0;
+  -webkit-transition-property: width, visibility;
+  transition-property: width, visibility;
+}
 table#typo3-clipboard {
   background-color: #efeff4;
   border: 1px solid #a2aab8;
@@ -8502,372 +8518,55 @@ table {
 .table > thead > tr td i {
   font-weight: normal;
 }
-.table .btn {
-  padding: 4px 4px;
-  font-size: 11px;
-  line-height: 1.5;
-  border-radius: 2px;
-  color: #333;
-  background-color: #dedede;
-  border-color: #c4c4c4;
-  margin-top: -2px;
-  margin-bottom: -2px;
-}
-.table .btn:hover {
-  border-color: #ababab;
-  background-color: #c4c4c4;
-}
-.table .btn .t3-icon {
-  margin: 0;
-}
-.table .btn.btn-danger {
-  color: #ffffff;
-  background-color: #c83c3c;
-  border-color: #b73434;
-}
-.table .btn.btn-danger:hover,
-.table .btn.btn-danger:focus,
-.table .btn.btn-danger.focus,
-.table .btn.btn-danger:active,
-.table .btn.btn-danger.active,
-.open > .dropdown-toggle.table .btn.btn-danger {
-  color: #ffffff;
-  background-color: #a32e2e;
-  border-color: #872626;
-}
-.table .btn.btn-danger:active,
-.table .btn.btn-danger.active,
-.open > .dropdown-toggle.table .btn.btn-danger {
-  background-image: none;
-}
-.table .btn.btn-danger.disabled,
-.table .btn.btn-danger[disabled],
-fieldset[disabled] .table .btn.btn-danger,
-.table .btn.btn-danger.disabled:hover,
-.table .btn.btn-danger[disabled]:hover,
-fieldset[disabled] .table .btn.btn-danger:hover,
-.table .btn.btn-danger.disabled:focus,
-.table .btn.btn-danger[disabled]:focus,
-fieldset[disabled] .table .btn.btn-danger:focus,
-.table .btn.btn-danger.disabled.focus,
-.table .btn.btn-danger[disabled].focus,
-fieldset[disabled] .table .btn.btn-danger.focus,
-.table .btn.btn-danger.disabled:active,
-.table .btn.btn-danger[disabled]:active,
-fieldset[disabled] .table .btn.btn-danger:active,
-.table .btn.btn-danger.disabled.active,
-.table .btn.btn-danger[disabled].active,
-fieldset[disabled] .table .btn.btn-danger.active {
-  background-color: #c83c3c;
-  border-color: #b73434;
-}
-.table .btn.btn-danger .badge {
-  color: #c83c3c;
-  background-color: #ffffff;
-}
-.table .btn.btn-success {
-  color: #ffffff;
-  background-color: #1eb941;
-  border-color: #1aa339;
-}
-.table .btn.btn-success:hover,
-.table .btn.btn-success:focus,
-.table .btn.btn-success.focus,
-.table .btn.btn-success:active,
-.table .btn.btn-success.active,
-.open > .dropdown-toggle.table .btn.btn-success {
-  color: #ffffff;
-  background-color: #178d32;
-  border-color: #126e27;
-}
-.table .btn.btn-success:active,
-.table .btn.btn-success.active,
-.open > .dropdown-toggle.table .btn.btn-success {
-  background-image: none;
-}
-.table .btn.btn-success.disabled,
-.table .btn.btn-success[disabled],
-fieldset[disabled] .table .btn.btn-success,
-.table .btn.btn-success.disabled:hover,
-.table .btn.btn-success[disabled]:hover,
-fieldset[disabled] .table .btn.btn-success:hover,
-.table .btn.btn-success.disabled:focus,
-.table .btn.btn-success[disabled]:focus,
-fieldset[disabled] .table .btn.btn-success:focus,
-.table .btn.btn-success.disabled.focus,
-.table .btn.btn-success[disabled].focus,
-fieldset[disabled] .table .btn.btn-success.focus,
-.table .btn.btn-success.disabled:active,
-.table .btn.btn-success[disabled]:active,
-fieldset[disabled] .table .btn.btn-success:active,
-.table .btn.btn-success.disabled.active,
-.table .btn.btn-success[disabled].active,
-fieldset[disabled] .table .btn.btn-success.active {
-  background-color: #1eb941;
-  border-color: #1aa339;
-}
-.table .btn.btn-success .badge {
-  color: #1eb941;
-  background-color: #ffffff;
-}
-.table .btn.btn-warning {
-  color: #ffffff;
-  background-color: #f07814;
-  border-color: #dc6c0e;
-}
-.table .btn.btn-warning:hover,
-.table .btn.btn-warning:focus,
-.table .btn.btn-warning.focus,
-.table .btn.btn-warning:active,
-.table .btn.btn-warning.active,
-.open > .dropdown-toggle.table .btn.btn-warning {
-  color: #ffffff;
-  background-color: #c4600d;
-  border-color: #a3500a;
-}
-.table .btn.btn-warning:active,
-.table .btn.btn-warning.active,
-.open > .dropdown-toggle.table .btn.btn-warning {
-  background-image: none;
-}
-.table .btn.btn-warning.disabled,
-.table .btn.btn-warning[disabled],
-fieldset[disabled] .table .btn.btn-warning,
-.table .btn.btn-warning.disabled:hover,
-.table .btn.btn-warning[disabled]:hover,
-fieldset[disabled] .table .btn.btn-warning:hover,
-.table .btn.btn-warning.disabled:focus,
-.table .btn.btn-warning[disabled]:focus,
-fieldset[disabled] .table .btn.btn-warning:focus,
-.table .btn.btn-warning.disabled.focus,
-.table .btn.btn-warning[disabled].focus,
-fieldset[disabled] .table .btn.btn-warning.focus,
-.table .btn.btn-warning.disabled:active,
-.table .btn.btn-warning[disabled]:active,
-fieldset[disabled] .table .btn.btn-warning:active,
-.table .btn.btn-warning.disabled.active,
-.table .btn.btn-warning[disabled].active,
-fieldset[disabled] .table .btn.btn-warning.active {
-  background-color: #f07814;
-  border-color: #dc6c0e;
-}
-.table .btn.btn-warning .badge {
-  color: #f07814;
-  background-color: #ffffff;
-}
-.table .btn.btn-info {
-  color: #ffffff;
-  background-color: #41b4dc;
-  border-color: #2bacd8;
-}
-.table .btn.btn-info:hover,
-.table .btn.btn-info:focus,
-.table .btn.btn-info.focus,
-.table .btn.btn-info:active,
-.table .btn.btn-info.active,
-.open > .dropdown-toggle.table .btn.btn-info {
-  color: #ffffff;
-  background-color: #249cc6;
-  border-color: #1f84a7;
-}
-.table .btn.btn-info:active,
-.table .btn.btn-info.active,
-.open > .dropdown-toggle.table .btn.btn-info {
-  background-image: none;
-}
-.table .btn.btn-info.disabled,
-.table .btn.btn-info[disabled],
-fieldset[disabled] .table .btn.btn-info,
-.table .btn.btn-info.disabled:hover,
-.table .btn.btn-info[disabled]:hover,
-fieldset[disabled] .table .btn.btn-info:hover,
-.table .btn.btn-info.disabled:focus,
-.table .btn.btn-info[disabled]:focus,
-fieldset[disabled] .table .btn.btn-info:focus,
-.table .btn.btn-info.disabled.focus,
-.table .btn.btn-info[disabled].focus,
-fieldset[disabled] .table .btn.btn-info.focus,
-.table .btn.btn-info.disabled:active,
-.table .btn.btn-info[disabled]:active,
-fieldset[disabled] .table .btn.btn-info:active,
-.table .btn.btn-info.disabled.active,
-.table .btn.btn-info[disabled].active,
-fieldset[disabled] .table .btn.btn-info.active {
-  background-color: #41b4dc;
-  border-color: #2bacd8;
-}
-.table .btn.btn-info .badge {
-  color: #41b4dc;
-  background-color: #ffffff;
+.table .btn-group > .btn-group,
+.table .btn-group > .btn {
+  float: none;
 }
-.table .btn.btn-default {
+.table .btn-default {
   color: #333333;
-  background-color: #eeeeee;
-  border-color: #bbbbbb;
+  background-color: #dedede;
+  border-color: #c4c4c4;
 }
-.table .btn.btn-default:hover,
-.table .btn.btn-default:focus,
-.table .btn.btn-default.focus,
-.table .btn.btn-default:active,
-.table .btn.btn-default.active,
-.open > .dropdown-toggle.table .btn.btn-default {
+.table .btn-default:hover,
+.table .btn-default:focus,
+.table .btn-default.focus,
+.table .btn-default:active,
+.table .btn-default.active,
+.open > .dropdown-toggle.table .btn-default {
   color: #333333;
-  background-color: #d5d5d5;
-  border-color: #9c9c9c;
+  background-color: #c4c4c4;
+  border-color: #a6a6a6;
 }
-.table .btn.btn-default:active,
-.table .btn.btn-default.active,
-.open > .dropdown-toggle.table .btn.btn-default {
+.table .btn-default:active,
+.table .btn-default.active,
+.open > .dropdown-toggle.table .btn-default {
   background-image: none;
 }
-.table .btn.btn-default.disabled,
-.table .btn.btn-default[disabled],
-fieldset[disabled] .table .btn.btn-default,
-.table .btn.btn-default.disabled:hover,
-.table .btn.btn-default[disabled]:hover,
-fieldset[disabled] .table .btn.btn-default:hover,
-.table .btn.btn-default.disabled:focus,
-.table .btn.btn-default[disabled]:focus,
-fieldset[disabled] .table .btn.btn-default:focus,
-.table .btn.btn-default.disabled.focus,
-.table .btn.btn-default[disabled].focus,
-fieldset[disabled] .table .btn.btn-default.focus,
-.table .btn.btn-default.disabled:active,
-.table .btn.btn-default[disabled]:active,
-fieldset[disabled] .table .btn.btn-default:active,
-.table .btn.btn-default.disabled.active,
-.table .btn.btn-default[disabled].active,
-fieldset[disabled] .table .btn.btn-default.active {
-  background-color: #eeeeee;
-  border-color: #bbbbbb;
+.table .btn-default.disabled,
+.table .btn-default[disabled],
+fieldset[disabled] .table .btn-default,
+.table .btn-default.disabled:hover,
+.table .btn-default[disabled]:hover,
+fieldset[disabled] .table .btn-default:hover,
+.table .btn-default.disabled:focus,
+.table .btn-default[disabled]:focus,
+fieldset[disabled] .table .btn-default:focus,
+.table .btn-default.disabled.focus,
+.table .btn-default[disabled].focus,
+fieldset[disabled] .table .btn-default.focus,
+.table .btn-default.disabled:active,
+.table .btn-default[disabled]:active,
+fieldset[disabled] .table .btn-default:active,
+.table .btn-default.disabled.active,
+.table .btn-default[disabled].active,
+fieldset[disabled] .table .btn-default.active {
+  background-color: #dedede;
+  border-color: #c4c4c4;
 }
-.table .btn.btn-default .badge {
-  color: #eeeeee;
+.table .btn-default .badge {
+  color: #dedede;
   background-color: #333333;
 }
-.table .btn.btn-primary {
-  color: #ffffff;
-  background-color: #0078e6;
-  border-color: #006bcd;
-}
-.table .btn.btn-primary:hover,
-.table .btn.btn-primary:focus,
-.table .btn.btn-primary.focus,
-.table .btn.btn-primary:active,
-.table .btn.btn-primary.active,
-.open > .dropdown-toggle.table .btn.btn-primary {
-  color: #ffffff;
-  background-color: #005db3;
-  border-color: #004b8f;
-}
-.table .btn.btn-primary:active,
-.table .btn.btn-primary.active,
-.open > .dropdown-toggle.table .btn.btn-primary {
-  background-image: none;
-}
-.table .btn.btn-primary.disabled,
-.table .btn.btn-primary[disabled],
-fieldset[disabled] .table .btn.btn-primary,
-.table .btn.btn-primary.disabled:hover,
-.table .btn.btn-primary[disabled]:hover,
-fieldset[disabled] .table .btn.btn-primary:hover,
-.table .btn.btn-primary.disabled:focus,
-.table .btn.btn-primary[disabled]:focus,
-fieldset[disabled] .table .btn.btn-primary:focus,
-.table .btn.btn-primary.disabled.focus,
-.table .btn.btn-primary[disabled].focus,
-fieldset[disabled] .table .btn.btn-primary.focus,
-.table .btn.btn-primary.disabled:active,
-.table .btn.btn-primary[disabled]:active,
-fieldset[disabled] .table .btn.btn-primary:active,
-.table .btn.btn-primary.disabled.active,
-.table .btn.btn-primary[disabled].active,
-fieldset[disabled] .table .btn.btn-primary.active {
-  background-color: #0078e6;
-  border-color: #006bcd;
-}
-.table .btn.btn-primary .badge {
-  color: #0078e6;
-  background-color: #ffffff;
-}
-.table .btn-group {
-  font-size: 0;
-}
-.table .btn-group .btn {
-  font-size: 12px;
-  float: none;
-}
-.table .btn-checkbox-holder {
-  position: relative;
-  display: inline-block;
-}
-.table .btn-checkbox-holder.btn-group {
-  float: none;
-}
-.table .btn-checkbox-holder .btn-checkbox {
-  position: absolute;
-  top: 0;
-  height: 100%;
-  width: 100%;
-  opacity: 0;
-  z-index: 10;
-}
-.table .btn-checkbox-holder input[type=checkbox] + .btn .t3-icon:before {
-  content: "\f096";
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn {
-  color: #ffffff;
-  background-color: #0078e6;
-  border-color: #006bcd;
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn:hover,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn:focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn:active,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.active,
-.open > .dropdown-toggle.table .btn-checkbox-holder input[type=checkbox]:checked + .btn {
-  color: #ffffff;
-  background-color: #005db3;
-  border-color: #004b8f;
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn:active,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.active,
-.open > .dropdown-toggle.table .btn-checkbox-holder input[type=checkbox]:checked + .btn {
-  background-image: none;
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled],
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled:hover,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled]:hover,
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn:hover,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled:focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled]:focus,
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn:focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled.focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled].focus,
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn.focus,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled:active,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled]:active,
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn:active,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn.disabled.active,
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn[disabled].active,
-fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .btn.active {
-  background-color: #0078e6;
-  border-color: #006bcd;
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn .badge {
-  color: #0078e6;
-  background-color: #ffffff;
-}
-.table .btn-checkbox-holder input[type=checkbox]:checked + .btn .t3-icon:before {
-  content: "\f00c";
-}
-.table .btn-group .btn + .btn-checkbox-holder {
-  margin-left: -1px;
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
 .table .pagination {
   margin: 0;
 }
@@ -8895,6 +8594,9 @@ fieldset[disabled] .table .btn-checkbox-holder input[type=checkbox]:checked + .b
   white-space: nowrap;
   text-align: right;
 }
+.table .col-control {
+  padding: 4px 6px;
+}
 .table .col-border-left {
   border-left: 1px solid #cccccc;
 }
@@ -9568,6 +9270,30 @@ table#typo3-tree tr:hover {
 .label-block {
   display: block;
 }
+.btn .t3-icon {
+  margin: 0;
+}
+.btn-group .collapse + .btn.collapsed:last-child {
+  border-radius: 2px;
+}
+.btn-radio input[type="radio"],
+.btn-checkbox input[type="radio"],
+.btn-radio input[type="checkbox"],
+.btn-checkbox input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.btn-radio .fa:before,
+.btn-checkbox .fa:before {
+  content: "\f096";
+}
+.btn-radio input[type=radio]:checked + .fa:before,
+.btn-checkbox input[type=radio]:checked + .fa:before,
+.btn-radio input[type=checkbox]:checked + .fa:before,
+.btn-checkbox input[type=checkbox]:checked + .fa:before {
+  content: "\f00c";
+}
 @font-face {
   font-family: 'Share';
   src: url('../../Fonts/share-bold-webfont.eot');
@@ -10854,6 +10580,9 @@ fieldset[disabled] .live-search-list .x-btn button {
   -webkit-box-shadow: none;
   box-shadow: none;
 }
+.live-search-list .x-btn button .t3-icon {
+  margin: 0;
+}
 .live-search-list .x-btn button:hover,
 .live-search-list .x-btn button:focus,
 .live-search-list .x-btn button.focus,
index f84851b..1dbabc3 100644 (file)
@@ -72,7 +72,7 @@ class TypoScriptTemplateInformationModuleFunctionController extends AbstractFunc
                        array('title' => $lang->sL('LLL:EXT:lang/locallang_common.xlf:editField', TRUE))
                );
                $ret .= $startAnchor . '<strong>' . $label . '</strong></a>';
-               $ret .= '</td><td width="80%">' . $data . '</td><td>' . $startAnchor . '<span class="btn">' . $icon . '</span></a></td></tr>';
+               $ret .= '</td><td width="80%">' . $data . '</td><td>' . $startAnchor . '<span class="btn btn-default">' . $icon . '</span></a></td></tr>';
                return $ret;
        }