Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit d3bf45f

Browse files
committed
Merge branch '121-fr-remove-all-values-of-notes-with-an-option-is-removed-tags-too'
2 parents b81f6a2 + f1fd3ae commit d3bf45f

File tree

10 files changed

+119
-13
lines changed

10 files changed

+119
-13
lines changed

src/cdm/ModalsModel.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { TableColumn } from "cdm/FolderModel";
2-
import { ColumnsState } from "cdm/TableStateInterface";
2+
import { ColumnsState, ConfigState, DataState } from "cdm/TableStateInterface";
33
import { ColumnSettingsManager } from "components/modals/columnSettings/ColumnSettingsModal";
44
import { AddColumnModalManager } from "components/modals/newColumn/addColumnModal";
55
import { FilterSettings, LocalSettings } from "cdm/SettingsModel";
6+
import { HeaderMenuProps } from "cdm/HeaderModel";
7+
import { DatabaseView } from "DatabaseView";
68

79
/**
810
* Base class for all modal responses.
@@ -20,6 +22,13 @@ export type ColumnSettingsHandlerResponse = {
2022
columnSettingsManager: ColumnSettingsManager
2123
} & BaseModalHandlerResponse
2224

25+
export type ColumnSettingsModalProps = {
26+
dataState: Pick<DataState, "actions">,
27+
columnState: Pick<ColumnsState, "info">,
28+
configState: Pick<ConfigState, "info">,
29+
view: DatabaseView,
30+
headerMenuProps: HeaderMenuProps
31+
}
2332

2433
export type AddColumnModalProps = {
2534
columnsState: Partial<ColumnsState>;

src/cdm/TableStateInterface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ export interface DataState {
4242
updateDataAfterLabelChange: (column: TableColumn, label: string, columns: TableColumn[], ddbbConfig: LocalSettings) => Promise<void>;
4343
removeRow: (row: RowDataType) => void;
4444
removeDataOfColumn: (column: TableColumn) => void;
45+
removeOptionForAllRows: (column: TableColumn, option: string, columns: TableColumn[],
46+
ddbbConfig: LocalSettings) => Promise<void>;
4547
dataviewRefresh: (column: TableColumn[], ddbbConfig: LocalSettings, filterConfig: FilterSettings) => void;
4648
}
4749
}

src/components/HeaderMenu.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,13 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
269269
<div
270270
className="menu-item sort-button"
271271
onClick={() => {
272-
new ColumnSettingsModal(
273-
table.options.meta.view,
274-
headerMenuProps
275-
).open();
272+
new ColumnSettingsModal({
273+
dataState: { actions: dataActions },
274+
columnState: { info: columnsInfo },
275+
configState: { info: configInfo },
276+
view: table.options.meta.view,
277+
headerMenuProps: headerMenuProps,
278+
}).open();
276279
setExpanded(false);
277280
}}
278281
>

src/components/modals/columnSettings/ColumnSettingsModal.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@ import { DatabaseView } from "DatabaseView";
33
import { Modal } from "obsidian";
44
import { add_setting_header } from "settings/SettingsComponents";
55
import { StyleClasses } from "helpers/Constants";
6-
import { ColumnSettingsHandlerResponse } from "cdm/ModalsModel";
6+
import { ColumnSettingsHandlerResponse, ColumnSettingsModalProps } from "cdm/ModalsModel";
77
import { particular_settings_section, behavior_settings_section } from "components/modals/columnSettings/ColumnSections";
88
import { HeaderMenuProps } from "cdm/HeaderModel";
9+
import { ColumnsState, ConfigState, DataState } from "cdm/TableStateInterface";
910

1011
export class ColumnSettingsModal extends Modal {
1112
view: DatabaseView;
1213
headerMenuProps: HeaderMenuProps;
1314
columnSettingsManager: ColumnSettingsManager;
15+
dataState: Partial<DataState>;
16+
configState: Partial<ConfigState>;
17+
columnsState: Partial<ColumnsState>;
1418
enableReset: boolean = false;
1519
constructor(
16-
view: DatabaseView,
17-
headerMenuProps: HeaderMenuProps
20+
props: ColumnSettingsModalProps
1821
) {
22+
const { view, headerMenuProps, dataState, configState, columnState } = props;
1923
super(view.app);
2024
this.view = view;
25+
this.dataState = dataState;
26+
this.configState = configState;
27+
this.columnsState = columnState;
2128
this.headerMenuProps = headerMenuProps;
2229
this.columnSettingsManager = new ColumnSettingsManager(this);
2330
}

src/components/modals/columnSettings/handlers/SelectedColumnOptionsHandler.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { ButtonComponent, Notice, Setting } from "obsidian";
66
import { AbstractHandlerClass } from "patterns/AbstractHandler";
77
import React from "react";
88
import { createRoot } from "react-dom/client";
9+
import { LOGGER } from "services/Logger";
910

1011
export class SelectedColumnOptionsHandler extends AbstractHandlerClass<ColumnSettingsHandlerResponse> {
1112
settingTitle: string = "Column Options";
@@ -14,7 +15,8 @@ export class SelectedColumnOptionsHandler extends AbstractHandlerClass<ColumnSet
1415
): ColumnSettingsHandlerResponse {
1516
const { column, containerEl, columnSettingsManager } =
1617
columnHandlerResponse;
17-
const { view } = columnSettingsManager.modal;
18+
const { view, dataState, configState, columnsState } =
19+
columnSettingsManager.modal;
1820
let newLabel = "";
1921
const options = column.options;
2022
const onClickAddPromise = async (): Promise<void> => {
@@ -72,11 +74,33 @@ export class SelectedColumnOptionsHandler extends AbstractHandlerClass<ColumnSet
7274
cb.setIcon("cross")
7375
.setTooltip("Delete")
7476
.onClick(async (): Promise<void> => {
77+
const removedOption = options[index];
7578
options.splice(index, 1);
7679
// Persist changes
7780
await view.diskConfig.updateColumnProperties(column.key, {
7881
options: options,
7982
});
83+
84+
dataState.actions
85+
.removeOptionForAllRows(
86+
column,
87+
removedOption.label,
88+
columnsState.info.getAllColumns(),
89+
configState.info.getLocalSettings()
90+
)
91+
.then(() => {
92+
new Notice(
93+
`Option ${removedOption.label} was removed from all rows`,
94+
1500
95+
);
96+
})
97+
.catch((err) => {
98+
const errMsg = `Error removing ${removedOption.label}`;
99+
LOGGER.error(errMsg, err);
100+
new Notice(errMsg, 3000);
101+
});
102+
columnHandlerResponse.columnSettingsManager.modal.enableReset =
103+
true;
80104
// Force refresh of settings
81105
columnSettingsManager.reset(columnHandlerResponse);
82106
});

src/stateManagement/columns/handlers/AlterColumnLabelAction.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export default class AlterColumnLabelHandlerAction extends AbstractTableAction<C
1919
alteredColumns[labelIndex].accessorKey = newKey;
2020
// Update configuration & row files on disk
2121
view.diskConfig.updateColumnKey(column.id, newKey, newLabel);
22-
console.log(alteredColumns);
2322
return { columns: alteredColumns };
2423
});
2524
tableActionResponse.implementation = implementation;

src/stateManagement/data/DataStateActions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import RemoveRowHandlerAction from "stateManagement/data/handlers/RemoveRowHandl
77
import RemoveDataOfColumnHandlerAction from "stateManagement/data/handlers/RemoveDataOfColumnHandlerAction";
88
import ParseDataOfColumnHandlerAction from "stateManagement/data/handlers/ParseDataOfColumnHandlerAction";
99
import DataviewRefreshHandlerAction from "stateManagement/data/handlers/DataviewRefreshHandlerAction";
10+
import RemoveOptionForAllRowsAction from "stateManagement/data/handlers/RemoveOptionForAllRowsAction";
1011
import { AbstractHandler } from "patterns/AbstractHandler";
1112

1213
class DataStateActions extends AbstractChain<TableActionResponse<DataState>> {
@@ -18,7 +19,8 @@ class DataStateActions extends AbstractChain<TableActionResponse<DataState>> {
1819
new UpdateDataAfterLabelChangeHandlerAction(),
1920
new RemoveRowHandlerAction(),
2021
new RemoveDataOfColumnHandlerAction(),
21-
new DataviewRefreshHandlerAction()
22+
new DataviewRefreshHandlerAction(),
23+
new RemoveOptionForAllRowsAction()
2224
];
2325
}
2426
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { TableColumn } from "cdm/FolderModel";
2+
import { LocalSettings } from "cdm/SettingsModel";
3+
import { DataState, TableActionResponse } from "cdm/TableStateInterface";
4+
import { InputType, UpdateRowOptions } from "helpers/Constants";
5+
import { updateRowFileProxy } from "helpers/VaultManagement";
6+
import { Literal } from "obsidian-dataview";
7+
import { AbstractTableAction } from "stateManagement/AbstractTableAction";
8+
9+
export default class RemoveOptionForAllRowsAction extends AbstractTableAction<DataState> {
10+
handle(tableActionResponse: TableActionResponse<DataState>): TableActionResponse<DataState> {
11+
const { get, implementation } = tableActionResponse;
12+
implementation.actions.removeOptionForAllRows = async (column: TableColumn, option: string, columns: TableColumn[],
13+
ddbbConfig: LocalSettings) => {
14+
let lambdaFilter = (cellValue: Literal) => {
15+
return (cellValue?.toString().length > 0 && cellValue?.toString() === option);
16+
};
17+
switch (column.input) {
18+
case InputType.TAGS:
19+
lambdaFilter = (cellValue: Literal) => {
20+
const array = Array.isArray(cellValue)
21+
? (cellValue as Literal[])
22+
: []
23+
return array.length > 0 && array.some(value => value?.toString() === option);
24+
}
25+
break;
26+
default:
27+
// Do nothing
28+
}
29+
const rowCandidates = get().rows.filter((row) => {
30+
return lambdaFilter(row[column.id] as Literal);
31+
});
32+
rowCandidates.map((row) => {
33+
const rowTFile = row.__note__.getFile();
34+
switch (column.input) {
35+
case InputType.TAGS:
36+
row[column.id] = Array.isArray(
37+
row[column.id] as Literal
38+
) ?
39+
(
40+
row[column.id] as Literal[]
41+
)
42+
.filter(value => value !== option) :
43+
[];
44+
break;
45+
default:
46+
row[column.id] = "";
47+
}
48+
updateRowFileProxy(
49+
rowTFile,
50+
column.id,
51+
row[column.id] as Literal,
52+
columns,
53+
ddbbConfig,
54+
UpdateRowOptions.COLUMN_VALUE
55+
);
56+
});
57+
}
58+
tableActionResponse.implementation = implementation;
59+
return this.goNext(tableActionResponse);
60+
}
61+
}

src/stateManagement/data/handlers/UpdateDataAfterLabelChangeHandlerAction.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ export default class UpdateDataAfterLabelChangeHandlerAction extends AbstractTab
2424
});
2525

2626
// Save on memory
27-
console.log(state.rows);
2827
const alterRows = state.rows.map((row) => {
2928
row[newKey] = row[column.id];
3029
delete row[column.id];
3130
return row;
3231
});
33-
console.log(alterRows);
3432
return { rows: alterRows };
3533
}
3634
);

src/stateManagement/useDataStore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function mockDataState(): DataState {
3030
updateDataAfterLabelChange: null,
3131
removeRow: null,
3232
removeDataOfColumn: null,
33+
removeOptionForAllRows: null,
3334
parseDataOfColumn: null,
3435
dataviewRefresh: null,
3536
},

0 commit comments

Comments
 (0)