TryGhost/Ghost

View on GitHub
ghost/admin/app/components/posts/links-table.js

Summary

Maintainability
A
0 mins
Test Coverage
import Component from '@glimmer/component';
import {action} from '@ember/object';
import {tracked} from '@glimmer/tracking';

const PAGE_SIZE = 5;

export default class LinksTable extends Component {
    @tracked page = 1;

    @tracked editingLink = null;
    @tracked showError = null;
    @tracked _linkValue = '';

    @action
    handleBlur(event) {
        event?.preventDefault();
        if (this.editingLink && !event?.relatedTarget?.matches('.gh-links-list-item-update-button')) {
            this.cancelEdit();
        }
    }

    @action
    editLink(linkId) {
        this.editingLink = linkId;
        const linkTo = this.links.find(link => link.link.link_id === linkId)?.link?.to;
        this._linkValue = linkTo || '';
    }

    @action
    cancelEdit(event) {
        event?.preventDefault();
        this.editingLink = null;
        this.showError = null;
    }

    @action
    updateLinkValue(event) {
        this._linkValue = event.target.value;
    }

    @action
    setLink(event) {
        event?.preventDefault();
        try {
            const newUrl = new URL(this._linkValue);
            const linkObj = this.links.find((_link) => {
                return _link.link.link_id === this.editingLink;
            });
            // Only call update if the new link is different from current link
            if (linkObj.link.to !== newUrl.href) {
                this.args.updateLink(this.editingLink, newUrl.href);
            }
            this.editingLink = null;
            this.showError = null;
        } catch (e) {
            this.showError = this.editingLink;
        }
    }

    get links() {
        return this.args.links;
    }

    get visibleLinks() {
        return this.links.slice(this.startOffset - 1, this.endOffset);
    }

    get startOffset() {
        return (this.page - 1) * PAGE_SIZE + 1;
    }

    get endOffset() {
        return Math.min(this.page * PAGE_SIZE, this.links.length);
    }

    get totalPages() {
        return Math.ceil(this.links.length / PAGE_SIZE);
    }

    get totalLinks() {
        return this.links.length;
    }

    get showPagination() {
        return this.totalPages > 1;
    }

    get disablePreviousPage() {
        return this.page === 1;
    }

    get disableNextPage() {
        return this.page === this.totalPages;
    }

    @action
    openPreviousPage() {
        if (this.disablePreviousPage) {
            return;
        }
        this.page -= 1;
    }

    @action
    openNextPage() {
        if (this.disableNextPage) {
            return;
        }

        this.page += 1;
    }
}