Remove files
This commit is contained in:
		@@ -4,7 +4,10 @@
 | 
				
			|||||||
    <span>ETF Demo</span>
 | 
					    <span>ETF Demo</span>
 | 
				
			||||||
    <span class="mx-auto"><!-- Spacer --></span>
 | 
					    <span class="mx-auto"><!-- Spacer --></span>
 | 
				
			||||||
    <mat-chip-list class="mr-2">
 | 
					    <mat-chip-list class="mr-2">
 | 
				
			||||||
        <mat-chip *ngFor="let file of files" color="primary">{{file}}</mat-chip>
 | 
					        <mat-chip *ngFor="let file of fileNames" color="primary" [removable]="true" (removed)="remove($event.chip.value)" [value]="file">
 | 
				
			||||||
 | 
					            {{file}}
 | 
				
			||||||
 | 
					            <mat-icon matChipRemove>cancel</mat-icon>
 | 
				
			||||||
 | 
					        </mat-chip>
 | 
				
			||||||
    </mat-chip-list>
 | 
					    </mat-chip-list>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <button mat-button (click)="fileUploader.click()">
 | 
					    <button mat-button (click)="fileUploader.click()">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,24 +7,42 @@ import {Component} from '@angular/core';
 | 
				
			|||||||
export class AppComponent {
 | 
					export class AppComponent {
 | 
				
			||||||
    chartResults; // This is where the chart reads the data from
 | 
					    chartResults; // This is where the chart reads the data from
 | 
				
			||||||
    chartHeight = '100%'; // Dynamic height for chart
 | 
					    chartHeight = '100%'; // Dynamic height for chart
 | 
				
			||||||
    files: string[] = [];
 | 
					    fileNames: string[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ngx-charts requires a different data structure than the hash map we built so I will use a setter to handle converting it when we go to save the processed data.
 | 
					    // ngx-charts requires a different data structure than the hash map we built so I will use a setter to handle converting it when we go to save the processed data.
 | 
				
			||||||
    private _data;
 | 
					    private _data = {};
 | 
				
			||||||
    get data() { return this._data; }
 | 
					    get data() { return this._data; }
 | 
				
			||||||
    set data(data) {
 | 
					    set data(data) {
 | 
				
			||||||
        this._data = data;
 | 
					        this._data = data;
 | 
				
			||||||
        this.chartHeight = `${Object.keys(data).length * 100}px`;
 | 
					
 | 
				
			||||||
        this.chartResults = Object.keys(data).map(key => ({name: key, series: data[key].map((val, i) => ({name: i, value: val}))}));
 | 
					        // merge the files together
 | 
				
			||||||
 | 
					        let mergedData = Object.values(data).reduce((acc, file) => {
 | 
				
			||||||
 | 
					            Object.keys(file).forEach(key =>  {
 | 
				
			||||||
 | 
					                if(!acc[key]) acc[key] = [];
 | 
				
			||||||
 | 
					                file[key].forEach(val => acc[key].push(val));
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            return acc;
 | 
				
			||||||
 | 
					        }, {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Take the merged data set and get everything ready for it to be charted
 | 
				
			||||||
 | 
					        this.chartHeight = `${Object.keys(mergedData).length * 100}px`;
 | 
				
			||||||
 | 
					        this.chartResults = Object.keys(mergedData).map(key => ({name: key, series: mergedData[key].map((val, i) => ({name: i, value: val}))}));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() { }
 | 
					    constructor() { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    remove(fileName) {
 | 
				
			||||||
 | 
					        // Remove the file
 | 
				
			||||||
 | 
					        delete this.data[fileName];
 | 
				
			||||||
 | 
					        this.data = Object.assign({}, this.data);
 | 
				
			||||||
 | 
					        this.fileNames.splice(this.fileNames.indexOf(fileName), 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    upload(fileList: FileList) {
 | 
					    upload(fileList: FileList) {
 | 
				
			||||||
        // Because we enabled uploading multiple files at once we need to process each one individually
 | 
					        // Because we enabled uploading multiple fileNames at once we need to process each one individually
 | 
				
			||||||
        const files: File[] = Array.from(fileList);
 | 
					        const files: File[] = Array.from(fileList);
 | 
				
			||||||
        files.forEach(file => {
 | 
					        files.forEach(file => {
 | 
				
			||||||
            this.files.push(file.name);
 | 
					            this.fileNames.push(file.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Process CSV
 | 
					            // Process CSV
 | 
				
			||||||
            const reader = new FileReader();
 | 
					            const reader = new FileReader();
 | 
				
			||||||
@@ -33,7 +51,7 @@ export class AppComponent {
 | 
				
			|||||||
                const lines = ((<FileReader>e.target).result as string).split('\n');
 | 
					                const lines = ((<FileReader>e.target).result as string).split('\n');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Use regex to grab the holding name and its % market value
 | 
					                // Use regex to grab the holding name and its % market value
 | 
				
			||||||
                this.data = lines.map(text => {
 | 
					                this.data = Object.assign(this.data, {[file.name]: lines.map(text => {
 | 
				
			||||||
                    const parse = /^(.+),.+?(\d+\.\d+)%/gm.exec(text);
 | 
					                    const parse = /^(.+),.+?(\d+\.\d+)%/gm.exec(text);
 | 
				
			||||||
                    if(parse) return parse.slice(1);
 | 
					                    if(parse) return parse.slice(1);
 | 
				
			||||||
                }).reduce((acc, line) => {
 | 
					                }).reduce((acc, line) => {
 | 
				
			||||||
@@ -45,7 +63,7 @@ export class AppComponent {
 | 
				
			|||||||
                    acc[line[0]].push(Number(line[1]));
 | 
					                    acc[line[0]].push(Number(line[1]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    return acc;
 | 
					                    return acc;
 | 
				
			||||||
                }, this.data || {});
 | 
					                }, {})});
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            reader.readAsText(file);
 | 
					            reader.readAsText(file);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
 | 
					// This file is required by karma.conf.js and loads recursively all the .spec and framework fileNames
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'zone.js/dist/zone-testing';
 | 
					import 'zone.js/dist/zone-testing';
 | 
				
			||||||
import { getTestBed } from '@angular/core/testing';
 | 
					import { getTestBed } from '@angular/core/testing';
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user