This commit is contained in:
Бахирев 2024-05-05 11:54:25 +03:00
parent dae224d169
commit c992c6a94f
23 changed files with 157 additions and 29 deletions

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
<!doctype html><html><head><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=no,maximum-scale=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="cleartype" content="on"><meta name="HandheldFriendly" content="True"><meta name="format-detection" content="telephone=no"><meta name="format-detection" content="address=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="theme-color" content="white"/><script type="text/javascript">var report=[]</script><script src='../log.txt'></script><script src='../log-1.txt'></script><script src='../log-2.txt'></script><script src='../log-3.txt'></script><script src='../log-4.txt'></script><script src='../log-5.txt'></script><script src='../log-6.txt'></script><script src='../../log.txt'></script><script src='../../log-1.txt'></script><script src='../../log-2.txt'></script><script src='../../log-3.txt'></script><script src='../../log-4.txt'></script><script src='../../log-5.txt'></script><script src='../../log-6.txt'></script><script src='./log.txt'></script><script src='./log-1.txt'></script><script src='./log-2.txt'></script><script src='./log-3.txt'></script><script src='./log-4.txt'></script><script src='./log-5.txt'></script><script src='./log-6.txt'></script><script src='/log.txt'></script><script src='/log-1.txt'></script><script src='/log-2.txt'></script><script src='/log-3.txt'></script><script src='/log-4.txt'></script><script src='/log-5.txt'></script><script src='/log-6.txt'></script><link rel="icon" href="./favicon.svg"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Git Statistics</title><meta name="description" content="Simple and fast report on git commit history."><meta name="keywords" content="git, statistics, audit, history, log, monitoring, employee control"><meta name="author" content="Bakhirev Aleksei"><meta name="copyright" content="(c) Bakhirev Aleksei"><meta http-equiv="Reply-to" content="alexey-bakhirev@yandex.ru"><meta name="application-name" content="Git statistics"><meta name="msapplication-tooltip" content="Simple and fast report on Git commit history."><meta property="og:title" content="Git Statistics"><meta property="og:description" content="Simple and fast report on Git commit history."><meta property="og:image" content="https://assayo.online/assets/seo/custom_icon_256.png"><meta property="og:site_name" content="Assayo"><meta property="og:url" content="https://assayo.online/"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Git Statistics"><meta name="twitter:description" content="Simple and fast report on Git commit history."><meta name="twitter:creator" content="Bakhirev Aleksei"><meta name="twitter:image:src" content="https://assayo.online/assets/seo/custom_icon_256.png"><meta name="twitter:domain" content="assayo.online"><meta name="twitter:site" content="assayo.online"><meta itemprop="name" content="Git Statistics"><meta itemprop="description" content="Simple and fast report on Git commit history."><meta itemprop="image" content="https://assayo.online/assets/seo/custom_icon_256.png"><script defer="defer" src="./static/index.js"></script><link href="./static/index.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html> <!doctype html><html><head><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=no,maximum-scale=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="cleartype" content="on"><meta name="HandheldFriendly" content="True"><meta name="format-detection" content="telephone=no"><meta name="format-detection" content="address=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="theme-color" content="white"/><script type="text/javascript">var report=[]</script><script src='./log.txt'></script><script src='./log-1.txt'></script><script src='./log-2.txt'></script><script src='./log-3.txt'></script><script src='./log-4.txt'></script><script src='./log-5.txt'></script><script src='./log-6.txt'></script><script src='../log.txt'></script><script src='../log-1.txt'></script><script src='../log-2.txt'></script><script src='../log-3.txt'></script><script src='../log-4.txt'></script><script src='../log-5.txt'></script><script src='../log-6.txt'></script><script src='../../log.txt'></script><script src='../../log-1.txt'></script><script src='../../log-2.txt'></script><script src='../../log-3.txt'></script><script src='../../log-4.txt'></script><script src='../../log-5.txt'></script><script src='../../log-6.txt'></script><script src='/log.txt'></script><script src='/log-1.txt'></script><script src='/log-2.txt'></script><script src='/log-3.txt'></script><script src='/log-4.txt'></script><script src='/log-5.txt'></script><script src='/log-6.txt'></script><link rel="icon" href="./favicon.svg"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>Git Statistics</title><meta name="description" content="Simple and fast report on git commit history."><meta name="keywords" content="git, statistics, audit, history, log, monitoring, employee control"><meta name="author" content="Bakhirev Aleksei"><meta name="copyright" content="(c) Bakhirev Aleksei"><meta http-equiv="Reply-to" content="alexey-bakhirev@yandex.ru"><meta name="application-name" content="Git statistics"><meta name="msapplication-tooltip" content="Simple and fast report on Git commit history."><meta property="og:title" content="Git Statistics"><meta property="og:description" content="Simple and fast report on Git commit history."><meta property="og:image" content="https://assayo.online/assets/seo/custom_icon_256.png"><meta property="og:site_name" content="Assayo"><meta property="og:url" content="https://assayo.online/"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Git Statistics"><meta name="twitter:description" content="Simple and fast report on Git commit history."><meta name="twitter:creator" content="Bakhirev Aleksei"><meta name="twitter:image:src" content="https://assayo.online/assets/seo/custom_icon_256.png"><meta name="twitter:domain" content="assayo.online"><meta name="twitter:site" content="assayo.online"><meta itemprop="name" content="Git Statistics"><meta itemprop="description" content="Simple and fast report on Git commit history."><meta itemprop="image" content="https://assayo.online/assets/seo/custom_icon_256.png"><script defer="defer" src="./static/index.js"></script><link href="./static/index.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -22,12 +22,16 @@ function getMarkdownFromJson(json, languages, language) {
custom.getLanguageLinks(languages, language), custom.getLanguageLinks(languages, language),
firstTag ? `> ${firstTag.warning}\n` : '', firstTag ? `> ${firstTag.warning}\n` : '',
custom.getTitle(language), custom.getTitle(language),
custom.getSocialLinks(),
]; ];
(json || []).forEach((tag) => { (json || []).forEach((tag, index) => {
if (!tag) return; if (!tag) return;
if (index === 1) {
markdown.push(custom.getSocialLinks());
markdown.push(custom.getSreenshot());
}
if (tag.p) markdown.push(tag.p); if (tag.p) markdown.push(tag.p);
else if (tag.warning) markdown.push(`> ${tag.warning}\n`); else if (tag.warning) markdown.push(`> ${tag.warning}\n`);
else if (tag.tableOfContent) markdown.push('tableOfContent'); else if (tag.tableOfContent) markdown.push('tableOfContent');

View file

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { HashRouter } from 'react-router-dom';
import { render } from 'react-dom'; import { render } from 'react-dom';
import { HashRouter } from 'react-router-dom';
import localization from 'ts/helpers/Localization'; import localization from 'ts/helpers/Localization';
import de from 'ts/translations/de'; import de from 'ts/translations/de';
@ -16,6 +16,7 @@ import initializationI18n from './ts/helpers/i18n';
import Authorization from 'ts/pages/Authorization'; import Authorization from 'ts/pages/Authorization';
import userSettings from 'ts/store/UserSettings'; import userSettings from 'ts/store/UserSettings';
import themeSettings from 'ts/store/ThemeSettings';
import Notifications from 'ts/components/Notifications'; import Notifications from 'ts/components/Notifications';
import printStore from 'ts/pages/PageWrapper/store/Print'; import printStore from 'ts/pages/PageWrapper/store/Print';
import applyUrlCommands from 'ts/helpers/RPC'; import applyUrlCommands from 'ts/helpers/RPC';
@ -57,6 +58,7 @@ function renderReactApplication() {
applyUrlCommands((parameters: any) => { applyUrlCommands((parameters: any) => {
initializationI18n(parameters.lang || parameters.language); initializationI18n(parameters.lang || parameters.language);
themeSettings.setUrlParameters(parameters);
userSettings.loadUserSettings().then(() => { userSettings.loadUserSettings().then(() => {
renderReactApplication(); renderReactApplication();
}); });

View file

@ -59,10 +59,10 @@ export default class DataGripByExtension {
#getNewExtension(file: IDirtyFile) { #getNewExtension(file: IDirtyFile) {
return { return {
extension: file.extension, extension: file?.extension,
authors: {}, authors: {},
task: file.created.task, task: file?.firstCommit?.task,
path: file.name, path: file?.name,
current: { current: {
files: {}, files: {},
count: 0, count: 0,

View file

@ -27,9 +27,10 @@ export function getNewFileInfo(
firstName: nameParts.shift(), firstName: nameParts.shift(),
suffixes: nameParts, suffixes: nameParts,
lines: addedLines, lines: addedLines,
created: commit, firstCommit: commit,
lastCommit: commit,
authors: { authors: {
[commit?.author || '']: getNewFileAuthor(addedLines, commit), [commit?.author || '']: getNewFileAuthor(addedLines, commit),
}, },
}; };
} }

View file

@ -24,10 +24,12 @@ export function getNewFileName(fileName: string, allFiles: any) {
return newPath; return newPath;
} }
function getFolder(name?: string): IFileTree { function getFolder(name: string, file: IDirtyFile): IFileTree {
return { return {
id: Math.random(), id: Math.random(),
name: name || '', name: name || '',
firstCommit: file?.firstCommit,
lastCommit: file?.firstCommit,
content: {}, content: {},
}; };
} }
@ -37,7 +39,9 @@ function getFolderTree(fileTree: any, file: IDirtyFile) {
let fileName: string = file.path.pop() || ''; let fileName: string = file.path.pop() || '';
file.path.forEach((folder: any) => { file.path.forEach((folder: any) => {
if (!prev[folder] || !prev[folder].content) { if (!prev[folder] || !prev[folder].content) {
prev[folder] = getFolder(folder); prev[folder] = getFolder(folder, file);
} else {
prev[folder].lastCommit = file?.lastCommit;
} }
prev = prev[folder].content; prev = prev[folder].content;
}); });
@ -46,7 +50,7 @@ function getFolderTree(fileTree: any, file: IDirtyFile) {
export function getFileList(allFiles: IHashMap<IDirtyFile>) { export function getFileList(allFiles: IHashMap<IDirtyFile>) {
const fileList = Object.values(allFiles); const fileList = Object.values(allFiles); // @ts-ignore
const fileTree: IFileTree = getFolder(); const fileTree: IFileTree = getFolder();
fileList.forEach((file: IDirtyFile) => { fileList.forEach((file: IDirtyFile) => {

View file

@ -37,6 +37,7 @@ export default function Parser(report: string[]) {
if (allFiles[fileName]) { if (allFiles[fileName]) {
const fileInfo: IDirtyFile = allFiles[fileName]; const fileInfo: IDirtyFile = allFiles[fileName];
fileInfo.lastCommit = prev;
fileInfo.lines += diff; fileInfo.lines += diff;
if (!fileInfo.authors[prev?.author || '']) { if (!fileInfo.authors[prev?.author || '']) {
fileInfo.authors[prev?.author || ''] = { fileInfo.authors[prev?.author || ''] = {

View file

@ -10,10 +10,12 @@ function getParametersFromString(text: string): IHashMap<string> {
} }
function getParametersFromURL(): IHashMap<string> { function getParametersFromURL(): IHashMap<string> {
return { const parameters = {
...getParametersFromString(location.search), ...getParametersFromString(location.search),
...getParametersFromString(location.hash), ...getParametersFromString(location.hash),
}; };
delete parameters[''];
return parameters;
} }
function loadJsLocal(url: string, callback: Function) { function loadJsLocal(url: string, callback: Function) {

View file

@ -1,10 +1,11 @@
import ICommit from './Commit'; import ICommit, { ISystemCommit } from './Commit';
import IHashMap from './HashMap'; import IHashMap from './HashMap';
export interface IDirtyFile { export interface IDirtyFile {
name: string; // ".gitignore", name: string; // ".gitignore",
lines: number; // 38, line in file for this moment lines: number; // 38, line in file for this moment
created: ICommit, firstCommit: ICommit | ISystemCommit | null,
lastCommit: ICommit | ISystemCommit | null,
path: string[], path: string[],
extension: string, extension: string,
firstName: string, firstName: string,
@ -30,5 +31,7 @@ export interface IDirtyFile {
export interface IFileTree { export interface IFileTree {
id?: number; id?: number;
name?: string; name?: string;
firstCommit: ICommit | ISystemCommit | null,
lastCommit: ICommit | ISystemCommit | null,
content: IHashMap<IDirtyFile>, content: IHashMap<IDirtyFile>,
} }

View file

@ -1,14 +1,28 @@
import React from 'react'; import React from 'react';
import { Link } from 'react-router-dom';
import themeSettings from 'ts/store/ThemeSettings';
import style from '../../styles/logo.module.scss'; import style from '../../styles/logo.module.scss';
function Logo() { function Logo() {
const {
icon, link, title, isOpenInNewTab,
} = themeSettings.getLogo();
return ( return (
<figure className={style.logo}> <figure className={style.logo}>
<img <Link
src="./assets/logo.svg" to={link}
className={style.logo_icon} target={isOpenInNewTab ? '_blank' : ''}
/> className={style.logo_link}
>
<img
src={icon}
title={title}
className={style.logo_icon}
/>
</Link>
</figure> </figure>
); );
} }

View file

@ -10,9 +10,15 @@
box-sizing: border-box; box-sizing: border-box;
border: none; border: none;
&_link {
display: inline-block;
text-decoration: none;
}
&_icon { &_icon {
height: 20px; height: 20px;
margin: 0 auto; margin: 0 auto;
text-decoration: none;
} }
} }

View file

@ -17,6 +17,8 @@ import LineChart from 'ts/components/LineChart';
import getOptions from 'ts/components/LineChart/helpers/getOptions'; import getOptions from 'ts/components/LineChart/helpers/getOptions';
import NothingFound from 'ts/components/NothingFound'; import NothingFound from 'ts/components/NothingFound';
import { getDate } from 'ts/helpers/formatter';
import TreeFilters from './TreeFilters'; import TreeFilters from './TreeFilters';
import { getSubTreeByPath, getArrayFromTree } from '../helpers/tree'; import { getSubTreeByPath, getArrayFromTree } from '../helpers/tree';
import treeStore from '../store/Tree'; import treeStore from '../store/Tree';
@ -43,6 +45,7 @@ function TreeView({ response }: ITreeViewProps) {
'page.team.tree.lineRemove', 'page.team.tree.lineRemove',
], suffix: 'page.team.tree.line' }); ], suffix: 'page.team.tree.line' });
console.log(response.content);
return ( return (
<Table <Table
rows={response.content} rows={response.content}
@ -64,9 +67,37 @@ function TreeView({ response }: ITreeViewProps) {
treeStore.updateFilter('selectedPath', row.path || []); treeStore.updateFilter('selectedPath', row.path || []);
}} }}
/> />
<Column
isSortable
template={ColumnTypesEnum.STRING}
title="page.team.pr.firstCommitTime"
formatter={(item: any) => getDate(item?.file?.firstCommit?.timestamp)}
width={130}
/>
<Column
isSortable
template={ColumnTypesEnum.STRING}
title="page.team.pr.author"
formatter={(item: any) => item?.file?.firstCommit?.author || ''}
width={150}
/>
<Column
isSortable
template={ColumnTypesEnum.STRING}
title="page.team.pr.lastCommitTime"
formatter={(item: any) => getDate(item?.file?.lastCommit?.timestamp)}
width={130}
/>
<Column
isSortable
template={ColumnTypesEnum.STRING}
title="page.team.pr.author"
formatter={(item: any) => item?.file?.lastCommit?.author || ''}
width={150}
/>
<Column <Column
properties="file" properties="file"
minWidth={250} minWidth={200}
template={(file: any) => ( template={(file: any) => (
<LineChart <LineChart
value={file ? 100 : 0} value={file ? 100 : 0}

View file

@ -0,0 +1,29 @@
import { makeObservable, observable, action } from 'mobx';
class ThemeSettings {
urlParameters: any = {};
constructor() {
makeObservable(this, {
urlParameters: observable,
setUrlParameters: action,
});
}
setUrlParameters(urlParameters: any) {
this.urlParameters = urlParameters || {};
}
getLogo() {
return {
icon: './assets/logo.svg',
link: '',
title: '',
isOpenInNewTab: false,
};
}
}
const themeSettings = new ThemeSettings();
export default themeSettings;