mongaku/mongaku

View on GitHub
src/views/Home.js

Summary

Maintainability
A
2 hrs
Test Coverage
// @flow

const React = require("react");

import type {Context, Source as SourceType} from "./types.js";
const {childContextTypes} = require("./Wrapper.js");

type Props = {
    sources: Array<SourceType>,
};

const SearchForm = (
    {type}: {type: string},
    {gettext, user, options, URL}: Context,
) => {
    const title = options.types[type].name;
    const sources =
        options.canAddRecords && user && user.getEditableSourcesByType[type];

    return (
        <div>
            <h3>{title}</h3>
            <form
                action={URL(`/${type}/search`)}
                method="GET"
                className="form-search form-inline"
            >
                <div className="form-group">
                    <input
                        type="search"
                        id="filter"
                        name="filter"
                        placeholder={gettext("Search")}
                        className="form-control search-query"
                    />
                </div>{" "}
                <input
                    type="submit"
                    value={gettext("Search")}
                    className="btn btn-primary"
                />{" "}
                <a href={URL(`/${type}/search`)} className="btn btn-default">
                    {gettext("Browse All")}
                </a>{" "}
                {sources &&
                    sources.length > 0 && (
                        <a
                            href={URL(`/${type}/create`)}
                            className="btn btn-success"
                        >
                            {gettext("Create New")}
                        </a>
                    )}
            </form>
        </div>
    );
};

SearchForm.contextTypes = childContextTypes;

const ImageUploadForms = ({type}: {type: string}, {gettext, URL}: Context) => (
    <div>
        <h3>{gettext("Search by Image:")}</h3>
        <p>{gettext("Upload an image to find other similar images.")}</p>

        <div className="panel panel-default">
            <div className="panel-heading">
                <h3 className="panel-title">{gettext("Upload an Image")}</h3>
            </div>
            <div className="panel-body">
                <form
                    action={URL(`/${type}/file-upload`)}
                    method="POST"
                    encType="multipart/form-data"
                >
                    <div className="form-inline">
                        <div className="form-group">
                            <input
                                type="file"
                                id="file"
                                name="file"
                                className="form-control"
                            />
                        </div>{" "}
                        <input
                            type="submit"
                            className="btn btn-primary"
                            value={gettext("Search by Image")}
                        />
                    </div>
                </form>
            </div>
        </div>

        <div className="panel panel-default">
            <div className="panel-heading">
                <h3 className="panel-title">{gettext("Paste Image URL")}</h3>
            </div>
            <div className="panel-body">
                <form action={URL(`/${type}/url-upload`)} method="GET">
                    <div className="form-inline">
                        <div className="form-group">
                            <input
                                type="text"
                                id="url"
                                name="url"
                                defaultValue="http://"
                                className="form-control"
                            />
                        </div>{" "}
                        <input
                            type="submit"
                            value={gettext("Search by Image")}
                            className="btn btn-primary"
                        />
                    </div>
                </form>
            </div>
        </div>
    </div>
);

ImageUploadForms.contextTypes = childContextTypes;

const Source = (
    {type, source}: {type: string, source: SourceType},
    {options, stringNum}: Context,
) => {
    const typeName = options.types[type].name;
    const recordCount = stringNum(source.numRecords);
    const desc = `${recordCount} ${typeName}`;

    return (
        <tr>
            <td>
                <h4>
                    <a href={source.getURL}>{source.getFullName}</a>
                </h4>
            </td>
            <td className="text-right">{desc}</td>
        </tr>
    );
};

Source.contextTypes = childContextTypes;

const Sources = (
    {type, sources}: Props & {type: string},
    {gettext}: Context,
) => (
    <div>
        <h3>{gettext("Browse by Collection:")}</h3>

        <div className="table-responsive">
            <table className="sources table">
                {sources.map(source => (
                    <Source key={source._id} source={source} type={type} />
                ))}
            </table>
        </div>
    </div>
);

Sources.contextTypes = childContextTypes;

const Type = ({type, sources}: Props & {type: string}, {options}: Context) => {
    const sourcesByType = sources.filter(source => source.type === type);

    return (
        <div className="row">
            <div className="col-xs-12 upload-box">
                <SearchForm type={type} />
                {options.types[type].hasImageSearch && (
                    <ImageUploadForms type={type} />
                )}
                {sourcesByType.length > 1 && (
                    <Sources type={type} sources={sourcesByType} />
                )}
            </div>
        </div>
    );
};

Type.contextTypes = childContextTypes;

const Home = ({sources}: Props, {options}: Context) => (
    <div style={{maxWidth: 750}}>
        {Object.keys(options.types).map(type => (
            <Type key={type} sources={sources} type={type} />
        ))}
    </div>
);

Home.contextTypes = childContextTypes;

module.exports = Home;