156 lines
4.2 KiB
TypeScript
156 lines
4.2 KiB
TypeScript
import { ViewCreateMotion } from './view-create-motion';
|
|
import { CreateMotion } from './create-motion';
|
|
|
|
/**
|
|
* Interface for correlating between strings representing BaseModels and existing
|
|
* BaseModels.
|
|
*/
|
|
export interface CsvMapping {
|
|
name: string;
|
|
id?: number;
|
|
multiId?: number[];
|
|
}
|
|
|
|
/**
|
|
* Create motion class for the View. Its different to ViewMotion in fact that the submitter handling is different
|
|
* on motion creation.
|
|
*
|
|
* @ignore
|
|
*/
|
|
export class ViewCsvCreateMotion extends ViewCreateMotion {
|
|
protected _motion: CreateMotion;
|
|
|
|
/**
|
|
* Mapping for a new/existing category.
|
|
*/
|
|
public csvCategory: CsvMapping;
|
|
|
|
/**
|
|
* Mapping for a new/existing motion block.
|
|
*/
|
|
public csvMotionblock: CsvMapping;
|
|
|
|
/**
|
|
* Mapping for new/existing submitters.
|
|
*/
|
|
public csvSubmitters: CsvMapping[];
|
|
|
|
/**
|
|
* Mapping for new/existing tags.
|
|
*/
|
|
public csvTags: CsvMapping[];
|
|
|
|
public constructor(motion?: CreateMotion) {
|
|
super(motion);
|
|
}
|
|
|
|
/**
|
|
* takes a list of motion block mappings to update the current csvMotionblock.
|
|
* Returns the amount of entries that remain unmatched
|
|
*
|
|
* @param motionBlocks
|
|
*/
|
|
public solveMotionBlocks(motionBlocks: CsvMapping[]): number {
|
|
if (!this.csvMotionblock) {
|
|
return 0;
|
|
} else if (this.csvMotionblock.id) {
|
|
this.motion.motion_block_id = this.csvMotionblock.id;
|
|
return 0;
|
|
} else {
|
|
const newBlock = motionBlocks.find(newMotionBlock => newMotionBlock.name === this.csvMotionblock.name);
|
|
if (newBlock) {
|
|
this.csvMotionblock = newBlock;
|
|
this.motion.motion_block_id = newBlock.id;
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* takes a list of category maps to update the current csv_category.
|
|
* Returns the amount of entries that remain unmatched
|
|
*
|
|
* @param categories
|
|
*/
|
|
public solveCategory(categories: CsvMapping[]): number {
|
|
if (!this.csvCategory) {
|
|
return 0;
|
|
} else if (this.csvCategory.id) {
|
|
this.motion.category_id = this.csvCategory.id;
|
|
return 0;
|
|
} else {
|
|
const newCat = categories.find(newCategory => newCategory.name === this.csvCategory.name);
|
|
if (newCat) {
|
|
this.csvCategory = newCat;
|
|
this.motion.category_id = newCat.id;
|
|
return 0;
|
|
} else {
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* takes a list of solved submitter maps to update. Returns the amount of
|
|
* entries that remain unmatched
|
|
*
|
|
* @param submitters
|
|
*/
|
|
public solveSubmitters(submitters: CsvMapping[]): number {
|
|
let open = 0;
|
|
const ids: number[] = [];
|
|
this.csvSubmitters.forEach(csvSubmitter => {
|
|
if (csvSubmitter.id) {
|
|
ids.push(csvSubmitter.id);
|
|
return;
|
|
}
|
|
if (!submitters.length) {
|
|
open += 1;
|
|
return;
|
|
}
|
|
const mapped = submitters.find(newSubmitter => newSubmitter.name === csvSubmitter.name);
|
|
if (mapped) {
|
|
csvSubmitter.id = mapped.id;
|
|
ids.push(mapped.id);
|
|
} else {
|
|
open += 1;
|
|
}
|
|
});
|
|
this.motion.submitters_id = ids;
|
|
return open;
|
|
}
|
|
|
|
/**
|
|
* Function to iterate over the found tags.
|
|
*
|
|
* @param tags The mapping of the read tags.
|
|
*
|
|
* @returns {number} the number of open tags.
|
|
*/
|
|
public solveTags(tags: CsvMapping[]): number {
|
|
let open = 0;
|
|
const ids: number[] = [];
|
|
for (const tag of this.csvTags) {
|
|
if (tag.id) {
|
|
ids.push(tag.id);
|
|
continue;
|
|
}
|
|
if (!tags.length) {
|
|
++open;
|
|
continue;
|
|
}
|
|
const mapped = tags.find(_tag => _tag.name === tag.name);
|
|
if (mapped) {
|
|
tag.id = mapped.id;
|
|
ids.push(mapped.id);
|
|
} else {
|
|
++open;
|
|
}
|
|
}
|
|
this.motion.tags_id = ids;
|
|
return open;
|
|
}
|
|
}
|