feat: add slider, color, and time field renderers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3f42fa38e2
commit
e2f5654277
1 changed files with 102 additions and 0 deletions
|
|
@ -262,6 +262,99 @@ function renderTags(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderSlider(
|
||||||
|
controlEl: HTMLDivElement,
|
||||||
|
field: FormField,
|
||||||
|
initialValue?: FieldValue,
|
||||||
|
): { getValue: () => FieldValue; setValue: (v: FieldValue) => void } {
|
||||||
|
const min = field.min ?? 0;
|
||||||
|
const max = field.max ?? 100;
|
||||||
|
const step = field.step ?? 1;
|
||||||
|
const startVal = initialValue !== undefined ? Number(initialValue) : min;
|
||||||
|
|
||||||
|
const wrapper = controlEl.createDiv({ cls: 'ff-slider-wrapper' });
|
||||||
|
const input = wrapper.createEl('input', {
|
||||||
|
cls: 'ff-slider',
|
||||||
|
type: 'range',
|
||||||
|
});
|
||||||
|
input.min = String(min);
|
||||||
|
input.max = String(max);
|
||||||
|
input.step = String(step);
|
||||||
|
input.value = String(startVal);
|
||||||
|
|
||||||
|
const valueLabel = wrapper.createSpan({
|
||||||
|
cls: 'ff-slider-value',
|
||||||
|
text: String(startVal),
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('input', () => {
|
||||||
|
valueLabel.textContent = input.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
getValue: () => Number(input.value),
|
||||||
|
setValue: (v) => {
|
||||||
|
input.value = String(v);
|
||||||
|
valueLabel.textContent = String(v);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderColor(
|
||||||
|
controlEl: HTMLDivElement,
|
||||||
|
_field: FormField,
|
||||||
|
initialValue?: FieldValue,
|
||||||
|
): { getValue: () => FieldValue; setValue: (v: FieldValue) => void } {
|
||||||
|
const startVal =
|
||||||
|
initialValue !== undefined ? String(initialValue) : '#000000';
|
||||||
|
|
||||||
|
const wrapper = controlEl.createDiv({ cls: 'ff-color-wrapper' });
|
||||||
|
const input = wrapper.createEl('input', {
|
||||||
|
cls: 'ff-color-input',
|
||||||
|
type: 'color',
|
||||||
|
});
|
||||||
|
input.value = startVal;
|
||||||
|
|
||||||
|
const hexLabel = wrapper.createSpan({
|
||||||
|
cls: 'ff-color-hex',
|
||||||
|
text: startVal,
|
||||||
|
});
|
||||||
|
|
||||||
|
input.addEventListener('input', () => {
|
||||||
|
hexLabel.textContent = input.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
getValue: () => input.value,
|
||||||
|
setValue: (v) => {
|
||||||
|
input.value = String(v);
|
||||||
|
hexLabel.textContent = String(v);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTime(
|
||||||
|
controlEl: HTMLDivElement,
|
||||||
|
field: FormField,
|
||||||
|
initialValue?: FieldValue,
|
||||||
|
): { getValue: () => FieldValue; setValue: (v: FieldValue) => void } {
|
||||||
|
const input = controlEl.createEl('input', {
|
||||||
|
cls: 'ff-input',
|
||||||
|
type: 'time',
|
||||||
|
placeholder: field.placeholder ?? '',
|
||||||
|
});
|
||||||
|
if (initialValue !== undefined) {
|
||||||
|
input.value = String(initialValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
getValue: () => input.value,
|
||||||
|
setValue: (v) => {
|
||||||
|
input.value = String(v);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function renderNoteLink(
|
function renderNoteLink(
|
||||||
app: App,
|
app: App,
|
||||||
controlEl: HTMLDivElement,
|
controlEl: HTMLDivElement,
|
||||||
|
|
@ -495,6 +588,15 @@ export function renderField(
|
||||||
case 'rating':
|
case 'rating':
|
||||||
accessor = renderRating(controlEl, field, initialValue);
|
accessor = renderRating(controlEl, field, initialValue);
|
||||||
break;
|
break;
|
||||||
|
case 'slider':
|
||||||
|
accessor = renderSlider(controlEl, field, initialValue);
|
||||||
|
break;
|
||||||
|
case 'color':
|
||||||
|
accessor = renderColor(controlEl, field, initialValue);
|
||||||
|
break;
|
||||||
|
case 'time':
|
||||||
|
accessor = renderTime(controlEl, field, initialValue);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
accessor = renderText(controlEl, field, initialValue);
|
accessor = renderText(controlEl, field, initialValue);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue