| 
									
										
										
										
											2023-11-04 16:52:49 +00:00
										 |  |  | import {LitElement, html, keyed} from './lit-all.min.js'; | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | import * as tfrpc from '/static/tfrpc.js'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TfCollectionsAppElement extends LitElement { | 
					
						
							|  |  |  | 	static get properties() { | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			ids: {type: Array}, | 
					
						
							| 
									
										
										
										
											2023-11-01 23:39:34 +00:00
										 |  |  | 			owner_ids: {type: Array}, | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 			whoami: {type: String}, | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 			following: {type: Array}, | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			wikis: {type: Object}, | 
					
						
							|  |  |  | 			wiki_docs: {type: Object}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 			wiki: {type: Object}, | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 			wiki_doc: {type: Object}, | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 			hash: {type: String}, | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			adding_editor: {type: Boolean}, | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 			expand_editors: {type: Boolean}, | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	constructor() { | 
					
						
							|  |  |  | 		super(); | 
					
						
							|  |  |  | 		this.ids = []; | 
					
						
							| 
									
										
										
										
											2023-11-01 23:39:34 +00:00
										 |  |  | 		this.owner_ids = []; | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 		this.following = []; | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 		this.load(); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 		let self = this; | 
					
						
							|  |  |  | 		tfrpc.register(function hash_changed(hash) { | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 			self.notify_hash_changed(hash); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2024-04-14 13:53:51 +01:00
										 |  |  | 		tfrpc.register(function setActiveIdentity(id) { | 
					
						
							|  |  |  | 			self.whoami = id; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 		tfrpc.rpc.get_hash().then((hash) => self.notify_hash_changed(hash)); | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async load() { | 
					
						
							|  |  |  | 		this.ids = await tfrpc.rpc.getIdentities(); | 
					
						
							| 
									
										
										
										
											2023-11-01 23:39:34 +00:00
										 |  |  | 		this.owner_ids = await tfrpc.rpc.getOwnerIdentities(); | 
					
						
							| 
									
										
										
										
											2024-04-14 13:53:51 +01:00
										 |  |  | 		this.whoami = await tfrpc.rpc.getActiveIdentity(); | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 		let ids = [...new Set([...this.owner_ids, this.whoami])].sort(); | 
					
						
							| 
									
										
										
										
											2023-11-14 17:38:48 +00:00
										 |  |  | 		this.following = Object.keys(await tfrpc.rpc.following(ids, 1)).sort(); | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		await this.read_wikis(); | 
					
						
							|  |  |  | 		await this.read_Wiki_docs(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async read_wikis() { | 
					
						
							|  |  |  | 		let max_rowid; | 
					
						
							|  |  |  | 		let wikis; | 
					
						
							| 
									
										
										
										
											2023-11-09 17:39:05 +00:00
										 |  |  | 		let start_whoami = this.whoami; | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 		while (true) { | 
					
						
							| 
									
										
										
										
											2023-11-09 17:39:05 +00:00
										 |  |  | 			console.log('read_wikis', this.whoami); | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 			[max_rowid, wikis] = await tfrpc.rpc.collection( | 
					
						
							|  |  |  | 				this.following, | 
					
						
							|  |  |  | 				'wiki', | 
					
						
							|  |  |  | 				undefined, | 
					
						
							|  |  |  | 				max_rowid, | 
					
						
							|  |  |  | 				wikis, | 
					
						
							|  |  |  | 				false | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-11-09 17:39:05 +00:00
										 |  |  | 			console.log('read ->', wikis); | 
					
						
							|  |  |  | 			if (this.whoami !== start_whoami) { | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			console.log('wikis =>', wikis); | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 			this.wikis = wikis; | 
					
						
							|  |  |  | 			this.update_wiki(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async read_wiki_docs() { | 
					
						
							|  |  |  | 		if (!this.wiki?.id) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-11-05 01:07:08 +00:00
										 |  |  | 		let start_id = this.wiki.id; | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 		let max_rowid; | 
					
						
							|  |  |  | 		let wiki_docs; | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 		while (true) { | 
					
						
							|  |  |  | 			[max_rowid, wiki_docs] = await tfrpc.rpc.collection( | 
					
						
							|  |  |  | 				this.wiki?.editors, | 
					
						
							|  |  |  | 				'wiki-doc', | 
					
						
							|  |  |  | 				this.wiki?.id, | 
					
						
							|  |  |  | 				max_rowid, | 
					
						
							|  |  |  | 				wiki_docs | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2023-11-05 01:07:08 +00:00
										 |  |  | 			if (this.wiki?.id !== start_id) { | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 			this.wiki_docs = wiki_docs; | 
					
						
							|  |  |  | 			this.update_wiki_doc(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 	hash_wiki() { | 
					
						
							|  |  |  | 		let hash = this.hash ?? ''; | 
					
						
							|  |  |  | 		hash = hash.charAt(0) == '#' ? hash.substring(1) : hash; | 
					
						
							|  |  |  | 		let parts = hash.split('/'); | 
					
						
							|  |  |  | 		return parts[0]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hash_wiki_doc() { | 
					
						
							|  |  |  | 		let hash = this.hash ?? ''; | 
					
						
							|  |  |  | 		hash = hash.charAt(0) == '#' ? hash.substring(1) : hash; | 
					
						
							|  |  |  | 		let slash = hash.indexOf('/'); | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 		return slash != -1 ? hash.substring(slash + 1) : undefined; | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	update_wiki() { | 
					
						
							|  |  |  | 		let want_wiki = this.hash_wiki(); | 
					
						
							|  |  |  | 		for (let wiki of Object.values(this.wikis ?? {})) { | 
					
						
							|  |  |  | 			if (wiki.name === want_wiki) { | 
					
						
							|  |  |  | 				this.wiki = wiki; | 
					
						
							|  |  |  | 				this.read_wiki_docs(); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 	update_wiki_doc() { | 
					
						
							|  |  |  | 		let want_wiki_doc = this.hash_wiki_doc(); | 
					
						
							|  |  |  | 		for (let wiki_doc of Object.values(this.wiki_docs ?? {})) { | 
					
						
							|  |  |  | 			if (wiki_doc.name === want_wiki_doc) { | 
					
						
							|  |  |  | 				this.wiki_doc = wiki_doc; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	notify_hash_changed(hash) { | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 		this.hash = hash; | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 		this.update_wiki(); | 
					
						
							|  |  |  | 		this.update_wiki_doc(); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 	async on_whoami_changed(event) { | 
					
						
							|  |  |  | 		let new_id = event.srcElement.selected; | 
					
						
							|  |  |  | 		await tfrpc.rpc.localStorageSet('collections_whoami', new_id); | 
					
						
							|  |  |  | 		this.whoami = new_id; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	update_hash() { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 		tfrpc.rpc.set_hash( | 
					
						
							|  |  |  | 			this.wiki_doc | 
					
						
							|  |  |  | 				? `${this.wiki.name}/${this.wiki_doc.name}` | 
					
						
							|  |  |  | 				: `${this.wiki.name}` | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async on_wiki_changed(event) { | 
					
						
							|  |  |  | 		this.wiki = event.detail.value; | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 		this.wiki_doc = undefined; | 
					
						
							| 
									
										
										
										
											2023-11-04 16:52:49 +00:00
										 |  |  | 		this.wiki_docs = undefined; | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 		this.adding_editor = false; | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 		this.update_hash(); | 
					
						
							|  |  |  | 		this.read_wiki_docs(); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-06 00:59:30 +00:00
										 |  |  | 	async on_wiki_create(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki', | 
					
						
							|  |  |  | 			name: event.detail.name, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async on_wiki_rename(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki', | 
					
						
							|  |  |  | 			key: event.detail.id, | 
					
						
							|  |  |  | 			name: event.detail.name, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 	async on_add_editor(event) { | 
					
						
							|  |  |  | 		let id = this.shadowRoot.getElementById('add_editor').value; | 
					
						
							|  |  |  | 		let editors = [...this.wiki.editors]; | 
					
						
							|  |  |  | 		if (editors.indexOf(id) == -1) { | 
					
						
							|  |  |  | 			editors.push(id); | 
					
						
							|  |  |  | 			editors.sort(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki', | 
					
						
							|  |  |  | 			key: this.wiki.id, | 
					
						
							|  |  |  | 			editors: editors, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.adding_editor = false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 	async on_remove_editor(id) { | 
					
						
							|  |  |  | 		if (confirm(`Are you sure you want to remove ${id} as an editor?`)) { | 
					
						
							|  |  |  | 			let editors = [...this.wiki.editors]; | 
					
						
							|  |  |  | 			if (editors.indexOf(id) != -1) { | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				editors = editors.filter((x) => x !== id); | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 				type: 'wiki', | 
					
						
							|  |  |  | 				key: this.wiki.id, | 
					
						
							|  |  |  | 				editors: editors, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-06 00:59:30 +00:00
										 |  |  | 	async on_wiki_tombstone(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki', | 
					
						
							|  |  |  | 			key: event.detail.id, | 
					
						
							|  |  |  | 			tombstone: { | 
					
						
							|  |  |  | 				date: new Date().valueOf(), | 
					
						
							|  |  |  | 				reason: 'tombstoned by user', | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async on_wiki_doc_create(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki-doc', | 
					
						
							|  |  |  | 			parent: this.wiki.id, | 
					
						
							|  |  |  | 			name: event.detail.name, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async on_wiki_doc_rename(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki-doc', | 
					
						
							|  |  |  | 			parent: this.wiki.id, | 
					
						
							|  |  |  | 			key: event.detail.id, | 
					
						
							|  |  |  | 			name: event.detail.name, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async on_wiki_doc_tombstone(event) { | 
					
						
							|  |  |  | 		await tfrpc.rpc.appendMessage(this.whoami, { | 
					
						
							|  |  |  | 			type: 'wiki-doc', | 
					
						
							|  |  |  | 			parent: this.wiki.id, | 
					
						
							|  |  |  | 			key: event.detail.id, | 
					
						
							|  |  |  | 			tombstone: { | 
					
						
							|  |  |  | 				date: new Date().valueOf(), | 
					
						
							|  |  |  | 				reason: 'tombstoned by user', | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	async on_wiki_doc_changed(event) { | 
					
						
							| 
									
										
										
										
											2023-11-04 02:00:35 +00:00
										 |  |  | 		this.wiki_doc = event.detail.value; | 
					
						
							|  |  |  | 		this.update_hash(); | 
					
						
							| 
									
										
										
										
											2023-11-01 22:21:42 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-09 17:39:05 +00:00
										 |  |  | 	updated(changed_properties) { | 
					
						
							|  |  |  | 		if (changed_properties.has('whoami')) { | 
					
						
							|  |  |  | 			this.wikis = {}; | 
					
						
							|  |  |  | 			this.wiki_docs = {}; | 
					
						
							|  |  |  | 			this.read_wikis(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 	render() { | 
					
						
							|  |  |  | 		let self = this; | 
					
						
							|  |  |  | 		return html`
 | 
					
						
							| 
									
										
										
										
											2024-02-22 16:11:49 +01:00
										 |  |  | 			<link rel="stylesheet" href="tildefriends.css"/> | 
					
						
							| 
									
										
										
										
											2023-12-12 17:38:10 +00:00
										 |  |  | 			<style> | 
					
						
							| 
									
										
										
										
											2024-02-22 18:11:13 +01:00
										 |  |  | 				.toc-item { | 
					
						
							| 
									
										
										
										
											2024-02-22 13:03:21 +01:00
										 |  |  | 					white-space: nowrap; | 
					
						
							|  |  |  | 					cursor: pointer; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-02-22 18:11:13 +01:00
										 |  |  | 				.toc-item:hover { | 
					
						
							| 
									
										
										
										
											2023-12-14 00:02:18 +00:00
										 |  |  | 					background-color: #0cc; | 
					
						
							| 
									
										
										
										
											2023-12-12 17:38:10 +00:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-02-22 18:11:13 +01:00
										 |  |  | 				.toc-item.selected { | 
					
						
							| 
									
										
										
										
											2023-12-14 00:02:18 +00:00
										 |  |  | 					background-color: #088; | 
					
						
							| 
									
										
										
										
											2024-02-22 18:11:13 +01:00
										 |  |  | 					font-weight: bold; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				.table-of-contents { | 
					
						
							|  |  |  | 					flex: 0 0; | 
					
						
							|  |  |  | 					margin-right: 16px; | 
					
						
							| 
									
										
										
										
											2023-12-12 17:38:10 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			</style> | 
					
						
							| 
									
										
										
										
											2023-11-01 23:39:34 +00:00
										 |  |  | 			<div> | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				${keyed( | 
					
						
							|  |  |  | 					this.whoami, | 
					
						
							|  |  |  | 					html`<tf-collection
 | 
					
						
							|  |  |  | 						.collection=${this.wikis} | 
					
						
							|  |  |  | 						whoami=${this.whoami} | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 						category="wiki" | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 						selected_id=${this.wiki?.id} | 
					
						
							|  |  |  | 						@create=${this.on_wiki_create} | 
					
						
							|  |  |  | 						@rename=${this.on_wiki_rename} | 
					
						
							|  |  |  | 						@tombstone=${this.on_wiki_tombstone} | 
					
						
							|  |  |  | 						@change=${this.on_wiki_changed} | 
					
						
							|  |  |  | 					></tf-collection>` | 
					
						
							|  |  |  | 				)} | 
					
						
							|  |  |  | 				${keyed( | 
					
						
							|  |  |  | 					this.wiki_doc?.id, | 
					
						
							|  |  |  | 					html`<tf-collection
 | 
					
						
							|  |  |  | 						.collection=${this.wiki_docs} | 
					
						
							|  |  |  | 						whoami=${this.whoami} | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 						category="document" | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 						selected_id=${this.wiki_doc && | 
					
						
							|  |  |  | 						this.wiki_doc?.parent == this.wiki?.id | 
					
						
							|  |  |  | 							? this.wiki_doc?.id | 
					
						
							|  |  |  | 							: ''} | 
					
						
							|  |  |  | 						@create=${this.on_wiki_doc_create} | 
					
						
							|  |  |  | 						@rename=${this.on_wiki_doc_rename} | 
					
						
							|  |  |  | 						@tombstone=${this.on_wiki_doc_tombstone} | 
					
						
							|  |  |  | 						@change=${this.on_wiki_doc_changed} | 
					
						
							|  |  |  | 					></tf-collection>` | 
					
						
							|  |  |  | 				)} | 
					
						
							|  |  |  | 				<button @click=${() => (self.expand_editors = !self.expand_editors)}>${this.wiki?.editors?.length} editor${this.wiki?.editors?.length > 1 ? 's' : ''}</button> | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 				<div ?hidden=${!this.wiki?.editors || !this.expand_editors}> | 
					
						
							|  |  |  | 					<div> | 
					
						
							|  |  |  | 						<ul> | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 							${this.wiki?.editors.map((id) => html`<li><button class="red" ?hidden=${id == this.whoami} @click=${() => self.on_remove_editor(id)}>x</button> ${id}</li>`)} | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 							<li> | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 								<button class="green" @click=${() => (self.adding_editor = true)} ?hidden=${this.wiki?.editors?.indexOf(this.whoami) == -1 || this.adding_editor}>+</button> | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 								<div ?hidden=${!this.adding_editor}> | 
					
						
							|  |  |  | 									<label for="add_editor">Add Editor:</label> | 
					
						
							|  |  |  | 									<input type="text" id="add_editor"></input> | 
					
						
							|  |  |  | 									<button @click=${this.on_add_editor}>Add Editor</button> | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 									<button @click=${() => (self.adding_editor = false)}>x</button> | 
					
						
							| 
									
										
										
										
											2023-11-12 20:17:23 +00:00
										 |  |  | 								</div> | 
					
						
							|  |  |  | 							</li> | 
					
						
							|  |  |  | 						</ul> | 
					
						
							| 
									
										
										
										
											2023-11-11 13:44:20 +00:00
										 |  |  | 					</div> | 
					
						
							|  |  |  | 				</div> | 
					
						
							| 
									
										
										
										
											2023-11-01 23:39:34 +00:00
										 |  |  | 			</div> | 
					
						
							| 
									
										
										
										
											2024-02-22 13:03:21 +01:00
										 |  |  | 			<div class="flex-row"> | 
					
						
							| 
									
										
										
										
											2024-02-22 18:11:13 +01:00
										 |  |  | 				<div class="box table-of-contents"> | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 					${Object.values(this.wikis || {}) | 
					
						
							|  |  |  | 						.sort((x, y) => x.name.localeCompare(y.name)) | 
					
						
							|  |  |  | 						.map( | 
					
						
							|  |  |  | 							(wiki) => html`
 | 
					
						
							|  |  |  | 								<div | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 									class="toc-item ${self.wiki?.id === wiki.id | 
					
						
							|  |  |  | 										? 'selected' | 
					
						
							|  |  |  | 										: ''}" | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 									@click=${() => self.on_wiki_changed({detail: {value: wiki}})} | 
					
						
							|  |  |  | 								> | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 									${self.wiki?.id === wiki.id ? '' : '>'} ${wiki.name} | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 								</div> | 
					
						
							|  |  |  | 								<ul> | 
					
						
							|  |  |  | 									${Object.values(self.wiki_docs || {}) | 
					
						
							|  |  |  | 										.filter((doc) => doc.parent === wiki?.id) | 
					
						
							|  |  |  | 										.sort((x, y) => x.name.localeCompare(y.name)) | 
					
						
							|  |  |  | 										.map( | 
					
						
							|  |  |  | 											(doc) => html`
 | 
					
						
							|  |  |  | 												<li | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 													class="toc-item ${self.wiki_doc?.id === doc.id | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 														? 'selected' | 
					
						
							|  |  |  | 														: ''}" | 
					
						
							| 
									
										
										
										
											2024-02-25 15:37:13 -05:00
										 |  |  | 													style="list-style: none; text-indent: -1rem" | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 													@click=${() => | 
					
						
							|  |  |  | 														self.on_wiki_doc_changed({detail: {value: doc}})} | 
					
						
							|  |  |  | 												> | 
					
						
							|  |  |  | 													${doc?.private ? '🔒' : '📄'} ${doc.name} | 
					
						
							|  |  |  | 												</li> | 
					
						
							|  |  |  | 											`
 | 
					
						
							|  |  |  | 										)} | 
					
						
							|  |  |  | 								</ul> | 
					
						
							|  |  |  | 							`
 | 
					
						
							|  |  |  | 						)} | 
					
						
							| 
									
										
										
										
											2023-12-11 17:48:08 +00:00
										 |  |  | 				</div> | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | 				${ | 
					
						
							|  |  |  | 					this.wiki_doc && this.wiki_doc.parent === this.wiki?.id | 
					
						
							|  |  |  | 						? html`
 | 
					
						
							|  |  |  | 								<tf-wiki-doc | 
					
						
							|  |  |  | 									style="width: 100%" | 
					
						
							|  |  |  | 									whoami=${this.whoami} | 
					
						
							|  |  |  | 									.wiki=${this.wiki} | 
					
						
							|  |  |  | 									.value=${this.wiki_doc} | 
					
						
							|  |  |  | 								></tf-wiki-doc> | 
					
						
							|  |  |  | 							`
 | 
					
						
							|  |  |  | 						: undefined | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2023-12-11 17:48:08 +00:00
										 |  |  | 			</div> | 
					
						
							| 
									
										
										
										
											2023-10-30 00:22:30 +00:00
										 |  |  | 		`;
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-24 11:09:34 -05:00
										 |  |  | customElements.define('tf-collections-app', TfCollectionsAppElement); |