- Updated the backend documentation in CONTRIBUTING.md and README.md to reflect changes in application structure and API endpoints. - Enhanced the frontend components in MapView.vue for better handling of context menu actions. - Added new types and interfaces in TypeScript for improved type safety in the frontend. - Introduced new utility classes for managing characters and markers in the map. - Updated .gitignore to include .vscode directory for better development environment management.
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
/**
|
|
* Elements should have unique field "id"
|
|
*/
|
|
export interface Identifiable {
|
|
id: number | string
|
|
}
|
|
|
|
export class UniqueList<T extends Identifiable> {
|
|
elements: Record<string, T> = {}
|
|
|
|
update(
|
|
dataList: T[],
|
|
addCallback?: (it: T) => void,
|
|
removeCallback?: (it: T) => void,
|
|
updateCallback?: (oldElement: T, newElement: T) => void
|
|
): void {
|
|
const elementsToAdd = dataList.filter((it) => this.elements[String(it.id)] === undefined)
|
|
const elementsToRemove: T[] = []
|
|
for (const id of Object.keys(this.elements)) {
|
|
if (dataList.find((up) => String(up.id) === id) === undefined) {
|
|
const el = this.elements[id]
|
|
if (el) elementsToRemove.push(el)
|
|
}
|
|
}
|
|
if (removeCallback) {
|
|
elementsToRemove.forEach((it) => removeCallback(it))
|
|
}
|
|
if (updateCallback) {
|
|
dataList.forEach((newElement) => {
|
|
const oldElement = this.elements[String(newElement.id)]
|
|
if (oldElement) {
|
|
updateCallback(oldElement, newElement)
|
|
}
|
|
})
|
|
}
|
|
if (addCallback) {
|
|
elementsToAdd.forEach((it) => addCallback(it))
|
|
}
|
|
elementsToRemove.forEach((it) => delete this.elements[String(it.id)])
|
|
elementsToAdd.forEach((it) => (this.elements[String(it.id)] = it))
|
|
}
|
|
|
|
getElements(): T[] {
|
|
return Object.values(this.elements)
|
|
}
|
|
|
|
byId(id: number | string): T | undefined {
|
|
return this.elements[String(id)]
|
|
}
|
|
}
|