dbmedialab/reader-critics

View on GitHub
src/app/mail/layout/FeedbackFormat.ts

Summary

Maintainability
A
0 mins
Test Coverage
import Article from 'base/Article';
import Feedback from 'base/Feedback';

import { articleService }  from 'app/services';
import { translate as __ } from 'app/services/localization';

import {
    format,
    ItemFormatPayload,
} from 'app/mail/layout/FeedbackNotifyLayout';

import * as app from 'app/util/applib';

const log = app.createLog();

const cssFeedbackItemBox = [
    'padding: 0.25em 0.5em',
    'margin-bottom: 0.5em',
].join(';');

export function formatFeedbacks(
    article : Article,
    feedbacks : Feedback[],
    locale : string
) : string[] {
    return feedbacks.map(fb => formatFeedback(article, fb, locale));
}

export function formatFeedback(
    article : Article,
    feedback : Feedback,
    locale : string
) : string
{
    const created = new Date(feedback.date.created);

    const posted = __('mail.fb-notify.posted', {
        locale,
        values: {
            createdDate: created.toLocaleDateString(locale),
            createdTime: created.toLocaleTimeString(locale),
            enduser: format.enduser(feedback),
        },
    });

    const head = `<div class="feedback-date">${posted}</div>`;

    return head + (feedback.items
    .map((fItem, index) => {
        const item : ItemFormatPayload = {
            aItem: articleService.getRelatedArticleItem(article, fItem),
            fItem,
        };

        if (item.aItem === undefined) {
            log('Could not find related article item (feedback ID %s)', feedback.ID, app.inspect(fItem));
            return;
        }

        if (item.fItem.text === undefined) {
            log('Found a feedback object without text property, ignoring');
            return;
        }

        return formatFeedbackItem(item, locale);
    })
    .filter(item => item !== undefined)
    .join('\n'));
}

function formatFeedbackItem(item : ItemFormatPayload, locale : string) : string {
    const formatted = [
        format.itemHeader(item, locale),
        format.itemText(item),
        format.itemComment(item, locale),
        format.itemLinks(item, locale),
    ];

    const borderCol = (item.fItem.text.length <= 0) ? format.colorItemText : format.colorItemDiff;
    const css = `${cssFeedbackItemBox}; border-left: 3px solid ${borderCol};`;
    return `<div class="fb-item-box" style="${css}">${formatted.join('')}</div>`;
}