4minitz/4minitz

View on GitHub
client/templates/topic/helpers/create-item.js

Summary

Maintainability
A
3 hrs
Test Coverage
import { Meteor } from 'meteor/meteor';
import {ActionItem} from '../../../../imports/actionitem';
import {InfoItem} from '../../../../imports/infoitem';
import {LabelExtractor} from '../../../../imports/services/labelExtractor';
import {Priority} from '../../../../imports/priority';
import {ResponsibleExtractor} from '../../../../imports/services/responsibleExtractor';
import {extractDateFromString} from '../../../../imports/helpers/date';
import {StringUtils} from '../../../../imports/helpers/string-utils';
import {convertOrCreateLabelsFromStrings} from './convert-or-create-label-from-string';


export function createItem(itemDoc, parentTopic, minutesId, meetingSeries, type = 'infoItem', labels = []) {
    itemDoc.labels = convertOrCreateLabelsFromStrings(labels, meetingSeries);

    if (!itemDoc.createdInMinute) {
        itemDoc.createdInMinute = minutesId;
    }

    if (!itemDoc.subject) {
        throw new Meteor.Error('illegal-argument', 'Please add a subject for the new item');
    }

    let newItem;
    switch (type) {
    case 'actionItem': {
        // extract duedate
        const duedate = extractDateFromString(itemDoc.subject);
        if (duedate) {
            itemDoc.duedate = duedate;
            itemDoc.subject = StringUtils.eraseSubstring(itemDoc.subject, duedate);
        }
        // extract priority
        const prio = Priority.extractPriorityFromString(itemDoc.subject);
        if (prio) {
            itemDoc.priority = prio.value;
            itemDoc.subject = StringUtils.eraseSubstring(itemDoc.subject, duedate);
        }

        newItem = new ActionItem(parentTopic, itemDoc);
        if (itemDoc.priority) {
            newItem.setPriority(new Priority(itemDoc.priority));
        }
        break;
    }
    case 'infoItem': {
        newItem = new InfoItem(parentTopic, itemDoc);
        break;
    }
    default:
        throw new Meteor.Error('Unknown type!');
    }

    const labelExtractor = new LabelExtractor(itemDoc.subject, meetingSeries._id);
    newItem.addLabelsById(labelExtractor.getExtractedLabelIds());
    newItem.setSubject(labelExtractor.getCleanedString());

    return newItem;
}

export function detectTypeAndCreateItem(itemDoc, parentTopic, minutesId, meetingSeries) {
    const responsibleExtractor = new ResponsibleExtractor(itemDoc.subject, true);
    let type = 'infoItem';
    const extractedResponsible = responsibleExtractor.getExtractedResponsible();
    if (extractedResponsible.length > 0) {
        type = 'actionItem';
        itemDoc.responsibles = itemDoc.responsibles || [];
        itemDoc.responsibles = itemDoc.responsibles.concat(extractedResponsible);
        itemDoc.subject = responsibleExtractor.getCleanedString();
    }
    return createItem(itemDoc, parentTopic, minutesId, meetingSeries, type);
}