Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
software-articles.js 5.82 KiB
Newer Older
peter_rabbit's avatar
peter_rabbit committed
"use strict";

peter_rabbit's avatar
peter_rabbit committed
const { articles_url } = require("../../../../constants");
peter_rabbit's avatar
peter_rabbit committed
const ImageCarousel = require("../../../generic-components/image-carousel");
peter_rabbit's avatar
peter_rabbit committed
const {
    loadArticles,
    getArticleBody,
    getArticleDate,
} = require("../../../lib/article-utils");
peter_rabbit's avatar
peter_rabbit committed
const objectHtmlRenderer = require("../../../lib/object-html-renderer");

class SoftwareArticle {
    constructor(props) {
        this.props = props;
    }

    render() {
peter_rabbit's avatar
peter_rabbit committed
        const { title, date, body, subtitle, images, path, technical } = this.props;
peter_rabbit's avatar
peter_rabbit committed
        return {
            tag: "article",
            class: "software-article",
            contents: [
                {
                    tag: "h2",
                    class: "software-title",
                    contents: title,
                },
                {
                    tag: "h3",
                    class: "software-subtitle",
                    contents: subtitle,
                },
peter_rabbit's avatar
peter_rabbit committed
                {
peter_rabbit's avatar
peter_rabbit committed
                    tag: "span",
                    class: "software-date",
                    contents: getArticleDate(date),
peter_rabbit's avatar
peter_rabbit committed
                },
peter_rabbit's avatar
peter_rabbit committed
                {
                    tag: "div",
                    class: "software-description",
                    contents: getArticleBody(body),
                },
                new ImageCarousel({ images: images.map(img => `${path}/images/${img}`) }).render(),
                {
                    tag: "div",
                    class: "software-technical",
                    contents: [
                        {
                            tag: "h2",
peter_rabbit's avatar
peter_rabbit committed
                            contents: "Details",
peter_rabbit's avatar
peter_rabbit committed
                        },
                        {
peter_rabbit's avatar
peter_rabbit committed
                            tag: "ul",
                            class: "technical-details",
peter_rabbit's avatar
peter_rabbit committed
                            contents: [
                                {
peter_rabbit's avatar
peter_rabbit committed
                                    tag: "li",
                                    class: "detail",
peter_rabbit's avatar
peter_rabbit committed
                                    contents: [
peter_rabbit's avatar
peter_rabbit committed
                                        { tag: "label", contents: "Stack" },
peter_rabbit's avatar
peter_rabbit committed
                                        {
peter_rabbit's avatar
peter_rabbit committed
                                            tag: "div",
peter_rabbit's avatar
peter_rabbit committed
                                            contents: [
                                                {
                                                    tag: "ul",
                                                    contents: technical.stack.map(tech => {
                                                        return { tag: "li", contents: tech };
                                                    }),
                                                },
                                            ],
                                        },
                                    ],
                                },
peter_rabbit's avatar
peter_rabbit committed
                                {
peter_rabbit's avatar
peter_rabbit committed
                                    tag: "li",
                                    class: "detail",
peter_rabbit's avatar
peter_rabbit committed
                                    contents: [
peter_rabbit's avatar
peter_rabbit committed
                                        { tag: "label", contents: "Version actuelle" },
peter_rabbit's avatar
peter_rabbit committed
                                        {
peter_rabbit's avatar
peter_rabbit committed
                                            tag: "div",
peter_rabbit's avatar
peter_rabbit committed
                                            contents: technical.version,
                                        },
                                    ],
                                },
peter_rabbit's avatar
peter_rabbit committed
                                {
peter_rabbit's avatar
peter_rabbit committed
                                    tag: "li",
                                    class: "detail",
peter_rabbit's avatar
peter_rabbit committed
                                    contents: [
peter_rabbit's avatar
peter_rabbit committed
                                        { tag: "label", contents: "License" },
                                        { tag: "div", contents: technical.license },
peter_rabbit's avatar
peter_rabbit committed
                                    ],
                                },
                                {
peter_rabbit's avatar
peter_rabbit committed
                                    tag: "li",
                                    class: "detail",
peter_rabbit's avatar
peter_rabbit committed
                                    contents: [
peter_rabbit's avatar
peter_rabbit committed
                                        {
                                            tag: "label",
                                            contents: [
                                                {
                                                    tag: "a",
                                                    href: technical.repository,
                                                    contents: "Dépôt code source",
                                                },
                                            ],
                                        },
peter_rabbit's avatar
peter_rabbit committed
                                    ],
                                },
                            ],
                        },
                    ],
                },
            ],
        };
    }
}

class SoftwareArticles {
    constructor(props) {
        this.props = props;
        this.state = {
            articles: [],
        };
        this.id = performance.now();
        this.loadArticles();
    }

    loadArticles() {
peter_rabbit's avatar
peter_rabbit committed
        loadArticles(`${articles_url}software`)
peter_rabbit's avatar
peter_rabbit committed
            .then(articles => {
                this.state.articles = articles;
                this.refresh();
            })
            .catch(e => console.log(e));
    }

    renderPlaceholder() {
        return {
            tag: "article",
            class: "placeholder",
            contents: [{ tag: "div" }, { tag: "div" }],
        };
    }

    refresh() {
        objectHtmlRenderer.subRender(this.render(), document.getElementById(this.id), {
            mode: "replace",
        });
    }

    render() {
        const { articles } = this.state;
        return {
            tag: "section",
            class: "software-articles page-contents-center",
            id: this.id,
            contents:
                articles.length > 0
                    ? articles.map(article => new SoftwareArticle({ ...article }).render())
                    : [this.renderPlaceholder()],
        };
    }
}

module.exports = SoftwareArticles;