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

Commit d724907

Browse files
committed
still migratiog but big changes
1 parent 99e189d commit d724907

21 files changed

+367
-71
lines changed

src/cdm/DatabaseModel.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,11 @@ import { RowType } from "cdm/RowTypeModel"
22
import { Literal } from "obsidian-dataview/lib/data-model/value";
33
import { Cell } from "react-table";
44
import { LocalSettings } from "Settings"
5-
import { TableColumn, TableDataType } from "cdm/FolderModel";
5+
import { BaseColumn, TableColumn, TableDataType } from "cdm/FolderModel";
66

77
/** database column */
8-
export interface DatabaseColumn {
8+
export interface DatabaseColumn extends BaseColumn {
99
input: string;
10-
accessor: string;
11-
label: string;
12-
key: string;
13-
position?: number;
14-
isMetadata?: boolean;
15-
skipPersist?: boolean;
16-
csvCandidate?: boolean;
17-
isInline?: boolean;
1810
[key: string]: RowType;
1911
}
2012

src/cdm/FolderModel.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { DatabaseView } from "DatabaseView";
22
import { Dispatch } from "react";
33
import StateManager from "StateManager";
4-
import { RowType } from "cdm/RowTypeModel";
54
import { RowSelectOption } from "cdm/RowSelectModel";
65
import NoteInfo from "services/NoteInfo";
76
import { TFile } from "obsidian";
8-
import { DatabaseColumn } from "cdm/DatabaseModel";
97
import { Column } from "react-table";
108
import { Literal } from "obsidian-dataview/lib/data-model/value";
119

@@ -35,23 +33,33 @@ export type Models = {
3533
[key: string]: FolderModel
3634
}
3735

38-
export interface TableColumn {
39-
id: string;
36+
export interface ConfigColumn {
37+
enable_media_view: boolean;
38+
media_width: number;
39+
media_height: number;
40+
isInline: boolean;
41+
[key: string]: Literal;
42+
}
43+
44+
export interface BaseColumn {
45+
csvCandidate?: boolean;
46+
accessor: string;
4047
label: string;
4148
key: string;
42-
position: number;
43-
accessor: any;
49+
position?: number;
50+
isMetadata?: boolean;
51+
skipPersist?: boolean;
52+
config: ConfigColumn;
53+
}
54+
export interface TableColumn extends BaseColumn {
55+
id: string;
4456
minWidth?: number;
4557
width?: number;
4658
dataType: string;
4759
options?: RowSelectOption[];
4860
Cell?: any;
4961
getHeaderProps?: any;
5062
getResizerProps?: any;
51-
isMetadata?: boolean;
52-
skipPersist?: boolean;
53-
isInline?: boolean;
54-
csvCandidate: boolean;
5563
}
5664

5765
export type RowDataType = {

src/cdm/RowTypeModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Link } from "obsidian-dataview";
22
import { RowSelectOption } from "cdm/RowSelectModel";
33
import NoteInfo from "services/NoteInfo";
4+
import { ConfigColumn } from "cdm/FolderModel";
45

5-
export type RowType = number | string | boolean | Date | Link | RowSelectOption[] | NoteInfo;
6+
export type RowType = number | string | boolean | Date | Link | RowSelectOption[] | NoteInfo | ConfigColumn;

src/components/Columns.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ function columnOptions(
8888
label: column.label,
8989
dataType: column.input,
9090
options: options,
91+
config: column.config,
9192
};
9293
} else {
9394
throw `Error: option ${column.input} not supported yet`;

src/components/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default function Header(headerProps: DatabaseHeaderProps) {
5858
const [expanded, setExpanded] = useState(created || false);
5959
const [domReady, setDomReady] = useState(false);
6060
const [referenceElement, setReferenceElement] = useState(null);
61-
const [isInline, setIsInline] = useState(headerProps.column.isInline);
61+
const [isInline, setIsInline] = useState(headerProps.column.config.isInline);
6262
const [labelState, setLabelState] = useState(headerProps.column.label);
6363
React.useEffect(() => {
6464
setDomReady(true);

src/components/HeaderMenu.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { usePopper } from "react-popper";
2323
import { HeaderContext } from "components/contexts/HeaderContext";
2424
import { getColumnWidthStyle } from "components/styles/ColumnWidthStyle";
2525
import { FormControlLabel, FormGroup, Switch } from "@material-ui/core";
26+
import { ColumnModal } from "./modals/ColumnModal";
2627

2728
type HeaderMenuProps = {
2829
headerProps: DatabaseHeaderProps;
@@ -459,16 +460,19 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
459460
<div style={{ padding: "4px 0px" }}>
460461
<div
461462
className="menu-item sort-button"
462-
onMouseEnter={() => setShowSettings(true)}
463-
onMouseLeave={() => setShowSettings(false)}
463+
// onMouseEnter={() => setShowSettings(true)}
464+
// onMouseLeave={() => setShowSettings(false)}
465+
onClick={() =>
466+
new ColumnModal(initialState.view, column).open()
467+
}
464468
ref={setSettingsReferenceElement}
465469
>
466470
<span className="svg-icon svg-text icon-margin">
467471
<AdjustmentsIcon />
468472
</span>
469473
<span>Settings</span>
470474
</div>
471-
{showSettings && (
475+
{/* {showSettings && (
472476
<div
473477
className={`menu ${c("popper")}`}
474478
ref={setSettingsPopperElement}
@@ -494,7 +498,7 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
494498
/>
495499
</FormGroup>
496500
</div>
497-
)}
501+
)} */}
498502
</div>
499503
</div>
500504
)}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { TableColumn } from "cdm/FolderModel";
2+
import { DatabaseView } from "DatabaseView";
3+
import { Modal } from "obsidian";
4+
import { add_setting_header } from "settings/SettingsComponents";
5+
import { ColumnHandler, ColumnHandlerResponse } from "components/modals/handlers/AbstractColumnHandler";
6+
import { MediaDimensionsHandler } from "components/modals/handlers/MediaDimensionsHandler";
7+
import { MediaToggleHandler } from "components/modals/handlers/MediaToggleHandler";
8+
9+
export class ColumnModal extends Modal {
10+
view: DatabaseView;
11+
column: TableColumn;
12+
constructor(
13+
view: DatabaseView,
14+
column: TableColumn
15+
) {
16+
super(view.app);
17+
this.view = view;
18+
this.column = column;
19+
}
20+
21+
onOpen() {
22+
const { contentEl, modalEl } = this;
23+
contentEl.empty();
24+
const initialResponse: ColumnHandlerResponse = {
25+
containerEl: contentEl,
26+
view: this.view,
27+
column: this.column,
28+
};
29+
folder_settings_section(initialResponse);
30+
}
31+
32+
onClose() {
33+
const { contentEl } = this;
34+
contentEl.empty();
35+
}
36+
}
37+
38+
function folder_settings_section(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
39+
const folder_section = settingHandlerResponse.containerEl.createDiv("configuration-section-container-folder");
40+
// title of the section
41+
add_setting_header(folder_section, "Folder adjustments", 'h3');
42+
// section settings
43+
const handlers = getHandlers();
44+
let i = 1;
45+
while (i < handlers.length) {
46+
handlers[i - 1].setNext(handlers[i]);
47+
i++;
48+
}
49+
50+
settingHandlerResponse.containerEl = folder_section;
51+
return handlers[0].handle(settingHandlerResponse);
52+
}
53+
54+
/**
55+
* Obtain all classes than extends from AbstractHandler
56+
*/
57+
function getHandlers(): ColumnHandler[] {
58+
return [
59+
new MediaToggleHandler(),
60+
new MediaDimensionsHandler(),
61+
];
62+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { TableColumn } from "cdm/FolderModel";
2+
import { DatabaseView } from "DatabaseView";
3+
4+
export type ColumnHandlerResponse = {
5+
containerEl: HTMLElement,
6+
view: DatabaseView,
7+
column: TableColumn,
8+
}
9+
10+
export interface ColumnHandler {
11+
setNext(handler: ColumnHandler): ColumnHandler;
12+
handle(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse;
13+
}
14+
15+
export abstract class AbstractColumnHandler implements ColumnHandler {
16+
abstract settingTitle: string;
17+
protected nextHandler: ColumnHandler;
18+
19+
20+
public goNext(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
21+
// Check next handler
22+
if (this.nextHandler) {
23+
return this.nextHandler.handle(settingHandlerResponse);
24+
}
25+
return settingHandlerResponse;
26+
}
27+
28+
public setNext(handler: ColumnHandler): ColumnHandler {
29+
this.nextHandler = handler;
30+
return handler;
31+
}
32+
33+
34+
abstract handle(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse;
35+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Setting } from "obsidian";
2+
import { AbstractColumnHandler, ColumnHandlerResponse } from "components/modals/handlers/AbstractColumnHandler";
3+
4+
export class MediaDimensionsHandler extends AbstractColumnHandler {
5+
settingTitle: string = 'Choose dimensions of embeded media';
6+
handle(columnHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
7+
const { column, containerEl, view } = columnHandlerResponse;
8+
const dbSettings = view.plugin.settings;
9+
const { config } = column
10+
if (config.enable_media_view) {
11+
// Check if media_settings is enabled
12+
new Setting(containerEl)
13+
.addText(text => {
14+
text.setPlaceholder("Height")
15+
.setValue(config.media_height.toString())
16+
.onChange(async (value: string): Promise<void> => {
17+
// Common modifications of value
18+
const parsedNumber = Number(value);
19+
const validatedNumber = isNaN(parsedNumber) ? config.media_height : parsedNumber;
20+
config.media_height = validatedNumber;
21+
// Persist changes in local config
22+
view.diskConfig.updateColumnConfig(column.key, {
23+
media_height: validatedNumber
24+
});
25+
})
26+
}).addText(text => {
27+
text.setPlaceholder("Width")
28+
.setValue(config.media_width.toString())
29+
.onChange(async (value: string): Promise<void> => {
30+
// Common modifications of value
31+
const parsedNumber = Number(value);
32+
const validatedNumber = isNaN(parsedNumber) ? config.media_width : parsedNumber;
33+
// Persist changes in local config
34+
view.diskConfig.updateColumnConfig(column.key, {
35+
media_width: validatedNumber
36+
});
37+
})
38+
}).addExtraButton((cb) => {
39+
cb.setIcon("reset")
40+
.setTooltip("Restart default values")
41+
.onClick(async (): Promise<void> => {
42+
// Persist change
43+
view.diskConfig.updateColumnConfig(column.key, {
44+
media_width: dbSettings.local_settings.media_settings.width,
45+
media_height: dbSettings.local_settings.media_settings.height
46+
});
47+
// Force refresh of settings
48+
//settingsManager.reset(settingHandlerResponse);
49+
});
50+
});
51+
52+
}
53+
return this.goNext(columnHandlerResponse);
54+
}
55+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { add_toggle } from "settings/SettingsComponents";
2+
import { AbstractColumnHandler, ColumnHandlerResponse } from "components/modals/handlers/AbstractColumnHandler";
3+
export class MediaToggleHandler extends AbstractColumnHandler {
4+
settingTitle: string = 'Enable media links';
5+
handle(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
6+
const { column, containerEl, view } = settingHandlerResponse;
7+
// pass if modal opened from local settings
8+
const { media_settings } = view.diskConfig.yaml.config;
9+
const media_togle_promise = async (value: boolean): Promise<void> => {
10+
media_settings.enable_media_view = value;
11+
// Check context to define correct promise
12+
// Persist value
13+
14+
view.diskConfig.updateColumnConfig(column.key, {
15+
enable_media_view: value
16+
});
17+
view.diskConfig.updateConfig('media_settings', media_settings);
18+
19+
// Force refresh of settings
20+
//settingsManager.reset(settingHandlerResponse);
21+
}
22+
add_toggle(
23+
containerEl,
24+
this.settingTitle,
25+
"Enable/disable wrap media links with embedding content",
26+
media_settings.enable_media_view,
27+
media_togle_promise
28+
);
29+
return this.goNext(settingHandlerResponse);
30+
}
31+
}

0 commit comments

Comments
 (0)