Files
gpx.studio/website/src/lib/components/file-list/file-list.ts

301 lines
6.7 KiB
TypeScript
Raw Normal View History

2024-05-24 13:16:41 +02:00
export enum ListLevel {
ROOT,
FILE,
TRACK,
SEGMENT,
WAYPOINTS,
WAYPOINT,
2024-05-24 13:16:41 +02:00
}
2024-05-22 16:05:31 +02:00
export abstract class ListItem {
2025-10-05 19:34:05 +02:00
[x: string]: any;
2024-05-22 16:05:31 +02:00
level: ListLevel;
constructor(level: ListLevel) {
this.level = level;
}
abstract getId(): string | number;
2024-06-11 19:08:46 +02:00
abstract getFullId(): string;
2024-05-22 16:05:31 +02:00
abstract getIdAtLevel(level: ListLevel): string | number | undefined;
abstract getFileId(): string;
2024-06-20 15:18:21 +02:00
abstract getParent(): ListItem;
2024-05-22 16:05:31 +02:00
abstract extend(id: string | number): ListItem;
}
export class ListRootItem extends ListItem {
constructor() {
2024-05-24 13:16:41 +02:00
super(ListLevel.ROOT);
2024-05-22 16:05:31 +02:00
}
getId(): string {
return 'root';
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return 'root';
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
return undefined;
}
getFileId(): string {
return '';
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return this;
}
2024-05-22 16:05:31 +02:00
extend(id: string): ListFileItem {
return new ListFileItem(id);
}
}
export class ListFileItem extends ListItem {
fileId: string;
constructor(fileId: string) {
2024-05-24 13:16:41 +02:00
super(ListLevel.FILE);
2024-05-22 16:05:31 +02:00
this.fileId = fileId;
}
getId(): string {
return this.fileId;
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return this.fileId;
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
switch (level) {
2024-05-24 13:16:41 +02:00
case ListLevel.ROOT:
2024-05-22 16:05:31 +02:00
return this.fileId;
default:
return undefined;
}
}
getFileId(): string {
return this.fileId;
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return new ListRootItem();
}
2024-05-22 16:05:31 +02:00
extend(id: number | 'waypoints'): ListTrackItem | ListWaypointsItem {
if (id === 'waypoints') {
return new ListWaypointsItem(this.fileId);
} else {
return new ListTrackItem(this.fileId, id);
}
}
}
export class ListTrackItem extends ListItem {
fileId: string;
trackIndex: number;
constructor(fileId: string, trackIndex: number) {
2024-05-24 13:16:41 +02:00
super(ListLevel.TRACK);
2024-05-22 16:05:31 +02:00
this.fileId = fileId;
this.trackIndex = trackIndex;
}
getId(): number {
return this.trackIndex;
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return `${this.fileId}-track-${this.trackIndex}`;
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
switch (level) {
2024-05-24 13:16:41 +02:00
case ListLevel.ROOT:
2024-05-22 16:05:31 +02:00
return this.fileId;
2024-05-24 13:16:41 +02:00
case ListLevel.FILE:
2024-05-22 16:05:31 +02:00
return this.trackIndex;
default:
return undefined;
}
}
getFileId(): string {
return this.fileId;
}
2024-05-23 14:44:07 +02:00
getTrackIndex(): number {
return this.trackIndex;
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return new ListFileItem(this.fileId);
}
2024-05-23 14:44:07 +02:00
extend(id: number): ListTrackSegmentItem {
return new ListTrackSegmentItem(this.fileId, this.trackIndex, id);
2024-05-22 16:05:31 +02:00
}
}
2024-05-23 14:44:07 +02:00
export class ListTrackSegmentItem extends ListItem {
2024-05-22 16:05:31 +02:00
fileId: string;
trackIndex: number;
segmentIndex: number;
constructor(fileId: string, trackIndex: number, segmentIndex: number) {
2024-05-24 13:16:41 +02:00
super(ListLevel.SEGMENT);
2024-05-22 16:05:31 +02:00
this.fileId = fileId;
this.trackIndex = trackIndex;
this.segmentIndex = segmentIndex;
}
getId(): number {
return this.segmentIndex;
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return `${this.fileId}-track-${this.trackIndex}--${this.segmentIndex}`;
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
switch (level) {
2024-05-24 13:16:41 +02:00
case ListLevel.ROOT:
2024-05-22 16:05:31 +02:00
return this.fileId;
2024-05-24 13:16:41 +02:00
case ListLevel.FILE:
2024-05-22 16:05:31 +02:00
return this.trackIndex;
2024-05-24 13:16:41 +02:00
case ListLevel.TRACK:
2024-05-22 16:05:31 +02:00
return this.segmentIndex;
default:
return undefined;
}
}
getFileId(): string {
return this.fileId;
}
2024-05-23 14:44:07 +02:00
getTrackIndex(): number {
return this.trackIndex;
}
getSegmentIndex(): number {
return this.segmentIndex;
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return new ListTrackItem(this.fileId, this.trackIndex);
}
2024-05-23 14:44:07 +02:00
extend(): ListTrackSegmentItem {
2024-05-22 16:05:31 +02:00
return this;
}
}
export class ListWaypointsItem extends ListItem {
fileId: string;
constructor(fileId: string) {
2024-05-24 13:16:41 +02:00
super(ListLevel.WAYPOINTS);
2024-05-22 16:05:31 +02:00
this.fileId = fileId;
}
getId(): string {
return 'waypoints';
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return `${this.fileId}-waypoints`;
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
switch (level) {
2024-05-24 13:16:41 +02:00
case ListLevel.ROOT:
2024-05-22 16:05:31 +02:00
return this.fileId;
2024-05-24 13:16:41 +02:00
case ListLevel.FILE:
2024-05-22 16:05:31 +02:00
return 'waypoints';
default:
return undefined;
}
}
getFileId(): string {
return this.fileId;
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return new ListFileItem(this.fileId);
}
2024-05-22 16:05:31 +02:00
extend(id: number): ListWaypointItem {
return new ListWaypointItem(this.fileId, id);
}
}
export class ListWaypointItem extends ListItem {
fileId: string;
waypointIndex: number;
constructor(fileId: string, waypointIndex: number) {
2024-05-24 13:16:41 +02:00
super(ListLevel.WAYPOINT);
2024-05-22 16:05:31 +02:00
this.fileId = fileId;
this.waypointIndex = waypointIndex;
}
getId(): number {
return this.waypointIndex;
}
2024-06-11 19:08:46 +02:00
getFullId(): string {
return `${this.fileId}-waypoint-${this.waypointIndex}`;
}
2024-05-22 16:05:31 +02:00
getIdAtLevel(level: ListLevel): string | number | undefined {
switch (level) {
2024-05-24 13:16:41 +02:00
case ListLevel.ROOT:
2024-05-22 16:05:31 +02:00
return this.fileId;
2024-05-24 13:16:41 +02:00
case ListLevel.FILE:
2024-05-22 16:05:31 +02:00
return 'waypoints';
2024-05-24 13:16:41 +02:00
case ListLevel.WAYPOINTS:
2024-05-22 16:05:31 +02:00
return this.waypointIndex;
default:
return undefined;
}
}
getFileId(): string {
return this.fileId;
}
2024-05-23 14:44:07 +02:00
getWaypointIndex(): number {
return this.waypointIndex;
}
2024-06-20 15:18:21 +02:00
getParent(): ListItem {
return new ListWaypointsItem(this.fileId);
}
2024-05-22 16:05:31 +02:00
extend(): ListWaypointItem {
return this;
}
}
2024-06-04 16:11:47 +02:00
export function sortItems(items: ListItem[], reverse: boolean = false) {
items.sort((a, b) => {
if (a instanceof ListTrackItem && b instanceof ListTrackItem) {
return a.getTrackIndex() - b.getTrackIndex();
} else if (a instanceof ListTrackSegmentItem && b instanceof ListTrackSegmentItem) {
return a.getSegmentIndex() - b.getSegmentIndex();
} else if (a instanceof ListWaypointItem && b instanceof ListWaypointItem) {
return a.getWaypointIndex() - b.getWaypointIndex();
}
return a.level - b.level;
});
if (reverse) {
items.reverse();
}
}