%PDF- %PDF-
Direktori : /home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/templates/ |
Current File : //home/waritko/jetty-distribution-9.4.21.v20190926/webapps/ROOT/templates/extensionHistory.vm |
#template('extension.vm') #macro (handleExtensionHistoryRequest) #if ($request.action == 'export') #exportExtensionHistory #elseif ($request.action == 'replay') #if ($services.csrf.isTokenValid($request.form_token)) #replayExtensionHistory #else $response.sendError(401, $services.localization.render('extension.history.invalidCSRFToken')) #end #elseif ($request.action == 'continue') #if ($services.csrf.isTokenValid($request.form_token)) #continueExtensionHistoryReplay($request.jobId) #else $response.sendError(401, $services.localization.render('extension.history.invalidCSRFToken')) #end #elseif ($request.data == 'sources') #displayExtensionHistorySourcesList #elseif ($request.data == 'records') #getExtensionHistoryRecords #if ($records && $records.size() > 0) #displayExtensionHistoryRecords($records) #end #elseif ($request.data == 'replayPlan') #displayExtensionHistoryReplayPlan #elseif ($request.data == 'replayStatus') #maybeDisplayExtensionHistoryReplayStatus($request.jobId) #elseif ($xcontext.action == 'get' && $isAjaxRequest) #maybeDisplayExtensionHistoryRecordsForm #else #set ($discard = $xwiki.ssfx.use('uicomponents/extension/history.css', true)) #set ($discard = $xwiki.jsfx.use('uicomponents/extension/history.js')) <div class="extension-history"> <p class="noitems">$escapetool.xml($services.localization.render('extension.history.hint'))</p> #displayCurrentJobInfo #displayExtensionHistorySourcesForm #maybeDisplayExtensionHistoryRecordsForm </div> #end #end #macro (exportExtensionHistory) #set ($discard = $response.setContentType('application/xml')) #set ($discard = $response.addHeader('Content-disposition', "attachment; filename*=utf-8''extensionHistory.xml")) #getSelectedExtensionHistoryRecords #if ($selectedRecords && $selectedRecords.size() > 0) #set ($output = []) ## Export the oldest selected history records first. #foreach ($i in [$mathtool.sub($selectedRecords.size(), 1)..0]) #set ($discard = $output.add($services.extension.history.serialize($selectedRecords.get($i)))) #end $stringtool.join($output, $util.newline) #end #end #macro (replayExtensionHistory) #createExtensionHistoryReplayPlan #set ($job = $services.extension.history.replay($records)) #if ($job) #if ($isAjaxRequest) #set ($discard = $response.setContentType('application/json')) $jsontool.serialize({'jobId': $job.request.id.get(2)}) #else #getExtensionHistoryURL($redirectURL 'view' { 'data': 'replayStatus', 'jobId': $job.request.id.get(2) }) $response.sendRedirect($redirectURL) #end #else $response.sendError(400, $exceptiontool.getRootCauseMessage($services.extension.history.lastError)) #end #end #macro (continueExtensionHistoryReplay $replayJobId) #set ($replayJobStatus = $services.extension.history.getReplayJobStatus($replayJobId)) #if ($hasGlobalAdmin && $replayJobStatus && $replayJobStatus.state == 'WAITING') #answerExtensionJobQuestion($replayJobStatus) #end #getExtensionHistoryURL($redirectURL "#if ($isAjaxRequest)get#{else}view#end" { 'data': 'replayStatus', 'jobId': $replayJobId }) $response.sendRedirect($redirectURL) #end #macro (displayCurrentJobInfo) #set ($currentJobStatus = $services.extension.currentJobStatus) #if ($currentJobStatus) #set ($jobId = $stringtool.join($currentJobStatus.request.id, '/')) #if ($jobId.startsWith('extension/history')) #getExtensionHistoryURL($jobStatusURL 'view' { 'data': 'replayStatus', 'jobId': $stringtool.substringAfterLast($jobId, '/') }) #set ($message = $services.localization.render('extension.history.currentJobInfo.replay', ["<a href='$jobStatusURL'>", '</a>'])) #else #set ($jobType = $currentJobStatus.jobType) #set ($message = $services.localization.render('extension.history.currentJobInfo', ["<strong>$jobType</strong>", "<strong>$jobId</strong>"])) #end <div class="box infomessage">$services.icon.renderHTML('info') $message</div> #end #end #macro (displayExtensionHistorySourcesForm) #set ($sourceLabel = $request.source) #if (!$sourceLabel) #set ($sourceLabel = $services.localization.render('extension.history.sources.localHistory')) #end <div class="extension-history-sources-selector opened"> <div class="extension-history-sources-header"> <span class="icon-closed">$services.icon.renderHTML('caret-right')</span> <span class="icon-opened">$services.icon.renderHTML('caret-down')</span> $services.localization.render('extension.history.records.source', ["<em>$escapetool.xml($sourceLabel)</em>"]) </div> <div class="extension-history-sources-body"> #displayExtensionHistorySources <div class="extension-history-source"> <div> $services.icon.renderHTML('add') <span class="extension-history-source-name"> $services.localization.render('extension.history.sources.importHistoryFile') </span> </div> #set ($discard = $xwiki.jsfx.use('uicomponents/widgets/upload.js', { 'forceSkinAction': true, 'language': $xcontext.locale })) #set ($discard = $xwiki.ssfx.use('uicomponents/widgets/upload.css', true)) <form action="$uploadDoc.getURL('upload')" enctype="multipart/form-data" method="post" class="extension-history-source-upload"> <div class="hidden"> <input type="hidden" name="form_token" value="$!services.csrf.token" /> #getExtensionHistoryURL($xredirect 'get' {'data': 'sources'}) <input type="hidden" name="xredirect" value="$xredirect" /> </div> <input type="file" name="filepath" /> <input type="submit" value="$services.localization.render('extension.history.sources.import')" class="btn btn-default" /> </form> </div> </div> </div> #end #macro (displayExtensionHistorySources) <ul class="extension-history-sources"> #displayExtensionHistorySourcesList </ul> #end #macro (displayExtensionHistorySourcesList) #getExtensionHistoryURL($recordsURL 'get' {}) <li class="extension-history-source#if (!$request.source) selected#end" data-recordsURL="$recordsURL"> $services.icon.renderHTML('database') #getExtensionHistoryURL($sourceURL 'view' {}) <a href="$sourceURL" class="extension-history-source-name"> $services.localization.render('extension.history.sources.localHistory') </a> </li> #displayExtensionHistoryFileSources #end #macro (displayExtensionHistoryFileSources) #set ($uploadDoc = $xwiki.getDocument('XWiki.ExtensionHistoryUploads')) #foreach ($attachment in $uploadDoc.attachmentList) #if ($attachment.mimeType == 'application/xml') #displayExtensionHistoryFileSource($attachment) #end #end #end #macro (displayExtensionHistoryFileSource $attachment) #getExtensionHistoryURL($recordsURL 'get' {'source': $attachment.filename}) <li class="extension-history-source#if ($request.source == $attachment.filename) selected#end" data-recordsURL="$recordsURL" data-fileName="$escapetool.xml($attachment.filename)"> <div> $services.icon.renderHTML('attach') #getExtensionHistoryURL($sourceURL 'view' {'source': $attachment.filename}) <a href="$sourceURL" class="extension-history-source-name"> $escapetool.xml($attachment.filename)</a> <span class="extension-history-source-version">$attachment.version</span> #if ($services.security.authorization.hasAccess('edit', $uploadDoc.documentReference)) #getExtensionHistoryURL($xredirect 'view' {}) #set ($deleteURL = $uploadDoc.getAttachmentURL($attachment.filename, 'delattachment', $escapetool.url({ 'form_token': $services.csrf.token, 'xredirect': $xredirect }))) #set ($deleteHint = $services.localization.render('extension.history.source.deleteHint')) #set ($deleteConfirmation = $services.localization.render('extension.history.source.deleteConfirmation')) <a class="deleteLink" href="$deleteURL" title="$escapetool.xml($deleteHint)" data-confirmation="$escapetool.xml($deleteConfirmation)"> $services.icon.renderHTML('cross') </a> #end </div> <div class="extension-history-source-author"> $services.localization.render('extension.history.source.authorDateAndSize', [ $xwiki.getUserName($attachment.author), $xwiki.formatDate($attachment.date), "#dynamicsize($attachment.longSize)" ]) </div> </li> #end #macro (maybeDisplayExtensionHistoryRecordsForm) #getExtensionHistoryRecords #if ($records && $records.size() > 0) #displayExtensionHistoryRecordsForm($records) #else <div class="extension-history-records-form"> <ul class="extension-history-records"> <li class="extension-history-record"> <span class="box infomessage"> $services.icon.renderHTML('info') $services.localization.render('extension.history.noRecords') </span> </li> </ul> </div> #end #if ($hasProgramming && !$isAjaxRequest) #displayExtensionHistoryReplayOptions() #end #end #macro (displayExtensionHistoryRecordsForm $records) #getExtensionHistoryURL($recordsFormActionURL 'get' {}) <form method="post" action="$recordsFormActionURL" class="extension-history-records-form"> <div class="hidden"> <input type="hidden" name="source" value="$!escapetool.xml($request.source)" /> <input type="hidden" name="form_token" value="$services.csrf.token" /> </div> #displayExtensionHistoryRecords($records) <div class="extension-history-actions"> <button class="btn btn-default" name="action" value="export" type="submit"> $services.icon.renderHTML('download') $services.localization.render('extension.history.records.export') </button> #if ($hasGlobalAdmin) <button class="btn btn-default" name="data" value="replayPlan" type="submit"> $services.icon.renderHTML('repeat') $services.localization.render('extension.history.records.replay') </button> #end </div> </form> #end #macro (getExtensionHistoryRecords) #if ("$!request.source" != '') ## History File #set ($sourceFile = $xwiki.getDocument('XWiki.ExtensionHistoryUploads').getAttachment($request.source)) #set ($records = []) #set ($limit = $NULL) #if ($sourceFile.mimeType == 'application/xml') #set ($records = $services.extension.history.read($sourceFile.contentInputStream)) ## Display the most recent records first. #set ($discard = $collectionstool.reverse($records)) #end #else ## Local History ## Show by default only the jobs that affect the wiki. #set ($jobTypes = ['install', 'uninstall', 'repairxar']) #set ($limit = 10) #set ($recordsFilter = $services.extension.history.records) #set ($records = $recordsFilter.fromThisWiki().ofType($jobTypes).list($request.offsetRecordId, $limit)) #end #end #macro (getSelectedExtensionHistoryRecords) #set ($selectedRecordIds = $request.getParameterValues('extensionHistoryRecord')) #if ($selectedRecordIds && $selectedRecordIds.size() > 0) #set ($selectedRecordIdsSet = $collectionstool.set) #set ($discard = $selectedRecordIdsSet.addAll($selectedRecordIds.subList(0, $selectedRecordIds.size()))) #getExtensionHistoryRecords #set ($selectedRecords = []) #foreach ($record in $records) #if ($selectedRecordIdsSet.contains($record.id)) #set ($discard = $selectedRecords.add($record)) #end #end #end #end #macro (displayExtensionHistoryRecords $records) <ul class="extension-history-records"> #foreach ($record in $records) <li class="extension-history-record $!escapetool.xml($record.jobType)"> #displayExtensionHistoryRecord($record) </li> #end #if ($limit && $records.size() >= $limit) #getExtensionHistoryURL($moreURL 'get' { 'data': 'records', 'offsetRecordId': $records.get($mathtool.sub($records.size(), 1)).id }) <li class="extension-history-record"> <a href="$moreURL" class="more">$services.localization.render('extension.history.records.more')</a> </li> #end </ul> #end #macro (displayExtensionHistoryRecord $record $selector $hideDate) <div> ## ## Selector ## #if ($selector) $selector #else <input type="checkbox" name="extensionHistoryRecord" value="$escapetool.xml($record.id)" /> #end ## ## Icon ## #set ($iconByJobType = { 'install': 'add', 'uninstall': 'delete', 'repairxar': 'wrench' }) #set ($icon = $iconByJobType.get($record.jobType)) <span class="extension-history-record-icon"> #if ($icon) $services.icon.renderHTML($icon) #end </span> ## ## Extensions ## #set ($extensions = []) #foreach ($extensionId in $record.request.extensions) #set ($discard = $extensions.add("#displayExtensionHistoryRecord_extension($extensionId)")) #end <span>$stringtool.join($extensions, ', ')</span> ## ## Namespaces ## #set ($namespaces = []) #if (!$record.request.hasNamespaces()) #set ($discard = $namespaces.add($services.localization.render('global namespace'))) #elseif ($record.request.namespaces.size() > 1 || $record.request.namespaces.get(0) != "wiki:$xcontext.database") #foreach ($namespace in $record.request.namespaces) #set ($discard = $namespaces.add("#displayExtensionNamespace($namespace)")) #end #end #if ($namespaces.size() > 0) <span class="extension-history-record-namespaces">(in $stringtool.join($namespaces, ', '))</span> #end </div> ## ## User & Date ## #set ($userReference = $record.request.getProperty('user.reference')) #set ($label = "extension.history.record.${record.jobType}User#if (!$hideDate)AndDate#end") <div class="extension-history-record-user"> $services.localization.render($label, [$xwiki.getUserName("$!userReference"), $xwiki.formatDate($record.endDate)]) </div> #end #macro (displayExtensionHistoryRecord_extension $extensionId) #set ($extension = $services.extension.resolve($extensionId.id, $extensionId.version)) #if ($extension) #set ($extensionURL = "#getExtensionURL($extensionId.id, $extensionId.version)") <a href="$extensionURL" class="extension-link">#displayExtensionName($extension)</a> #else $extensionId.id #end <span class="extension-history-record-version">$!extensionId.version</span> #end #macro (displayExtensionHistoryReplayOptions) #getExtensionHistoryURL($replayOptionsSubmitURL 'get' {}) <form method="post" action="$replayOptionsSubmitURL" class="hidden extension-history-replay-options xform"> <h2>$services.localization.render('extension.history.replayOptions.title')</h2> <dl> <dt> <label> <input type="checkbox" name="preserveUsers" value="true"/> $services.localization.render('extension.history.replayOptions.preserveUsers.label') </label> <span class="xHint">$services.localization.render('extension.history.replayOptions.preserveUsers.hint')</span> </dt> <dt> <label for="namespaces"> $services.localization.render('extension.history.replayOptions.namespaces.label') </label> <span class="xHint">$services.localization.render('extension.history.replayOptions.namespaces.hint')</span> </dt> <dd><input type="text" id="namespaces" name="namespaces" value="$xcontext.database" /></dd> </dl> <div> <button class="btn btn-primary" name="data" value="replayPlan" type="submit"> $services.localization.render('extension.history.replayOptions.continue') </button> <a href="#" class="btn btn-default">$services.localization.render('extension.history.replayOptions.cancel')</a> </div> </form> #end #macro (createExtensionHistoryReplayPlan) #getSelectedExtensionHistoryRecords ## The replay plan should include the oldest history records first (because the oldest records are replayed first). #set ($discard = $collectionstool.reverse($selectedRecords)) ## Modify the records based on the replay options. #set ($preserveUsers = $request.preserveUsers == 'true') #set ($namespaces = []) #foreach ($namespace in $request.namespaces.split('\s+')) #if ($namespace.indexOf(':') < 0) #set ($discard = $namespaces.add("wiki:$namespace")) #end #end ## Backup the ids of the selected records because we modify them when creating the replay plan. #set ($selectedRecordsIds = []) #foreach ($selectedRecord in $selectedRecords) #set ($discard = $selectedRecordsIds.add($selectedRecord.id)) #end #set ($records = $services.extension.history.createReplayPlan($selectedRecords, $preserveUsers, $namespaces)) #end #macro (displayExtensionHistoryReplayPlan) #createExtensionHistoryReplayPlan #getExtensionHistoryURL($replayPlanSubmitURL 'get' {}) <form method="post" action="$replayPlanSubmitURL" class="extension-history-replay-plan xform"> <h2>$services.localization.render('extension.history.replayPlan.title')</h2> #if ($records && $records.size() > 0) <div class="hidden"> ## Forward the replay plan parameters. #foreach ($paramName in ['source', 'preserveUsers', 'namespaces']) <input type="hidden" name="$paramName" value="$!escapetool.xml($request.getParameter($paramName))" /> #end <input type="hidden" name="form_token" value="$services.csrf.token" /> </div> <div class="xHint">$services.localization.render('extension.history.replayPlan.hint')</div> <ul class="extension-history-records"> #foreach ($record in $records) <li class="extension-history-record $!escapetool.xml($record.jobType)"> #set ($selector = "<input type='hidden' name='extensionHistoryRecord' value='$escapetool.xml($selectedRecordsIds.get($foreach.index))' />") #displayExtensionHistoryRecord($record $selector true) </li> #end </ul> #else <div class="box infomessage"> $services.icon.renderHTML('info') $services.localization.render('extension.history.replayPlan.empty') </div> #end <div class="extension-history-actions"> #if ($hasGlobalAdmin && $records && $records.size() > 0) <button class="btn btn-primary" name="action" value="replay" type="submit"> $services.localization.render('extension.history.replayPlan.start') </button> #end <a href="#" class="btn btn-default"> $services.localization.render('extension.history.replayPlan.cancel') </a> </div> </form> #end #macro (maybeDisplayExtensionHistoryReplayStatus $replayJobId) #set ($replayJobStatus = $services.extension.history.getReplayJobStatus($replayJobId)) #if ($replayJobStatus) #set ($discard = $xwiki.ssfx.use('uicomponents/extension/history.css', true)) #set ($discard = $xwiki.jsfx.use('uicomponents/extension/history.js')) #displayExtensionHistoryReplayStatus($replayJobStatus) #else <h2>$services.localization.render('extension.history.replayStatus.title')</h2> <div class="box infomessage"> $services.icon.renderHTML('info') $services.localization.render('extension.history.replayStatus.notFound', [$replayJobId]) </div> #end #end #macro (displayExtensionHistoryReplayStatus $replayJobStatus) #set ($currentRecordNumber = $replayJobStatus.currentRecordNumber) #set ($replayJobState = $replayJobStatus.state) #set ($finished = $replayJobState == 'FINISHED') #set ($waiting = $replayJobState == 'WAITING') ## TODO: Find a better way to detect if the replay job has failed. Checking if there are errors in the log is not ## reliable because there can be error logs like "Collision found on object [...]" that don't prevent the replay job ## from finishing successfully. The last log message cannot be used either because it is always an info log like this ## "Finished job of type [...] with identifier [...]". #set ($success = $finished && $replayJobStatus.log.getLogs('ERROR').isEmpty()) #set ($userReference = $replayJobStatus.request.getProperty('user.reference')) #getExtensionHistoryURL($extensionHistoryURL 'get' {}) <div class="extension-history-replay-status" data-jobId="$replayJobId" data-jobState="$replayJobState" data-extensionHistoryURL="$extensionHistoryURL"> <h2 class="wikigeneratedheader"> $services.localization.render('extension.history.replayStatus.title') </h2> <div class="xHint"> $services.localization.render('extension.history.replayStatus.hint', [$xwiki.getUserName($userReference), $xwiki.formatDate($replayJobStatus.startDate)]) </div> <ul class="extension-history-records"> #foreach ($record in $replayJobStatus.request.records) #set ($classNames = ['extension-history-record', $escapetool.xml($record.jobType)]) #if (!$finished && $foreach.index == $currentRecordNumber) #set ($discard = $classNames.add('loading')) #end <li class="$stringtool.join($classNames, ' ')"> #set ($selector = '') #if ($foreach.index < $replayJobStatus.currentRecordNumber) #set ($selector = 'check') #elseif ($foreach.index == $currentRecordNumber && $finished) #if ($success) #set ($selector = 'check') #else #set ($selector = 'error') #end #end #if ($selector != '') #set ($selector = "<span class='extension-history-record-status $selector'>$services.icon.renderHTML($selector)</span>") #end #displayExtensionHistoryRecord($record $selector true) </li> #end </ul> #if (!$finished) #displayJobProgressBar($replayJobStatus) #end <div class="extension-history-replay-log"> <div class="collapse-toggle xHint" data-target-xpath="following-sibling::*"> <span class="icon-closed">$services.icon.renderHTML('caret-right')</span> <span class="icon-opened">$services.icon.renderHTML('caret-down')</span> $services.localization.render('extension.history.replayStatus.replayLog') </div> #printStatusLog($replayJobStatus) </div> #if ($waiting) <form class="extension-question xform" action="$extensionHistoryURL" method="post"> <div class="hidden"> <input type="hidden" name="form_token" value="$services.csrf.token" /> <input type="hidden" name="jobId" value="$escapetool.xml($replayJobId)" /> </div> #displayExtensionDetails_progressQuestion($NULL $replayJobStatus) #if ($hasGlobalAdmin) <div class="extension-history-actions"> <button class="btn btn-primary" name="action" value="continue" type="submit"> $services.localization.render('extension.history.replayStatus.continue') </button> </div> #end </form> #end </div> #end #macro (getExtensionHistoryURL $return $action $params) #set ($extensionHistoryDocRef = $services.model.createDocumentReference($NULL, 'XWiki', 'ExtensionHistory')) #set ($parameters = {}) #set ($discard = $parameters.putAll($params)) #if (!$xwiki.exists($extensionHistoryDocRef)) #if ($action == 'get') #set ($discard = $parameters.put('xpage', 'extensionHistory')) #else #set ($discard = $parameters.put('xpage', 'view')) #set ($discard = $parameters.put('viewer', 'extensionHistory')) #end #end #set ($_url = $xwiki.getURL($extensionHistoryDocRef, $action, $escapetool.url($parameters))) #set ($return = $NULL) #setVariable("$return" $_url) #end #if ($request.xpage == 'extensionHistory' || $request.viewer == 'extensionHistory') #if ($request.viewer == 'extensionHistory') <div id="document-title"> <h1>$services.localization.render('extension.history')</h1> </div> #else #template('xwikivars.vm') #end #if ($request.extensionId && ($request.extensionVersion || $request.extensionVersionConstraint)) #handleExtensionRequest #else #handleExtensionHistoryRequest #end #end