diff --git a/module/block/config/docblock.php b/module/block/config/docblock.php new file mode 100644 index 0000000000..37c22567f5 --- /dev/null +++ b/module/block/config/docblock.php @@ -0,0 +1,22 @@ +loadLang('doc'); + +$config->block->doc = new stdclass(); +$config->block->doc->dtable = new stdclass(); +$config->block->doc->dtable->fieldList = array(); +$config->block->doc->dtable->fieldList['title']['name'] = 'title'; +$config->block->doc->dtable->fieldList['title']['title'] = $lang->doc->title; +$config->block->doc->dtable->fieldList['title']['type'] = 'title'; + +$config->block->doc->dtable->fieldList['addedBy']['name'] = 'addedBy'; +$config->block->doc->dtable->fieldList['addedBy']['title'] = $lang->doc->addedBy; +$config->block->doc->dtable->fieldList['addedBy']['type'] = 'user'; + +$config->block->doc->dtable->fieldList['addedDate']['name'] = 'addedDate'; +$config->block->doc->dtable->fieldList['addedDate']['title'] = $lang->doc->addedDate; +$config->block->doc->dtable->fieldList['addedDate']['type'] = 'date'; + +$config->block->doc->dtable->fieldList['editedDate']['name'] = 'editedDate'; +$config->block->doc->dtable->fieldList['editedDate']['title'] = $lang->doc->editedDate; +$config->block->doc->dtable->fieldList['editedDate']['type'] = 'date'; diff --git a/module/block/css/productdocblock.ui.css b/module/block/css/productdocblock.ui.css new file mode 100644 index 0000000000..393cd1aaf0 --- /dev/null +++ b/module/block/css/productdocblock.ui.css @@ -0,0 +1,20 @@ +.productdoc-block {background: #FCFDFE;} +.productdoc-block .panel-body {padding: 0;} + +.productdoc-block .tab-content {width: 100%;} +.productdoc-block .tab-pane {padding: 0;} +.productdoc-block .bg-secondary-pale {background: #F3F6FA;} +.productdoc-block .chart {margin: auto;} +.productdoc-block .story-num {margin: auto;} + +.productdoc-block.block-sm .nav-tabs .nav-item.active {display: flex!important;} +.productdoc-block.block-sm .nav-tabs .nav-item > a {width: 100%;} +.productdoc-block.block-sm .nav-tabs .nav-item {display: none} +.productdoc-block.block-sm .nav-tabs .nav-item.nav-prev {display: flex} +.productdoc-block.block-sm .nav-tabs .nav-item.nav-prev > a {padding: 0;} +.productdoc-block.block-sm .nav-tabs .nav-item.nav-next {display: flex} +.productdoc-block.block-sm .nav-tabs .nav-item.nav-next > a {padding: 0;} + +.productdoc-block .chart > div {margin: auto;} +.productdoc-block .pie-chart {position: relative;} +.productdoc-block .pie-chart .pie-chart-title {position: absolute; top: 50%; left: 50%; margin-top: -25px; margin-left: -35px} diff --git a/module/block/css/projectdocblock.ui.css b/module/block/css/projectdocblock.ui.css new file mode 100644 index 0000000000..005b8ddd42 --- /dev/null +++ b/module/block/css/projectdocblock.ui.css @@ -0,0 +1,20 @@ +.projectdoc-block {background: #FCFDFE;} +.projectdoc-block .panel-body {padding: 0;} + +.projectdoc-block .tab-content {width: 100%;} +.projectdoc-block .tab-pane {padding: 0;} +.projectdoc-block .bg-secondary-pale {background: #F3F6FA;} +.projectdoc-block .chart {margin: auto;} +.projectdoc-block .story-num {margin: auto;} + +.projectdoc-block.block-sm .nav-tabs .nav-item.active {display: flex!important;} +.projectdoc-block.block-sm .nav-tabs .nav-item > a {width: 100%;} +.projectdoc-block.block-sm .nav-tabs .nav-item {display: none} +.projectdoc-block.block-sm .nav-tabs .nav-item.nav-prev {display: flex} +.projectdoc-block.block-sm .nav-tabs .nav-item.nav-prev > a {padding: 0;} +.projectdoc-block.block-sm .nav-tabs .nav-item.nav-next {display: flex} +.projectdoc-block.block-sm .nav-tabs .nav-item.nav-next > a {padding: 0;} + +.projectdoc-block .chart > div {margin: auto;} +.projectdoc-block .pie-chart {position: relative;} +.projectdoc-block .pie-chart .pie-chart-title {position: absolute; top: 50%; left: 50%; margin-top: -25px; margin-left: -35px} diff --git a/module/block/ui/docmycollectionblock.html.php b/module/block/ui/docmycollectionblock.html.php index b242bf864d..175a46b83b 100644 --- a/module/block/ui/docmycollectionblock.html.php +++ b/module/block/ui/docmycollectionblock.html.php @@ -60,6 +60,16 @@ panel ( set('class', 'docmycollection-block ' . ($longBlock ? 'block-long' : 'block-sm')), set::title($block->title), + to::headingActions + ( + a + ( + set('class', 'text-gray'), + set('href', createLink('doc', 'myspace', 'type=collect&libID=0&moduleID=0&browseType=all¶m=0&orderBy=editedDate_desc')), + $lang->more, + icon('caret-right') + ) + ), rawContent() ); diff --git a/module/block/ui/productdocblock.html.php b/module/block/ui/productdocblock.html.php index 25a3aedae6..6a7dacabf4 100644 --- a/module/block/ui/productdocblock.html.php +++ b/module/block/ui/productdocblock.html.php @@ -11,14 +11,138 @@ declare(strict_types=1); namespace zin; +/** + * 获取区块左侧的产品列表。 + * Get product tabs on the left side. + * + * @param array $products + * @param string $blockNavCode + * @param bool $longBlock + * @return array + */ +$getProductTabs = function(array $products, string $blockNavCode, bool $longBlock): array +{ + $navTabs = array(); + $selected = key($products); + $navTabs[] = li + ( + set('class', 'nav-item overflow-hidden nav-prev rounded-full bg-white shadow-md h-6 w-6'), + a(icon(set('size', '24'), 'angle-left')) + ); + foreach($products as $product) + { + $navTabs[] = li + ( + set('class', 'nav-item nav-switch w-full'), + a + ( + set('class', 'ellipsis text-dark title ' . ($longBlock && $product->id == $selected ? ' active' : '')), + $longBlock ? set('data-toggle', 'tab') : null, + set('data-name', "tab3{$blockNavCode}Content{$product->id}"), + set('href', $longBlock ? "#tab3{$blockNavCode}Content{$product->id}" : helper::createLink('product', 'browse', "productID=$product->id")), + $product->name + + ), + !$longBlock ? a + ( + set('class', 'hidden' . ($product->id == $selected ? ' active' : '')), + set('data-toggle', 'tab'), + set('data-name', "tab3{$blockNavCode}Content{$product->id}"), + set('href', "#tab3{$blockNavCode}Content{$product->id}"), + ) : null, + a + ( + set('class', 'link flex-1 text-right hidden'), + set('href', helper::createLink('product', 'browse', "productID=$product->id")), + icon + ( + set('class', 'rotate-90 text-primary'), + setStyle(array('--tw-rotate' => '270deg')), + 'import' + ) + ) + ); + } + $navTabs[] = li + ( + set('class', 'nav-item overflow-hidden nav-next rounded-full bg-white shadow-md h-6 w-6'), + a(icon(set('size', '24'), 'angle-right')) + ); + return $navTabs; +}; + +/** + * 获取区块右侧显示的产品信息。 + * Get product statistical information. + * + * @param array $products + * @param array $docGroup + * @param string $blockNavID + * @param bool $longBlock + * @return array + */ +$getProductInfo = function(array $products, array $docGroup, string $blockNavID, bool $longBlock): array +{ + global $lang, $config; + $tabItems = array(); + $selected = key($products); + foreach($products as $product) + { + $tabItems[] = div + ( + set('class', 'tab-pane h-full' . ($product->id == $selected ? ' active' : '')), + set('id', "tab3{$blockNavID}Content{$product->id}"), + dtable + ( + set::height(318), + set::bordered(false), + set::horzScrollbarPos('inside'), + set::cols(array_values($config->block->doc->dtable->fieldList)), + set::data(array_values($docGroup[$product->id])), + set::userMap($users), + ) + ); + } + return $tabItems; +}; + +$blockNavCode = 'nav-' . uniqid(); panel ( + set('id', "productdoc-block-{$block->id}"), + on::click('.nav-prev,.nav-next', 'switchNav'), + set('class', 'productdoc-block ' . ($longBlock ? 'block-long' : 'block-sm')), set('headingClass', 'border-b'), set::title($block->title), + to::headingActions + ( + a + ( + set('class', 'text-gray'), + set('href', createLink('doc', 'productspace')), + $lang->more, + icon('caret-right') + ) + ), div ( - '正在开发中...' + set('class', "flex h-full overflow-hidden " . ($longBlock ? '' : 'col')), + cell + ( + $longBlock ? set('width', '22%') : null, + set('class', $longBlock ? 'bg-secondary-pale overflow-y-auto overflow-x-hidden' : ''), + ul + ( + set('class', 'nav nav-tabs ' . ($longBlock ? 'nav-stacked' : 'pt-4 px-4')), + $getProductTabs($products, $blockNavCode, $longBlock) + ), + ), + cell + ( + set('class', 'tab-content'), + set('width', '78%'), + $getProductInfo($products, $docGroup, $blockNavCode, $longBlock) + ) ) ); - render(); diff --git a/module/block/ui/projectdocblock.html.php b/module/block/ui/projectdocblock.html.php index fb3f52cb81..cf80762586 100644 --- a/module/block/ui/projectdocblock.html.php +++ b/module/block/ui/projectdocblock.html.php @@ -11,14 +11,138 @@ declare(strict_types=1); namespace zin; +/** + * 获取区块左侧的项目列表。 + * Get project tabs on the left side. + * + * @param array $projects + * @param string $blockNavCode + * @param bool $longBlock + * @return array + */ +$getProjectTabs = function(array $projects, string $blockNavCode, bool $longBlock): array +{ + $navTabs = array(); + $selected = key($projects); + $navTabs[] = li + ( + set('class', 'nav-item overflow-hidden nav-prev rounded-full bg-white shadow-md h-6 w-6'), + a(icon(set('size', '24'), 'angle-left')) + ); + foreach($projects as $project) + { + $navTabs[] = li + ( + set('class', 'nav-item nav-switch w-full'), + a + ( + set('class', 'ellipsis text-dark title ' . ($longBlock && $project->id == $selected ? ' active' : '')), + $longBlock ? set('data-toggle', 'tab') : null, + set('data-name', "tab3{$blockNavCode}Content{$project->id}"), + set('href', $longBlock ? "#tab3{$blockNavCode}Content{$project->id}" : helper::createLink('project', 'browse', "projectID=$project->id")), + $project->name + + ), + !$longBlock ? a + ( + set('class', 'hidden' . ($project->id == $selected ? ' active' : '')), + set('data-toggle', 'tab'), + set('data-name', "tab3{$blockNavCode}Content{$project->id}"), + set('href', "#tab3{$blockNavCode}Content{$project->id}"), + ) : null, + a + ( + set('class', 'link flex-1 text-right hidden'), + set('href', helper::createLink('project', 'browse', "projectID=$project->id")), + icon + ( + set('class', 'rotate-90 text-primary'), + setStyle(array('--tw-rotate' => '270deg')), + 'import' + ) + ) + ); + } + $navTabs[] = li + ( + set('class', 'nav-item overflow-hidden nav-next rounded-full bg-white shadow-md h-6 w-6'), + a(icon(set('size', '24'), 'angle-right')) + ); + return $navTabs; +}; + +/** + * 获取区块右侧显示的项目文档列表。 + * Get project doc list. + * + * @param array $projects + * @param array $docGroup + * @param string $blockNavID + * @param bool $longBlock + * @return array + */ +$getProjectInfo = function(array $projects, array $docGroup, string $blockNavID, bool $longBlock): array +{ + global $lang, $config; + $tabItems = array(); + $selected = key($projects); + foreach($projects as $project) + { + $tabItems[] = div + ( + set('class', 'tab-pane h-full' . ($project->id == $selected ? ' active' : '')), + set('id', "tab3{$blockNavID}Content{$project->id}"), + dtable + ( + set::height(318), + set::bordered(false), + set::horzScrollbarPos('inside'), + set::cols(array_values($config->block->doc->dtable->fieldList)), + set::data(array_values($docGroup[$project->id])), + set::userMap($users), + ) + ); + } + return $tabItems; +}; + +$blockNavCode = 'nav-' . uniqid(); panel ( + set('id', "projectdoc-block-{$block->id}"), + on::click('.nav-prev,.nav-next', 'switchNav'), + set('class', 'projectdoc-block ' . ($longBlock ? 'block-long' : 'block-sm')), set('headingClass', 'border-b'), set::title($block->title), + to::headingActions + ( + a + ( + set('class', 'text-gray'), + set('href', createLink('doc', 'projectspace')), + $lang->more, + icon('caret-right') + ) + ), div ( - '正在开发中...' + set('class', "flex h-full overflow-hidden " . ($longBlock ? '' : 'col')), + cell + ( + $longBlock ? set('width', '22%') : null, + set('class', $longBlock ? 'bg-secondary-pale overflow-y-auto overflow-x-hidden' : ''), + ul + ( + set('class', 'nav nav-tabs ' . ($longBlock ? 'nav-stacked' : 'pt-4 px-4')), + $getProjectTabs($projects, $blockNavCode, $longBlock) + ), + ), + cell + ( + set('class', 'tab-content'), + set('width', '78%'), + $getProjectInfo($projects, $docGroup, $blockNavCode, $longBlock) + ) ) ); - render();