feat(note_bars/collection): support number fields

This commit is contained in:
Elian Doran 2025-12-11 19:51:40 +02:00
parent e766b82418
commit 00df3c3d1f
No known key found for this signature in database
4 changed files with 40 additions and 3 deletions

View File

@ -5,10 +5,11 @@ import Dropdown from "../react/Dropdown";
import { FormDropdownDivider, FormDropdownSubmenu, FormListItem, FormListToggleableItem } from "../react/FormList"; import { FormDropdownDivider, FormDropdownSubmenu, FormListItem, FormListToggleableItem } from "../react/FormList";
import Icon from "../react/Icon"; import Icon from "../react/Icon";
import { useViewType, VIEW_TYPE_MAPPINGS } from "../ribbon/CollectionPropertiesTab"; import { useViewType, VIEW_TYPE_MAPPINGS } from "../ribbon/CollectionPropertiesTab";
import { bookPropertiesConfig, BookProperty, ButtonProperty, CheckBoxProperty, SplitButtonProperty } from "../ribbon/collection-properties-config"; import { bookPropertiesConfig, BookProperty, ButtonProperty, CheckBoxProperty, NumberProperty, SplitButtonProperty } from "../ribbon/collection-properties-config";
import { useNoteLabelBoolean } from "../react/hooks"; import { useNoteLabel, useNoteLabelBoolean } from "../react/hooks";
import { useContext } from "preact/hooks"; import { useContext } from "preact/hooks";
import { ParentComponent } from "../react/react_utils"; import { ParentComponent } from "../react/react_utils";
import FormTextBox from "../react/FormTextBox";
const ICON_MAPPINGS: Record<ViewTypeOptions, string> = { const ICON_MAPPINGS: Record<ViewTypeOptions, string> = {
grid: "bx bxs-grid", grid: "bx bxs-grid",
@ -83,6 +84,8 @@ function ViewProperty({ note, property }: { note: FNote, property: BookProperty
return <SplitButtonPropertyView note={note} property={property} />; return <SplitButtonPropertyView note={note} property={property} />;
case "checkbox": case "checkbox":
return <CheckBoxPropertyView note={note} property={property} />; return <CheckBoxPropertyView note={note} property={property} />;
case "number":
return <NumberPropertyView note={note} property={property} />;
} }
} }
@ -123,6 +126,29 @@ function SplitButtonPropertyView({ note, property }: { note: FNote, property: Sp
); );
} }
function NumberPropertyView({ note, property }: { note: FNote, property: NumberProperty }) {
//@ts-expect-error Interop with text box which takes in string values even for numbers.
const [ value, setValue ] = useNoteLabel(note, property.bindToLabel);
const disabled = property.disabled?.(note);
return (
<FormListItem
icon={property.icon}
disabled={disabled}
onClick={(e) => e.stopPropagation()}
>
{property.label}
<FormTextBox
type="number"
currentValue={value ?? ""} onChange={setValue}
style={{ width: (property.width ?? 100) }}
min={property.min ?? 0}
disabled={disabled}
/>
</FormListItem>
);
}
function CheckBoxPropertyView({ note, property }: { note: FNote, property: CheckBoxProperty }) { function CheckBoxPropertyView({ note, property }: { note: FNote, property: CheckBoxProperty }) {
const [ value, setValue ] = useNoteLabelBoolean(note, property.bindToLabel); const [ value, setValue ] = useNoteLabelBoolean(note, property.bindToLabel);
return ( return (

View File

@ -37,6 +37,15 @@ body.experimental-feature-new-layout {
padding-inline-start: 24px; padding-inline-start: 24px;
} }
.title-details {
.dropdown-menu {
input.form-control {
padding: 2px 8px;
margin-left: 1em;
}
}
}
.title-row { .title-row {
margin-left: 12px; margin-left: 12px;

View File

@ -155,7 +155,7 @@ function NumberPropertyView({ note, property }: { note: FNote, property: NumberP
<FormTextBox <FormTextBox
type="number" type="number"
currentValue={value ?? ""} onChange={setValue} currentValue={value ?? ""} onChange={setValue}
style={{ width: (property.width ?? 100) + "px" }} style={{ width: (property.width ?? 100) }}
min={property.min ?? 0} min={property.min ?? 0}
disabled={disabled} disabled={disabled}
/> />

View File

@ -41,6 +41,7 @@ export interface NumberProperty {
bindToLabel: FilterLabelsByType<number>; bindToLabel: FilterLabelsByType<number>;
width?: number; width?: number;
min?: number; min?: number;
icon?: string;
disabled?: (note: FNote) => boolean; disabled?: (note: FNote) => boolean;
} }
@ -160,6 +161,7 @@ export const bookPropertiesConfig: Record<ViewTypeOptions, BookConfig> = {
properties: [ properties: [
{ {
label: t("book_properties_config.max-nesting-depth"), label: t("book_properties_config.max-nesting-depth"),
icon: "bx bx-subdirectory-right",
type: "number", type: "number",
bindToLabel: "maxNestingDepth", bindToLabel: "maxNestingDepth",
width: 65, width: 65,