Ghost/ghost/admin/app/components/posts/links-table.js
2022-10-21 16:08:26 +05:30

113 lines
2.5 KiB
JavaScript

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 (!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;
}
}