From eb4b94a34a9b43d7abcdff68fc824807cf5d0034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jasmina=20Lie=C3=9Fmann?= <minapokhalo+typo3@gmail.com> Date: Fri, 19 Apr 2024 01:01:34 +0200 Subject: [PATCH] [TASK] Revamp display of "Workspaces" backend module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To improve the UX and accessibility of the "Workspaces" backend module the following changes are made: * Grouping and rearranging action buttons * Showing system language title in addition to the flag icon * Addition of a new "Action" column to represent the type of change and resolve the previous workspace state legend and colored record titles * Output notification messages with the icon if integrity issues exists * Removal of the live record column (This only contained the name of the live record and no other function. Additionally, records created in workspace were also displayed incorrectly in the live column even though they did not yet exist in live environment.) Resolves: #103670 Releases: main Change-Id: Ic7cd00fc46b638adaca9bd4cf4c6a97f2a53d787 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/83924 Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch> Tested-by: Stefan Bürk <stefan@buerk.tech> Tested-by: Jasmina Ließmann <minapokhalo+typo3@gmail.com> Reviewed-by: Jasmina Ließmann <minapokhalo+typo3@gmail.com> Tested-by: Christian Kuhn <lolli@schwarzbu.ch> Tested-by: core-ci <typo3@b13.com> Reviewed-by: Stefan Bürk <stefan@buerk.tech> --- Build/Sources/Sass/component/_table.scss | 7 +- Build/Sources/Sass/module/_workspaces.scss | 44 ------ .../Sources/TypeScript/workspaces/backend.ts | 4 +- .../workspaces/renderable/record-table.ts | 148 +++++++++++------- .../backend/Resources/Public/Css/backend.css | 14 +- .../Controller/Remote/RemoteServer.php | 2 - .../Classes/Controller/ReviewController.php | 1 - .../Classes/Service/GridDataService.php | 8 +- .../Resources/Private/Language/locallang.xlf | 51 +++--- .../Resources/Private/Partials/Legend.html | 14 -- .../Private/Templates/Review/Index.html | 2 - .../Resources/Public/JavaScript/backend.js | 2 +- .../JavaScript/renderable/record-table.js | 75 ++++----- 13 files changed, 171 insertions(+), 201 deletions(-) delete mode 100644 typo3/sysext/workspaces/Resources/Private/Partials/Legend.html diff --git a/Build/Sources/Sass/component/_table.scss b/Build/Sources/Sass/component/_table.scss index 18eab5ce2cb7..fbcfa27177d9 100644 --- a/Build/Sources/Sass/component/_table.scss +++ b/Build/Sources/Sass/component/_table.scss @@ -110,13 +110,18 @@ } } + .col-language { + width: 200px; + } + .col-recordtitle { width: 250px; } .col-state, .col-recordtitle, - .col-action { + .col-action, + .col-language { min-width: 120px; } diff --git a/Build/Sources/Sass/module/_workspaces.scss b/Build/Sources/Sass/module/_workspaces.scss index 726ba4efbf50..8716f95eac93 100644 --- a/Build/Sources/Sass/module/_workspaces.scss +++ b/Build/Sources/Sass/module/_workspaces.scss @@ -15,47 +15,3 @@ height: 100%; } } - -.workspace-state-unchanged { - color: #000; -} - -.workspace-state-modified { - color: #ff8700; -} - -.workspace-state-moved { - color: #457fb8; -} - -.workspace-state-new { - color: #3c9934; -} - -.workspace-state-hidden { - color: #abaaaa; -} - -.workspace-state-deleted { - color: #000; - text-decoration: line-through; -} - -.workspace-legend { - margin: 5px; - height: 18px; - color: #888; - - dd, - dt { - display: inline; - overflow: hidden; - } - - dd { - span { - display: inline-block; - padding: 4px; - } - } -} diff --git a/Build/Sources/TypeScript/workspaces/backend.ts b/Build/Sources/TypeScript/workspaces/backend.ts index 972f9ff79e72..d7c35d2c07f6 100644 --- a/Build/Sources/TypeScript/workspaces/backend.ts +++ b/Build/Sources/TypeScript/workspaces/backend.ts @@ -71,7 +71,7 @@ class Backend extends Workspaces { language: 'all', limit: 30, query: '', - sort: 'label_Live', + sort: 'label_Workspace', start: 0, filterTxt: '', }; @@ -569,7 +569,7 @@ class Backend extends Workspaces { Modal.advanced({ type: Modal.types.default, - title: TYPO3.lang['window.recordInformation'].replace('{0}', (tableRow.querySelector('.t3js-title-live') as HTMLElement).innerText.trim()), + title: TYPO3.lang['window.recordInformation'].replace('{0}', (tableRow.querySelector('.t3js-title-workspace') as HTMLElement).innerText.trim()), content: content, severity: SeverityEnum.info, buttons: modalButtons, diff --git a/Build/Sources/TypeScript/workspaces/renderable/record-table.ts b/Build/Sources/TypeScript/workspaces/renderable/record-table.ts index e1b828b857de..c0ef023b000d 100644 --- a/Build/Sources/TypeScript/workspaces/renderable/record-table.ts +++ b/Build/Sources/TypeScript/workspaces/renderable/record-table.ts @@ -30,8 +30,6 @@ export type RecordData = { Workspaces_CollectionChildren: number, label_Workspace: string, label_Workspace_crop: string, - label_Live: string, - label_Live_crop: string, label_Stage: string, label_nextStage: string, value_nextStage: number, @@ -47,13 +45,13 @@ export type RecordData = { t3ver_oid: number, livepid: number, stage: number, - icon_Live: string, - icon_Live_Overlay: string, icon_Workspace: string, icon_Workspace_Overlay: string, languageValue: number, language: { - icon: string + icon: string, + title: string, + title_crop: string }, allowedAction_nextStage: boolean, allowedAction_prevStage: boolean, @@ -134,13 +132,15 @@ export class RecordTableElement extends LitElement { </ul> </div> </th> - <th>${TYPO3.lang['column.wsTitle']}</th> - <th>${TYPO3.lang['column.liveTitle']}</th> + <th class="col-min">${TYPO3.lang['column.wsTitle']}</th> + <th class="col-language">${TYPO3.lang['labels._LOCALIZATION_']}</th> + <th class="col-datetime">${TYPO3.lang['column.lastChangeOn']}</th> + <th class="col-state">${TYPO3.lang['column.wsStateAction']}</th> + <th class="col-state">${TYPO3.lang['column.integrity']}</th> <th>${TYPO3.lang['column.stage']}</th> - <th>${TYPO3.lang['column.lastChangeOn']}</th> - <th>${TYPO3.lang['column.integrity']}</th> - <th><typo3-backend-icon identifier="flags-multiple" size="small"></typo3-backend-icon></th> - <th></th> + <th class="col-control nowrap"> + <span class="visually-hidden">${TYPO3.lang['labels._CONTROL_']}</span> + </th> </tr> </thead> <tbody data-multi-record-selection-row-selection="true"> @@ -166,6 +166,36 @@ export class RecordTableElement extends LitElement { }); } + const wsState = data.state_Workspace; + let wsStateActionClass: string; + let wsStateActionLabel: string; + + switch (wsState) { + case 'deleted': + wsStateActionClass = 'danger'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.deleted']; + break; + case 'hidden': + wsStateActionClass = 'secondary'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.hidden']; + break; + case 'modified': + wsStateActionClass = 'warning'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.modified']; + break; + case 'moved': + wsStateActionClass = 'primary'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.moved']; + break; + case 'new': + wsStateActionClass = 'success'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.new']; + break; + default: + wsStateActionClass = 'secondary'; + wsStateActionLabel = TYPO3.lang['column.wsStateAction.unchanged']; + } + return html` ${latestPathChanged ? html` <tr> @@ -196,38 +226,70 @@ export class RecordTableElement extends LitElement { <input type="checkbox" class="form-check-input t3js-multi-record-selection-check"/> </span> </td> - <td class="t3js-title-workspace"> + <td class="col-min t3js-title-workspace"> <span class="icon icon-size-small"> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.icon_Workspace)} overlay=${IconHelper.getIconIdentifier(data.icon_Workspace_Overlay)} size="small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.icon_Workspace)} overlay=${IconHelper.getIconIdentifier(data.icon_Workspace_Overlay)} size="small"></typo3-backend-icon> </span> <a href="#" data-action="changes"> - <span class="workspace-state-${data.state_Workspace}" title=${data.label_Workspace}> + <span title=${data.label_Workspace}> ${data.label_Workspace_crop} </span> </a> </td> - <td class="t3js-title-live"> - <span class="icon icon-size-small"> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.icon_Live)} overlay=${IconHelper.getIconIdentifier(data.icon_Live_Overlay)} size="small"> - </span> - <span class="workspace-live-title" title=${data.label_Live}> - ${data.label_Live_crop} + <td class="col-language"> + <span title="${data.language.title}" class="icon icon-size-small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.language.icon)} size="small"></typo3-backend-icon> </span> + ${data.language.title_crop} </td> - <td>${data.label_Stage}</td> - <td>${data.lastChangedFormatted}</td> - <td>${ data.integrity.messages !== '' ? html` - <span> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.integrity.status)} size="small"> + <td class="col-datetime">${data.lastChangedFormatted}</td> + <td class="col-state"> + <span class="badge badge-${wsStateActionClass}">${wsStateActionLabel}</span> + </td> + <td class="col-state">${ data.integrity.messages !== '' ? html` + <span title="${data.integrity.messages}" class="icon icon-size-small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.integrity.status)} size="small"></typo3-backend-icon> </span> ` : nothing}</td> - <td><typo3-backend-icon identifier=${IconHelper.getIconIdentifier(data.language.icon)} size="small"></td> - <td class="text-end nowrap">${this.renderActions(data)}</td> + <td>${data.label_Stage}</td> + <td class="col-control nowrap"> + <div class="btn-group">${this.renderElementActions(data)}</div> + <div class="btn-group">${this.renderVersioningActions(data)}</div> + </td> </tr> `; } - private renderActions(data: RecordData): TemplateResult[] { + private renderElementActions(data: RecordData): TemplateResult[] { + return [ + this.getAction( + data.allowedAction_view, + 'preview', + 'actions-version-workspace-preview', + { + 'title': TYPO3.lang['tooltip.viewElementAction'] + } + ), + this.getAction( + data.allowedAction_edit, + 'open', + 'actions-open', + { + 'title': TYPO3.lang['tooltip.editElementAction'] + } + ), + this.getAction( + data.allowedAction_versionPageOpen, + 'version', + 'actions-version-page-open', + { + 'title': TYPO3.lang['tooltip.openPage'] + } + ) + ]; + } + + private renderVersioningActions(data: RecordData): TemplateResult[] { const hasSubitems = data.Workspaces_CollectionChildren > 0 && data.Workspaces_CollectionCurrent !== ''; return [ @@ -258,34 +320,10 @@ export class RecordTableElement extends LitElement { 'title': TYPO3.lang['tooltip.publish'] } ), - this.getAction( - data.allowedAction_view, - 'preview', - 'actions-version-workspace-preview', - { - 'title': TYPO3.lang['tooltip.viewElementAction'] - } - ), - this.getAction( - data.allowedAction_edit, - 'open', - 'actions-open', - { - 'title': TYPO3.lang['tooltip.editElementAction'] - } - ), - this.getAction( - data.allowedAction_versionPageOpen, - 'version', - 'actions-version-page-open', - { - 'title': TYPO3.lang['tooltip.openPage'] - } - ), this.getAction( data.allowedAction_delete, 'remove', - 'actions-version-document-remove', + 'actions-delete', { 'title': TYPO3.lang['tooltip.discardVersion'] } @@ -312,7 +350,7 @@ export class RecordTableElement extends LitElement { data-bs-target=${ifDefined(additionalAttributes['data-bs-target'])} data-bs-toggle=${ifDefined(additionalAttributes['data-bs-toggle'])} aria-expanded=${ifDefined(additionalAttributes['aria-expanded'])}> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(iconIdentifier)} size="small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(iconIdentifier)} size="small"></typo3-backend-icon> </button> `; } @@ -322,7 +360,7 @@ export class RecordTableElement extends LitElement { data-bs-target=${ifDefined(additionalAttributes['data-bs-target'])} data-bs-toggle=${ifDefined(additionalAttributes['data-bs-toggle'])} aria-expanded=${ifDefined(additionalAttributes['aria-expanded'])}> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier('empty-empty')} size="small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier('empty-empty')} size="small"></typo3-backend-icon> </span>`; } } diff --git a/typo3/sysext/backend/Resources/Public/Css/backend.css b/typo3/sysext/backend/Resources/Public/Css/backend.css index 1557de04691f..dd5913ce20b8 100644 --- a/typo3/sysext/backend/Resources/Public/Css/backend.css +++ b/typo3/sysext/backend/Resources/Public/Css/backend.css @@ -3473,8 +3473,9 @@ typo3-backend-form-selecttree-toolbar{display:block;border-bottom:1px solid rgba @media (min-width:768px){ .table .col-fieldname{width:250px} } +.table .col-language{width:200px} .table .col-recordtitle{width:250px} -.table .col-action,.table .col-recordtitle,.table .col-state{min-width:120px} +.table .col-action,.table .col-language,.table .col-recordtitle,.table .col-state{min-width:120px} .table .col-differences,.table .col-task{min-width:400px} .table .col-clipboard,.table .col-control,.table .col-nowrap{white-space:nowrap!important} .table .col-clipboard,.table .col-control{text-align:end} @@ -4472,13 +4473,4 @@ html{scroll-behavior:smooth} .workspace-panel tr.collapsing{transition:none} .workspace-panel tr.collapse{display:none} .workspace-panel tr.collapse.show{display:table-row} -.workspace-panel .page-link{height:100%} -.workspace-state-unchanged{color:#000} -.workspace-state-modified{color:#ff8700} -.workspace-state-moved{color:#457fb8} -.workspace-state-new{color:#3c9934} -.workspace-state-hidden{color:#abaaaa} -.workspace-state-deleted{color:#000;text-decoration:line-through} -.workspace-legend{margin:5px;height:18px;color:#888} -.workspace-legend dd,.workspace-legend dt{display:inline;overflow:hidden} -.workspace-legend dd span{display:inline-block;padding:4px} \ No newline at end of file +.workspace-panel .page-link{height:100%} \ No newline at end of file diff --git a/typo3/sysext/workspaces/Classes/Controller/Remote/RemoteServer.php b/typo3/sysext/workspaces/Classes/Controller/Remote/RemoteServer.php index 8757bade02b3..03fc22bcc2fe 100644 --- a/typo3/sysext/workspaces/Classes/Controller/Remote/RemoteServer.php +++ b/typo3/sysext/workspaces/Classes/Controller/Remote/RemoteServer.php @@ -273,8 +273,6 @@ class RemoteServer [ // these parts contain HTML (don't escape) 'diff' => $versionDifferencesEvent->getVersionDifferences(), - 'icon_Live' => $iconLive->getIdentifier(), - 'icon_Live_Overlay' => $iconLive->getOverlayIcon()?->getIdentifier() ?? '', 'icon_Workspace' => $iconWorkspace->getIdentifier(), 'icon_Workspace_Overlay' => $iconWorkspace->getOverlayIcon()?->getIdentifier() ?? '', // this part is already escaped in getCommentsForRecord() diff --git a/typo3/sysext/workspaces/Classes/Controller/ReviewController.php b/typo3/sysext/workspaces/Classes/Controller/ReviewController.php index 89be7f8e4059..e0afaedd486e 100644 --- a/typo3/sysext/workspaces/Classes/Controller/ReviewController.php +++ b/typo3/sysext/workspaces/Classes/Controller/ReviewController.php @@ -115,7 +115,6 @@ class ReviewController 'isAdmin' => $backendUser->isAdmin(), 'customWorkspaceExists' => $customWorkspaceExists, 'showGrid' => $workspaceIsAccessible, - 'showLegend' => $workspaceIsAccessible, 'pageUid' => $pageUid, 'pageTitle' => $pageTitle, 'activeWorkspaceUid' => $activeWorkspace, diff --git a/typo3/sysext/workspaces/Classes/Service/GridDataService.php b/typo3/sysext/workspaces/Classes/Service/GridDataService.php index 92e0341c241b..3684c27fc0c5 100644 --- a/typo3/sysext/workspaces/Classes/Service/GridDataService.php +++ b/typo3/sysext/workspaces/Classes/Service/GridDataService.php @@ -181,8 +181,6 @@ class GridDataService implements LoggerAwareInterface $versionArray = array_merge($versionArray, $defaultGridColumns); $versionArray['label_Workspace'] = htmlspecialchars($workspaceRecordLabel); $versionArray['label_Workspace_crop'] = htmlspecialchars(GeneralUtility::fixed_lgd_cs($workspaceRecordLabel, (int)$backendUser->uc['titleLen'])); - $versionArray['label_Live'] = htmlspecialchars($liveRecordLabel); - $versionArray['label_Live_crop'] = htmlspecialchars(GeneralUtility::fixed_lgd_cs($liveRecordLabel, (int)$backendUser->uc['titleLen'])); $versionArray['label_Stage'] = htmlspecialchars($stagesObj->getStageTitle((int)$versionRecord['t3ver_stage'])); $tempStage = $stagesObj->getNextStage($versionRecord['t3ver_stage']); $versionArray['label_nextStage'] = htmlspecialchars($stagesObj->getStageTitle((int)$tempStage['uid'])); @@ -205,14 +203,14 @@ class GridDataService implements LoggerAwareInterface $versionArray['t3ver_oid'] = $calculatedT3verOid; $versionArray['livepid'] = $record['livepid']; $versionArray['stage'] = $versionRecord['t3ver_stage']; - $versionArray['icon_Live'] = $iconLive->getIdentifier(); - $versionArray['icon_Live_Overlay'] = $iconLive->getOverlayIcon()?->getIdentifier() ?? ''; $versionArray['icon_Workspace'] = $iconWorkspace->getIdentifier(); $versionArray['icon_Workspace_Overlay'] = $iconWorkspace->getOverlayIcon()?->getIdentifier() ?? ''; $languageValue = $this->getLanguageValue($table, $versionRecord); $versionArray['languageValue'] = $languageValue; $versionArray['language'] = [ 'icon' => $iconFactory->getIcon($this->getSystemLanguageValue($languageValue, $pageId, 'flagIcon'), IconSize::SMALL)->getIdentifier(), + 'title' => $this->getSystemLanguageValue($languageValue, $pageId, 'title'), + 'title_crop' => htmlspecialchars(GeneralUtility::fixed_lgd_cs($this->getSystemLanguageValue($languageValue, $pageId, 'title'), (int)$backendUser->uc['titleLen'])), ]; $versionArray['allowedAction_nextStage'] = $isRecordTypeAllowedToModify && $stagesObj->isNextStageAllowedForUser($versionRecord['t3ver_stage']); $versionArray['allowedAction_prevStage'] = $isRecordTypeAllowedToModify && $stagesObj->isPrevStageAllowedForUser($versionRecord['t3ver_stage']); @@ -401,7 +399,6 @@ class GridDataService implements LoggerAwareInterface uasort($this->dataArray, [$this, 'intSort']); break; case 'label_Workspace': - case 'label_Live': case 'label_Stage': case 'workspace_Title': case 'path_Live': @@ -513,7 +510,6 @@ class GridDataService implements LoggerAwareInterface 'change' => ['hidden' => 0], 'path_Workspace' => ['hidden' => 0], 'path_Live' => ['hidden' => 0], - 'label_Live' => ['hidden' => 0], 'label_Stage' => ['hidden' => 0], 'label_Workspace' => ['hidden' => 0], ]; diff --git a/typo3/sysext/workspaces/Resources/Private/Language/locallang.xlf b/typo3/sysext/workspaces/Resources/Private/Language/locallang.xlf index ee336ca5ac1a..fd4763246efe 100644 --- a/typo3/sysext/workspaces/Resources/Private/Language/locallang.xlf +++ b/typo3/sysext/workspaces/Resources/Private/Language/locallang.xlf @@ -3,27 +3,6 @@ <file source-language="en" datatype="plaintext" original="EXT:workspaces/Resources/Private/Language/locallang.xlf" date="2011-10-17T20:22:37Z" product-name="workspaces"> <header/> <body> - <trans-unit id="legend.label" resname="legend.label"> - <source>Legend</source> - </trans-unit> - <trans-unit id="legend.edited" resname="legend.edited"> - <source>edited</source> - </trans-unit> - <trans-unit id="legend.unchanged" resname="legend.unchanged"> - <source>unchanged</source> - </trans-unit> - <trans-unit id="legend.moved" resname="legend.moved"> - <source>moved</source> - </trans-unit> - <trans-unit id="legend.deleted" resname="legend.deleted"> - <source>deleted</source> - </trans-unit> - <trans-unit id="legend.new" resname="legend.new"> - <source>created</source> - </trans-unit> - <trans-unit id="legend.hidden" resname="legend.hidden"> - <source>hidden</source> - </trans-unit> <trans-unit id="title" resname="title"> <source>Workspaces</source> </trans-unit> @@ -158,7 +137,28 @@ <source>Path</source> </trans-unit> <trans-unit id="column.wsTitle" resname="column.wsTitle"> - <source>Changed</source> + <source>Title</source> + </trans-unit> + <trans-unit id="column.wsStateAction" resname="column.wsStateAction"> + <source>Action</source> + </trans-unit> + <trans-unit id="column.wsStateAction.deleted" resname="column.wsStateAction.deleted"> + <source>deleted</source> + </trans-unit> + <trans-unit id="column.wsStateAction.hidden" resname="column.wsStateAction.hidden"> + <source>hidden</source> + </trans-unit> + <trans-unit id="column.wsStateAction.modified" resname="column.wsStateAction.modified"> + <source>modified</source> + </trans-unit> + <trans-unit id="column.wsStateAction.moved" resname="column.wsStateAction.moved"> + <source>moved</source> + </trans-unit> + <trans-unit id="column.wsStateAction.new" resname="column.wsStateAction.new"> + <source>created</source> + </trans-unit> + <trans-unit id="column.wsStateAction.unchanged" resname="column.wsStateAction.unchanged"> + <source>unchanged</source> </trans-unit> <trans-unit id="column.uid" resname="column.uid"> <source>WS ID</source> @@ -172,9 +172,6 @@ <trans-unit id="column.livePath" resname="column.livePath"> <source>Live path</source> </trans-unit> - <trans-unit id="column.liveTitle" resname="column.liveTitle"> - <source>Live title</source> - </trans-unit> <trans-unit id="column.integrity" resname="column.integrity"> <source>Integrity</source> </trans-unit> @@ -194,7 +191,7 @@ <source>Send record to next Stage</source> </trans-unit> <trans-unit id="tooltip.discardVersion" resname="tooltip.discardVersion"> - <source>Discard workspace version of record.</source> + <source>Discard version of record</source> </trans-unit> <trans-unit id="tooltip.expand" resname="tooltip.expand"> <source>Expand element and show relations</source> @@ -203,7 +200,7 @@ <source>Show history of workspace version</source> </trans-unit> <trans-unit id="window.discard.title" resname="window.discard.title"> - <source>Discard workspace version of record.</source> + <source>Discard version of record</source> </trans-unit> <trans-unit id="window.discardAll.title" resname="window.discardAll.title"> <source>Discard all workspace version of current page.</source> diff --git a/typo3/sysext/workspaces/Resources/Private/Partials/Legend.html b/typo3/sysext/workspaces/Resources/Private/Partials/Legend.html deleted file mode 100644 index c48b09dd7d28..000000000000 --- a/typo3/sysext/workspaces/Resources/Private/Partials/Legend.html +++ /dev/null @@ -1,14 +0,0 @@ -<html - xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" - data-namespace-typo3-fluid="true" -> -<h3><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.label" /></h3> -<ul class="workspace-legend"> - <li><span class="workspace-state-unchanged"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.unchanged" /></span></li> - <li><span class="workspace-state-modified"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.edited" /></span></li> - <li><span class="workspace-state-moved"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.moved" /></span></li> - <li><span class="workspace-state-new"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.new" /></span></li> - <li><span class="workspace-state-hidden"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.hidden" /></span></li> - <li><span class="workspace-state-deleted"><f:translate key="LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:legend.deleted" /></span></li> -</ul> -</html> diff --git a/typo3/sysext/workspaces/Resources/Private/Templates/Review/Index.html b/typo3/sysext/workspaces/Resources/Private/Templates/Review/Index.html index d8f65421419d..ef967df4af70 100644 --- a/typo3/sysext/workspaces/Resources/Private/Templates/Review/Index.html +++ b/typo3/sysext/workspaces/Resources/Private/Templates/Review/Index.html @@ -31,8 +31,6 @@ </f:if> </main> - <f:if condition="{showLegend}"><f:render partial="legend" /></f:if> - </f:section> </html> diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js index 76a409769286..9631a473c859 100644 --- a/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js +++ b/typo3/sysext/workspaces/Resources/Public/JavaScript/backend.js @@ -10,7 +10,7 @@ * * The TYPO3 project - inspiring people to share! */ -import DocumentService from"@typo3/core/document-service.js";import{html}from"lit";import"@typo3/backend/element/icon-element.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import"@typo3/backend/input/clearable.js";import"@typo3/workspaces/renderable/record-table.js";import"@typo3/backend/element/pagination.js";import Workspaces from"@typo3/workspaces/workspaces.js";import{default as Modal}from"@typo3/backend/modal.js";import Persistent from"@typo3/backend/storage/persistent.js";import Utility from"@typo3/backend/utility.js";import windowManager from"@typo3/backend/window-manager.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{topLevelModuleImport}from"@typo3/backend/utility/top-level-module-import.js";import{selector}from"@typo3/core/literals.js";import IconHelper from"@typo3/workspaces/utility/icon-helper.js";import DeferredAction from"@typo3/backend/action-button/deferred-action.js";var Identifiers;!function(e){e.searchForm="#workspace-settings-form",e.searchTextField='#workspace-settings-form input[name="search-text"]',e.searchSubmitBtn='#workspace-settings-form button[type="submit"]',e.depthSelector='#workspace-settings-form [name="depth"]',e.languageSelector='#workspace-settings-form select[name="languages"]',e.stagesSelector='#workspace-settings-form select[name="stages"]',e.workspaceActions=".workspace-actions",e.chooseStageAction='.workspace-actions [name="stage-action"]',e.chooseSelectionAction='.workspace-actions [name="selection-action"]',e.chooseMassAction='.workspace-actions [name="mass-action"]',e.publishAction='[data-action="publish"]',e.prevStageAction='[data-action="prevstage"]',e.nextStageAction='[data-action="nextstage"]',e.changesAction='[data-action="changes"]',e.previewAction='[data-action="preview"]',e.openAction='[data-action="open"]',e.versionAction='[data-action="version"]',e.removeAction='[data-action="remove"]',e.expandAction='[data-action="expand"]',e.workspaceRecipientsSelectAll=".t3js-workspace-recipients-selectall",e.workspaceRecipientsDeselectAll=".t3js-workspace-recipients-deselectall",e.container="#workspace-panel",e.contentsContainer="#workspace-contents",e.noContentsContainer="#workspace-contents-empty",e.previewLinksButton=".t3js-preview-link",e.pagination="#workspace-pagination"}(Identifiers||(Identifiers={}));class Backend extends Workspaces{constructor(){super(),this.settings={dir:"ASC",id:TYPO3.settings.Workspaces.id,depth:1,language:"all",limit:30,query:"",sort:"label_Live",start:0,filterTxt:""},this.paging={currentPage:1,totalPages:1,totalItems:0},this.markedRecordsForMassAction=[],this.handleCheckboxStateChanged=e=>{const t=e.target,n=t.closest("tr"),a=t.checked,s=n.dataset.table+":"+n.dataset.uid+":"+n.dataset.t3ver_oid;if(a)this.markedRecordsForMassAction.push(s);else{const e=this.markedRecordsForMassAction.indexOf(s);e>-1&&this.markedRecordsForMassAction.splice(e,1)}n.dataset.collectionCurrent?Backend.changeCollectionChildrenState(n.dataset.collectionCurrent,a):n.dataset.collection&&(Backend.changeCollectionChildrenState(n.dataset.collection,a),Backend.changeCollectionParentState(n.dataset.collection,a));document.querySelector(Identifiers.chooseMassAction).disabled=this.markedRecordsForMassAction.length>0},this.openIntegrityWarningModal=()=>{const e=Modal.confirm(TYPO3.lang["window.integrity_warning.title"],html`<p>${TYPO3.lang["integrity.hasIssuesDescription"]}<br>${TYPO3.lang["integrity.hasIssuesQuestion"]}</p>`,SeverityEnum.warning);return e.addEventListener("button.clicked",(()=>e.hideModal())),e},topLevelModuleImport("@typo3/workspaces/renderable/send-to-stage-form.js"),topLevelModuleImport("@typo3/workspaces/renderable/record-information.js"),DocumentService.ready().then((()=>{this.registerEvents(),this.notifyWorkspaceSwitchAction(),this.settings.depth=document.querySelector(Identifiers.depthSelector)?.value,this.settings.language=document.querySelector(Identifiers.languageSelector)?.value,this.settings.stage=document.querySelector(Identifiers.stagesSelector)?.value,null!==document.querySelector(Identifiers.container)&&this.getWorkspaceInfos()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static changeCollectionParentState(e,t){const n=document.querySelector('tr[data-collection-current="'+e+'"] input[type=checkbox]');null!==n&&n.checked!==t&&(n.checked=t,n.dataset.manuallyChanged="true",n.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}static changeCollectionChildrenState(e,t){const n=document.querySelectorAll(selector`tr[data-collection="${e}"] input[type=checkbox]`);n.length&&n.forEach((e=>{e.checked!==t&&(e.checked=t,e.dataset.manuallyChanged="true",e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}))}notifyWorkspaceSwitchAction(){const e=document.querySelector("main[data-workspace-switch-action]");if(e.dataset.workspaceSwitchAction){const t=JSON.parse(e.dataset.workspaceSwitchAction);top.TYPO3.WorkspacesMenu.performWorkspaceSwitch(t.id,t.title),top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh")),top.TYPO3.ModuleMenu.App.refreshMenu()}}checkIntegrity(e){return this.sendRemoteRequest(this.generateRemotePayload("checkIntegrity",e))}registerEvents(){new RegularEvent("click",((e,t)=>{const n=t.closest("tr");this.checkIntegrity({selection:[{liveId:n.dataset.uid,versionId:n.dataset.t3ver_oid,table:n.dataset.table}],type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderPublishModal(n)})):this.renderPublishModal(n)}))})).delegateTo(document,Identifiers.publishAction),new RegularEvent("click",((e,t)=>{this.sendToStage(t.closest("tr"),"prev")})).delegateTo(document,Identifiers.prevStageAction),new RegularEvent("click",((e,t)=>{this.sendToStage(t.closest("tr"),"next")})).delegateTo(document,Identifiers.nextStageAction),new RegularEvent("click",this.viewChanges.bind(this)).delegateTo(document,Identifiers.changesAction),new RegularEvent("click",this.openPreview.bind(this)).delegateTo(document,Identifiers.previewAction),new RegularEvent("click",((e,t)=>{const n=t.closest("tr"),a=TYPO3.settings.FormEngine.moduleUrl+"&returnUrl="+encodeURIComponent(document.location.href)+"&id="+TYPO3.settings.Workspaces.id+"&edit["+n.dataset.table+"]["+n.dataset.uid+"]=edit";window.location.href=a})).delegateTo(document,Identifiers.openAction),new RegularEvent("click",((e,t)=>{const n=t.closest("tr"),a="pages"===n.dataset.table?n.dataset.t3ver_oid:n.dataset.pid;window.location.href=TYPO3.settings.WebLayout.moduleUrl+"&id="+a})).delegateTo(document,Identifiers.versionAction),new RegularEvent("click",this.confirmDeleteRecordFromWorkspace.bind(this)).delegateTo(document,Identifiers.removeAction),new RegularEvent("click",((e,t)=>{let n;n="true"===t.ariaExpanded?"actions-caret-down":"actions-caret-right",t.replaceChildren(document.createRange().createContextualFragment(IconHelper.getIcon(n)))})).delegateTo(document,Identifiers.expandAction),new RegularEvent("click",(()=>{window.top.document.querySelectorAll(".t3js-workspace-recipient").forEach((e=>{e.disabled||(e.checked=!0)}))})).delegateTo(window.top.document,Identifiers.workspaceRecipientsSelectAll),new RegularEvent("click",(()=>{window.top.document.querySelectorAll(".t3js-workspace-recipient").forEach((e=>{e.disabled||(e.checked=!1)}))})).delegateTo(window.top.document,Identifiers.workspaceRecipientsDeselectAll),new RegularEvent("submit",(e=>{e.preventDefault();const t=document.querySelector(Identifiers.searchTextField);this.settings.filterTxt=t.value,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.searchForm),new RegularEvent("keyup",(e=>{const t=e.target,n=document.querySelector(Identifiers.searchSubmitBtn);""!==t.value?n.classList.remove("disabled"):(n.classList.add("disabled"),this.getWorkspaceInfos())})).delegateTo(document,Identifiers.searchTextField);const e=document.querySelector(Identifiers.searchTextField);null!==e&&e.clearable({onClear:()=>{document.querySelector(Identifiers.searchSubmitBtn).classList.add("disabled"),this.settings.filterTxt="",this.getWorkspaceInfos()}}),new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),new RegularEvent("change",((e,t)=>{const n=t.value;Persistent.set("moduleData.workspaces_admin.depth",n),this.settings.depth=n,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.depthSelector),new RegularEvent("click",this.generatePreviewLinks.bind(this)).delegateTo(document,Identifiers.previewLinksButton),new RegularEvent("change",((e,t)=>{Persistent.set("moduleData.workspaces_admin.language",t.value),this.settings.language=t.value,this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{const n=await e.resolve();t.previousElementSibling.innerHTML=t.querySelector("option:checked").dataset.icon,this.renderWorkspaceInfos(n[0].result)}))})).delegateTo(document,Identifiers.languageSelector),new RegularEvent("change",((e,t)=>{const n=t.value;Persistent.set("moduleData.workspaces_admin.stage",n),this.settings.stage=n,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.stagesSelector),new RegularEvent("change",this.sendToSpecificStageAction.bind(this)).delegateTo(document,Identifiers.chooseStageAction),new RegularEvent("change",this.runSelectionAction.bind(this)).delegateTo(document,Identifiers.chooseSelectionAction),new RegularEvent("change",this.runMassAction.bind(this)).delegateTo(document,Identifiers.chooseMassAction),new RegularEvent("click",(e=>{e.preventDefault();const t=e.target.closest("button");let n=!1;switch(t.dataset.action){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,n=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,n=!0);break;case"page":this.paging.currentPage=parseInt(t.dataset.page,10),n=!0;break;default:throw'Unknown action "'+t.dataset.action+'"'}n&&(this.settings.start=parseInt(this.settings.limit.toString(),10)*(this.paging.currentPage-1),this.getWorkspaceInfos())})).delegateTo(document,Identifiers.pagination)}sendToStage(e,t){let n,a,s;if("next"===t)n=e.dataset.nextStage,a="sendToNextStageWindow",s="sendToNextStageExecute";else{if("prev"!==t)throw"Invalid direction given.";n=e.dataset.prevStage,a="sendToPrevStageWindow",s="sendToPrevStageExecute"}this.sendRemoteRequest(this.generateRemoteActionsPayload(a,[e.dataset.uid,e.dataset.table,e.dataset.t3ver_oid])).then((async t=>{const a=this.renderSendToStageWindow(await t.resolve());a.addEventListener("button.clicked",(t=>{if("ok"===t.target.name){const t=Utility.convertFormToObject(a.querySelector("form"));t.affects={table:e.dataset.table,nextStage:n,t3ver_oid:e.dataset.t3ver_oid,uid:e.dataset.uid,elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(s,[t]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();a.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}}))}))}getWorkspaceInfos(){this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{this.renderWorkspaceInfos((await e.resolve())[0].result)}))}renderWorkspaceInfos(e){const t=document.querySelector(Identifiers.contentsContainer),n=document.querySelector(Identifiers.noContentsContainer);this.resetMassActionState(e.data.length),this.buildPagination(e.total),0===e.total?(t.style.display="none",n.style.display="block"):(t.style.display="block",n.style.display="none");document.querySelector("typo3-workspaces-record-table").results=e.data}buildPagination(e){const t=document.querySelector(Identifiers.pagination);if(0===e)return void t.replaceChildren();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/parseInt(this.settings.limit.toString(),10)),1===this.paging.totalPages)return void t.replaceChildren();const n=document.createElement("typo3-backend-pagination");n.paging=this.paging,t.append(n)}viewChanges(e,t){e.preventDefault();const n=t.closest("tr");this.sendRemoteRequest(this.generateRemotePayload("getRowDetails",{stage:parseInt(n.dataset.stage,10),t3ver_oid:parseInt(n.dataset.t3ver_oid,10),table:n.dataset.table,uid:parseInt(n.dataset.uid,10),filterFields:!0})).then((async e=>{const t=(await e.resolve())[0].result.data[0],a=[],s=document.createElement("typo3-workspaces-record-information");s.record=t,s.TYPO3lang=TYPO3.lang,!1!==t.label_PrevStage&&n.dataset.stage!==n.dataset.prevStage&&a.push({text:t.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:(e,t)=>{t.hideModal(),this.sendToStage(n,"prev")}}),!1!==t.label_NextStage&&a.push({text:t.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:(e,t)=>{t.hideModal(),this.sendToStage(n,"next")}}),a.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:(e,t)=>t.hideModal()}),Modal.advanced({type:Modal.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",n.querySelector(".t3js-title-live").innerText.trim()),content:s,severity:SeverityEnum.info,buttons:a,size:Modal.sizes.medium})}))}openPreview(e,t){const n=t.closest("tr");this.sendRemoteRequest(this.generateRemoteActionsPayload("viewSingleRecord",[n.dataset.table,n.dataset.uid])).then((async e=>{const t=(await e.resolve())[0].result;windowManager.localOpen(t)}))}confirmDeleteRecordFromWorkspace(e,t){const n=t.closest("tr"),a=Modal.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{a.hideModal()}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);a.addEventListener("button.clicked",(e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[n.dataset.table,n.dataset.uid])]).then((()=>{a.hideModal(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}))}runSelectionAction(e,t){const n=t.value,a="discard"!==n;if(0===n.length)return;const s=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");s.push({table:t[0],liveId:t[2],versionId:t[1]})}a?this.checkIntegrity({selection:s,type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderSelectionActionModal(n,s)})):this.renderSelectionActionModal(n,s)})):this.renderSelectionActionModal(n,s)}renderPublishModal(e){const t=Modal.advanced({title:TYPO3.lang["window.publish.title"],content:TYPO3.lang["window.publish.message"],severity:SeverityEnum.info,staticBackdrop:!0,buttons:[{text:TYPO3.lang.cancel,btnClass:"btn-default",trigger:function(){t.hideModal()}},{text:TYPO3.lang.label_doaction_publish,btnClass:"btn-info",action:new DeferredAction((async()=>{await this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[e.dataset.table,e.dataset.t3ver_oid,e.dataset.uid])),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}]})}renderSelectionActionModal(e,t){const n=Modal.advanced({title:TYPO3.lang["window.selectionAction.title"],content:html`<p>${TYPO3.lang["tooltip."+e+"Selected"]}</p>`,severity:SeverityEnum.warning,staticBackdrop:!0,buttons:[{text:TYPO3.lang.cancel,btnClass:"btn-default",trigger:function(){n.hideModal()}},{text:TYPO3.lang["label_doaction_"+e],btnClass:"btn-warning",action:new DeferredAction((async()=>{await this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})),this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),Backend.refreshPageTree()}))}]});n.addEventListener("typo3-modal-hidden",(()=>{document.querySelector(Identifiers.chooseSelectionAction).value=""}))}runMassAction(e,t){const n=t.value,a="discard"!==n;0!==n.length&&(a?this.checkIntegrity({language:this.settings.language,type:n}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderMassActionModal(n)})):this.renderMassActionModal(n)})):this.renderMassActionModal(n))}renderMassActionModal(e){let t,n;switch(e){case"publish":t="publishWorkspace",n=TYPO3.lang.label_doaction_publish;break;case"discard":t="flushWorkspace",n=TYPO3.lang.label_doaction_discard;break;default:throw"Invalid mass action "+e+" called."}const a=async e=>{const n=(await e.resolve())[0].result;n.processed<n.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,n)).then(a):(this.getWorkspaceInfos(),Modal.dismiss())},s=Modal.advanced({title:TYPO3.lang["window.massAction.title"],content:html` +import DocumentService from"@typo3/core/document-service.js";import{html}from"lit";import"@typo3/backend/element/icon-element.js";import{SeverityEnum}from"@typo3/backend/enum/severity.js";import"@typo3/backend/input/clearable.js";import"@typo3/workspaces/renderable/record-table.js";import"@typo3/backend/element/pagination.js";import Workspaces from"@typo3/workspaces/workspaces.js";import{default as Modal}from"@typo3/backend/modal.js";import Persistent from"@typo3/backend/storage/persistent.js";import Utility from"@typo3/backend/utility.js";import windowManager from"@typo3/backend/window-manager.js";import RegularEvent from"@typo3/core/event/regular-event.js";import{topLevelModuleImport}from"@typo3/backend/utility/top-level-module-import.js";import{selector}from"@typo3/core/literals.js";import IconHelper from"@typo3/workspaces/utility/icon-helper.js";import DeferredAction from"@typo3/backend/action-button/deferred-action.js";var Identifiers;!function(e){e.searchForm="#workspace-settings-form",e.searchTextField='#workspace-settings-form input[name="search-text"]',e.searchSubmitBtn='#workspace-settings-form button[type="submit"]',e.depthSelector='#workspace-settings-form [name="depth"]',e.languageSelector='#workspace-settings-form select[name="languages"]',e.stagesSelector='#workspace-settings-form select[name="stages"]',e.workspaceActions=".workspace-actions",e.chooseStageAction='.workspace-actions [name="stage-action"]',e.chooseSelectionAction='.workspace-actions [name="selection-action"]',e.chooseMassAction='.workspace-actions [name="mass-action"]',e.publishAction='[data-action="publish"]',e.prevStageAction='[data-action="prevstage"]',e.nextStageAction='[data-action="nextstage"]',e.changesAction='[data-action="changes"]',e.previewAction='[data-action="preview"]',e.openAction='[data-action="open"]',e.versionAction='[data-action="version"]',e.removeAction='[data-action="remove"]',e.expandAction='[data-action="expand"]',e.workspaceRecipientsSelectAll=".t3js-workspace-recipients-selectall",e.workspaceRecipientsDeselectAll=".t3js-workspace-recipients-deselectall",e.container="#workspace-panel",e.contentsContainer="#workspace-contents",e.noContentsContainer="#workspace-contents-empty",e.previewLinksButton=".t3js-preview-link",e.pagination="#workspace-pagination"}(Identifiers||(Identifiers={}));class Backend extends Workspaces{constructor(){super(),this.settings={dir:"ASC",id:TYPO3.settings.Workspaces.id,depth:1,language:"all",limit:30,query:"",sort:"label_Workspace",start:0,filterTxt:""},this.paging={currentPage:1,totalPages:1,totalItems:0},this.markedRecordsForMassAction=[],this.handleCheckboxStateChanged=e=>{const t=e.target,n=t.closest("tr"),a=t.checked,s=n.dataset.table+":"+n.dataset.uid+":"+n.dataset.t3ver_oid;if(a)this.markedRecordsForMassAction.push(s);else{const e=this.markedRecordsForMassAction.indexOf(s);e>-1&&this.markedRecordsForMassAction.splice(e,1)}n.dataset.collectionCurrent?Backend.changeCollectionChildrenState(n.dataset.collectionCurrent,a):n.dataset.collection&&(Backend.changeCollectionChildrenState(n.dataset.collection,a),Backend.changeCollectionParentState(n.dataset.collection,a));document.querySelector(Identifiers.chooseMassAction).disabled=this.markedRecordsForMassAction.length>0},this.openIntegrityWarningModal=()=>{const e=Modal.confirm(TYPO3.lang["window.integrity_warning.title"],html`<p>${TYPO3.lang["integrity.hasIssuesDescription"]}<br>${TYPO3.lang["integrity.hasIssuesQuestion"]}</p>`,SeverityEnum.warning);return e.addEventListener("button.clicked",(()=>e.hideModal())),e},topLevelModuleImport("@typo3/workspaces/renderable/send-to-stage-form.js"),topLevelModuleImport("@typo3/workspaces/renderable/record-information.js"),DocumentService.ready().then((()=>{this.registerEvents(),this.notifyWorkspaceSwitchAction(),this.settings.depth=document.querySelector(Identifiers.depthSelector)?.value,this.settings.language=document.querySelector(Identifiers.languageSelector)?.value,this.settings.stage=document.querySelector(Identifiers.stagesSelector)?.value,null!==document.querySelector(Identifiers.container)&&this.getWorkspaceInfos()}))}static refreshPageTree(){top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh"))}static changeCollectionParentState(e,t){const n=document.querySelector('tr[data-collection-current="'+e+'"] input[type=checkbox]');null!==n&&n.checked!==t&&(n.checked=t,n.dataset.manuallyChanged="true",n.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}static changeCollectionChildrenState(e,t){const n=document.querySelectorAll(selector`tr[data-collection="${e}"] input[type=checkbox]`);n.length&&n.forEach((e=>{e.checked!==t&&(e.checked=t,e.dataset.manuallyChanged="true",e.dispatchEvent(new CustomEvent("multiRecordSelection:checkbox:state:changed",{bubbles:!0,cancelable:!1})))}))}notifyWorkspaceSwitchAction(){const e=document.querySelector("main[data-workspace-switch-action]");if(e.dataset.workspaceSwitchAction){const t=JSON.parse(e.dataset.workspaceSwitchAction);top.TYPO3.WorkspacesMenu.performWorkspaceSwitch(t.id,t.title),top.document.dispatchEvent(new CustomEvent("typo3:pagetree:refresh")),top.TYPO3.ModuleMenu.App.refreshMenu()}}checkIntegrity(e){return this.sendRemoteRequest(this.generateRemotePayload("checkIntegrity",e))}registerEvents(){new RegularEvent("click",((e,t)=>{const n=t.closest("tr");this.checkIntegrity({selection:[{liveId:n.dataset.uid,versionId:n.dataset.t3ver_oid,table:n.dataset.table}],type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderPublishModal(n)})):this.renderPublishModal(n)}))})).delegateTo(document,Identifiers.publishAction),new RegularEvent("click",((e,t)=>{this.sendToStage(t.closest("tr"),"prev")})).delegateTo(document,Identifiers.prevStageAction),new RegularEvent("click",((e,t)=>{this.sendToStage(t.closest("tr"),"next")})).delegateTo(document,Identifiers.nextStageAction),new RegularEvent("click",this.viewChanges.bind(this)).delegateTo(document,Identifiers.changesAction),new RegularEvent("click",this.openPreview.bind(this)).delegateTo(document,Identifiers.previewAction),new RegularEvent("click",((e,t)=>{const n=t.closest("tr"),a=TYPO3.settings.FormEngine.moduleUrl+"&returnUrl="+encodeURIComponent(document.location.href)+"&id="+TYPO3.settings.Workspaces.id+"&edit["+n.dataset.table+"]["+n.dataset.uid+"]=edit";window.location.href=a})).delegateTo(document,Identifiers.openAction),new RegularEvent("click",((e,t)=>{const n=t.closest("tr"),a="pages"===n.dataset.table?n.dataset.t3ver_oid:n.dataset.pid;window.location.href=TYPO3.settings.WebLayout.moduleUrl+"&id="+a})).delegateTo(document,Identifiers.versionAction),new RegularEvent("click",this.confirmDeleteRecordFromWorkspace.bind(this)).delegateTo(document,Identifiers.removeAction),new RegularEvent("click",((e,t)=>{let n;n="true"===t.ariaExpanded?"actions-caret-down":"actions-caret-right",t.replaceChildren(document.createRange().createContextualFragment(IconHelper.getIcon(n)))})).delegateTo(document,Identifiers.expandAction),new RegularEvent("click",(()=>{window.top.document.querySelectorAll(".t3js-workspace-recipient").forEach((e=>{e.disabled||(e.checked=!0)}))})).delegateTo(window.top.document,Identifiers.workspaceRecipientsSelectAll),new RegularEvent("click",(()=>{window.top.document.querySelectorAll(".t3js-workspace-recipient").forEach((e=>{e.disabled||(e.checked=!1)}))})).delegateTo(window.top.document,Identifiers.workspaceRecipientsDeselectAll),new RegularEvent("submit",(e=>{e.preventDefault();const t=document.querySelector(Identifiers.searchTextField);this.settings.filterTxt=t.value,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.searchForm),new RegularEvent("keyup",(e=>{const t=e.target,n=document.querySelector(Identifiers.searchSubmitBtn);""!==t.value?n.classList.remove("disabled"):(n.classList.add("disabled"),this.getWorkspaceInfos())})).delegateTo(document,Identifiers.searchTextField);const e=document.querySelector(Identifiers.searchTextField);null!==e&&e.clearable({onClear:()=>{document.querySelector(Identifiers.searchSubmitBtn).classList.add("disabled"),this.settings.filterTxt="",this.getWorkspaceInfos()}}),new RegularEvent("multiRecordSelection:checkbox:state:changed",this.handleCheckboxStateChanged).bindTo(document),new RegularEvent("change",((e,t)=>{const n=t.value;Persistent.set("moduleData.workspaces_admin.depth",n),this.settings.depth=n,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.depthSelector),new RegularEvent("click",this.generatePreviewLinks.bind(this)).delegateTo(document,Identifiers.previewLinksButton),new RegularEvent("change",((e,t)=>{Persistent.set("moduleData.workspaces_admin.language",t.value),this.settings.language=t.value,this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{const n=await e.resolve();t.previousElementSibling.innerHTML=t.querySelector("option:checked").dataset.icon,this.renderWorkspaceInfos(n[0].result)}))})).delegateTo(document,Identifiers.languageSelector),new RegularEvent("change",((e,t)=>{const n=t.value;Persistent.set("moduleData.workspaces_admin.stage",n),this.settings.stage=n,this.getWorkspaceInfos()})).delegateTo(document,Identifiers.stagesSelector),new RegularEvent("change",this.sendToSpecificStageAction.bind(this)).delegateTo(document,Identifiers.chooseStageAction),new RegularEvent("change",this.runSelectionAction.bind(this)).delegateTo(document,Identifiers.chooseSelectionAction),new RegularEvent("change",this.runMassAction.bind(this)).delegateTo(document,Identifiers.chooseMassAction),new RegularEvent("click",(e=>{e.preventDefault();const t=e.target.closest("button");let n=!1;switch(t.dataset.action){case"previous":this.paging.currentPage>1&&(this.paging.currentPage--,n=!0);break;case"next":this.paging.currentPage<this.paging.totalPages&&(this.paging.currentPage++,n=!0);break;case"page":this.paging.currentPage=parseInt(t.dataset.page,10),n=!0;break;default:throw'Unknown action "'+t.dataset.action+'"'}n&&(this.settings.start=parseInt(this.settings.limit.toString(),10)*(this.paging.currentPage-1),this.getWorkspaceInfos())})).delegateTo(document,Identifiers.pagination)}sendToStage(e,t){let n,a,s;if("next"===t)n=e.dataset.nextStage,a="sendToNextStageWindow",s="sendToNextStageExecute";else{if("prev"!==t)throw"Invalid direction given.";n=e.dataset.prevStage,a="sendToPrevStageWindow",s="sendToPrevStageExecute"}this.sendRemoteRequest(this.generateRemoteActionsPayload(a,[e.dataset.uid,e.dataset.table,e.dataset.t3ver_oid])).then((async t=>{const a=this.renderSendToStageWindow(await t.resolve());a.addEventListener("button.clicked",(t=>{if("ok"===t.target.name){const t=Utility.convertFormToObject(a.querySelector("form"));t.affects={table:e.dataset.table,nextStage:n,t3ver_oid:e.dataset.t3ver_oid,uid:e.dataset.uid,elements:[]},this.sendRemoteRequest([this.generateRemoteActionsPayload(s,[t]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const t=await e.resolve();a.hideModal(),this.renderWorkspaceInfos(t[1].result),Backend.refreshPageTree()}))}}))}))}getWorkspaceInfos(){this.sendRemoteRequest(this.generateRemotePayload("getWorkspaceInfos",this.settings)).then((async e=>{this.renderWorkspaceInfos((await e.resolve())[0].result)}))}renderWorkspaceInfos(e){const t=document.querySelector(Identifiers.contentsContainer),n=document.querySelector(Identifiers.noContentsContainer);this.resetMassActionState(e.data.length),this.buildPagination(e.total),0===e.total?(t.style.display="none",n.style.display="block"):(t.style.display="block",n.style.display="none");document.querySelector("typo3-workspaces-record-table").results=e.data}buildPagination(e){const t=document.querySelector(Identifiers.pagination);if(0===e)return void t.replaceChildren();if(this.paging.totalItems=e,this.paging.totalPages=Math.ceil(e/parseInt(this.settings.limit.toString(),10)),1===this.paging.totalPages)return void t.replaceChildren();const n=document.createElement("typo3-backend-pagination");n.paging=this.paging,t.append(n)}viewChanges(e,t){e.preventDefault();const n=t.closest("tr");this.sendRemoteRequest(this.generateRemotePayload("getRowDetails",{stage:parseInt(n.dataset.stage,10),t3ver_oid:parseInt(n.dataset.t3ver_oid,10),table:n.dataset.table,uid:parseInt(n.dataset.uid,10),filterFields:!0})).then((async e=>{const t=(await e.resolve())[0].result.data[0],a=[],s=document.createElement("typo3-workspaces-record-information");s.record=t,s.TYPO3lang=TYPO3.lang,!1!==t.label_PrevStage&&n.dataset.stage!==n.dataset.prevStage&&a.push({text:t.label_PrevStage.title,active:!0,btnClass:"btn-default",name:"prevstage",trigger:(e,t)=>{t.hideModal(),this.sendToStage(n,"prev")}}),!1!==t.label_NextStage&&a.push({text:t.label_NextStage.title,active:!0,btnClass:"btn-default",name:"nextstage",trigger:(e,t)=>{t.hideModal(),this.sendToStage(n,"next")}}),a.push({text:TYPO3.lang.close,active:!0,btnClass:"btn-info",name:"cancel",trigger:(e,t)=>t.hideModal()}),Modal.advanced({type:Modal.types.default,title:TYPO3.lang["window.recordInformation"].replace("{0}",n.querySelector(".t3js-title-workspace").innerText.trim()),content:s,severity:SeverityEnum.info,buttons:a,size:Modal.sizes.medium})}))}openPreview(e,t){const n=t.closest("tr");this.sendRemoteRequest(this.generateRemoteActionsPayload("viewSingleRecord",[n.dataset.table,n.dataset.uid])).then((async e=>{const t=(await e.resolve())[0].result;windowManager.localOpen(t)}))}confirmDeleteRecordFromWorkspace(e,t){const n=t.closest("tr"),a=Modal.confirm(TYPO3.lang["window.discard.title"],TYPO3.lang["window.discard.message"],SeverityEnum.warning,[{text:TYPO3.lang.cancel,active:!0,btnClass:"btn-default",name:"cancel",trigger:()=>{a.hideModal()}},{text:TYPO3.lang.ok,btnClass:"btn-warning",name:"ok"}]);a.addEventListener("button.clicked",(e=>{"ok"===e.target.name&&this.sendRemoteRequest([this.generateRemoteActionsPayload("deleteSingleRecord",[n.dataset.table,n.dataset.uid])]).then((()=>{a.hideModal(),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}))}runSelectionAction(e,t){const n=t.value,a="discard"!==n;if(0===n.length)return;const s=[];for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");s.push({table:t[0],liveId:t[2],versionId:t[1]})}a?this.checkIntegrity({selection:s,type:"selection"}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderSelectionActionModal(n,s)})):this.renderSelectionActionModal(n,s)})):this.renderSelectionActionModal(n,s)}renderPublishModal(e){const t=Modal.advanced({title:TYPO3.lang["window.publish.title"],content:TYPO3.lang["window.publish.message"],severity:SeverityEnum.info,staticBackdrop:!0,buttons:[{text:TYPO3.lang.cancel,btnClass:"btn-default",trigger:function(){t.hideModal()}},{text:TYPO3.lang.label_doaction_publish,btnClass:"btn-info",action:new DeferredAction((async()=>{await this.sendRemoteRequest(this.generateRemoteActionsPayload("publishSingleRecord",[e.dataset.table,e.dataset.t3ver_oid,e.dataset.uid])),this.getWorkspaceInfos(),Backend.refreshPageTree()}))}]})}renderSelectionActionModal(e,t){const n=Modal.advanced({title:TYPO3.lang["window.selectionAction.title"],content:html`<p>${TYPO3.lang["tooltip."+e+"Selected"]}</p>`,severity:SeverityEnum.warning,staticBackdrop:!0,buttons:[{text:TYPO3.lang.cancel,btnClass:"btn-default",trigger:function(){n.hideModal()}},{text:TYPO3.lang["label_doaction_"+e],btnClass:"btn-warning",action:new DeferredAction((async()=>{await this.sendRemoteRequest(this.generateRemoteActionsPayload("executeSelectionAction",{action:e,selection:t})),this.markedRecordsForMassAction=[],this.getWorkspaceInfos(),Backend.refreshPageTree()}))}]});n.addEventListener("typo3-modal-hidden",(()=>{document.querySelector(Identifiers.chooseSelectionAction).value=""}))}runMassAction(e,t){const n=t.value,a="discard"!==n;0!==n.length&&(a?this.checkIntegrity({language:this.settings.language,type:n}).then((async e=>{"warning"===(await e.resolve())[0].result.result?this.openIntegrityWarningModal().addEventListener("confirm.button.ok",(()=>{this.renderMassActionModal(n)})):this.renderMassActionModal(n)})):this.renderMassActionModal(n))}renderMassActionModal(e){let t,n;switch(e){case"publish":t="publishWorkspace",n=TYPO3.lang.label_doaction_publish;break;case"discard":t="flushWorkspace",n=TYPO3.lang.label_doaction_discard;break;default:throw"Invalid mass action "+e+" called."}const a=async e=>{const n=(await e.resolve())[0].result;n.processed<n.total?this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,n)).then(a):(this.getWorkspaceInfos(),Modal.dismiss())},s=Modal.advanced({title:TYPO3.lang["window.massAction.title"],content:html` <p>${TYPO3.lang["tooltip."+e+"All"]}</p> <p>${TYPO3.lang["tooltip.affectWholeWorkspace"]}</p> `,severity:SeverityEnum.warning,staticBackdrop:!0,buttons:[{text:TYPO3.lang.cancel,btnClass:"btn-default",trigger:function(){s.hideModal()}},{text:n,btnClass:"btn-warning",action:new DeferredAction((async()=>{const e=await this.sendRemoteRequest(this.generateRemoteMassActionsPayload(t,{init:!0,total:0,processed:0,language:this.settings.language}));await a(e)}))}]});s.addEventListener("typo3-modal-hidden",(()=>{document.querySelector(Identifiers.chooseMassAction).value=""}))}sendToSpecificStageAction(e,t){const n=[],a=t.value;for(let e=0;e<this.markedRecordsForMassAction.length;++e){const t=this.markedRecordsForMassAction[e].split(":");n.push({table:t[0],uid:t[1],t3ver_oid:t[2]})}this.sendRemoteRequest(this.generateRemoteActionsPayload("sendToSpecificStageWindow",[a,n])).then((async e=>{const t=this.renderSendToStageWindow(await e.resolve());t.addEventListener("button.clicked",(e=>{if("ok"===e.target.name){const e=Utility.convertFormToObject(t.querySelector("form"));e.affects={elements:n,nextStage:a},this.sendRemoteRequest([this.generateRemoteActionsPayload("sendToSpecificStageExecute",[e]),this.generateRemotePayload("getWorkspaceInfos",this.settings)]).then((async e=>{const n=await e.resolve();t.hideModal(),this.renderWorkspaceInfos(n[1].result),Backend.refreshPageTree()}))}})),t.addEventListener("typo3-modal-hide",(()=>{document.querySelector(Identifiers.chooseStageAction).value=""}))}))}generatePreviewLinks(){this.sendRemoteRequest(this.generateRemoteActionsPayload("generateWorkspacePreviewLinksForAllLanguages",[this.settings.id])).then((async e=>{const t=(await e.resolve())[0].result,n=document.createElement("dl");for(const[e,a]of Object.entries(t)){const t=document.createElement("dt");t.textContent=e;const s=document.createElement("a");s.href=a,s.target="_blank",s.textContent=a;const o=document.createElement("dd");o.appendChild(s),n.append(t,o)}Modal.show(TYPO3.lang.previewLink,n,SeverityEnum.info,[{text:TYPO3.lang.ok,active:!0,btnClass:"btn-info",name:"ok",trigger:(e,t)=>t.hideModal()}],["modal-inner-scroll"])}))}resetMassActionState(e){if(this.markedRecordsForMassAction=[],e){document.querySelector(Identifiers.workspaceActions).classList.remove("hidden");document.querySelector(Identifiers.chooseMassAction).disabled=!1}document.dispatchEvent(new CustomEvent("multiRecordSelection:actions:hide"))}}export default new Backend; \ No newline at end of file diff --git a/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js b/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js index b17a80b2bcd8..6b207d8be312 100644 --- a/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js +++ b/typo3/sysext/workspaces/Resources/Public/JavaScript/renderable/record-table.js @@ -10,7 +10,7 @@ * * The TYPO3 project - inspiring people to share! */ -var __decorate=function(e,t,n,o){var a,i=arguments.length,l=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,n,o);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(l=(i<3?a(l):i>3?a(t,n,l):a(t,n))||l);return i>3&&l&&Object.defineProperty(t,n,l),l};import{customElement,property}from"lit/decorators.js";import{html,LitElement,nothing}from"lit";import IconHelper from"@typo3/workspaces/utility/icon-helper.js";import{classMap}from"lit/directives/class-map.js";import{ifDefined}from"lit/directives/if-defined.js";import{repeat}from"lit/directives/repeat.js";import"@typo3/backend/element/icon-element.js";let RecordTableElement=class extends LitElement{constructor(){super(...arguments),this.results=[],this.latestPath=null}createRenderRoot(){return this}render(){return html` +var __decorate=function(e,t,n,a){var o,l=arguments.length,i=l<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,n):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,a);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(l<3?o(i):l>3?o(t,n,i):o(t,n))||i);return l>3&&i&&Object.defineProperty(t,n,i),i};import{customElement,property}from"lit/decorators.js";import{html,LitElement,nothing}from"lit";import IconHelper from"@typo3/workspaces/utility/icon-helper.js";import{classMap}from"lit/directives/class-map.js";import{ifDefined}from"lit/directives/if-defined.js";import{repeat}from"lit/directives/repeat.js";import"@typo3/backend/element/icon-element.js";let RecordTableElement=class extends LitElement{constructor(){super(...arguments),this.results=[],this.latestPath=null}createRenderRoot(){return this}render(){return html` <div class="table-fit mb-0"> <table class="table table-striped"> <thead> @@ -60,13 +60,15 @@ var __decorate=function(e,t,n,o){var a,i=arguments.length,l=i<3?t:null===o?o=Obj </ul> </div> </th> - <th>${TYPO3.lang["column.wsTitle"]}</th> - <th>${TYPO3.lang["column.liveTitle"]}</th> + <th class="col-min">${TYPO3.lang["column.wsTitle"]}</th> + <th class="col-language">${TYPO3.lang["labels._LOCALIZATION_"]}</th> + <th class="col-datetime">${TYPO3.lang["column.lastChangeOn"]}</th> + <th class="col-state">${TYPO3.lang["column.wsStateAction"]}</th> + <th class="col-state">${TYPO3.lang["column.integrity"]}</th> <th>${TYPO3.lang["column.stage"]}</th> - <th>${TYPO3.lang["column.lastChangeOn"]}</th> - <th>${TYPO3.lang["column.integrity"]}</th> - <th><typo3-backend-icon identifier="flags-multiple" size="small"></typo3-backend-icon></th> - <th></th> + <th class="col-control nowrap"> + <span class="visually-hidden">${TYPO3.lang["labels._CONTROL_"]}</span> + </th> </tr> </thead> <tbody data-multi-record-selection-row-selection="true"> @@ -74,7 +76,7 @@ var __decorate=function(e,t,n,o){var a,i=arguments.length,l=i<3?t:null===o?o=Obj </tbody> </table> </div> - `}renderTableRow(e){let t=null,n=!1;return this.latestPath!==e.path_Workspace&&(this.latestPath=e.path_Workspace,n=!0),""!==e.Workspaces_CollectionParent&&(t=this.results.find((t=>t.Workspaces_CollectionCurrent===e.Workspaces_CollectionParent))),html` + `}renderTableRow(e){let t=null,n=!1;this.latestPath!==e.path_Workspace&&(this.latestPath=e.path_Workspace,n=!0),""!==e.Workspaces_CollectionParent&&(t=this.results.find((t=>t.Workspaces_CollectionCurrent===e.Workspaces_CollectionParent)));let a,o;switch(e.state_Workspace){case"deleted":a="danger",o=TYPO3.lang["column.wsStateAction.deleted"];break;case"hidden":a="secondary",o=TYPO3.lang["column.wsStateAction.hidden"];break;case"modified":a="warning",o=TYPO3.lang["column.wsStateAction.modified"];break;case"moved":a="primary",o=TYPO3.lang["column.wsStateAction.moved"];break;case"new":a="success",o=TYPO3.lang["column.wsStateAction.new"];break;default:a="secondary",o=TYPO3.lang["column.wsStateAction.unchanged"]}return html` ${n?html` <tr> <th></th> @@ -104,49 +106,52 @@ var __decorate=function(e,t,n,o){var a,i=arguments.length,l=i<3?t:null===o?o=Obj <input type="checkbox" class="form-check-input t3js-multi-record-selection-check"/> </span> </td> - <td class="t3js-title-workspace"> + <td class="col-min t3js-title-workspace"> <span class="icon icon-size-small"> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.icon_Workspace)} overlay=${IconHelper.getIconIdentifier(e.icon_Workspace_Overlay)} size="small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.icon_Workspace)} overlay=${IconHelper.getIconIdentifier(e.icon_Workspace_Overlay)} size="small"></typo3-backend-icon> </span> <a href="#" data-action="changes"> - <span class="workspace-state-${e.state_Workspace}" title=${e.label_Workspace}> + <span title=${e.label_Workspace}> ${e.label_Workspace_crop} </span> </a> </td> - <td class="t3js-title-live"> - <span class="icon icon-size-small"> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.icon_Live)} overlay=${IconHelper.getIconIdentifier(e.icon_Live_Overlay)} size="small"> - </span> - <span class="workspace-live-title" title=${e.label_Live}> - ${e.label_Live_crop} + <td class="col-language"> + <span title="${e.language.title}" class="icon icon-size-small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.language.icon)} size="small"></typo3-backend-icon> </span> + ${e.language.title_crop} </td> - <td>${e.label_Stage}</td> - <td>${e.lastChangedFormatted}</td> - <td>${""!==e.integrity.messages?html` - <span> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.integrity.status)} size="small"> + <td class="col-datetime">${e.lastChangedFormatted}</td> + <td class="col-state"> + <span class="badge badge-${a}">${o}</span> + </td> + <td class="col-state">${""!==e.integrity.messages?html` + <span title="${e.integrity.messages}" class="icon icon-size-small"> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.integrity.status)} size="small"></typo3-backend-icon> </span> `:nothing}</td> - <td><typo3-backend-icon identifier=${IconHelper.getIconIdentifier(e.language.icon)} size="small"></td> - <td class="text-end nowrap">${this.renderActions(e)}</td> + <td>${e.label_Stage}</td> + <td class="col-control nowrap"> + <div class="btn-group">${this.renderElementActions(e)}</div> + <div class="btn-group">${this.renderVersioningActions(e)}</div> + </td> </tr> - `}renderActions(e){const t=e.Workspaces_CollectionChildren>0&&""!==e.Workspaces_CollectionCurrent;return[this.getAction(t,"expand",e.expanded?"actions-caret-down":"actions-caret-right",{title:TYPO3.lang["tooltip.expand"],"data-bs-target":'[data-collection="'+e.Workspaces_CollectionCurrent+'"]',"aria-expanded":!t||e.expanded?"true":"false","data-bs-toggle":"collapse"}),this.getAction(e.hasChanges,"changes","actions-document-info",{title:TYPO3.lang["tooltip.showChanges"]}),this.getAction(e.allowedAction_publish&&""===e.Workspaces_CollectionParent,"publish","actions-version-swap-version",{title:TYPO3.lang["tooltip.publish"]}),this.getAction(e.allowedAction_view,"preview","actions-version-workspace-preview",{title:TYPO3.lang["tooltip.viewElementAction"]}),this.getAction(e.allowedAction_edit,"open","actions-open",{title:TYPO3.lang["tooltip.editElementAction"]}),this.getAction(e.allowedAction_versionPageOpen,"version","actions-version-page-open",{title:TYPO3.lang["tooltip.openPage"]}),this.getAction(e.allowedAction_delete,"remove","actions-version-document-remove",{title:TYPO3.lang["tooltip.discardVersion"]})]}getAction(e,t,n,o){return e?html` + `}renderElementActions(e){return[this.getAction(e.allowedAction_view,"preview","actions-version-workspace-preview",{title:TYPO3.lang["tooltip.viewElementAction"]}),this.getAction(e.allowedAction_edit,"open","actions-open",{title:TYPO3.lang["tooltip.editElementAction"]}),this.getAction(e.allowedAction_versionPageOpen,"version","actions-version-page-open",{title:TYPO3.lang["tooltip.openPage"]})]}renderVersioningActions(e){const t=e.Workspaces_CollectionChildren>0&&""!==e.Workspaces_CollectionCurrent;return[this.getAction(t,"expand",e.expanded?"actions-caret-down":"actions-caret-right",{title:TYPO3.lang["tooltip.expand"],"data-bs-target":'[data-collection="'+e.Workspaces_CollectionCurrent+'"]',"aria-expanded":!t||e.expanded?"true":"false","data-bs-toggle":"collapse"}),this.getAction(e.hasChanges,"changes","actions-document-info",{title:TYPO3.lang["tooltip.showChanges"]}),this.getAction(e.allowedAction_publish&&""===e.Workspaces_CollectionParent,"publish","actions-version-swap-version",{title:TYPO3.lang["tooltip.publish"]}),this.getAction(e.allowedAction_delete,"remove","actions-delete",{title:TYPO3.lang["tooltip.discardVersion"]})]}getAction(e,t,n,a){return e?html` <button class="btn btn-default" data-action="${t}" - title=${ifDefined(o.title)} - data-bs-target=${ifDefined(o["data-bs-target"])} - data-bs-toggle=${ifDefined(o["data-bs-toggle"])} - aria-expanded=${ifDefined(o["aria-expanded"])}> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(n)} size="small"> + title=${ifDefined(a.title)} + data-bs-target=${ifDefined(a["data-bs-target"])} + data-bs-toggle=${ifDefined(a["data-bs-toggle"])} + aria-expanded=${ifDefined(a["aria-expanded"])}> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier(n)} size="small"></typo3-backend-icon> </button> `:html`<span class="btn btn-default disabled" - title=${ifDefined(o.title)} - data-bs-target=${ifDefined(o["data-bs-target"])} - data-bs-toggle=${ifDefined(o["data-bs-toggle"])} - aria-expanded=${ifDefined(o["aria-expanded"])}> - <typo3-backend-icon identifier=${IconHelper.getIconIdentifier("empty-empty")} size="small"> + title=${ifDefined(a.title)} + data-bs-target=${ifDefined(a["data-bs-target"])} + data-bs-toggle=${ifDefined(a["data-bs-toggle"])} + aria-expanded=${ifDefined(a["aria-expanded"])}> + <typo3-backend-icon identifier=${IconHelper.getIconIdentifier("empty-empty")} size="small"></typo3-backend-icon> </span>`}};__decorate([property({type:Array})],RecordTableElement.prototype,"results",void 0),RecordTableElement=__decorate([customElement("typo3-workspaces-record-table")],RecordTableElement);export{RecordTableElement}; \ No newline at end of file -- GitLab