view src/bbcode/bbcode.js @ 44:96f0c3d65698

add /bbcode
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 10 Nov 2022 23:18:58 -0700
parents
children 2d4f00755092
line wrap: on
line source

function fixTextarea(textarea) {
	let height = textarea.scrollHeight;
	if( height > textarea.clientHeight ) {
		textarea.style.height = (height+2) + "px";
	}
}

function fileButtonClick(button) {
	button.parentNode.querySelector('input[type="file"]').click();
}

function upload(input,callback) {
	let file = input.files[0];
	input.value = null;
	let request = new XMLHttpRequest();
	let url = 'https://upload.uploadcare.com/base/';
	request.open( 'POST', url );
	request.onload = function() {
		if( request.status !== 200 ) {
			let err = 'ajax failed: ' + request.status;
			if( request.responseText ) {
				err += '\n' + request.responseText;
				document.write('<pre>'+request.responseText+'</pre>');
			}
			console.log(err);
			ajax( '/error_log.js', 'err='+encodeURIComponent(err) );
			return;
		}
		let response = JSON.parse(request.responseText);
		let filename = file.name;
		let url = 'https://ucarecdn.com/' + response.file + '/' + filename;
		callback(input,url,filename);
	};
	let formData = new FormData();
	formData.append( 'UPLOADCARE_PUB_KEY', 'fe3d30f3088a50941d45' );
	formData.append( 'file', file );
	request.send(formData);
}

function getBbcodeDiv(node) {
	do {
		//console.log(node);
		if( node.getAttribute('bbcode') !== null )
			return node;
	} while( node = node.parentNode );
}

function uploaded(input,url,filename) {
	let div = getBbcodeDiv(input);
	let textarea = div.querySelector('textarea');
	textarea.focus();
	textarea.setRangeText(url,textarea.selectionStart,textarea.selectionEnd,'select');
}

function bbcodeCreate(div,options) {
	if( typeof(div) === 'string' )
		div = document.querySelector(div);
	let content = options.content || '';
	let save = options.save;
	let cancel = options.cancel;
	let html = `\
		<div bbcode>
			<textarea oninput="fixTextarea(this)"></textarea>
			<p>
				<input type=file onchange="upload(this,uploaded)">
				<button type=button onclick="fileButtonClick(this)">Upload File</button>
`	;
	if(save) {
		html += `\
				<button type=button save>save</button>
`		;
	}
	if(cancel) {
		html += `\
				<button type=button cancel>cancel</button>
`		;
	}
	html += `\
			</p>
		</div>
`	;
	div.innerHTML = html;
	if(save)
		div.querySelector('button[save]').addEventListener('click',save);
	if(cancel)
		div.querySelector('button[cancel]').addEventListener('click',cancel);
}