Merge branch 'sprint/168_sunhao/task45145'

This commit is contained in:
zhujinyong
2021-12-01 11:32:08 +08:00
19 changed files with 390 additions and 236 deletions
+60 -84
View File
@@ -5,66 +5,57 @@
#kanbanList .panel-heading {padding: 10px;}
#kanbanList .panel-body {padding: 0 10px 10px;}
#kanbanList .kanban {min-height: 120px; overflow: visible;}
#kanbanList .kanban-item {margin-top: 0; border-radius: 2px;}
#kanbanList .kanban-item:hover {border: 1px solid #ccc;}
#kanbanList .kanban-item + .kanban-item {margin-top: 10px;}
#kanbanList .kanban-lane-items {padding: 10px; min-height: 38px;}
#kanbanList .kanban-card {border-radius: 2px; padding: 10px;}
#kanbanList .kanban-card:hover {border: 1px solid #ccc;}
#kanbanList .kanban-header,
#kanbanList .kanban-lane {border-bottom: none; margin-bottom: 0; min-height: 60px;}
#kanbanList .kanban-lane {border-bottom: none; margin-bottom: 0;}
#kanbanList .kanban-sub-lane {border-bottom: 0;}
#kanbanList .kanban-lane {margin-top: 2px; min-height: 100px;}
#kanbanList .kanban-lane.has-sub-lane {background-color: transparent;}
#kanbanList .kanban-lane + .kanban-lane {border-top: 10px solid #fff;}
#kanbanList .kanban-lane + .kanban-lane {margin-top: 10px;}
#kanbanList .kanban-sub-lane + .kanban-sub-lane {margin-top: 2px;}
#kanbanList .kanban-col + .kanban-col {border-left: 2px solid #fff;}
#kanbanList .kanban-header-col {height: 72px; padding: 20px 5px;}
#kanbanList .kanban-header-col > .title {margin: 0; line-height: 32px; height: 32px}
#kanbanList .kanban-header-col > .title > .text {font-weight: bold; max-width: 200px; max-width: calc(100% - 50px);}
#kanbanList .kanban-header-col > .title > .icon, #kanbanList .kanban-header-col > .title > .count {top: -11px}
#kanbanList .kanban-header-col > .title > .text {max-width: 200px; max-width: calc(100% - 50px);}
#kanbanList .kanban-header + .kanban-lane > .kanban-lane-name {margin-top: 0;}
#kanbanList .kanban-header {position: relative;}
#kanbanList .kanban-item.link-block {padding: 0;}
#kanbanList .kanban-item.link-block > a {padding: 10px; display: block;}
#kanbanList .kanban-item > .title {white-space: nowrap; overflow: hidden; text-overflow: clip;}
#kanbanList .kanban-item.link-block > a {padding: 10px; display: block;}
#kanbanList .kanban-item.has-progress {padding-right: 40px; position: relative;}
#kanbanList .kanban-item.has-progress > .progress-pie {position: absolute; right: 7px; top: 7px}
#kanbanList .kanban-item.has-left-border {border-left: 2px solid #838a9d;}
#kanbanList .kanban-item.has-left-border.border-left-green {border-left-color: #0bd986;}
#kanbanList .kanban-item.has-left-border.border-left-red {border-left-color: #ff5d5d;}
#kanbanList .kanban-item.has-left-border.border-left-blue {border-left-color: #0991ff;}
#kanbanList .kanban-item.link-block a {padding: 10px; display: block;}
#kanbanList .kanban-card > .title {white-space: nowrap; overflow: hidden; text-overflow: clip;}
#kanbanList .kanban-card.has-progress {padding-right: 40px; position: relative;}
#kanbanList .kanban-card.has-progress > .progress-pie {position: absolute; right: 7px; top: 7px}
#kanbanList .kanban-card.has-left-border {border-left: 2px solid #838a9d;}
#kanbanList .kanban-card.has-left-border.border-left-green {border-left-color: #0bd986;}
#kanbanList .kanban-card.has-left-border.border-left-red {border-left-color: #ff5d5d;}
#kanbanList .kanban-card.has-left-border.border-left-blue {border-left-color: #0991ff;}
#kanbanList .no-flex .kanban-lane > .kanban-sub-lanes[data-sub-lanes-count="1"] > .kanban-sub-lane {min-height: 90px;}
#kanbanList .no-flex .kanban-lane > .kanban-sub-lanes[data-sub-lanes-count="2"] > .kanban-sub-lane {min-height: 45px;}
.kanban-affixed {padding-top: 72px;}
.kanban-affixed > .kanban-header {position: fixed!important; top: 0; background: rgba(80,80,80,.9); color: #fff; z-index: 100;}
#kanbanList .kanban-header-col[data-type="doingProject"],
#kanbanList .kanban-header-col[data-type="doingProject"] + .kanban-header-col[data-type="doingExecution"] {padding: 38px 10px 0;}
#kanbanList .kanban-header-col[data-type="doingProject"]:after {content: attr(data-span-text); display: block; position: absolute; z-index: 10; left: 0; right: -100%; right: calc(-100% - 2px); top: 0; line-height: 36px; text-align: center; font-weight: bold; border-bottom: 2px solid #fff; background-color: #ededed;}
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-lane-items {height: 100%; display: flex; flex-direction: column; justify-content: center;}
#kanbanList .kanban-item.kanban-item-span,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-item {background-color: transparent; border: none; padding: 0; text-align: center; box-shadow: none!important;}
#kanbanList .kanban-item.kanban-item-span:hover,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-item:hover {box-shadow: none;}
#kanbanList .kanban-item.kanban-item-span > .title,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-item > .title {white-space: normal;}
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-item {padding: 0;}
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-lane-items {height: 100%; display: flex; flex-direction: column; justify-content: center; padding: 0; overflow: hidden;}
#kanbanList .kanban-card.kanban-card-span,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-card {background-color: transparent; border: none; padding: 0; text-align: center; box-shadow: none!important; margin: 0; height: auto!important;}
#kanbanList .kanban-card.kanban-card-span:hover,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-card:hover {box-shadow: none;}
#kanbanList .kanban-card.kanban-card-span > .title,
#kanbanList .kanban-col[data-type="unclosedProduct"] .kanban-card > .title {white-space: normal; line-height: 1;}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-item > .title {display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center; height: 38px;}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-item > .title > .text {display: block; white-space: nowrap; text-overflow: clip; overflow: hidden;}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-item > .title.has-icon > .text {margin-right: 5px; max-width: calc(100% - 20px);}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-item > .title {display: block; height: 38px;}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-item > .title > .text {display: inline-block;}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-item > .title > .icon {position: relative; top: -5px}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-card > .title {display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center;}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-card > .title > .text {display: block; white-space: nowrap; text-overflow: clip; overflow: hidden;}
#kanbanList .kanban-col[data-type="normalRelease"] .kanban-card > .title.has-icon > .text {margin-right: 5px; max-width: calc(100% - 20px);}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-card > .title {display: block; height: 38px;}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-card > .title > .text {display: inline-block;}
#kanbanList .no-flex .kanban-col[data-type="normalRelease"] .kanban-card > .title > .icon {position: relative; top: -5px}
#kanbanList .kanban-affixed .kanban-header-col[data-type="doingProject"]:after {background-color: #606060;}
/* Show project and execution in one row */
#kanbanList .kanban-lane-col[data-type="doingProject"] + .kanban-lane-col {border-left: none; box-shadow: inset 2px 0 0 #fff;}
#kanbanList .kanban-lane-col[data-type="doingProject"] > .kanban-lane-items {padding: 0; overflow: visible; max-height: none!important;}
#kanbanList .project-row {position: relative; width: 200%; width: calc(200% + 2px);}
#kanbanList .project-row + .project-row {border-top: 2px solid #fff;}
#kanbanList .kanban-lane-col[data-type="doingProject"] > .kanban-lane-items {padding: 0!important; overflow: visible; max-height: none!important;}
#kanbanList .kanban-item-span {padding: 0!important;}
#kanbanList .project-row {position: relative; width: 200%; width: calc(200% + 2px); height: 62px!important;}
#kanbanList .kanban-item-span + .kanban-item-span > .project-row {border-top: 2px solid #fff;}
#kanbanList .project-row > .project-col {float: left; width: 50%; padding: 10px;}
#kanbanList .project-row > .project-col + .project-col {padding: 10px 9px 10px 11px;}
#kanbanList .project-row > .execution-item {position: absolute!important; left: 100%; top: 0}
</style>
<script>
@@ -102,7 +93,7 @@ function renderSpanItem(item, $item)
$title = $('<div class="title" />').appendTo($item);
}
$title.text(item.name).attr('title', item.name);
return $item.addClass('kanban-item-span');
return $item.addClass('kanban-card-span');
}
/**
@@ -308,16 +299,17 @@ function renderReleaseItem(item, $item)
*/
function renderDoingProjectItem(item, $item)
{
$item.removeClass('kanban-item').addClass('project-row clearfix').empty();
$item.closest('.kanban-item').addClass('kanban-item-span');
$item.removeClass('kanban-card').addClass('project-row clearfix').empty();
var $projectCol = $('<div class="project-col"></div>').appendTo($item);
var $projectItem = $('<div class="kanban-item project-item"></div>').appendTo($projectCol);
var $projectItem = $('<div class="kanban-card project-item"></div>').appendTo($projectCol);
renderProjectItem(item, $projectItem);
var $executionCol = $('<div class="project-col"></div>').appendTo($item);
if(item.execution)
{
var $executionItem = $('<div class="kanban-item execution-item"></div>').appendTo($executionCol);
var $executionItem = $('<div class="kanban-card execution-item"></div>').appendTo($executionCol);
renderExecutionItem(item.execution, $executionItem);
}
@@ -389,9 +381,7 @@ function affixKanbanHeader($kanbanBoard, affixed)
$kanbanBoard.css('padding-top', affixed ? $header.outerHeight() : '');
}
/**
* Update kanban affix state for all boards in page
*/
/** Update kanban affix state for all boards in page */
function updateKanbanAffixState()
{
var $boards = $('.kanban-board');
@@ -417,34 +407,36 @@ function updateKanbanAffixState()
if($currentAffixedBoard) affixKanbanHeader($currentAffixedBoard, true);
}
/** Try to update kanban affix state */
function tryUpdateKanbanAffix()
{
if(window.updateKanbanAffixTimer) $.zui.clearAsap(window.updateKanbanAffixTimer);
window.updateKanbanAffixTimer = $.zui.asap(function()
{
updateKanbanAffixState();
window.updateKanbanAffixTimer = null;
});
}
/* Kanban color list for lane name */
if(!window.kanbanColorList) window.kanbanColorList = ['#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761'];
/* Set default options to kanban component */
$.extend($.fn.kanban.Constructor.DEFAULTS,
{
readonly: true,
maxColHeight: 260,
itemRender: renderKanbanItem,
useFlex: false,
showCount: true,
showZeroCount: true,
onRenderHeaderCol: function($col, col)
readonly: true,
maxColHeight: 260,
itemRender: renderKanbanItem,
showCount: true,
showZeroCount: true,
fluidBoardWidth: true,
onRenderLaneName: function($name, lane, $kanban, columns, kanban)
{
if(col.type === 'doingProject' && window.doingText) $col.attr('data-span-text', window.doingText);
var color = kanbanColorList[lane.$index % kanbanColorList.length];
$name.css('background-color', color);
},
onRenderKanban: function($kanban, kanbanData)
{
$kanban.find('.kanban-lane').each(function(index)
{
var $lane = $(this);
if ($lane.data('lane').color) return;
var $laneName = $lane.find('.kanban-lane-name');
var color = kanbanColorList[index % kanbanColorList.length];
$laneName.css('background-color', color);
});
/* Update project count and execution count */
var doingProjectCount = 0;
var doingExecutionCount = 0;
@@ -460,29 +452,13 @@ $.extend($.fn.kanban.Constructor.DEFAULTS,
},
onCreate: function(kanban)
{
kanban.$.on('scroll', updateKanbanAffixState);
updateKanbanAffixState();
kanban.$.on('scroll', tryUpdateKanbanAffix);
tryUpdateKanbanAffix();
}
});
$(function()
{
/* Update kanban affix state on window resize or scroll */
var updateTimer;
var updateCallback = function()
{
updateKanbanAffixState();
updateTimer = null;
};
$(window.kanbanAffixContainer || window).on('scroll resize', function(e)
{
if(updateTimer)
{
if(window.requestAnimationFrame) cancelAnimationFrame(updateTimer);
else clearTimeout(updateTimer);
}
if(window.requestAnimationFrame) updateTimer = requestAnimationFrame(updateCallback);
else updateTimer = setTimeout(updateCallback, 50);
});
$(window.kanbanAffixContainer || window).on('scroll resize', tryUpdateKanbanAffix);
});
</script>
-1
View File
@@ -3,6 +3,5 @@
#kanbanList .kanban-header-col {height: 32px!important; padding: 0!important;}
#kanbanList .kanban-header-col > .title {padding: 0 5px!important;}
#kanbanList .kanban-col[data-type="project"] .kanban-lane-items {height: 100%; display: flex; flex-direction: column; justify-content: center;}
#kanbanList .kanban-lane-name {width: 5px; margin-right: 15px;}
#kanbanList .kanban-lane-name > .text {display: none;}
#kanbanList .kanban-item.link-block > a {cursor: move;}
+27 -14
View File
@@ -2,20 +2,19 @@
#main > .container {max-width: 1960px!important; padding: 0 10px}
.kanban + .kanban {margin-top: 15px}
.kanban-item {position: relative;}
.kanban-item > .title { display: block;white-space: nowrap; overflow: hidden; text-overflow: ellipsis}
.kanban-item > .infos {position: relative; margin-top: 5px}
.kanban-item > .infos > .info + .info {margin-left: 8px}
.kanban-item > .infos > .info-id,
.kanban-item > .infos > .info-deadline,
.kanban-item > .infos > .info-estimate {font-size: 12px; position: relative; top: 2px}
.kanban-item > .infos > .label-pri {min-width: 16px; line-height: 14px; height: 16px; padding: 0}
.kanban-item > .infos > .label-severity {transform: scale(.75)}
.kanban-item > .infos > .avatar {position: absolute; right: 0; top: 0}
.kanban-item > .actions {position: absolute; top: 4px; right: 4px; opacity: 0;}
.kanban-item:hover > .actions {opacity: 1;}
.kanban-item > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;}
.kanban-item > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;}
.kanban-card > .title {display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis}
.kanban-card > .infos {position: relative; margin-top: 5px}
.kanban-card > .infos > .info + .info {margin-left: 8px}
.kanban-card > .infos > .info-id,
.kanban-card > .infos > .info-deadline,
.kanban-card > .infos > .info-estimate {font-size: 12px; position: relative; top: 2px}
.kanban-card > .infos > .label-pri {min-width: 16px; line-height: 14px; height: 16px; padding: 0}
.kanban-card > .infos > .label-severity {transform: scale(.75)}
.kanban-card > .infos > .avatar {position: absolute; right: 0; top: 0}
.kanban-card > .actions {position: absolute; top: 4px; right: 4px; opacity: 0;}
.kanban-card:hover > .actions {opacity: 1;}
.kanban-card > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;}
.kanban-card > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;}
.kanban-header-col > .actions {padding-top: 22px}
.kanban-header-parent-col .kanban-header-col > .actions {padding-top: 6px; padding-right: 2px;}
@@ -35,6 +34,20 @@
#kanbans .kanban {min-height: initial;}
#kanbans .kanban-lane {min-height: 150px;}
#kanbans .kanban-affixed > .kanban-header {top: 100px;}
#kanbans .kanban-card[data-scale-size="4"] {padding: 8px;}
#kanbans .kanban-card[data-scale-size="3"] {padding: 3px 4px;}
#kanbans .kanban-card[data-scale-size="3"] > .title {white-space: normal; max-height: 100%;}
#kanbans .kanban-card[data-scale-size="2"] {padding: 3px 4px;}
#kanbans .kanban-card[data-scale-size="2"] > .title {line-height: 18px; white-space: normal; max-height: 100%;}
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos {display: inline-block; height: 18px; vertical-align: top;}
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .info-pri {transform: scale(.8); vertical-align: top;}
#kanbans .kanban-card[data-scale-size="2"] > .title > .infos > .avatar {display: inline-block; transform: scale(.8); position: relative; top: -1px; vertical-align: top; margin-right: -1px;}
#kanbanScaleControl {width: 100px;}
#kanbanScaleControl .input-group-addon {background: #fff; padding: 5px;}
#kanbanScaleControl > .input-group-btn:first-child > .btn {border-radius: 16px 0 0 16px; border-right-color: transparent;}
#kanbanScaleControl > .input-group-btn:last-child > .btn {border-radius: 0 16px 16px 0; border-left-color: transparent;}
#kanbanScaleControl > .input-group-btn > .btn:hover {border-color: #b8bfce;}
#type_chosen .icon-kanban {padding-right: 10px; font-size: 15px;}
+3 -2
View File
@@ -157,8 +157,8 @@ $(function()
$('#kanban').kanban(
{
data: processKanbanData(),
// noLaneName: true,
data: processKanbanData(),
laneNameWidth: 5,
droppable:
{
selector: '.kanban-item:not(.kanban-item-span)',
@@ -166,5 +166,6 @@ $(function()
finish: handleFinishDrop,
mouseButton: 'left'
},
virtualize: true
});
});
+195 -106
View File
@@ -9,9 +9,10 @@ function changeView(view)
* @param {String|{account: string, avatar: string}} user User account or user object
* @returns {string}
*/
function renderUserAvatar(user, objectType, objectID)
function renderUserAvatar(user, objectType, objectID, size)
{
var $noPrivAndNoAssigned = $('<div class="avatar has-text avatar-sm avatar-circle" title="' + noAssigned + '" style="background: #ccc"><i class="icon icon-account"></i></div>');
var avatarSizeClass = 'avatar-' + (size || 'sm');
var $noPrivAndNoAssigned = $('<div class="avatar has-text ' + avatarSizeClass + ' avatar-circle" title="' + noAssigned + '" style="background: #ccc"><i class="icon icon-person"></i></div>');
if(objectType == 'task')
{
if(!priv.canAssignTask && !user) return $noPrivAndNoAssigned;
@@ -28,17 +29,17 @@ function renderUserAvatar(user, objectType, objectID)
var link = createLink('bug', 'assignto', 'id=' + objectID, '', true);
}
if(!user) return $('<a class="avatar has-text avatar-sm avatar-circle iframe" title="' + noAssigned + '" style="background: #ccc" href="' + link + '"><i class="icon icon-account"></i></a>');
if(!user) return $('<a class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" title="' + noAssigned + '" style="background: #ccc" href="' + link + '"><i class="icon icon-person"></i></a>');
if(typeof user === 'string') user = {account: user};
if(!user.avatar && window.userList && window.userList[user.account]) user = window.userList[user.account];
var $noPrivAvatar = $('<div class="avatar has-text avatar-sm avatar-circle" />').avatar({user: user});
var $noPrivAvatar = $('<div class="avatar has-text ' + avatarSizeClass + ' avatar-circle" />').avatar({user: user});
if(objectType == 'task' && !priv.canAssignTask) return $noPrivAvatar;
if(objectType == 'story' && !priv.canAssignStory) return $noPrivAvatar;
if(objectType == 'bug' && !priv.canAssignBug) return $noPrivAvatar;
return $('<a class="avatar has-text avatar-sm avatar-circle iframe" href="' + link + '"/>').avatar({user: user});
return $('<a class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" href="' + link + '"/>').avatar({user: user});
}
/**
@@ -71,43 +72,56 @@ function renderDeadline(deadline)
*/
function renderStoryItem(item, $item, col)
{
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%"><i class="icon icon-lightbulb text-muted"></i> <span class="text"></span></a>')
.attr('href', $.createLink('story', 'view', 'storyID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.title).find('.text').text(item.title);
var scaleSize = window.kanbanScaleSize;
if(+$item.attr('data-scale-size') !== scaleSize) $item.empty().attr('data-scale-size', scaleSize);
var $infos = $item.find('.infos');
if(!$infos.length)
if(scaleSize <= 3)
{
$infos = $('<div class="infos"></div>').appendTo($item);
}
$infos.html(
[
'<span class="info info-id text-muted">#' + item.id + '</span>',
'<span class="info info-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>',
item.estimate ? '<span class="info info-estimate text-muted">' + item.estimate + 'h</span>' : '',
].join(''));
$infos.append(renderUserAvatar(item.assignedTo, 'story', item.id));
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="story" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%">' + (scaleSize <= 1 ? '<i class="icon icon-lightbulb text-muted"></i> ' : '') + '<span class="text"></span></a>')
.attr('href', $.createLink('story', 'view', 'storyID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.title).find('.text').text(item.title);
}
$item.attr('data-type', 'story').addClass('kanban-item-story');
if(scaleSize <= 2)
{
var idHtml = scaleSize <= 1 ? ('<span class="info info-id text-muted">#' + item.id + '</span>') : '';
var priHtml = '<span class="info info-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>';
var hoursHtml = (item.estimate && scaleSize <= 1) ? ('<span class="info info-estimate text-muted">' + item.estimate + 'h</span>') : '';
var avatarHtml = renderUserAvatar(item.assignedTo, 'story', item.id);
var $infos = $item.find('.infos');
if(!$infos.length) $infos = $('<div class="infos"></div>');
$infos.html([idHtml, priHtml, hoursHtml].join(''));
return $item;
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
if(scaleSize <= 1) $infos.appendTo($item);
else $infos.prependTo($item.find('.title'));
}
else if(scaleSize === 4)
{
$item.html(renderUserAvatar(item.assignedTo, 'story', item.id, 'md'));
}
if(scaleSize <= 1)
{
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="story" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
}
}
return $item.attr('data-type', 'story').addClass('kanban-item-story');
}
/**
@@ -119,44 +133,58 @@ function renderStoryItem(item, $item, col)
*/
function renderBugItem(item, $item, col)
{
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%"><i class="icon icon-bug text-muted"></i> <span class="text"></span></a>')
.attr('href', $.createLink('bug', 'view', 'bugID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.title).find('.text').text(item.title);
var scaleSize = window.kanbanScaleSize;
if(+$item.attr('data-scale-size') !== scaleSize) $item.empty().attr('data-scale-size', scaleSize);
var $infos = $item.find('.infos');
if(!$infos.length)
if(scaleSize <= 3)
{
$infos = $('<div class="infos"></div>').appendTo($item);
}
$infos.html(
[
'<span class="info info-id text-muted">#' + item.id + '</span>',
'<span class="info info-severity label-severity" data-severity="' + item.severity + '" title="' + item.severity + '"></span>',
'<span class="info info-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>',
].join(''));
if(item.deadline) $infos.append(renderDeadline(item.deadline));
$infos.append(renderUserAvatar(item.assignedTo, 'bug', item.id));
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="bug" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%">' + (scaleSize <= 1 ? '<i class="icon icon-bug text-muted"></i> ' : '') + '<span class="text"></span></a>')
.attr('href', $.createLink('bug', 'view', 'bugID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.title).find('.text').text(item.title);
}
$item.attr('data-type', 'bug').addClass('kanban-item-bug');
if(scaleSize <= 2)
{
var idHtml = scaleSize <= 1 ? ('<span class="info info-id text-muted">#' + item.id + '</span>') : '';
var severityHtml = scaleSize <= 1 ? ('<span class="info info-severity label-severity" data-severity="' + item.severity + '" title="' + item.severity + '"></span>') : '';
var priHtml = '<span class="info info-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>';
var avatarHtml = renderUserAvatar(item.assignedTo, 'bug', item.id);
return $item;
var $infos = $item.find('.infos');
if(!$infos.length) $infos = $('<div class="infos"></div>');
$infos.html([idHtml, severityHtml, priHtml].join(''));
if(item.deadline && scaleSize <= 1) $infos.append(renderDeadline(item.deadline));
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
if(scaleSize <= 1) $infos.appendTo($item);
else $infos.prependTo($item.find('.title'));
}
else if(scaleSize === 4)
{
$item.html(renderUserAvatar(item.assignedTo, 'bug', item.id, 'md'));
}
if(scaleSize <= 1)
{
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="bug" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
}
}
return $item.attr('data-type', 'bug').addClass('kanban-item-bug');
}
/**
@@ -168,39 +196,55 @@ function renderBugItem(item, $item, col)
*/
function renderTaskItem(item, $item, col)
{
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%"><i class="icon icon-checked text-muted"></i> <span class="text"></span></a>')
.attr('href', $.createLink('task', 'view', 'taskID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.name).find('.text').text(item.name);
var scaleSize = window.kanbanScaleSize;
if(+$item.attr('data-scale-size') !== scaleSize) $item.empty().attr('data-scale-size', scaleSize);
var $infos = $item.find('.infos');
if(!$infos.length)
if(scaleSize <= 3)
{
$infos = $('<div class="infos"></div>').appendTo($item);
var $title = $item.find('.title');
if(!$title.length)
{
$title = $('<a class="title iframe" data-width="95%">' + (scaleSize <= 1 ? '<i class="icon icon-checked text-muted"></i> ' : '') + '<span class="text"></span></a>')
.attr('href', $.createLink('task', 'view', 'taskID=' + item.id, '', true));
$title.appendTo($item);
}
$title.attr('title', item.name).find('.text').text(item.name);
}
$infos.html(
[
'<span class="info info-id text-muted">#' + item.id + '</span>',
'<span class="info i nfo-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>',
item.estimate ? '<span class="info info-estimate text-muted">' + item.estimate + 'h</span>' : '',
].join(''));
if(item.deadline) $infos.append(renderDeadline(item.deadline));
$infos.append(renderUserAvatar(item.assignedTo, 'task', item.id));
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
if(scaleSize <= 2)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="task" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
var idHtml = scaleSize <= 1 ? ('<span class="info info-id text-muted">#' + item.id + '</span>') : '';
var priHtml = '<span class="info info-pri label-pri label-pri-' + item.pri + '" title="' + item.pri + '">' + item.pri + '</span>';
var hoursHtml = (item.estimate && scaleSize <= 1) ? ('<span class="info info-estimate text-muted">' + item.estimate + 'h</span>') : '';
var avatarHtml = renderUserAvatar(item.assignedTo, 'task', item.id);
var $infos = $item.find('.infos');
if(!$infos.length) $infos = $('<div class="infos"></div>');
$infos.html([idHtml, priHtml, hoursHtml].join(''));
if(item.deadline && scaleSize <= 1) $infos.append(renderDeadline(item.deadline));
$infos[scaleSize <= 1 ? 'append' : 'prepend'](avatarHtml);
if(scaleSize <= 1) $infos.appendTo($item);
else $infos.prependTo($item.find('.title'));
}
else if(scaleSize === 4)
{
$item.html(renderUserAvatar(item.assignedTo, 'task', item.id, 'md'));
}
if(scaleSize <= 1)
{
var $actions = $item.find('.actions');
if(!$actions.length && item.menus.length)
{
$actions = $([
'<div class="actions">',
'<a data-contextmenu="task" data-col="' + col.type + '">',
'<i class="icon icon-ellipsis-v"></i>',
'</a>',
'</div>'
].join('')).appendTo($item);
}
}
$item.attr('data-type', 'task').addClass('kanban-item-task');
@@ -737,20 +781,57 @@ $.extend($.fn.kanban.Constructor.DEFAULTS,
}
});
/** Get card height */
function getCardHeight()
{
return [59, 59, 62, 62, 47][window.kanbanScaleSize];
}
/** Change kanban scale size */
function changeKanbanScaleSize(newScaleSize)
{
var newScaleSize = Math.max(1, Math.min(4, newScaleSize));
if(newScaleSize === window.kanbanScaleSize) return;
window.kanbanScaleSize = newScaleSize;
$.zui.store.set('executionKanbanScaleSize', newScaleSize);
$('#kanbanScaleSize').text(newScaleSize);
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', newScaleSize >= 4 ? 'disabled' : null);
$('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', newScaleSize <= 1 ? 'disabled' : null);
$('#kanbans').children('.kanban').each(function()
{
var kanban = $(this).data('zui.kanban');
if(!kanban) return;
kanban.setOptions({cardsPerRow: newScaleSize, cardHeight: getCardHeight()});
});
return newScaleSize;
}
/* Example code: */
$(function()
{
$.cookie('isFullScreen', 0);
window.kanbanScaleSize = +$.zui.store.get('executionKanbanScaleSize', 1);
$('#kanbanScaleSize').text(window.kanbanScaleSize);
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
$('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null);
/* Common options 用于初始化看板的通用选项 */ 
var commonOptions =
{
maxColHeight: 'auto',
minColWidth: 240,
maxColWidth: 240,
showCount: true,
showZeroCount: true,
fluidBoardWidth: true,
maxColHeight: 'auto',
minColWidth: 240,
maxColWidth: 240,
cardHeight: getCardHeight(),
showCount: true,
showZeroCount: true,
fluidBoardWidth: false,
cardsPerRow: window.kanbanScaleSize,
virtualize: true,
virtualRenderOptions: {container: '#kanbanContainer>.panel-body'},
droppable:
{
target: findDropColumns,
@@ -806,6 +887,12 @@ $(function()
$.zui.ContextMenu.show(items, items.$options || {event: event});
});
/* Make kanbanScaleControl works */
$('#kanbanScaleControl').on('click', '.btn', function()
{
changeKanbanScaleSize(window.kanbanScaleSize + ($(this).data('type') === '+' ? 1 : -1));
});
/* Resize kanban container on window resize */
resizeKanbanContainer();
$(window).on('resize', resizeKanbanContainer);
@@ -823,18 +910,20 @@ $(function()
{
location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID + '&productID=0&fromMethod=kanban');
}
})
});
$('#type_chosen .chosen-single span').prepend('<i class="icon-kanban"></i>');
$('#group_chosen .chosen-single span').prepend(kanbanLang.laneGroup + ': ');
/* Ajax update kanban. */
var lastUpdateData;
setInterval(function()
{
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=" + entertime + "&browseType=" + browseType + "&groupBy=" + groupBy), function(data)
{
if(data)
if(data && lastUpdateData !== lastUpdateData)
{
lastUpdateData = data;
kanbanGroup = $.parseJSON(data);
if(groupBy == 'default')
{
+1
View File
@@ -395,6 +395,7 @@ $lang->execution->bugList = "Bugs";
$lang->execution->kanbanHideCols = 'Closed & Cancelled Columns';
$lang->execution->kanbanShowOption = 'Unfold';
$lang->execution->kanbanColsColor = 'Customize Column Color';
$lang->execution->kanbanCardsUnit = 'X';
$lang->execution->kanbanViewList['all'] = 'All';
$lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}";
+1
View File
@@ -396,6 +396,7 @@ $lang->execution->bugList = "Bug列表";
$lang->execution->kanbanHideCols = '看板隐藏已关闭、已取消列';
$lang->execution->kanbanShowOption = '显示折叠信息';
$lang->execution->kanbanColsColor = '看板列自定义颜色';
$lang->execution->kanbanCardsUnit = '个';
$lang->execution->kanbanViewList['all'] = '综合看板';
$lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}看板";
+12 -1
View File
@@ -21,6 +21,17 @@
</div>
<?php endif;?>
</div>
<div class='input-group pull-left not-fix-input-group' id='kanbanScaleControl'>
<span class='input-group-btn'>
<button class='btn btn-icon' type='button' data-type='-'><i class='icon icon-minuse-solid-circle text-muted'></i></button>
</span>
<span class='input-group-addon'>
<span id='kanbanScaleSize'>1</span><?php echo $lang->execution->kanbanCardsUnit; ?>
</span>
<span class='input-group-btn'>
<button class='btn btn-icon' type='button' data-type='+'><i class='icon icon-plus-solid-circle text-muted'></i></button>
</span>
</div>
<div class='btn-toolbar pull-right'>
<?php
$link = $this->createLink('task', 'export', "execution=$executionID&orderBy=$orderBy&type=kanban");
@@ -52,7 +63,7 @@
if(common::hasPriv('execution', 'printKanban')) echo '<li>' .html::a($this->createLink('execution', 'printKanban', "executionID=$executionID"), "<i class='icon-printer muted'></i> " . $lang->execution->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->execution->printKanban}' data-width='500'") . '</li>';
echo '<li>' .html::a('javascript:fullScreen()', "<i class='icon-fullscreen muted'></i> " . $lang->execution->fullScreen, '', "class='btn btn-link' title='{$lang->execution->fullScreen}' data-width='500'") . '</li>';
echo '</ul></div>';
?>
?>
<?php
$checkObject = new stdclass();
$checkObject->execution = $executionID;
+27 -4
View File
@@ -10,12 +10,28 @@ function processKanbanData(key, programsData)
/* Generate columns */
var columns = [];
var hasDoingProject = false;
$.each(kanbanColumns, function(_, column)
{
var colType = column.type;
if(colType === 'doingProject')
{
hasDoingProject = true;
columns.push(
{
kanban: kanbanId,
id: kanbanId + '-doing',
type: 'doing',
asParent: true,
name: doingText,
count: ''
});
}
columns.push($.extend({}, column,
{
kanban: kanbanId,
id: kanbanId + '-' + column.type,
kanban: kanbanId,
id: kanbanId + '-' + colType,
parentType: (hasDoingProject && (colType === 'doingProject' || colType === 'doingExecution')) ? 'doing' : false,
}));
});
@@ -45,7 +61,7 @@ function processKanbanData(key, programsData)
}
/* doing projects */
if(kanbanColumns.doingProject)
if(hasDoingProject)
{
items.doingProject = [];
var productProjects = projectProduct[productID];
@@ -69,6 +85,7 @@ function processKanbanData(key, programsData)
/* doing execution */
items.doingExecution = [];
var productExecutions = classicExecution[productID];
console.log('productExecutions', productID, productExecutions);
if(productExecutions)
{
$.each(productExecutions, function(_, execution)
@@ -106,6 +123,12 @@ function processKanbanData(key, programsData)
return {id: kanbanId, columns: columns, lanes: lanes};
}
/** Calculate column height */
function calcColHeight(col, lane, colCards, colHeight)
{
if (col.type !== 'doingProject') return colHeight;
return colCards.length * 62;
}
$(function()
{
@@ -115,6 +138,6 @@ $(function()
var $kanban = $('#kanban-' + key);
if(!$kanban.length) return;
var data = processKanbanData(key, programsData);
$kanban.kanban({data: data, noLaneName: isClassicMode});
$kanban.kanban({data: data, noLaneName: isClassicMode, calcColHeight: calcColHeight});
});
});
+1 -1
View File
@@ -50,7 +50,7 @@ $userPrivs['project'] = common::hasPriv('project', 'index');
$userPrivs['execution'] = common::hasPriv('execution', 'task');
$userPrivs['release'] = common::hasPriv('release', 'view');
js::set('isClassicMode', $config->systemMode != 'new');
js::set('kanbanColumns', $kanbanColumns);
js::set('kanbanColumns', array_values($kanbanColumns));
js::set('userPrivs', $userPrivs);
js::set('kanbanList', $kanbanList);
js::set('programList', $programList);
+18 -3
View File
@@ -12,10 +12,25 @@ function processKanbanData(key, programsData)
var columns = [];
$.each(kanbanColumns, function(_, column)
{
var colType = column.type;
if(colType === 'doingProject')
{
columns.push(
{
kanban: kanbanId,
id: kanbanId + '-doing',
type: 'doing',
asParent: true,
name: doingText,
count: ''
});
}
columns.push($.extend({}, column,
{
kanban: kanbanId,
id: kanbanId + '-' + column.type,
kanban: kanbanId,
id: kanbanId + '-' + column.type,
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
}));
});
@@ -107,6 +122,6 @@ $(function()
{
var $kanban = $('#kanban-' + key);
if(!$kanban.length) return;
$kanban.kanban({data: processKanbanData(key, programsData)});
$kanban.kanban({data: processKanbanData(key, programsData), virtualize: true});
});
});
+1 -1
View File
@@ -43,7 +43,7 @@ $userPrivs['productplan'] = common::hasPriv('productplan', 'view');
$userPrivs['project'] = common::hasPriv('project', 'index');
$userPrivs['execution'] = common::hasPriv('execution', 'task');
$userPrivs['release'] = common::hasPriv('release', 'view');
js::set('kanbanColumns', $kanbanColumns);
js::set('kanbanColumns', array_values($kanbanColumns));
js::set('userPrivs', $userPrivs);
js::set('kanbanGroup', $kanbanGroup);
js::set('doingText', $lang->program->statusList['doing']);
+27 -5
View File
@@ -12,10 +12,25 @@ function processKanbanData(key, programGroup)
var columns = [];
$.each(kanbanColumns, function(_, column)
{
var colType = column.type;
if(colType === 'doingProject')
{
columns.push(
{
kanban: kanbanId,
id: kanbanId + '-doing',
type: 'doing',
asParent: true,
name: doingText,
count: ''
});
}
columns.push($.extend({}, column,
{
kanban: kanbanId,
id: kanbanId + '-' + column.type,
kanban: kanbanId,
id: kanbanId + '-' + column.type,
parentType: (colType === 'doingProject' || colType === 'doingExecution') ? 'doing' : false,
}));
});
/* Format lanes data */
@@ -68,7 +83,6 @@ function findDropColumns($element, $root)
var col = $col.data();
var lane = $col.closest('.kanban-lane').data();
var kanbanID = $root.data('id');
console.log('findDropColumns', {$element, $root, kanbanID, col, lane});
var kanbanRules = window.kanbanDropRules ? window.kanbanDropRules[kanbanID] : null;
if(!kanbanRules) return $root.find('.kanban-lane[data-id="' + lane.id + '"] .kanban-lane-col:not([data-type="doingExecution"],[data-type="' + col.type + '"])');
@@ -162,6 +176,13 @@ function handleFinishDrop(event)
changeCardColType(card, fromColType, toColType, kanbanID);
}
/** Calculate column height */
function calcColHeight(col, lane, colCards, colHeight)
{
if (col.type !== 'doingProject') return colHeight;
return colCards.length * 62;
}
$(function()
{
/* Init all kanbans */
@@ -171,8 +192,9 @@ $(function()
if(!$kanban.length) return;
$kanban.kanban(
{
data: processKanbanData(key, programGroup),
maxColHeight: 'auto',
data: processKanbanData(key, programGroup),
calcColHeight: calcColHeight,
virtualize: true,
droppable:
{
selector: '.kanban-item:not(.execution-item)',
+1 -1
View File
@@ -38,7 +38,7 @@ $kanbanColumns['closedProject'] = array('name' => $lang->project->closedProject
$userPrivs = array();
$userPrivs['project'] = common::hasPriv('project', 'index');
$userPrivs['execution'] = common::hasPriv('execution', 'task');
js::set('kanbanColumns', $kanbanColumns);
js::set('kanbanColumns', array_values($kanbanColumns));
js::set('userPrivs', $userPrivs);
js::set('kanbanGroup', $kanbanGroup);
js::set('latestExecutions', $latestExecutions);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4 -5
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5 -1
View File
@@ -136,7 +136,7 @@
<glyph unicode="&#xe971;" glyph-name="treemap-alt" d="M410.864 663.701v-202.271h202.271v202.271h-202.271zM549.928 82.171h37.927c27.928 0 50.568-22.64 50.568-50.568v-151.704c0-27.928-22.64-50.568-50.568-50.568h-151.704c-27.928 0-50.568 22.64-50.568 50.568v151.704c0 27.928 22.64 50.568 50.568 50.568h37.927v143.659h-255.138v-143.659h40.225c27.928 0 50.568-22.64 50.568-50.568v-151.704c0-27.928-22.64-50.568-50.568-50.568h-151.704c-27.928 0-50.568 22.64-50.568 50.568v151.704c0 27.928 22.64 50.568 50.568 50.568h35.626v168.942c0 27.928 22.64 50.568 50.568 50.568h280.423v83.896h-63.21c-41.892 0-75.852 33.96-75.852 75.852v202.271c0 41.892 33.96 75.852 75.852 75.852h202.271c41.892 0 75.852-33.96 75.852-75.852v-202.271c0-41.892-33.96-75.852-75.852-75.852h-63.21v-83.896h280.423c27.928 0 50.568-22.64 50.568-50.568v-168.942h35.626c27.928 0 50.568-22.64 50.568-50.568v-151.704c0-27.928-22.64-50.568-50.568-50.568h-151.704c-27.928 0-50.568 22.64-50.568 50.568v151.704c0 27.928 22.64 50.568 50.568 50.568h40.225v143.659h-255.138v-143.659zM132.742 6.32v-101.137h101.137v101.137h-101.137zM790.123 6.32v-101.137h101.137v101.137h-101.137zM461.432 6.32v-101.137h101.137v101.137h-101.137z" />
<glyph unicode="&#xe972;" glyph-name="fullscreen-exit" d="M637.387 167.182h313.469v-125.387h-188.082v-188.082h-125.387v313.469zM73.143 167.182h313.469v-313.469h-125.387v188.082h-188.082v125.387zM261.224 731.427h125.387v-313.469h-313.469v125.387h188.082v188.082zM950.857 543.345v-125.387h-313.469v313.469h125.387v-188.082h188.082z" />
<glyph unicode="&#xe973;" glyph-name="severity" d="M181.734 318.751c-39.401-79.447-56.602-133.939-57.401-204.115-1.892-166.082 165.156-306.765 390.691-298.78 217.314 7.694 384.594 179.734 384.661 351.255 0.044 112.949-41.602 227.76-111.617 321.908-6.808-33.102-21.504-64.526-46.52-87.481l-54.048-49.595-16.982 71.361c-30.889 129.8-114.427 252.919-193.722 306.709-15.011-138.585-84.741-306.571-201.813-418.57l-46.149-44.15-23.644 59.33c-3.099 7.778-3.628 12.197-4.519 25.254-0.041 0.605-0.141 2.182-0.267 4.17-8.080-16.231-18.382-36.713-18.669-37.293zM712.422 433.274c6.045 5.548 58.723 83.177 19.681 179.293 122.818-106.638 210.724-272.732 210.657-445.474s-163.607-384.99-426.213-394.287c-262.606-9.296-437.341 162.127-435.289 342.32s117.319 275.051 123.535 389.243c22.508-31.044 31.313-72.123 35.266-105.245 0-7.933 1.714-26.787 5.144-56.558 26.56 25.99 39.752 40.054 39.577 42.191 120.433 142.858 154.342 328.667 151.832 411.688 204.616-86.152 273.83-354.848 275.811-363.172z" />
<glyph unicode="&#xe974;" glyph-name="plus-solid-circle" d="M874.015 653.079c-96.701 96.231-225.226 149.231-361.97 149.231s-265.316-53-362.025-149.23-150.020-224.308-150.020-360.504c0-136.197 53.285-264.25 150.019-360.513s225.234-149.23 361.993-149.23c136.757 0 265.305 52.942 361.969 149.228s150.019 224.354 150.019 360.55c0 136.196-53.205 264.205-149.985 360.468l0.001 0.001zM768.061 255.999h-219.44v-219.451c0-20.2-16.376-36.577-36.576-36.577s-36.577 16.377-36.577 36.576v219.453h-219.452c-20.2 0-36.576 16.376-36.576 36.576s16.376 36.577 36.576 36.577h219.451v219.441c0 20.2 16.376 36.576 36.576 36.576 20.202 0 36.577-16.376 36.577-36.576v-219.451h219.44c20.2 0 36.576-16.377 36.576-36.576s-16.376-36.578-36.576-36.578l0.001 0.011z" />
<glyph unicode="&#xe974;" glyph-name="plus-solid-circle" d="M874.015 653.078c-96.701 96.231-225.226 149.231-361.97 149.231s-265.316-53-362.025-149.23-150.020-224.308-150.020-360.504c0-136.197 53.285-264.25 150.019-360.513s225.234-149.23 361.993-149.23c136.757 0 265.305 52.942 361.969 149.228s150.019 224.354 150.019 360.55c0 136.196-53.205 264.205-149.985 360.468l0.001 0.001zM768.061 255.998h-219.44v-219.451c0-20.2-16.376-36.577-36.576-36.577s-36.577 16.377-36.577 36.576v219.453h-219.452c-20.2 0-36.576 16.376-36.576 36.576s16.376 36.577 36.576 36.577h219.451v219.441c0 20.2 16.376 36.576 36.576 36.576 20.202 0 36.577-16.376 36.577-36.576v-219.451h219.44c20.2 0 36.576-16.377 36.576-36.576s-16.376-36.578-36.576-36.578l0.001 0.011z" />
<glyph unicode="&#xe975;" glyph-name="s" d="M517.12-193.829c-133.12 0-247.040 53.76-328.96 139.52l71.68 80.64c66.56-70.4 161.28-116.48 258.56-116.48 122.88 0 197.12 61.44 197.12 153.6 0 96-67.84 126.72-156.16 166.4l-135.68 58.88c-87.040 37.12-190.72 103.68-190.72 240.64 0 144.64 125.44 249.6 295.68 249.6 111.36 0 209.92-47.36 276.48-116.48l-62.72-75.52c-57.6 53.76-126.72 88.32-213.76 88.32-106.24 0-175.36-53.76-175.36-138.24 0-90.88 81.92-125.44 154.88-156.16l134.4-57.6c108.8-47.36 193.28-111.36 193.28-250.88 0-148.48-122.88-266.24-318.72-266.24z" />
<glyph unicode="&#xe976;" glyph-name="c" d="M572.16-193.829c-232.96 0-408.32 180.48-408.32 485.12 0 303.36 177.92 487.68 416 487.68 113.92 0 203.52-56.32 257.28-116.48l-64-76.8c-48.64 52.48-111.36 89.6-192 89.6-177.92 0-295.68-145.92-295.68-380.16 0-236.8 112.64-385.28 291.84-385.28 89.6 0 157.44 39.68 217.6 104.96l65.28-74.24c-74.24-85.76-166.4-134.4-288-134.4z" />
<glyph unicode="&#xe977;" glyph-name="t" d="M453.146-171.935v829.022h-280.982v99.989h679.672v-99.989h-280.982v-829.022z" />
@@ -195,10 +195,14 @@
<glyph unicode="&#xe9ac;" glyph-name="estimate" d="M146.286 694.857v-573.030h438.356v573.030h-438.356zM73.143 694.857c0 40.396 32.747 73.143 73.143 73.143h438.356c40.397 0 73.143-32.747 73.143-73.143v-115.939l1.591-0.519 228.535-72.96c47.557-15.183 74.39-65.772 58.544-113.697l-169.355-512.121c-15.846-47.927-67.818-73.355-115.379-58.174l-312.729 99.84c-47.558 15.184-74.392 65.774-58.543 113.697l1.812 5.482h0.002l2.827 8.218h-148.804c-40.396 0-73.143 32.75-73.143 73.143v573.030zM657.785 121.826c0-40.393-32.746-73.143-73.143-73.143h-212.22l-10.687-31.078-1.608-4.864c-2.858-8.645 1.815-18.812 11.831-22.009l312.73-99.84c10.013-3.196 19.877 2.33 22.736 10.971l169.351 512.124c2.86 8.642-1.814 18.809-11.827 22.005l-207.163 66.137v-380.304zM441.563 309.233c-26.503 0-49.006 14.142-57.757 34.348-0.541 1.093-0.987 2.081-1.386 2.955-1.434 3.171-2.209 4.875-4.363 4.875-2.344 0-2.271-5.109-2.253-6.371 0-0.080 0.004-0.15 0.004-0.197 2.249-36.871 15.002-56.068 34.501-72.989 3.752-3.533 1.251-7.069 0-7.069h-89.761c-1.25 0-4.25 3.536 0 7.069 19.503 16.417 32.504 36.118 34.505 72.989 0 0.048 0.001 0.117 0.002 0.197 0.018 1.262 0.093 6.371-2.252 6.371-2.349 0-3.012-1.551-4.39-4.769-0.381-0.892-0.818-1.909-1.36-3.061-8.751-20.458-31.254-34.348-57.758-34.348-41.506 0-70.009 36.118-70.009 77.283 0 48.446 37.347 83.783 62.925 107.983 1.223 1.157 2.42 2.289 3.584 3.396 31.254 30.054 66.259 69.454 79.010 89.406 0.25 0.758 1.001 0.758 1.25 0 12.504-19.952 47.759-59.351 79.013-89.406 1.192-1.134 2.414-2.293 3.664-3.477 25.772-24.396 62.844-59.485 62.844-107.902 0-40.912-28.255-77.283-70.012-77.283z" />
<glyph unicode="&#xe9ad;" glyph-name="summary" d="M659.195 733.31h-289.059c-17.315 0.357-31.642-13.39-31.999-30.707 0-0.004 0-0.009 0-0.013v0c0.371-15.846 12.584-28.885 28.373-30.292h292.687c16.907-1.412 31.758 11.148 33.17 28.055s-11.148 31.758-28.055 33.17c-1.702 0.142-3.413 0.142-5.116 0l-0.001-0.213zM684.582 384.092v0c10.306 0.011 20.198-4.053 27.519-11.306v0c13.792-13.715 14.989-35.636 2.774-50.772l-2.774-3.2-221.434-218.234c-7.295-7.293-17.204-11.365-27.519-11.307v0c-8.737 0.013-17.22 2.941-24.106 8.321l-2.56 2.986-126.29 124.797c-14.844 14.646-15.006 38.553-0.36 53.398 0.12 0.121 0.239 0.241 0.361 0.361v0c14.189 14.194 36.771 15.48 52.479 2.986l3.2-2.986 98.558-97.491 193.275 191.996c5.147 5.141 11.664 8.695 18.773 10.239h4.267l3.84 0.214zM270.938 666.326h-103.463c-3.622 0.058-6.845-2.293-7.893-5.761v-801.26c0.205-3.53 2.733-6.494 6.186-7.253h690.756c3.683-0.033 6.925 2.421 7.893 5.974v800.833c-0.205 3.53-2.733 6.494-6.186 7.253h-98.984v-1.92c-16.145-37.137-51.929-61.93-92.371-63.999h-296.738c-41.191-0.331-78.892 23.086-96.851 60.158l-2.347 5.974zM659.195 804.566v0c40.579 0.399 77.87-22.258 96.21-58.458l2.133-5.12 1.493-3.413h2.774l1.28 4.907v-4.907h93.438c40.965 0.968 76.212-28.785 82.131-69.332v-808.939c-0.758-42.499-34.539-77.029-77.011-78.718h-694.169c-42.608-0.826-78.541 31.561-82.131 74.025v804.246c0.863 42.455 34.585 76.924 77.011 78.718h107.944c14.302 37.13 48.298 63.039 87.891 66.991h301.005z" />
<glyph unicode="&#xe9ae;" glyph-name="assets, diamond" d="M537.647-135.797l-0.893-0.844c-0.136-0.126-0.273-0.25-0.411-0.373l-0.421-0.369c-0.376-0.325-0.759-0.641-1.147-0.95-0.056-0.052-0.12-0.103-0.184-0.153l-0.676-0.51c-0.181-0.135-0.363-0.269-0.547-0.401-0.216-0.168-0.418-0.311-0.621-0.451l-0.531-0.344c-0.184-0.122-0.369-0.242-0.556-0.361-0.509-0.333-1.040-0.653-1.581-0.959-0.403-0.24-0.79-0.45-1.179-0.653l-0.433-0.203c-0.191-0.097-0.384-0.191-0.577-0.284-0.106-0.056-0.232-0.115-0.359-0.174l-0.832-0.374c-0.935-0.411-1.887-0.783-2.855-1.115l-0.282-0.093-0.773-0.251c-0.848-0.263-1.706-0.495-2.573-0.696l-0.777-0.169-1.534-0.289c-0.633-0.104-1.27-0.192-1.909-0.262-0.23-0.024-0.462-0.048-0.693-0.069l-1.097-0.084c-0.657-0.040-1.316-0.062-1.977-0.066-0.157 0.009-0.34 0.009-0.524 0.010-0.61-0.005-1.208 0.015-1.805 0.049-0.67 0.040-1.34 0.097-2.011 0.174-0.663 0.074-1.325 0.168-1.983 0.28-0.69 0.119-1.386 0.258-2.081 0.419-0.814 0.185-1.611 0.397-2.399 0.636-0.314 0.098-0.654 0.205-0.993 0.319l-0.354 0.118c-0.905 0.313-1.797 0.66-2.673 1.042l3.027-1.16c-1.504 0.501-2.954 1.091-4.346 1.761-0.174 0.088-0.366 0.183-0.558 0.28-0.147 0.055-0.29 0.129-0.433 0.203l-1.179 0.653c-0.515 0.292-1.020 0.595-1.516 0.91-0.267 0.178-0.539 0.355-0.808 0.536-0.4 0.254-0.808 0.541-1.212 0.838l-0.008 0.018-0.967 0.725c-0.077 0.060-0.153 0.121-0.229 0.181-0.341 0.279-0.687 0.564-1.027 0.857-1.331 1.147-2.598 2.408-3.789 3.782l2.759-2.864-0.77 0.733c-0.070 0.069-0.141 0.139-0.21 0.209-0.472 0.471-0.951 0.976-1.416 1.495l-0.363 0.427-475.429 548.571c-0.228 0.263-0.452 0.528-0.671 0.795l-0.56 0.704-0.451 0.58c-0.661 0.876-1.274 1.768-1.841 2.672l2.292-3.252c-1.023 1.316-1.942 2.679-2.759 4.081-5.431 9.112-6.224 19.464-3.467 28.701 0.225 0.741 0.467 1.477 0.732 2.205 0.188 0.506 0.383 1.005 0.589 1.499 0.296 0.728 0.623 1.451 0.974 2.164 0.223 0.434 0.45 0.873 0.685 1.308 0.333 0.626 0.687 1.233 1.059 1.831 2.597 4.204 6.040 7.914 10.18 10.802l327.564 254.73c5.136 3.994 11.219 6.528 17.611 7.382l4.842 0.322h292.571c6.506 0 12.864-1.735 18.433-4.985l4.019-2.718 327.349-254.582c4.33-2.974 7.91-6.842 10.575-11.249 0.158-0.254 0.308-0.508 0.456-0.764 0.498-0.879 0.968-1.781 1.4-2.701 0.178-0.36 0.338-0.716 0.492-1.074 0.423-0.993 0.815-2.019 1.161-3.060 0.086-0.27 0.167-0.528 0.246-0.787 2.881-9.31 2.134-19.801-3.339-29.046-0.183-0.25-0.345-0.521-0.512-0.791-1.001-1.645-2.173-3.233-3.502-4.766l1.669 2.074c-0.144-0.192-0.29-0.384-0.438-0.575l-0.631-0.66-0.6-0.839-475.727-548.926c-0.408-0.458-0.827-0.906-1.256-1.341l-0.435-0.435zM644.063 402.285h-264.229l132.133-396.325 132.096 396.325zM302.778 402.285h-186.152l302.486-349.038-116.334 349.038zM907.337 402.285h-186.145l-116.297-348.928 302.442 348.928zM383.382 658.285h-5.16l-235.114-182.857h161.902l78.373 182.857zM561.009 658.285h-98.048l-78.409-182.857h254.83l-78.373 182.857zM645.742 658.285h-5.153l78.373-182.857h161.865l-235.085 182.857z" />
<glyph unicode="&#xe9af;" glyph-name="groups" d="M643.735 322.086c49.64 41.464 81.713 105.709 81.713 177.885 0 124.752-95.456 226.259-212.828 226.259s-212.828-101.508-212.828-226.259c0-72.176 32.067-136.419 81.713-177.885-130.839-55.583-223.589-191.435-223.589-350.057v-75.399c0-20.855 15.868-37.717 35.459-37.717h638.48c19.597 0 35.461 16.864 35.461 37.717v75.397c0 158.683-92.75 294.478-223.585 350.057l0.003 0.002zM359.017 507.242c0 89.489 68.606 162.237 152.985 162.237 84.374 0 152.982-72.75 152.982-162.237 0-89.468-68.61-162.237-152.982-162.237-84.379 0-152.985 72.741-152.985 162.237zM236.877-75.7l0.002 40.165c0 177.168 123.975 321.32 276.396 321.32 152.365 0 276.317-144.154 276.317-321.32v-40.165h-552.715zM101.013 468.391c0 103.39 75.564 187.516 168.454 187.516 2.805 0 5.397-0.767 8.123-0.911-2.627-4.229-5.135-8.549-7.526-12.947-13.684-19.967-24.426-42.548-31.502-66.95-40.575-14.589-84.946-56.698-84.946-106.676 0-44.106 23.3-84.155 59.343-102.363 13.343-5.633 22.754-19.026 22.754-34.678 0-16.208-10.094-30.008-24.193-35.259l-6.579-1.766c-89.827-25.252-152.387-114.163-152.387-217.82v-29.092h48.276c-4.453-24.23-6.791-40.7-6.791-66.391h-60.36c-18.637 0-33.679 16.763-33.679 37.498v57.99c-0.054 114.403 57.136 215.529 144.839 266.088-27.575 33.828-43.822 78.314-43.822 125.767l-0.002-0.004zM922.987 468.391c0 103.39-75.564 187.516-168.454 187.516-2.805 0-5.397-0.767-8.123-0.911 2.627-4.229 5.135-8.549 7.526-12.947 13.684-19.967 24.426-42.548 31.502-66.95 40.575-14.589 84.946-56.698 84.946-106.676 0-44.106-23.3-84.155-59.343-102.363-13.343-5.633-22.754-19.026-22.754-34.678 0-16.208 10.094-30.008 24.193-35.259l6.579-1.766c89.827-25.252 152.387-114.163 152.387-217.82v-29.092h-48.276c4.453-24.23 6.791-40.7 6.791-66.391h60.36c18.637 0 33.679 16.763 33.679 37.498v57.99c0.054 114.403-57.136 215.529-144.839 266.088 27.575 33.828 43.822 78.314 43.822 125.767l0.002-0.004z" />
<glyph unicode="&#xe9b0;" glyph-name="swap" horiz-adv-x="788" d="M301.518-113.905c12.612 5.237 20.521 16.994 20.521 30.675v812.202c0 18.277-14.964 33.241-33.241 33.241s-33.241-14.964-33.241-33.241v-731.398l-8.123 8.123-136.703 136.169c-6.306 6.306-14.536 9.726-23.514 9.726-8.871 0-17.208-3.527-23.514-9.726l-0.748-0.748c-12.185-13.147-11.971-33.561 0.748-46.28l201.367-201.581c9.833-9.619 23.728-12.398 36.447-7.161zM498.717 699.045c-12.612-5.237-20.521-16.994-20.521-30.675l0.107-812.202c0-18.277 14.964-33.241 33.241-33.241s33.241 14.964 33.241 33.241v731.292l8.123-8.123 136.382-136.062c12.933-12.933 33.989-12.933 46.922 0 6.413 6.52 9.726 14.964 9.726 23.514s-3.206 16.994-9.726 23.514l-201.367 201.581c-9.619 9.619-23.514 12.398-36.126 7.161v0z" />
<glyph unicode="&#xe9b1;" glyph-name="lane" d="M67.587-124.12v855.921c0 40.19 32.581 72.771 72.771 72.771 0 0 0 0 0 0h810.872c40.19 0 72.771-32.58 72.771-72.771v-855.921c0-40.19-32.581-72.771-72.771-72.771h-810.872c-40.19 0-72.771 32.581-72.771 72.771 0 0 0 0 0 0v0zM961.625 731.8v0c0 5.741-4.654 10.396-10.396 10.396h-810.872c-5.741 0-10.396-4.654-10.396-10.396v-855.921c0-5.741 4.654-10.396 10.396-10.396h810.872c5.741 0 10.396 4.654 10.396 10.396v855.921zM992.812 513.489v-62.375h-894.038v62.375h894.038zM992.812 128.845v-62.375h-894.038v62.375h894.038z" />
<glyph unicode="&#xe9b2;" glyph-name="side-right" d="M148.028 802.13v0c-80.406 0-145.588-65.182-145.588-145.588 0 0 0 0 0 0v-727.942c0-80.406 65.182-145.588 145.588-145.588 0 0 0 0 0 0h727.942c80.406 0 145.588 65.182 145.588 145.588 0 0 0 0 0 0v727.942c0 80.406-65.182 145.588-145.588 145.588 0 0 0 0 0 0h-727.942zM75.234 729.335h873.53v-873.53h-873.53v873.53zM584.793 656.541h291.177v-727.942h-291.177z" />
<glyph unicode="&#xe9b3;" glyph-name="side-left" d="M875.972 802.13v0c80.406 0 145.588-65.182 145.588-145.588 0 0 0 0 0 0v-727.942c0-80.406-65.182-145.588-145.588-145.588 0 0 0 0 0 0h-727.942c-80.406 0-145.588 65.182-145.588 145.588 0 0 0 0 0 0v727.942c0 80.406 65.182 145.588 145.588 145.588 0 0 0 0 0 0h727.942zM948.766 729.335h-873.53v-873.53h873.53v873.53zM439.207 656.541h-291.177v-727.942h291.177z" />
<glyph unicode="&#xe9b4;" glyph-name="list-box" horiz-adv-x="951" d="M0.002 804.571v-1024zM18.288 804.571v-1024zM36.574 804.571v-1024zM54.859 804.571v-1024zM73.145 804.571v-1024zM91.431 804.571v-1024zM109.717 804.571v-1024zM128.002 804.571v-1024zM146.288 804.571v-1024zM164.574 804.571v-1024zM182.859 804.571v-1024zM201.145 804.571v-1024zM219.431 804.571v-1024zM237.717 804.571v-1024zM256.002 804.571v-1024zM274.288 804.571v-1024zM292.574 804.571v-1024zM310.859 804.571v-1024zM329.145 804.571v-1024zM347.431 804.571v-1024zM365.717 804.571v-1024zM384.002 804.571v-1024zM402.288 804.571v-1024zM420.574 804.571v-1024zM438.859 804.571v-1024zM457.145 804.571v-1024zM475.431 804.571v-1024zM493.717 804.571v-1024zM512.002 804.571v-1024zM530.288 804.571v-1024zM548.574 804.571v-1024zM566.859 804.571v-1024zM585.145 804.571v-1024zM603.431 804.571v-1024zM621.717 804.571v-1024zM640.002 804.571v-1024zM658.288 804.571v-1024zM676.574 804.571v-1024zM694.859 804.571v-1024zM713.145 804.571v-1024zM731.431 804.571v-1024zM749.717 804.571v-1024zM768.002 804.571v-1024zM786.288 804.571v-1024zM804.574 804.571v-1024zM822.859 804.571v-1024zM841.145 804.571v-1024zM859.431 804.571v-1024zM877.717 804.571v-1024zM896.002 804.571v-1024zM914.288 804.571v-1024zM932.574 804.571v-1024zM-36.569 786.285h1024zM-36.569 768h1024zM-36.569 749.714h1024zM-36.569 731.428h1024zM-36.569 713.142h1024zM-36.569 694.857h1024zM-36.569 676.571h1024zM-36.569 658.285h1024zM-36.569 640h1024zM-36.569 621.714h1024zM-36.569 603.428h1024zM-36.569 585.142h1024zM-36.569 566.857h1024zM-36.569 548.571h1024zM-36.569 530.285h1024zM-36.569 512h1024zM-36.569 493.714h1024zM-36.569 475.428h1024zM-36.569 457.142h1024zM-36.569 438.857h1024zM-36.569 420.571h1024zM-36.569 402.285h1024zM-36.569 384h1024zM-36.569 365.714h1024zM-36.569 347.428h1024zM-36.569 329.142h1024zM-36.569 310.857h1024zM-36.569 292.571h1024zM-36.569 274.285h1024zM-36.569 256h1024zM-36.569 237.714h1024zM-36.569 219.428h1024zM-36.569 201.142h1024zM-36.569 182.857h1024zM-36.569 164.571h1024zM-36.569 146.285h1024zM-36.569 128h1024zM-36.569 109.714h1024zM-36.569 91.428h1024zM-36.569 73.142h1024zM-36.569 54.857h1024zM-36.569 36.571h1024zM-36.569 18.285h1024zM-36.569 0h1024zM-36.569-18.286h1024zM-36.569-36.572h1024zM-36.569-54.858h1024zM-36.569-73.143h1024zM-36.569-91.429h1024zM-36.569-109.715h1024zM-36.569-128h1024zM-36.569-146.286h1024zM-36.569-164.572h1024zM-36.569-182.858h1024zM-36.569-201.143h1024zM0.002 658.285c0 60.594 49.12 109.714 109.714 109.714h731.429c60.594 0 109.714-49.12 109.714-109.714v-731.429c0-60.594-49.12-109.714-109.714-109.714h-731.429c-60.594 0-109.714 49.12-109.714 109.714v731.429zM109.717 694.857c-20.199 0-36.571-16.375-36.571-36.571v-731.429c0-20.199 16.375-36.571 36.571-36.571h731.429c20.199 0 36.571 16.373 36.571 36.571v731.429c0 20.199-16.373 36.571-36.571 36.571h-731.429zM182.859 512c0 20.199 16.375 36.571 36.571 36.571s36.304-16.375 36.304-36.571c0-20.199-16.105-36.571-36.304-36.571s-36.571 16.375-36.571 36.571zM330.359 512c0 20.199 14.475 36.571 34.674 36.571h366.4c20.199 0 36.571-16.375 36.571-36.571s-16.373-36.571-36.571-36.571h-366.4c-20.199 0-34.674 16.375-34.674 36.571zM182.859 292.571c0 20.199 16.375 36.571 36.571 36.571s36.304-16.375 36.304-36.571c0-20.199-16.105-36.571-36.304-36.571s-36.571 16.375-36.571 36.571zM330.288 292.571c0 20.199 14.475 36.571 34.674 36.571h366.4c20.199 0 36.571-16.375 36.571-36.571s-16.373-36.571-36.571-36.571h-366.4c-20.199 0-34.674 16.375-34.674 36.571zM182.859 73.142c0 20.199 16.375 36.571 36.571 36.571s36.304-16.375 36.304-36.571c0-20.199-16.105-36.571-36.304-36.571s-36.571 16.375-36.571 36.571zM330.288 73.142c0 20.199 14.475 36.571 34.674 36.571h366.4c20.199 0 36.571-16.375 36.571-36.571s-16.373-36.571-36.571-36.571h-366.4c-20.199 0-34.674 16.375-34.674 36.571z" />
<glyph unicode="&#xe9b5;" glyph-name="chat-solid" horiz-adv-x="1117" d="M558.545-15.892l-245.011-190.547c-24.363-18.923-59.452-14.511-78.373 9.852-7.606 9.796-11.737 21.841-11.743 34.244v146.451h-111.709c-61.696 0-111.709 50.013-111.709 111.709v595.799c0 61.696 50.013 111.709 111.709 111.709h893.673c61.696 0 111.709-50.013 111.709-111.709v-595.799c0-61.696-50.013-111.709-111.709-111.709h-446.836zM781.964 337.891c30.848 0 55.855 25.007 55.855 55.855s-25.007 55.855-55.855 55.855c-30.848 0-55.855-25.007-55.855-55.855s25.007-55.855 55.855-55.855zM558.545 337.891c30.848 0 55.855 25.007 55.855 55.855s-25.007 55.855-55.855 55.855c-30.848 0-55.855-25.007-55.855-55.855s25.007-55.855 55.855-55.855zM335.125 337.891c30.848 0 55.855 25.007 55.855 55.855s-25.007 55.855-55.855 55.855c-30.848 0-55.855-25.007-55.855-55.855s25.007-55.855 55.855-55.855z" />
<glyph unicode="&#xe9b6;" glyph-name="minuse-solid-circle" d="M874.017 653.078c-96.701 96.231-225.225 149.232-361.97 149.232s-265.317-53.001-362.025-149.227c-96.711-96.228-150.021-224.308-150.021-360.505s53.285-264.249 150.018-360.513c96.733-96.265 225.235-149.227 361.995-149.227 136.756 0 265.307 52.942 361.968 149.227s150.018 224.357 150.018 360.551c0 136.198-53.205 264.206-149.984 360.469l0.002-0.002zM256.001 255.974c-20.198 0-36.571 16.373-36.571 36.571s16.373 36.571 36.571 36.571h512c20.198 0 36.571-16.373 36.571-36.571s-16.373-36.571-36.571-36.571h-512z" />
<glyph unicode="&#xf016;" glyph-name="file, file-empty" horiz-adv-x="878" d="M838.857 587.428c21.143-21.143 38.857-63.429 38.857-93.714v-658.286c0-30.286-24.571-54.857-54.857-54.857h-768c-30.286 0-54.857 24.571-54.857 54.857v914.286c0 30.286 24.571 54.857 54.857 54.857h512c30.286 0 72.571-17.714 93.714-38.857zM585.143 726.857v-214.857h214.857c-3.429 9.714-8.571 19.429-12.571 23.429l-178.857 178.857c-4 4-13.714 9.143-23.429 12.571zM804.571-146.286v585.143h-237.714c-30.286 0-54.857 24.571-54.857 54.857v237.714h-438.857v-877.714h731.429z" />
<glyph unicode="&#xf02d;" glyph-name="book" d="M948.764 510.653c13.529-19.482 17.318-44.918 9.741-69.81l-148.822-490.3c-13.529-45.999-61.152-81.716-107.693-81.716h-499.501c-55.199 0-114.186 43.835-134.21 100.116-8.658 24.352-8.658 48.165-1.083 68.728 1.083 10.823 3.248 21.647 3.789 34.635 0.541 8.658-4.329 15.694-3.248 22.188 2.165 12.988 13.529 22.188 22.188 36.799 16.235 27.058 34.635 70.893 40.587 99.033 2.706 10.281-2.706 22.188 0 31.388 2.706 10.281 12.988 17.859 18.401 27.6 14.612 24.894 33.554 73.058 36.259 98.493 1.083 11.364-4.329 23.811-1.083 32.471 3.789 12.447 15.694 17.859 23.811 28.682 12.988 17.859 34.635 69.269 37.881 97.952 1.083 9.199-4.329 18.401-2.706 28.14 2.165 10.281 15.153 21.106 23.811 33.554 22.728 33.554 27.058 107.693 95.787 88.211l-0.541-1.623c9.199 2.165 18.401 4.871 27.6 4.871h411.831c25.434 0 48.165-11.364 61.694-30.306 14.070-19.482 17.318-44.918 9.741-70.352l-148.281-490.3c-25.434-83.34-39.505-101.74-108.235-101.74h-470.277c-7.035 0-15.694-1.623-20.565-8.117-4.329-6.495-4.871-11.364-0.541-23.269 10.823-31.388 48.165-37.881 77.93-37.881h499.501c20.024 0 43.293 11.364 49.247 30.846l162.352 534.135c3.248 10.281 3.248 21.106 2.706 30.846 12.447-4.871 23.811-12.447 31.929-23.269zM372.959 509.57c-3.248-9.741 2.165-17.318 11.905-17.318h329.032c9.199 0 19.482 7.576 22.728 17.318l11.364 34.635c3.248 9.741-2.165 17.318-11.905 17.318h-329.032c-9.199 0-19.482-7.576-22.728-17.318zM328.043 371.031c-3.248-9.741 2.165-17.318 11.905-17.318h329.032c9.199 0 19.482 7.576 22.728 17.318l11.364 34.635c3.248 9.741-2.165 17.318-11.905 17.318h-329.032c-9.199 0-19.482-7.576-22.728-17.318z" />
<glyph unicode="&#xf064;" glyph-name="share" d="M960.285 412.526c0-8.506-3.502-16.511-9.505-22.514l-256.163-256.163c-6.003-6.003-14.008-9.505-22.514-9.505-17.512 0-32.020 14.509-32.020 32.020v128.082h-112.072c-215.638 0-357.227-41.527-357.227-280.178 0-20.513 1.001-41.025 2.501-61.54 0.5-8.005 2.501-17.011 2.501-25.015 0-9.505-6.003-17.512-16.010-17.512-7.004 0-10.506 3.502-14.008 8.506-7.505 10.506-13.009 26.518-18.511 38.025-28.517 64.041-63.54 155.598-63.54 225.643 0 56.036 5.504 113.572 26.518 166.606 69.545 172.609 273.673 201.628 437.778 201.628h112.072v128.082c0 17.512 14.509 32.020 32.020 32.020 8.506 0 16.511-3.502 22.514-9.505l256.163-256.163c6.003-6.003 9.505-14.008 9.505-22.514z" />

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 212 KiB