From c1a893779d0c21454ab2db87fd0795f92cdf5457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=B0=D1=85=D0=B8=D1=80=D0=B5=D0=B2?= Date: Thu, 16 May 2024 16:39:01 +0300 Subject: [PATCH] update --- documents/RU.md | 2 +- documents/src/md/RU.md | 2 +- .../assets/achievements/moreDaysInProject.svg | 1 - src/ts/components/CardWithBanner/index.tsx | 33 ---- .../components/CardWithIcon/index.module.scss | 8 +- src/ts/components/CardWithIcon/index.tsx | 1 + .../Recommendations/components/Banner.tsx | 24 --- src/ts/components/Recommendations/index.tsx | 16 +- .../Recommendations/styles/card.module.scss | 7 +- src/ts/helpers/achievement/byAuthor.ts | 18 +-- src/ts/helpers/achievement/byCompetition.ts | 146 ++++++++---------- src/ts/helpers/achievement/constants/list.ts | 48 +++++- src/ts/pages/Debug/index.tsx | 19 ++- src/ts/pages/Person/components/Speed.tsx | 2 +- src/ts/pages/Person/components/Total.tsx | 8 +- .../Person/components/print/Achievements.tsx | 4 +- src/ts/pages/Team/components/Top.tsx | 4 - src/ts/store/DataGrip.ts | 4 +- src/ts/store/ThemeSettings.ts | 21 ++- src/ts/translations/de/achievements.ts | 2 - src/ts/translations/en/achievements.ts | 2 - src/ts/translations/es/achievements.ts | 2 - src/ts/translations/fr/achievements.ts | 2 - src/ts/translations/ja/achievements.ts | 2 - src/ts/translations/pt/achievements.ts | 2 - src/ts/translations/ru/achievements.ts | 47 +++++- src/ts/translations/zh/achievements.ts | 2 - 27 files changed, 226 insertions(+), 203 deletions(-) delete mode 100644 public/assets/achievements/moreDaysInProject.svg delete mode 100644 src/ts/components/CardWithBanner/index.tsx delete mode 100644 src/ts/components/Recommendations/components/Banner.tsx diff --git a/documents/RU.md b/documents/RU.md index 0bed192..4cd0099 100644 --- a/documents/RU.md +++ b/documents/RU.md @@ -2,7 +2,7 @@ # [Assayo](https://assayo.online/?ref=github&lang=ru) -Визуализация и анализ данных вашего git-репозитория ([демо](https://assayo.online/demo/?ref=github&lang=ru&dump=./test.txt), [install](https://assayo.online/demo/?ref=github)). +Визуализация и анализ данных вашего git-репозитория ([демо](https://assayo.online/demo/?ref=github&lang=ru&dump=./test.txt), [установка](https://assayo.online/demo/?ref=github)). diff --git a/documents/src/md/RU.md b/documents/src/md/RU.md index f9c5874..0f1b08c 100644 --- a/documents/src/md/RU.md +++ b/documents/src/md/RU.md @@ -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)). ##### Сотрудник может оценить новое место работы - темп работы; diff --git a/public/assets/achievements/moreDaysInProject.svg b/public/assets/achievements/moreDaysInProject.svg deleted file mode 100644 index d328cc3..0000000 --- a/public/assets/achievements/moreDaysInProject.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/ts/components/CardWithBanner/index.tsx b/src/ts/components/CardWithBanner/index.tsx deleted file mode 100644 index ef387e0..0000000 --- a/src/ts/components/CardWithBanner/index.tsx +++ /dev/null @@ -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 ( - - ); -} - -export default CardWithBanner; diff --git a/src/ts/components/CardWithIcon/index.module.scss b/src/ts/components/CardWithIcon/index.module.scss index e319f95..9b2676b 100644 --- a/src/ts/components/CardWithIcon/index.module.scss +++ b/src/ts/components/CardWithIcon/index.module.scss @@ -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 { diff --git a/src/ts/components/CardWithIcon/index.tsx b/src/ts/components/CardWithIcon/index.tsx index 9b62ee8..877a73e 100644 --- a/src/ts/components/CardWithIcon/index.tsx +++ b/src/ts/components/CardWithIcon/index.tsx @@ -57,6 +57,7 @@ CardWithIcon.defaultProps = { suffix: '', color: undefined, icon: undefined, + long: false, }; export default CardWithIcon; diff --git a/src/ts/components/Recommendations/components/Banner.tsx b/src/ts/components/Recommendations/components/Banner.tsx deleted file mode 100644 index 3320c3e..0000000 --- a/src/ts/components/Recommendations/components/Banner.tsx +++ /dev/null @@ -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 ( - - ); -} - -export default Banner; diff --git a/src/ts/components/Recommendations/index.tsx b/src/ts/components/Recommendations/index.tsx index 8e54a24..5ff85f1 100644 --- a/src/ts/components/Recommendations/index.tsx +++ b/src/ts/components/Recommendations/index.tsx @@ -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 = (); + + 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' ? ( ); + cards = addBannerInRandomIndex(cards); } const title = localization.get('recommendations.title'); diff --git a/src/ts/components/Recommendations/styles/card.module.scss b/src/ts/components/Recommendations/styles/card.module.scss index 82c3407..36e8c39 100644 --- a/src/ts/components/Recommendations/styles/card.module.scss +++ b/src/ts/components/Recommendations/styles/card.module.scss @@ -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; } } diff --git a/src/ts/helpers/achievement/byAuthor.ts b/src/ts/helpers/achievement/byAuthor.ts index c14b6ea..f019944 100644 --- a/src/ts/helpers/achievement/byAuthor.ts +++ b/src/ts/helpers/achievement/byAuthor.ts @@ -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) => { diff --git a/src/ts/helpers/achievement/byCompetition.ts b/src/ts/helpers/achievement/byCompetition.ts index 4d77e8f..4eb738b 100644 --- a/src/ts/helpers/achievement/byCompetition.ts +++ b/src/ts/helpers/achievement/byCompetition.ts @@ -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 = {}; - 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'); + if (!minAchievementCode) return; + const last = authors[authors.length - 1][0]; + this.authors?.[last]?.push(minAchievementCode); + } +} - const midMessage = this.#getFirstAndLast(total.midMessage); - // Мастер красноречия - стабильно ,самые длинные подписи коммитов - achievements[midMessage.first].push('everyMessageLong'); - // Нет времени обьяснять - стабильно, самые короткие подписи коммитов - achievements[midMessage.last].push('everyMessageShort'); +class AchievementsByCompetition { + authors: IHashMap> = {}; - const maxMessage = this.#getFirstAndLast(total.maxMessage); - // Пиздеть, не мешки ворочить - самая длинная подпись коммита за все время - achievements[maxMessage.first].push('longestMessage'); + 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); + }); - const tasks = this.#getFirstAndLast(total.tasks); - // Батя - больше всего закрытых задач - achievements[tasks.first].push('moreTasks'); - // Зашел и вышел - меньше всего закрытых задач - achievements[tasks.last].push('lessTasks'); + // Длина имени + byAuthor.add(total.nameLength, 'longestName', 'shortestName'); - const days = this.#getFirstAndLast(total.days); - // Ценный работник - больше всего рабочих дней - achievements[days.first].push('moreWorkDays'); - // Дальше без меня - меньше всего рабочих дней - achievements[days.last].push('lessWorkDays'); + // Длина сообщения + byAuthor.add(total.messageLength, 'longestMessage'); - const lazyDays = this.#getFirstAndLast(total.lazyDays); - // Мысленно я с вами - больше всего дней без коммитов - achievements[lazyDays.first].push('moreLazyDays'); - // Папа Карло - меньше всего дней без коммитов - achievements[lazyDays.last].push('lessLazyDays'); + // Средняя длина сообщения + byAuthor.add(total.midMessageLength, 'everyMessageLong', 'everyMessageShort'); - const allDaysInProject = this.#getFirstAndLast(total.allDaysInProject); - // Старожил - больше всего дней на проекте - achievements[allDaysInProject.first].push('moreDaysInProject'); - // А это кто? - меньше всего дней на проекте - achievements[allDaysInProject.last].push('lessDaysInProject'); + // Количество закрытых задач + byAuthor.add(total.tasks, 'moreTasks', 'lessTasks'); - const firstCommit = this.#getFirstAndLast(total.firstCommit); - // Адам - первый стабильны сотрудник на проекте - achievements[firstCommit.last].push('adam'); + // Количество дней с коммитами + byAuthor.add(total.days, 'moreWorkDays', 'lessWorkDays'); - const moreRefactoring = this.#getFirstAndLast(total.moreRefactoring); - // Главный редактор - сделал больше всех меток «рефакторинг» - achievements[moreRefactoring.first].push('moreRefactoring'); + // Количество дней без коммитов + byAuthor.add(total.lazyDays, 'moreLazyDays', 'lessLazyDays'); - const tasksInDay = this.#getFirstAndLast(total.tasksInDay); - // Спиди-гонщик - рекорд по количеству закрытых задач в день - achievements[tasksInDay.first].push('moreTasksInDay'); + // Количество дней на проекте + byAuthor.add(total.allDaysInProject, 'moreDaysInProject', 'lessDaysInProject'); - const commitsInDay = this.#getFirstAndLast(total.commitsInDay); - // Zerg Rush - рекорд по количеству коммитов в день - achievements[commitsInDay.first].push('moreCommits'); + // Дата первого коммита + byAuthor.add(total.firstCommit, 'adam'); - 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) { - const achievements = {}; + #getMinMaxValue(statisticByAuthor: any, dataGrip: any, callback: Function) { const total: IHashMap = {}; 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; } } diff --git a/src/ts/helpers/achievement/constants/list.ts b/src/ts/helpers/achievement/constants/list.ts index b217775..2b8f22d 100644 --- a/src/ts/helpers/achievement/constants/list.ts +++ b/src/ts/helpers/achievement/constants/list.ts @@ -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 файлов, где правит только этот человек + + // Психологический знак задиака по дате первого коммита }; diff --git a/src/ts/pages/Debug/index.tsx b/src/ts/pages/Debug/index.tsx index e57e574..f38ddaf 100644 --- a/src/ts/pages/Debug/index.tsx +++ b/src/ts/pages/Debug/index.tsx @@ -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]) => ( + + )); + return ( <> + + <div style={{ columnCount: 3, marginBottom: '24px' }}> + {achievements} + </div> <section> {recommendations} </section> diff --git a/src/ts/pages/Person/components/Speed.tsx b/src/ts/pages/Person/components/Speed.tsx index fcabcb6..e88c178 100644 --- a/src/ts/pages/Person/components/Speed.tsx +++ b/src/ts/pages/Person/components/Speed.tsx @@ -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'; diff --git a/src/ts/pages/Person/components/Total.tsx b/src/ts/pages/Person/components/Total.tsx index 1dca88a..300e65a 100644 --- a/src/ts/pages/Person/components/Total.tsx +++ b/src/ts/pages/Person/components/Total.tsx @@ -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> diff --git a/src/ts/pages/Person/components/print/Achievements.tsx b/src/ts/pages/Person/components/print/Achievements.tsx index aaa11dc..29cf482 100644 --- a/src/ts/pages/Person/components/print/Achievements.tsx +++ b/src/ts/pages/Person/components/print/Achievements.tsx @@ -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> diff --git a/src/ts/pages/Team/components/Top.tsx b/src/ts/pages/Team/components/Top.tsx index 6134cda..9c687c0 100644 --- a/src/ts/pages/Team/components/Top.tsx +++ b/src/ts/pages/Team/components/Top.tsx @@ -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 = [ diff --git a/src/ts/store/DataGrip.ts b/src/ts/store/DataGrip.ts index af8407c..8d80be8 100644 --- a/src/ts/store/DataGrip.ts +++ b/src/ts/store/DataGrip.ts @@ -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; } diff --git a/src/ts/store/ThemeSettings.ts b/src/ts/store/ThemeSettings.ts index 05049e4..0507e97 100644 --- a/src/ts/store/ThemeSettings.ts +++ b/src/ts/store/ThemeSettings.ts @@ -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; diff --git a/src/ts/translations/de/achievements.ts b/src/ts/translations/de/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/de/achievements.ts +++ b/src/ts/translations/de/achievements.ts @@ -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 diff --git a/src/ts/translations/en/achievements.ts b/src/ts/translations/en/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/en/achievements.ts +++ b/src/ts/translations/en/achievements.ts @@ -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 diff --git a/src/ts/translations/es/achievements.ts b/src/ts/translations/es/achievements.ts index 12a566a..da1e802 100644 --- a/src/ts/translations/es/achievements.ts +++ b/src/ts/translations/es/achievements.ts @@ -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: Дальше без меня diff --git a/src/ts/translations/fr/achievements.ts b/src/ts/translations/fr/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/fr/achievements.ts +++ b/src/ts/translations/fr/achievements.ts @@ -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 diff --git a/src/ts/translations/ja/achievements.ts b/src/ts/translations/ja/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/ja/achievements.ts +++ b/src/ts/translations/ja/achievements.ts @@ -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 diff --git a/src/ts/translations/pt/achievements.ts b/src/ts/translations/pt/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/pt/achievements.ts +++ b/src/ts/translations/pt/achievements.ts @@ -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 diff --git a/src/ts/translations/ru/achievements.ts b/src/ts/translations/ru/achievements.ts index 12a566a..5e0a03c 100644 --- a/src/ts/translations/ru/achievements.ts +++ b/src/ts/translations/ru/achievements.ts @@ -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 `; diff --git a/src/ts/translations/zh/achievements.ts b/src/ts/translations/zh/achievements.ts index e1d21b4..1b2c1fc 100644 --- a/src/ts/translations/zh/achievements.ts +++ b/src/ts/translations/zh/achievements.ts @@ -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