mirror of
https://github.com/bakhirev/assayo.git
synced 2024-11-16 16:21:41 +00:00
update
This commit is contained in:
parent
c7c541c709
commit
a4b269f1ca
|
@ -1,17 +1,17 @@
|
||||||
{
|
{
|
||||||
"files": {
|
"files": {
|
||||||
"main.css": "./static/css/main.0167aeb3.css",
|
"main.css": "./static/css/main.44209276.css",
|
||||||
"main.js": "./static/js/main.28c74018.js",
|
"main.js": "./static/js/main.5a210281.js",
|
||||||
"static/media/car.png": "./static/media/car.b8dd8738e37fe866285f.png",
|
"static/media/car.png": "./static/media/car.b8dd8738e37fe866285f.png",
|
||||||
"index.html": "./index.html",
|
"index.html": "./index.html",
|
||||||
"static/media/warning.svg": "./static/media/warning.e39a87773603f3ab157f.svg",
|
"static/media/warning.svg": "./static/media/warning.e39a87773603f3ab157f.svg",
|
||||||
"static/media/info.svg": "./static/media/info.954631f6b19e3fe9c495.svg",
|
"static/media/info.svg": "./static/media/info.954631f6b19e3fe9c495.svg",
|
||||||
"static/media/alert.svg": "./static/media/alert.41e2b99c481139c13074.svg",
|
"static/media/alert.svg": "./static/media/alert.41e2b99c481139c13074.svg",
|
||||||
"main.0167aeb3.css.map": "./static/css/main.0167aeb3.css.map",
|
"main.44209276.css.map": "./static/css/main.44209276.css.map",
|
||||||
"main.28c74018.js.map": "./static/js/main.28c74018.js.map"
|
"main.5a210281.js.map": "./static/js/main.5a210281.js.map"
|
||||||
},
|
},
|
||||||
"entrypoints": [
|
"entrypoints": [
|
||||||
"static/css/main.0167aeb3.css",
|
"static/css/main.44209276.css",
|
||||||
"static/js/main.28c74018.js"
|
"static/js/main.5a210281.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -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="black-translucent"><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.28c74018.js"></script><link href="./static/css/main.0167aeb3.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="black-translucent"><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.5a210281.js"></script><link href="./static/css/main.44209276.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
build/static/css/main.44209276.css
Normal file
2
build/static/css/main.44209276.css
Normal file
File diff suppressed because one or more lines are too long
1
build/static/css/main.44209276.css.map
Normal file
1
build/static/css/main.44209276.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.5a210281.js
Normal file
3
build/static/js/main.5a210281.js
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,7 +1,7 @@
|
||||||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
|
||||||
|
|
||||||
/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */
|
/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||||
|
|
||||||
|
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @license React
|
* @license React
|
||||||
* react-dom.production.min.js
|
* react-dom.production.min.js
|
1
build/static/js/main.5a210281.js.map
Normal file
1
build/static/js/main.5a210281.js.map
Normal file
File diff suppressed because one or more lines are too long
12
package-lock.json
generated
12
package-lock.json
generated
|
@ -5717,9 +5717,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001519",
|
"version": "1.0.30001597",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
|
||||||
"integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==",
|
"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
|
@ -22476,9 +22476,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001519",
|
"version": "1.0.30001597",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
|
||||||
"integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg=="
|
"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w=="
|
||||||
},
|
},
|
||||||
"case-sensitive-paths-webpack-plugin": {
|
"case-sensitive-paths-webpack-plugin": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
|
|
41213
public/test.txt
Normal file
41213
public/test.txt
Normal file
File diff suppressed because it is too large
Load diff
|
@ -13,6 +13,7 @@ import style from './index.module.scss';
|
||||||
import PageWrapper from '../Page/wrapper';
|
import PageWrapper from '../Page/wrapper';
|
||||||
|
|
||||||
interface IDataViewProps {
|
interface IDataViewProps {
|
||||||
|
rowsForExcel?: any[];
|
||||||
rows: any[];
|
rows: any[];
|
||||||
type?: string;
|
type?: string;
|
||||||
sort?: ISort[];
|
sort?: ISort[];
|
||||||
|
@ -25,6 +26,7 @@ interface IDataViewProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
function DataView({
|
function DataView({
|
||||||
|
rowsForExcel = [],
|
||||||
rows = [],
|
rows = [],
|
||||||
sort = [],
|
sort = [],
|
||||||
type,
|
type,
|
||||||
|
@ -62,7 +64,7 @@ function DataView({
|
||||||
className={style.data_view_icon}
|
className={style.data_view_icon}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
const fileName = t(`sidebar.${urlParams.type}.${urlParams.page}`);
|
const fileName = t(`sidebar.${urlParams.type}.${urlParams.page}`);
|
||||||
downloadExcel(rows, children, fileName);
|
downloadExcel(rowsForExcel || rows, children, fileName);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
|
|
||||||
// import DropZoneIcon from '../../../assets/dropzone.svg';
|
|
||||||
import { getOnDrop, getShowDropZone } from './helpers';
|
import { getOnDrop, getShowDropZone } from './helpers';
|
||||||
import style from './index.module.scss';
|
import style from './index.module.scss';
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ function UiKitTags({
|
||||||
const values = Array.isArray(value) ? value : [value];
|
const values = Array.isArray(value) ? value : [value];
|
||||||
const formattedValues = values.filter((v) => v);
|
const formattedValues = values.filter((v) => v);
|
||||||
|
|
||||||
console.dir(formattedValues);
|
|
||||||
const items = formattedValues
|
const items = formattedValues
|
||||||
.map((tagValue: any) => (
|
.map((tagValue: any) => (
|
||||||
<UiKitTag
|
<UiKitTag
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import IHashMap from 'ts/interfaces/HashMap';
|
import IHashMap from 'ts/interfaces/HashMap';
|
||||||
|
import { IDirtyFile } from 'ts/interfaces/FileInfo';
|
||||||
import MinMaxCounter from './counter';
|
|
||||||
|
|
||||||
const IGNORE_LIST = [
|
const IGNORE_LIST = [
|
||||||
'.eslintrc',
|
'.eslintrc',
|
||||||
|
@ -20,86 +19,58 @@ export default class DataGripByExtension {
|
||||||
this.statisticByName = {};
|
this.statisticByName = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTotalInfo(fileList: any[], byAuthor: any) {
|
updateTotalInfo(fileList: IDirtyFile[], removedFileList: IDirtyFile[]) {
|
||||||
const byExtension = {};
|
const byExtension = {};
|
||||||
console.dir(fileList);
|
|
||||||
|
|
||||||
fileList.forEach((file: any) => {
|
fileList.forEach((file: any) => {
|
||||||
if (!file.extension
|
this.#updateStatistic(file, byExtension, 'current');
|
||||||
|| IGNORE_LIST.includes(file.name)) return;
|
|
||||||
if (!byExtension[file.extension]) {
|
|
||||||
byExtension[file.extension] = {
|
|
||||||
extension: file.extension,
|
|
||||||
authors: {},
|
|
||||||
files: { [file.firstName]: 1 },
|
|
||||||
count: 1,
|
|
||||||
more: {},
|
|
||||||
total: {
|
|
||||||
added: 0,
|
|
||||||
changes: 0,
|
|
||||||
removed: 0,
|
|
||||||
total: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
const numberNames = byExtension[file.extension].files[file.firstName];
|
|
||||||
byExtension[file.extension].files[file.firstName] = numberNames
|
|
||||||
? (numberNames + 1)
|
|
||||||
: 1;
|
|
||||||
byExtension[file.extension].count += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let author in file.authors) {
|
|
||||||
if (!author
|
|
||||||
|| byAuthor.statisticByName[author]?.isStaff) return;
|
|
||||||
byExtension[file.extension].authors[author] = byExtension[file.extension].authors[author]
|
|
||||||
|| { added: 0, changes: 0, removed: 0 };
|
|
||||||
|
|
||||||
const statistic = file.authors[author];
|
|
||||||
const total = byExtension[file.extension].authors[author];
|
|
||||||
total.added += statistic.added;
|
|
||||||
total.changes += statistic.changes;
|
|
||||||
total.removed += statistic.removed;
|
|
||||||
|
|
||||||
byExtension[file.extension].total.added += statistic.added;
|
|
||||||
byExtension[file.extension].total.changes += statistic.changes;
|
|
||||||
byExtension[file.extension].total.removed += statistic.removed;
|
|
||||||
byExtension[file.extension].total.total += statistic.added + statistic.changes + statistic.removed;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.#addMorePercent(byExtension);
|
removedFileList.forEach((file: any) => {
|
||||||
|
this.#updateStatistic(file, byExtension, 'removed');
|
||||||
|
});
|
||||||
|
|
||||||
this.statistic = Object.entries(byExtension)
|
this.statistic = Object.entries(byExtension)
|
||||||
.sort((a: any, b: any) => b[1].count - a[1].count)
|
.sort((a: any, b: any) => b[1].current.count - a[1].current.count)
|
||||||
.map((item: any) => item[1]);
|
.map((item: any) => {
|
||||||
|
if (item[1].removed.count !== 1 && item[1].current.count !== 1) {
|
||||||
|
item[1].path = null;
|
||||||
|
}
|
||||||
|
return item[1];
|
||||||
|
});
|
||||||
|
|
||||||
this.statisticByName = byExtension;
|
this.statisticByName = byExtension;
|
||||||
}
|
}
|
||||||
|
|
||||||
#addMorePercent(byExtension: any) {
|
#updateStatistic(
|
||||||
for (let extension in byExtension) {
|
file: IDirtyFile,
|
||||||
const moreAdded = new MinMaxCounter();
|
group: Record<string, any>,
|
||||||
const moreChanges = new MinMaxCounter();
|
type: 'current' | 'removed',
|
||||||
const moreRemoved = new MinMaxCounter();
|
) {
|
||||||
|
if (!file.extension
|
||||||
|
|| IGNORE_LIST.includes(file.name)) return;
|
||||||
|
|
||||||
for (let author in byExtension[extension].authors) {
|
if (!group[file.extension]) {
|
||||||
const statistic = byExtension[extension].authors[author];
|
group[file.extension] = this.#getNewExtension(file);
|
||||||
const total = statistic.added + statistic.changes + statistic.removed;
|
|
||||||
|
|
||||||
statistic.addedPercent = (statistic.added * 100) / total;
|
|
||||||
statistic.changesPercent = (statistic.changes * 100) / total;
|
|
||||||
statistic.removedPercent = (statistic.removed * 100) / total;
|
|
||||||
|
|
||||||
moreAdded.update(statistic.addedPercent, author);
|
|
||||||
moreChanges.update(statistic.changesPercent, author);
|
|
||||||
moreRemoved.update(statistic.removedPercent, author);
|
|
||||||
}
|
|
||||||
|
|
||||||
byExtension[extension].more = {
|
|
||||||
added: { percent: moreAdded.max, author: moreAdded.maxData },
|
|
||||||
changes: { percent: moreChanges.max, author: moreChanges.maxData },
|
|
||||||
removed: { percent: moreRemoved.max, author: moreRemoved.maxData },
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
group[file.extension][type].files[file.name] = file.firstName;
|
||||||
|
group[file.extension][type].count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#getNewExtension(file: IDirtyFile) {
|
||||||
|
return {
|
||||||
|
extension: file.extension,
|
||||||
|
authors: {},
|
||||||
|
task: file.created.task,
|
||||||
|
path: file.name,
|
||||||
|
current: {
|
||||||
|
files: {},
|
||||||
|
count: 0,
|
||||||
|
},
|
||||||
|
removed: {
|
||||||
|
files: {},
|
||||||
|
count: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
86
src/ts/helpers/DataGrip/components/release.ts
Normal file
86
src/ts/helpers/DataGrip/components/release.ts
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
import { COMMIT_TYPE, ISystemCommit } from 'ts/interfaces/Commit';
|
||||||
|
import IHashMap from 'ts/interfaces/HashMap';
|
||||||
|
|
||||||
|
import settingsStore from 'ts/store/Settings';
|
||||||
|
|
||||||
|
function getRangeInDay(fromObject: any, toObject: any, gap?: number) {
|
||||||
|
const to = toObject.milliseconds;
|
||||||
|
const from = fromObject.milliseconds;
|
||||||
|
const delay = ((to - from) / settingsStore.ONE_DAY) - (gap || 0);
|
||||||
|
return to !== from && delay > 0 ? delay : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class DataGripByRelease {
|
||||||
|
release: IHashMap<any> = {};
|
||||||
|
|
||||||
|
statistic: any[] = [];
|
||||||
|
|
||||||
|
statisticByName: IHashMap<any> = [];
|
||||||
|
|
||||||
|
clear() {
|
||||||
|
this.release = {};
|
||||||
|
this.statistic = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
addCommit(commit: ISystemCommit) {
|
||||||
|
if (commit.commitType === COMMIT_TYPE.AUTO_MERGE) {
|
||||||
|
if (this.release[commit.branch]) {
|
||||||
|
this.#updateRelease(commit);
|
||||||
|
} else {
|
||||||
|
this.#addRelease(commit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#updateRelease(commit: ISystemCommit) {
|
||||||
|
const statistic = this.release[commit.branch];
|
||||||
|
statistic.lastCommit = commit;
|
||||||
|
statistic.to = commit.timestamp;
|
||||||
|
statistic.delayInDays = getRangeInDay(statistic.firstCommit, commit) || statistic.delayInDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
#addRelease(commit: ISystemCommit) {
|
||||||
|
if (!commit.branch) return;
|
||||||
|
|
||||||
|
const index = commit.branch.lastIndexOf('release');
|
||||||
|
if (index === -1) return;
|
||||||
|
|
||||||
|
const title = commit.branch
|
||||||
|
.substring(index + 7)
|
||||||
|
.replace(/([^\w.]*)/, '')
|
||||||
|
.trim();
|
||||||
|
|
||||||
|
this.release[commit.branch] = {
|
||||||
|
title,
|
||||||
|
firstCommit: commit,
|
||||||
|
lastCommit: commit,
|
||||||
|
from: commit.timestamp,
|
||||||
|
to: null,
|
||||||
|
delayInDays: 0,
|
||||||
|
waitingInDays: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
updateTotalInfo() {
|
||||||
|
let prev: any = null;
|
||||||
|
|
||||||
|
this.statistic = Object.entries(this.release)
|
||||||
|
.sort((a: any, b: any) => a[1].firstCommit.milliseconds - b[1].firstCommit.milliseconds)
|
||||||
|
.map((a: any) => {
|
||||||
|
const item = a[1];
|
||||||
|
|
||||||
|
item.to = item.from !== item.to && item.to
|
||||||
|
? item.lastCommit.date
|
||||||
|
: null;
|
||||||
|
item.from = item.firstCommit.date;
|
||||||
|
|
||||||
|
if (prev) {
|
||||||
|
prev.waitingInDays = getRangeInDay(prev.lastCommit, item.firstCommit, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = item;
|
||||||
|
return item;
|
||||||
|
})
|
||||||
|
.reverse();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
import ICommit, { ISystemCommit } from 'ts/interfaces/Commit';
|
import ICommit, { ISystemCommit } from 'ts/interfaces/Commit';
|
||||||
|
import { IDirtyFile } from 'ts/interfaces/FileInfo';
|
||||||
|
|
||||||
import settingsStore from 'ts/store/Settings';
|
import settingsStore from 'ts/store/Settings';
|
||||||
import Recommendations from 'ts/helpers/Recommendations';
|
import Recommendations from 'ts/helpers/Recommendations';
|
||||||
|
|
||||||
|
@ -13,6 +15,7 @@ import DataGripByExtension from './components/extension';
|
||||||
import DataGripByGet from './components/get';
|
import DataGripByGet from './components/get';
|
||||||
import DataGripByPR from './components/pr';
|
import DataGripByPR from './components/pr';
|
||||||
import DataGripByTasks from './components/tasks';
|
import DataGripByTasks from './components/tasks';
|
||||||
|
import DataGripByRelease from './components/release';
|
||||||
|
|
||||||
class DataGrip {
|
class DataGrip {
|
||||||
firstLastCommit: any = new MinMaxCounter();
|
firstLastCommit: any = new MinMaxCounter();
|
||||||
|
@ -39,6 +42,8 @@ class DataGrip {
|
||||||
|
|
||||||
tasks: any = new DataGripByTasks();
|
tasks: any = new DataGripByTasks();
|
||||||
|
|
||||||
|
release: any = new DataGripByRelease();
|
||||||
|
|
||||||
initializationInfo: any = {};
|
initializationInfo: any = {};
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
@ -54,11 +59,13 @@ class DataGrip {
|
||||||
this.get.clear();
|
this.get.clear();
|
||||||
this.pr.clear();
|
this.pr.clear();
|
||||||
this.tasks.clear();
|
this.tasks.clear();
|
||||||
|
this.release.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
addCommit(commit: ICommit | ISystemCommit) {
|
addCommit(commit: ICommit | ISystemCommit) {
|
||||||
if (commit.author === 'GitHub') return;
|
if (commit.author === 'GitHub') return;
|
||||||
this.pr.addCommit(commit); // @ts-ignore
|
this.pr.addCommit(commit); // @ts-ignore
|
||||||
|
this.release.addCommit(commit); // @ts-ignore
|
||||||
if (!commit.commitType) {
|
if (!commit.commitType) {
|
||||||
this.firstLastCommit.update(commit.milliseconds, commit);
|
this.firstLastCommit.update(commit.milliseconds, commit);
|
||||||
this.author.addCommit(commit);
|
this.author.addCommit(commit);
|
||||||
|
@ -81,6 +88,7 @@ class DataGrip {
|
||||||
this.recommendations.updateTotalInfo(this);
|
this.recommendations.updateTotalInfo(this);
|
||||||
this.pr.updateTotalInfo(this.author);
|
this.pr.updateTotalInfo(this.author);
|
||||||
this.tasks.updateTotalInfo(this.pr);
|
this.tasks.updateTotalInfo(this.pr);
|
||||||
|
this.release.updateTotalInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateByInitialization() {
|
updateByInitialization() {
|
||||||
|
@ -104,8 +112,8 @@ class DataGrip {
|
||||||
this.#updateTotalInfo();
|
this.#updateTotalInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateByFiles(fileList: any[]) {
|
updateByFiles(fileList: IDirtyFile[], removedFileList: IDirtyFile[]) {
|
||||||
this.extension.updateTotalInfo(fileList, this.author);
|
this.extension.updateTotalInfo(fileList, removedFileList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { utils, writeFile } from 'xlsx';
|
||||||
|
|
||||||
import localization from 'ts/helpers/Localization';
|
import localization from 'ts/helpers/Localization';
|
||||||
import { ColumnTypesEnum, IColumn } from '../components/Table/interfaces/Column';
|
import { ColumnTypesEnum, IColumn } from '../components/Table/interfaces/Column';
|
||||||
|
import { getDate, getDateForExcel } from './formatter';
|
||||||
// import localization from './Localization';
|
// import localization from './Localization';
|
||||||
|
|
||||||
export function downloadFile(file: Blob, fileName: string) {
|
export function downloadFile(file: Blob, fileName: string) {
|
||||||
|
@ -43,6 +44,10 @@ function getFormatter(columns: IColumn[]) {
|
||||||
? item[column.properties]
|
? item[column.properties]
|
||||||
: item;
|
: item;
|
||||||
|
|
||||||
|
if (column.formatter === getDate) {
|
||||||
|
return getDateForExcel(value);
|
||||||
|
}
|
||||||
|
|
||||||
if (column.formatter) {
|
if (column.formatter) {
|
||||||
value = column.formatter(value);
|
value = column.formatter(value);
|
||||||
}
|
}
|
||||||
|
@ -53,7 +58,9 @@ function getFormatter(columns: IColumn[]) {
|
||||||
|
|
||||||
const type = typeof value;
|
const type = typeof value;
|
||||||
if (type === 'object') {
|
if (type === 'object') {
|
||||||
return JSON.stringify(value);
|
return Object.entries(value)
|
||||||
|
.map((row: any) => row.join(': '))
|
||||||
|
.join(', ');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'string') {
|
if (type === 'string') {
|
||||||
|
|
|
@ -8,10 +8,7 @@ import { getNewFileName, getFileList } from './files';
|
||||||
import { getNewFileInfo } from './file_info';
|
import { getNewFileInfo } from './file_info';
|
||||||
|
|
||||||
const uniq = {};
|
const uniq = {};
|
||||||
export default function Parser(
|
export default function Parser(report: string[]) {
|
||||||
report: string[],
|
|
||||||
parseCommit: Function,
|
|
||||||
) {
|
|
||||||
const allFiles: IHashMap<IDirtyFile> = {};
|
const allFiles: IHashMap<IDirtyFile> = {};
|
||||||
const removedFiles: IHashMap<IDirtyFile> = {};
|
const removedFiles: IHashMap<IDirtyFile> = {};
|
||||||
const commits: Array<ICommit | ISystemCommit> = [];
|
const commits: Array<ICommit | ISystemCommit> = [];
|
||||||
|
@ -94,7 +91,6 @@ export default function Parser(
|
||||||
// console.log(`double ${uniq[prev.date]} === ${i}`);
|
// console.log(`double ${uniq[prev.date]} === ${i}`);
|
||||||
}
|
}
|
||||||
uniq[prev.date] = i;
|
uniq[prev.date] = i;
|
||||||
parseCommit(prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const next = getUserInfo(message);
|
const next = getUserInfo(message);
|
||||||
|
@ -109,7 +105,6 @@ export default function Parser(
|
||||||
commits.push(prev); // @ts-ignore
|
commits.push(prev); // @ts-ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (prev) parseCommit(prev);
|
|
||||||
|
|
||||||
const { fileList, fileTree } = getFileList(allFiles);
|
const { fileList, fileTree } = getFileList(allFiles);
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -39,12 +39,13 @@ export default function getUserInfo(logString: string): ICommit | ISystemCommit
|
||||||
|
|
||||||
const isSystemPR = message.indexOf('Pull request #') === 0;
|
const isSystemPR = message.indexOf('Pull request #') === 0;
|
||||||
const isSystemMerge = message.indexOf('Merge pull request #') === 0;
|
const isSystemMerge = message.indexOf('Merge pull request #') === 0;
|
||||||
const isAutoMerge = message.indexOf('Merge branch ') === 0
|
const isMerge = message.indexOf('Merge branch ') === 0
|
||||||
|| message.indexOf('Merge remote-tracking branch') === 0
|
|| message.indexOf('Merge commit ') === 0;
|
||||||
|| message.indexOf('Merge commit ') === 0
|
const isAutoMerge = message.indexOf('Automatic merge from') === 0
|
||||||
|| message.indexOf('Automatic merge from') === 0;
|
|| message.indexOf('Merge remote-tracking branch') === 0;
|
||||||
const isSystemCommit = isSystemPR
|
const isSystemCommit = isSystemPR
|
||||||
|| isSystemMerge
|
|| isSystemMerge
|
||||||
|
|| isMerge
|
||||||
|| isAutoMerge;
|
|| isAutoMerge;
|
||||||
|
|
||||||
if (isSystemCommit) {
|
if (isSystemCommit) {
|
||||||
|
@ -61,6 +62,11 @@ export default function getUserInfo(logString: string): ICommit | ISystemCommit
|
||||||
const messageParts = message.substring(14, Infinity).split(':');
|
const messageParts = message.substring(14, Infinity).split(':');
|
||||||
prId = messageParts.shift();
|
prId = messageParts.shift();
|
||||||
task = getTask(messageParts.join(':'));
|
task = getTask(messageParts.join(':'));
|
||||||
|
} else if (isAutoMerge) {
|
||||||
|
[, branch, toBranch ] = message
|
||||||
|
.replace(/(Automatic\smerge\sfrom\s)|(\s->\s)/gim, ',')
|
||||||
|
.replace(/(Merge\sremote-tracking\sbranch\s')|('\sinto\s)/gim, ',')
|
||||||
|
.split(',');
|
||||||
}
|
}
|
||||||
taskNumber = getTaskNumber(task);
|
taskNumber = getTaskNumber(task);
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,12 @@ export function getDate(timestamp: string) {
|
||||||
return date.toLocaleString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' });
|
return date.toLocaleString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDateForExcel(timestamp: string) {
|
||||||
|
if (!timestamp) return '';
|
||||||
|
const date = new Date(timestamp);
|
||||||
|
return date.toISOString().substring(0, 10).split('-').reverse().join('.');
|
||||||
|
}
|
||||||
|
|
||||||
export function getShortDate(timestamp: string) {
|
export function getShortDate(timestamp: string) {
|
||||||
if (!timestamp) return '';
|
if (!timestamp) return '';
|
||||||
const date = new Date(timestamp);
|
const date = new Date(timestamp);
|
||||||
|
|
|
@ -29,7 +29,7 @@ function getTranslationWrapper(translation: string) {
|
||||||
|
|
||||||
i18next.use(initReactI18next).init({
|
i18next.use(initReactI18next).init({
|
||||||
lng: 'ru', // if you're using a language detector, do not define the lng option
|
lng: 'ru', // if you're using a language detector, do not define the lng option
|
||||||
debug: true,
|
debug: false,
|
||||||
resources: {
|
resources: {
|
||||||
ru: getTranslationWrapper(ru),
|
ru: getTranslationWrapper(ru),
|
||||||
en: getTranslationWrapper(en),
|
en: getTranslationWrapper(en),
|
||||||
|
|
|
@ -6,6 +6,8 @@ export interface IDirtyFile {
|
||||||
lines: number; // 38, line in file for this moment
|
lines: number; // 38, line in file for this moment
|
||||||
created: ICommit,
|
created: ICommit,
|
||||||
path: string[],
|
path: string[],
|
||||||
|
extension: string,
|
||||||
|
firstName: string,
|
||||||
authors: {
|
authors: {
|
||||||
[author: string]: {
|
[author: string]: {
|
||||||
added: number; // 38,
|
added: number; // 38,
|
||||||
|
|
|
@ -69,9 +69,21 @@ export const TEAM = [
|
||||||
},
|
},
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
id: 'tree',
|
id: 'files',
|
||||||
link: '/team/tree',
|
link: '/team/files',
|
||||||
title: 'sidebar.team.tree',
|
title: 'sidebar.team.files',
|
||||||
|
icon: './assets/menu/team_files.svg',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'removedFiles',
|
||||||
|
link: '/team/removedFiles',
|
||||||
|
title: 'sidebar.team.removedFiles',
|
||||||
|
icon: './assets/menu/team_files.svg',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'extension',
|
||||||
|
link: '/team/extension',
|
||||||
|
title: 'sidebar.team.extension',
|
||||||
icon: './assets/menu/team_files.svg',
|
icon: './assets/menu/team_files.svg',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -80,6 +92,12 @@ export const TEAM = [
|
||||||
title: 'sidebar.team.tasks',
|
title: 'sidebar.team.tasks',
|
||||||
icon: './assets/menu/team_date_1.svg',
|
icon: './assets/menu/team_date_1.svg',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'release',
|
||||||
|
link: '/team/release',
|
||||||
|
title: 'sidebar.team.release',
|
||||||
|
icon: './assets/menu/team_date_1.svg',
|
||||||
|
},
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
id: 'commits',
|
id: 'commits',
|
||||||
|
|
|
@ -11,6 +11,7 @@ import dataGripStore from 'ts/store/DataGrip';
|
||||||
import ICommonPageProps from 'ts/components/Page/interfaces/CommonPageProps';
|
import ICommonPageProps from 'ts/components/Page/interfaces/CommonPageProps';
|
||||||
import PageWrapper from 'ts/components/Page/wrapper';
|
import PageWrapper from 'ts/components/Page/wrapper';
|
||||||
import PageColumn from 'ts/components/Page/column';
|
import PageColumn from 'ts/components/Page/column';
|
||||||
|
import UiKitTags from 'ts/components/UiKit/components/Tags';
|
||||||
import DataLoader from 'ts/components/DataLoader';
|
import DataLoader from 'ts/components/DataLoader';
|
||||||
import Pagination from 'ts/components/DataLoader/components/Pagination';
|
import Pagination from 'ts/components/DataLoader/components/Pagination';
|
||||||
import getFakeLoader from 'ts/components/DataLoader/helpers/formatter';
|
import getFakeLoader from 'ts/components/DataLoader/helpers/formatter';
|
||||||
|
@ -29,10 +30,11 @@ import Description from 'ts/components/Description';
|
||||||
interface IAuthorViewProps {
|
interface IAuthorViewProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function AuthorView({ response, updateSort, mode }: IAuthorViewProps) {
|
function AuthorView({ response, updateSort, rowsForExcel, mode }: IAuthorViewProps) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
|
@ -45,6 +47,7 @@ function AuthorView({ response, updateSort, mode }: IAuthorViewProps) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
@ -57,6 +60,15 @@ function AuthorView({ response, updateSort, mode }: IAuthorViewProps) {
|
||||||
properties="author"
|
properties="author"
|
||||||
width={200}
|
width={200}
|
||||||
/>
|
/>
|
||||||
|
<Column
|
||||||
|
template={(row: any) => {
|
||||||
|
let value = 'работает';
|
||||||
|
if (row.isDismissed) value = 'уволен';
|
||||||
|
if (row.isStaff) value = 'помощник';
|
||||||
|
return <UiKitTags value={value} />;
|
||||||
|
}}
|
||||||
|
width={100}
|
||||||
|
/>
|
||||||
<Column
|
<Column
|
||||||
isSortable="daysWorked"
|
isSortable="daysWorked"
|
||||||
title="page.team.author.workedLosses"
|
title="page.team.author.workedLosses"
|
||||||
|
@ -179,7 +191,10 @@ const Author = observer(({
|
||||||
})}
|
})}
|
||||||
watch={mode}
|
watch={mode}
|
||||||
>
|
>
|
||||||
<AuthorView mode={mode} />
|
<AuthorView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
<Pagination />
|
<Pagination />
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
|
|
161
src/ts/pages/Team/components/Extension2.tsx
Normal file
161
src/ts/pages/Team/components/Extension2.tsx
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { observer } from 'mobx-react-lite';
|
||||||
|
|
||||||
|
import { IPaginationRequest, IPagination } from 'ts/interfaces/Pagination';
|
||||||
|
import dataGripStore from 'ts/store/DataGrip';
|
||||||
|
|
||||||
|
import ICommonPageProps from 'ts/components/Page/interfaces/CommonPageProps';
|
||||||
|
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 Title from 'ts/components/Title';
|
||||||
|
import DataView from 'ts/components/DataView';
|
||||||
|
import Column from 'ts/components/Table/components/Column';
|
||||||
|
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
||||||
|
import getOptions from 'ts/components/LineChart/helpers/getOptions';
|
||||||
|
import LineChart from 'ts/components/LineChart';
|
||||||
|
import { getMax } from 'ts/pages/Common/helpers/getMax';
|
||||||
|
import ExternalLink from 'ts/components/ExternalLink';
|
||||||
|
import userSettings from 'ts/store/UserSettings';
|
||||||
|
|
||||||
|
interface IFilesViewProps {
|
||||||
|
response?: IPagination<any>;
|
||||||
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
|
mode?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ExtensionView({ response, updateSort, rowsForExcel, mode }: IFilesViewProps) {
|
||||||
|
if (!response) return null;
|
||||||
|
|
||||||
|
const current = getMax(response, 'current', 'count');
|
||||||
|
const removed = getMax(response, 'removed', 'count');
|
||||||
|
const max = Math.max(current, removed);
|
||||||
|
const filesChart = getOptions({ max, suffix: 'page.team.extension.files' });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
|
rows={response.content}
|
||||||
|
sort={response.sort}
|
||||||
|
updateSort={updateSort}
|
||||||
|
type={mode === 'print' ? 'cards' : undefined}
|
||||||
|
columnCount={mode === 'print' ? 3 : undefined}
|
||||||
|
>
|
||||||
|
<Column
|
||||||
|
isFixed
|
||||||
|
template={ColumnTypesEnum.STRING}
|
||||||
|
title="page.team.extension.name"
|
||||||
|
properties="extension"
|
||||||
|
width={200}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.STRING}
|
||||||
|
title="page.team.extension.path"
|
||||||
|
width={350}
|
||||||
|
properties="path"
|
||||||
|
/>
|
||||||
|
{mode === 'print' ? (
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
title="page.team.pr.task"
|
||||||
|
properties="task"
|
||||||
|
width={120}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
template={(value: string, row: any) => {
|
||||||
|
if (!row.path) return '';
|
||||||
|
return (
|
||||||
|
<ExternalLink
|
||||||
|
link={`${userSettings?.settings?.linksPrefix?.task || '/'}${value}`}
|
||||||
|
text={value}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
title="page.team.pr.task"
|
||||||
|
properties="task"
|
||||||
|
width={120}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.SHORT_NUMBER}
|
||||||
|
properties="current"
|
||||||
|
formatter={(value: any) => value.count}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
title="page.team.extension.current.count"
|
||||||
|
properties="current"
|
||||||
|
width={170}
|
||||||
|
minWidth={170}
|
||||||
|
template={(value: any) => (
|
||||||
|
<LineChart
|
||||||
|
options={filesChart}
|
||||||
|
value={value.count}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.SHORT_NUMBER}
|
||||||
|
properties="removed"
|
||||||
|
formatter={(value: any) => value.count}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
title="page.team.extension.removed.count"
|
||||||
|
properties="removed"
|
||||||
|
width={170}
|
||||||
|
minWidth={170}
|
||||||
|
template={(value: any) => (
|
||||||
|
<LineChart
|
||||||
|
options={filesChart}
|
||||||
|
value={value.count}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</DataView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtensionView.defaultProps = {
|
||||||
|
response: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
const Extension = observer(({
|
||||||
|
mode,
|
||||||
|
}: ICommonPageProps): React.ReactElement | null => {
|
||||||
|
const rows = dataGripStore.dataGrip.extension.statistic;
|
||||||
|
if (rows?.length < 2) return mode !== 'print' ? (<NothingFound />) : null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{mode === 'print' ? (
|
||||||
|
<Title title="sidebar.team.extension"/>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<DataLoader
|
||||||
|
to="response"
|
||||||
|
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||||
|
content: rows, pagination, mode,
|
||||||
|
})}
|
||||||
|
watch={mode}
|
||||||
|
>
|
||||||
|
<ExtensionView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
|
<Pagination />
|
||||||
|
</DataLoader>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default Extension;
|
|
@ -15,15 +15,17 @@ import { getMax } from 'ts/pages/Common/helpers/getMax';
|
||||||
import { getDate } from 'ts/helpers/formatter';
|
import { getDate } from 'ts/helpers/formatter';
|
||||||
|
|
||||||
interface IPRViewProps {
|
interface IPRViewProps {
|
||||||
mode?: string;
|
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function AllPR({
|
function AllPR({
|
||||||
mode,
|
|
||||||
response,
|
response,
|
||||||
updateSort,
|
updateSort,
|
||||||
|
rowsForExcel,
|
||||||
|
mode,
|
||||||
}: IPRViewProps) {
|
}: IPRViewProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
|
@ -36,6 +38,7 @@ function AllPR({
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
|
|
@ -22,10 +22,11 @@ const order = Object.values(TITLES);
|
||||||
interface IAuthorsProps {
|
interface IAuthorsProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Authors({ response, updateSort, mode }: IAuthorsProps) {
|
function Authors({ response, updateSort, rowsForExcel, mode }: IAuthorsProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
const timeChart = getOptions({ order, limit: 3 });
|
const timeChart = getOptions({ order, limit: 3 });
|
||||||
|
@ -40,6 +41,7 @@ function Authors({ response, updateSort, mode }: IAuthorsProps) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
|
|
@ -62,7 +62,10 @@ const PR = observer(({
|
||||||
content: authorsStat, pagination, sort, mode,
|
content: authorsStat, pagination, sort, mode,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<Authors mode={mode}/>
|
<Authors
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={authorsStat}
|
||||||
|
/>
|
||||||
<Pagination/>
|
<Pagination/>
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
|
|
||||||
|
@ -78,7 +81,10 @@ const PR = observer(({
|
||||||
sort,
|
sort,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<All mode={mode} />
|
<All
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
{mode !== 'print' && <Pagination/>}
|
{mode !== 'print' && <Pagination/>}
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
</>
|
</>
|
||||||
|
|
142
src/ts/pages/Team/components/Release.tsx
Normal file
142
src/ts/pages/Team/components/Release.tsx
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { observer } from 'mobx-react-lite';
|
||||||
|
|
||||||
|
import { IPaginationRequest, IPagination } from 'ts/interfaces/Pagination';
|
||||||
|
import dataGripStore from 'ts/store/DataGrip';
|
||||||
|
|
||||||
|
import ICommonPageProps from 'ts/components/Page/interfaces/CommonPageProps';
|
||||||
|
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 Title from 'ts/components/Title';
|
||||||
|
import DataView from 'ts/components/DataView';
|
||||||
|
import Column from 'ts/components/Table/components/Column';
|
||||||
|
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
||||||
|
import getOptions from 'ts/components/LineChart/helpers/getOptions';
|
||||||
|
import LineChart from 'ts/components/LineChart';
|
||||||
|
import { getMax } from 'ts/pages/Common/helpers/getMax';
|
||||||
|
import { getDate } from 'ts/helpers/formatter';
|
||||||
|
|
||||||
|
interface IReleaseViewProps {
|
||||||
|
response?: IPagination<any>;
|
||||||
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
|
mode?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ReleaseView({ response, updateSort, rowsForExcel, mode }: IReleaseViewProps) {
|
||||||
|
if (!response) return null;
|
||||||
|
|
||||||
|
const delay = getMax(response, 'delayInDays');
|
||||||
|
const waiting = getMax(response, 'waitingInDays');
|
||||||
|
const max = Math.max(delay, waiting);
|
||||||
|
const delayChart = getOptions({ max, suffix: 'page.team.release.chart' });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
|
rows={response.content}
|
||||||
|
sort={response.sort}
|
||||||
|
updateSort={updateSort}
|
||||||
|
type={mode === 'print' ? 'cards' : undefined}
|
||||||
|
columnCount={mode === 'print' ? 3 : undefined}
|
||||||
|
>
|
||||||
|
<Column
|
||||||
|
isFixed
|
||||||
|
template={ColumnTypesEnum.STRING}
|
||||||
|
title="page.team.release.title"
|
||||||
|
properties="title"
|
||||||
|
width={200}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.STRING}
|
||||||
|
title="page.team.release.from"
|
||||||
|
width={150}
|
||||||
|
properties="from"
|
||||||
|
formatter={getDate}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.STRING}
|
||||||
|
title="page.team.release.to"
|
||||||
|
width={150}
|
||||||
|
properties="to"
|
||||||
|
formatter={getDate}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.SHORT_NUMBER}
|
||||||
|
properties="delayInDays"
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
title="page.team.release.delay"
|
||||||
|
properties="delayInDays"
|
||||||
|
width={170}
|
||||||
|
minWidth={170}
|
||||||
|
template={(value: number) => (
|
||||||
|
<LineChart
|
||||||
|
options={delayChart}
|
||||||
|
value={value}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
template={ColumnTypesEnum.SHORT_NUMBER}
|
||||||
|
properties="waitingInDays"
|
||||||
|
/>
|
||||||
|
<Column
|
||||||
|
isSortable
|
||||||
|
title="page.team.release.waiting"
|
||||||
|
properties="waitingInDays"
|
||||||
|
width={170}
|
||||||
|
minWidth={170}
|
||||||
|
template={(value: number) => (
|
||||||
|
<LineChart
|
||||||
|
options={delayChart}
|
||||||
|
value={value}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</DataView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseView.defaultProps = {
|
||||||
|
response: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
const Release = observer(({
|
||||||
|
mode,
|
||||||
|
}: ICommonPageProps): React.ReactElement | null => {
|
||||||
|
const rows = dataGripStore.dataGrip.release.statistic;
|
||||||
|
if (rows?.length < 2) return mode !== 'print' ? (<NothingFound />) : null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{mode === 'print' ? (
|
||||||
|
<Title title="sidebar.team.extension"/>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<DataLoader
|
||||||
|
to="response"
|
||||||
|
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||||
|
content: rows, pagination, mode,
|
||||||
|
})}
|
||||||
|
watch={mode}
|
||||||
|
>
|
||||||
|
<ReleaseView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
|
<Pagination />
|
||||||
|
</DataLoader>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export default Release;
|
|
@ -11,7 +11,6 @@ import Pagination from 'ts/components/DataLoader/components/Pagination';
|
||||||
import getFakeLoader from 'ts/components/DataLoader/helpers/formatter';
|
import getFakeLoader from 'ts/components/DataLoader/helpers/formatter';
|
||||||
import NothingFound from 'ts/components/NothingFound';
|
import NothingFound from 'ts/components/NothingFound';
|
||||||
import Title from 'ts/components/Title';
|
import Title from 'ts/components/Title';
|
||||||
// import Table from 'ts/components/Table';
|
|
||||||
import DataView from 'ts/components/DataView';
|
import DataView from 'ts/components/DataView';
|
||||||
import Column from 'ts/components/Table/components/Column';
|
import Column from 'ts/components/Table/components/Column';
|
||||||
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
||||||
|
@ -22,10 +21,11 @@ import Recommendations from 'ts/components/Recommendations';
|
||||||
interface IScopeViewProps {
|
interface IScopeViewProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ScopeView({ response, updateSort, mode }: IScopeViewProps) {
|
function ScopeView({ response, updateSort, rowsForExcel, mode }: IScopeViewProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
const typeChart = getOptions({ order: dataGripStore.dataGrip.type.list });
|
const typeChart = getOptions({ order: dataGripStore.dataGrip.type.list });
|
||||||
|
@ -33,6 +33,7 @@ function ScopeView({ response, updateSort, mode }: IScopeViewProps) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
@ -134,7 +135,10 @@ const Scope = observer(({
|
||||||
})}
|
})}
|
||||||
watch={mode}
|
watch={mode}
|
||||||
>
|
>
|
||||||
<ScopeView mode={mode} />
|
<ScopeView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
<Pagination />
|
<Pagination />
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -26,16 +26,18 @@ import userSettings from 'ts/store/UserSettings';
|
||||||
interface ITasksViewProps {
|
interface ITasksViewProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function TasksView({ response, updateSort, mode }: ITasksViewProps) {
|
function TasksView({ response, updateSort, rowsForExcel, mode }: ITasksViewProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
const commitsChart = getOptions({ max: getMax(response, 'commits'), suffix: 'page.team.type.tasksSmall' });
|
const commitsChart = getOptions({ max: getMax(response, 'commits'), suffix: 'page.team.type.tasksSmall' });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
@ -158,7 +160,10 @@ const Tasks = observer(({
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
<TasksView mode={mode} />
|
<TasksView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
<Pagination />
|
<Pagination />
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import React from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { observer } from 'mobx-react-lite';
|
import { observer } from 'mobx-react-lite';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ import Column from 'ts/components/Table/components/Column';
|
||||||
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
import { ColumnTypesEnum } from 'ts/components/Table/interfaces/Column';
|
||||||
import LineChart from 'ts/components/LineChart';
|
import LineChart from 'ts/components/LineChart';
|
||||||
import getOptions from 'ts/components/LineChart/helpers/getOptions';
|
import getOptions from 'ts/components/LineChart/helpers/getOptions';
|
||||||
|
import NothingFound from 'ts/components/NothingFound';
|
||||||
|
|
||||||
import TreeFilters from './TreeFilters';
|
import TreeFilters from './TreeFilters';
|
||||||
import { getSubTreeByPath, getArrayFromTree } from '../helpers/tree';
|
import { getSubTreeByPath, getArrayFromTree } from '../helpers/tree';
|
||||||
|
@ -121,12 +122,25 @@ TreeView.defaultProps = {
|
||||||
response: undefined,
|
response: undefined,
|
||||||
};
|
};
|
||||||
|
|
||||||
const Tree = observer((): React.ReactElement => {
|
interface ITreeProps {
|
||||||
|
type?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const Tree = observer(({ type }: ITreeProps): React.ReactElement => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const fileTree = dataGripStore.fileTree;
|
const fileTree = type === 'removed'
|
||||||
|
? dataGripStore.removedFileTree
|
||||||
|
: dataGripStore.fileTree;
|
||||||
const subTree = getSubTreeByPath(fileTree, treeStore.selectedPath);
|
const subTree = getSubTreeByPath(fileTree, treeStore.selectedPath);
|
||||||
const fileList = getArrayFromTree(subTree);
|
const fileList = getArrayFromTree(subTree);
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
if (!fileTree?.lines) return <NothingFound />;
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
treeStore.updateFilter('selectedPath', []);
|
||||||
|
}, [type]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Title title={t('common.filters')} />
|
<Title title={t('common.filters')} />
|
||||||
|
@ -138,7 +152,7 @@ const Tree = observer((): React.ReactElement => {
|
||||||
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
loader={(pagination?: IPaginationRequest) => getFakeLoader({
|
||||||
content: fileList, pagination: { ...pagination, size: 500 },
|
content: fileList, pagination: { ...pagination, size: 500 },
|
||||||
})}
|
})}
|
||||||
watch={treeStore.hash}
|
watch={`${treeStore.hash}${type}`}
|
||||||
>
|
>
|
||||||
<TreeView />
|
<TreeView />
|
||||||
<Pagination />
|
<Pagination />
|
||||||
|
|
|
@ -27,10 +27,11 @@ import { getMax } from 'ts/pages/Common/helpers/getMax';
|
||||||
interface ITypeViewProps {
|
interface ITypeViewProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function TypeView({ response, updateSort, mode }: ITypeViewProps) {
|
function TypeView({ response, updateSort, rowsForExcel, mode }: ITypeViewProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
const taskChart = getOptions({ max: getMax(response, 'tasks'), suffix: 'page.team.type.tasksSmall' });
|
const taskChart = getOptions({ max: getMax(response, 'tasks'), suffix: 'page.team.type.tasksSmall' });
|
||||||
|
@ -39,6 +40,7 @@ function TypeView({ response, updateSort, mode }: ITypeViewProps) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
@ -137,7 +139,10 @@ const Type = observer(({
|
||||||
})}
|
})}
|
||||||
watch={mode}
|
watch={mode}
|
||||||
>
|
>
|
||||||
<TypeView mode={mode} />
|
<TypeView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
<Pagination />
|
<Pagination />
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
|
|
|
@ -25,10 +25,11 @@ import { getMax } from 'ts/pages/Common/helpers/getMax';
|
||||||
interface IWeekViewProps {
|
interface IWeekViewProps {
|
||||||
response?: IPagination<any>;
|
response?: IPagination<any>;
|
||||||
updateSort?: Function;
|
updateSort?: Function;
|
||||||
|
rowsForExcel?: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function WeekView({ response, updateSort, mode }: IWeekViewProps) {
|
function WeekView({ response, updateSort, rowsForExcel, mode }: IWeekViewProps) {
|
||||||
if (!response) return null;
|
if (!response) return null;
|
||||||
|
|
||||||
const tasksChart = getOptions({ max: getMax(response, 'tasks'), order: dataGripStore.dataGrip.type.list, suffix: 'page.team.week.tasks' });
|
const tasksChart = getOptions({ max: getMax(response, 'tasks'), order: dataGripStore.dataGrip.type.list, suffix: 'page.team.week.tasks' });
|
||||||
|
@ -46,6 +47,7 @@ function WeekView({ response, updateSort, mode }: IWeekViewProps) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataView
|
<DataView
|
||||||
|
rowsForExcel={rowsForExcel}
|
||||||
rows={response.content}
|
rows={response.content}
|
||||||
sort={response.sort}
|
sort={response.sort}
|
||||||
updateSort={updateSort}
|
updateSort={updateSort}
|
||||||
|
@ -181,7 +183,10 @@ const Week = observer(({
|
||||||
})}
|
})}
|
||||||
watch={mode}
|
watch={mode}
|
||||||
>
|
>
|
||||||
<WeekView mode={mode} />
|
<WeekView
|
||||||
|
mode={mode}
|
||||||
|
rowsForExcel={rows}
|
||||||
|
/>
|
||||||
{mode !== 'print' && <Pagination />}
|
{mode !== 'print' && <Pagination />}
|
||||||
</DataLoader>
|
</DataLoader>
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -13,6 +13,7 @@ import Scope from './components/Scope';
|
||||||
import Tempo from './components/Tempo';
|
import Tempo from './components/Tempo';
|
||||||
import Total from './components/Total';
|
import Total from './components/Total';
|
||||||
import Tree from './components/Tree';
|
import Tree from './components/Tree';
|
||||||
|
import Extension from './components/Extension2';
|
||||||
import Type from './components/Type';
|
import Type from './components/Type';
|
||||||
import Week from './components/Week';
|
import Week from './components/Week';
|
||||||
import Month from './components/Month';
|
import Month from './components/Month';
|
||||||
|
@ -20,6 +21,7 @@ import Tasks from './components/Tasks';
|
||||||
import Top from './components/Top';
|
import Top from './components/Top';
|
||||||
import Pr from './components/PR';
|
import Pr from './components/PR';
|
||||||
import Print from './components/Print';
|
import Print from './components/Print';
|
||||||
|
import Release from './components/Release';
|
||||||
|
|
||||||
function getViewById(page?: string) {
|
function getViewById(page?: string) {
|
||||||
const mode = printStore.processing ? 'print' : undefined;
|
const mode = printStore.processing ? 'print' : undefined;
|
||||||
|
@ -32,7 +34,10 @@ function getViewById(page?: string) {
|
||||||
if (page === 'week') return <Week mode={mode}/>;
|
if (page === 'week') return <Week mode={mode}/>;
|
||||||
if (page === 'month') return <Month mode={mode}/>;
|
if (page === 'month') return <Month mode={mode}/>;
|
||||||
if (page === 'hours') return <Hours mode={mode}/>;
|
if (page === 'hours') return <Hours mode={mode}/>;
|
||||||
if (page === 'tree') return <Tree/>;
|
if (page === 'files') return <Tree/>;
|
||||||
|
if (page === 'removedFiles') return <Tree type="removed" />;
|
||||||
|
if (page === 'extension') return <Extension mode={mode}/>;
|
||||||
|
if (page === 'release') return <Release mode={mode}/>;
|
||||||
if (page === 'commits') return <Commits/>;
|
if (page === 'commits') return <Commits/>;
|
||||||
if (page === 'changes') return <Changes/>;
|
if (page === 'changes') return <Changes/>;
|
||||||
if (page === 'words') return <PopularWords mode={mode}/>;
|
if (page === 'words') return <PopularWords mode={mode}/>;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { makeObservable, observable, action } from 'mobx';
|
import { makeObservable, observable, action } from 'mobx';
|
||||||
|
|
||||||
import ICommit from 'ts/interfaces/Commit';
|
import ICommit, { ISystemCommit } from 'ts/interfaces/Commit';
|
||||||
import { IDirtyFile, IFileTree } from 'ts/interfaces/FileInfo';
|
import { IDirtyFile, IFileTree } from 'ts/interfaces/FileInfo';
|
||||||
import achievements from 'ts/helpers/achievement/byCompetition';
|
import achievements from 'ts/helpers/achievement/byCompetition';
|
||||||
import dataGrip from 'ts/helpers/DataGrip';
|
import dataGrip from 'ts/helpers/DataGrip';
|
||||||
|
@ -52,7 +52,12 @@ class DataGripStore implements IDataGripStore {
|
||||||
fileList,
|
fileList,
|
||||||
fileTree,
|
fileTree,
|
||||||
removed,
|
removed,
|
||||||
} = parser(dump || [], (commit: ICommit) => dataGrip.addCommit(commit));
|
} = parser(dump || []);
|
||||||
|
|
||||||
|
commits.sort((a, b) => a.milliseconds - b.milliseconds);
|
||||||
|
commits.forEach((commit: ICommit | ISystemCommit) => {
|
||||||
|
dataGrip.addCommit(commit);
|
||||||
|
});
|
||||||
|
|
||||||
this.commits = commits;
|
this.commits = commits;
|
||||||
this.fileList = fileList;
|
this.fileList = fileList;
|
||||||
|
@ -70,7 +75,7 @@ class DataGripStore implements IDataGripStore {
|
||||||
);
|
);
|
||||||
|
|
||||||
dataGrip.updateByInitialization();
|
dataGrip.updateByInitialization();
|
||||||
dataGrip.updateByFiles(fileList);
|
dataGrip.updateByFiles(fileList, removed.fileList);
|
||||||
achievements.updateByDataGrip(dataGrip.author.statistic);
|
achievements.updateByDataGrip(dataGrip.author.statistic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,8 @@ export default `
|
||||||
§ sidebar.team.day: Tageweise
|
§ sidebar.team.day: Tageweise
|
||||||
§ sidebar.team.week: Nach Wochen
|
§ sidebar.team.week: Nach Wochen
|
||||||
§ sidebar.team.month: Nach Monaten
|
§ sidebar.team.month: Nach Monaten
|
||||||
§ sidebar.team.tree: Analysieren von Dateien
|
§ sidebar.team.tree: Dateien
|
||||||
|
§ sidebar.team.removedTree: Gelöschte dateien
|
||||||
§ sidebar.team.files: Dateien
|
§ sidebar.team.files: Dateien
|
||||||
§ sidebar.team.removedFiles: Gelöschte Dateien
|
§ sidebar.team.removedFiles: Gelöschte Dateien
|
||||||
§ sidebar.team.tasks: Aufgabenliste
|
§ sidebar.team.tasks: Aufgabenliste
|
||||||
|
|
|
@ -16,8 +16,11 @@ export default `
|
||||||
§ sidebar.team.day: By day
|
§ sidebar.team.day: By day
|
||||||
§ sidebar.team.week: By week
|
§ sidebar.team.week: By week
|
||||||
§ sidebar.team.month: By month
|
§ sidebar.team.month: By month
|
||||||
§ sidebar.team.tree: Files
|
§ sidebar.team.files: Files
|
||||||
|
§ sidebar.team.removedFiles: Removed files
|
||||||
|
§ sidebar.team.extension: Extensions
|
||||||
§ sidebar.team.tasks: Tasks
|
§ sidebar.team.tasks: Tasks
|
||||||
|
§ sidebar.team.release: Releases
|
||||||
§ sidebar.team.hours: Work schedule
|
§ sidebar.team.hours: Work schedule
|
||||||
§ sidebar.team.commits: All commits
|
§ sidebar.team.commits: All commits
|
||||||
§ sidebar.team.changes: All changes
|
§ sidebar.team.changes: All changes
|
||||||
|
|
|
@ -141,6 +141,16 @@ export default `
|
||||||
§ page.team.tasks.prAuthor: Merged by user
|
§ page.team.tasks.prAuthor: Merged by user
|
||||||
§ page.team.tasks.prDelayDays: Delay before merge in days
|
§ page.team.tasks.prDelayDays: Delay before merge in days
|
||||||
§ page.team.tasks.comments: Comments
|
§ page.team.tasks.comments: Comments
|
||||||
|
§ page.team.extension.name: Extension
|
||||||
|
§ page.team.extension.path: Path
|
||||||
|
§ page.team.extension.current.count: Number
|
||||||
|
§ page.team.extension.removed.count: Number of removed
|
||||||
|
§ page.team.extension.files: files
|
||||||
|
§ page.team.release.title: Release
|
||||||
|
§ page.team.release.from: Create date
|
||||||
|
§ page.team.release.to: Last merge date
|
||||||
|
§ page.team.release.delay: Preparation days
|
||||||
|
§ page.team.release.waiting: Days of waiting for next release
|
||||||
§ page.person.print.photo.title: Photo
|
§ page.person.print.photo.title: Photo
|
||||||
§ page.person.print.photo.description: space for a photo
|
§ page.person.print.photo.description: space for a photo
|
||||||
§ page.person.total.title: Main characteristics
|
§ page.person.total.title: Main characteristics
|
||||||
|
|
|
@ -16,7 +16,8 @@ export default `
|
||||||
§ sidebar.team.day: Por días
|
§ sidebar.team.day: Por días
|
||||||
§ sidebar.team.week: Por semana
|
§ sidebar.team.week: Por semana
|
||||||
§ sidebar.team.month: Por mes
|
§ sidebar.team.month: Por mes
|
||||||
§ sidebar.team.tree: Análisis de archivos
|
§ sidebar.team.tree: Archivos
|
||||||
|
§ sidebar.team.removedTree: Archivos eliminados
|
||||||
§ sidebar.team.files: Ficheros
|
§ sidebar.team.files: Ficheros
|
||||||
§ sidebar.team.removedFiles: Archivos eliminados
|
§ sidebar.team.removedFiles: Archivos eliminados
|
||||||
§ sidebar.team.tasks: Lista de tareas
|
§ sidebar.team.tasks: Lista de tareas
|
||||||
|
|
|
@ -1,202 +1,210 @@
|
||||||
export default `
|
export default `
|
||||||
§ page.welcome.step1: Выполните команду в корне вашего проекта
|
§ page.welcome.step1: Ejecute el comando en la raíz de su proyecto
|
||||||
§ page.welcome.step3: Перетащите
|
§ page.welcome.step3: Arrastrais
|
||||||
§ page.welcome.step4: файл log.txt на эту страницу
|
§ page.welcome.step4: fichero log.txt a esta página
|
||||||
§ page.welcome.description: Git создаст файл log.txt. Он содержит данные для построения отчёта. Или git shortlog -s -n -e если отчёт вам не нужен. Создайте файл [.mailmap|https://git-scm.com/docs/gitmailmap] в корне проекта, чтобы объединить статистику по сотрудникам.
|
§ page.welcome.description: Git creará un archivo log.txt. Contiene los datos para construir el informe. Ejecute el comando git shortlog -s -n -e еsi el informe no es necesario. Crear un archivo [.mailmap|https://git-scm.com/docs/gitmailmap] en la raíz del proyecto para combinar las estadísticas de los empleados.
|
||||||
§ page.welcome.warning1: Сервис *НЕ ХРАНИТ* и *НЕ ПЕРЕДАЁТ* ваши данные. Все расчёты выполняются локально в вашем браузере прямо на вашей машине.
|
§ page.welcome.warning1: El Servicio no ALMACENA ni TRANSMITE sus datos. Todos los cálculos se realizan en su computadora.
|
||||||
§ page.welcome.warning2: Сервис *НЕ СОБИРАЕТ СТАТИСТИКУ* по проектам. Вы можете отключить интернет, проверить трафик и даже собрать локальный билд из [исходников|https://github.com/bakhirev/assayo].
|
§ page.welcome.warning2: El Servicio no RECOPILA ESTADÍSTICAS sobre proyectos. Puedes ver [código fuente|https://github.com/bakhirev/assayo].
|
||||||
§ page.common.words.title: Статистика по словам
|
§ page.common.words.title: Estadísticas en palabras
|
||||||
§ page.common.words.description: самое популярное слово. Встречается $1 раза.
|
§ page.common.words.description: la palabra más popular. Se encuentra $1 veces.
|
||||||
§ page.common.commits.title: Количество коммитов по дням
|
§ page.common.commits.title: Número de commits por día
|
||||||
§ page.common.commits.description: ($1) самый продуктивный день по числу коммитов.
|
§ page.common.commits.description: ($1) el día más productivo por número de commits.
|
||||||
§ page.common.commits.title2: $1 сделано коммитов: $2
|
§ page.common.commits.title2: $1 commits hechas: $2
|
||||||
§ page.common.filter.allUsers: Не имеет значения
|
§ page.common.filter.allUsers: No tiene importancia
|
||||||
§ page.print.modal.title: Что распечатываем?
|
§ page.print.modal.title: Lo que imprimimos?
|
||||||
§ page.print.modal.page: Текущую страницу
|
§ page.print.modal.page: Página actual
|
||||||
§ page.print.modal.type: Текущий раздел
|
§ page.print.modal.type: Sección actual
|
||||||
§ page.print.modal.all: Всю статистику
|
§ page.print.modal.all: Todas las estadísticas
|
||||||
§ page.print.modal.cancel: Отмена
|
§ page.print.modal.cancel: Cancelación
|
||||||
§ page.print.tableOfContents: Оглавление
|
§ page.print.tableOfContents: Tabla
|
||||||
§ page.print.title: Отчёт по git-репозиторию
|
§ page.print.title: Informe del repositorio git
|
||||||
§ page.print.sub_title: «$1»
|
§ page.print.sub_title: «$1»
|
||||||
§ page.print.description: Данные для отчёта были получены из истории коммитов.
|
§ page.print.description: Los datos para el informe se obtuvieron del historial de commits.
|
||||||
§ page.team.author.title: Статистика по сотрудникам
|
§ page.team.author.title: Estadísticas de los empleados
|
||||||
§ page.team.author.description1: *Часть статистики* (скорость работы, затраченные деньги и т.п.) *по сотрудникам с типом «Помощник» не считается*, т.к. это эпизодическая роль в проекте. Предполагаем, что они не влияют на проект, а их правками можно пренебречь на фоне общего объема работы.
|
§ page.team.author.description1: Parte de las estadísticas (la velocidad del trabajo, el dinero gastado, etc.) para los empleados con el tipo de "Asistente" no cuenta, ya que no es un rol permanente en el proyecto. Su trabajo es insignificante y puede ser ignorado.
|
||||||
§ page.team.author.description2: *Сортировка по умолчанию* — это сортировка по количеству задач и группам (текущие, уволенные, помогающие сотрудники).
|
§ page.team.author.description2: La clasificación predeterminada es la clasificación por número de tareas y grupos(empleados actuales, despedidos, ayudantes).
|
||||||
§ page.team.author.types: Тип работ
|
§ page.team.author.types: Tipo de trabajo
|
||||||
§ page.team.author.commits: Коммитов
|
§ page.team.author.commits: Commits
|
||||||
§ page.team.author.commitsSmall: коммитов
|
§ page.team.author.commitsSmall: commits
|
||||||
§ page.team.author.tasks: Задач
|
§ page.team.author.tasks: Tareas
|
||||||
§ page.team.author.tasksSmall: задач
|
§ page.team.author.tasksSmall: Tareas
|
||||||
§ page.team.author.workedLosses: Дни с коммитами и без
|
§ page.team.author.workedLosses: Días con y sin commits
|
||||||
§ page.team.author.worked: работа
|
§ page.team.author.worked: trabajo
|
||||||
§ page.team.author.losses: дни без коммитов
|
§ page.team.author.losses: días sin commits
|
||||||
§ page.team.author.days: дней
|
§ page.team.author.days: día
|
||||||
§ page.team.author.daysForTask: Дней на задачу
|
§ page.team.author.daysForTask: Días por tarea
|
||||||
§ page.team.author.scopes: Фич
|
§ page.team.author.scopes: Elaboración definitiva
|
||||||
§ page.team.author.moneyAll: Получил
|
§ page.team.author.moneyAll: Dinero recibido
|
||||||
§ page.team.author.moneyWorked: Отработал
|
§ page.team.author.moneyWorked: Trabajo
|
||||||
§ page.team.author.moneyLosses: Переплата
|
§ page.team.author.moneyLosses: Sobrepago
|
||||||
§ page.team.hours.title: Распределение коммитов в течении каждого дня недели
|
§ page.team.hours.title: Distribución del trabajo cada día de la semana
|
||||||
§ page.team.month.title: Календарь работы по проекту
|
§ page.team.month.title: Calendario del proyecto
|
||||||
§ page.team.scope.title: Статистика по фичам
|
§ page.team.scope.title: Estadísticas de módulos
|
||||||
§ page.team.scope.scope: Фича
|
§ page.team.scope.scope: Elaboración definitiva
|
||||||
§ page.team.scope.days: Раб. дней
|
§ page.team.scope.days: Siervo. día
|
||||||
§ page.team.scope.authorsDays: Человеко-дней
|
§ page.team.scope.authorsDays: Días-persona
|
||||||
§ page.team.scope.tasks: Задач
|
§ page.team.scope.tasks: Tareas
|
||||||
§ page.team.scope.commits: Коммитов
|
§ page.team.scope.commits: Commits
|
||||||
§ page.team.scope.commitsSmall: коммитов
|
§ page.team.scope.commitsSmall: commits
|
||||||
§ page.team.scope.types: Тип работ
|
§ page.team.scope.types: Tipo de trabajo
|
||||||
§ page.team.scope.authors: Персональный вклад
|
§ page.team.scope.authors: Contribución personal
|
||||||
§ page.team.scope.cost: Стоимость
|
§ page.team.scope.cost: Costo
|
||||||
§ page.team.type.title: Статистика по типам задач
|
§ page.team.type.title: Estadísticas por tipo de tarea
|
||||||
§ page.team.type.description: *Персональный вклад* считается по количеству коммитов, а не объему измененных строк или файлов. Поэтому следует так же смотреть раздел «Анализ файлов», чтобы оценить масштаб изменений.
|
§ page.team.type.description: *Contribución personal* se considera por el número de Commits, no por el volumen de líneas o archivos modificados. Por lo tanto, también debe ver la sección "Análisis de archivos" para evaluar el alcance de los cambios
|
||||||
§ page.team.type.type: Тип работы
|
§ page.team.type.type: Tipo de trabajo
|
||||||
§ page.team.type.tasks: Задач
|
§ page.team.type.tasks: Tareas
|
||||||
§ page.team.type.tasksSmall: задач
|
§ page.team.type.tasksSmall: Tareas
|
||||||
§ page.team.type.days: Дней
|
§ page.team.type.days: Día
|
||||||
§ page.team.type.daysSmall: дней
|
§ page.team.type.daysSmall: Día
|
||||||
§ page.team.type.authorsDays: Человеко-дней
|
§ page.team.type.authorsDays: Días-persona
|
||||||
§ page.team.type.commits: Коммитов
|
§ page.team.type.commits: Commits
|
||||||
§ page.team.type.authors: Персональный вклад
|
§ page.team.type.authors: Contribución personal
|
||||||
§ page.team.total.titleA: Объём работ
|
§ page.team.total.titleA: Alcance
|
||||||
§ page.team.total.titleB: Стоимость
|
§ page.team.total.titleB: Costo
|
||||||
§ page.team.total.daysWorked.title: человеко-дней
|
§ page.team.total.daysWorked.title: días-persona
|
||||||
§ page.team.total.daysWorked.description: Учтены только дни, в которые делались коммиты
|
§ page.team.total.daysWorked.description: Solo se tienen en cuenta los días en que se realizaron los commits
|
||||||
§ page.team.total.commits.title: коммитов
|
§ page.team.total.commits.title: commits
|
||||||
§ page.team.total.commits.description: Удалённые ветки не считаются
|
§ page.team.total.commits.description: Las ramas eliminadas no cuentan
|
||||||
§ page.team.total.daysLosses.title: дней без коммитов
|
§ page.team.total.daysLosses.title: días sin commits
|
||||||
§ page.team.total.daysLosses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
|
§ page.team.total.daysLosses.description: Todos los días menos: vacaciones, fin de semana, vacaciones, días con commits
|
||||||
§ page.team.total.employment.title: работает / уволилось
|
§ page.team.total.employment.title: empleado / despedido
|
||||||
§ page.team.total.employment.description: Если сотрудник в течении месяца не сделал ни одного коммита, он считается уволенным
|
§ page.team.total.employment.description: Si un empleado no ha hecho ningún commit en un mes, se considera despedido
|
||||||
§ page.team.total.moneyAll.title: общая
|
§ page.team.total.moneyAll.title: general
|
||||||
§ page.team.total.moneyAll.description: Суммарные затраты на зп
|
§ page.team.total.moneyAll.description: Costos totales de nómina
|
||||||
§ page.team.total.moneyWorked.title: фактическая
|
§ page.team.total.moneyWorked.title: real
|
||||||
§ page.team.total.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
|
§ page.team.total.moneyWorked.description: Días efectivamente trabajados multiplicados por el salario promedio
|
||||||
§ page.team.total.moneyLosses.title: возможная переплата
|
§ page.team.total.moneyLosses.title: posible sobrepago
|
||||||
§ page.team.total.moneyLosses.description: Оплаченные рабочие дни, когда коммитов не было
|
§ page.team.total.moneyLosses.description: Días laborables pagados cuando no hubo commits
|
||||||
§ page.team.total.weekendPayment.title: работа на выходных
|
§ page.team.total.weekendPayment.title: trabajo de fin de semana
|
||||||
§ page.team.total.weekendPayment.description: Суммарная переплата за работу в выходные дни
|
§ page.team.total.weekendPayment.description: Sobrepago total por trabajo de fin de semana
|
||||||
§ page.team.total.workSpeed.title: задач в день
|
§ page.team.total.workSpeed.title: tareas por día
|
||||||
§ page.team.total.workSpeed.description: Средняя скорость работы команды при текущем составе сотрудников
|
§ page.team.total.workSpeed.description: Velocidad media del equipo con la plantilla actual
|
||||||
§ page.team.total.moneySpeed.title: в месяц
|
§ page.team.total.moneySpeed.title: por mes
|
||||||
§ page.team.total.moneySpeed.description: Прогнозируемая сумма выплаты на зп при текущем составе сотрудников без учета налогов и сопутствующих затрат
|
§ page.team.total.moneySpeed.description: Monto previsto de la nómina de sueldos en la plantilla actual, sin incluir impuestos ni costos asociados
|
||||||
§ page.team.total.description1: *Человеко-дни* — это работа одного сотрудника в течение одного рабочего дня. Например, за один календарный день, команда из трех сотрудников выдает объем работы в три человеко-дня.
|
§ page.team.total.description1: *Días-persona* — es el trabajo de un empleado durante una jornada laboral. Por ejemplo, en un día calendario, un equipo de tres empleados emite una cantidad de trabajo de tres días-persona.
|
||||||
§ page.team.total.description2: *Днями прогулов* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют.
|
§ page.team.total.description2: *Días de absentismo* solo se cuentan los días hábiles en que se podrían haber realizado commits. Fines de semana, días festivos y vacaciones no participan en el cálculo.
|
||||||
§ page.team.total.description3: Карточка *работает и уволилось* показывает фактический состав сотрудников, которые постоянно участвуют в работе. Кроме этого, есть «помощники» — это сотрудники, как правило другой специализации, которые могут иногда делать коммиты в проект.
|
§ page.team.total.description3: Tarjeta *trabaja y se despide* muestra la composición real de los empleados que participan constantemente en el trabajo. Aparte de eso, hay " ayudantes — - que son empleados, por lo general de otra Especialización, que a veces pueden hacer commits en un proyecto.
|
||||||
§ page.team.total.description4: *Переплатой* считаются только рабочие дни, когда коммиты могли бы быть сделаны. Выходные, государственные праздники и отпуска в расчёте не участвуют. Именно поэтому переплата + фактическая стоимость != общей. В общей стоимости заложена оплата выходных, государственных праздников и отпусков.
|
§ page.team.total.description4: *Pago excesivo* solo se cuentan los días hábiles en que se podrían haber realizado commits. Los fines de semana, días festivos y vacaciones no están incluidos en el cálculo. ¡Es por eso que el sobrepago + el costo real!= general. El costo total incluye el pago de fines de semana, días festivos y vacaciones.
|
||||||
§ page.team.total.description5: *Работой на выходных* считается по коэффициенту х2 от оплаты обычного дня. Выше отображена именно переплата (х1), т.к. сам факт переработки в данном контексте не интересен. Мы не смотрим скорость сжигания бюджета. Мы смотрим переплату при увеличении скорости работы.
|
§ page.team.total.description5: *Trabajo de fin de semana* se considera por el factor X2 del pago de un día normal. Lo anterior muestra exactamente el pago excesivo (X1), ya que el hecho de procesar en este contexto no es interesante. No estamos viendo la tasa de quema del presupuesto. Estamos viendo el sobrepago al aumentar la velocidad del trabajo.
|
||||||
§ page.team.tree.title: Дерево проекта с учётом выбранных фильтров
|
§ page.team.tree.title: Árbol de proyecto con filtros seleccionados
|
||||||
§ page.team.tree.filters.author: Сотрудник
|
§ page.team.tree.filters.author: Empleado
|
||||||
§ page.team.tree.filters.commits: Количество коммитов
|
§ page.team.tree.filters.commits: Número de commits
|
||||||
§ page.team.tree.filters.help: Минимальное количество коммитов, которое сделал сотрудник в файле
|
§ page.team.tree.filters.help: El número mínimo de commits que hizo un empleado en el archivo
|
||||||
§ page.team.tree.filters.all: Все сотрудники
|
§ page.team.tree.filters.all: Todos los empleados
|
||||||
§ page.team.tree.add: Кто добавлял
|
§ page.team.tree.add: Quien ha añadido
|
||||||
§ page.team.tree.change: Кто менял
|
§ page.team.tree.change: Quien cambió
|
||||||
§ page.team.tree.remove: Кто удалял
|
§ page.team.tree.remove: Quién borró
|
||||||
§ page.team.tree.line: строк
|
§ page.team.tree.line: filas
|
||||||
§ page.team.tree.lineAdd: добавили
|
§ page.team.tree.lineAdd: agregaron
|
||||||
§ page.team.tree.lineRemove: изменили
|
§ page.team.tree.lineRemove: cambiaron
|
||||||
§ page.team.week.title: Статистика по неделям
|
§ page.team.week.title: Estadísticas semanales
|
||||||
§ page.team.week.date: Дата
|
§ page.team.week.date: Fecha
|
||||||
§ page.team.week.numberTasks: Количество задач
|
§ page.team.week.numberTasks: Número de tareas
|
||||||
§ page.team.week.people: Количество человек
|
§ page.team.week.people: Número de personas
|
||||||
§ page.team.week.line: Изменение строк
|
§ page.team.week.line: Cambiar filas
|
||||||
§ page.team.week.days: Дни с коммитами и без
|
§ page.team.week.days: Días con y sin commits
|
||||||
§ page.team.week.lossesDetails: Кто не коммитил
|
§ page.team.week.lossesDetails: ¿Quién no commits
|
||||||
§ page.team.week.add: добавили
|
§ page.team.week.add: agregaron
|
||||||
§ page.team.week.change: изменили
|
§ page.team.week.change: cambiaron
|
||||||
§ page.team.week.remove: удалили
|
§ page.team.week.remove: eliminaron
|
||||||
§ page.team.week.hasCommits: были коммиты
|
§ page.team.week.hasCommits: fueron commits
|
||||||
§ page.team.week.hasNotCommits: небыло коммитов
|
§ page.team.week.hasNotCommits: no hubo commits
|
||||||
§ page.team.week.days: дней
|
§ page.team.week.days: día
|
||||||
§ page.team.week.tasks: задач
|
§ page.team.week.tasks: tareas
|
||||||
§ page.team.pr.task: Задача
|
§ page.team.pr.task: Tarea
|
||||||
§ page.team.pr.tasks: задач
|
§ page.team.pr.tasks: tareas
|
||||||
§ page.team.pr.firstCommitTime: Первый коммит
|
§ page.team.pr.firstCommitTime: Primer commits
|
||||||
§ page.team.pr.lastCommitTime: Последний
|
§ page.team.pr.lastCommitTime: Last
|
||||||
§ page.team.pr.workDays: Дней разработки
|
§ page.team.pr.workDays: Days of development
|
||||||
§ page.team.pr.delayDays: Дней ожидания влития
|
§ page.team.pr.delayDays: Days of waiting for the infusion
|
||||||
§ page.team.pr.commits: Коммиты
|
§ page.team.pr.commits: commits
|
||||||
§ page.team.pr.date: Дата влития
|
§ page.team.pr.date: Date of injection
|
||||||
§ page.team.pr.mergeAuthor: Влил
|
§ page.team.pr.mergeAuthor: I poured it in
|
||||||
§ page.team.pr.author: Сотрудник
|
§ page.team.pr.author: Employee
|
||||||
§ page.team.pr.middleTimeRelease: Среднее время поставки (дни)
|
§ page.team.pr.middleTimeRelease: Average delivery time (days)
|
||||||
§ page.team.pr.work: разработка
|
§ page.team.pr.work: development
|
||||||
§ page.team.pr.delay: ожидание
|
§ page.team.pr.delay: expectation
|
||||||
§ page.team.pr.days: дней
|
§ page.team.pr.days: days
|
||||||
§ page.team.pr.oneTaskDays: Время потраченное на одну задачу
|
§ page.team.pr.oneTaskDays: Time spent on one task
|
||||||
§ page.team.pr.description1: *Время разработки* это разница времени от первого до последнего коммита по задаче. Не важно были перерывы в несколько дней между коммитами или нет. Сам факт какого-либо коммита увеличивает время.
|
§ page.team.pr.description1: *Development time* this is the time difference from the first to the last commits for the task. It doesn't matter if there were breaks of several days between commits or not. The very fact of any commits increases the time.
|
||||||
§ page.team.pr.description2: *Время ожидания* это время между последним коммитом и влитием кода. Оно показывает фактический простой в ожидании чего-либо.
|
§ page.team.pr.description2: *Waiting time* this is the time between the last commit and the code injection. It shows the actual idle waiting for something.
|
||||||
§ page.team.pr.description3: *Зачем отображать время разработки* без разбивки на кодинг и код-ревью? Затем, чтобы показать бизнесу фактическое время поставки кода. Ожидание тестирования, замечания на ревью, проблемы DevOps и прочие несовершенства процесса, как раз уже заложены в этот срок.
|
§ page.team.pr.description3: *Why display the development time* without a breakdown into coding and code review? Then, to show the business the actual delivery time of the code. The expectation of testing, comments on the review, DevOps problems and other imperfections of the process are already laid down in this period.
|
||||||
§ page.team.pr.statByAuthors: Статистика по сотрудникам
|
§ page.team.pr.statByAuthors: Employee statistics
|
||||||
§ page.team.pr.longDelay: Длительное ожидание влития
|
§ page.team.pr.longDelay: Long wait for infusion
|
||||||
§ page.person.print.photo.title: Фотография
|
§ page.team.tasks.task: Task
|
||||||
§ page.person.print.photo.description: место для фотографии
|
§ page.team.tasks.author: The author of the first commits
|
||||||
§ page.person.total.title: Основные характеристики
|
§ page.team.tasks.from: The first commits
|
||||||
§ page.person.total.daysWorked.title: дней работы
|
§ page.team.tasks.to: Last commits
|
||||||
§ page.person.total.daysWorked.description: Учтены только дни, в которые делались коммиты
|
§ page.team.tasks.daysInWork: Days in the work
|
||||||
§ page.person.total.tasks.title: задач
|
§ page.team.tasks.commits: Number of commits
|
||||||
§ page.person.total.tasks.description: Если коммиты правильно подписаны
|
§ page.team.tasks.pr: Date of injection
|
||||||
§ page.person.character.title: Персонаж
|
§ page.team.tasks.prAuthor: I poured it in
|
||||||
§ page.person.achievement.title: Достижения
|
§ page.team.tasks.prDelayDays: Days of waiting for the infusion
|
||||||
§ page.person.achievement.positive: Позитивные
|
§ page.team.tasks.comments: Comments
|
||||||
§ page.person.achievement.normal: Нейтральные
|
§ page.person.print.photo.title: Photo
|
||||||
§ page.person.achievement.negative: Негативные
|
§ page.person.print.photo.description: a place for a photo
|
||||||
§ page.person.achievement.description: Чем больше сотрудник набрал отрицательных достижений, тем больше вероятность, что ситуация нестандартная. Возможно, стоит изменить режим его работы, задачи или отчётность. Следует поговорить с ним и узнать, какие проблемы мешают его работе.
|
§ page.person.total.title: Main Features
|
||||||
§ page.person.gets.title: Взятые геты:
|
§ page.person.total.daysWorked.title: working days
|
||||||
§ page.person.gets.description: «Взять гет» в данном случае означает первым оставить коммит к задаче с «красивым» номером.
|
§ page.person.total.daysWorked.description: Only the days on which commits were made are taken into account
|
||||||
§ page.person.business.days.title: дней работы
|
§ page.person.total.tasks.title: tasks
|
||||||
§ page.person.business.days.description: Учтены только дни, в которые делались коммиты
|
§ page.person.total.tasks.description: If the commits are signed correctly
|
||||||
§ page.person.business.tasks.title: задач
|
§ page.person.character.title: Character
|
||||||
§ page.person.business.tasks.description: Если коммиты правильно подписаны
|
§ page.person.achievement.title: Progress
|
||||||
§ page.person.business.losses.title: дней без коммитов
|
§ page.person.achievement.positive: Positive
|
||||||
§ page.person.business.losses.description: Все дни минус: праздники, выходные, отпуск, дни с коммитами
|
§ page.person.achievement.normal: Neutral
|
||||||
§ page.person.business.commits.title: коммитов
|
§ page.person.achievement.negative: Negative
|
||||||
§ page.person.business.commits.description: Удалённые ветки не считаются
|
§ page.person.achievement.description: Cuantos más logros negativos tenga un empleado, más probable es que la situación no sea estándar. Puede que valga la pena cambiar su modo de trabajo, tareas o informes. Debe hablar con él y averiguar qué problemas interfieren con su trabajo.
|
||||||
§ page.person.business.time.description: Время от первого, до последнего коммита (в том числе, нерабочие дни)
|
§ page.person.gets.title: Geta Capturado:
|
||||||
§ page.person.business.time.title: Дней на проекте:
|
§ page.person.gets.description: «Geta Capturado» in this case, it means leaving commits to the task with the "beautiful" number first.
|
||||||
§ page.person.business.time.dismissed: (уволен)
|
§ page.person.business.days.title: working days
|
||||||
§ page.person.business.time.staff: (не в команде)
|
§ page.person.business.days.description: Only the days on which commits were made are taken into account
|
||||||
§ page.person.business.achievements: Достижения
|
§ page.person.business.tasks.title: tasks
|
||||||
§ page.person.changes.title: Достижения
|
§ page.person.business.tasks.description: If commits are signed correctly
|
||||||
|
§ page.person.business.losses.title: days without commits
|
||||||
|
§ page.person.business.losses.description: All days minus: holidays, weekends, vacations, days with commits
|
||||||
|
§ page.person.business.commits.title: commits
|
||||||
|
§ page.person.business.commits.description: Deleted branches don't count
|
||||||
|
§ page.person.business.time.description: Time from the first to the last commits (including non-working days)
|
||||||
|
§ page.person.business.time.title: Days on the project:
|
||||||
|
§ page.person.business.time.dismissed: (Progreso)
|
||||||
|
§ page.person.business.time.staff: (Not in the team)
|
||||||
|
§ page.person.business.achievements: Progreso
|
||||||
|
§ page.person.changes.title: Progreso
|
||||||
§ page.person.changes.description:
|
§ page.person.changes.description:
|
||||||
При некоторых видах форматирования git отмечает строки как «удалённые» и «добавленные»,
|
En algunos tipos de formato, git marca las líneas como "eliminadas" y "agregadas", cuando en realidad se han "modificado". Entonces, si has hecho mucha refactorización,
|
||||||
хотя на самом деле они были «изменены». Поэтому, если вы провели большой рефакторинг,
|
git puede Mostrar una pequeña cantidad de cambios en las estadísticas, y el resultado real se marcará como un salto en las líneas "eliminado" y "agregado"
|
||||||
git может показать малое количество изменений в статистике, а фактический результат
|
§ page.person.changes.description: The list of commits and the number of changes to them for that day:
|
||||||
будет отмечен, как скачок «удаленных» и «добавленных» строк.
|
§ page.person.commits.title: Lista de commits:
|
||||||
§ page.person.changes.description: Список коммитов и количество изменений в них за этот день:
|
§ page.person.money.title.total: Durante todo este tiempo 👌️
|
||||||
§ page.person.commits.title: Список коммитов:
|
§ page.person.money.title.middle: Average cost
|
||||||
§ page.person.money.title.total: За всё время
|
§ page.person.money.moneyAll.title: received
|
||||||
§ page.person.money.title.middle: Средняя стоимость
|
§ page.person.money.moneyAll.description: Estimated amount of the PO from the project (see settings)
|
||||||
§ page.person.money.moneyAll.title: получил
|
§ page.person.money.moneyWorked.title: worked out
|
||||||
§ page.person.money.moneyAll.description: Предполагаемая сумма зп с проекта (см. настройки)
|
§ page.person.money.moneyWorked.description: Actual days worked multiplied by the average po
|
||||||
§ page.person.money.moneyWorked.title: отработал
|
§ page.person.money.moneyLosses.title: possible overpayment
|
||||||
§ page.person.money.moneyWorked.description: Фактически отработанные дни умноженные на среднюю зп
|
§ page.person.money.moneyLosses.description: Days without commits multiplied by the average po
|
||||||
§ page.person.money.moneyLosses.title: возможная переплата
|
§ page.person.money.tasks.title: task
|
||||||
§ page.person.money.moneyLosses.description: Дни без коммитов умноженные на среднюю зп
|
§ page.person.money.tasks.description: The number of closed tasks to the cost of the day
|
||||||
§ page.person.money.tasks.title: задача
|
§ page.person.money.commits.title: commits
|
||||||
§ page.person.money.tasks.description: Количество закрытых задач к стоимости дня
|
§ page.person.money.commits.description: The number of commits to the cost of the working day
|
||||||
§ page.person.money.commits.title: коммит
|
§ page.person.speed.task: One task on average is
|
||||||
§ page.person.money.commits.description: Количество коммитов к стоимости рабочего дня
|
§ page.person.speed.max: Velocidad máxima por día
|
||||||
§ page.person.speed.task: Одна задача в среднем это
|
§ page.person.speed.days.title: días
|
||||||
§ page.person.speed.max: Максимальная скорость в день
|
§ page.person.speed.days.description: This means working days if the commits are signed correctly
|
||||||
§ page.person.speed.days.title: дней
|
§ page.person.speed.commits.title: commits
|
||||||
§ page.person.speed.days.description: Имеются ввиду рабочие дни, если коммиты правильно подписаны
|
§ page.person.speed.commits.description: 10% of the maximum and minimum values were cut off
|
||||||
§ page.person.speed.commits.title: коммитов
|
§ page.person.speed.line.title: lines of code
|
||||||
§ page.person.speed.commits.description: Отрезаны 10% максимальных и минимальных значений
|
§ page.person.speed.line.description: 10% of the maximum and minimum values were cut off
|
||||||
§ page.person.speed.line.title: строк кода
|
§ page.person.speed.tasks.title: tasks
|
||||||
§ page.person.speed.line.description: Отрезаны 10% максимальных и минимальных значений
|
§ page.person.speed.tasks.description: The task may not be completed, but the work on it should be
|
||||||
§ page.person.speed.tasks.title: задач
|
§ page.person.speed.maxCommits.title: commits
|
||||||
§ page.person.speed.tasks.description: Задача может быть не доделана, но работа по ней должна быть
|
§ page.person.speed.maxCommits.description: The task may not be completed, but the work on it should be
|
||||||
§ page.person.speed.maxCommits.title: коммитов
|
§ page.person.hours.title: Distribution of commits during each day of the week
|
||||||
§ page.person.speed.maxCommits.description: Задача может быть не доделана, но работа по ней должна быть
|
§ page.person.week.date: Date
|
||||||
§ page.person.hours.title: Распределение коммитов в течении каждого дня недели
|
§ page.person.week.tasks: Number of tasks
|
||||||
§ page.person.week.date: Дата
|
§ page.person.week.workDays: Days with commits
|
||||||
§ page.person.week.tasks: Количество задач
|
§ page.person.week.taskInDay: Tasks per day
|
||||||
§ page.person.week.workDays: Дни с коммитами
|
§ page.person.week.days: days
|
||||||
§ page.person.week.taskInDay: Задач в день
|
§ page.person.week.workDay: entresemana
|
||||||
§ page.person.week.days: дней
|
§ page.person.week.weekends: día de descanso
|
||||||
§ page.person.week.workDay: будни
|
|
||||||
§ page.person.week.weekends: выходные
|
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -16,7 +16,6 @@ export default `
|
||||||
§ sidebar.team.day: Au jour le jour
|
§ sidebar.team.day: Au jour le jour
|
||||||
§ sidebar.team.week: Le semaine
|
§ sidebar.team.week: Le semaine
|
||||||
§ sidebar.team.month: Par mois
|
§ sidebar.team.month: Par mois
|
||||||
§ sidebar.team.tree: Analyse des fichiers
|
|
||||||
§ sidebar.team.files: Fichiers
|
§ sidebar.team.files: Fichiers
|
||||||
§ sidebar.team.removedFiles: Fichiers supprimés
|
§ sidebar.team.removedFiles: Fichiers supprimés
|
||||||
§ sidebar.team.tasks: Liste des tâches
|
§ sidebar.team.tasks: Liste des tâches
|
||||||
|
|
|
@ -1,212 +1,209 @@
|
||||||
export default `
|
export default `
|
||||||
§ page.welcome.step1: Execute the command in the root of your project.
|
§ page.welcome.step1: Exécutez la commande à la racine de votre projet
|
||||||
§ page.welcome.step3: Drag and drop
|
§ page.welcome.step3: transférer
|
||||||
§ page.welcome.step4: the log.txt file onto this page.
|
§ page.welcome.step4: fichier log.txt sur cette page
|
||||||
§ page.welcome.description: Git will create a log.txt file. It contains data for report generation. Or use git shortlog -s -n -e if you don't need a report. Create a [.mailmap|https://git-scm.com/docs/gitmailmap] file in the root of the project to consolidate employee statistics.
|
§ page.welcome.description: Git créer un fichier log.txt. Il contient les données pour générer le rapport. Exécutez la commande git shortlog -s -n -e si vous n'avez pas besoin du rapport. Créer un fichier [.mailmap|https://git-scm.com/docs/gitmailmap] à la racine du projet est de combiner les statistiques sur les employés.
|
||||||
§ page.welcome.warning1: The service *DOES NOT SAVE* and *DOES NOT TRANSFER* your data. All calculations are performed locally in your browser on your machine.
|
§ page.welcome.warning1: Le service ne STOCKE ni ne TRANSMET vos données. Tous les calculs sont effectués sur votre ordinateur.
|
||||||
§ page.welcome.warning2: The service *DOES NOT COLLECT STATISTICS* on projects. You can disconnect the internet, check traffic, and even build a local version from the [source|https://github.com/bakhirev/assayo].
|
§ page.welcome.warning2: Le service ne COLLECTE pas de STATISTIQUES sur les projets. Vous pouvez regarder [code source|https://github.com/bakhirev/assayo].
|
||||||
§ page.common.words.title: Word Statistics.
|
§ page.common.words.title: Statistiques par mots
|
||||||
§ page.common.words.description: the most popular word. Occurs $1 times.
|
§ page.common.words.description: le mot le plus populaire. Rencontre $1 fois.
|
||||||
§ page.common.commits.title: Number of commits by days.
|
§ page.common.commits.title: Nombre de commits par jour
|
||||||
§ page.common.commits.description: ($1) the most productive day in terms of the number of commits.
|
§ page.common.commits.description: ($1) le jour le plus productif par le nombre de commits.
|
||||||
§ page.common.commits.title2: $1 commits made: $2
|
§ page.common.commits.title2: $1 commits faits: $2
|
||||||
§ page.common.filter.allUsers: Does not matter
|
§ page.common.filter.allUsers: Pas d'importance
|
||||||
§ page.print.modal.title: What are we printing?
|
§ page.print.modal.title: On imprime quoi?
|
||||||
§ page.print.modal.page: Current page
|
§ page.print.modal.page: Page actuelle
|
||||||
§ page.print.modal.type: Current section
|
§ page.print.modal.type: Section actuelle
|
||||||
§ page.print.modal.all: All statistics
|
§ page.print.modal.all: Toutes les statistiques
|
||||||
§ page.print.modal.cancel: Cancel
|
§ page.print.modal.cancel: Annulation
|
||||||
§ page.print.tableOfContents: Table of contents
|
§ page.print.tableOfContents: Table des matières
|
||||||
§ page.print.title: Git repository report
|
§ page.print.title: Rapport sur dépôt git
|
||||||
§ page.print.sub_title: «$1»
|
§ page.print.sub_title: «$1»
|
||||||
§ page.print.description: The data for the report was obtained from the commit history.
|
§ page.print.description: Les données du rapport ont été extraites de l'historique des commits.
|
||||||
§ page.team.author.title: Employee statistics
|
§ page.team.author.title: Statistiques du personnel
|
||||||
§ page.team.author.description1: *Part of the statistics* (work speed, costs, etc.) *for employees with the 'Assistant' type is not counted*, as it is an episodic role in the project. It is assumed that they do not affect the project, and their edits can be disregarded in the context of the overall volume of work.
|
§ page.team.author.description1: Partie des statistiques (vitesse de travail, argent dépensé, etc.) pour les collaborateurs de type “Assistant”, ce n’est pas une rôle permanente dans le projet. Leur travail est insignifiant et peut être ignoré.
|
||||||
§ page.team.author.description2: *Default sorting* is by the number of tasks and groups (current, fired, assisting employees).
|
§ page.team.author.description2: Le tri par défaut est le tri par nombre de tâches et de groupes (employés actuels, licenciés et aidants).
|
||||||
§ page.team.author.types: Types of work
|
§ page.team.author.types: Type de travaux
|
||||||
§ page.team.author.commits: Commits
|
§ page.team.author.commits: Commits
|
||||||
§ page.team.author.commitsSmall: commits
|
§ page.team.author.commitsSmall: commits
|
||||||
§ page.team.author.tasks: Tasks
|
§ page.team.author.tasks: tâche
|
||||||
§ page.team.author.tasksSmall: tasks
|
§ page.team.author.tasksSmall: tâche
|
||||||
§ page.team.author.workedLosses: Days with and without commits
|
§ page.team.author.workedLosses: Jours avec et sans commits
|
||||||
§ page.team.author.worked: work
|
§ page.team.author.worked: travail
|
||||||
§ page.team.author.losses: days without commits
|
§ page.team.author.losses: jours sans commits
|
||||||
§ page.team.author.days: days
|
§ page.team.author.days: jours
|
||||||
§ page.team.author.daysForTask: Days per task
|
§ page.team.author.daysForTask: Jours par tâche
|
||||||
§ page.team.author.scopes: Features
|
§ page.team.author.scopes: Mise au point
|
||||||
§ page.team.author.moneyAll: Received
|
§ page.team.author.moneyAll: L'argent reçu
|
||||||
§ page.team.author.moneyWorked: Worked for
|
§ page.team.author.moneyWorked: Travaillas
|
||||||
§ page.team.author.moneyLosses: Overpayment
|
§ page.team.author.moneyLosses: Trop-perçu
|
||||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
§ page.team.hours.title: Répartition du travail pour chaque jour de la semaine
|
||||||
§ page.team.month.title: Project work calendar
|
§ page.team.month.title: Calendrier du projet
|
||||||
§ page.team.scope.title: Feature statistics
|
§ page.team.scope.title: Statistiques par module
|
||||||
§ page.team.scope.scope: Feature
|
§ page.team.scope.scope: Mise au point
|
||||||
§ page.team.scope.days: Working Days
|
§ page.team.scope.days: Esclave. jours
|
||||||
§ page.team.scope.authorsDays: Person-Days
|
§ page.team.scope.authorsDays: Jours-homme
|
||||||
§ page.team.scope.tasks: Tasks
|
§ page.team.scope.tasks: Tâches
|
||||||
§ page.team.scope.commits: Commits
|
§ page.team.scope.commits: Commits
|
||||||
§ page.team.scope.commitsSmall: commits
|
§ page.team.scope.commitsSmall: commits
|
||||||
§ page.team.scope.types: Types of work
|
§ page.team.scope.types: Type de travaux
|
||||||
§ page.team.scope.authors: Personal contribution
|
§ page.team.scope.authors: Contribution personnelle
|
||||||
§ page.team.scope.cost: Cost
|
§ page.team.scope.cost: Coût
|
||||||
§ page.team.type.title: Task type statistics
|
§ page.team.type.title: Statistiques par type de tâche
|
||||||
§ page.team.type.description: *Personal contribution* is counted by the number of commits, not the volume of changed lines or files. Therefore, the "File Analysis" section should also be consulted to assess the scale of changes.
|
§ page.team.type.description: *Contribution personnelle* compte tenu du nombre de commits plutôt que de la taille des lignes ou fichiers modifiés. Vous devez donc également consulter la section “Analyse des fichiers” afin d’évaluer l’ampleur des modifications.
|
||||||
§ page.team.type.type: Type of work
|
§ page.team.type.type: Type de travail
|
||||||
§ page.team.type.tasks: Tasks
|
§ page.team.type.tasks: Задач
|
||||||
§ page.team.type.tasksSmall: tasks
|
§ page.team.type.tasksSmall: Tâche
|
||||||
§ page.team.type.days: Days
|
§ page.team.type.days: Jours
|
||||||
§ page.team.type.daysSmall: days
|
§ page.team.type.daysSmall: Jours
|
||||||
§ page.team.type.authorsDays: Person-days
|
§ page.team.type.authorsDays: Jours-homme
|
||||||
§ page.team.type.commits: Commits
|
§ page.team.type.commits: Commits
|
||||||
§ page.team.type.authors: Personal contribution
|
§ page.team.type.authors: Contribution personnelle
|
||||||
§ page.team.total.titleA: Volume of work
|
§ page.team.total.titleA: Volume de travaux
|
||||||
§ page.team.total.titleB: Cost
|
§ page.team.total.titleB: Coût
|
||||||
§ page.team.total.daysWorked.title: person-days
|
§ page.team.total.daysWorked.title: jours-homme
|
||||||
§ page.team.total.daysWorked.description: Only days with commits are counted
|
§ page.team.total.daysWorked.description: Seuls les jours où les commits ont été effectués sont pris en compte
|
||||||
§ page.team.total.commits.title: commits
|
§ page.team.total.commits.title: commits
|
||||||
§ page.team.total.commits.description: Deleted branches are not counted
|
§ page.team.total.commits.description: Les branches supprimées ne comptent pas
|
||||||
§ page.team.total.daysLosses.title: days without commits
|
§ page.team.total.daysLosses.title: jours sans commits
|
||||||
§ page.team.total.daysLosses.description: All days minus: holidays, weekends, vacation, days with commits
|
§ page.team.total.daysLosses.description: Tous les jours moins: vacances, week-ends, vacances, jours avec commits
|
||||||
§ page.team.total.employment.title: working / dismissed
|
§ page.team.total.employment.title: fonctionne / démissionnas
|
||||||
§ page.team.total.employment.description: If an employee does not make any commits within a month, they are considered dismissed
|
§ page.team.total.employment.description: Si un employé n'a fait aucun commit dans un mois, il est considéré comme licencié
|
||||||
§ page.team.total.moneyAll.title: total
|
§ page.team.total.moneyAll.title: générale
|
||||||
§ page.team.total.moneyAll.description: Total salary expenses
|
§ page.team.total.moneyAll.description: Coûts salariaux totaux
|
||||||
§ page.team.total.moneyWorked.title: actual
|
§ page.team.total.moneyWorked.title: réelle
|
||||||
§ page.team.total.moneyWorked.description: Actual days worked multiplied by average salary
|
§ page.team.total.moneyWorked.description: Jours effectivement travaillés multipliés par le salaire moyen
|
||||||
§ page.team.total.moneyLosses.title: possible overpayment
|
§ page.team.total.moneyLosses.title: trop-perçu possible
|
||||||
§ page.team.total.moneyLosses.description: Paid working days when there were no commits
|
§ page.team.total.moneyLosses.description: Jours ouvrables payés quand il n'y avait pas de commits
|
||||||
§ page.team.total.weekendPayment.title: weekend work
|
§ page.team.total.weekendPayment.title: travail le week-end
|
||||||
§ page.team.total.weekendPayment.description: Total overpayment for weekend work
|
§ page.team.total.weekendPayment.description: Trop-perçu total pour le travail de week-end
|
||||||
§ page.team.total.workSpeed.title: tasks per day
|
§ page.team.total.workSpeed.title: tâches par jour
|
||||||
§ page.team.total.workSpeed.description: Average work speed of the team with the current composition of employees
|
§ page.team.total.workSpeed.description: Vitesse moyenne de travail de l'équipe avec la composition actuelle des employés
|
||||||
§ page.team.total.moneySpeed.title: per month
|
§ page.team.total.moneySpeed.title: par mois
|
||||||
§ page.team.total.moneySpeed.description: Forecasted salary payment amount with the current team composition, excluding taxes and related expenses
|
§ page.team.total.moneySpeed.description: Montant prévu de la masse salariale, compte tenu de la composition actuelle du personnel, hors taxes et dépenses connexes
|
||||||
§ page.team.total.description1: *Person-days* — the work of one employee during a single working day. For example, in one calendar day, a team of three employees produces a work volume of three person-days.
|
§ page.team.total.description1: *Jours-homme* — c'est le travail d'un employé pendant une journée de travail. Par exemple, pour un jour calendaire, une équipe de trois employés produit une charge de travail de trois jours-homme.
|
||||||
§ page.team.total.description2: *Absentee days* are counted only as working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation.
|
§ page.team.total.description2: *Jours d'absentéisme* seuls les jours ouvrables où les commits auraient pu être faits sont considérés. Les week-ends, les jours fériés et les vacances ne sont pas inclus dans le calcul.
|
||||||
§ 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.description3: Carte *travaille et a démissionné* cela indique la composition effective des collaborateurs qui participent activement au projet. En outre, il y a des “assistants”, qui sont généralement des collaborateurs d’une autre spécialité et qui peuvent parfois faire des commits sur le projet.
|
||||||
§ 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.description4: *Trop-perçu* с seulement les jours ouverts où des commits auraient pu être faits sont comptabilisés. Les jours fériés, les jours de congés payés et les jours chômés ne sont pas pris en compte. C'est pourquoi le trop-payé + le coût réel != général. Le coût total comprend le paiement des week-ends, des jours fériés et des vacances.
|
||||||
§ 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.total.description5: *Travail le week-end* le calcul se fait selon un coefficient x2 sur le salaire du jour normal. Ce qui est affiché ici est précisément le surcoût (x1), car le fait même de travail supplémentaire n’est pas d’intérêt ici. Nous ne regardons pas la vitesse à laquelle le budget est brûlé. Nous regardons le surcoût lorsque la vitesse de travail augmente.
|
||||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
§ page.team.tree.title: Arborescence du projet avec les filtres sélectionnés
|
||||||
§ page.team.tree.filters.author: Employee
|
§ page.team.tree.filters.author: Employé
|
||||||
§ page.team.tree.filters.commits: Number of commits
|
§ page.team.tree.filters.commits: Nombre de commits
|
||||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
§ page.team.tree.filters.help: Minimum commits que l'employé a fait dans le fichier
|
||||||
§ page.team.tree.filters.all: All employees
|
§ page.team.tree.filters.all: Tous les employés
|
||||||
§ page.team.tree.add: Who added
|
§ page.team.tree.add: Qui a Ajouté
|
||||||
§ page.team.tree.change: Who changed
|
§ page.team.tree.change: Qui a changé
|
||||||
§ page.team.tree.remove: Who removed
|
§ page.team.tree.remove: Qui a supprimé
|
||||||
§ page.team.tree.line: lines
|
§ page.team.tree.line: lignes
|
||||||
§ page.team.tree.lineAdd: added
|
§ page.team.tree.lineAdd: ajoutâtes
|
||||||
§ page.team.tree.lineRemove: changed
|
§ page.team.tree.lineRemove: modifiâtes
|
||||||
§ page.team.week.title: Weekly statistics
|
§ page.team.week.title: Statistiques par semaine
|
||||||
§ page.team.week.date: Date
|
§ page.team.week.date: Date
|
||||||
§ page.team.week.numberTasks: Number of tasks
|
§ page.team.week.numberTasks: Nombre de tâches
|
||||||
§ page.team.week.people: Number of people
|
§ page.team.week.people: Nombre de personnes
|
||||||
§ page.team.week.line: Line Changes
|
§ page.team.week.line: Modification des lignes
|
||||||
§ page.team.week.days: Days with and without commits
|
§ page.team.week.days: Jours avec et sans commits
|
||||||
§ page.team.week.lossesDetails: Who did not commit
|
§ page.team.week.lossesDetails: Qui n'a pas commis
|
||||||
§ page.team.week.add: added
|
§ page.team.week.add: добавили
|
||||||
§ page.team.week.change: changed
|
§ page.team.week.change: modifiâtes
|
||||||
§ page.team.week.remove: removed
|
§ page.team.week.remove: supprimâtes
|
||||||
§ page.team.week.hasCommits: had commits
|
§ page.team.week.hasCommits: il y avait des commits
|
||||||
§ page.team.week.hasNotCommits: had no commits
|
§ page.team.week.hasNotCommits: il n'y avait pas de commits
|
||||||
§ page.team.week.days: days
|
§ page.team.week.days: jours
|
||||||
§ page.team.week.tasks: tasks
|
§ page.team.week.tasks: tâches
|
||||||
§ page.team.pr.task: Task
|
§ page.team.pr.task: tâches
|
||||||
§ page.team.pr.tasks: tasks
|
§ page.team.pr.tasks: tâches
|
||||||
§ page.team.pr.firstCommitTime: First commit
|
§ page.team.pr.firstCommitTime: Premier commit
|
||||||
§ page.team.pr.lastCommitTime: Last
|
§ page.team.pr.lastCommitTime: Dernier
|
||||||
§ page.team.pr.workDays: Development days
|
§ page.team.pr.workDays: Jours de développement
|
||||||
§ page.team.pr.delayDays: Days waiting for merge
|
§ page.team.pr.delayDays: Jours d'attente
|
||||||
§ page.team.pr.commits: Commits
|
§ page.team.pr.commits: Commits
|
||||||
§ page.team.pr.date: Merge Date
|
§ page.team.pr.date: Date de diffusion
|
||||||
§ page.team.pr.mergeAuthor: Merged by
|
§ page.team.pr.mergeAuthor: Versai
|
||||||
§ page.team.pr.author: Employee
|
§ page.team.pr.author: Employé
|
||||||
§ page.team.pr.middleTimeRelease: Average delivery time (days)
|
§ page.team.pr.middleTimeRelease: Délai de Livraison moyen (jours)
|
||||||
§ page.team.pr.work: development
|
§ page.team.pr.work: développement
|
||||||
§ page.team.pr.delay: waiting
|
§ page.team.pr.delay: attente
|
||||||
§ page.team.pr.days: days
|
§ page.team.pr.days: jours
|
||||||
§ page.team.pr.oneTaskDays: Time spent on one task
|
§ page.team.pr.oneTaskDays: Temps passé sur une tâche
|
||||||
§ page.team.pr.description1: *Development time* is the time difference from the first to the last commit on a task. It does not matter if there were breaks of several days between commits or not. Any commit increases the time.
|
§ page.team.pr.description1: *Temps de développement* c’est la différence de temps entre le premier et le dernier commit pour un problème donné. Il n’importe pas si il y avait des pauses pendant plusieurs jours entre les commits, ou non. Le fait même d’avoir fait un quelconque commit augmente le temps.
|
||||||
§ page.team.pr.description2: *Waiting time* is the time between the last commit and the code merge. It shows the actual downtime while waiting for something.
|
§ page.team.pr.description2: *Délai d'attente* c'est le temps entre le dernier commit et l'injection de code. Il montre le réel simple en attendant quoi que ce soit.
|
||||||
§ page.team.pr.description3: *Why display development time* without splitting into coding and code review? To show the business the actual delivery time of the code. Waiting for testing, review comments, DevOps problems, and other process imperfections are already included in this term.
|
§ page.team.pr.description3: *Pourquoi afficher le temps de développement* sans se diviser en Coding et revue de code? Ensuite, pour montrer à l'entreprise le délai de Livraison réel du code. L'attente des tests, les commentaires sur la revue, les problèmes de DevOps et d'autres imperfections du processus sont déjà posés dans cette période.
|
||||||
§ page.team.pr.statByAuthors: Statistics by employees
|
§ page.team.pr.statByAuthors: Statistiques du personnel
|
||||||
§ page.team.pr.longDelay: Prolonged Waiting for merge
|
§ page.team.pr.longDelay: Longue attente pour l'injection
|
||||||
§ page.team.tasks.task: Task
|
§ page.team.tasks.task: Tâche
|
||||||
§ page.team.tasks.author: First commit author
|
§ page.team.tasks.author: Auteur du premier commit
|
||||||
§ page.team.tasks.from: First commit
|
§ page.team.tasks.from: Premier commit
|
||||||
§ page.team.tasks.to: Last commit
|
§ page.team.tasks.to: Dernier commit
|
||||||
§ page.team.tasks.daysInWork: Days in work
|
§ page.team.tasks.daysInWork: Jours de travail
|
||||||
§ page.team.tasks.commits: Commits number
|
§ page.team.tasks.commits: Nombre de commits
|
||||||
§ page.team.tasks.pr: Merge date
|
§ page.team.tasks.pr: Date de diffusion
|
||||||
§ page.team.tasks.prAuthor: Merged by user
|
§ page.team.tasks.prAuthor: Versai
|
||||||
§ page.team.tasks.prDelayDays: Delay before merge in days
|
§ page.team.tasks.prDelayDays: Jours d'attente
|
||||||
§ page.team.tasks.comments: Comments
|
§ page.team.tasks.comments: Commentaires
|
||||||
§ page.person.print.photo.title: Photo
|
§ page.person.print.photo.title: Photo
|
||||||
§ page.person.print.photo.description: space for a photo
|
§ page.person.print.photo.description: place à la photographie
|
||||||
§ page.person.total.title: Main characteristics
|
§ page.person.total.title: Caractéristiques de base
|
||||||
§ page.person.total.daysWorked.title: days of work
|
§ page.person.total.daysWorked.title: jours de travail
|
||||||
§ page.person.total.daysWorked.description: Only days with commits are counted
|
§ page.person.total.daysWorked.description: Seuls les jours où les commits ont été effectués sont pris en compte
|
||||||
§ page.person.total.tasks.title: tasks
|
§ page.person.total.tasks.title: tâches
|
||||||
§ page.person.total.tasks.description: If commits are properly signed
|
§ page.person.total.tasks.description: Si les commits sont correctement signés
|
||||||
§ page.person.character.title: Character
|
§ page.person.character.title: Personnage
|
||||||
§ page.person.achievement.title: Achievements
|
§ page.person.achievement.title: Les progrès
|
||||||
§ page.person.achievement.positive: Positive
|
§ page.person.achievement.positive: Positifs
|
||||||
§ page.person.achievement.normal: Neutral
|
§ page.person.achievement.normal: Neutres
|
||||||
§ page.person.achievement.negative: Negative
|
§ page.person.achievement.negative: Négatifs
|
||||||
§ page.person.achievement.description: The more negative achievements an employee accumulates, the higher the likelihood that the situation is unusual. It may be necessary to change their work mode, tasks, or reporting. A discussion with them to understand what problems are hindering their work is advisable.
|
§ page.person.achievement.description: Plus un collaborateur a accumulé d’achievements négatifs, plus il est probable qu’il y ait une situation inhabituelle. Il se peut que vous deviez changer son mode de travail, ses tâches ou ses rapports. Vous devriez parler avec lui et découvrir quels problèmes entravent son travail.
|
||||||
§ page.person.gets.title: Gets taken:
|
§ page.person.gets.title: Les gètes prises:
|
||||||
§ page.person.gets.description: "Taking a get" in this context means being the first to leave a commit on a task with a "nice" number.
|
§ page.person.gets.description: «Prendre geth» dans ce cas, cela signifie d'abord laisser le commit à la tâche avec un numéro «beau».
|
||||||
§ page.person.business.days.title: days of work
|
§ page.person.business.days.title: jours de travail
|
||||||
§ page.person.business.days.description: Only days with commits are counted
|
§ page.person.business.days.description: Seuls les jours où les commits ont été effectués sont pris en compte
|
||||||
§ page.person.business.tasks.title: tasks
|
§ page.person.business.tasks.title: tâches
|
||||||
§ page.person.business.tasks.description: If commits are properly signed
|
§ page.person.business.tasks.description: Si les commits sont correctement signés
|
||||||
§ page.person.business.losses.title: days without commits
|
§ page.person.business.losses.title: jours sans commits
|
||||||
§ page.person.business.losses.description: All days minus: holidays, weekends, vacation, days with commits
|
§ page.person.business.losses.description: Tous les jours moins: vacances, week-ends, vacances, jours avec commits
|
||||||
§ page.person.business.commits.title: commits
|
§ page.person.business.commits.title: commits
|
||||||
§ page.person.business.commits.description: Deleted branches are not counted
|
§ page.person.business.commits.description: Les branches supprimées ne comptent pas
|
||||||
§ page.person.business.time.description: Time from the first to the last commit (including non-working days)
|
§ page.person.business.time.description: Temps de la première à la Dernière commits (y compris les jours non ouvrables)
|
||||||
§ page.person.business.time.title: Days on the project:
|
§ page.person.business.time.title: Jours sur le projet:
|
||||||
§ page.person.business.time.dismissed: (dismissed)
|
§ page.person.business.time.dismissed: (licencié)
|
||||||
§ page.person.business.time.staff: (not in the team)
|
§ page.person.business.time.staff: (pas dans l'équipe)
|
||||||
§ page.person.business.achievements: Achievements
|
§ page.person.business.achievements: Les progrès
|
||||||
§ page.person.changes.title: Achievements
|
§ page.person.changes.title: Les progrès
|
||||||
§ page.person.changes.description:
|
§ page.person.changes.description:
|
||||||
With some types of formatting, git marks lines as "deleted" and "added",
|
Avec certaines formes de formatage, git marque les lignes comme “supprimées” et “ajoutées”, bien qu’en réalité, elles aient été “modifiées”. Par conséquent, si vous effectuez un grand refactoring, git peut montrer une petite quantité de modifications dans les statistiques, et le résultat réel sera marqué comme un bond dans les lignes “supprimées” et “ajoutées”.
|
||||||
although in reality, they were "changed". Therefore, if you conducted a major refactoring,
|
§ page.person.changes.description: La liste des commits et le nombre de modifications qu'ils ont apportées au cours de cette journée:
|
||||||
git might show a small number of changes in the statistics, but the actual result
|
§ page.person.commits.title: Liste des commits:
|
||||||
will be marked as a jump in "deleted" and "added" lines.
|
§ page.person.money.title.total: Pour tous les temps
|
||||||
§ page.person.changes.description: List of commits and the number of changes in them for that day:
|
§ page.person.money.title.middle: Valeur moyenne
|
||||||
§ page.person.commits.title: List of commits:
|
§ page.person.money.moneyAll.title: reçut
|
||||||
§ page.person.money.title.total: Total over time
|
§ page.person.money.moneyAll.description: Montant estimatif des dépenses d & apos; appui au projet (voir paramètres)
|
||||||
§ page.person.money.title.middle: Average cost
|
§ page.person.money.moneyWorked.title: travaillas
|
||||||
§ page.person.money.moneyAll.title: received
|
§ page.person.money.moneyWorked.description: Jours effectivement travaillés multipliés par le nombre moyen de jours travaillés
|
||||||
§ page.person.money.moneyAll.description: Assumed total salary from the project (see settings)
|
§ page.person.money.moneyLosses.title: trop-perçu possible
|
||||||
§ page.person.money.moneyWorked.title: worked for
|
§ page.person.money.moneyLosses.description: Jours sans commits multipliés par la moyenne SN
|
||||||
§ page.person.money.moneyWorked.description: Actual days worked multiplied by average salary
|
§ page.person.money.tasks.title: tâche
|
||||||
§ page.person.money.moneyLosses.title: possible overpayment
|
§ page.person.money.tasks.description: Nombre de tâches fermées au coût de la journée
|
||||||
§ page.person.money.moneyLosses.description: Days without commits multiplied by average salary
|
|
||||||
§ page.person.money.tasks.title: task
|
|
||||||
§ page.person.money.tasks.description: Number of closed tasks to the cost of the day
|
|
||||||
§ page.person.money.commits.title: commit
|
§ page.person.money.commits.title: commit
|
||||||
§ page.person.money.commits.description: Number of commits to the cost of the workday
|
§ page.person.money.commits.description: Nombre de commits par jour ouvrable
|
||||||
§ page.person.speed.task: One task on average is
|
§ page.person.speed.task: Une tâche en moyenne est
|
||||||
§ page.person.speed.max: Maximum speed per day
|
§ page.person.speed.max: Vitesse maximale par jour
|
||||||
§ page.person.speed.days.title: days
|
§ page.person.speed.days.title: jours
|
||||||
§ page.person.speed.days.description: Refers to workdays, if commits are properly signed
|
§ page.person.speed.days.description: Cela signifie des jours ouvrables si les commits sont correctement signés
|
||||||
§ page.person.speed.commits.title: commits
|
§ page.person.speed.commits.title: commits
|
||||||
§ page.person.speed.commits.description: Top and bottom 10% of values are trimmed
|
§ page.person.speed.commits.description: 10% des valeurs maximales et minimales sont coupées
|
||||||
§ page.person.speed.line.title: lines of code
|
§ page.person.speed.line.title: lignes de code
|
||||||
§ page.person.speed.line.description: Top and bottom 10% of values are trimmed
|
§ page.person.speed.line.description: 10% des valeurs maximales et minimales sont coupées
|
||||||
§ page.person.speed.tasks.title: tasks
|
§ page.person.speed.tasks.title: tâches
|
||||||
§ page.person.speed.tasks.description: A task may not be completed, but work should be done on it
|
§ page.person.speed.tasks.description: La tâche peut ne pas être terminée, mais le travail sur elle doit être
|
||||||
§ page.person.speed.maxCommits.title: commits
|
§ page.person.speed.maxCommits.title: commits
|
||||||
§ page.person.speed.maxCommits.description: A task may not be completed, but work should be done on it
|
§ page.person.speed.maxCommits.description: La tâche peut ne pas être terminée, mais le travail sur elle doit être
|
||||||
§ page.person.hours.title: Distribution of commits during each day of the week
|
§ page.person.hours.title: Répartition des commits par jour de la semaine
|
||||||
§ page.person.week.date: Date
|
§ page.person.week.date: Date
|
||||||
§ page.person.week.tasks: Number of tasks
|
§ page.person.week.tasks: Nombre de tâches
|
||||||
§ page.person.week.workDays: Days with commits
|
§ page.person.week.workDays: Jours avec commits
|
||||||
§ page.person.week.taskInDay: Tasks per day
|
§ page.person.week.taskInDay: Tâches par jour
|
||||||
§ page.person.week.days: days
|
§ page.person.week.days: jours
|
||||||
§ page.person.week.workDay: weekdays
|
§ page.person.week.workDay: jours de semaine
|
||||||
§ page.person.week.weekends: weekends
|
§ page.person.week.weekends: congés
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -16,10 +16,11 @@ export default `
|
||||||
§ sidebar.team.day: По дням
|
§ sidebar.team.day: По дням
|
||||||
§ sidebar.team.week: По неделям
|
§ sidebar.team.week: По неделям
|
||||||
§ sidebar.team.month: По месяцам
|
§ sidebar.team.month: По месяцам
|
||||||
§ sidebar.team.tree: Анализ файлов
|
|
||||||
§ sidebar.team.files: Файлы
|
§ sidebar.team.files: Файлы
|
||||||
§ sidebar.team.removedFiles: Удалённые файлы
|
§ sidebar.team.removedFiles: Удалённые файлы
|
||||||
|
§ sidebar.team.extension: Типы файлов
|
||||||
§ sidebar.team.tasks: Список задач
|
§ sidebar.team.tasks: Список задач
|
||||||
|
§ sidebar.team.release: Список релизов
|
||||||
§ sidebar.team.hours: Расписание
|
§ sidebar.team.hours: Расписание
|
||||||
§ sidebar.team.commits: Все коммиты
|
§ sidebar.team.commits: Все коммиты
|
||||||
§ sidebar.team.changes: Все изменения
|
§ sidebar.team.changes: Все изменения
|
||||||
|
|
|
@ -141,6 +141,16 @@ export default `
|
||||||
§ page.team.tasks.prAuthor: Влил
|
§ page.team.tasks.prAuthor: Влил
|
||||||
§ page.team.tasks.prDelayDays: Дней ожидания влития
|
§ page.team.tasks.prDelayDays: Дней ожидания влития
|
||||||
§ page.team.tasks.comments: Комментарии
|
§ page.team.tasks.comments: Комментарии
|
||||||
|
§ page.team.extension.name: Тип
|
||||||
|
§ page.team.extension.path: Путь
|
||||||
|
§ page.team.extension.current.count: Количество
|
||||||
|
§ page.team.extension.removed.count: Количество удалённых
|
||||||
|
§ page.team.extension.files: файлов
|
||||||
|
§ page.team.release.title: Релиз
|
||||||
|
§ page.team.release.from: Дата создания
|
||||||
|
§ page.team.release.to: Дата завершения
|
||||||
|
§ page.team.release.delay: Дней работы
|
||||||
|
§ page.team.release.waiting: Дней до следующего релиза
|
||||||
§ page.person.print.photo.title: Фотография
|
§ page.person.print.photo.title: Фотография
|
||||||
§ page.person.print.photo.description: место для фотографии
|
§ page.person.print.photo.description: место для фотографии
|
||||||
§ page.person.total.title: Основные характеристики
|
§ page.person.total.title: Основные характеристики
|
||||||
|
|
|
@ -1,212 +1,212 @@
|
||||||
export default `
|
export default `
|
||||||
§ page.welcome.step1: Execute the command in the root of your project.
|
§ page.welcome.step1: 在项目的根目录运行命令
|
||||||
§ page.welcome.step3: Drag and drop
|
§ page.welcome.step3: 拖放
|
||||||
§ page.welcome.step4: the log.txt file onto this page.
|
§ page.welcome.step4: log.txt 文件到本页
|
||||||
§ page.welcome.description: Git will create a log.txt file. It contains data for report generation. Or use git shortlog -s -n -e if you don't need a report. Create a [.mailmap|https://git-scm.com/docs/gitmailmap] file in the root of the project to consolidate employee statistics.
|
§ page.welcome.description: Git 创建文件 log.txt. 它包含用于构建报表的数据。 运行命令 git shortlog -s -n -e 如果你不需要报告。 创建文件 [.mailmap|https://git-scm.com/docs/gitmailmap] 在项目的根源,结合员工统计.
|
||||||
§ page.welcome.warning1: The service *DOES NOT SAVE* and *DOES NOT TRANSFER* your data. All calculations are performed locally in your browser on your machine.
|
§ page.welcome.warning1: 该服务不会存储或传输您的数据。 所有计算都在您的计算机上执行.
|
||||||
§ page.welcome.warning2: The service *DOES NOT COLLECT STATISTICS* on projects. You can disconnect the internet, check traffic, and even build a local version from the [source|https://github.com/bakhirev/assayo].
|
§ page.welcome.warning2: 该服务不收集项目的统计数据。 你可以看 [源代码|https://github.com/bakhirev/assayo].
|
||||||
§ page.common.words.title: Word Statistics.
|
§ page.common.words.title: 词汇统计
|
||||||
§ page.common.words.description: the most popular word. Occurs $1 times.
|
§ page.common.words.description: 最流行的词。 发生$1次.
|
||||||
§ page.common.commits.title: Number of commits by days.
|
§ page.common.commits.title: Количество Commits по дням
|
||||||
§ page.common.commits.description: ($1) the most productive day in terms of the number of commits.
|
§ page.common.commits.description: ($1) 拥有最多 Commits 数的工作日.
|
||||||
§ page.common.commits.title2: $1 commits made: $2
|
§ page.common.commits.title2: $1 完成了 Commits: $2
|
||||||
§ page.common.filter.allUsers: Does not matter
|
§ page.common.filter.allUsers: 没关系
|
||||||
§ page.print.modal.title: What are we printing?
|
§ page.print.modal.title: 我们打印出来的是什么?
|
||||||
§ page.print.modal.page: Current page
|
§ page.print.modal.page: 当前页面
|
||||||
§ page.print.modal.type: Current section
|
§ page.print.modal.type: 当前部分
|
||||||
§ page.print.modal.all: All statistics
|
§ page.print.modal.all: 所有统计数字
|
||||||
§ page.print.modal.cancel: Cancel
|
§ page.print.modal.cancel: 取消
|
||||||
§ page.print.tableOfContents: Table of contents
|
§ page.print.tableOfContents: 目录
|
||||||
§ page.print.title: Git repository report
|
§ page.print.title: Git仓库报告
|
||||||
§ page.print.sub_title: «$1»
|
§ page.print.sub_title: «$1»
|
||||||
§ page.print.description: The data for the report was obtained from the commit history.
|
§ page.print.description: 报告的数据是从历史记录中获得的 Commits.
|
||||||
§ page.team.author.title: Employee statistics
|
§ page.team.author.title: 雇员统计数字
|
||||||
§ page.team.author.description1: *Part of the statistics* (work speed, costs, etc.) *for employees with the 'Assistant' type is not counted*, as it is an episodic role in the project. It is assumed that they do not affect the project, and their edits can be disregarded in the context of the overall volume of work.
|
§ page.team.author.description1: 部分统计数字 (工作的速度,花费的钱等。.) 不考虑具有"助理"类型的员工,因为这不是项目中的永久角色。 他们的工作微不足道,可以忽略。.
|
||||||
§ page.team.author.description2: *Default sorting* is by the number of tasks and groups (current, fired, assisting employees).
|
§ page.team.author.description2: 默认排序是按任务和组数排序 (现任、被解雇、帮助雇员).
|
||||||
§ page.team.author.types: Types of work
|
§ page.team.author.types: 工作类别
|
||||||
§ page.team.author.commits: Commits
|
§ page.team.author.commits: Commits
|
||||||
§ page.team.author.commitsSmall: commits
|
§ page.team.author.commitsSmall: commits
|
||||||
§ page.team.author.tasks: Tasks
|
§ page.team.author.tasks: 任务
|
||||||
§ page.team.author.tasksSmall: tasks
|
§ page.team.author.tasksSmall: 任务
|
||||||
§ page.team.author.workedLosses: Days with and without commits
|
§ page.team.author.workedLosses: 有和没有commits的日子
|
||||||
§ page.team.author.worked: work
|
§ page.team.author.worked: 工作
|
||||||
§ page.team.author.losses: days without commits
|
§ page.team.author.losses: 没有commits的日子
|
||||||
§ page.team.author.days: days
|
§ page.team.author.days: 天数
|
||||||
§ page.team.author.daysForTask: Days per task
|
§ page.team.author.daysForTask: 每项任务的天数
|
||||||
§ page.team.author.scopes: Features
|
§ page.team.author.scopes: 修改
|
||||||
§ page.team.author.moneyAll: Received
|
§ page.team.author.moneyAll: 我拿到钱了
|
||||||
§ page.team.author.moneyWorked: Worked for
|
§ page.team.author.moneyWorked: 工作了
|
||||||
§ page.team.author.moneyLosses: Overpayment
|
§ page.team.author.moneyLosses: 多付
|
||||||
§ page.team.hours.title: Distribution of commits during each day of the week
|
§ page.team.hours.title: 每周每一天的工作分配
|
||||||
§ page.team.month.title: Project work calendar
|
§ page.team.month.title: 项目工作日历
|
||||||
§ page.team.scope.title: Feature statistics
|
§ page.team.scope.title: 按模块划分的统计数字
|
||||||
§ page.team.scope.scope: Feature
|
§ page.team.scope.scope: 修改
|
||||||
§ page.team.scope.days: Working Days
|
§ page.team.scope.days: 工作天
|
||||||
§ page.team.scope.authorsDays: Person-Days
|
§ page.team.scope.authorsDays: 人日
|
||||||
§ page.team.scope.tasks: Tasks
|
§ page.team.scope.tasks: 任务
|
||||||
§ page.team.scope.commits: Commits
|
§ page.team.scope.commits: Commits
|
||||||
§ page.team.scope.commitsSmall: commits
|
§ page.team.scope.commitsSmall: commits
|
||||||
§ page.team.scope.types: Types of work
|
§ page.team.scope.types: 工作类别
|
||||||
§ page.team.scope.authors: Personal contribution
|
§ page.team.scope.authors: 个人贡献
|
||||||
§ page.team.scope.cost: Cost
|
§ page.team.scope.cost: 成本
|
||||||
§ page.team.type.title: Task type statistics
|
§ page.team.type.title: 按任务类型划分的统计信息
|
||||||
§ page.team.type.description: *Personal contribution* is counted by the number of commits, not the volume of changed lines or files. Therefore, the "File Analysis" section should also be consulted to assess the scale of changes.
|
§ page.team.type.description: *个人贡献* 它是按数字计算的 Commits, 而不是修改的字符串或文件的体积。 因此,您还应该查看"文件分析"部分以评估更改的规模。
|
||||||
§ page.team.type.type: Type of work
|
§ page.team.type.type: 工作类别
|
||||||
§ page.team.type.tasks: Tasks
|
§ page.team.type.tasks: 任务
|
||||||
§ page.team.type.tasksSmall: tasks
|
§ page.team.type.tasksSmall: 任务
|
||||||
§ page.team.type.days: Days
|
§ page.team.type.days: 天数
|
||||||
§ page.team.type.daysSmall: days
|
§ page.team.type.daysSmall: 天数
|
||||||
§ page.team.type.authorsDays: Person-days
|
§ page.team.type.authorsDays: 人日
|
||||||
§ page.team.type.commits: Commits
|
§ page.team.type.commits: Commits
|
||||||
§ page.team.type.authors: Personal contribution
|
§ page.team.type.authors: 个人贡献
|
||||||
§ page.team.total.titleA: Volume of work
|
§ page.team.total.titleA: 工作范围
|
||||||
§ page.team.total.titleB: Cost
|
§ page.team.total.titleB: 成本
|
||||||
§ page.team.total.daysWorked.title: person-days
|
§ page.team.total.daysWorked.title: 人日
|
||||||
§ page.team.total.daysWorked.description: Only days with commits are counted
|
§ page.team.total.daysWorked.description: 只考虑制作它们的日子 Commits
|
||||||
§ page.team.total.commits.title: commits
|
§ page.team.total.commits.title: commits
|
||||||
§ page.team.total.commits.description: Deleted branches are not counted
|
§ page.team.total.commits.description: 删除的分支不算数
|
||||||
§ page.team.total.daysLosses.title: days without commits
|
§ page.team.total.daysLosses.title: 没有的日子 commits
|
||||||
§ page.team.total.daysLosses.description: All days minus: holidays, weekends, vacation, days with commits
|
§ page.team.total.daysLosses.description: 所有的日子都是负数: 假期、周末、假期、休息日 Commits
|
||||||
§ page.team.total.employment.title: working / dismissed
|
§ page.team.total.employment.title: 工作/退出
|
||||||
§ page.team.total.employment.description: If an employee does not make any commits within a month, they are considered dismissed
|
§ page.team.total.employment.description: 如果员工在一个月内没有完成任何工作 Commits, 他被认为被解雇了
|
||||||
§ page.team.total.moneyAll.title: total
|
§ page.team.total.moneyAll.title: 普通
|
||||||
§ page.team.total.moneyAll.description: Total salary expenses
|
§ page.team.total.moneyAll.description: 工资费用总额
|
||||||
§ page.team.total.moneyWorked.title: actual
|
§ page.team.total.moneyWorked.title: 实际
|
||||||
§ page.team.total.moneyWorked.description: Actual days worked multiplied by average salary
|
§ page.team.total.moneyWorked.description: 实际工作天数乘以平均工资
|
||||||
§ page.team.total.moneyLosses.title: possible overpayment
|
§ page.team.total.moneyLosses.title: 可能多付
|
||||||
§ page.team.total.moneyLosses.description: Paid working days when there were no commits
|
§ page.team.total.moneyLosses.description: 带薪工作日, 何时 Commits 没有
|
||||||
§ page.team.total.weekendPayment.title: weekend work
|
§ page.team.total.weekendPayment.title: 周末工作
|
||||||
§ page.team.total.weekendPayment.description: Total overpayment for weekend work
|
§ page.team.total.weekendPayment.description: 周末工作多付总额
|
||||||
§ page.team.total.workSpeed.title: tasks per day
|
§ page.team.total.workSpeed.title: 每天的任务
|
||||||
§ page.team.total.workSpeed.description: Average work speed of the team with the current composition of employees
|
§ page.team.total.workSpeed.description: 团队与当前员工的平均工作速度
|
||||||
§ page.team.total.moneySpeed.title: per month
|
§ page.team.total.moneySpeed.title: 每月
|
||||||
§ page.team.total.moneySpeed.description: Forecasted salary payment amount with the current team composition, excluding taxes and related expenses
|
§ page.team.total.moneySpeed.description: 现职工作人员的预计薪金支付额,不包括税项和有关费用
|
||||||
§ page.team.total.description1: *Person-days* — the work of one employee during a single working day. For example, in one calendar day, a team of three employees produces a work volume of three person-days.
|
§ page.team.total.description1: *人日* — 这是一个员工一个工作日的工作。 例如,在一个日历日,一个由三名员工组成的团队在三个工作日内发出大量的工作量.
|
||||||
§ page.team.total.description2: *Absentee days* are counted only as working days when commits could have been made. Weekends, public holidays, and vacations are not included in the calculation.
|
§ page.team.total.description2: *旷工的日子* 只有工作日计算在 Commits 可以做到. 周末、公众假期及假期不包括在计算内.
|
||||||
§ 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.description3: 卡片 *工作和退出* 显示经常参与工作的员工的实际组成。 此外,还有"助手—-这些是员工,通常是不同的专业,有时可以这样做 Commits 到项目.
|
||||||
§ 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.description4: *多付* 只有工作日计算在 Commits 可以做到. 周末、公众假期和假期不包括在计算中. 这就是为什么多付+实际成本!=一般. 总费用包括周末、公众假期和假期的付款。
|
||||||
§ 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.total.description5: *周末工作* 它是由系数x2计算从支付一个正常的一天。 上面显示的是多付(x1),因为在这种情况下,处理的事实并不有趣。 我们不是在看预算燃烧的速度。 我们正在考虑在提高工作速度时多付的款项.
|
||||||
§ page.team.tree.title: Project Tree Considering Selected Filters
|
§ page.team.tree.title: 项目树,考虑到选定的过滤器
|
||||||
§ page.team.tree.filters.author: Employee
|
§ page.team.tree.filters.author: 雇员
|
||||||
§ page.team.tree.filters.commits: Number of commits
|
§ page.team.tree.filters.commits: 数量 Commits
|
||||||
§ page.team.tree.filters.help: The minimum number of commits an employee has made in a file
|
§ page.team.tree.filters.help: 最低数量 Commits, 雇员在档案中所做的
|
||||||
§ page.team.tree.filters.all: All employees
|
§ page.team.tree.filters.all: 所有员工
|
||||||
§ page.team.tree.add: Who added
|
§ page.team.tree.add: 谁加的
|
||||||
§ page.team.tree.change: Who changed
|
§ page.team.tree.change: 谁改变了它
|
||||||
§ page.team.tree.remove: Who removed
|
§ page.team.tree.remove: 谁删除了它
|
||||||
§ page.team.tree.line: lines
|
§ page.team.tree.line: 线条
|
||||||
§ page.team.tree.lineAdd: added
|
§ page.team.tree.lineAdd: 补充道
|
||||||
§ page.team.tree.lineRemove: changed
|
§ page.team.tree.lineRemove: 改变了
|
||||||
§ page.team.week.title: Weekly statistics
|
§ page.team.week.title: 按周划分的统计数字
|
||||||
§ page.team.week.date: Date
|
§ page.team.week.date: 日期
|
||||||
§ page.team.week.numberTasks: Number of tasks
|
§ page.team.week.numberTasks: 任务数量
|
||||||
§ page.team.week.people: Number of people
|
§ page.team.week.people: 人数
|
||||||
§ page.team.week.line: Line Changes
|
§ page.team.week.line: 换线
|
||||||
§ page.team.week.days: Days with and without commits
|
§ page.team.week.days: 日起 Commits 而没有
|
||||||
§ page.team.week.lossesDetails: Who did not commit
|
§ page.team.week.lossesDetails: 谁不 Commits
|
||||||
§ page.team.week.add: added
|
§ page.team.week.add: 补充道
|
||||||
§ page.team.week.change: changed
|
§ page.team.week.change: 改变了
|
||||||
§ page.team.week.remove: removed
|
§ page.team.week.remove: 已删除
|
||||||
§ page.team.week.hasCommits: had commits
|
§ page.team.week.hasCommits: 是 Commits
|
||||||
§ page.team.week.hasNotCommits: had no commits
|
§ page.team.week.hasNotCommits: 不是这样的 Commits
|
||||||
§ page.team.week.days: days
|
§ page.team.week.days: 天数
|
||||||
§ page.team.week.tasks: tasks
|
§ page.team.week.tasks: 任务
|
||||||
§ page.team.pr.task: Task
|
§ page.team.pr.task: 任务
|
||||||
§ page.team.pr.tasks: tasks
|
§ page.team.pr.tasks: 任务
|
||||||
§ page.team.pr.firstCommitTime: First commit
|
§ page.team.pr.firstCommitTime: 第一个 Commits
|
||||||
§ page.team.pr.lastCommitTime: Last
|
§ page.team.pr.lastCommitTime: 最后一次
|
||||||
§ page.team.pr.workDays: Development days
|
§ page.team.pr.workDays: 发展的日子
|
||||||
§ page.team.pr.delayDays: Days waiting for merge
|
§ page.team.pr.delayDays: 等待输液的日子
|
||||||
§ page.team.pr.commits: Commits
|
§ page.team.pr.commits: Commits
|
||||||
§ page.team.pr.date: Merge Date
|
§ page.team.pr.date: 注射日期
|
||||||
§ page.team.pr.mergeAuthor: Merged by
|
§ page.team.pr.mergeAuthor: 填写
|
||||||
§ page.team.pr.author: Employee
|
§ page.team.pr.author: 雇员
|
||||||
§ page.team.pr.middleTimeRelease: Average delivery time (days)
|
§ page.team.pr.middleTimeRelease: 平均派递时间 (天数)
|
||||||
§ page.team.pr.work: development
|
§ page.team.pr.work: 发展
|
||||||
§ page.team.pr.delay: waiting
|
§ page.team.pr.delay: 期望
|
||||||
§ page.team.pr.days: days
|
§ page.team.pr.days: 天数
|
||||||
§ page.team.pr.oneTaskDays: Time spent on one task
|
§ page.team.pr.oneTaskDays: 花在一项任务上的时间
|
||||||
§ page.team.pr.description1: *Development time* is the time difference from the first to the last commit on a task. It does not matter if there were breaks of several days between commits or not. Any commit increases the time.
|
§ page.team.pr.description1: *花在一项任务上的时间* 这是从第一个到最后一个的时间差 Commits 按任务划分. 如果之间有几天的休息时间也没关系 Commits 还是不是. 任何一个事实 Commits 增加时间.
|
||||||
§ page.team.pr.description2: *Waiting time* is the time between the last commit and the code merge. It shows the actual downtime while waiting for something.
|
§ page.team.pr.description2: *轮候时间* 这是最后一次之间的时间 Commits 通过输入代码. 它显示了实际的空闲等待的东西.
|
||||||
§ page.team.pr.description3: *Why display development time* without splitting into coding and code review? To show the business the actual delivery time of the code. Waiting for testing, review comments, DevOps problems, and other process imperfections are already included in this term.
|
§ page.team.pr.description3: *为什么显示开发时间* 无需拆分为编码和代码审查? 然后,向业务显示代码的实际交付时间。 测试的期望,对审查的评论,DevOps问题和流程的其他不完善之处已经在这一时期制定.
|
||||||
§ page.team.pr.statByAuthors: Statistics by employees
|
§ page.team.pr.statByAuthors: 雇员统计数字
|
||||||
§ page.team.pr.longDelay: Prolonged Waiting for merge
|
§ page.team.pr.longDelay: 长时间等待输液
|
||||||
§ page.team.tasks.task: Task
|
§ page.team.tasks.task: 任务
|
||||||
§ page.team.tasks.author: First commit author
|
§ page.team.tasks.author: 第一篇的作者 Commits
|
||||||
§ page.team.tasks.from: First commit
|
§ page.team.tasks.from: 第一个 Commits
|
||||||
§ page.team.tasks.to: Last commit
|
§ page.team.tasks.to: 最后一次 Commits
|
||||||
§ page.team.tasks.daysInWork: Days in work
|
§ page.team.tasks.daysInWork: 工作中的日子
|
||||||
§ page.team.tasks.commits: Commits number
|
§ page.team.tasks.commits: 数量 Commits
|
||||||
§ page.team.tasks.pr: Merge date
|
§ page.team.tasks.pr: 注射日期
|
||||||
§ page.team.tasks.prAuthor: Merged by user
|
§ page.team.tasks.prAuthor: 灌
|
||||||
§ page.team.tasks.prDelayDays: Delay before merge in days
|
§ page.team.tasks.prDelayDays: 等待输液的日子
|
||||||
§ page.team.tasks.comments: Comments
|
§ page.team.tasks.comments: 评论
|
||||||
§ page.person.print.photo.title: Photo
|
§ page.person.print.photo.title: 照片
|
||||||
§ page.person.print.photo.description: space for a photo
|
§ page.person.print.photo.description: 拍照的地方
|
||||||
§ page.person.total.title: Main characteristics
|
§ page.person.total.title: 主要特点
|
||||||
§ page.person.total.daysWorked.title: days of work
|
§ page.person.total.daysWorked.title: 工作天
|
||||||
§ page.person.total.daysWorked.description: Only days with commits are counted
|
§ page.person.total.daysWorked.description: 只考虑制作它们的日子 Commits
|
||||||
§ page.person.total.tasks.title: tasks
|
§ page.person.total.tasks.title: 任务
|
||||||
§ page.person.total.tasks.description: If commits are properly signed
|
§ page.person.total.tasks.description: 如果 Commits 正确签名
|
||||||
§ page.person.character.title: Character
|
§ page.person.character.title: 性格
|
||||||
§ page.person.achievement.title: Achievements
|
§ page.person.achievement.title: 进展情况
|
||||||
§ page.person.achievement.positive: Positive
|
§ page.person.achievement.positive: 积极
|
||||||
§ page.person.achievement.normal: Neutral
|
§ page.person.achievement.normal: 中立
|
||||||
§ page.person.achievement.negative: Negative
|
§ page.person.achievement.negative: 负面
|
||||||
§ page.person.achievement.description: The more negative achievements an employee accumulates, the higher the likelihood that the situation is unusual. It may be necessary to change their work mode, tasks, or reporting. A discussion with them to understand what problems are hindering their work is advisable.
|
§ page.person.achievement.description: 员工取得的负面成绩越多,情况就越有可能非标准。 可能值得改变其操作模式,任务或报告。 你应该和他谈谈,看看有什么问题妨碍了他的工作.
|
||||||
§ page.person.gets.title: Gets taken:
|
§ page.person.gets.title: 被带走的木屐:
|
||||||
§ page.person.gets.description: "Taking a get" in this context means being the first to leave a commit on a task with a "nice" number.
|
§ page.person.gets.description: «被带走的木屐» 在这种情况下,它意味着第一个离开 Commits 到"美丽"数字的问题.
|
||||||
§ page.person.business.days.title: days of work
|
§ page.person.business.days.title: 工作天
|
||||||
§ page.person.business.days.description: Only days with commits are counted
|
§ page.person.business.days.description: 只考虑制作它们的日子 Commits
|
||||||
§ page.person.business.tasks.title: tasks
|
§ page.person.business.tasks.title: 任务
|
||||||
§ page.person.business.tasks.description: If commits are properly signed
|
§ page.person.business.tasks.description: 如果 Commits 正确签名
|
||||||
§ page.person.business.losses.title: days without commits
|
§ page.person.business.losses.title: 没有的日子 Commits
|
||||||
§ page.person.business.losses.description: All days minus: holidays, weekends, vacation, days with commits
|
§ page.person.business.losses.description: 所有日子减去:假期,周末,假期,休息日 Commits
|
||||||
§ page.person.business.commits.title: commits
|
§ page.person.business.commits.title: Commits
|
||||||
§ page.person.business.commits.description: Deleted branches are not counted
|
§ page.person.business.commits.description: 删除的分支不算数
|
||||||
§ page.person.business.time.description: Time from the first to the last commit (including non-working days)
|
§ page.person.business.time.description: 从第一到最后的时间 Commits (包括非工作日)
|
||||||
§ page.person.business.time.title: Days on the project:
|
§ page.person.business.time.title: 项目日:
|
||||||
§ page.person.business.time.dismissed: (dismissed)
|
§ page.person.business.time.dismissed: (被解雇)
|
||||||
§ page.person.business.time.staff: (not in the team)
|
§ page.person.business.time.staff: (不在团队中)
|
||||||
§ page.person.business.achievements: Achievements
|
§ page.person.business.achievements: 进展情况
|
||||||
§ page.person.changes.title: Achievements
|
§ page.person.changes.title: 进展情况
|
||||||
§ page.person.changes.description:
|
§ page.person.changes.description:
|
||||||
With some types of formatting, git marks lines as "deleted" and "added",
|
使用某些类型的格式,git将字符串标记为"已删除"和"已添加",
|
||||||
although in reality, they were "changed". Therefore, if you conducted a major refactoring,
|
虽然事实上他们已经被"改变"。 因此,如果你已经做了很多重构,
|
||||||
git might show a small number of changes in the statistics, but the actual result
|
git可以显示统计信息的少量变化,以及实际结果
|
||||||
will be marked as a jump in "deleted" and "added" lines.
|
将在"已删除"和"已添加"行中标记为跳转.
|
||||||
§ page.person.changes.description: List of commits and the number of changes in them for that day:
|
§ page.person.changes.description: 名单 Commits 以及那一天他们的变化数量:
|
||||||
§ page.person.commits.title: List of commits:
|
§ page.person.commits.title: 名单 Commits:
|
||||||
§ page.person.money.title.total: Total over time
|
§ page.person.money.title.total: 一直如此
|
||||||
§ page.person.money.title.middle: Average cost
|
§ page.person.money.title.middle: 平均成本
|
||||||
§ page.person.money.moneyAll.title: received
|
§ page.person.money.moneyAll.title: 收到
|
||||||
§ page.person.money.moneyAll.description: Assumed total salary from the project (see settings)
|
§ page.person.money.moneyAll.description: 工程项目的采购订单估计金额 (请参阅设置)
|
||||||
§ page.person.money.moneyWorked.title: worked for
|
§ page.person.money.moneyWorked.title: 工作了
|
||||||
§ page.person.money.moneyWorked.description: Actual days worked multiplied by average salary
|
§ page.person.money.moneyWorked.description: 实际工作天数乘以平均po
|
||||||
§ page.person.money.moneyLosses.title: possible overpayment
|
§ page.person.money.moneyLosses.title: 可能多付
|
||||||
§ page.person.money.moneyLosses.description: Days without commits multiplied by average salary
|
§ page.person.money.moneyLosses.description: 没有的日子 Commits 乘以平均po
|
||||||
§ page.person.money.tasks.title: task
|
§ page.person.money.tasks.title: 任务
|
||||||
§ page.person.money.tasks.description: Number of closed tasks to the cost of the day
|
§ page.person.money.tasks.description: 关闭任务的数量到一天的成本
|
||||||
§ page.person.money.commits.title: commit
|
§ page.person.money.commits.title: Commits
|
||||||
§ page.person.money.commits.description: Number of commits to the cost of the workday
|
§ page.person.money.commits.description: 数量 Commits 到一个工作日的成本
|
||||||
§ page.person.speed.task: One task on average is
|
§ page.person.speed.task: 平均一项任务是
|
||||||
§ page.person.speed.max: Maximum speed per day
|
§ page.person.speed.max: 每日最高速度
|
||||||
§ page.person.speed.days.title: days
|
§ page.person.speed.days.title: 天数
|
||||||
§ page.person.speed.days.description: Refers to workdays, if commits are properly signed
|
§ page.person.speed.days.description: 这意味着如果 Commits 正确签名
|
||||||
§ page.person.speed.commits.title: commits
|
§ page.person.speed.commits.title: Commits
|
||||||
§ page.person.speed.commits.description: Top and bottom 10% of values are trimmed
|
§ page.person.speed.commits.description: 最大值和最小值的10%已被切断
|
||||||
§ page.person.speed.line.title: lines of code
|
§ page.person.speed.line.title: 代码行
|
||||||
§ page.person.speed.line.description: Top and bottom 10% of values are trimmed
|
§ page.person.speed.line.description: 最大值和最小值的10%已被切断
|
||||||
§ page.person.speed.tasks.title: tasks
|
§ page.person.speed.tasks.title: 任务
|
||||||
§ page.person.speed.tasks.description: A task may not be completed, but work should be done on it
|
§ page.person.speed.tasks.description: 任务可能没有完成,但它的工作应该是
|
||||||
§ page.person.speed.maxCommits.title: commits
|
§ page.person.speed.maxCommits.title: Commits
|
||||||
§ page.person.speed.maxCommits.description: A task may not be completed, but work should be done on it
|
§ page.person.speed.maxCommits.description: 任务可能没有完成,但它的工作应该是
|
||||||
§ page.person.hours.title: Distribution of commits during each day of the week
|
§ page.person.hours.title: 分布情况 Commits 在一周的每一天
|
||||||
§ page.person.week.date: Date
|
§ page.person.week.date: 日期
|
||||||
§ page.person.week.tasks: Number of tasks
|
§ page.person.week.tasks: 任务数量
|
||||||
§ page.person.week.workDays: Days with commits
|
§ page.person.week.workDays: 日起 Commits
|
||||||
§ page.person.week.taskInDay: Tasks per day
|
§ page.person.week.taskInDay: 每天的任务
|
||||||
§ page.person.week.days: days
|
§ page.person.week.days: 天数
|
||||||
§ page.person.week.workDay: weekdays
|
§ page.person.week.workDay: 平日
|
||||||
§ page.person.week.weekends: weekends
|
§ page.person.week.weekends: 周末
|
||||||
`;
|
`;
|
||||||
|
|
Loading…
Reference in a new issue