Skip to content

Commit def8caa

Browse files
author
Brian Genisio
committed
multi-line support
1 parent f9b2ee9 commit def8caa

File tree

5 files changed

+60
-10
lines changed

5 files changed

+60
-10
lines changed

data/answer.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ __Summary__
99
__Responses__
1010

1111
1. **Question 1**
12-
- Selected Answer: qq
12+
- Selected Answer: No answer selected
1313
- Correct Answer: Holy Grail
1414
- Result: ✗ Incorrect
1515

@@ -34,15 +34,15 @@ What is your quest?
3434

3535
__Correct Answers__
3636

37-
- Holy Grail [kind: string] [options: fuzzy=0.3]
37+
- Holy Grail [kind: string] [options: fuzzy=0.3,multiLine=true]
3838

3939
__Practice Question__
4040

4141
How many feet in a yard?
4242

4343
__Correct Answers__
4444

45-
- 3 [kind: numeric] [options: precision=0]
45+
- 3 [kind: string] [options: precision=0]
4646

4747
__Practice Question__
4848

data/question.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ What is your quest?
88

99
__Correct Answers__
1010

11-
- Holy Grail [kind: string] [options: fuzzy=0.3]
11+
- Holy Grail [kind: string] [options: fuzzy=0.3,multiLine=true]
1212

1313
__Practice Question__
1414

1515
How many feet in a yard?
1616

1717
__Correct Answers__
1818

19-
- 3 [kind: numeric] [options: precision=0]
19+
- 3 [kind: string] [options: precision=0]
2020

2121
__Practice Question__
2222

public/editor.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,32 @@ function renderValidationOptions(container, question, index) {
426426
caseSensitiveDiv.appendChild(caseLabel);
427427
validationDiv.appendChild(caseSensitiveDiv);
428428

429+
// Multi-line option
430+
const multiLineDiv = document.createElement('div');
431+
multiLineDiv.className = 'validation-option';
432+
const multiLineLabel = document.createElement('label');
433+
multiLineLabel.className = 'input-checkbox';
434+
const multiLineInput = document.createElement('input');
435+
multiLineInput.type = 'checkbox';
436+
multiLineInput.checked = options.multiLine === true;
437+
multiLineInput.onchange = () => {
438+
options.multiLine = multiLineInput.checked;
439+
updateStructure();
440+
};
441+
const multiLineBox = document.createElement('span');
442+
multiLineBox.className = 'input-checkbox-box';
443+
const multiLineCheckmark = document.createElement('span');
444+
multiLineCheckmark.className = 'input-checkbox-checkmark';
445+
multiLineBox.appendChild(multiLineCheckmark);
446+
const multiLineText = document.createElement('span');
447+
multiLineText.className = 'input-checkbox-label';
448+
multiLineText.textContent = 'Multi-line';
449+
multiLineLabel.appendChild(multiLineInput);
450+
multiLineLabel.appendChild(multiLineBox);
451+
multiLineLabel.appendChild(multiLineText);
452+
multiLineDiv.appendChild(multiLineLabel);
453+
validationDiv.appendChild(multiLineDiv);
454+
429455
// Fuzzy option
430456
const fuzzyDiv = document.createElement('div');
431457
fuzzyDiv.className = 'validation-option';

public/modules/text-input.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,18 @@
180180
scroll-margin-bottom: 2rem;
181181
}
182182

183+
/* Multi-line textarea styling */
184+
.text-input-field:is(textarea) {
185+
display: block;
186+
height: auto;
187+
min-height: var(--UI-Input-md);
188+
padding-top: var(--UI-Spacing-spacing-ms);
189+
padding-bottom: var(--UI-Spacing-spacing-ms);
190+
line-height: 1.5;
191+
resize: vertical;
192+
align-items: stretch;
193+
}
194+
183195
.text-input-next-button-container {
184196
display: flex;
185197
justify-content: flex-start;

public/modules/text-input.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -433,17 +433,29 @@ export function initTextInput({ activity, state, postResults, persistedAnswers =
433433
const isCurrency = question.validation && question.validation.kind === 'numeric-with-currency';
434434
const currencySymbol = isCurrency ? (question.validation.options?.currency || '$') : null;
435435

436-
// Create input wrapper for currency overlay
436+
// Check if this is a multi-line input
437+
const isMultiLine = question.validation && question.validation.kind === 'string' &&
438+
question.validation.options?.multiLine === true;
439+
440+
// Create input wrapper for currency overlay (only for single-line inputs)
437441
const inputWrapper = document.createElement('div');
438442
inputWrapper.className = 'text-input-field-wrapper';
439-
if (isCurrency) {
443+
if (isCurrency && !isMultiLine) {
440444
inputWrapper.classList.add('text-input-field-wrapper-currency');
441445
inputWrapper.setAttribute('data-currency', currencySymbol);
442446
}
443447

444-
// Create input field
445-
const input = document.createElement('input');
446-
input.type = 'text';
448+
// Create input field (textarea for multi-line, input for single-line)
449+
const input = isMultiLine ? document.createElement('textarea') : document.createElement('input');
450+
if (!isMultiLine) {
451+
input.type = 'text';
452+
} else {
453+
// Set textarea-specific attributes
454+
input.rows = 4;
455+
input.style.resize = 'vertical';
456+
input.style.minHeight = 'var(--UI-Input-md)';
457+
input.style.height = 'auto';
458+
}
447459
input.className = 'input text-input-field';
448460
input.id = `q${question.id}-input`;
449461
input.value = userAnswers[question.id] || '';

0 commit comments

Comments
 (0)