mirror of
https://github.com/bakhirev/assayo.git
synced 2024-11-16 08:11:40 +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;
|
||||
color: var(--color-grey);
|
||||
}
|
||||
|
||||
&_banner {
|
||||
font-size: 32px;
|
||||
padding: 0;
|
||||
line-height: 270px;
|
||||
}
|
||||
}
|
||||
|
||||
.card_with_icon_long {
|
||||
|
@ -92,7 +98,7 @@
|
|||
@media (max-width: 650px) {
|
||||
.card_with_icon,
|
||||
.card_with_icon_long {
|
||||
min-height: auto;
|
||||
min-height: 190px;
|
||||
padding: 32px 0;
|
||||
|
||||
&_value {
|
||||
|
|
|
@ -57,6 +57,7 @@ CardWithIcon.defaultProps = {
|
|||
suffix: '',
|
||||
color: undefined,
|
||||
icon: undefined,
|
||||
long: false,
|
||||
};
|
||||
|
||||
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 localization from 'ts/helpers/Localization';
|
||||
import Banner from 'ts/components/Banner';
|
||||
|
||||
import Card from './components/Card';
|
||||
import Banner from './components/Banner';
|
||||
import CardForPrint from './components/CardForPrint';
|
||||
import recommendationStore from './store/index';
|
||||
import styleCard from './styles/card.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 {
|
||||
recommendations: any[];
|
||||
mode?: string;
|
||||
|
@ -18,7 +28,7 @@ function Recommendations({
|
|||
recommendations,
|
||||
mode,
|
||||
}: IRecommendationsProps) {
|
||||
const cards = (recommendations || [])
|
||||
let cards = (recommendations || [])
|
||||
.filter(item => item)
|
||||
.map((recommendation) => (mode === 'print' ? (
|
||||
<CardForPrint
|
||||
|
@ -37,7 +47,7 @@ function Recommendations({
|
|||
|
||||
if (!cards.length) return null;
|
||||
if (mode !== 'print') {
|
||||
cards.push(<Banner />);
|
||||
cards = addBannerInRandomIndex(cards);
|
||||
}
|
||||
|
||||
const title = localization.get('recommendations.title');
|
||||
|
|
|
@ -106,12 +106,11 @@
|
|||
border-left-color: var(--color-temp-border);
|
||||
|
||||
&_banner {
|
||||
font-size: var(--font-m);
|
||||
padding: 0;
|
||||
line-height: 100px;
|
||||
border-left-width: 1px;
|
||||
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 byCompetition from './byCompetition';
|
||||
|
||||
export default function getAchievementByAuthor(author: string) {
|
||||
const statistic = dataGrip.author.statisticByName[author];
|
||||
if (!statistic) return;
|
||||
const list = byCompetition.get(author);
|
||||
export default function getAchievementByAuthor(list: string[], statistic: any) {
|
||||
const commitByHours = statistic.commitsByHour;
|
||||
|
||||
if (statistic.commits > 20) {
|
||||
|
@ -40,18 +34,18 @@ export default function getAchievementByAuthor(author: string) {
|
|||
if (statistic.daysForTask > 2) list.push('more2DaysForTask');
|
||||
// Добро пожаловать - не уволили в течении трех месяцев с начала работы
|
||||
if (statistic.allDaysInProject > 90) list.push('more90DaysInProject');
|
||||
// Годовасик - отработал 365 дней на проекте
|
||||
if (statistic.allDaysInProject >= 365) list.push('more365DaysInProject');
|
||||
// Чёрт - отработал 666 дней на проекте
|
||||
if (statistic.allDaysInProject > 666) list.push('more666DaysInProject');
|
||||
if (statistic.allDaysInProject >= 666) list.push('more666DaysInProject');
|
||||
// Азино - отработал 777 дней на проекте
|
||||
if (statistic.allDaysInProject > 777) list.push('more777DaysInProject');
|
||||
// Тесак - отработал 1488 дней на проекте
|
||||
if (statistic.allDaysInProject > 1488) list.push('more1488DaysInProject');
|
||||
if (statistic.allDaysInProject >= 777) list.push('more777DaysInProject');
|
||||
}
|
||||
// Ни единого разрыва - 0 дней без коммитов
|
||||
if (statistic.lazyDays === 0) list.push('zeroLazyDays');
|
||||
// Стрельба холостыми - коммиты есть, а закрытых задач нет
|
||||
if (statistic.commits > 0 && statistic.tasks === 0) list.push('workNotWork');
|
||||
// сказал как отрезал - в среднем 1 коммит на таск
|
||||
// Точно в цель - в среднем 1 коммит на таск
|
||||
if (statistic.tasks / statistic.commits) list.push('oneCommitOneTask');
|
||||
|
||||
return list.reduce((acc: any, type: string) => {
|
||||
|
|
|
@ -1,98 +1,98 @@
|
|||
import IHashMap from 'ts/interfaces/HashMap';
|
||||
import dataGrip from 'ts/helpers/DataGrip';
|
||||
|
||||
class AchievementsByCompetition {
|
||||
import getAchievementByAuthor from './byAuthor';
|
||||
|
||||
class AchievementsByAuthor {
|
||||
authors: IHashMap<string[]> = {};
|
||||
|
||||
get(name: string) {
|
||||
return this.authors[name]
|
||||
? [...this.authors[name]]
|
||||
: [];
|
||||
addAuthor(name: string) {
|
||||
this.authors[name] = [];
|
||||
}
|
||||
|
||||
updateByDataGrip(statisticByAuthor: any) {
|
||||
// У меня работает - больше всего коммитов с текстом fix
|
||||
// 500я на проде - больше всего коммитов с префиксом hotfix
|
||||
// Хуяк, хуяк и в продакшен - больше всего коммитов с префиксом add или feat
|
||||
// Выпускающий редактор - больше всего коммитов с текстом refactor
|
||||
// - больше всего коммитов в час
|
||||
const {
|
||||
total,
|
||||
achievements,
|
||||
} = this.#getTotalByAuthor(statisticByAuthor);
|
||||
add(authors: Array<[string, number]>, maxAchievementCode: string, minAchievementCode?: string) {
|
||||
const first = authors[0][0];
|
||||
this.authors?.[first]?.push(maxAchievementCode);
|
||||
|
||||
const nameLength = this.#getFirstAndLast(total.nameLength);
|
||||
// Азим Азиз Иль Ам Кадир Имран II - самое длинное имя
|
||||
achievements[nameLength.first].push('longestName');
|
||||
// Корнишон - самое короткое имя
|
||||
achievements[nameLength.last].push('shortestName');
|
||||
|
||||
const midMessage = this.#getFirstAndLast(total.midMessage);
|
||||
// Мастер красноречия - стабильно ,самые длинные подписи коммитов
|
||||
achievements[midMessage.first].push('everyMessageLong');
|
||||
// Нет времени обьяснять - стабильно, самые короткие подписи коммитов
|
||||
achievements[midMessage.last].push('everyMessageShort');
|
||||
|
||||
const maxMessage = this.#getFirstAndLast(total.maxMessage);
|
||||
// Пиздеть, не мешки ворочить - самая длинная подпись коммита за все время
|
||||
achievements[maxMessage.first].push('longestMessage');
|
||||
|
||||
const tasks = this.#getFirstAndLast(total.tasks);
|
||||
// Батя - больше всего закрытых задач
|
||||
achievements[tasks.first].push('moreTasks');
|
||||
// Зашел и вышел - меньше всего закрытых задач
|
||||
achievements[tasks.last].push('lessTasks');
|
||||
|
||||
const days = this.#getFirstAndLast(total.days);
|
||||
// Ценный работник - больше всего рабочих дней
|
||||
achievements[days.first].push('moreWorkDays');
|
||||
// Дальше без меня - меньше всего рабочих дней
|
||||
achievements[days.last].push('lessWorkDays');
|
||||
|
||||
const lazyDays = this.#getFirstAndLast(total.lazyDays);
|
||||
// Мысленно я с вами - больше всего дней без коммитов
|
||||
achievements[lazyDays.first].push('moreLazyDays');
|
||||
// Папа Карло - меньше всего дней без коммитов
|
||||
achievements[lazyDays.last].push('lessLazyDays');
|
||||
|
||||
const allDaysInProject = this.#getFirstAndLast(total.allDaysInProject);
|
||||
// Старожил - больше всего дней на проекте
|
||||
achievements[allDaysInProject.first].push('moreDaysInProject');
|
||||
// А это кто? - меньше всего дней на проекте
|
||||
achievements[allDaysInProject.last].push('lessDaysInProject');
|
||||
|
||||
const firstCommit = this.#getFirstAndLast(total.firstCommit);
|
||||
// Адам - первый стабильны сотрудник на проекте
|
||||
achievements[firstCommit.last].push('adam');
|
||||
|
||||
const moreRefactoring = this.#getFirstAndLast(total.moreRefactoring);
|
||||
// Главный редактор - сделал больше всех меток «рефакторинг»
|
||||
achievements[moreRefactoring.first].push('moreRefactoring');
|
||||
|
||||
const tasksInDay = this.#getFirstAndLast(total.tasksInDay);
|
||||
// Спиди-гонщик - рекорд по количеству закрытых задач в день
|
||||
achievements[tasksInDay.first].push('moreTasksInDay');
|
||||
|
||||
const commitsInDay = this.#getFirstAndLast(total.commitsInDay);
|
||||
// Zerg Rush - рекорд по количеству коммитов в день
|
||||
achievements[commitsInDay.first].push('moreCommits');
|
||||
|
||||
this.authors = achievements;
|
||||
if (!minAchievementCode) return;
|
||||
const last = authors[authors.length - 1][0];
|
||||
this.authors?.[last]?.push(minAchievementCode);
|
||||
}
|
||||
}
|
||||
|
||||
#getTotalByAuthor(statisticByAuthor: any) {
|
||||
const achievements = {};
|
||||
class AchievementsByCompetition {
|
||||
authors: IHashMap<Array<string[]>> = {};
|
||||
|
||||
updateByDataGrip(dataGrip: any) {
|
||||
const statisticByAuthor = dataGrip.author.statistic;
|
||||
const byAuthor: any = new AchievementsByAuthor();
|
||||
const total = this.#getMinMaxValue(statisticByAuthor, dataGrip, (statistic: any) => {
|
||||
byAuthor.addAuthor(statistic.author);
|
||||
});
|
||||
|
||||
// Длина имени
|
||||
byAuthor.add(total.nameLength, 'longestName', 'shortestName');
|
||||
|
||||
// Длина сообщения
|
||||
byAuthor.add(total.messageLength, 'longestMessage');
|
||||
|
||||
// Средняя длина сообщения
|
||||
byAuthor.add(total.midMessageLength, 'everyMessageLong', 'everyMessageShort');
|
||||
|
||||
// Количество закрытых задач
|
||||
byAuthor.add(total.tasks, 'moreTasks', 'lessTasks');
|
||||
|
||||
// Количество дней с коммитами
|
||||
byAuthor.add(total.days, 'moreWorkDays', 'lessWorkDays');
|
||||
|
||||
// Количество дней без коммитов
|
||||
byAuthor.add(total.lazyDays, 'moreLazyDays', 'lessLazyDays');
|
||||
|
||||
// Количество дней на проекте
|
||||
byAuthor.add(total.allDaysInProject, 'moreDaysInProject', 'lessDaysInProject');
|
||||
|
||||
// Дата первого коммита
|
||||
byAuthor.add(total.firstCommit, 'adam');
|
||||
|
||||
// Количество метки «рефакторинг»
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
||||
#getMinMaxValue(statisticByAuthor: any, dataGrip: any, callback: Function) {
|
||||
const total: IHashMap<any> = {};
|
||||
|
||||
statisticByAuthor.forEach((statistic: any) => {
|
||||
achievements[statistic.author] = [];
|
||||
callback(statistic);
|
||||
|
||||
const addData = (property: string, count: number) => {
|
||||
if (!total[property]) total[property] = [];
|
||||
total[property].push([statistic.author, count]);
|
||||
};
|
||||
|
||||
addData('nameLength', statistic.author.length);
|
||||
addData('maxMessage', statistic.messageLength[statistic.messageLength.length - 1]);
|
||||
addData('midMessage', statistic.middleMessageLength);
|
||||
addData('messageLength', statistic.messageLength[statistic.messageLength.length - 1]);
|
||||
addData('midMessageLength', statistic.middleMessageLength);
|
||||
addData('tasks', statistic.tasks.length);
|
||||
addData('days', statistic.days);
|
||||
addData('moreRefactoring', statistic.types.refactor);
|
||||
|
@ -111,17 +111,7 @@ class AchievementsByCompetition {
|
|||
total[achievement].sort((a: any, b: any) => b[1] - a[1]);
|
||||
});
|
||||
|
||||
return { total, achievements };
|
||||
}
|
||||
|
||||
#getFirstAndLast(list: any[]) {
|
||||
const first = list.shift();
|
||||
const last = list.pop() || first;
|
||||
|
||||
return {
|
||||
first: first[0],
|
||||
last: last[0],
|
||||
};
|
||||
return total;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,15 +25,15 @@ export default {
|
|||
lessScopes: ACHIEVEMENT_TYPE.BAD, // Щегол
|
||||
moreDaysForTask: ACHIEVEMENT_TYPE.BAD, // Улитка на склоне
|
||||
more2DaysForTask: ACHIEVEMENT_TYPE.BAD, // Cо слоу
|
||||
moreDaysInProject: ACHIEVEMENT_TYPE.GOOD, // Старожил
|
||||
moreDaysInProject: ACHIEVEMENT_TYPE.GOOD, // Часть команды, часть коробля
|
||||
lessDaysInProject: ACHIEVEMENT_TYPE.NORMAL, // А это кто?
|
||||
more90DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Добро пожаловать
|
||||
lessDaysForTask: ACHIEVEMENT_TYPE.GOOD, // Скорострел
|
||||
adam: ACHIEVEMENT_TYPE.NORMAL, // Адам
|
||||
more666DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Чёрт
|
||||
more777DaysInProject: ACHIEVEMENT_TYPE.GOOD, // Азино 3 топора
|
||||
|
||||
moreRefactoring: ACHIEVEMENT_TYPE.GOOD, // Выпускающий редактор
|
||||
|
||||
// нет картинки
|
||||
longestMessage: ACHIEVEMENT_TYPE.NORMAL, // А разговоров то было...
|
||||
moreTasksInDay: ACHIEVEMENT_TYPE.GOOD, // Спиди-гонщик
|
||||
|
@ -41,14 +41,46 @@ export default {
|
|||
noCommitOnDay: ACHIEVEMENT_TYPE.NORMAL, // Технический перерыв
|
||||
hasCommitEveryTime: ACHIEVEMENT_TYPE.BAD, // Умер на работе
|
||||
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, // Полиция моды
|
||||
lessWorkDays: 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 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[] = []) {
|
||||
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 (
|
||||
<>
|
||||
<Title title="page.person.achievement.title"/>
|
||||
<div style={{ columnCount: 3, marginBottom: '24px' }}>
|
||||
{achievements}
|
||||
</div>
|
||||
<section>
|
||||
{recommendations}
|
||||
</section>
|
||||
|
|
|
@ -4,7 +4,7 @@ import { observer } from 'mobx-react-lite';
|
|||
import { getShortNumber } from 'ts/helpers/formatter';
|
||||
|
||||
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 IsStaff from 'ts/components/NothingFound/components/IsStaff';
|
||||
import PageWrapper from 'ts/components/Page/wrapper';
|
||||
|
|
|
@ -2,11 +2,11 @@ import React from 'react';
|
|||
import { observer } from 'mobx-react-lite';
|
||||
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 CardWithBanner from 'ts/components/CardWithBanner';
|
||||
import CardWithIcon from 'ts/components/CardWithIcon';
|
||||
import CardWithBanner from 'ts/components/CardWithIcon/Banner';
|
||||
import Achievements from 'ts/components/Achievement';
|
||||
import Description from 'ts/components/Description';
|
||||
import PageWrapper from 'ts/components/Page/wrapper';
|
||||
|
@ -39,8 +39,8 @@ const Total = observer(({ user }: IPersonCommonProps): React.ReactElement => {
|
|||
const statistic = user;
|
||||
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[user.author];
|
||||
const taskNumber = statistic.tasks.length;
|
||||
const achievements = getAchievementByAuthor(statistic.author);
|
||||
console.dir(achievements);
|
||||
const achievements = achievementByAuthor.authors[statistic.author];
|
||||
|
||||
return (
|
||||
<PageWrapper>
|
||||
<PageColumn>
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||
import { observer } from 'mobx-react-lite';
|
||||
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 Achievements from 'ts/components/Achievement';
|
||||
|
@ -36,7 +36,7 @@ const Total = observer(({
|
|||
const { t } = useTranslation();
|
||||
const statistic = user;
|
||||
const commitsWithGet = dataGripStore.dataGrip.get.getsByAuthor[statistic.author];
|
||||
const achievements = getAchievementByAuthor(statistic.author);
|
||||
const achievements = achievementByAuthor.authors[statistic.author];
|
||||
|
||||
return (
|
||||
<PageWrapper>
|
||||
|
|
|
@ -11,8 +11,6 @@ import Races from 'ts/components/Races';
|
|||
|
||||
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 DataView from 'ts/components/DataView';
|
||||
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 authors = dataGripStore.dataGrip.author.statistic.map((statistic: any) => {
|
||||
const achievements = getAchievementByAuthor(statistic.author);
|
||||
console.dir(achievements);
|
||||
const from = getDate(statistic.firstCommit.date);
|
||||
const to = getDate(statistic.lastCommit.date);
|
||||
const achievementsList = [
|
||||
|
|
|
@ -85,7 +85,7 @@ class DataGripStore implements IDataGripStore {
|
|||
|
||||
dataGrip.updateByInitialization();
|
||||
dataGrip.updateByFiles(fileList, removed.fileList);
|
||||
achievements.updateByDataGrip(dataGrip.author.statistic);
|
||||
achievements.updateByDataGrip(dataGrip);
|
||||
}
|
||||
|
||||
this.dataGrip = null;
|
||||
|
@ -101,7 +101,7 @@ class DataGripStore implements IDataGripStore {
|
|||
console.log('need update data TODO');
|
||||
dataGrip.updateByFilters();
|
||||
if (!dataGrip.author.list.length) return;
|
||||
achievements.updateByDataGrip(dataGrip.author.statistic);
|
||||
achievements.updateByDataGrip(dataGrip);
|
||||
this.dataGrip = null;
|
||||
this.dataGrip = dataGrip;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
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,
|
||||
icon: './assets/logo.svg',
|
||||
isOpenInNewTab: false,
|
||||
};
|
||||
|
||||
const EXTERNAL_LOGO = {
|
||||
const EXTERNAL_LOGO: IHashMap<IBanner> = {
|
||||
vk_frontend_du2: {
|
||||
icon: './social/vk/frontend_du2.png',
|
||||
banner: './social/vk/frontend_du2.jpg',
|
||||
|
@ -20,8 +23,11 @@ const EXTERNAL_LOGO = {
|
|||
},
|
||||
vk_awesomejs: {
|
||||
icon: './social/vk/awesomejs.png',
|
||||
banner: './social/vk/awesomejs.jpg',
|
||||
// banner: './social/vk/awesomejs.jpg',
|
||||
link: 'https://vk.com/awesomejs',
|
||||
bannerText: 'Сбер Банк',
|
||||
color: '#000',
|
||||
backgroundColor: '#C2ECC1',
|
||||
},
|
||||
vk_frontend_dev: {
|
||||
icon: './social/vk/frontend_dev.png',
|
||||
|
@ -49,15 +55,18 @@ class ThemeSettings {
|
|||
this.urlParameters = urlParameters || {};
|
||||
}
|
||||
|
||||
getLogo() {
|
||||
let config = EXTERNAL_LOGO[this.urlParameters?.ref || ''];
|
||||
getLogo(): IBanner {
|
||||
const ref = this.urlParameters?.ref || '';
|
||||
let config = EXTERNAL_LOGO[ref];
|
||||
if (!config) return LOGO;
|
||||
|
||||
config.ref = ref;
|
||||
config.isOpenInNewTab = true;
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
getBanner() {
|
||||
getBanner(): IBanner | null {
|
||||
let config = EXTERNAL_LOGO[this.urlParameters?.ref || ''];
|
||||
if (!config) return null;
|
||||
|
||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
|||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||
§ achievements.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ 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.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ achievements.lessWorkDays.title: Count me out
|
||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
|||
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
||||
§ achievements.commitsAfter1800.title: Делу время
|
||||
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
||||
§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
|
||||
§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
|
||||
§ achievements.moreFix.title: Bug hunter
|
||||
§ achievements.moreFix.description: больше всего закрытых багов
|
||||
§ achievements.lessWorkDays.title: Дальше без меня
|
||||
|
|
|
@ -73,8 +73,6 @@ export default `
|
|||
§ achievements.hasCommitEveryTime.description: a commit for every hour of each day (including weekends)
|
||||
§ achievements.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ 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.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ 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.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ achievements.lessWorkDays.title: Count me out
|
||||
|
|
|
@ -45,8 +45,10 @@ export default `
|
|||
§ achievements.moreDaysForTask.description: работа по задачам идёт медленнее чем у остальных
|
||||
§ achievements.more2DaysForTask.title: Cо слоу
|
||||
§ achievements.more2DaysForTask.description: больше двух дней на задачу
|
||||
§ achievements.moreDaysInProject.title: Старожил
|
||||
§ achievements.moreDaysInProject.title: Часть команды, часть коробля
|
||||
§ achievements.moreDaysInProject.description: больше всего дней на проекте
|
||||
§ achievements.more3YearsInProject.title: Старожил
|
||||
§ achievements.more3YearsInProject.description: больше трех лет на проекте
|
||||
§ achievements.lessDaysInProject.title: А это кто?
|
||||
§ achievements.lessDaysInProject.description: меньше всего дней на проекте
|
||||
§ achievements.more90DaysInProject.title: Добро пожаловать
|
||||
|
@ -55,6 +57,8 @@ export default `
|
|||
§ achievements.lessDaysForTask.description: одна задача занимает меньше дня
|
||||
§ achievements.adam.title: Адам
|
||||
§ achievements.adam.description: первый стабильный сотрудник на проекте
|
||||
§ achievements.more365DaysInProject.title: Годовасик
|
||||
§ achievements.more365DaysInProject.description: отработал год на проекте
|
||||
§ achievements.more666DaysInProject.title: Чёрт
|
||||
§ achievements.more666DaysInProject.description: отработал 666 дней на проекте
|
||||
§ achievements.more777DaysInProject.title: Азино 3 топора
|
||||
|
@ -73,8 +77,6 @@ export default `
|
|||
§ achievements.hasCommitEveryTime.description: есть коммит на час каждого дня (включая выходные)
|
||||
§ achievements.commitsAfter1800.title: Делу время
|
||||
§ achievements.commitsAfter1800.description: нет ни одного коммита после 18:00
|
||||
§ achievements.more1488DaysInProject.title: им. Максима Марцинкевича
|
||||
§ achievements.more1488DaysInProject.description: отработал 1488 дней на проекте
|
||||
§ achievements.moreFix.title: Bug hunter
|
||||
§ achievements.moreFix.description: больше всего закрытых багов
|
||||
§ achievements.lessWorkDays.title: Дальше без меня
|
||||
|
@ -89,4 +91,43 @@ export default `
|
|||
§ achievements.moreStyle.description: склонен больше остальных изменять CSS
|
||||
§ achievements.moreOnHoliday.title: Нет жизни
|
||||
§ 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.commitsAfter1800.title: Business Time
|
||||
§ 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.description: most closed bugs
|
||||
§ achievements.lessWorkDays.title: Count me out
|
||||
|
|
Loading…
Reference in a new issue