* Refactor repo view.
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
.sidebar-comments{width: 530px;}
|
||||
.repo-downloadCode{margin: 8px 10px 8px 0;}
|
||||
.repo-select{margin-left: 1rem;}
|
||||
@@ -0,0 +1,3 @@
|
||||
.directory {background-image:url('theme/default/images/repo/dir.png');}
|
||||
.file {background-image:url('theme/default/images/repo/txt.png');}
|
||||
.mini-icon {display: inline-block; height: 16px; width: 16px; background-color: transparent; background-position: 0 0; background-repeat: no-repeat; vertical-align: text-bottom;margin-right: 2px;}
|
||||
@@ -0,0 +1,86 @@
|
||||
window.renderCell = function(result, {col, row})
|
||||
{
|
||||
if(col.name === 'name')
|
||||
{
|
||||
var iconHtml = '<span class="' + (row.data.kind == 'dir' ? 'directory' : 'file') + ' mini-icon"></span>';
|
||||
result[0] = {html:iconHtml + '<a href="' + row.data.link + '">' + row.data.name + '</a>', style:{flexDirection:"column"}};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
window.renderCommentCell = function(result, {col, row})
|
||||
{
|
||||
if(col.name === 'revision')
|
||||
{
|
||||
result[0] = {html:'<a href="' + row.data.link + '">' + row.data.revision + '</a>', style:{flexDirection:"column"}};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
/* Open download page when downZip btn click. */
|
||||
$('.downloadZip-btn').on('click', function()
|
||||
{
|
||||
var link = $.createLink('repo', 'downloadCode', 'repoID=' + repoID + '&branch=' + branch);
|
||||
window.open(link);
|
||||
})
|
||||
|
||||
/* Refresh page when repo changed. */
|
||||
$('#repo-select').on('change', function()
|
||||
{
|
||||
var index = $('#repo-select').prop('selectedIndex');
|
||||
if(menus[index - 1].url != undefined)
|
||||
{
|
||||
window.location.href = menus[index - 1].url;
|
||||
}
|
||||
})
|
||||
|
||||
/**
|
||||
* 当选中两行时禁用其他行。
|
||||
* Disable checkable attribution when checked rows equal 2.
|
||||
*
|
||||
* @param object changes
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
window.checkedChange = function(changes)
|
||||
{
|
||||
const dtable = zui.DTable.query('#repo-comments-table');
|
||||
var checkedIds = dtable == undefined ? [] : dtable.$.getChecks()
|
||||
|
||||
if(checkedIds.length < 2)
|
||||
{
|
||||
$('.btn-diff').addClass('disabled')
|
||||
}
|
||||
else
|
||||
{
|
||||
$('.btn-diff').removeClass('disabled')
|
||||
}
|
||||
}
|
||||
|
||||
window.diffClick = function()
|
||||
{
|
||||
const dtable = zui.DTable.query('#repo-comments-table');
|
||||
var checkedIds = dtable.$.getChecks();
|
||||
var newDiffLink = diffLink.replace('{oldRevision}', revisionMap[checkedIds[1]]);
|
||||
newDiffLink = newDiffLink.replace('{newRevision}', revisionMap[checkedIds[0]]);
|
||||
|
||||
console.log('checkedIds:', checkedIds);
|
||||
|
||||
window.location.href = newDiffLink;
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
setTimeout(function()
|
||||
{
|
||||
const dtable = zui.DTable.query('#repo-comments-table');
|
||||
dtable.$.toggleCheckRows(Object.keys(revisionMap).slice(0, 2));
|
||||
window.checkedChange();
|
||||
}, 100);
|
||||
})
|
||||
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* The browse view file of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
|
||||
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Ke Zhao<zhaoke@easycorp.ltd>
|
||||
* @package repo
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
|
||||
namespace zin;
|
||||
|
||||
/* Prepare repo select data. */
|
||||
$menus = array();
|
||||
$selected = '';
|
||||
foreach($branches as $branchName)
|
||||
{
|
||||
$selected = ($branchName == $branchID and $branchOrTag == 'branch') ? $branchName : $selected;
|
||||
$base64BranchID = helper::safe64Encode(base64_encode($branchName));
|
||||
$branchLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID");
|
||||
|
||||
$menus[] = array('text' => $branchName, 'value' => $branchName, 'url' => $branchLink);
|
||||
}
|
||||
foreach($tags as $tagName)
|
||||
{
|
||||
$selected = ($tagName == $branchID and $branchOrTag == 'tag') ? $tagName : $selected;
|
||||
$base64TagID = helper::safe64Encode(base64_encode($tagName));
|
||||
$tagLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=$base64TagID&objectID=$objectID&path=&revision=HEAD&refresh=0&branchOrTag=tag");
|
||||
|
||||
$menus[] = array('text' => $tagName, 'value' => $tagName, 'url' => $tagLink);
|
||||
}
|
||||
|
||||
/* Prepare breadcrumb navigation data. */
|
||||
$base64BranchID = helper::safe64Encode(base64_encode($branchID));
|
||||
$breadcrumbItems = array();
|
||||
$breadcrumbItems[] = h::a
|
||||
(
|
||||
setClass('form-title'),
|
||||
set::href($this->repo->createLink('browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID")),
|
||||
$repo->name,
|
||||
);
|
||||
$breadcrumbItems[] = h::span('/');
|
||||
|
||||
$paths = explode('/', $path);
|
||||
$fileName = array_pop($paths);
|
||||
$postPath = '';
|
||||
foreach($paths as $index => $pathName)
|
||||
{
|
||||
$postPath .= $pathName . '/';
|
||||
$breadcrumbItems[] = h::a
|
||||
(
|
||||
setClass('form-title'),
|
||||
set::href($this->repo->createLink('browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID&path=" . $this->repo->encodePath($postPath))),
|
||||
trim($pathName, '/'),
|
||||
);
|
||||
$breadcrumbItems[] = h::span('/');
|
||||
}
|
||||
if($fileName) $breadcrumbItems[] = h::span($fileName);
|
||||
|
||||
/* zin: Define the set::module('repo') feature bar on main menu. */
|
||||
featureBar(
|
||||
formGroup
|
||||
(
|
||||
set::width('200px'),
|
||||
set::class('repo-select'),
|
||||
set::required(true),
|
||||
select
|
||||
(
|
||||
set::id('repo-select'),
|
||||
set::items($menus),
|
||||
set::value($selected)
|
||||
)
|
||||
),
|
||||
...$breadcrumbItems
|
||||
);
|
||||
|
||||
/* zin: Define the toolbar on main menu. */
|
||||
$refreshLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=" . $base64BranchID . "&objectID=$objectID&path=" . $this->repo->encodePath($path) . "&revision=$revision&refresh=1");
|
||||
$refreshItem = array('text' => $lang->refresh, 'url' => $refreshLink, 'class' => 'primary', 'icon' => 'refresh');
|
||||
$downloadItem = array('text' => $lang->repo->downloadCode, 'url' => '#modalDownloadCode', 'class' => 'primary download-btn', 'icon' => 'download', 'data-toggle' => 'modal');
|
||||
|
||||
$tableData = initTableData($infos, $config->repo->repoDtable->fieldList, $this->repo);
|
||||
|
||||
toolbar
|
||||
(
|
||||
span(
|
||||
set::class('last-sync-time'),
|
||||
$lang->repo->notice->lastSyncTime . $cacheTime
|
||||
),
|
||||
item(set($refreshItem)),
|
||||
item(set($downloadItem)),
|
||||
);
|
||||
|
||||
modalTrigger
|
||||
(
|
||||
modal
|
||||
(
|
||||
set::id('modalDownloadCode'),
|
||||
set::title($lang->repo->downloadCode),
|
||||
$cloneUrl->svn ? div
|
||||
(
|
||||
p(set::class('repo-downloadCode'), $lang->repo->cloneUrl),
|
||||
formRow
|
||||
(
|
||||
formGroup
|
||||
(
|
||||
set::width('2/3'),
|
||||
input
|
||||
(
|
||||
set::type('text'),
|
||||
set::value($cloneUrl->svn),
|
||||
set::readOnly(true),
|
||||
),
|
||||
),
|
||||
formGroup
|
||||
(
|
||||
set::width('1/6'),
|
||||
btn
|
||||
(
|
||||
set::icon('copy'),
|
||||
)
|
||||
)
|
||||
),
|
||||
) : null,
|
||||
|
||||
$cloneUrl->ssh ? div
|
||||
(
|
||||
p(set::class('repo-downloadCode'), $lang->repo->sshClone),
|
||||
formRow
|
||||
(
|
||||
formGroup
|
||||
(
|
||||
set::width('2/3'),
|
||||
input
|
||||
(
|
||||
set::type('text'),
|
||||
set::value($cloneUrl->ssh),
|
||||
set::disabled(true),
|
||||
),
|
||||
),
|
||||
formGroup
|
||||
(
|
||||
set::width('1/6'),
|
||||
btn
|
||||
(
|
||||
set::icon('copy'),
|
||||
)
|
||||
)
|
||||
),
|
||||
) : null,
|
||||
|
||||
$cloneUrl->http ? div
|
||||
(
|
||||
p(set::class('repo-downloadCode'), $lang->repo->httpClone),
|
||||
formRow
|
||||
(
|
||||
formGroup
|
||||
(
|
||||
set::width('2/3'),
|
||||
input
|
||||
(
|
||||
set::type('text'),
|
||||
set::value($cloneUrl->http),
|
||||
set::disabled(true),
|
||||
),
|
||||
),
|
||||
formGroup
|
||||
(
|
||||
set::width('1/6'),
|
||||
btn
|
||||
(
|
||||
set::icon('copy'),
|
||||
)
|
||||
)
|
||||
),
|
||||
) : null,
|
||||
|
||||
to::footer
|
||||
(
|
||||
set::footerClass('flex-center'),
|
||||
btn
|
||||
(
|
||||
set::class('downloadZip-btn'),
|
||||
set::text($lang->repo->downloadZip),
|
||||
)
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
dtable
|
||||
(
|
||||
set::cols($config->repo->repoDtable->fieldList),
|
||||
set::data($tableData),
|
||||
set::onRenderCell(jsRaw('window.renderCell')),
|
||||
set::footPager(),
|
||||
);
|
||||
|
||||
/* zin: Define the sidebar in main content. */
|
||||
$encodePath = $this->repo->encodePath($path);
|
||||
$diffLink = $this->repo->createLink('diff', "repoID=$repoID&objectID=$objectID&entry=" . $encodePath . "&oldrevision={oldRevision}&newRevision={newRevision}");
|
||||
$revisionMap = array();
|
||||
foreach($revisions as $revision) $revisionMap[$revision->id] = $revision->revision;
|
||||
|
||||
jsVar('repoID', $repoID);
|
||||
jsVar('branch', $branchID);
|
||||
jsVar('menus', $menus);
|
||||
jsVar('revisionMap', $revisionMap);
|
||||
jsVar('diffLink', $diffLink);
|
||||
jsVar('sortLink', helper::createLink('repo', 'browse', "repoID={$repoID}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
|
||||
|
||||
|
||||
$commentsTableData = initTableData($revisions, $config->repo->commentDtable->fieldList, $this->repo);
|
||||
|
||||
$readAllLink = $this->repo->createLink('log', "repoID=$repoID&objectID=$objectID&entry=" . $encodePath . "&revision=HEAD&type=$logType");
|
||||
|
||||
$footToolbar['items'][] = array('text' => $lang->repo->diff, 'class' => "btn secondary size-sm btn-diff", 'btnType' => 'primary', 'onClick' => jsRaw('window.diffClick'));
|
||||
$footToolbar['items'][] = array('text' => $lang->repo->allLog, 'url' => $readAllLink);
|
||||
|
||||
sidebar
|
||||
(
|
||||
set::side('right'),
|
||||
cell(set::class('sidebar-comments')),
|
||||
dtable
|
||||
(
|
||||
set::id('repo-comments-table'),
|
||||
set::cols($config->repo->commentDtable->fieldList),
|
||||
set::data($commentsTableData),
|
||||
set::onRenderCell(jsRaw('window.renderCommentCell')),
|
||||
set::onCheckChange(jsRaw('window.checkedChange')),
|
||||
set::checkInfo(jsRaw('function(){return {html:\'\'}}')),
|
||||
set::footToolbar($footToolbar),
|
||||
set::footPager(usePager()),
|
||||
set::showToolbarOnChecked(false),
|
||||
),
|
||||
);
|
||||
|
||||
render();
|
||||
+5
-5
@@ -121,7 +121,7 @@ class repoZen extends repo
|
||||
exec($versionCommand, $versionOutput, $versionResult);
|
||||
if($versionResult)
|
||||
{
|
||||
$message = sprintf($this->lang->repo->error->output, $versionCommand, $versionResult, join("<br />", $versionOutput));
|
||||
$message = sprintf($this->lang->repo->error->output, $versionCommand, $versionResult, implode("<br />", $versionOutput));
|
||||
dao::$errors['client'] = $this->lang->repo->error->cmd . "<br />" . nl2br($message);
|
||||
return false;
|
||||
}
|
||||
@@ -151,7 +151,7 @@ class repoZen extends repo
|
||||
exec($command, $output, $result);
|
||||
if($result)
|
||||
{
|
||||
$message = sprintf($this->lang->repo->error->output, $command, $result, join("<br />", $output));
|
||||
$message = sprintf($this->lang->repo->error->output, $command, $result, implode("<br />", $output));
|
||||
if(stripos($message, 'Expected FS format between') !== false and strpos($message, 'found format') !== false)
|
||||
{
|
||||
dao::$errors['client'] = $this->lang->repo->error->clientVersion;
|
||||
@@ -214,7 +214,7 @@ class repoZen extends repo
|
||||
exec($command, $output, $result);
|
||||
if($result)
|
||||
{
|
||||
dao::$errors['submit'] = $this->lang->repo->error->connect . "<br />" . sprintf($this->lang->repo->error->output, $command, $result, join("<br />", $output));
|
||||
dao::$errors['submit'] = $this->lang->repo->error->connect . "<br />" . sprintf($this->lang->repo->error->output, $command, $result, implode("<br />", $output));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -323,7 +323,7 @@ class repoZen extends repo
|
||||
* @access protected
|
||||
* @return array
|
||||
*/
|
||||
protected function getFilesInfo(object $repo, string $path, string $branchID, int $refresh, string $revison, object $lastRevision): array
|
||||
protected function getFilesInfo(object $repo, string $path, string $branchID, int $refresh, string $revision, object $lastRevision): array
|
||||
{
|
||||
$cacheFile = $this->repo->getCacheFile($repo->id, $path, $branchID);
|
||||
$cacheRefreshTime = isset($lastRevision->time) ? date('Y-m-d H:i', strtotime($lastRevision->time)) : date('Y-m-d H:i');
|
||||
@@ -338,7 +338,7 @@ class repoZen extends repo
|
||||
{
|
||||
$infos = $this->scm->ls($path, $revision);
|
||||
$revisionList = array_column($infos, 'revision', 'revision');
|
||||
$comments = $this->repo->getHistory($repoID, $revisionList);
|
||||
$comments = $this->repo->getHistory($repo->id, $revisionList);
|
||||
foreach($infos as $info)
|
||||
{
|
||||
if(isset($comments[$info->revision]))
|
||||
|
||||
Reference in New Issue
Block a user