feat(wiki): improvements to the wiki's UI
This commit is contained in:
		| @@ -5,6 +5,7 @@ class TfCollectionElement extends LitElement { | |||||||
| 	static get properties() { | 	static get properties() { | ||||||
| 		return { | 		return { | ||||||
| 			whoami: {type: String}, | 			whoami: {type: String}, | ||||||
|  | 			category: {type: String}, | ||||||
| 			collection: {type: Object}, | 			collection: {type: Object}, | ||||||
| 			selected_id: {type: String}, | 			selected_id: {type: String}, | ||||||
| 			is_creating: {type: Boolean}, | 			is_creating: {type: Boolean}, | ||||||
| @@ -68,7 +69,7 @@ class TfCollectionElement extends LitElement { | |||||||
| 			<link rel="stylesheet" href="tildefriends.css"/> | 			<link rel="stylesheet" href="tildefriends.css"/> | ||||||
| 			<span class="inline-flex-row"> | 			<span class="inline-flex-row"> | ||||||
| 				<select class="button" @change=${this.on_selected} id="select" value=${this.selected_id}> | 				<select class="button" @change=${this.on_selected} id="select" value=${this.selected_id}> | ||||||
| 					<option value="" ?selected=${this.selected_id === ''} disabled hidden>(select)</option> | 					<option value="" ?selected=${this.selected_id === ''} disabled hidden>(select ${this.category})</option> | ||||||
| 					${Object.values(this.collection ?? {}).sort((x, y) => x.name.localeCompare(y.name)).map(x => html`<option value=${x.id} ?selected=${this.selected_id === x.id}>${x.name}</option>`)} | 					${Object.values(this.collection ?? {}).sort((x, y) => x.name.localeCompare(y.name)).map(x => html`<option value=${x.id} ?selected=${this.selected_id === x.id}>${x.name}</option>`)} | ||||||
| 				</select> | 				</select> | ||||||
| 				<span ?hidden=${!this.is_renaming || !this.whoami}> | 				<span ?hidden=${!this.is_renaming || !this.whoami}> | ||||||
|   | |||||||
| @@ -242,15 +242,20 @@ class TfCollectionsAppElement extends LitElement { | |||||||
| 		return html` | 		return html` | ||||||
| 			<link rel="stylesheet" href="tildefriends.css"/> | 			<link rel="stylesheet" href="tildefriends.css"/> | ||||||
| 			<style> | 			<style> | ||||||
| 				.toc { | 				.toc-item { | ||||||
| 					white-space: nowrap; | 					white-space: nowrap; | ||||||
| 					cursor: pointer; | 					cursor: pointer; | ||||||
| 				} | 				} | ||||||
| 				.toc:hover { | 				.toc-item:hover { | ||||||
| 					background-color: #0cc; | 					background-color: #0cc; | ||||||
| 				} | 				} | ||||||
| 				.toc.selected { | 				.toc-item.selected { | ||||||
| 					background-color: #088; | 					background-color: #088; | ||||||
|  | 					font-weight: bold; | ||||||
|  | 				} | ||||||
|  | 				.table-of-contents { | ||||||
|  | 					flex: 0 0; | ||||||
|  | 					margin-right: 16px; | ||||||
| 				} | 				} | ||||||
| 			</style> | 			</style> | ||||||
| 			<div> | 			<div> | ||||||
| @@ -260,6 +265,7 @@ class TfCollectionsAppElement extends LitElement { | |||||||
| 				${keyed(this.whoami, html`<tf-collection | 				${keyed(this.whoami, html`<tf-collection | ||||||
| 					.collection=${this.wikis} | 					.collection=${this.wikis} | ||||||
| 					whoami=${this.whoami} | 					whoami=${this.whoami} | ||||||
|  | 					category="wiki" | ||||||
| 					selected_id=${this.wiki?.id} | 					selected_id=${this.wiki?.id} | ||||||
| 					@create=${this.on_wiki_create} | 					@create=${this.on_wiki_create} | ||||||
| 					@rename=${this.on_wiki_rename} | 					@rename=${this.on_wiki_rename} | ||||||
| @@ -268,6 +274,7 @@ class TfCollectionsAppElement extends LitElement { | |||||||
| 				${keyed(this.wiki_doc?.id, html`<tf-collection | 				${keyed(this.wiki_doc?.id, html`<tf-collection | ||||||
| 					.collection=${this.wiki_docs} | 					.collection=${this.wiki_docs} | ||||||
| 					whoami=${this.whoami} | 					whoami=${this.whoami} | ||||||
|  | 					category="document" | ||||||
| 					selected_id=${(this.wiki_doc && this.wiki_doc?.parent == this.wiki?.id) ? this.wiki_doc?.id : ''} | 					selected_id=${(this.wiki_doc && this.wiki_doc?.parent == this.wiki?.id) ? this.wiki_doc?.id : ''} | ||||||
| 					@create=${this.on_wiki_doc_create} | 					@create=${this.on_wiki_doc_create} | ||||||
| 					@rename=${this.on_wiki_doc_rename} | 					@rename=${this.on_wiki_doc_rename} | ||||||
| @@ -292,12 +299,12 @@ class TfCollectionsAppElement extends LitElement { | |||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="flex-row"> | 			<div class="flex-row"> | ||||||
| 				<div style="flex: 0 0"> | 				<div class="box table-of-contents"> | ||||||
| 					${Object.values(this.wikis || {}).sort((x, y) => x.name.localeCompare(y.name)).map(wiki => html` | 					${Object.values(this.wikis || {}).sort((x, y) => x.name.localeCompare(y.name)).map(wiki => html` | ||||||
| 						<div class="toc ${self.wiki?.id === wiki.id ? 'selected' : ''}" @click=${() => self.on_wiki_changed({detail: {value: wiki}})}>📕${wiki.name}</div> | 						<div class="toc-item ${self.wiki?.id === wiki.id ? 'selected' : ''}" @click=${() => self.on_wiki_changed({detail: {value: wiki}})}>${self.wiki?.id === wiki.id ? '' : '>'} ${wiki.name}</div> | ||||||
| 						<ul> | 						<ul> | ||||||
| 							${Object.values(self.wiki_docs || {}).filter(doc => doc.parent === wiki?.id).sort((x, y) => x.name.localeCompare(y.name)).map(doc => html` | 							${Object.values(self.wiki_docs || {}).filter(doc => doc.parent === wiki?.id).sort((x, y) => x.name.localeCompare(y.name)).map(doc => html` | ||||||
| 								<li class="toc ${self.wiki_doc?.id === doc.id ? 'selected' : ''}" style="list-style: none; text-indent: -1rem" @click=${() => self.on_wiki_doc_changed({detail: {value: doc}})}>${doc?.private ? '🔒' : '📄'} ${doc.name}</li> | 								<li class="toc-item ${self.wiki_doc?.id === doc.id ? 'selected' : ''}" style="list-style: none; text-indent: -1rem" @click=${() => self.on_wiki_doc_changed({detail: {value: doc}})}>${doc?.private ? '🔒' : '📄'} ${doc.name}</li> | ||||||
| 							`)} | 							`)} | ||||||
| 						</ul> | 						</ul> | ||||||
| 					`)} | 					`)} | ||||||
|   | |||||||
| @@ -76,7 +76,9 @@ class TfWikiDocElement extends LitElement { | |||||||
|  |  | ||||||
| 	async load_blob() { | 	async load_blob() { | ||||||
| 		let blob = await tfrpc.rpc.get_blob(this.value?.blob); | 		let blob = await tfrpc.rpc.get_blob(this.value?.blob); | ||||||
| 		if (blob.endsWith('.box')) { | 		if(!blob) { | ||||||
|  | 			console.warn("no blob found, we're going to assume the document is empty (load_blob())"); | ||||||
|  | 		} else if (blob.endsWith('.box')) { | ||||||
| 			let d = await tfrpc.rpc.try_decrypt(this.whoami, blob); | 			let d = await tfrpc.rpc.try_decrypt(this.whoami, blob); | ||||||
| 			if (d) { | 			if (d) { | ||||||
| 				blob = d; | 				blob = d; | ||||||
| @@ -239,6 +241,15 @@ class TfWikiDocElement extends LitElement { | |||||||
| 				a:visited { color: #6c71c4 } | 				a:visited { color: #6c71c4 } | ||||||
| 				a:hover { color: #859900 } | 				a:hover { color: #859900 } | ||||||
| 				a:active { color: #2aa198 } | 				a:active { color: #2aa198 } | ||||||
|  |  | ||||||
|  | 				#editor-text-area { | ||||||
|  | 					background-color: #00000040; | ||||||
|  | 					color: white; | ||||||
|  | 					style="flex: 1 1; | ||||||
|  | 					min-height: 10em; | ||||||
|  | 					font-size: larger; | ||||||
|  | 					${this.value?.private ? 'border: 4px solid #800' : '' | ||||||
|  | 				} | ||||||
| 			</style> | 			</style> | ||||||
| 			<div class="inline-flex-row"> | 			<div class="inline-flex-row"> | ||||||
| 				<button ?disabled=${!this.whoami || this.is_editing} @click=${() => self.is_editing = true}>Edit</button> | 				<button ?disabled=${!this.whoami || this.is_editing} @click=${() => self.is_editing = true}>Edit</button> | ||||||
| @@ -249,15 +260,16 @@ class TfWikiDocElement extends LitElement { | |||||||
| 				<button ?disabled=${!this.is_editing} @click=${this.on_blog_publish}>Publish Blog</button> | 				<button ?disabled=${!this.is_editing} @click=${this.on_blog_publish}>Publish Blog</button> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div ?hidden=${!this.value?.private} style="color: #800">🔒 document is private</div> | 			<div ?hidden=${!this.value?.private} style="color: #800">🔒 document is private</div> | ||||||
| 			<div class="flex-row" ${this.value?.private ? 'border-top: 4px solid #800' : ''}"> | 			<div class="flex-column" ${this.value?.private ? 'border-top: 4px solid #800' : ''}"> | ||||||
| 				<textarea | 				<textarea | ||||||
| 					?hidden=${!this.is_editing} | 					?hidden=${!this.is_editing} | ||||||
| 					style="flex: 1 1; min-height: 10em; ${this.value?.private ? 'border: 4px solid #800' : ''}" | 					id="editor-text-area" | ||||||
| 					@input=${this.on_edit} | 					@input=${this.on_edit} | ||||||
| 					@paste=${this.paste} | 					@paste=${this.paste} | ||||||
| 					.value=${this.blob ?? ''}></textarea> | 					.value=${this.blob ?? ''}></textarea> | ||||||
| 				<div style="flex: 1 1"> | 				<div style="flex: 1 1"> | ||||||
| 					<div ?hidden=${!this.is_editing} style="border: 1px solid #fff; border-radius: 1em; padding: 0.5em"> | 					<div ?hidden=${!this.is_editing} class="box"> | ||||||
|  | 						Summary | ||||||
| 						<img ?hidden=${!thumbnail_ref} style="max-width: 128px; max-height: 128px; float: right" src="/${thumbnail_ref}/view"> | 						<img ?hidden=${!thumbnail_ref} style="max-width: 128px; max-height: 128px; float: right" src="/${thumbnail_ref}/view"> | ||||||
| 						<h1 ?hidden=${!this.title(this.blob)}>${unsafeHTML(this.markdown(this.title(this.blob)))}</h1> | 						<h1 ?hidden=${!this.title(this.blob)}>${unsafeHTML(this.markdown(this.title(this.blob)))}</h1> | ||||||
| 						${unsafeHTML(this.markdown(this.summary(this.blob)))} | 						${unsafeHTML(this.markdown(this.summary(this.blob)))} | ||||||
|   | |||||||
| @@ -100,3 +100,11 @@ tr:nth-child(even) { | |||||||
| 	display: inline-flex; | 	display: inline-flex; | ||||||
| 	flex-direction: row; | 	flex-direction: row; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .box { | ||||||
|  | 	background-color: #00000020; | ||||||
|  | 	border: 1px solid grey; | ||||||
|  | 	border-radius: 8px; | ||||||
|  | 	padding: 16px; | ||||||
|  | 	margin: 4px; | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user