mirror of
https://github.com/bakhirev/assayo.git
synced 2024-11-16 08:11:40 +00:00
update
This commit is contained in:
parent
c3e8f39cf0
commit
b3bd463d84
37
LICENSE
37
LICENSE
|
@ -1,37 +0,0 @@
|
|||
Copyright (c) Aleksei Bakhirev <alexey-bakhirev@yandex.ru>
|
||||
|
||||
-- EN
|
||||
|
||||
The purpose of this license is to protect the copyrights and limit the use of the Software .
|
||||
|
||||
Terms of the license:
|
||||
01. The copyright holder grants the user the non-exclusive right to use the Software for personal, non-commercial or educational purposes.
|
||||
02. The user is not allowed to modify, distribute, sublicense, translate, create derivative works based on the Software without the prior written consent of the Copyright Holder.
|
||||
03. When using the Software, the user must include the name of the author and a link to the license.
|
||||
04. If the Software is modified, the user should notify the Copyright Holder and obtain their permission for the changes.
|
||||
05. This license cannot be transferred to another person or organization without the prior written permission of the Copyright Holder.
|
||||
06. This license does not grant the user ownership rights to the Software.
|
||||
07. All rights not granted under this license are reserved by the Copyright Holder.
|
||||
08. If the user violates the terms of this license, the Copyright Holder has the right to require the termination of use of the protected work, removal of the protected work from any media, as well as compensation for damages.
|
||||
09. The author assumes no responsibility for any damage, including direct, indirect, incidental, special or other damage, resulting from the use or inability to use the software.
|
||||
10. The author also does not warrant that the software will run without interruptions, errors or other problems, and reserves the right to modify or update the software at any time without prior notice.
|
||||
11. Additionally, the author does not warrant the software’s conformity to any specific purpose or requirement, and the use of the software is at the user’s own risk.
|
||||
12. All these terms and conditions are part of the license agreement that the user accepts when using the software.
|
||||
|
||||
-- RU
|
||||
|
||||
Эта лицензия предназначена для обеспечения защиты авторских прав и ограничения использования защищенного произведения.
|
||||
|
||||
Условия лицензии:
|
||||
01. Правообладатель предоставляет пользователю неисключительное право на использование защищенного произведения для личных, некоммерческих или образовательных целей.
|
||||
02. Пользователь не имеет права изменять, распространять, сублицензировать, переводить, создавать производные произведения на основе защищенного произведения без предварительного письменного согласия Правообладателя.
|
||||
03. При использовании защищенного произведения пользователь обязан указывать имя автора и ссылку на лицензию.
|
||||
04. В случае внесения изменений в защищенное произведение, пользователь должен уведомить об этом Правообладателя и получить его разрешение на внесение изменений.
|
||||
05. Эта лицензия не может быть передана другому лицу или организации без предварительного письменного разрешения Правообладателя.
|
||||
06. Данная лицензия не предоставляет пользователю права собственности на защищенное произведение.
|
||||
07. Все права, не предоставленные в рамках этой лицензии, сохраняются за Правообладателем.
|
||||
08. Если пользователь нарушает условия данной лицензии, Правообладатель имеет право потребовать прекращения использования защищенного произведения, удаления защищенного произведения с любых носителей, а также возмещение ущерба.
|
||||
09. Автор не несет ответственности за любой ущерб, включая прямой, косвенный, случайный, специальный или другой, возникший в результате использования или невозможности использования программного обеспечения.
|
||||
10. Автор также не гарантирует, что программное обеспечение будет работать без сбоев, ошибок или других проблем, и оставляет за собой право изменять или обновлять программное обеспечение в любое время без предварительного уведомления.
|
||||
11. Кроме того, автор не гарантирует соответствие программного обеспечения каким-либо конкретным целям или требованиям, и использование программного обеспечения осуществляется пользователем на свой страх и риск.
|
||||
12. Все эти условия и ограничения являются частью лицензионного соглашения, которое пользователь принимает при использовании программного обеспечения.
|
|
@ -1,17 +1,17 @@
|
|||
{
|
||||
"files": {
|
||||
"main.css": "./static/css/main.8e65d99e.css",
|
||||
"main.js": "./static/js/main.cb604897.js",
|
||||
"main.css": "./static/css/main.83b4380c.css",
|
||||
"main.js": "./static/js/main.2f9b2b48.js",
|
||||
"static/media/car.png": "./static/media/car.b8dd8738e37fe866285f.png",
|
||||
"index.html": "./index.html",
|
||||
"static/media/warning.svg": "./static/media/warning.e39a87773603f3ab157f.svg",
|
||||
"static/media/info.svg": "./static/media/info.954631f6b19e3fe9c495.svg",
|
||||
"static/media/alert.svg": "./static/media/alert.41e2b99c481139c13074.svg",
|
||||
"main.8e65d99e.css.map": "./static/css/main.8e65d99e.css.map",
|
||||
"main.cb604897.js.map": "./static/js/main.cb604897.js.map"
|
||||
"main.83b4380c.css.map": "./static/css/main.83b4380c.css.map",
|
||||
"main.2f9b2b48.js.map": "./static/js/main.2f9b2b48.js.map"
|
||||
},
|
||||
"entrypoints": [
|
||||
"static/css/main.8e65d99e.css",
|
||||
"static/js/main.cb604897.js"
|
||||
"static/css/main.83b4380c.css",
|
||||
"static/js/main.2f9b2b48.js"
|
||||
]
|
||||
}
|
10
build/assets/achievements/moreTasksInDay.svg
Normal file
10
build/assets/achievements/moreTasksInDay.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Capa_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612" xml:space="preserve">
|
||||
<path d="M175.205,239.62c0.127-1.965-0.533-3.902-1.833-5.381l-58.84-66.941c-1.3-1.479-3.135-2.381-5.102-2.508 c-1.975-0.126-3.902,0.533-5.381,1.833c-27.037,23.766-49.479,51.794-66.706,83.305c-0.944,1.729-1.165,3.762-0.611,5.651 c0.554,1.89,1.836,3.483,3.565,4.427l78.205,42.748c1.131,0.619,2.352,0.912,3.557,0.912c2.627,0,5.174-1.398,6.523-3.866 c11.386-20.828,26.229-39.359,44.114-55.08C174.178,243.422,175.08,241.587,175.205,239.62z"/>
|
||||
<path d="M201.462,214.829c1.334,2.515,3.907,3.948,6.568,3.948c1.174,0,2.365-0.279,3.473-0.867 c20.962-11.117,43.512-18.371,67.025-21.561c4.064-0.551,6.913-4.293,6.362-8.358l-11.979-88.316 c-0.551-4.064-4.304-6.909-8.358-6.362c-35.708,4.843-69.949,15.857-101.772,32.736c-3.623,1.922-5.002,6.416-3.082,10.041 L201.462,214.829z"/>
|
||||
<path d="M105.785,334.345l-86.017-23.338c-1.901-0.514-3.929-0.255-5.638,0.725s-2.958,2.598-3.475,4.499 C3.586,342.295,0,369.309,0,396.523c0,4.657,0.111,9.329,0.342,14.284c0.185,3.981,3.468,7.083,7.414,7.083 c0.116,0,0.234-0.002,0.35-0.008l89.031-4.113c1.967-0.09,3.82-0.96,5.145-2.415c1.327-1.455,2.022-3.38,1.93-5.347 c-0.155-3.341-0.23-6.444-0.23-9.484c0-18.02,2.365-35.873,7.029-53.066C112.082,339.499,109.743,335.42,105.785,334.345z"/>
|
||||
<path d="M438.731,120.745c-32.411-15.625-67.04-25.308-102.925-28.786c-1.972-0.198-3.918,0.408-5.439,1.659 c-1.521,1.252-2.481,3.056-2.671,5.018l-8.593,88.712c-0.396,4.082,2.594,7.713,6.677,8.108 c23.652,2.291,46.463,8.669,67.8,18.954c1.015,0.49,2.118,0.738,3.225,0.738c0.826,0,1.654-0.139,2.45-0.416 c1.859-0.649,3.385-2.012,4.24-3.786l38.7-80.287C443.978,126.965,442.427,122.525,438.731,120.745z"/>
|
||||
<path d="M569.642,245.337c0.48-1.911,0.184-3.932-0.828-5.624c-18.432-30.835-41.933-57.983-69.848-80.686 c-1.529-1.242-3.48-1.824-5.447-1.627c-1.959,0.203-3.758,1.174-5,2.702l-56.237,69.144c-1.242,1.529-1.828,3.488-1.625,5.447 c0.201,1.959,1.173,3.758,2.702,5.002c18.47,15.019,34.015,32.975,46.205,53.369c1.392,2.326,3.855,3.618,6.383,3.618 c1.297,0,2.61-0.34,3.803-1.054l76.501-45.728C567.94,248.889,569.16,247.248,569.642,245.337z"/>
|
||||
<path d="M598.044,304.939c-1.228-3.915-5.397-6.096-9.308-4.867l-85.048,26.648c-3.915,1.226-6.093,5.393-4.867,9.306 c6.104,19.486,9.199,39.839,9.199,60.494c0,3.041-0.076,6.144-0.23,9.484c-0.092,1.967,0.602,3.892,1.93,5.347 c1.327,1.456,3.178,2.325,5.145,2.415l89.031,4.113c0.118,0.005,0.234,0.008,0.35,0.008c3.944,0,7.228-3.103,7.414-7.083 c0.229-4.955,0.342-9.627,0.342-14.284C612,365.306,607.306,334.494,598.044,304.939z"/>
|
||||
<path d="M305.737,380.755c-1.281,0-2.555,0.042-3.824,0.11l-120.65-71.185c-2.953-1.745-6.702-1.308-9.176,1.065 c-2.476,2.371-3.07,6.099-1.456,9.121l65.815,123.355c-0.242,2.376-0.371,4.775-0.371,7.195c0,18.608,7.246,36.101,20.403,49.258 c13.158,13.158,30.652,20.404,49.26,20.404c18.608,0,36.101-7.248,49.258-20.404c13.158-13.157,20.403-30.65,20.403-49.258 c0-18.608-7.246-36.101-20.403-49.258C341.839,388.001,324.344,380.755,305.737,380.755z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3 KiB |
|
@ -1 +1 @@
|
|||
<!doctype html><html><head><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=no,maximum-scale=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="cleartype" content="on"><meta name="HandheldFriendly" content="True"><meta name="format-detection" content="telephone=no"><meta name="format-detection" content="address=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="theme-color" content="white"/><script type="text/javascript">var report=[]</script><script src="/log.txt"></script><script src="./log.txt"></script><script src="../log.txt"></script><script src="./log-0.txt"></script><script src="./log-1.txt"></script><script src="./log-2.txt"></script><script src="./log-3.txt"></script><script src="./log-4.txt"></script><script src="./log-5.txt"></script><script src="./log-6.txt"></script><script src="./report/log-0.txt"></script><script src="./report/log-1.txt"></script><script src="./report/log-2.txt"></script><script src="./report/log-3.txt"></script><script src="./report/log-4.txt"></script><script src="./report/log-5.txt"></script><script src="./report/log-6.txt"></script><link rel="icon" href="./favicon.svg"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Git Statistics</title><meta name="description" content="Simple and fast report on git commit history."><meta name="keywords" content="git, statistics, audit, history, log, monitoring, employee control"><meta name="author" content="Bakhirev Aleksei"><meta name="copyright" content="(c) Bakhirev Aleksei"><meta http-equiv="Reply-to" content="alexey-bakhirev@yandex.ru"><meta name="application-name" content="Git statistics"><meta name="msapplication-tooltip" content="Simple and fast report on Git commit history."><meta property="og:title" content="Git Statistics"><meta property="og:description" content="Simple and fast report on Git commit history."><meta property="og:image" content="http://assayo.jp/assets/seo/custom_icon_256.png"><meta property="og:site_name" content="Assayo"><meta property="og:url" content="http://assayo.jp/"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Git Statistics"><meta name="twitter:description" content="Simple and fast report on Git commit history."><meta name="twitter:creator" content="Bakhirev Aleksei"><meta name="twitter:image:src" content="http://assayo.jp/assets/seo/custom_icon_256.png"><meta name="twitter:domain" content="assayo.jp"><meta name="twitter:site" content="assayo.jp"><meta itemprop="name" content="Git Statistics"><meta itemprop="description" content="Simple and fast report on Git commit history."><meta itemprop="image" content="http://assayo.jp/assets/seo/custom_icon_256.png"><script defer="defer" src="./static/js/main.cb604897.js"></script><link href="./static/css/main.8e65d99e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
||||
<!doctype html><html><head><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=no,maximum-scale=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="cleartype" content="on"><meta name="HandheldFriendly" content="True"><meta name="format-detection" content="telephone=no"><meta name="format-detection" content="address=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="theme-color" content="white"/><script type="text/javascript">var report=[]</script><script src="/log.txt"></script><script src="./log.txt"></script><script src="../log.txt"></script><script src="./log-0.txt"></script><script src="./log-1.txt"></script><script src="./log-2.txt"></script><script src="./log-3.txt"></script><script src="./log-4.txt"></script><script src="./log-5.txt"></script><script src="./log-6.txt"></script><script src="./report/log-0.txt"></script><script src="./report/log-1.txt"></script><script src="./report/log-2.txt"></script><script src="./report/log-3.txt"></script><script src="./report/log-4.txt"></script><script src="./report/log-5.txt"></script><script src="./report/log-6.txt"></script><link rel="icon" href="./favicon.svg"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Git Statistics</title><meta name="description" content="Simple and fast report on git commit history."><meta name="keywords" content="git, statistics, audit, history, log, monitoring, employee control"><meta name="author" content="Bakhirev Aleksei"><meta name="copyright" content="(c) Bakhirev Aleksei"><meta http-equiv="Reply-to" content="alexey-bakhirev@yandex.ru"><meta name="application-name" content="Git statistics"><meta name="msapplication-tooltip" content="Simple and fast report on Git commit history."><meta property="og:title" content="Git Statistics"><meta property="og:description" content="Simple and fast report on Git commit history."><meta property="og:image" content="http://assayo.jp/assets/seo/custom_icon_256.png"><meta property="og:site_name" content="Assayo"><meta property="og:url" content="http://assayo.jp/"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Git Statistics"><meta name="twitter:description" content="Simple and fast report on Git commit history."><meta name="twitter:creator" content="Bakhirev Aleksei"><meta name="twitter:image:src" content="http://assayo.jp/assets/seo/custom_icon_256.png"><meta name="twitter:domain" content="assayo.jp"><meta name="twitter:site" content="assayo.jp"><meta itemprop="name" content="Git Statistics"><meta itemprop="description" content="Simple and fast report on Git commit history."><meta itemprop="image" content="http://assayo.jp/assets/seo/custom_icon_256.png"><script defer="defer" src="./static/js/main.2f9b2b48.js"></script><link href="./static/css/main.83b4380c.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
2
build/static/css/main.83b4380c.css
Normal file
2
build/static/css/main.83b4380c.css
Normal file
File diff suppressed because one or more lines are too long
1
build/static/css/main.83b4380c.css.map
Normal file
1
build/static/css/main.83b4380c.css.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
3
build/static/js/main.2f9b2b48.js
Normal file
3
build/static/js/main.2f9b2b48.js
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,5 @@
|
|||
/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
|
||||
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
|
||||
/**
|
1
build/static/js/main.2f9b2b48.js.map
Normal file
1
build/static/js/main.2f9b2b48.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
10
public/assets/achievements/moreTasksInDay.svg
Normal file
10
public/assets/achievements/moreTasksInDay.svg
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Capa_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 612" xml:space="preserve">
|
||||
<path d="M175.205,239.62c0.127-1.965-0.533-3.902-1.833-5.381l-58.84-66.941c-1.3-1.479-3.135-2.381-5.102-2.508 c-1.975-0.126-3.902,0.533-5.381,1.833c-27.037,23.766-49.479,51.794-66.706,83.305c-0.944,1.729-1.165,3.762-0.611,5.651 c0.554,1.89,1.836,3.483,3.565,4.427l78.205,42.748c1.131,0.619,2.352,0.912,3.557,0.912c2.627,0,5.174-1.398,6.523-3.866 c11.386-20.828,26.229-39.359,44.114-55.08C174.178,243.422,175.08,241.587,175.205,239.62z"/>
|
||||
<path d="M201.462,214.829c1.334,2.515,3.907,3.948,6.568,3.948c1.174,0,2.365-0.279,3.473-0.867 c20.962-11.117,43.512-18.371,67.025-21.561c4.064-0.551,6.913-4.293,6.362-8.358l-11.979-88.316 c-0.551-4.064-4.304-6.909-8.358-6.362c-35.708,4.843-69.949,15.857-101.772,32.736c-3.623,1.922-5.002,6.416-3.082,10.041 L201.462,214.829z"/>
|
||||
<path d="M105.785,334.345l-86.017-23.338c-1.901-0.514-3.929-0.255-5.638,0.725s-2.958,2.598-3.475,4.499 C3.586,342.295,0,369.309,0,396.523c0,4.657,0.111,9.329,0.342,14.284c0.185,3.981,3.468,7.083,7.414,7.083 c0.116,0,0.234-0.002,0.35-0.008l89.031-4.113c1.967-0.09,3.82-0.96,5.145-2.415c1.327-1.455,2.022-3.38,1.93-5.347 c-0.155-3.341-0.23-6.444-0.23-9.484c0-18.02,2.365-35.873,7.029-53.066C112.082,339.499,109.743,335.42,105.785,334.345z"/>
|
||||
<path d="M438.731,120.745c-32.411-15.625-67.04-25.308-102.925-28.786c-1.972-0.198-3.918,0.408-5.439,1.659 c-1.521,1.252-2.481,3.056-2.671,5.018l-8.593,88.712c-0.396,4.082,2.594,7.713,6.677,8.108 c23.652,2.291,46.463,8.669,67.8,18.954c1.015,0.49,2.118,0.738,3.225,0.738c0.826,0,1.654-0.139,2.45-0.416 c1.859-0.649,3.385-2.012,4.24-3.786l38.7-80.287C443.978,126.965,442.427,122.525,438.731,120.745z"/>
|
||||
<path d="M569.642,245.337c0.48-1.911,0.184-3.932-0.828-5.624c-18.432-30.835-41.933-57.983-69.848-80.686 c-1.529-1.242-3.48-1.824-5.447-1.627c-1.959,0.203-3.758,1.174-5,2.702l-56.237,69.144c-1.242,1.529-1.828,3.488-1.625,5.447 c0.201,1.959,1.173,3.758,2.702,5.002c18.47,15.019,34.015,32.975,46.205,53.369c1.392,2.326,3.855,3.618,6.383,3.618 c1.297,0,2.61-0.34,3.803-1.054l76.501-45.728C567.94,248.889,569.16,247.248,569.642,245.337z"/>
|
||||
<path d="M598.044,304.939c-1.228-3.915-5.397-6.096-9.308-4.867l-85.048,26.648c-3.915,1.226-6.093,5.393-4.867,9.306 c6.104,19.486,9.199,39.839,9.199,60.494c0,3.041-0.076,6.144-0.23,9.484c-0.092,1.967,0.602,3.892,1.93,5.347 c1.327,1.456,3.178,2.325,5.145,2.415l89.031,4.113c0.118,0.005,0.234,0.008,0.35,0.008c3.944,0,7.228-3.103,7.414-7.083 c0.229-4.955,0.342-9.627,0.342-14.284C612,365.306,607.306,334.494,598.044,304.939z"/>
|
||||
<path d="M305.737,380.755c-1.281,0-2.555,0.042-3.824,0.11l-120.65-71.185c-2.953-1.745-6.702-1.308-9.176,1.065 c-2.476,2.371-3.07,6.099-1.456,9.121l65.815,123.355c-0.242,2.376-0.371,4.775-0.371,7.195c0,18.608,7.246,36.101,20.403,49.258 c13.158,13.158,30.652,20.404,49.26,20.404c18.608,0,36.101-7.248,49.258-20.404c13.158-13.157,20.403-30.65,20.403-49.258 c0-18.608-7.246-36.101-20.403-49.258C341.839,388.001,324.344,380.755,305.737,380.755z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3 KiB |
|
@ -124,7 +124,7 @@ function SimplePagination({
|
|||
}}
|
||||
/>
|
||||
<p className={style.paginator_text}>
|
||||
строк.
|
||||
{t('uiKit.dataLoader.rows')}
|
||||
</p>
|
||||
{canShowMore && (
|
||||
<UiKitButton
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import IHashMap from 'ts/interfaces/HashMap';
|
||||
import ExternalLink from 'ts/components/ExternalLink';
|
||||
|
@ -69,6 +70,7 @@ interface IDayInfoProps {
|
|||
}
|
||||
|
||||
function DayInfo({ day, order, events, timestamp }: IDayInfoProps): React.ReactElement {
|
||||
const { t } = useTranslation();
|
||||
const firstCommit = events?.firstCommit?.[timestamp || ''] || [];
|
||||
const lastCommit = events?.lastCommit?.[timestamp || ''] || [];
|
||||
let taskNumber = 0;
|
||||
|
@ -79,8 +81,8 @@ function DayInfo({ day, order, events, timestamp }: IDayInfoProps): React.ReactE
|
|||
taskNumber += Object.keys(tasks).length;
|
||||
|
||||
let suffix = '';
|
||||
if (firstCommit.includes(author)) suffix = '(первый рабочий день)';
|
||||
if (lastCommit.includes(author)) suffix = '(последний рабочий день)';
|
||||
if (firstCommit.includes(author)) suffix = t('page.team.month.first');
|
||||
if (lastCommit.includes(author)) suffix = t('page.team.month.last');
|
||||
|
||||
return (
|
||||
<div
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
|
||||
import { getDayPrefix } from 'ts/helpers/formatter';
|
||||
import { getDayName } from 'ts/helpers/formatter';
|
||||
|
||||
import Header from './components/Header';
|
||||
import Columns from './components/Columns';
|
||||
|
@ -24,7 +24,7 @@ function HoursChart({
|
|||
className={style.day}
|
||||
>
|
||||
<div className={style.day_name}>
|
||||
{getDayPrefix(day)}
|
||||
{getDayName(day, 'short')}
|
||||
</div>
|
||||
<Columns
|
||||
week={week}
|
||||
|
|
|
@ -21,8 +21,8 @@ export default function getOptions({
|
|||
return {
|
||||
max: max instanceof Array ? Math.max(...max) : (max || 100),
|
||||
order: order || [],
|
||||
suffix: suffix ?? 'коммитов',
|
||||
otherTitle: other ?? 'Остальные',
|
||||
suffix: suffix ?? 'commits',
|
||||
otherTitle: other ?? '...',
|
||||
color: order?.length ? (new ColorGenerator(order)) : null,
|
||||
limit: limit || 15,
|
||||
formatter: formatter || ((v: any) => v),
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import React from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import Description from 'ts/components/Description';
|
||||
import UiKitButton from 'ts/components/UiKit/components/Button';
|
||||
|
@ -28,6 +29,8 @@ function Card({
|
|||
recommendation,
|
||||
onClick,
|
||||
}: IRecommendationsProps) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (!recommendation) return null;
|
||||
|
||||
const className = getClassName(recommendation);
|
||||
|
@ -55,12 +58,11 @@ function Card({
|
|||
className={style.recommendations_card_button}
|
||||
onClick={onClick}
|
||||
>
|
||||
Подробнее
|
||||
{t('recommendations.modal.open')}
|
||||
</UiKitButton>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
export default Card;
|
||||
|
|
|
@ -56,7 +56,7 @@ const RecommendationDescription = observer(() => {
|
|||
</Body>
|
||||
<Footer className={style.recommendations_modal_footer}>
|
||||
<UiKitButton
|
||||
mode={[ isMobile ? 'primary' : 'slim', 'full_size']}
|
||||
mode={[ isMobile ? 'primary' : 'border', 'full_size']}
|
||||
onClick={() => {
|
||||
recommendationStore.close();
|
||||
}}
|
||||
|
|
|
@ -15,7 +15,7 @@ function Header({ dayInfo }: IHeaderProps) {
|
|||
{getDate(dayInfo?.timestamp)}
|
||||
</p>
|
||||
<p className={style.tempo_header_day}>
|
||||
{getDayName(dayInfo?.day)}
|
||||
{getDayName(dayInfo?.day, 'long')}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -3,7 +3,7 @@ import React from 'react';
|
|||
import { IUiKitWrapperProps } from './Wrapper';
|
||||
import style from '../styles/button.module.scss';
|
||||
|
||||
export type Mode = 'primary' | 'second' | 'link' | 'slim' | 'full_size';
|
||||
export type Mode = 'primary' | 'second' | 'border' | 'link' | 'slim' | 'full_size';
|
||||
|
||||
export function getClassNameForMode(mode?: string) {
|
||||
return {
|
||||
|
@ -11,6 +11,7 @@ export function getClassNameForMode(mode?: string) {
|
|||
slim: style.ui_kit_button_slim,
|
||||
second: style.ui_kit_button_second,
|
||||
primary: style.ui_kit_button_primary,
|
||||
border: style.ui_kit_button_border,
|
||||
full_size: style.ui_kit_button_full_size,
|
||||
}[mode || ''] || '';
|
||||
}
|
||||
|
|
|
@ -16,6 +16,13 @@
|
|||
--button-color-active: var(--color-border);
|
||||
}
|
||||
|
||||
&_border {
|
||||
--button-color-bg: transparent;
|
||||
--button-color-text: var(--color-button);
|
||||
--button-color-hover: var(--color-border);
|
||||
--button-color-active: var(--color-border);
|
||||
}
|
||||
|
||||
&_link {
|
||||
--button-color-bg: transparent;
|
||||
--button-color-text: var(--color-button);
|
||||
|
@ -63,6 +70,11 @@
|
|||
font-weight: 100;
|
||||
}
|
||||
|
||||
&_border {
|
||||
line-height: 38px;
|
||||
border-width: 3px
|
||||
}
|
||||
|
||||
&_link {
|
||||
font-weight: 100;
|
||||
height: auto;
|
||||
|
|
|
@ -42,7 +42,7 @@ function Day({
|
|||
return ( // @ts-ignore
|
||||
<div
|
||||
className={style.year_chart_month_body_day}
|
||||
title={`коммитов: ${dayInfo.commits}, задач: ${dayInfo.tasksInDay || 0}`}
|
||||
title={`commits: ${dayInfo.commits}, tasks: ${dayInfo.tasksInDay || 0}`}
|
||||
style={{
|
||||
backgroundColor,
|
||||
backgroundImage: iconUrl ? `url(${iconUrl})` : '',
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import React from 'react';
|
||||
|
||||
import { getLangPrefix } from 'ts/helpers/formatter';
|
||||
|
||||
import IMonth from '../interfaces/Month';
|
||||
import style from '../styles/index.module.scss';
|
||||
|
||||
|
@ -10,7 +12,7 @@ interface IHeaderProps {
|
|||
function Header({
|
||||
month,
|
||||
}: IHeaderProps): React.ReactElement | null {
|
||||
const name = month.date.toLocaleString('ru-RU', { month: 'long' });
|
||||
const name = month.date.toLocaleString(getLangPrefix(), { month: 'long' });
|
||||
const showYear = month.first || month.last || !month.month;
|
||||
|
||||
return (
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import React from 'react';
|
||||
|
||||
import IHashMap from 'ts/interfaces/HashMap';
|
||||
import LineChart from 'ts/components/LineChart';
|
||||
import getOptions from 'ts/components/LineChart/helpers/getOptions';
|
||||
import { getShortMoney } from 'ts/helpers/formatter';
|
||||
|
||||
import IMonth from '../interfaces/Month';
|
||||
|
@ -12,31 +10,6 @@ import Body from './Body';
|
|||
import styleChart from '../styles/line.module.scss';
|
||||
import style from '../styles/index.module.scss';
|
||||
|
||||
interface IMonthTotalProps {
|
||||
title: string;
|
||||
options: any;
|
||||
value: any;
|
||||
}
|
||||
|
||||
function MonthTotal({
|
||||
title,
|
||||
options,
|
||||
value,
|
||||
}: IMonthTotalProps) {
|
||||
return (
|
||||
<div className={styleChart.year_chart_month_info}>
|
||||
<span className={styleChart.year_chart_month_text}>
|
||||
{title}
|
||||
</span>
|
||||
<LineChart
|
||||
options={options}
|
||||
value={value}
|
||||
className={styleChart.year_chart_month_chart}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
interface IMonthProps {
|
||||
max: IHashMap<number>;
|
||||
month: IMonth;
|
||||
|
@ -50,12 +23,17 @@ function Month({
|
|||
showEvents,
|
||||
hideMoney,
|
||||
}: IMonthProps): React.ReactElement | null {
|
||||
const tasksChart = getOptions({ max: max.tasks, suffix: 'задач' });
|
||||
const moneyChart = getOptions({
|
||||
max: max.money,
|
||||
suffix: '',
|
||||
formatter: getShortMoney,
|
||||
});
|
||||
let value = '';
|
||||
if (month.tasks) {
|
||||
value = `☑ ${month.tasks || 0}`;
|
||||
}
|
||||
if (!hideMoney && month.money) {
|
||||
value = `☑ ${month.tasks || 0} — ${getShortMoney(month.money || 0, 0)}`;
|
||||
}
|
||||
|
||||
const title = hideMoney
|
||||
? 'tasks'
|
||||
: 'tasks and money';
|
||||
|
||||
return (
|
||||
<div className={style.year_chart_month}>
|
||||
|
@ -65,18 +43,12 @@ function Month({
|
|||
maxCommits={max.commits}
|
||||
showEvents={showEvents}
|
||||
/>
|
||||
{!hideMoney && (
|
||||
<MonthTotal
|
||||
title="$"
|
||||
options={moneyChart}
|
||||
value={month.money}
|
||||
/>
|
||||
)}
|
||||
<MonthTotal
|
||||
title="☑"
|
||||
options={tasksChart}
|
||||
value={month.tasks}
|
||||
/>
|
||||
<div
|
||||
title={title}
|
||||
className={styleChart.year_chart_month_info}
|
||||
>
|
||||
{value}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React from 'react';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
|
||||
import MinMaxCounter from 'ts/helpers/DataGrip/components/counter';
|
||||
|
||||
|
@ -7,6 +7,19 @@ import getAuthorByDate from './helpers/getAuthorByDate';
|
|||
import Month from './components/Month';
|
||||
import IMonth from './interfaces/Month';
|
||||
|
||||
import style from './styles/index.module.scss';
|
||||
|
||||
function getDayWidth(wrapperWidth: number, monthNumber: number) {
|
||||
const step = 0.3;
|
||||
const borders = 7;
|
||||
for (let px = 16; px <= 24; px += step) {
|
||||
const monthWidth = borders + 8 * px;
|
||||
const size = monthWidth * monthNumber;
|
||||
if (size > wrapperWidth) return (px - step);
|
||||
}
|
||||
return 24;
|
||||
}
|
||||
|
||||
interface IYearChartProps {
|
||||
maxCommits: number;
|
||||
showEvents?: boolean;
|
||||
|
@ -20,6 +33,22 @@ function YearChart({
|
|||
wordDays = [],
|
||||
authors = [],
|
||||
}: IYearChartProps): React.ReactElement | null {
|
||||
const wrapper = useRef(null);
|
||||
const [dayWidth, setDayWidth] = useState<number>(16);
|
||||
const [monthNumber, setMonthNumber] = useState<number>(7);
|
||||
console.log(monthNumber);
|
||||
|
||||
useEffect(() => {
|
||||
if (!wrapper.current) return; // @ts-ignore
|
||||
const size = wrapper.current?.getBoundingClientRect() || {};
|
||||
const minMonthWidth = 7 + 8 * 16;
|
||||
const newMonthNumber = Math.floor(size.width / minMonthWidth);
|
||||
const width = getDayWidth(size.width, newMonthNumber);
|
||||
|
||||
setDayWidth(width);
|
||||
setMonthNumber(newMonthNumber);
|
||||
}, []);
|
||||
|
||||
if (!wordDays || !wordDays.length) return null;
|
||||
|
||||
const authorsByDate = getAuthorByDate(authors);
|
||||
|
@ -50,10 +79,17 @@ function YearChart({
|
|||
/>
|
||||
));
|
||||
|
||||
|
||||
const customStyle = { '--day-size': `${dayWidth.toFixed(1)}px` } as React.CSSProperties;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
ref={wrapper}
|
||||
style={customStyle}
|
||||
className={style.year_chart}
|
||||
>
|
||||
{elements}
|
||||
</>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,20 +1,24 @@
|
|||
@import 'src/styles/variables';
|
||||
|
||||
.year_chart_month {
|
||||
.year_chart {
|
||||
--day-size: 16px;
|
||||
padding: var(--space-xs) 0;
|
||||
margin: 0 calc(var(--day-size) / -2);
|
||||
}
|
||||
|
||||
.year_chart_month {
|
||||
--month-size: calc(var(--day-size) * 7 + 7px);
|
||||
|
||||
display: inline-block;
|
||||
width: var(--month-size);
|
||||
margin: var(--day-size) var(--day-size) 0 0;
|
||||
margin: var(--day-size) calc(var(--day-size) / 2) 0;
|
||||
vertical-align: top;
|
||||
|
||||
&_header {
|
||||
position: relative;
|
||||
display: block;
|
||||
height: 24px;
|
||||
|
||||
&_title,
|
||||
&_money {
|
||||
&_title {
|
||||
font-weight: 100;
|
||||
font-size: var(--font-xs);
|
||||
font-family: Arial, Verdana, sans-serif;
|
||||
|
@ -23,18 +27,12 @@
|
|||
padding: 0;
|
||||
margin: 0 auto;
|
||||
|
||||
text-align: left;
|
||||
text-align: center;
|
||||
line-height: var(--font-m);
|
||||
text-decoration: none;
|
||||
vertical-align: bottom;
|
||||
color: var(--color-black);
|
||||
}
|
||||
|
||||
&_money {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&_body {
|
||||
|
|
|
@ -3,37 +3,22 @@
|
|||
.year_chart_month {
|
||||
&_info {
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&_text {
|
||||
font-weight: 100;
|
||||
font-size: var(--font-xs);
|
||||
font-family: Arial, Verdana, sans-serif;
|
||||
|
||||
display: inline-block;
|
||||
width: 16px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
margin: var(--space-s) 0 0;
|
||||
|
||||
text-align: left;
|
||||
line-height: var(--font-xs);
|
||||
white-space: nowrap;
|
||||
text-decoration: none;
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
text-align: center;
|
||||
|
||||
color: var(--color-11);
|
||||
}
|
||||
|
||||
&_chart {
|
||||
display: inline-block;
|
||||
width: 94px;
|
||||
height: var(--space-s);
|
||||
margin: 0;
|
||||
border-radius: 0;
|
||||
vertical-align: middle;
|
||||
|
||||
> div:last-child {
|
||||
border-radius: 0;
|
||||
background-color: #C2CEE4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,7 +63,6 @@ export default class DataGripByTasks {
|
|||
if (commit.scope !== 'неопределенна') scope.add(commit.scope);
|
||||
});
|
||||
|
||||
const authorsList = Array.from(authors).join(', ');
|
||||
const comments = Array.from(messages).join(', ');
|
||||
const to = lastCommit.milliseconds;
|
||||
const daysInWork = Math.ceil((to - from) / settingsStore.ONE_DAY) + 1;
|
||||
|
@ -73,7 +72,7 @@ export default class DataGripByTasks {
|
|||
to: to !== from ? to : undefined,
|
||||
commits: commits.length,
|
||||
daysInWork,
|
||||
authors: authorsList,
|
||||
authors: Array.from(authors),
|
||||
comments,
|
||||
types: Array.from(types),
|
||||
scope: Array.from(scope),
|
||||
|
|
|
@ -46,6 +46,8 @@ class DataGrip {
|
|||
|
||||
initializationInfo: any = {};
|
||||
|
||||
hash: number = 0;
|
||||
|
||||
clear() {
|
||||
this.firstLastCommit.clear();
|
||||
this.author.clear();
|
||||
|
@ -110,6 +112,7 @@ class DataGrip {
|
|||
this.addCommit(commit);
|
||||
});
|
||||
this.#updateTotalInfo();
|
||||
this.hash = Math.random();
|
||||
}
|
||||
|
||||
updateByFiles(fileList: IDirtyFile[], removedFileList: IDirtyFile[]) {
|
||||
|
|
|
@ -23,7 +23,8 @@ export default function Parser(report: string[]) {
|
|||
const index = message.indexOf('\t');
|
||||
if (index > 0 && index < 10) {
|
||||
let [addedRaw, removedRaw, fileName] = message.split('\t');
|
||||
fileName = getNewFileName(fileName, allFiles);
|
||||
const formattedFileName = fileName?.replace(/"/gm, '');
|
||||
fileName = getNewFileName(formattedFileName, allFiles);
|
||||
let added = parseInt(addedRaw, 10) || 0;
|
||||
let removed = parseInt(removedRaw, 10) || 0;
|
||||
const diff = added - removed;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import IHashMap from 'ts/interfaces/HashMap';
|
||||
import localization from 'ts/helpers/Localization';
|
||||
import notificationsStore from 'ts/components/Notifications/store';
|
||||
|
||||
function getParametersFromString(text: string): IHashMap<string> {
|
||||
return Object.fromEntries((text || '')
|
||||
|
@ -20,7 +21,9 @@ function loadJsDump(url: string, callback: Function) {
|
|||
script.src = url;
|
||||
script.async = true; // @ts-ignore
|
||||
script.onload = callback; // @ts-ignore
|
||||
script.onerror = callback;
|
||||
script.onerror = () => {
|
||||
notificationsStore.show('common.fileLoader.notification');
|
||||
};
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,36 +1,7 @@
|
|||
import settingsStore from 'ts/store/Settings';
|
||||
|
||||
export function getDayName(index: number, value?: string) {
|
||||
const name = [
|
||||
'понедельник',
|
||||
'вторник',
|
||||
'среда',
|
||||
'четверг',
|
||||
'пятница',
|
||||
'суббота',
|
||||
'воскресенье',
|
||||
][index];
|
||||
if (value) {
|
||||
if (index == 2) return 'среду';
|
||||
else if (index == 4) return 'пятницу';
|
||||
else if (index == 5) return 'субботу';
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
export function getDayPrefix(index:number) {
|
||||
return [
|
||||
'пн',
|
||||
'вт',
|
||||
'ср',
|
||||
'чт',
|
||||
'пт',
|
||||
'сб',
|
||||
'вс',
|
||||
][index];
|
||||
}
|
||||
|
||||
function getLangPrefix() {
|
||||
export function getLangPrefix() {
|
||||
// @ts-ignore
|
||||
const code = window?.localization?.language || 'ru';
|
||||
return {
|
||||
|
@ -45,12 +16,28 @@ function getLangPrefix() {
|
|||
}[code] || 'ru-RU';
|
||||
}
|
||||
|
||||
const ONE_DAY = 24 * 60 * 60 * 1000;
|
||||
const TIMESTAMP = [
|
||||
ONE_DAY * 4,
|
||||
ONE_DAY * 5,
|
||||
ONE_DAY * 6,
|
||||
0,
|
||||
ONE_DAY,
|
||||
ONE_DAY * 2,
|
||||
ONE_DAY * 3,
|
||||
];
|
||||
|
||||
export function getDayName(index:number, weekday: 'long' | 'short') {
|
||||
const date = new Date(TIMESTAMP[index]);
|
||||
return date.toLocaleString(getLangPrefix(), { weekday: weekday || 'long' });
|
||||
}
|
||||
|
||||
export function getDateByTimestamp(timestamp: string) {
|
||||
const date = new Date(timestamp);
|
||||
const day = date.getDay() - 1;
|
||||
return [
|
||||
date.toLocaleString(getLangPrefix(), { day: 'numeric', month: 'long', year: 'numeric' }),
|
||||
getDayName(day < 0 ? 6 : day),
|
||||
getDayName(day < 0 ? 6 : day, 'long'),
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -83,7 +70,7 @@ export function getShortDate(timestamp: string) {
|
|||
export function getShortTime(timestamp: string) {
|
||||
if (!timestamp) return '';
|
||||
const date = new Date(timestamp);
|
||||
return date.toLocaleString('ru-RU', { hour: 'numeric', minute: 'numeric' });
|
||||
return date.toLocaleString(getLangPrefix(), { hour: 'numeric', minute: 'numeric' });
|
||||
}
|
||||
|
||||
export function getMoney(value: number, options?: any) {
|
||||
|
|
|
@ -164,6 +164,13 @@ export const PERSON = [
|
|||
icon: './assets/menu/team_date_2.svg',
|
||||
},
|
||||
{},
|
||||
{
|
||||
id: 'tasks',
|
||||
link: '/person/tasks/',
|
||||
title: 'sidebar.person.tasks',
|
||||
icon: './assets/menu/team_date_1.svg',
|
||||
},
|
||||
{},
|
||||
{
|
||||
id: 'commits',
|
||||
link: '/person/commits/',
|
||||
|
|
48
src/ts/pages/Person/components/Tasks.tsx
Normal file
48
src/ts/pages/Person/components/Tasks.tsx
Normal file
|
@ -0,0 +1,48 @@
|
|||
import React from 'react';
|
||||
import { observer } from 'mobx-react-lite';
|
||||
|
||||
import ISort from 'ts/interfaces/Sort';
|
||||
import { IPaginationRequest } from 'ts/interfaces/Pagination';
|
||||
import dataGripStore from 'ts/store/DataGrip';
|
||||
|
||||
import DataLoader from 'ts/components/DataLoader';
|
||||
import Pagination from 'ts/components/DataLoader/components/Pagination';
|
||||
import getFakeLoader from 'ts/components/DataLoader/helpers/formatter';
|
||||
import NothingFound from 'ts/components/NothingFound';
|
||||
|
||||
import { TasksView } from 'ts/pages/Team/components/Tasks';
|
||||
|
||||
import IPersonCommonProps from '../interfaces/CommonProps';
|
||||
|
||||
const Tasks = observer(({
|
||||
user,
|
||||
mode,
|
||||
}: IPersonCommonProps): React.ReactElement | null => {
|
||||
const allRows = dataGripStore.dataGrip.tasks.statistic;
|
||||
const rows = allRows.filter((row: any) => (
|
||||
row.author === user.author
|
||||
|| (row.authors || []).includes(user.author)
|
||||
));
|
||||
if (!rows?.length) return mode !== 'print' ? (<NothingFound />) : null;
|
||||
|
||||
return (
|
||||
<DataLoader
|
||||
to="response"
|
||||
loader={(pagination?: IPaginationRequest, sort?: ISort[]) => getFakeLoader({
|
||||
content: rows, pagination, sort, mode,
|
||||
})}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}${user.author}`}
|
||||
>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<TasksView
|
||||
mode={mode}
|
||||
rowsForExcel={rows}
|
||||
/>
|
||||
<Pagination />
|
||||
</DataLoader>
|
||||
);
|
||||
});
|
||||
|
||||
export default Tasks;
|
|
@ -39,7 +39,7 @@ const Total = observer(({ user }: IPersonCommonProps): React.ReactElement => {
|
|||
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[user.author];
|
||||
const taskNumber = statistic.tasks.length;
|
||||
const achievements = getAchievementByAuthor(statistic.author);
|
||||
|
||||
console.dir(achievements);
|
||||
return (
|
||||
<PageWrapper>
|
||||
<PageColumn>
|
||||
|
@ -77,15 +77,15 @@ const Total = observer(({ user }: IPersonCommonProps): React.ReactElement => {
|
|||
<Title title="page.person.achievement.title"/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.positive"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.GOOD]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.GOOD - 1]}
|
||||
/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.normal"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.NORMAL]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.NORMAL - 1]}
|
||||
/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.negative"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.BAD]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.BAD - 1]}
|
||||
/>
|
||||
<Description
|
||||
text={t('page.person.achievement.description')}
|
||||
|
|
|
@ -44,18 +44,18 @@ const Total = observer(({
|
|||
<Title title="page.person.achievement.title"/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.positive"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.GOOD]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.GOOD - 1]}
|
||||
/>
|
||||
</PageColumn>
|
||||
<PageColumn>
|
||||
<Title title={t('_')}/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.normal"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.NORMAL]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.NORMAL - 1]}
|
||||
/>
|
||||
<AchievementBlock
|
||||
title="page.person.achievement.negative"
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.BAD]}
|
||||
achievements={achievements[ACHIEVEMENT_TYPE.BAD - 1]}
|
||||
/>
|
||||
<br />
|
||||
<br />
|
||||
|
|
|
@ -19,6 +19,7 @@ import Speed from './components/Speed';
|
|||
import Total from './components/Total';
|
||||
import Week from './components/Week';
|
||||
import Month from './components/Month';
|
||||
import Tasks from './components/Tasks';
|
||||
import Tempo from './components/Tempo';
|
||||
import Print from './components/Print';
|
||||
|
||||
|
@ -55,6 +56,7 @@ function getViewByIdByUser(user: any, filters: any) {
|
|||
/>
|
||||
);
|
||||
if (page === 'print') return <Print user={user}/>;
|
||||
if (page === 'tasks') return <Tasks user={user}/>;
|
||||
return <Total user={user}/>;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
export default interface IPersonCommonProps {
|
||||
user: any;
|
||||
mode?: string;
|
||||
filters?: any;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,12 @@ function AuthorView({ response, updateSort, rowsForExcel, mode }: IAuthorViewPro
|
|||
const { t } = useTranslation();
|
||||
if (!response) return null;
|
||||
|
||||
const [works, dismissed, staff] = [
|
||||
t('page.team.author.type.work'),
|
||||
t('page.team.author.type.dismissed'),
|
||||
t('page.team.author.type.staff'),
|
||||
];
|
||||
|
||||
const textWork = t('page.team.author.worked');
|
||||
const textLosses = t('page.team.author.losses');
|
||||
const daysWorked = getOptions({ order: [textWork, textLosses], suffix: 'page.team.author.days' });
|
||||
|
@ -62,9 +68,9 @@ function AuthorView({ response, updateSort, rowsForExcel, mode }: IAuthorViewPro
|
|||
/>
|
||||
<Column
|
||||
template={(row: any) => {
|
||||
let value = 'работает';
|
||||
if (row.isDismissed) value = 'уволен';
|
||||
if (row.isStaff) value = 'помощник';
|
||||
let value = works;
|
||||
if (row.isDismissed) value = dismissed;
|
||||
if (row.isStaff) value = staff;
|
||||
return <UiKitTags value={value} />;
|
||||
}}
|
||||
width={100}
|
||||
|
@ -189,7 +195,7 @@ const Author = observer(({
|
|||
loader={(pagination?: IPaginationRequest, sort?: ISort[]) => getFakeLoader({
|
||||
content: rows, pagination, sort, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<AuthorView
|
||||
mode={mode}
|
||||
|
|
|
@ -146,7 +146,7 @@ const Extension = observer(({
|
|||
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||
content: rows, pagination, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<ExtensionView
|
||||
mode={mode}
|
||||
|
|
|
@ -127,7 +127,7 @@ const Release = observer(({
|
|||
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||
content: rows, pagination, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<ReleaseView
|
||||
mode={mode}
|
||||
|
|
|
@ -133,7 +133,7 @@ const Scope = observer(({
|
|||
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||
content: rows, pagination, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<ScopeView
|
||||
mode={mode}
|
||||
|
|
|
@ -30,7 +30,7 @@ interface ITasksViewProps {
|
|||
mode?: string;
|
||||
}
|
||||
|
||||
function TasksView({ response, updateSort, rowsForExcel, mode }: ITasksViewProps) {
|
||||
export function TasksView({ response, updateSort, rowsForExcel, mode }: ITasksViewProps) {
|
||||
if (!response) return null;
|
||||
|
||||
const commitsChart = getOptions({ max: getMax(response, 'commits'), suffix: 'page.team.type.tasksSmall' });
|
||||
|
@ -155,7 +155,7 @@ const Tasks = observer(({
|
|||
loader={(pagination?: IPaginationRequest, sort?: ISort[]) => getFakeLoader({
|
||||
content: rows, pagination, sort, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<br/>
|
||||
<br/>
|
||||
|
|
|
@ -133,6 +133,8 @@ const Tree = observer(({ type }: ITreeProps): React.ReactElement => {
|
|||
: dataGripStore.fileTree;
|
||||
const subTree = getSubTreeByPath(fileTree, treeStore.selectedPath);
|
||||
const fileList = getArrayFromTree(subTree);
|
||||
console.dir(dataGripStore.removedFileTree);
|
||||
console.dir(fileList);
|
||||
|
||||
// @ts-ignore
|
||||
if (!fileTree?.lines) return <NothingFound />;
|
||||
|
@ -145,6 +147,7 @@ const Tree = observer(({ type }: ITreeProps): React.ReactElement => {
|
|||
<>
|
||||
<Title title={t('common.filters')} />
|
||||
<TreeFilters/>
|
||||
{false && treeStore.selectedPath?.join('/')}
|
||||
<Title title="page.team.tree.title"/>
|
||||
<PageWrapper template="table">
|
||||
<DataLoader
|
||||
|
|
|
@ -137,7 +137,7 @@ const Type = observer(({
|
|||
loader={(pagination?: IPaginationRequest, sort?: ISort[]) => getFakeLoader({
|
||||
content: rows, pagination, sort, mode,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<TypeView
|
||||
mode={mode}
|
||||
|
|
|
@ -181,7 +181,7 @@ const Week = observer(({
|
|||
loader={(pagination?: IPaginationRequest, sort?: ISort[]) => getFakeLoader({
|
||||
content: rows, pagination, sort,
|
||||
})}
|
||||
watch={mode}
|
||||
watch={`${mode}${dataGripStore.dataGrip.hash}`}
|
||||
>
|
||||
<WeekView
|
||||
mode={mode}
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Der Text wurde kopiert
|
||||
§ uiKit.dataLoader.page: Seite
|
||||
§ uiKit.dataLoader.size: Wird nach angezeigt
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: aus
|
||||
§ uiKit.dataLoader.all: Alles anzeigen
|
||||
§ uiKit.hoursChart.work: normale Arbeitszeit (wochentags von 07:00 bis 20:00 Uhr)
|
||||
|
@ -24,4 +25,5 @@ Wenn dies ein Fehler ist und die Statistiken für diesen Mitarbeiter berücksich
|
|||
§ common.filters: Filter
|
||||
§ common.notifications.save: Änderungen gespeichert
|
||||
§ common.notifications.setting: Einstellungen gespeichert
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -35,6 +35,7 @@ export default `
|
|||
§ sidebar.person.day: Tageweise
|
||||
§ sidebar.person.week: Nach Wochen
|
||||
§ sidebar.person.month: Nach Monaten
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: Zeitplan
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: Alle Änderungen
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Received
|
||||
§ page.team.author.moneyWorked: Worked for
|
||||
§ page.team.author.moneyLosses: Overpayment
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
||||
§ page.team.month.title: Project work calendar
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Feature statistics
|
||||
§ page.team.scope.scope: Feature
|
||||
§ page.team.scope.days: Working Days
|
||||
|
@ -86,7 +91,7 @@ export default `
|
|||
§ page.team.total.description3: The *working and dismissed* card shows the actual composition of employees who are continuously involved in work. Additionally, there are "assistants" — typically employees of a different specialization who may occasionally make commits to the project.
|
||||
§ page.team.total.description4: *Overpayment* includes only working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation. This is why overpayment + actual cost != total. The total cost includes payment for weekends, public holidays, and vacations.
|
||||
§ page.team.total.description5: *Weekend work* is calculated at a rate of x2 the payment of a regular day. The displayed amount is specifically the overpayment (x1), as the fact of overtime in this context is not of interest. We focus on overpayment when increasing work speed.
|
||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
||||
§ page.team.tree.title: Project tree considering selected filters
|
||||
§ page.team.tree.filters.author: Employee
|
||||
§ page.team.tree.filters.commits: Number of commits
|
||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
||||
|
@ -101,7 +106,7 @@ export default `
|
|||
§ page.team.week.date: Date
|
||||
§ page.team.week.numberTasks: Number of tasks
|
||||
§ page.team.week.people: Number of people
|
||||
§ page.team.week.line: Line Changes
|
||||
§ page.team.week.line: Line changes
|
||||
§ page.team.week.days: Days with and without commits
|
||||
§ page.team.week.lossesDetails: Who did not commit
|
||||
§ page.team.week.add: added
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Text was copied
|
||||
§ uiKit.dataLoader.page: Page
|
||||
§ uiKit.dataLoader.size: Displayed
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: out of
|
||||
§ uiKit.dataLoader.all: Show all
|
||||
§ uiKit.hoursChart.work: standard working hours (weekdays, 07:00 to 20:00)
|
||||
|
@ -27,4 +28,5 @@ If this is an error and this employee needs to be calculated as usual, go to the
|
|||
§ common.filters: Filters
|
||||
§ common.notifications.save: The changes have been saved
|
||||
§ common.notifications.setting: The settings have been saved
|
||||
`;
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -35,6 +35,7 @@ export default `
|
|||
§ sidebar.person.day: By day
|
||||
§ sidebar.person.week: By week
|
||||
§ sidebar.person.month: By month
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: Work schedule
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: All changes
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Received
|
||||
§ page.team.author.moneyWorked: Worked for
|
||||
§ page.team.author.moneyLosses: Overpayment
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
||||
§ page.team.month.title: Project work calendar
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Feature statistics
|
||||
§ page.team.scope.scope: Feature
|
||||
§ page.team.scope.days: Working Days
|
||||
|
@ -86,7 +91,7 @@ export default `
|
|||
§ page.team.total.description3: The *working and dismissed* card shows the actual composition of employees who are continuously involved in work. Additionally, there are "assistants" — typically employees of a different specialization who may occasionally make commits to the project.
|
||||
§ page.team.total.description4: *Overpayment* includes only working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation. This is why overpayment + actual cost != total. The total cost includes payment for weekends, public holidays, and vacations.
|
||||
§ page.team.total.description5: *Weekend work* is calculated at a rate of x2 the payment of a regular day. The displayed amount is specifically the overpayment (x1), as the fact of overtime in this context is not of interest. We focus on overpayment when increasing work speed.
|
||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
||||
§ page.team.tree.title: Project tree considering selected filters
|
||||
§ page.team.tree.filters.author: Employee
|
||||
§ page.team.tree.filters.commits: Number of commits
|
||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
||||
|
@ -101,7 +106,7 @@ export default `
|
|||
§ page.team.week.date: Date
|
||||
§ page.team.week.numberTasks: Number of tasks
|
||||
§ page.team.week.people: Number of people
|
||||
§ page.team.week.line: Line Changes
|
||||
§ page.team.week.line: Line changes
|
||||
§ page.team.week.days: Days with and without commits
|
||||
§ page.team.week.lossesDetails: Who did not commit
|
||||
§ page.team.week.add: added
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Texto copiado
|
||||
§ uiKit.dataLoader.page: Página
|
||||
§ uiKit.dataLoader.size: Se muestra por
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: de
|
||||
§ uiKit.dataLoader.all: Mostrar todo
|
||||
§ uiKit.hoursChart.work: tiempo de trabajo estándar (lunes a viernes, de 07:00 a 20:00)
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: El texto ha sido copiado
|
||||
§ uiKit.dataLoader.page: Página
|
||||
§ uiKit.dataLoader.size: Mostrando hasta
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: de
|
||||
§ uiKit.dataLoader.all: Mostrar todo
|
||||
§ uiKit.hoursChart.work: horario laboral normal (lunes a viernes, de 07:00 a 20:00)
|
||||
|
@ -26,4 +27,5 @@ El trabajo de los colaboradores con este estatus en este proyecto puede desestim
|
|||
§ common.filters: Filtros
|
||||
§ common.notifications.save: Cambios guardados
|
||||
§ common.notifications.setting: Ajustes guardados
|
||||
`;
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -35,6 +35,7 @@ export default `
|
|||
§ sidebar.person.day: Por días
|
||||
§ sidebar.person.week: Por semana
|
||||
§ sidebar.person.month: Por mes
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: Horario
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: Todos los cambios
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Dinero recibido
|
||||
§ page.team.author.moneyWorked: Trabajo
|
||||
§ page.team.author.moneyLosses: Sobrepago
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Distribución del trabajo cada día de la semana
|
||||
§ page.team.month.title: Calendario del proyecto
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Estadísticas de módulos
|
||||
§ page.team.scope.scope: Elaboración definitiva
|
||||
§ page.team.scope.days: Siervo. día
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Texte copié
|
||||
§ uiKit.dataLoader.page: Page
|
||||
§ uiKit.dataLoader.size: Affiché par
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: de
|
||||
§ uiKit.dataLoader.all: Afficher tout
|
||||
§ uiKit.hoursChart.work: temps de travail standard (Les jours ouvrables de 07h00 à 20h00)
|
||||
|
@ -24,4 +25,5 @@ Si c’est une erreur et que la statistique pour ce collaborateur doit être pri
|
|||
§ common.filters: Filtres
|
||||
§ common.notifications.save: Modifications enregistrées
|
||||
§ common.notifications.setting: Paramètres enregistrés
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -33,6 +33,7 @@ export default `
|
|||
§ sidebar.person.day: Au jour le jour
|
||||
§ sidebar.person.week: Une semaine
|
||||
§ sidebar.person.month: Par mois
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: Horaire
|
||||
§ sidebar.person.commits: all commits
|
||||
§ sidebar.person.changes: Tous les changements
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: L'argent reçu
|
||||
§ page.team.author.moneyWorked: Travaillas
|
||||
§ page.team.author.moneyLosses: Trop-perçu
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Répartition du travail pour chaque jour de la semaine
|
||||
§ page.team.month.title: Calendrier du projet
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Statistiques par module
|
||||
§ page.team.scope.scope: Mise au point
|
||||
§ page.team.scope.days: Esclave. jours
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: テキストがコピーされました
|
||||
§ uiKit.dataLoader.page: ページ
|
||||
§ uiKit.dataLoader.size: によって表示される
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: から
|
||||
§ uiKit.dataLoader.all: すべて表示
|
||||
§ uiKit.hoursChart.work: 標準労働時間 (平日,から07:00へ20:00)
|
||||
|
@ -24,4 +25,5 @@ export default `
|
|||
§ common.filters: フィルター
|
||||
§ common.notifications.save: 変更は保存されます
|
||||
§ common.notifications.setting: 設定が保存されます
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -34,6 +34,7 @@ export default `
|
|||
§ sidebar.person.day: 日によって
|
||||
§ sidebar.person.week: 週ごと
|
||||
§ sidebar.person.month: 月別
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: スケジュール
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: すべての変更
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Received
|
||||
§ page.team.author.moneyWorked: Worked for
|
||||
§ page.team.author.moneyLosses: Overpayment
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
||||
§ page.team.month.title: Project work calendar
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Feature statistics
|
||||
§ page.team.scope.scope: Feature
|
||||
§ page.team.scope.days: Working Days
|
||||
|
@ -86,7 +91,7 @@ export default `
|
|||
§ page.team.total.description3: The *working and dismissed* card shows the actual composition of employees who are continuously involved in work. Additionally, there are "assistants" — typically employees of a different specialization who may occasionally make commits to the project.
|
||||
§ page.team.total.description4: *Overpayment* includes only working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation. This is why overpayment + actual cost != total. The total cost includes payment for weekends, public holidays, and vacations.
|
||||
§ page.team.total.description5: *Weekend work* is calculated at a rate of x2 the payment of a regular day. The displayed amount is specifically the overpayment (x1), as the fact of overtime in this context is not of interest. We focus on overpayment when increasing work speed.
|
||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
||||
§ page.team.tree.title: Project tree considering selected filters
|
||||
§ page.team.tree.filters.author: Employee
|
||||
§ page.team.tree.filters.commits: Number of commits
|
||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
||||
|
@ -101,7 +106,7 @@ export default `
|
|||
§ page.team.week.date: Date
|
||||
§ page.team.week.numberTasks: Number of tasks
|
||||
§ page.team.week.people: Number of people
|
||||
§ page.team.week.line: Line Changes
|
||||
§ page.team.week.line: Line changes
|
||||
§ page.team.week.days: Days with and without commits
|
||||
§ page.team.week.lossesDetails: Who did not commit
|
||||
§ page.team.week.add: added
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Texto copiado
|
||||
§ uiKit.dataLoader.page: Página
|
||||
§ uiKit.dataLoader.size: Exibido por
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: de
|
||||
§ uiKit.dataLoader.all: Mostrar tudo
|
||||
§ uiKit.hoursChart.work: Tempo de trabalho padrão. (dias de semana, das 07: 00 às 20:00)
|
||||
|
@ -24,4 +25,5 @@ Se este for um erro e a estatística para esse funcionário precisar ser levada
|
|||
§ common.filters: Filtro
|
||||
§ common.notifications.save: Alterações salvas
|
||||
§ common.notifications.setting: Configuração guardada
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -34,6 +34,7 @@ export default `
|
|||
§ sidebar.person.day: Por dia
|
||||
§ sidebar.person.week: Por semana
|
||||
§ sidebar.person.month: Por mês
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: Horário
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: Todas as alterações
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Received
|
||||
§ page.team.author.moneyWorked: Worked for
|
||||
§ page.team.author.moneyLosses: Overpayment
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
||||
§ page.team.month.title: Project work calendar
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Feature statistics
|
||||
§ page.team.scope.scope: Feature
|
||||
§ page.team.scope.days: Working Days
|
||||
|
@ -86,7 +91,7 @@ export default `
|
|||
§ page.team.total.description3: The *working and dismissed* card shows the actual composition of employees who are continuously involved in work. Additionally, there are "assistants" — typically employees of a different specialization who may occasionally make commits to the project.
|
||||
§ page.team.total.description4: *Overpayment* includes only working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation. This is why overpayment + actual cost != total. The total cost includes payment for weekends, public holidays, and vacations.
|
||||
§ page.team.total.description5: *Weekend work* is calculated at a rate of x2 the payment of a regular day. The displayed amount is specifically the overpayment (x1), as the fact of overtime in this context is not of interest. We focus on overpayment when increasing work speed.
|
||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
||||
§ page.team.tree.title: Project tree considering selected filters
|
||||
§ page.team.tree.filters.author: Employee
|
||||
§ page.team.tree.filters.commits: Number of commits
|
||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
||||
|
@ -101,7 +106,7 @@ export default `
|
|||
§ page.team.week.date: Date
|
||||
§ page.team.week.numberTasks: Number of tasks
|
||||
§ page.team.week.people: Number of people
|
||||
§ page.team.week.line: Line Changes
|
||||
§ page.team.week.line: Line changes
|
||||
§ page.team.week.days: Days with and without commits
|
||||
§ page.team.week.lossesDetails: Who did not commit
|
||||
§ page.team.week.add: added
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: Текст скопирован
|
||||
§ uiKit.dataLoader.page: Страница
|
||||
§ uiKit.dataLoader.size: Отображается по
|
||||
§ uiKit.dataLoader.rows: строк.
|
||||
§ uiKit.dataLoader.from: из
|
||||
§ uiKit.dataLoader.all: Показать все
|
||||
§ uiKit.hoursChart.work: стандартное рабочее время (будни, с 07:00 до 20:00)
|
||||
|
@ -24,4 +25,5 @@ export default `
|
|||
§ common.filters: Фильтры
|
||||
§ common.notifications.save: Изменения сохранены
|
||||
§ common.notifications.setting: Настройки сохранены
|
||||
§ common.fileLoader.notification: Ошибка загрузки файла $1
|
||||
`;
|
||||
|
|
|
@ -35,6 +35,7 @@ export default `
|
|||
§ sidebar.person.day: По дням
|
||||
§ sidebar.person.week: По неделям
|
||||
§ sidebar.person.month: По месяцам
|
||||
§ sidebar.person.tasks: Список задач
|
||||
§ sidebar.person.hours: Расписание
|
||||
§ sidebar.person.commits: Все коммиты
|
||||
§ sidebar.person.changes: Все изменения
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Получил
|
||||
§ page.team.author.moneyWorked: Отработал
|
||||
§ page.team.author.moneyLosses: Переплата
|
||||
§ page.team.author.type.work: работает
|
||||
§ page.team.author.type.dismissed: уволен
|
||||
§ page.team.author.type.staff: помощник
|
||||
§ page.team.hours.title: Распределение коммитов в течении каждого дня недели
|
||||
§ page.team.month.title: Календарь работы по проекту
|
||||
§ page.team.month.first: (первый рабочий день)
|
||||
§ page.team.month.last: (последний рабочий день)
|
||||
§ page.team.scope.title: Статистика по фичам
|
||||
§ page.team.scope.scope: Фича
|
||||
§ page.team.scope.days: Раб. дней
|
||||
|
@ -177,7 +182,7 @@ export default `
|
|||
§ page.person.business.time.description: Время от первого, до последнего коммита (в том числе, нерабочие дни)
|
||||
§ page.person.business.time.title: Дней на проекте:
|
||||
§ page.person.business.time.dismissed: (уволен)
|
||||
§ page.person.business.time.staff: (не в команде)
|
||||
§ page.person.business.time.staff: (помощник)
|
||||
§ page.person.business.achievements: Достижения
|
||||
§ page.person.changes.title: Достижения
|
||||
§ page.person.changes.description:
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: Денег получил
|
||||
§ page.team.author.moneyWorked: Отработал
|
||||
§ page.team.author.moneyLosses: Переплата
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: Распределение работы в течении каждого дня недели
|
||||
§ page.team.month.title: Календарь работы по проекту
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: Статистика по фичам
|
||||
§ page.team.scope.scope: Доработка
|
||||
§ page.team.scope.days: Раб. дней
|
||||
|
@ -170,7 +175,7 @@ export default `
|
|||
§ page.person.business.time.staff: (не в команде)
|
||||
§ page.person.business.achievements: Достижения
|
||||
§ page.person.changes.title: Достижения
|
||||
§ page.person.changes.description:
|
||||
§ page.person.changes.description:
|
||||
При некоторых видах форматирования git отмечает строки как «удалённые» и «добавленные»,
|
||||
хотя на самом деле они были «изменены». Поэтому, если вы провели большой рефакторинг,
|
||||
git может показать малое количество изменений в статистике, а фактический результат
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Закрыть
|
||||
§ recommendations.modal.open: Подробнее
|
||||
§ recommendations.title
|
||||
Рекомендации и факты
|
||||
|
||||
|
|
|
@ -51,13 +51,13 @@ export default `
|
|||
§ achievements.lessDaysInProject.description: least days in the project
|
||||
§ achievements.more90DaysInProject.title: Welcome aboard
|
||||
§ achievements.more90DaysInProject.description: not fired during the probation period
|
||||
§ achievements.lessDaysForTask.title: Quick draw
|
||||
§ achievements.lessDaysForTask.title: Fast shooting
|
||||
§ achievements.lessDaysForTask.description: a task takes less than a day
|
||||
§ achievements.adam.title: Adam
|
||||
§ achievements.adam.description: the first stable employee on the project
|
||||
§ achievements.more666DaysInProject.title: Devil
|
||||
§ achievements.more666DaysInProject.description: worked 666 days on the project
|
||||
§ achievements.more777DaysInProject.title: Azino three axes
|
||||
§ achievements.more777DaysInProject.title: Las Vegas
|
||||
§ achievements.more777DaysInProject.description: worked 777 days on the project
|
||||
§ achievements.moreRefactoring.title: Executive editor
|
||||
§ achievements.moreRefactoring.description: made the most 'refactoring' tags
|
||||
|
|
|
@ -3,6 +3,7 @@ export default `
|
|||
§ uiKit.console.notification: 文本已被复制
|
||||
§ uiKit.dataLoader.page: 页面
|
||||
§ uiKit.dataLoader.size: 显示的
|
||||
§ uiKit.dataLoader.rows: lines.
|
||||
§ uiKit.dataLoader.from: 从
|
||||
§ uiKit.dataLoader.all: 全部展示
|
||||
§ uiKit.hoursChart.work: 标准工作时间 (平日07:00~20:00)
|
||||
|
@ -24,4 +25,5 @@ export default `
|
|||
§ common.filters: 过滤器
|
||||
§ common.notifications.save: 将保存更改
|
||||
§ common.notifications.setting: 设置被保存
|
||||
§ common.fileLoader.notification: Cant open file $1
|
||||
`;
|
||||
|
|
|
@ -34,6 +34,7 @@ export default `
|
|||
§ sidebar.person.day: 白天
|
||||
§ sidebar.person.week: 按星期计算
|
||||
§ sidebar.person.month: 按月计算
|
||||
§ sidebar.person.tasks: Tasks
|
||||
§ sidebar.person.hours: 时间表
|
||||
§ sidebar.person.commits: All commits
|
||||
§ sidebar.person.changes: 所有更改
|
||||
|
|
|
@ -37,8 +37,13 @@ export default `
|
|||
§ page.team.author.moneyAll: 我拿到钱了
|
||||
§ page.team.author.moneyWorked: 工作了
|
||||
§ page.team.author.moneyLosses: 多付
|
||||
§ page.team.author.type.work: works
|
||||
§ page.team.author.type.dismissed: dismissed
|
||||
§ page.team.author.type.staff: staff
|
||||
§ page.team.hours.title: 每周每一天的工作分配
|
||||
§ page.team.month.title: 项目工作日历
|
||||
§ page.team.month.first: (first work day)
|
||||
§ page.team.month.last: (last work day)
|
||||
§ page.team.scope.title: 按模块划分的统计数字
|
||||
§ page.team.scope.scope: 修改
|
||||
§ page.team.scope.days: 工作天
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
export default `
|
||||
§ recommendations.modal.cancel: Ok
|
||||
§ recommendations.modal.open: More
|
||||
§ recommendations.title
|
||||
Recommendations and Facts
|
||||
Recommendations and facts
|
||||
|
||||
§ recommendations.timestamp.firstCommit.description
|
||||
made the first commit
|
||||
|
|
Loading…
Reference in a new issue