changeset 42:1d9d9786d76f

textareas
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 11 Aug 2025 08:27:22 +0900
parents 2a4c83ce3deb
children 5ecfdf43f72d
files src/chat.css src/chat.html.luan src/chat.js src/edit_course.html.luan src/site.js
diffstat 5 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
diff -r 2a4c83ce3deb -r 1d9d9786d76f src/chat.css
--- a/src/chat.css	Mon Aug 11 07:58:32 2025 +0900
+++ b/src/chat.css	Mon Aug 11 08:27:22 2025 +0900
@@ -22,7 +22,6 @@
 	display: block;
 	width: 100%;
 	margin-top: 36px;
-	resize: none;
 }
 [ai_container] div[buttons] {
 	display: flex;
diff -r 2a4c83ce3deb -r 1d9d9786d76f src/chat.html.luan
--- a/src/chat.html.luan	Mon Aug 11 07:58:32 2025 +0900
+++ b/src/chat.html.luan	Mon Aug 11 08:27:22 2025 +0900
@@ -58,7 +58,7 @@
 			</div>
 <%	if is_owner then %>
 			<div ask>
-				<textarea autofocus oninput="fixTextarea(event.target)" onkeydown="textareaKey(event)"><%= html_encode(init_text) %></textarea>
+				<textarea autofocus oninput="fixChatTextarea(event.target)" onkeydown="textareaKey(event)"><%= html_encode(init_text) %></textarea>
 				<div buttons>
 					<audio controls preload=none></audio>
 					<button record onclick="toggleRecording()">Record</button>
diff -r 2a4c83ce3deb -r 1d9d9786d76f src/chat.js
--- a/src/chat.js	Mon Aug 11 07:58:32 2025 +0900
+++ b/src/chat.js	Mon Aug 11 08:27:22 2025 +0900
@@ -95,9 +95,8 @@
 
 let audio;
 
-function fixTextarea(textarea) {
-	textarea.style.height = 'initial';
-	textarea.style.height = (textarea.scrollHeight+2) + 'px';
+function fixChatTextarea(textarea) {
+	fixTextarea(textarea);
 	textarea.parentNode.scrollIntoViewIfNeeded(false);
 	if( !audio )
 		audio = document.querySelector('div[buttons] audio');
@@ -109,7 +108,7 @@
 	let url = `ai_ask.js?chat=${chat.id}&input=${encodeURIComponent(input.value)}`;
 	ajax(url);
 	input.value = '';
-	fixTextarea(input);
+	fixChatTextarea(input);
 	showWaitingAiIcon();
 }
 
@@ -117,7 +116,7 @@
 function setText(text) {
 	let textarea = document.querySelector('textarea');
 	textarea.value = text;
-	fixTextarea(textarea);
+	fixChatTextarea(textarea);
 }
 
 let recorder = null;
diff -r 2a4c83ce3deb -r 1d9d9786d76f src/edit_course.html.luan
--- a/src/edit_course.html.luan	Mon Aug 11 07:58:32 2025 +0900
+++ b/src/edit_course.html.luan	Mon Aug 11 08:27:22 2025 +0900
@@ -67,10 +67,10 @@
 			<input type=text required name=name value="<%=html_encode(course.name)%>">
 
 			<h4>AI system prompt</h4>
-			<textarea required name=ai_system_prompt rows=10><%=html_encode(course.ai_system_prompt)%></textarea>
+			<textarea required name=ai_system_prompt oninput="fixTextarea(event.target)"><%=html_encode(course.ai_system_prompt)%></textarea>
 
 			<h4>AI first message (optional)</h4>
-			<textarea name=ai_first_message><%=html_encode(course.ai_first_message or "")%></textarea>
+			<textarea name=ai_first_message oninput="fixTextarea(event.target)"><%=html_encode(course.ai_first_message or "")%></textarea>
 
 			<input type=submit>
 
@@ -78,6 +78,13 @@
 
 			<p>Text areas take <a href="/tools/markdown.html">Markdown</a>.  AI generally recognizes Markdown.</p>
 		</form>
+		<script>
+			'use strict';
+			let textareas = document.querySelectorAll('textarea');
+			for( let textarea of textareas ) {
+				fixTextarea(textarea);
+			}
+		</script>
 	</body>
 </html>
 <%
diff -r 2a4c83ce3deb -r 1d9d9786d76f src/site.js
--- a/src/site.js	Mon Aug 11 07:58:32 2025 +0900
+++ b/src/site.js	Mon Aug 11 08:27:22 2025 +0900
@@ -119,6 +119,12 @@
 	window.scrollTo( 0, lastY );
 }
 
+function fixTextarea(textarea) {
+	textarea.style.height = 'initial';
+	textarea.style.height = (textarea.scrollHeight+2) + 'px';
+	textarea.scrollIntoViewIfNeeded(false);
+}
+
 
 // requires markdown-it