sicherung ggggg
This commit is contained in:
15
src/App.tsx
15
src/App.tsx
@ -4,14 +4,21 @@ import FlightsTable from "./components/FlightsTable";
|
|||||||
import SeasonTable from "./components/SeasonTable";
|
import SeasonTable from "./components/SeasonTable";
|
||||||
import {groupByMap} from './global/tools';
|
import {groupByMap} from './global/tools';
|
||||||
import flights from './data/HoPe_all_flights.json';
|
import flights from './data/HoPe_all_flights.json';
|
||||||
import {IFlight} from './interfaces/IFlights';
|
import {CFlight} from './classes/CFlight';
|
||||||
import {CSeason} from './classes/CSeason';
|
import {CSeason} from './classes/CSeason';
|
||||||
|
|
||||||
const data = flights.data;
|
const data_raw = flights.data;
|
||||||
const seasondataraw = groupByMap(data, i => i.FKSeason);
|
const data: CFlight[] = [];
|
||||||
const seasondata: CSeason[] = [];
|
const seasondata: CSeason[] = [];
|
||||||
|
|
||||||
for (let [key, value] of seasondataraw)
|
for (let fl of data_raw)
|
||||||
|
{
|
||||||
|
data.push(new CFlight(fl));
|
||||||
|
}
|
||||||
|
|
||||||
|
const seasondata_raw = groupByMap(data, i => i.FKSeason);
|
||||||
|
|
||||||
|
for (let [key, value] of seasondata_raw)
|
||||||
{
|
{
|
||||||
seasondata.push(new CSeason(key, value));
|
seasondata.push(new CSeason(key, value));
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/classes/CFlight.ts
Normal file
33
src/classes/CFlight.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import {CHour} from '../classes/CHour';
|
||||||
|
import {IKey} from '../interfaces/IKey';
|
||||||
|
|
||||||
|
export class CFlight implements IKey
|
||||||
|
{
|
||||||
|
public readonly IDFlight: string;
|
||||||
|
public readonly FlightDate: string;
|
||||||
|
public readonly TakeoffWaypointName: string;
|
||||||
|
public readonly Glider: string;
|
||||||
|
public readonly BestTaskDistance: string;
|
||||||
|
public readonly BestTaskType: string;
|
||||||
|
public readonly BestTaskPoints: string;
|
||||||
|
public readonly FlightDuration: CHour;
|
||||||
|
public readonly FKSeason: string;
|
||||||
|
|
||||||
|
constructor(inData: any)
|
||||||
|
{
|
||||||
|
this.IDFlight = inData.IDFlight;
|
||||||
|
this.FlightDate = inData.FlightDate;
|
||||||
|
this.TakeoffWaypointName = inData.TakeoffWaypointName;
|
||||||
|
this.Glider = inData.Glider;
|
||||||
|
this.BestTaskDistance = inData.BestTaskDistance;
|
||||||
|
this.BestTaskType = inData.BestTaskType;
|
||||||
|
this.BestTaskPoints = inData.BestTaskPoints;
|
||||||
|
this.FKSeason = inData.FKSeason;
|
||||||
|
this.FlightDuration = new CHour(+inData.FlightDuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get key()
|
||||||
|
{
|
||||||
|
return +this.IDFlight;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,13 +1,13 @@
|
|||||||
import {IFlight} from '../interfaces/IFlights';
|
import {CFlight} from '../classes/CFlight';
|
||||||
import {CHour} from '../classes/CHour';
|
import {CHour} from '../classes/CHour';
|
||||||
|
|
||||||
export class CSeason
|
export class CSeason
|
||||||
{
|
{
|
||||||
id: string;
|
id: string;
|
||||||
flighttime: CHour;
|
flighttime: CHour;
|
||||||
flights: IFlight[];
|
flights: CFlight[];
|
||||||
|
|
||||||
constructor(id: string, flights: IFlight[])
|
constructor(id: string, flights: CFlight[])
|
||||||
{
|
{
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.flights = flights;
|
this.flights = flights;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import SortableTable from "./SortableTable";
|
import SortableTable from "./SortableTable";
|
||||||
import {THeader} from "./SortableTable";
|
import {THeader} from "./SortableTable";
|
||||||
import {IFlight} from '../interfaces/IFlights';
|
import {CFlight} from '../classes/CFlight';
|
||||||
|
|
||||||
function Link2Flight(key: string, row: any, data: string | null)
|
function Link2Flight(key: string, row: any, data: string | null)
|
||||||
{
|
{
|
||||||
@ -36,7 +36,7 @@ export default function FlightsTable(flightdata: any)
|
|||||||
|
|
||||||
return(
|
return(
|
||||||
<div className='App'>
|
<div className='App'>
|
||||||
<SortableTable<IFlight> headers={headers} dataTbl={flightdata} ></SortableTable>
|
<SortableTable<CFlight> headers={headers} dataTbl={flightdata} ></SortableTable>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { orderBy } from 'natural-orderby';
|
import { orderBy } from 'natural-orderby';
|
||||||
import { MouseEventHandler, useState } from "react";
|
import { MouseEventHandler, useState } from "react";
|
||||||
|
import { IKey } from "../interfaces/IKey";
|
||||||
|
|
||||||
export interface ITableTdCallback {(key: string, row: any, data: string | null): JSX.Element};
|
export interface ITableTdCallback {(key: string, row: any, data: string | null): JSX.Element};
|
||||||
export type THeader = { key: string; label: string; visible?: boolean; callback?: ITableTdCallback };
|
export type THeader = { key: string; label: string; visible?: boolean; callback?: ITableTdCallback };
|
||||||
@ -33,13 +34,13 @@ function SortButton({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function SortableTable<T>({ headers, dataTbl }:
|
export default function SortableTable<T extends IKey>({ headers, dataTbl }:
|
||||||
{ headers: THeader[], dataTbl: T[]})
|
{ headers: THeader[], dataTbl: any })
|
||||||
{
|
{
|
||||||
const [sortKey, setSortKey] = useState<string>(headers[0].key);
|
const [sortKey, setSortKey] = useState<string>(headers[0].key);
|
||||||
const [sortOrder, setSortOrder] = useState<TSortOrder>("ascn");
|
const [sortOrder, setSortOrder] = useState<TSortOrder>("ascn");
|
||||||
|
|
||||||
const sortedData: T[] = sortData(
|
var sortedData: any = sortData(
|
||||||
{
|
{
|
||||||
tableData: dataTbl,
|
tableData: dataTbl,
|
||||||
sortKey: sortKey,
|
sortKey: sortKey,
|
||||||
@ -57,7 +58,7 @@ export default function SortableTable<T>({ headers, dataTbl }:
|
|||||||
sortKey,
|
sortKey,
|
||||||
reverse,
|
reverse,
|
||||||
}: {
|
}: {
|
||||||
tableData: T[];
|
tableData: any;
|
||||||
sortKey: string;
|
sortKey: string;
|
||||||
reverse: boolean;
|
reverse: boolean;
|
||||||
})
|
})
|
||||||
@ -65,12 +66,13 @@ export default function SortableTable<T>({ headers, dataTbl }:
|
|||||||
if (!sortKey) return tableData;
|
if (!sortKey) return tableData;
|
||||||
|
|
||||||
const order = reverse ? 'asc': 'desc';
|
const order = reverse ? 'asc': 'desc';
|
||||||
//const reval: any = orderBy(tableData, [sortKey], [order]);
|
// var helpArr: any = tableData;
|
||||||
const reval: any[] = tableData;
|
// const reval: any = orderBy(helpArr, [sortKey], [order]);
|
||||||
|
const reval = tableData;
|
||||||
return reval;
|
return reval;
|
||||||
}
|
}
|
||||||
|
|
||||||
function TableTd({ item, key, row_item, data } : {item: THeader, key: number, row_item: T, data: string | null})
|
function TableTd({ item, key, row_item, data } : {item: THeader, key: number, row_item: any, data: string | null})
|
||||||
{
|
{
|
||||||
var val_complete: JSX.Element = <></>;
|
var val_complete: JSX.Element = <></>;
|
||||||
if(item.visible === undefined || item.visible === true)
|
if(item.visible === undefined || item.visible === true)
|
||||||
@ -88,15 +90,14 @@ export default function SortableTable<T>({ headers, dataTbl }:
|
|||||||
}
|
}
|
||||||
|
|
||||||
function TableTr(
|
function TableTr(
|
||||||
{headers, key, row_item}:
|
{headers, row_item}:
|
||||||
{
|
{
|
||||||
headers: THeader[],
|
headers: THeader[],
|
||||||
key: number,
|
row_item: any
|
||||||
row_item: T
|
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
return(
|
return(
|
||||||
<tr key={key}>
|
<tr key={row_item.key}>
|
||||||
{
|
{
|
||||||
headers.map((h_item, key) =>
|
headers.map((h_item, key) =>
|
||||||
{
|
{
|
||||||
@ -114,13 +115,41 @@ export default function SortableTable<T>({ headers, dataTbl }:
|
|||||||
return val_complete;
|
return val_complete;
|
||||||
}
|
}
|
||||||
|
|
||||||
function tableBody(headers: THeader[], tableDataSorted : T[])
|
function tableBody(headers: THeader[], tableDataSorted : any)
|
||||||
{
|
{
|
||||||
var body: JSX.Element[] = [];
|
var body: JSX.Element[] = [];
|
||||||
const helpArr = tableDataSorted.toArray();
|
|
||||||
|
// body.push(
|
||||||
|
// <tr key='1'>
|
||||||
|
// <td key='1_1'>1_</td>
|
||||||
|
// <td key='1_2'>1_</td>
|
||||||
|
// <td key='1_3'>1_</td>
|
||||||
|
// <td key='1_4'>1_</td>
|
||||||
|
// <td key='1_5'>1_</td>
|
||||||
|
// <td key='1_6'>1_</td>
|
||||||
|
// </tr>);
|
||||||
|
// body.push(
|
||||||
|
// <tr key='2'>
|
||||||
|
// <td key='2_1'>2_</td>
|
||||||
|
// <td key='2_2'>2_</td>
|
||||||
|
// <td key='2_3'>2_</td>
|
||||||
|
// <td key='2_4'>2_</td>
|
||||||
|
// <td key='2_5'>2_</td>
|
||||||
|
// <td key='2_6'>2_</td>
|
||||||
|
// </tr>);
|
||||||
|
// body.push(
|
||||||
|
// <tr key='3'>
|
||||||
|
// <td key='3_1'>3_</td>
|
||||||
|
// <td key='3_2'>3_</td>
|
||||||
|
// <td key='3_3'>3_</td>
|
||||||
|
// <td key='3_4'>3_</td>
|
||||||
|
// <td key='3_5'>3_</td>
|
||||||
|
// <td key='3_6'>3_</td>
|
||||||
|
// </tr>);
|
||||||
|
|
||||||
for(var flight of tableDataSorted)
|
for(var flight of tableDataSorted)
|
||||||
{
|
{
|
||||||
var index: number = tableDataSorted.indexOf(flight);
|
var index: number = flight.key;
|
||||||
body.push(
|
body.push(
|
||||||
<TableTr headers={headers} key={index} row_item = {flight} />
|
<TableTr headers={headers} key={index} row_item = {flight} />
|
||||||
);
|
);
|
||||||
@ -138,8 +167,9 @@ export default function SortableTable<T>({ headers, dataTbl }:
|
|||||||
{
|
{
|
||||||
return(
|
return(
|
||||||
headers.map(
|
headers.map(
|
||||||
(row) =>
|
(row, key) =>
|
||||||
{
|
{
|
||||||
|
var a = key;
|
||||||
if(row.visible === undefined || row.visible === true)
|
if(row.visible === undefined || row.visible === true)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -1,107 +0,0 @@
|
|||||||
export interface IFlights {
|
|
||||||
success: boolean;
|
|
||||||
message: string;
|
|
||||||
meta: Meta;
|
|
||||||
data?: (IFlight)[] | null;
|
|
||||||
}
|
|
||||||
export interface Meta {
|
|
||||||
totalCount: number;
|
|
||||||
}
|
|
||||||
export interface IFlight {
|
|
||||||
IDFlight: string;
|
|
||||||
FKGliderCategory: string;
|
|
||||||
Category: string;
|
|
||||||
FKCompetitionClass: string;
|
|
||||||
FKCompetitionClassDesired?: null;
|
|
||||||
CompetitionClass: string;
|
|
||||||
FKLaunchtype: string;
|
|
||||||
Launchtype: string;
|
|
||||||
FKPilot: string;
|
|
||||||
FirstName: string;
|
|
||||||
LastName: string;
|
|
||||||
Nationality: string;
|
|
||||||
FKFederation?: string | null;
|
|
||||||
ClubID?: string | null;
|
|
||||||
ClubName?: string | null;
|
|
||||||
Glider: string;
|
|
||||||
FKGlider?: string | null;
|
|
||||||
FKGliderBrand?: string | null;
|
|
||||||
GliderBrand?: string | null;
|
|
||||||
FKGliderClassification: string;
|
|
||||||
GliderClassification: string;
|
|
||||||
FKSeason: string;
|
|
||||||
FlightDate: string;
|
|
||||||
UtcOffset: string;
|
|
||||||
FlightStartTime: string;
|
|
||||||
FlightEndTime: string;
|
|
||||||
FlightDuration: string;
|
|
||||||
FirstLat: string;
|
|
||||||
FirstLng: string;
|
|
||||||
LastLat: string;
|
|
||||||
LastLng: string;
|
|
||||||
FlightMinLat: string;
|
|
||||||
FlightMaxLat: string;
|
|
||||||
FlightMinLng: string;
|
|
||||||
FlightMaxLng: string;
|
|
||||||
TakeoffCountry: string;
|
|
||||||
FKTakeoffWaypoint: string;
|
|
||||||
TakeoffWaypointOffset: string;
|
|
||||||
TakeoffLocation?: string | null;
|
|
||||||
TakeoffWaypointName: string;
|
|
||||||
FKClosestWaypoint?: string | null;
|
|
||||||
ClosestWaypointOffset?: string | null;
|
|
||||||
LandingCountry: string;
|
|
||||||
FKLandingWaypoint?: string | null;
|
|
||||||
LandingWaypointOffset?: string | null;
|
|
||||||
LandingWaypointName?: string | null;
|
|
||||||
LandingLocation?: string | null;
|
|
||||||
LinearDistance: string;
|
|
||||||
MaxLinearDistance: string;
|
|
||||||
ArcDistance?: string | null;
|
|
||||||
FKBestTaskType: string;
|
|
||||||
BestTaskType: string;
|
|
||||||
BestTaskTypeKey: string;
|
|
||||||
BestTaskDistance: string;
|
|
||||||
BestTaskPoints: string;
|
|
||||||
BestTaskDuration: string;
|
|
||||||
MaxSpeed?: string | null;
|
|
||||||
GroundSpeed?: string | null;
|
|
||||||
BestTaskSpeed: string;
|
|
||||||
TakeoffAltitude: string;
|
|
||||||
MaxAltitude: string;
|
|
||||||
MinAltitude: string;
|
|
||||||
ElevationGain?: string | null;
|
|
||||||
MeanAltitudeDiff: string;
|
|
||||||
MaxClimb: string;
|
|
||||||
MinClimb: string;
|
|
||||||
Dataversion: string;
|
|
||||||
ValidBRecordsCount?: string | null;
|
|
||||||
AirspaceViolationLevel?: string | null;
|
|
||||||
UserReviewComment: string;
|
|
||||||
UserReviewStatus: string;
|
|
||||||
ReviewRequired: string;
|
|
||||||
ReviewReason: string;
|
|
||||||
ReviewStatus: string;
|
|
||||||
ReviewComment: string;
|
|
||||||
ReviewBy: string;
|
|
||||||
ReviewTime?: null;
|
|
||||||
CommentsEnabled: string;
|
|
||||||
CountComments: string;
|
|
||||||
HasPhotos: string;
|
|
||||||
IsBigSmileCandidate: string;
|
|
||||||
WxcCivlID?: string | null;
|
|
||||||
WxcNacStatus?: string | null;
|
|
||||||
WxcSync?: string | null;
|
|
||||||
WxcSyncTS?: string | null;
|
|
||||||
IgcFilename: string;
|
|
||||||
IgcFileHash: string;
|
|
||||||
GRecordStatus: string;
|
|
||||||
GValidationMessage: string;
|
|
||||||
IsNew: string;
|
|
||||||
CanRetract: string;
|
|
||||||
StatisticsValid: string;
|
|
||||||
UC?: string | null;
|
|
||||||
TC: string;
|
|
||||||
US: string;
|
|
||||||
TS: string;
|
|
||||||
}
|
|
||||||
4
src/interfaces/IKey.ts
Normal file
4
src/interfaces/IKey.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export interface IKey
|
||||||
|
{
|
||||||
|
key: number;
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2015",
|
"target": "ES5",
|
||||||
"lib": [
|
"lib": [
|
||||||
"dom",
|
"dom",
|
||||||
"dom.iterable",
|
"dom.iterable",
|
||||||
@ -18,7 +18,8 @@
|
|||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"jsx": "react-jsx"
|
"jsx": "react-jsx",
|
||||||
|
"downlevelIteration": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src",
|
"src",
|
||||||
|
|||||||
Reference in New Issue
Block a user