From b368ba3fb0542123830236bdf8bdbbb2ff46a17a Mon Sep 17 00:00:00 2001 From: Ethan Miller Date: Mon, 8 May 2023 17:22:18 -0500 Subject: [PATCH] option to select binary checkbox states for integration with Tracker plugin --- src/cdm/SettingsModel.ts | 1 + src/components/cellTypes/CheckboxCell.tsx | 16 +++++++------ .../modals/columnSettings/ColumnSections.ts | 1 + .../handlers/MetadataToggleGroupHandler.ts | 20 +++++++++++++++- src/helpers/Constants.ts | 16 +++++++++++++ src/lang/locale/en.ts | 2 ++ .../DefaultMetadataToggleGroupHandler.ts | 23 +++++++++++++++++++ 7 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/cdm/SettingsModel.ts b/src/cdm/SettingsModel.ts index 411f6431..14651908 100644 --- a/src/cdm/SettingsModel.ts +++ b/src/cdm/SettingsModel.ts @@ -34,6 +34,7 @@ export interface LocalSettings { show_metadata_inlinks: boolean; show_metadata_outlinks: boolean; show_metadata_tags: boolean; + binary_checkbox_type: boolean; source_form_result: string; source_destination_path: string; source_data: string; diff --git a/src/components/cellTypes/CheckboxCell.tsx b/src/components/cellTypes/CheckboxCell.tsx index c18ab6b1..df008e9b 100644 --- a/src/components/cellTypes/CheckboxCell.tsx +++ b/src/components/cellTypes/CheckboxCell.tsx @@ -3,7 +3,8 @@ import { TableColumn } from "cdm/FolderModel"; import { c } from "helpers/StylesHelper"; import { CellComponentProps } from "cdm/ComponentsModel"; import { ParseService } from "services/ParseService"; -import { InputType } from "helpers/Constants"; +import {DEFAULT_SETTINGS, InputType} from "helpers/Constants"; +import {Notice} from "obsidian"; function CheckboxCell(props: CellComponentProps) { const { defaultCell } = props; @@ -15,22 +16,23 @@ function CheckboxCell(props: CellComponentProps) { const checkboxRow = tableState.data((state) => state.rows[row.index]); const columnsInfo = tableState.columns((state) => state.info); const configInfo = tableState.configState((state) => state.info); + const isBinaryCellType = DEFAULT_SETTINGS.local_settings.binary_checkbox_type; const checkboxCell = tableState.data( (state) => ParseService.parseRowToCell( state.rows[row.index], tableColumn, - InputType.CHECKBOX, + isBinaryCellType ? InputType.NUMBER : InputType.CHECKBOX, configInfo.getLocalSettings() - ) as boolean + ) as boolean | number ); const handleChange = async (event: React.ChangeEvent) => { const newValue = event.target.checked; - editCheckbox(newValue); + editCheckbox( isBinaryCellType ? (newValue ? 1 : 0) : newValue ); }; - const editCheckbox = async (newValue: boolean) => { + const editCheckbox = async (newValue: boolean | number) => { const newCell = ParseService.parseRowToLiteral( checkboxRow, tableColumn, @@ -55,13 +57,13 @@ function CheckboxCell(props: CellComponentProps) { onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); - editCheckbox(!checkboxCell); + editCheckbox(isBinaryCellType ? (checkboxCell ? 1 : 0) : !checkboxCell); } }} > diff --git a/src/components/modals/columnSettings/ColumnSections.ts b/src/components/modals/columnSettings/ColumnSections.ts index d1d7a1aa..d9d91361 100644 --- a/src/components/modals/columnSettings/ColumnSections.ts +++ b/src/components/modals/columnSettings/ColumnSections.ts @@ -95,6 +95,7 @@ class BehaviorSetttingsSection extends AbstractChain => { + // Persist value + view.diskConfig.updateConfig({ binary_checkbox_type: value }); + addColumnModalManager.addColumnModal.enableReset = true; + DEFAULT_SETTINGS.local_settings.binary_checkbox_type = value; + } + + new Setting(metadata_section) + .setName(t("settings_metatata_checkbox_type_toggle_title")) + .setDesc(t("settings_metatata_checkbox_type_toggle_desc")) + .addToggle(toggle => + toggle.setValue(view.diskConfig.yaml.config.binary_checkbox_type) + .onChange(metadata_checkbox_type_toggle_promise) + ); + return this.goNext(response); } } \ No newline at end of file diff --git a/src/helpers/Constants.ts b/src/helpers/Constants.ts index a1408417..b724c629 100644 --- a/src/helpers/Constants.ts +++ b/src/helpers/Constants.ts @@ -31,6 +31,7 @@ export const StaticInputType = Object.freeze({ INLINKS: 'inlinks', OUTLINKS: 'outlinks', METADATA_TAGS: 'metadata_tags', + CHECKBOX_TYPE: 'checkbox_type', NEW_COLUMN: 'new_column', }); @@ -54,6 +55,7 @@ export const MetadataColumns = Object.freeze({ INLINKS: `__inlinks__`, ROW_CONTEXT_MENU: "__rowContextMenu__", TAGS: `__tags__`, + CHECKBOX_TYPE: `__checkbox_type__`, }); export const MetadataLabels = Object.freeze({ @@ -65,6 +67,7 @@ export const MetadataLabels = Object.freeze({ OUTLINKS: 'Outlinks', INLINKS: 'Inlinks', TAGS: 'File Tags', + CHECKBOX_TYPE: 'Checkbox Type', }); export const PaginationRenderOptions = Object.freeze({ @@ -229,6 +232,18 @@ export const MetadataDatabaseColumns: MetadataColumnsModel = Object.freeze({ csvCandidate: false, config: DEFAULT_COLUMN_CONFIG }, + CHECKBOX_TYPE: { + key: MetadataColumns.CHECKBOX_TYPE, + id: MetadataColumns.CHECKBOX_TYPE, + input: InputType.CHECKBOX_TYPE, + label: MetadataLabels.CHECKBOX_TYPE, + accessorKey: MetadataColumns.CHECKBOX_TYPE, + isMetadata: true, + isDragDisabled: false, + skipPersist: false, + csvCandidate: false, + config: DEFAULT_COLUMN_CONFIG + }, ROW_CONTEXT_MENU: { id: MetadataColumns.ROW_CONTEXT_MENU, key: MetadataColumns.ROW_CONTEXT_MENU, @@ -429,6 +444,7 @@ export const DEFAULT_SETTINGS: DatabaseSettings = { show_metadata_inlinks: false, show_metadata_outlinks: false, show_metadata_tags: false, + binary_checkbox_type: false, source_data: SourceDataTypes.CURRENT_FOLDER, source_form_result: '', source_destination_path: '/', diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index f550a327..b7f46f3a 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -281,6 +281,8 @@ export default { "settings_metatata_outlinks_toggle_desc": "Enable/disable File Outlinks Column", "settings_metatata_tags_toggle_title": "File Tags", "settings_metatata_tags_toggle_desc": "Enable/disable File Tags Column", + "settings_metatata_checkbox_type_toggle_title": "Checkbox Type", + "settings_metatata_checkbox_type_toggle_desc": "Select whether the cell state should be a boolean (true/false) or binary (1/0) in the frontmatter", "settings_remove_fields_title": "Remove fields", "settings_remove_fields_desc": "Enable/disable remove fields when a column is deleted", "settings_template_title": "Header templates", diff --git a/src/settings/handlers/columns/DefaultMetadataToggleGroupHandler.ts b/src/settings/handlers/columns/DefaultMetadataToggleGroupHandler.ts index 691480e3..6b601c9e 100644 --- a/src/settings/handlers/columns/DefaultMetadataToggleGroupHandler.ts +++ b/src/settings/handlers/columns/DefaultMetadataToggleGroupHandler.ts @@ -2,6 +2,7 @@ import { t } from "lang/helpers"; import { Setting } from "obsidian"; import { AbstractSettingsHandler, SettingHandlerResponse } from "settings/handlers/AbstractSettingHandler"; import { add_setting_header } from "settings/SettingsComponents"; +import {DEFAULT_SETTINGS} from "../../../helpers/Constants"; export class DefaultMetadataToggleGroupHandler extends AbstractSettingsHandler { settingTitle: string = t("settings_metatata_title"); @@ -137,6 +138,28 @@ export class DefaultMetadataToggleGroupHandler extends AbstractSettingsHandler { toggle.setValue(settingsManager.plugin.settings.local_settings.show_metadata_tags) .onChange(metadata_tags_toggle_promise) ); + + /************************* + * CHECKBOX TYPE COLUMN + ************************/ + const metadata_checkbox_type_toggle_promise = async (value: boolean): Promise => { + // switch show tags on/off + const update_local_settings = settingsManager.plugin.settings.local_settings; + update_local_settings.binary_checkbox_type = value; + // update settings + await settingsManager.plugin.updateSettings({ + local_settings: update_local_settings + }); + DEFAULT_SETTINGS.local_settings.binary_checkbox_type = value; + } + + new Setting(metadata_section) + .setName(t("settings_metatata_checkbox_type_toggle_title")) + .setDesc(t("settings_metatata_checkbox_type_toggle_desc")) + .addToggle(toggle => + toggle.setValue(settingsManager.plugin.settings.local_settings.binary_checkbox_type) + .onChange(metadata_checkbox_type_toggle_promise) + ); } return this.goNext(settingHandlerResponse); }