mirror of
https://github.com/bakhirev/assayo.git
synced 2024-11-16 16:21:41 +00:00
update
This commit is contained in:
parent
1963e76e3c
commit
c1a893779d
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
||||||
Визуализация и анализ данных вашего git-репозитория ([демо](https://assayo.online/demo/?dump=./test.txt), [install](https://assayo.online/demo/?ref=github)).
|
Визуализация и анализ данных вашего git-репозитория ([демо](https://assayo.online/demo/?dump=./test.txt), [установка](https://assayo.online/demo/?ref=github)).
|
||||||
|
|
||||||
##### Сотрудник может оценить новое место работы
|
##### Сотрудник может оценить новое место работы
|
||||||
- темп работы;
|
- темп работы;
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128.83 128.83"><defs><style>.cls-1{fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2.93px;}</style></defs><path class="cls-1" d="M53.48,82.2c4.55-.83,9.56-2.3,10.81-3.6"/><path class="cls-1" d="M53.48,82.2c-1.62,7.46,8.51,7.81,10.81,4.67"/><path class="cls-1" d="M64.29,78.59c1.25,1.3,6.26,2.77,10.81,3.6"/><path class="cls-1" d="M64.29,86.87c2.3,3.14,12.43,2.79,10.81-4.67"/><g><g><path class="cls-1" d="M64.41,109.89c-26.76,0-28.81-18.57-28.93-41.24"/><path class="cls-1" d="M64.41,18.94c-26.76,0-28.81,11.58-28.93,25.72"/><path class="cls-1" d="M64.41,69.19c-7.99,0-13.18,.64-17.42,5.67"/><path class="cls-1" d="M35.48,44.66c-3.74,0-6.77,5.37-6.77,11.99s3.03,11.99,6.77,11.99"/><path class="cls-1" d="M39.76,26.74c.16-.1,2.27,4.62,4.51,6.67"/><path class="cls-1" d="M40.68,44.66s0-6.99,3.58-11.25"/><path class="cls-1" d="M40.68,63.52c0,6.82,6.31,11.34,6.31,11.34"/><line class="cls-1" x1="40.68" y1="44.66" x2="40.68" y2="63.52"/></g><g><path class="cls-1" d="M64.29,109.89c26.76,0,28.81-18.57,28.93-41.24"/><path class="cls-1" d="M93.35,44.66c3.74,0,6.77,5.37,6.77,11.99,0,6.62-3.03,11.99-6.77,11.99"/><path class="cls-1" d="M64.41,18.94c26.76,0,28.81,11.58,28.93,25.72"/><path class="cls-1" d="M64.41,69.19c7.99,0,13.18,.64,17.42,5.67"/><path class="cls-1" d="M89.07,26.74c-.16-.1-2.27,4.62-4.51,6.67"/><path class="cls-1" d="M88.14,44.66s0-6.99-3.58-11.25"/><path class="cls-1" d="M88.14,63.52c0,6.82-6.31,11.34-6.31,11.34"/><line class="cls-1" x1="88.14" y1="44.66" x2="88.14" y2="63.52"/></g></g><g><path class="cls-1" d="M45.18,50.66c6.64-2.47,14.92,.94,14.92,.94"/><path class="cls-1" d="M83.65,50.66c-6.64-2.47-14.92,.94-14.92,.94"/></g></svg>
|
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,33 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
|
|
||||||
import themeSettings from 'ts/store/ThemeSettings';
|
|
||||||
|
|
||||||
import style from 'ts/components/CardWithIcon/index.module.scss';
|
|
||||||
|
|
||||||
interface ICardWithBannerProps {
|
|
||||||
long?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
function CardWithBanner({
|
|
||||||
long = false,
|
|
||||||
}: ICardWithBannerProps): React.ReactElement | null {
|
|
||||||
const config = themeSettings.getBanner();
|
|
||||||
if (!config) return null;
|
|
||||||
|
|
||||||
const { link, banner } = config;
|
|
||||||
const className = long
|
|
||||||
? style.card_with_icon_long
|
|
||||||
: style.card_with_icon;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Link
|
|
||||||
to={link || ''}
|
|
||||||
target="_blank"
|
|
||||||
className={className}
|
|
||||||
style={{ backgroundImage: `url(${banner})` }}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CardWithBanner;
|
|
|
@ -62,6 +62,12 @@
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
color: var(--color-grey);
|
color: var(--color-grey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&_banner {
|
||||||
|
font-size: 32px;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 270px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.card_with_icon_long {
|
.card_with_icon_long {
|
||||||
|
@ -92,7 +98,7 @@
|
||||||
@media (max-width: 650px) {
|
@media (max-width: 650px) {
|
||||||
.card_with_icon,
|
.card_with_icon,
|
||||||
.card_with_icon_long {
|
.card_with_icon_long {
|
||||||
min-height: auto;
|
min-height: 190px;
|
||||||
padding: 32px 0;
|
padding: 32px 0;
|
||||||
|
|
||||||
&_value {
|
&_value {
|
||||||
|
|
|
@ -57,6 +57,7 @@ CardWithIcon.defaultProps = {
|
||||||
suffix: '',
|
suffix: '',
|
||||||
color: undefined,
|
color: undefined,
|
||||||
icon: undefined,
|
icon: undefined,
|
||||||
|
long: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default CardWithIcon;
|
export default CardWithIcon;
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
|
|
||||||
import themeSettings from 'ts/store/ThemeSettings';
|
|
||||||
|
|
||||||
import style from '../styles/card.module.scss';
|
|
||||||
|
|
||||||
function Banner() {
|
|
||||||
const config = themeSettings.getBanner();
|
|
||||||
if (!config) return null;
|
|
||||||
|
|
||||||
const { link, banner } = config;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Link
|
|
||||||
to={link || ''}
|
|
||||||
target="_blank"
|
|
||||||
className={`${style.recommendations_card} ${style.recommendations_card_banner}`}
|
|
||||||
style={{ backgroundImage: `url(${banner})` }}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Banner;
|
|
|
@ -2,13 +2,23 @@ import React from 'react';
|
||||||
|
|
||||||
import Title from 'ts/components/Title';
|
import Title from 'ts/components/Title';
|
||||||
import localization from 'ts/helpers/Localization';
|
import localization from 'ts/helpers/Localization';
|
||||||
|
import Banner from 'ts/components/Banner';
|
||||||
|
|
||||||
import Card from './components/Card';
|
import Card from './components/Card';
|
||||||
import Banner from './components/Banner';
|
|
||||||
import CardForPrint from './components/CardForPrint';
|
import CardForPrint from './components/CardForPrint';
|
||||||
import recommendationStore from './store/index';
|
import recommendationStore from './store/index';
|
||||||
|
import styleCard from './styles/card.module.scss';
|
||||||
import style from './styles/index.module.scss';
|
import style from './styles/index.module.scss';
|
||||||
|
|
||||||
|
function addBannerInRandomIndex(list: any[]) {
|
||||||
|
const className = `${styleCard.recommendations_card} ${styleCard.recommendations_card_banner}`;
|
||||||
|
const item = (<Banner className={className} />);
|
||||||
|
|
||||||
|
const index = Math.floor(Math.random() * list.length);
|
||||||
|
const last = list.splice(index);
|
||||||
|
return [...list, item, ...last];
|
||||||
|
}
|
||||||
|
|
||||||
interface IRecommendationsProps {
|
interface IRecommendationsProps {
|
||||||
recommendations: any[];
|
recommendations: any[];
|
||||||
mode?: string;
|
mode?: string;
|
||||||
|
@ -18,7 +28,7 @@ function Recommendations({
|
||||||
recommendations,
|
recommendations,
|
||||||
mode,
|
mode,
|
||||||
}: IRecommendationsProps) {
|
}: IRecommendationsProps) {
|
||||||
const cards = (recommendations || [])
|
let cards = (recommendations || [])
|
||||||
.filter(item => item)
|
.filter(item => item)
|
||||||
.map((recommendation) => (mode === 'print' ? (
|
.map((recommendation) => (mode === 'print' ? (
|
||||||
<CardForPrint
|
<CardForPrint
|
||||||
|
@ -37,7 +47,7 @@ function Recommendations({
|
||||||
|
|
||||||
if (!cards.length) return null;
|
if (!cards.length) return null;
|
||||||
if (mode !== 'print') {
|
if (mode !== 'print') {
|
||||||
cards.push(<Banner />);
|
cards = addBannerInRandomIndex(cards);
|
||||||
}
|
}
|
||||||
|
|
||||||
const title = localization.get('recommendations.title');
|
const title = localization.get('recommendations.title');
|
||||||
|
|
|
@ -106,12 +106,11 @@
|
||||||
border-left-color: var(--color-temp-border);
|
border-left-color: var(--color-temp-border);
|
||||||
|
|
||||||
&_banner {
|
&_banner {
|
||||||
|
font-size: var(--font-m);
|
||||||
|
padding: 0;
|
||||||
|
line-height: 100px;
|
||||||
border-left-width: 1px;
|
border-left-width: 1px;
|
||||||
border-left-color: var(--color-border);
|
border-left-color: var(--color-border);
|
||||||
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: 180% auto;
|
|
||||||
background-position: center center;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,6 @@
|
||||||
import dataGrip from 'ts/helpers/DataGrip';
|
|
||||||
|
|
||||||
import ALL_ACHIEVEMENTS from './constants/list';
|
import ALL_ACHIEVEMENTS from './constants/list';
|
||||||
import byCompetition from './byCompetition';
|
|
||||||
|
|
||||||
export default function getAchievementByAuthor(author: string) {
|
export default function getAchievementByAuthor(list: string[], statistic: any) {
|
||||||
const statistic = dataGrip.author.statisticByName[author];
|
|
||||||
if (!statistic) return;
|
|
||||||
const list = byCompetition.get(author);
|
|
||||||
const commitByHours = statistic.commitsByHour;
|
const commitByHours = statistic.commitsByHour;
|
||||||
|
|
||||||
if (statistic.commits > 20) {
|
if (statistic.commits > 20) {
|
||||||
|
@ -40,18 +34,18 @@ export default function getAchievementByAuthor(author: string) {
|
||||||
if (statistic.daysForTask > 2) list.push('more2DaysForTask');
|
if (statistic.daysForTask > 2) list.push('more2DaysForTask');
|
||||||
// Добро пожаловать - не уволили в течении трех месяцев с начала работы
|
// Добро пожаловать - не уволили в течении трех месяцев с начала работы
|
||||||
if (statistic.allDaysInProject > 90) list.push('more90DaysInProject');
|
if (statistic.allDaysInProject > 90) list.push('more90DaysInProject');
|
||||||
|
// Годовасик - отработал 365 дней на проекте
|
||||||
|
if (statistic.allDaysInProject >= 365) list.push('more365DaysInProject');
|
||||||
// Чёрт - отработал 666 дней на проекте
|
// Чёрт - отработал 666 дней на проекте
|
||||||
if (statistic.allDaysInProject > 666) list.push('more666DaysInProject');
|
if (statistic.allDaysInProject >= 666) list.push('more666DaysInProject');
|
||||||
// Азино - отработал 777 дней на проекте
|
// Азино - отработал 777 дней на проекте
|
||||||
if (statistic.allDaysInProject > 777) list.push('more777DaysInProject');
|
if (statistic.allDaysInProject >= 777) list.push('more777DaysInProject');
|
||||||
// Тесак - отработал 1488 дней на проекте
|
|
||||||
if (statistic.allDaysInProject > 1488) list.push('more1488DaysInProject');
|
|
||||||
}
|
}
|
||||||
// Ни единого разрыва - 0 дней без коммитов
|
// Ни единого разрыва - 0 дней без коммитов
|
||||||
if (statistic.lazyDays === 0) list.push('zeroLazyDays');
|
if (statistic.lazyDays === 0) list.push('zeroLazyDays');
|
||||||
// Стрельба холостыми - коммиты есть, а закрытых задач нет
|
// Стрельба холостыми - коммиты есть, а закрытых задач нет
|
||||||
if (statistic.commits > 0 && statistic.tasks === 0) list.push('workNotWork');
|
if (statistic.commits > 0 && statistic.tasks === 0) list.push('workNotWork');
|
||||||
// сказал как отрезал - в среднем 1 коммит на таск
|
// Точно в цель - в среднем 1 коммит на таск
|
||||||
if (statistic.tasks / statistic.commits) list.push('oneCommitOneTask');
|
if (statistic.tasks / statistic.commits) list.push('oneCommitOneTask');
|
||||||
|
|
||||||
return list.reduce((acc: any, type: string) => {
|
return list.reduce((acc: any, type: string) => {
|
||||||
|
|
|
@ -1,98 +1,98 @@
|
||||||
import IHashMap from 'ts/interfaces/HashMap';
|
import IHashMap from 'ts/interfaces/HashMap';
|
||||||
import dataGrip from 'ts/helpers/DataGrip';
|
|
||||||
|
|
||||||
class AchievementsByCompetition {
|
import getAchievementByAuthor from './byAuthor';
|
||||||
|
|
||||||
|
class AchievementsByAuthor {
|
||||||
authors: IHashMap<string[]> = {};
|
authors: IHashMap<string[]> = {};
|
||||||
|
|
||||||
get(name: string) {
|
addAuthor(name: string) {
|
||||||
return this.authors[name]
|
this.authors[name] = [];
|
||||||
? [...this.authors[name]]
|
|
||||||
: [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateByDataGrip(statisticByAuthor: any) {
|
add(authors: Array<[string, number]>, maxAchievementCode: string, minAchievementCode?: string) {
|
||||||
// У меня работает - больше всего коммитов с текстом fix
|
const first = authors[0][0];
|
||||||
// 500я на проде - больше всего коммитов с префиксом hotfix
|
this.authors?.[first]?.push(maxAchievementCode);
|
||||||
// Хуяк, хуяк и в продакшен - больше всего коммитов с префиксом add или feat
|
|
||||||
// Выпускающий редактор - больше всего коммитов с текстом refactor
|
|
||||||
// - больше всего коммитов в час
|
|
||||||
const {
|
|
||||||
total,
|
|
||||||
achievements,
|
|
||||||
} = this.#getTotalByAuthor(statisticByAuthor);
|
|
||||||
|
|
||||||
const nameLength = this.#getFirstAndLast(total.nameLength);
|
if (!minAchievementCode) return;
|
||||||
// Азим Азиз Иль Ам Кадир Имран II - самое длинное имя
|
const last = authors[authors.length - 1][0];
|
||||||
achievements[nameLength.first].push('longestName');
|
this.authors?.[last]?.push(minAchievementCode);
|
||||||
// Корнишон - самое короткое имя
|
}
|
||||||
achievements[nameLength.last].push('shortestName');
|
}
|
||||||
|
|
||||||
const midMessage = this.#getFirstAndLast(total.midMessage);
|
class AchievementsByCompetition {
|
||||||
// Мастер красноречия - стабильно ,самые длинные подписи коммитов
|
authors: IHashMap<Array<string[]>> = {};
|
||||||
achievements[midMessage.first].push('everyMessageLong');
|
|
||||||
// Нет времени обьяснять - стабильно, самые короткие подписи коммитов
|
|
||||||
achievements[midMessage.last].push('everyMessageShort');
|
|
||||||
|
|
||||||
const maxMessage = this.#getFirstAndLast(total.maxMessage);
|
updateByDataGrip(dataGrip: any) {
|
||||||
// Пиздеть, не мешки ворочить - самая длинная подпись коммита за все время
|
const statisticByAuthor = dataGrip.author.statistic;
|
||||||
achievements[maxMessage.first].push('longestMessage');
|
const byAuthor: any = new AchievementsByAuthor();
|
||||||
|
const total = this.#getMinMaxValue(statisticByAuthor, dataGrip, (statistic: any) => {
|
||||||
|
byAuthor.addAuthor(statistic.author);
|
||||||
|
});
|
||||||
|
|
||||||
const tasks = this.#getFirstAndLast(total.tasks);
|
// Длина имени
|
||||||
// Батя - больше всего закрытых задач
|
byAuthor.add(total.nameLength, 'longestName', 'shortestName');
|
||||||
achievements[tasks.first].push('moreTasks');
|
|
||||||
// Зашел и вышел - меньше всего закрытых задач
|
|
||||||
achievements[tasks.last].push('lessTasks');
|
|
||||||
|
|
||||||
const days = this.#getFirstAndLast(total.days);
|
// Длина сообщения
|
||||||
// Ценный работник - больше всего рабочих дней
|
byAuthor.add(total.messageLength, 'longestMessage');
|
||||||
achievements[days.first].push('moreWorkDays');
|
|
||||||
// Дальше без меня - меньше всего рабочих дней
|
|
||||||
achievements[days.last].push('lessWorkDays');
|
|
||||||
|
|
||||||
const lazyDays = this.#getFirstAndLast(total.lazyDays);
|
// Средняя длина сообщения
|
||||||
// Мысленно я с вами - больше всего дней без коммитов
|
byAuthor.add(total.midMessageLength, 'everyMessageLong', 'everyMessageShort');
|
||||||
achievements[lazyDays.first].push('moreLazyDays');
|
|
||||||
// Папа Карло - меньше всего дней без коммитов
|
|
||||||
achievements[lazyDays.last].push('lessLazyDays');
|
|
||||||
|
|
||||||
const allDaysInProject = this.#getFirstAndLast(total.allDaysInProject);
|
// Количество закрытых задач
|
||||||
// Старожил - больше всего дней на проекте
|
byAuthor.add(total.tasks, 'moreTasks', 'lessTasks');
|
||||||
achievements[allDaysInProject.first].push('moreDaysInProject');
|
|
||||||
// А это кто? - меньше всего дней на проекте
|
|
||||||
achievements[allDaysInProject.last].push('lessDaysInProject');
|
|
||||||
|
|
||||||
const firstCommit = this.#getFirstAndLast(total.firstCommit);
|
// Количество дней с коммитами
|
||||||
// Адам - первый стабильны сотрудник на проекте
|
byAuthor.add(total.days, 'moreWorkDays', 'lessWorkDays');
|
||||||
achievements[firstCommit.last].push('adam');
|
|
||||||
|
|
||||||
const moreRefactoring = this.#getFirstAndLast(total.moreRefactoring);
|
// Количество дней без коммитов
|
||||||
// Главный редактор - сделал больше всех меток «рефакторинг»
|
byAuthor.add(total.lazyDays, 'moreLazyDays', 'lessLazyDays');
|
||||||
achievements[moreRefactoring.first].push('moreRefactoring');
|
|
||||||
|
|
||||||
const tasksInDay = this.#getFirstAndLast(total.tasksInDay);
|
// Количество дней на проекте
|
||||||
// Спиди-гонщик - рекорд по количеству закрытых задач в день
|
byAuthor.add(total.allDaysInProject, 'moreDaysInProject', 'lessDaysInProject');
|
||||||
achievements[tasksInDay.first].push('moreTasksInDay');
|
|
||||||
|
|
||||||
const commitsInDay = this.#getFirstAndLast(total.commitsInDay);
|
// Дата первого коммита
|
||||||
// Zerg Rush - рекорд по количеству коммитов в день
|
byAuthor.add(total.firstCommit, 'adam');
|
||||||
achievements[commitsInDay.first].push('moreCommits');
|
|
||||||
|
|
||||||
this.authors = achievements;
|
// Количество метки «рефакторинг»
|
||||||
|
byAuthor.add(total.moreRefactoring, 'moreRefactoring');
|
||||||
|
|
||||||
|
// Количество закрытых задач в день
|
||||||
|
byAuthor.add(total.tasksInDay, 'moreTasksInDay');
|
||||||
|
|
||||||
|
// Количество коммитов в день
|
||||||
|
byAuthor.add(total.commitsInDay, 'moreCommits');
|
||||||
|
|
||||||
|
// Первый и последний коммит
|
||||||
|
const lastAuthor = dataGrip.firstLastCommit.maxData.author;
|
||||||
|
const firstAuthor = dataGrip.firstLastCommit.minData.author;
|
||||||
|
if (firstAuthor === lastAuthor) {
|
||||||
|
byAuthor.authors[firstAuthor].push('firstLastCommit');
|
||||||
|
} else {
|
||||||
|
byAuthor.authors[firstAuthor].push('firstCommit');
|
||||||
|
byAuthor.authors[lastAuthor].push('lastCommit');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.dir(byAuthor);
|
||||||
|
statisticByAuthor.forEach((statistic: any) => {
|
||||||
|
const achievements = byAuthor.authors[statistic.author];
|
||||||
|
this.authors[statistic.author] = getAchievementByAuthor(achievements, statistic);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#getTotalByAuthor(statisticByAuthor: any) {
|
#getMinMaxValue(statisticByAuthor: any, dataGrip: any, callback: Function) {
|
||||||
const achievements = {};
|
|
||||||
const total: IHashMap<any> = {};
|
const total: IHashMap<any> = {};
|
||||||
|
|
||||||
statisticByAuthor.forEach((statistic: any) => {
|
statisticByAuthor.forEach((statistic: any) => {
|
||||||
achievements[statistic.author] = [];
|
callback(statistic);
|
||||||
|
|
||||||
const addData = (property: string, count: number) => {
|
const addData = (property: string, count: number) => {
|
||||||
if (!total[property]) total[property] = [];
|
if (!total[property]) total[property] = [];
|
||||||
total[property].push([statistic.author, count]);
|
total[property].push([statistic.author, count]);
|
||||||
};
|
};
|
||||||
|
|
||||||
addData('nameLength', statistic.author.length);
|
addData('nameLength', statistic.author.length);
|
||||||
addData('maxMessage', statistic.messageLength[statistic.messageLength.length - 1]);
|
addData('messageLength', statistic.messageLength[statistic.messageLength.length - 1]);
|
||||||
addData('midMessage', statistic.middleMessageLength);
|
addData('midMessageLength', statistic.middleMessageLength);
|
||||||
addData('tasks', statistic.tasks.length);
|
addData('tasks', statistic.tasks.length);
|
||||||
addData('days', statistic.days);
|
addData('days', statistic.days);
|
||||||
addData('moreRefactoring', statistic.types.refactor);
|
addData('moreRefactoring', statistic.types.refactor);
|
||||||
|
@ -111,17 +111,7 @@ class AchievementsByCompetition {
|
||||||
total[achievement].sort((a: any, b: any) => b[1] - a[1]);
|
total[achievement].sort((a: any, b: any) => b[1] - a[1]);
|
||||||
});
|
});
|
||||||
|
|
||||||
return { total, achievements };
|
return total;
|
||||||
}
|
|
||||||
|
|
||||||
#getFirstAndLast(list: any[]) {
|
|
||||||
const first = list.shift();
|
|
||||||
const last = list.pop() || first;
|
|
||||||
|
|
||||||
return {
|
|
||||||
first: first[0],
|
|
||||||
last: last[0],
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,15 +25,15 @@ export default {
|
||||||
lessScopes: ACHIEVEMENT_TYPE.BAD, // Щегол
|
lessScopes: ACHIEVEMENT_TYPE.BAD, // Щегол
|
||||||
moreDaysForTask: ACHIEVEMENT_TYPE.BAD, // Улитка на склоне
|
moreDaysForTask: ACHIEVEMENT_TYPE.BAD, // Улитка на склоне
|
||||||
more2DaysForTask: ACHIEVEMENT_TYPE.BAD, // Cо слоу
|
more2DaysForTask: ACHIEVEMENT_TYPE.BAD, // Cо слоу
|
||||||
moreDaysInProject: ACHIEVEMENT_TYPE.GOOD, // Старожил
|
moreDaysInProject: ACHIEVEMENT_TYPE.GOOD, // Часть команды, часть коробля
|
||||||
lessDaysInProject: ACHIEVEMENT_TYPE.NORMAL, // А это кто?
|
lessDaysInProject: ACHIEVEMENT_TYPE.NORMAL, // А это кто?
|
||||||
more90DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Добро пожаловать
|
more90DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Добро пожаловать
|
||||||
lessDaysForTask: ACHIEVEMENT_TYPE.GOOD, // Скорострел
|
lessDaysForTask: ACHIEVEMENT_TYPE.GOOD, // Скорострел
|
||||||
adam: ACHIEVEMENT_TYPE.NORMAL, // Адам
|
adam: ACHIEVEMENT_TYPE.NORMAL, // Адам
|
||||||
more666DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Чёрт
|
more666DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Чёрт
|
||||||
more777DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Азино 3 топора
|
more777DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Азино 3 топора
|
||||||
|
|
||||||
moreRefactoring: ACHIEVEMENT_TYPE.GOOD, // Выпускающий редактор
|
moreRefactoring: ACHIEVEMENT_TYPE.GOOD, // Выпускающий редактор
|
||||||
|
|
||||||
// нет картинки
|
// нет картинки
|
||||||
longestMessage: ACHIEVEMENT_TYPE.NORMAL, // А разговоров то было...
|
longestMessage: ACHIEVEMENT_TYPE.NORMAL, // А разговоров то было...
|
||||||
moreTasksInDay: ACHIEVEMENT_TYPE.GOOD, // Спиди-гонщик
|
moreTasksInDay: ACHIEVEMENT_TYPE.GOOD, // Спиди-гонщик
|
||||||
|
@ -41,14 +41,46 @@ export default {
|
||||||
noCommitOnDay: ACHIEVEMENT_TYPE.NORMAL, // Технический перерыв
|
noCommitOnDay: ACHIEVEMENT_TYPE.NORMAL, // Технический перерыв
|
||||||
hasCommitEveryTime: ACHIEVEMENT_TYPE.BAD, // Умер на работе
|
hasCommitEveryTime: ACHIEVEMENT_TYPE.BAD, // Умер на работе
|
||||||
commitsAfter1800: ACHIEVEMENT_TYPE.GOOD, // Делу время
|
commitsAfter1800: ACHIEVEMENT_TYPE.GOOD, // Делу время
|
||||||
more1488DaysInProject: ACHIEVEMENT_TYPE.GOOD, // им. Максима Марцинкевича
|
more365DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Нужно чуть чуть потерпеть, отработал год и не уволился
|
||||||
|
firstCommit: ACHIEVEMENT_TYPE.NORMAL, // Кто первый, того и тапки. первый коммит на проекте
|
||||||
|
lastCommit: ACHIEVEMENT_TYPE.NORMAL, // Я закончил. последний коммит на проекте
|
||||||
|
firstLastCommit: ACHIEVEMENT_TYPE.NORMAL, // От начала и до конца. первый и последний коммит на проекте
|
||||||
|
|
||||||
// нет кода
|
// нет кода
|
||||||
// moreFix: ACHIEVEMENT_TYPE.GOOD, // Bug hunter
|
|
||||||
lessWorkDays: ACHIEVEMENT_TYPE.BAD, // Дальше без меня
|
|
||||||
moreCreateCode: ACHIEVEMENT_TYPE.NORMAL, // Созидатель
|
|
||||||
moreRemoveCode: ACHIEVEMENT_TYPE.NORMAL, // Разрушитель
|
|
||||||
moreChangeCode: ACHIEVEMENT_TYPE.NORMAL, // Реформатор // есть картинка
|
|
||||||
moreStyle: ACHIEVEMENT_TYPE.GOOD, // Полиция моды
|
moreStyle: ACHIEVEMENT_TYPE.GOOD, // Полиция моды
|
||||||
|
lessWorkDays: ACHIEVEMENT_TYPE.BAD, // Дальше без меня
|
||||||
moreOnHoliday: ACHIEVEMENT_TYPE.BAD, // Нет жизни
|
moreOnHoliday: ACHIEVEMENT_TYPE.BAD, // Нет жизни
|
||||||
|
moreCreateCode: ACHIEVEMENT_TYPE.NORMAL, // Созидатель -- переименовать?
|
||||||
|
moreRemoveCode: ACHIEVEMENT_TYPE.NORMAL, // Разрушитель
|
||||||
|
moreChangeCode: ACHIEVEMENT_TYPE.NORMAL, // Реформатор
|
||||||
|
|
||||||
|
morePRMerge: ACHIEVEMENT_TYPE.GOOD, // Таможня даёт добро,
|
||||||
|
workOnWeekends: ACHIEVEMENT_TYPE.BAD, // Работа не walk. хоть раз работал на выходных
|
||||||
|
longWaitPR: ACHIEVEMENT_TYPE.BAD, // Обещать не значит жениться, ожидание PR больше месяца
|
||||||
|
moreLongWaitPR: ACHIEVEMENT_TYPE.BAD, // Давным давно, в далёкой галактике
|
||||||
|
more3YearsInProject: ACHIEVEMENT_TYPE.GOOD, // Старожил. больше 3х лет на проекте
|
||||||
|
|
||||||
|
oneExtension: ACHIEVEMENT_TYPE.NORMAL, // Один в поле воин. Только он работает с файлами определенного расширения
|
||||||
|
fileRush: ACHIEVEMENT_TYPE.NORMAL, // Зерг Раш. Создал больше всех файлов в проекте
|
||||||
|
moreLintHint: ACHIEVEMENT_TYPE.GOOD, // Грамар-наци. Больше всех внес в .eslintrc .stylelintrc.json
|
||||||
|
moreReadMe: ACHIEVEMENT_TYPE.GOOD, // Летописец. Больше остальных внес в .MD
|
||||||
|
moreDevOps: ACHIEVEMENT_TYPE.GOOD, // DevOps. Больше остальных внес в DevOps
|
||||||
|
moreTests: ACHIEVEMENT_TYPE.GOOD, // Тестировщик. Больше остальных внес в тестирование
|
||||||
|
|
||||||
|
allRelease: ACHIEVEMENT_TYPE.NORMAL, // Фулл хаус. есть релиз, собранный только из его задач
|
||||||
|
longFilePath: ACHIEVEMENT_TYPE.NORMAL, // Закрома родины. первый создал файл с самым глубоким вложением
|
||||||
|
longFileName: ACHIEVEMENT_TYPE.NORMAL, // Размер имеет значение. создал файл с самым длинным именем
|
||||||
|
|
||||||
|
removeCreateFile: ACHIEVEMENT_TYPE.NORMAL, // Откопал стюардессу. востановил удаленный файл
|
||||||
|
renameFile: ACHIEVEMENT_TYPE.NORMAL, // Астана Нур-Султан Астана. переименовывал туда-сюда файл
|
||||||
|
longTask: ACHIEVEMENT_TYPE.BAD, // Вроде изян. работал над задачей больше трех месяцев
|
||||||
|
// Галя, у нас отмена - откатил назад
|
||||||
|
// У меня работает - больше всего коммитов с текстом fix
|
||||||
|
// 500я на проде - больше всего коммитов с префиксом hotfix
|
||||||
|
// moreFix: ACHIEVEMENT_TYPE.GOOD, // Bug hunter
|
||||||
|
// godFather: ACHIEVEMENT_TYPE.NORMAL, // Крёстный отец. Первый создал файлы небольшой группы.
|
||||||
|
// Боярин - есть папка на 20 файлов, где правит только этот человек
|
||||||
|
// Феодал - есть папка на 50 файлов, где правит только этот человек
|
||||||
|
|
||||||
|
// Психологический знак задиака по дате первого коммита
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,10 @@ import React from 'react';
|
||||||
|
|
||||||
import localization from 'ts/helpers/Localization';
|
import localization from 'ts/helpers/Localization';
|
||||||
import CardForPrint from 'ts/components/Recommendations/components/CardForPrint';
|
import CardForPrint from 'ts/components/Recommendations/components/CardForPrint';
|
||||||
|
import ACHIEVEMENT_LIST from 'ts/helpers/achievement/constants/list';
|
||||||
|
|
||||||
|
import Achievement from 'ts/components/Achievement/components/Item';
|
||||||
|
import Title from 'ts/components/Title';
|
||||||
|
|
||||||
function getFlatRecommendations(translations: any, list: any[] = []) {
|
function getFlatRecommendations(translations: any, list: any[] = []) {
|
||||||
if (!translations) return list;
|
if (!translations) return list;
|
||||||
|
@ -30,9 +34,22 @@ function DebugPage() {
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
|
||||||
console.dir(recommendations);
|
const achievements = Object
|
||||||
|
.entries(ACHIEVEMENT_LIST)
|
||||||
|
.sort((a, b) => a[1] - b[1])
|
||||||
|
.map(([code]: [string, number]) => (
|
||||||
|
<Achievement
|
||||||
|
key={code}
|
||||||
|
code={code}
|
||||||
|
/>
|
||||||
|
));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Title title="page.person.achievement.title"/>
|
||||||
|
<div style={{ columnCount: 3, marginBottom: '24px' }}>
|
||||||
|
{achievements}
|
||||||
|
</div>
|
||||||
<section>
|
<section>
|
||||||
{recommendations}
|
{recommendations}
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite';
|
||||||
import { getShortNumber } from 'ts/helpers/formatter';
|
import { getShortNumber } from 'ts/helpers/formatter';
|
||||||
|
|
||||||
import CardWithIcon from 'ts/components/CardWithIcon';
|
import CardWithIcon from 'ts/components/CardWithIcon';
|
||||||
import CardWithBanner from 'ts/components/CardWithBanner';
|
import CardWithBanner from 'ts/components/CardWithIcon/Banner';
|
||||||
import NothingFound from 'ts/components/NothingFound';
|
import NothingFound from 'ts/components/NothingFound';
|
||||||
import IsStaff from 'ts/components/NothingFound/components/IsStaff';
|
import IsStaff from 'ts/components/NothingFound/components/IsStaff';
|
||||||
import PageWrapper from 'ts/components/Page/wrapper';
|
import PageWrapper from 'ts/components/Page/wrapper';
|
||||||
|
|
|
@ -2,11 +2,11 @@ import React from 'react';
|
||||||
import { observer } from 'mobx-react-lite';
|
import { observer } from 'mobx-react-lite';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import getAchievementByAuthor from 'ts/helpers/achievement/byAuthor';
|
import achievementByAuthor from 'ts/helpers/achievement/byCompetition';
|
||||||
import ACHIEVEMENT_TYPE from 'ts/helpers/achievement/constants/type';
|
import ACHIEVEMENT_TYPE from 'ts/helpers/achievement/constants/type';
|
||||||
|
|
||||||
import CardWithBanner from 'ts/components/CardWithBanner';
|
|
||||||
import CardWithIcon from 'ts/components/CardWithIcon';
|
import CardWithIcon from 'ts/components/CardWithIcon';
|
||||||
|
import CardWithBanner from 'ts/components/CardWithIcon/Banner';
|
||||||
import Achievements from 'ts/components/Achievement';
|
import Achievements from 'ts/components/Achievement';
|
||||||
import Description from 'ts/components/Description';
|
import Description from 'ts/components/Description';
|
||||||
import PageWrapper from 'ts/components/Page/wrapper';
|
import PageWrapper from 'ts/components/Page/wrapper';
|
||||||
|
@ -39,8 +39,8 @@ const Total = observer(({ user }: IPersonCommonProps): React.ReactElement => {
|
||||||
const statistic = user;
|
const statistic = user;
|
||||||
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[user.author];
|
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[user.author];
|
||||||
const taskNumber = statistic.tasks.length;
|
const taskNumber = statistic.tasks.length;
|
||||||
const achievements = getAchievementByAuthor(statistic.author);
|
const achievements = achievementByAuthor.authors[statistic.author];
|
||||||
console.dir(achievements);
|
|
||||||
return (
|
return (
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
<PageColumn>
|
<PageColumn>
|
||||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
||||||
import { observer } from 'mobx-react-lite';
|
import { observer } from 'mobx-react-lite';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import getAchievementByAuthor from 'ts/helpers/achievement/byAuthor';
|
import achievementByAuthor from 'ts/helpers/achievement/byCompetition';
|
||||||
import ACHIEVEMENT_TYPE from 'ts/helpers/achievement/constants/type';
|
import ACHIEVEMENT_TYPE from 'ts/helpers/achievement/constants/type';
|
||||||
|
|
||||||
import Achievements from 'ts/components/Achievement';
|
import Achievements from 'ts/components/Achievement';
|
||||||
|
@ -36,7 +36,7 @@ const Total = observer(({
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const statistic = user;
|
const statistic = user;
|
||||||
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[statistic.author];
|
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[statistic.author];
|
||||||
const achievements = getAchievementByAuthor(statistic.author);
|
const achievements = achievementByAuthor.authors[statistic.author];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
|
|
|
@ -11,8 +11,6 @@ import Races from 'ts/components/Races';
|
||||||
|
|
||||||
import Tv100And1 from 'ts/components/Tv100And1';
|
import Tv100And1 from 'ts/components/Tv100And1';
|
||||||
|
|
||||||
// import ACHIEVEMENT_TYPE from 'ts/helpers/achievement/constants/type';
|
|
||||||
import getAchievementByAuthor from 'ts/helpers/achievement/byAuthor';
|
|
||||||
import Description from 'ts/components/Description';
|
import Description from 'ts/components/Description';
|
||||||
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';
|
||||||
|
@ -50,8 +48,6 @@ const Top = observer((): React.ReactElement => {
|
||||||
const chartMessageLength = getOptions({ max: maxMessageLength[0].value, suffix: 'сиволов' });
|
const chartMessageLength = getOptions({ max: maxMessageLength[0].value, suffix: 'сиволов' });
|
||||||
|
|
||||||
const authors = dataGripStore.dataGrip.author.statistic.map((statistic: any) => {
|
const authors = dataGripStore.dataGrip.author.statistic.map((statistic: any) => {
|
||||||
const achievements = getAchievementByAuthor(statistic.author);
|
|
||||||
console.dir(achievements);
|
|
||||||
const from = getDate(statistic.firstCommit.date);
|
const from = getDate(statistic.firstCommit.date);
|
||||||
const to = getDate(statistic.lastCommit.date);
|
const to = getDate(statistic.lastCommit.date);
|
||||||
const achievementsList = [
|
const achievementsList = [
|
||||||
|
|
|
@ -85,7 +85,7 @@ class DataGripStore implements IDataGripStore {
|
||||||
|
|
||||||
dataGrip.updateByInitialization();
|
dataGrip.updateByInitialization();
|
||||||
dataGrip.updateByFiles(fileList, removed.fileList);
|
dataGrip.updateByFiles(fileList, removed.fileList);
|
||||||
achievements.updateByDataGrip(dataGrip.author.statistic);
|
achievements.updateByDataGrip(dataGrip);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.dataGrip = null;
|
this.dataGrip = null;
|
||||||
|
@ -101,7 +101,7 @@ class DataGripStore implements IDataGripStore {
|
||||||
console.log('need update data TODO');
|
console.log('need update data TODO');
|
||||||
dataGrip.updateByFilters();
|
dataGrip.updateByFilters();
|
||||||
if (!dataGrip.author.list.length) return;
|
if (!dataGrip.author.list.length) return;
|
||||||
achievements.updateByDataGrip(dataGrip.author.statistic);
|
achievements.updateByDataGrip(dataGrip);
|
||||||
this.dataGrip = null;
|
this.dataGrip = null;
|
||||||
this.dataGrip = dataGrip;
|
this.dataGrip = dataGrip;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
import { makeObservable, observable, action } from 'mobx';
|
import { makeObservable, observable, action } from 'mobx';
|
||||||
|
|
||||||
const LOGO = {
|
import IBanner from 'ts/interfaces/Banner';
|
||||||
|
import IHashMap from 'ts/interfaces/HashMap';
|
||||||
|
|
||||||
|
const LOGO: IBanner = {
|
||||||
isDefault: true,
|
isDefault: true,
|
||||||
icon: './assets/logo.svg',
|
icon: './assets/logo.svg',
|
||||||
isOpenInNewTab: false,
|
isOpenInNewTab: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
const EXTERNAL_LOGO = {
|
const EXTERNAL_LOGO: IHashMap<IBanner> = {
|
||||||
vk_frontend_du2: {
|
vk_frontend_du2: {
|
||||||
icon: './social/vk/frontend_du2.png',
|
icon: './social/vk/frontend_du2.png',
|
||||||
banner: './social/vk/frontend_du2.jpg',
|
banner: './social/vk/frontend_du2.jpg',
|
||||||
|
@ -20,8 +23,11 @@ const EXTERNAL_LOGO = {
|
||||||
},
|
},
|
||||||
vk_awesomejs: {
|
vk_awesomejs: {
|
||||||
icon: './social/vk/awesomejs.png',
|
icon: './social/vk/awesomejs.png',
|
||||||
banner: './social/vk/awesomejs.jpg',
|
// banner: './social/vk/awesomejs.jpg',
|
||||||
link: 'https://vk.com/awesomejs',
|
link: 'https://vk.com/awesomejs',
|
||||||
|
bannerText: 'Сбер Банк',
|
||||||
|
color: '#000',
|
||||||
|
backgroundColor: '#C2ECC1',
|
||||||
},
|
},
|
||||||
vk_frontend_dev: {
|
vk_frontend_dev: {
|
||||||
icon: './social/vk/frontend_dev.png',
|
icon: './social/vk/frontend_dev.png',
|
||||||
|
@ -49,15 +55,18 @@ class ThemeSettings {
|
||||||
this.urlParameters = urlParameters || {};
|
this.urlParameters = urlParameters || {};
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogo() {
|
getLogo(): IBanner {
|
||||||
let config = EXTERNAL_LOGO[this.urlParameters?.ref || ''];
|
const ref = this.urlParameters?.ref || '';
|
||||||
|
let config = EXTERNAL_LOGO[ref];
|
||||||
if (!config) return LOGO;
|
if (!config) return LOGO;
|
||||||
|
|
||||||
|
config.ref = ref;
|
||||||
config.isOpenInNewTab = true;
|
config.isOpenInNewTab = true;
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
getBanner() {
|
getBanner(): IBanner | null {
|
||||||
let config = EXTERNAL_LOGO[this.urlParameters?.ref || ''];
|
let config = EXTERNAL_LOGO[this.urlParameters?.ref || ''];
|
||||||
if (!config) return null;
|
if (!config) return null;
|
||||||
|
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
||||||
§ achievements.commitsAfter1800.title: Делу время
|
§ achievements.commitsAfter1800.title: Делу время
|
||||||
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
||||||
§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
|
|
||||||
§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: больше всего закрытых багов
|
§ achievements.moreFix.description: больше всего закрытых багов
|
||||||
§ achievements.lessWorkDays.title: Дальше без меня
|
§ achievements.lessWorkDays.title: Дальше без меня
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
|
@ -45,8 +45,10 @@ export default `
|
||||||
§ achievements.moreDaysForTask.description: работа по задачам идёт медленнее чем у остальных
|
§ achievements.moreDaysForTask.description: работа по задачам идёт медленнее чем у остальных
|
||||||
§ achievements.more2DaysForTask.title: Cо слоу
|
§ achievements.more2DaysForTask.title: Cо слоу
|
||||||
§ achievements.more2DaysForTask.description: больше двух дней на задачу
|
§ achievements.more2DaysForTask.description: больше двух дней на задачу
|
||||||
§ achievements.moreDaysInProject.title: Старожил
|
§ achievements.moreDaysInProject.title: Часть команды, часть коробля
|
||||||
§ achievements.moreDaysInProject.description: больше всего дней на проекте
|
§ achievements.moreDaysInProject.description: больше всего дней на проекте
|
||||||
|
§ achievements.more3YearsInProject.title: Старожил
|
||||||
|
§ achievements.more3YearsInProject.description: больше трех лет на проекте
|
||||||
§ achievements.lessDaysInProject.title: А это кто?
|
§ achievements.lessDaysInProject.title: А это кто?
|
||||||
§ achievements.lessDaysInProject.description: меньше всего дней на проекте
|
§ achievements.lessDaysInProject.description: меньше всего дней на проекте
|
||||||
§ achievements.more90DaysInProject.title: Добро пожаловать
|
§ achievements.more90DaysInProject.title: Добро пожаловать
|
||||||
|
@ -55,6 +57,8 @@ export default `
|
||||||
§ achievements.lessDaysForTask.description: одна задача занимает меньше дня
|
§ achievements.lessDaysForTask.description: одна задача занимает меньше дня
|
||||||
§ achievements.adam.title: Адам
|
§ achievements.adam.title: Адам
|
||||||
§ achievements.adam.description: первый стабильный сотрудник на проекте
|
§ achievements.adam.description: первый стабильный сотрудник на проекте
|
||||||
|
§ achievements.more365DaysInProject.title: Годовасик
|
||||||
|
§ achievements.more365DaysInProject.description: отработал год на проекте
|
||||||
§ achievements.more666DaysInProject.title: Чёрт
|
§ achievements.more666DaysInProject.title: Чёрт
|
||||||
§ achievements.more666DaysInProject.description: отработал 666 дней на проекте
|
§ achievements.more666DaysInProject.description: отработал 666 дней на проекте
|
||||||
§ achievements.more777DaysInProject.title: Азино 3 топора
|
§ achievements.more777DaysInProject.title: Азино 3 топора
|
||||||
|
@ -73,8 +77,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
||||||
§ achievements.commitsAfter1800.title: Делу время
|
§ achievements.commitsAfter1800.title: Делу время
|
||||||
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
||||||
§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
|
|
||||||
§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: больше всего закрытых багов
|
§ achievements.moreFix.description: больше всего закрытых багов
|
||||||
§ achievements.lessWorkDays.title: Дальше без меня
|
§ achievements.lessWorkDays.title: Дальше без меня
|
||||||
|
@ -89,4 +91,43 @@ export default `
|
||||||
§ achievements.moreStyle.description: склонен больше остальных изменять CSS
|
§ achievements.moreStyle.description: склонен больше остальных изменять CSS
|
||||||
§ achievements.moreOnHoliday.title: Нет жизни
|
§ achievements.moreOnHoliday.title: Нет жизни
|
||||||
§ achievements.moreOnHoliday.description: относительно много коммитов в нерабочее время
|
§ achievements.moreOnHoliday.description: относительно много коммитов в нерабочее время
|
||||||
|
§ achievements.morePRMerge.title: Таможня даёт добро
|
||||||
|
§ achievements.morePRMerge.description: чаще остальных нажимает кнопку «Влить» для PR
|
||||||
|
§ achievements.longWaitPR.title: Обещать не значит жениться
|
||||||
|
§ achievements.longWaitPR.description: создал PR, который больше месяца провисел на ревью
|
||||||
|
§ achievements.moreLongWaitPR.title: Давным давно, в далёкой галактике
|
||||||
|
§ achievements.moreLongWaitPR.description: создал PR, который максимально долго провисел на ревью
|
||||||
|
§ achievements.oneExtension.title: Один в поле воин
|
||||||
|
§ achievements.oneExtension.description: только он работает с файлами определенного расширения
|
||||||
|
§ achievements.fileRush.title: Зерг Раш
|
||||||
|
§ achievements.fileRush.description: создал больше всех файлов в проекте
|
||||||
|
§ achievements.moreLintHint.title: Грамар-наци
|
||||||
|
§ achievements.moreLintHint.description: больше всех создал или изменил в правилах авто-проверки кода
|
||||||
|
§ achievements.moreReadMe.title: Летописец
|
||||||
|
§ achievements.moreReadMe.description: больше всех создал или изменил файлов MD
|
||||||
|
§ achievements.moreDevOps.title: DevOps
|
||||||
|
§ achievements.moreDevOps.description: больше всех создал или изменил файлов для CI/CD
|
||||||
|
§ achievements.moreTests.title: Тестировщик
|
||||||
|
§ achievements.moreTests.description: больше всех создал или изменил файлов для тестирования
|
||||||
|
§ achievements.allRelease.title: Фулл хаус
|
||||||
|
§ achievements.allRelease.description: есть релиз, собранный только из его задач
|
||||||
|
§ achievements.firstCommit.title: Кто первый, того и тапки
|
||||||
|
§ achievements.firstCommit.description: первый коммит на проекте
|
||||||
|
§ achievements.lastCommit.title: Я закончил
|
||||||
|
§ achievements.lastCommit.description: последний коммит на проекте
|
||||||
|
§ achievements.firstLastCommit.title: От начала и до конца
|
||||||
|
§ achievements.firstLastCommit.description: первый и последний коммит на проекте
|
||||||
|
§ achievements.longFilePath.title: Закрома родины
|
||||||
|
§ achievements.longFilePath.description: первый создал файл с самым глубоким вложением
|
||||||
|
§ achievements.longFileName.title: Размер имеет значение
|
||||||
|
§ achievements.longFileName.description: создал файл с самым длинным именемм
|
||||||
|
§ achievements.workOnWeekends.title: Работа не walk
|
||||||
|
§ achievements.workOnWeekends.description: хоть раз работал на выходных
|
||||||
|
§ achievements.removeCreateFile.title: Откопал стюардессу
|
||||||
|
§ achievements.removeCreateFile.description: востановил удаленный файл
|
||||||
|
§ achievements.renameFile.title: Астана Нур-Султан Астана
|
||||||
|
§ achievements.renameFile.description: переименовывал туда-сюда файл
|
||||||
|
§ achievements.longTask.title: Вроде изян
|
||||||
|
§ achievements.longTask.description: работал над задачей больше трех месяцев
|
||||||
|
§ achievements.111.description: test
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
||||||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||||
§ achievements.commitsAfter1800.title: Business Time
|
§ achievements.commitsAfter1800.title: Business Time
|
||||||
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
§ achievements.commitsAfter1800.description: no commits after 6:00 PM
|
||||||
§ achievements.more1488DaysInProject.title: Named after Maxim Martsinkevich
|
|
||||||
§ achievements.more1488DaysInProject.description: worked 1488 days on the project
|
|
||||||
§ achievements.moreFix.title: Bug hunter
|
§ achievements.moreFix.title: Bug hunter
|
||||||
§ achievements.moreFix.description: most closed bugs
|
§ achievements.moreFix.description: most closed bugs
|
||||||
§ achievements.lessWorkDays.title: Count me out
|
§ achievements.lessWorkDays.title: Count me out
|
||||||
|
|
Loading…
Reference in a new issue