|  |  |  | class PaginateTable {
 | 
					
						
							|  |  |  |   constructor(url) {
 | 
					
						
							|  |  |  |     this.page = 0;
 | 
					
						
							|  |  |  |     this.items = [];
 | 
					
						
							|  |  |  |     this.url = url;
 | 
					
						
							|  |  |  |     this.headers = [];
 | 
					
						
							|  |  |  |     this.search_query="";
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async contents() {
 | 
					
						
							|  |  |  |     if(this.page < 0) this.page = 0;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let url = `${this.url}?page=${this.page}`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(this.search_query !== "") {
 | 
					
						
							|  |  |  |       this.page = 0;
 | 
					
						
							|  |  |  |       url += `&search=${this.search_query}`
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const resp = await fetch(url);
 | 
					
						
							|  |  |  |     console.assert(resp.status == 200, "failed to get it");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const items = await resp.json();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(items) {
 | 
					
						
							|  |  |  |       this.items = items;
 | 
					
						
							|  |  |  |       this.headers = Object.keys(this.items[0]);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return this.items;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ForeverScroll {
 | 
					
						
							|  |  |  |   constructor(url) {
 | 
					
						
							|  |  |  |     this.page = 0;
 | 
					
						
							|  |  |  |     this.items = [];
 | 
					
						
							|  |  |  |     this.url = url;
 | 
					
						
							|  |  |  |     this.end = false;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async init() {
 | 
					
						
							|  |  |  |     const resp = await fetch(this.url);
 | 
					
						
							|  |  |  |     console.assert(resp.status == 200, "failed to get it");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const items = await resp.json();
 | 
					
						
							|  |  |  |     if(items) this.items = items;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async load() {
 | 
					
						
							|  |  |  |     this.page += 1
 | 
					
						
							|  |  |  |     let url = `${this.url}?page=${this.page}`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const resp = await fetch(url);
 | 
					
						
							|  |  |  |     console.assert(resp.status == 200, "failed to get it");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const items = await resp.json();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if(items) {
 | 
					
						
							|  |  |  |       this.items.push(...items);
 | 
					
						
							|  |  |  |     } else {
 | 
					
						
							|  |  |  |       this.end = true;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GetJson = async (url) => {
 | 
					
						
							|  |  |  |   const resp = await fetch(url);
 | 
					
						
							|  |  |  |   console.assert(resp.status == 200, "failed to get it");
 | 
					
						
							|  |  |  |   return await resp.json();
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ConfirmDelete = async (table, obj_id) => {
 | 
					
						
							|  |  |  |   if(confirm("Are you sure?")) {
 | 
					
						
							|  |  |  |     await fetch("/api/admin/table/" + table + "/" + obj_id,
 | 
					
						
							|  |  |  |       { method: "DELETE" });
 | 
					
						
							|  |  |  |     window.location = "/admin/table/" + table;
 | 
					
						
							|  |  |  |   } else {
 | 
					
						
							|  |  |  |     return false;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const UrlId = () => {
 | 
					
						
							|  |  |  |   let url = new URL(window.location.href);
 | 
					
						
							|  |  |  |   let parts = url.pathname.split("/");
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if(window.location.href.endsWith("/")) {
 | 
					
						
							|  |  |  |     return parts[parts.length - 2];
 | 
					
						
							|  |  |  |   } else {
 | 
					
						
							|  |  |  |     return parts[parts.length - 1];
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | }
 |