diff --git a/epdb/views.py b/epdb/views.py index 081cf7f9..751738b7 100644 --- a/epdb/views.py +++ b/epdb/views.py @@ -2482,7 +2482,22 @@ def package_pathway_node(request, package_uuid, pathway_uuid, node_uuid): return JsonResponse({"success": current_node.url}) - return HttpResponseBadRequest() + new_node_name = request.POST.get("node-name") + new_node_description = request.POST.get("node-description") + + if any([new_node_name, new_node_description]): + if new_node_name is not None and new_node_name.strip() != "": + new_node_name = nh3.clean(new_node_name.strip(), tags=s.ALLOWED_HTML_TAGS).strip() + current_node.name = new_node_name + + if new_node_description is not None and new_node_description.strip() != "": + new_node_description = nh3.clean(new_node_description.strip(), tags=s.ALLOWED_HTML_TAGS).strip() + current_node.description = new_node_description + + current_node.save() + return redirect(current_node.url) + + return error(request, "Node update failed!", "No changes were made to the node") else: return HttpResponseNotAllowed(["GET", "POST"]) diff --git a/static/js/alpine/pagination.js b/static/js/alpine/pagination.js index aaa5d9ca..e9503d87 100644 --- a/static/js/alpine/pagination.js +++ b/static/js/alpine/pagination.js @@ -5,6 +5,125 @@ */ document.addEventListener('alpine:init', () => { + + const basePagination = ( + items, + currentPage, + totalPages, + totalItems, + perPage, + isReviewed, + instanceId + ) => ({ + items, + currentPage, + totalPages, + totalItems, + perPage, + isReviewed, + instanceId, + + get paginatedItems() { + return this.items; + }, + + get showingStart() { + if (this.totalItems === 0) return 0; + return (this.currentPage - 1) * this.perPage + 1; + }, + + get showingEnd() { + if (this.totalItems === 0) return 0; + return Math.min((this.currentPage - 1) * this.perPage + this.items.length, this.totalItems); + }, + + nextPage() { + if (this.currentPage < this.totalPages) { + this.fetchPage(this.currentPage + 1); + } + }, + + prevPage() { + if (this.currentPage > 1) { + this.fetchPage(this.currentPage - 1); + } + }, + + goToPage(page) { + if (page >= 1 && page <= this.totalPages) { + this.fetchPage(page); + } + }, + + get pageNumbers() { + const pages = []; + const total = this.totalPages; + const current = this.currentPage; + + if (total === 0) { + return pages; + } + + if (total <= 7) { + for (let i = 1; i <= total; i++) { + pages.push({ page: i, isEllipsis: false, key: `${this.instanceId}-page-${i}` }); + } + } else { + pages.push({ page: 1, isEllipsis: false, key: `${this.instanceId}-page-1` }); + + let rangeStart; + let rangeEnd; + + if (current <= 4) { + rangeStart = 2; + rangeEnd = 5; + } else if (current >= total - 3) { + rangeStart = total - 4; + rangeEnd = total - 1; + } else { + rangeStart = current - 1; + rangeEnd = current + 1; + } + + if (rangeStart > 2) { + pages.push({ page: '...', isEllipsis: true, key: `${this.instanceId}-ellipsis-start` }); + } + + for (let i = rangeStart; i <= rangeEnd; i++) { + pages.push({ page: i, isEllipsis: false, key: `${this.instanceId}-page-${i}` }); + } + + if (rangeEnd < total - 1) { + pages.push({ page: '...', isEllipsis: true, key: `${this.instanceId}-ellipsis-end` }); + } + + pages.push({ page: total, isEllipsis: false, key: `${this.instanceId}-page-${total}` }); + } + + return pages; + } + }); + + Alpine.data('paginatedList', + (items, options = {}) => ({ + ...basePagination(items,1, 0, 0, options.perPage || 50, options.isReviewed || false, options.instanceId || Math.random().toString(36).substring(2, 9),), + + init() { + this.fetchPage(1); + }, + + async fetchPage(page) { + this.totalItems = this.items.length; + this.totalPages = Math.ceil(this.items.length / this.perPage); + this.currentPage = page + + const start = page * this.perPage - this.perPage; + const end = page * this.perPage; + return this.items.slice(start, end); + } + + })); + Alpine.data('remotePaginatedList', (options = {}) => ({ items: [], currentPage: 1, diff --git a/templates/objects/node.html b/templates/objects/node.html index 5f5515f9..7aabd4d5 100644 --- a/templates/objects/node.html +++ b/templates/objects/node.html @@ -55,6 +55,15 @@ + + {% if node.description and node.description != "no description" %} +