Some checks failed
		
		
	
	Build Tilde Friends / Build-All (push) Has been cancelled
				
			
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {LitElement, html, unsafeHTML, range} from './lit-all.min.js';
 | 
						|
import * as tfrpc from '/static/tfrpc.js';
 | 
						|
 | 
						|
class TfJournalEntryElement extends LitElement {
 | 
						|
	static get properties() {
 | 
						|
		return {
 | 
						|
			whoami: {type: String},
 | 
						|
			key: {type: String},
 | 
						|
			journals: {type: Object},
 | 
						|
			text: {type: String},
 | 
						|
		};
 | 
						|
	}
 | 
						|
 | 
						|
	constructor() {
 | 
						|
		super();
 | 
						|
		this.journals = {};
 | 
						|
		this.key = new Date().toISOString().split('T')[0];
 | 
						|
	}
 | 
						|
 | 
						|
	markdown(md) {
 | 
						|
		var reader = new commonmark.Parser();
 | 
						|
		var writer = new commonmark.HtmlRenderer({safe: true});
 | 
						|
		var parsed = reader.parse(md || '');
 | 
						|
		return writer.render(parsed);
 | 
						|
	}
 | 
						|
 | 
						|
	on_discard(event) {
 | 
						|
		this.text = undefined;
 | 
						|
	}
 | 
						|
 | 
						|
	async on_publish() {
 | 
						|
		console.log('publish', this.text);
 | 
						|
		this.dispatchEvent(
 | 
						|
			new CustomEvent('publish', {
 | 
						|
				bubbles: true,
 | 
						|
				detail: {
 | 
						|
					key: this.shadowRoot.getElementById('date_picker').value,
 | 
						|
					text: this.text,
 | 
						|
				},
 | 
						|
			})
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	back_dates(count) {
 | 
						|
		let now = new Date();
 | 
						|
		let result = [];
 | 
						|
		for (let i = 0; i < count; i++) {
 | 
						|
			let next = new Date(now);
 | 
						|
			next.setDate(now.getDate() - i);
 | 
						|
			result.push(next.toISOString().split('T')[0]);
 | 
						|
		}
 | 
						|
		return result;
 | 
						|
	}
 | 
						|
 | 
						|
	on_edit(event) {
 | 
						|
		this.text = event.srcElement.value;
 | 
						|
	}
 | 
						|
 | 
						|
	on_date_change(event) {
 | 
						|
		this.key = event.srcElement.value;
 | 
						|
		this.text = this.journals[this.key]?.text;
 | 
						|
	}
 | 
						|
 | 
						|
	render() {
 | 
						|
		console.log('RENDER ENTRY', this.key, this.journals?.[this.key]);
 | 
						|
		return html`
 | 
						|
			<select id="date_picker" @change=${this.on_date_change}>
 | 
						|
				${this.back_dates(10).map(
 | 
						|
					(x) => html` <option value=${x}>${x}</option> `
 | 
						|
				)}
 | 
						|
			</select>
 | 
						|
			<div style="display: inline-flex; flex-direction: row">
 | 
						|
				<button
 | 
						|
					?disabled=${this.text == this.journals?.[this.key]?.text}
 | 
						|
					@click=${this.on_publish}
 | 
						|
				>
 | 
						|
					Publish
 | 
						|
				</button>
 | 
						|
				<button @click=${this.on_discard}>Discard</button>
 | 
						|
			</div>
 | 
						|
			<div style="display: flex; flex-direction: row">
 | 
						|
				<textarea
 | 
						|
					style="flex: 1 1; min-height: 10em"
 | 
						|
					@input=${this.on_edit}
 | 
						|
					.value=${this.text ?? this.journals?.[this.key]?.text ?? ''}
 | 
						|
				></textarea>
 | 
						|
				<div style="flex: 1 1">
 | 
						|
					${unsafeHTML(
 | 
						|
						this.markdown(this.text ?? this.journals?.[this.key]?.text)
 | 
						|
					)}
 | 
						|
				</div>
 | 
						|
			</div>
 | 
						|
		`;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
customElements.define('tf-journal-entry', TfJournalEntryElement);
 |