Remove usless files
This commit is contained in:
parent
b29ffd0605
commit
ed2e4d4aa6
@ -1,8 +0,0 @@
|
||||
<div #tree></div>
|
||||
|
||||
<div *ngFor="let post of temp">
|
||||
{{ post.author }}
|
||||
{{ post.message }}
|
||||
</div>
|
||||
|
||||
<input type="file" (change)="parseFile($event)" />
|
@ -1,5 +0,0 @@
|
||||
::ng-deep .link {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-width: 2px;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { ViewDataComponent } from './view-data.component';
|
||||
|
||||
describe('ViewDataComponent', () => {
|
||||
let component: ViewDataComponent;
|
||||
let fixture: ComponentFixture<ViewDataComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ ViewDataComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(ViewDataComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
@ -1,173 +0,0 @@
|
||||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
ViewChild,
|
||||
ElementRef,
|
||||
AfterViewInit,
|
||||
} from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import * as Papa from 'papaparse';
|
||||
import * as d3 from 'd3';
|
||||
|
||||
/* TODO: move this to separated files */
|
||||
|
||||
interface ForumData {
|
||||
id: string;
|
||||
name: string;
|
||||
discussions: Array<Discussion>;
|
||||
}
|
||||
|
||||
interface Discussion {
|
||||
title: string;
|
||||
id: string;
|
||||
first_post: string;
|
||||
posts: Array<Post>;
|
||||
}
|
||||
|
||||
interface Post {
|
||||
author: string;
|
||||
id: string;
|
||||
message: string;
|
||||
parent: string;
|
||||
children?: Post[] | null;
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'app-view-data',
|
||||
templateUrl: './view-data.component.html',
|
||||
styleUrls: ['./view-data.component.scss'],
|
||||
})
|
||||
export class ViewDataComponent implements OnInit, AfterViewInit {
|
||||
@ViewChild('tree', { read: ElementRef })
|
||||
private treeContainer: ElementRef;
|
||||
|
||||
data: ForumData;
|
||||
temp: Array<Post>;
|
||||
names: Array<{ id: string; name: string }>;
|
||||
|
||||
constructor(private router: Router) {
|
||||
const fetch = JSON.parse(
|
||||
this.router.getCurrentNavigation()?.extras.state?.data
|
||||
);
|
||||
this.data = fetch as ForumData;
|
||||
this.temp = this.data.discussions[0].posts as Post[];
|
||||
}
|
||||
|
||||
parsedData = (file: any): Promise<{ id: string; name: string }[]> => {
|
||||
return new Promise((resolve, _) => {
|
||||
Papa.parse(file, {
|
||||
header: true,
|
||||
skipEmptyLines: true,
|
||||
complete: (result) => {
|
||||
resolve(result.data as { id: string; name: string }[]);
|
||||
},
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
async parseFile(e: any) {
|
||||
let tempNames: Array<{ id: string; name: string }>;
|
||||
|
||||
const file = e.target.files[0];
|
||||
tempNames = await this.parsedData(file);
|
||||
|
||||
this.temp = this.temp.map((item) => {
|
||||
const index = tempNames.findIndex((data) => data.id === item.author);
|
||||
item.author = index !== -1 ? tempNames[index].name : item.author;
|
||||
return item;
|
||||
});
|
||||
}
|
||||
|
||||
makeHierarchy(): void {
|
||||
const posts = this.data.discussions[0].posts;
|
||||
const tree: Array<Post> = [];
|
||||
const childOf = {} as any;
|
||||
posts.forEach((item) => {
|
||||
const { id, parent } = item;
|
||||
childOf[id] = childOf[id] || [];
|
||||
item.children = childOf[id];
|
||||
if (parent !== '0') {
|
||||
(childOf[parent] = childOf[parent] || []).push(item);
|
||||
} else {
|
||||
tree.push(item);
|
||||
}
|
||||
});
|
||||
|
||||
const margin = { top: 50, right: 90, bottom: 30, left: 90 };
|
||||
const width = 660 - margin.left - margin.right;
|
||||
const height = 500 - margin.top - margin.bottom;
|
||||
|
||||
const treemap = d3.tree<any>().size([width, height]);
|
||||
const nodes = d3.hierarchy<any>(tree[0]);
|
||||
treemap(nodes);
|
||||
|
||||
const element = this.treeContainer.nativeElement;
|
||||
|
||||
const tooltip = d3
|
||||
.select(element)
|
||||
.append('div')
|
||||
.attr('class', 'tooltip')
|
||||
.style('position', 'absolute')
|
||||
.style('opacity', 0);
|
||||
|
||||
const svg = d3
|
||||
.select(element)
|
||||
.append('svg')
|
||||
.attr('width', width + margin.left + margin.right)
|
||||
.attr('height', height + margin.top + margin.bottom);
|
||||
|
||||
const group = svg
|
||||
.append('g')
|
||||
.attr(`transform`, `translate(${margin.left},${margin.top})`);
|
||||
|
||||
const gLink = group.append('g').attr('class', 'links');
|
||||
const gNode = group.append('g').attr('class', 'nodes');
|
||||
const node = gNode.selectAll('g.nodes').data(nodes.descendants());
|
||||
const nodeEnter = node.enter().append('g').classed('node', true);
|
||||
|
||||
gLink
|
||||
.selectAll('g.links')
|
||||
.data(nodes.links())
|
||||
.enter()
|
||||
.append('line')
|
||||
.classed('link', true)
|
||||
.attr('x1', (d: any) => d.source.x)
|
||||
.attr('y1', (d: any) => d.source.y)
|
||||
.attr('x2', (d: any) => d.target.x)
|
||||
.attr('y2', (d: any) => d.target.y);
|
||||
|
||||
nodeEnter
|
||||
.append('circle')
|
||||
.attr('cx', (d: any) => d.x)
|
||||
.attr('cy', (d: any) => d.y)
|
||||
.attr('r', 25)
|
||||
.style('fill', '#fff')
|
||||
.style('stroke', '#ccc')
|
||||
.on('mouseover', (d) => {
|
||||
tooltip.transition().duration(400).style('opacity', 1);
|
||||
tooltip
|
||||
.html(`Wiadomość:<br> ${d.data.message}`)
|
||||
.style('width', '15rem')
|
||||
.style('background-color', '#fff')
|
||||
.style('border', '1px solid black')
|
||||
.style('left', `${d3.event.pageX + 40}px`)
|
||||
.style('top', `${d3.event.pageY - 10}px`);
|
||||
})
|
||||
.on('mouseout', function (d) {
|
||||
tooltip.transition().duration(400).style('opacity', 0);
|
||||
});
|
||||
|
||||
nodeEnter
|
||||
.append('text')
|
||||
.attr('x', (d: any) => d.x)
|
||||
.attr('y', (d: any) => d.y)
|
||||
.attr('text-anchor', 'middle')
|
||||
.text((d: any) => d.data.id);
|
||||
}
|
||||
|
||||
ngAfterViewInit(): void {
|
||||
this.makeHierarchy();
|
||||
}
|
||||
|
||||
ngOnInit(): void {}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { ViewDataComponent } from './view-data/view-data.component';
|
||||
|
||||
import { NbLayoutModule, NbCardModule, NbTreeGridModule } from '@nebular/theme';
|
||||
|
||||
@NgModule({
|
||||
declarations: [ViewDataComponent],
|
||||
imports: [CommonModule, NbLayoutModule, NbCardModule, NbTreeGridModule],
|
||||
exports: [ViewDataComponent],
|
||||
})
|
||||
export class ViewModule {}
|
Loading…
Reference in New Issue
Block a user