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

Commit 40c0bea

Browse files
committed
column config updated after close modal
1 parent 2b3f06d commit 40c0bea

File tree

10 files changed

+118
-131
lines changed

10 files changed

+118
-131
lines changed

src/cdm/HeaderModel.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { DatabaseHeaderProps } from "cdm/FolderModel";
2+
3+
export type HeaderMenuProps = {
4+
headerProps: DatabaseHeaderProps;
5+
setSortBy: any;
6+
propertyIcon: any;
7+
expanded: boolean;
8+
setExpanded: (expanded: boolean) => void;
9+
created: boolean;
10+
referenceElement: any;
11+
labelState: string;
12+
setLabelState: (label: string) => void;
13+
};

src/components/Header.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ 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-
console.log("headerProps", headerProps);
62-
const [isInline, setIsInline] = useState(headerProps.column.config.isInline);
6361
const [labelState, setLabelState] = useState(headerProps.column.label);
6462
React.useEffect(() => {
6563
setDomReady(true);
@@ -123,7 +121,7 @@ export default function Header(headerProps: DatabaseHeaderProps) {
123121
>
124122
<span className="svg-icon svg-gray icon-margin">{propertyIcon}</span>
125123
{labelState}
126-
{isInline && <span>*</span>}
124+
{headerProps.column.config.isInline && <span>*</span>}
127125
</div>
128126
{domReady
129127
? ReactDOM.createPortal(
@@ -137,8 +135,6 @@ export default function Header(headerProps: DatabaseHeaderProps) {
137135
referenceElement={referenceElement}
138136
labelState={labelState}
139137
setLabelState={setLabelState}
140-
isInline={isInline}
141-
setIsInline={setIsInline}
142138
/>,
143139
document.getElementById("popper-container")
144140
)

src/components/HeaderMenu.tsx

Lines changed: 2 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { DatabaseHeaderProps } from "cdm/FolderModel";
21
import {
32
ActionTypes,
43
DataTypes,
@@ -22,22 +21,9 @@ import { Column } from "react-table";
2221
import { usePopper } from "react-popper";
2322
import { HeaderContext } from "components/contexts/HeaderContext";
2423
import { getColumnWidthStyle } from "components/styles/ColumnWidthStyle";
25-
import { FormControlLabel, FormGroup, Switch } from "@material-ui/core";
2624
import { ColumnModal } from "./modals/ColumnModal";
25+
import { HeaderMenuProps } from "cdm/HeaderModel";
2726

28-
type HeaderMenuProps = {
29-
headerProps: DatabaseHeaderProps;
30-
setSortBy: any;
31-
propertyIcon: any;
32-
expanded: boolean;
33-
setExpanded: (expanded: boolean) => void;
34-
created: boolean;
35-
referenceElement: any;
36-
labelState: string;
37-
setLabelState: (label: string) => void;
38-
isInline: boolean;
39-
setIsInline: (isInline: boolean) => void;
40-
};
4127
const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
4228
/** state of width columns */
4329
const { columnWidthState, setColumnWidthState } = useContext(HeaderContext);
@@ -51,8 +37,6 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
5137
referenceElement,
5238
labelState,
5339
setLabelState,
54-
isInline,
55-
setIsInline,
5640
} = headerMenuProps;
5741
const { column, rows, initialState } = headerMenuProps.headerProps;
5842
const dispatch = (headerMenuProps.headerProps as any).dataDispatch;
@@ -69,12 +53,6 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
6953
const [typePopperElement, setTypePopperElement] = useState(null);
7054
const [showType, setShowType] = useState(false);
7155

72-
// Manage settings
73-
const [settingsReferenceElement, setSettingsReferenceElement] =
74-
useState(null);
75-
const [settingsPopperElement, setSettingsPopperElement] = useState(null);
76-
const [showSettings, setShowSettings] = useState(false);
77-
7856
// Manage errors
7957
const [labelStateInvalid, setLabelStateInvalid] = useState(false);
8058

@@ -241,15 +219,6 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
241219
strategy: "fixed",
242220
});
243221

244-
const settingsPopper = usePopper(
245-
settingsReferenceElement,
246-
settingsPopperElement,
247-
{
248-
placement: "auto",
249-
strategy: "fixed",
250-
}
251-
);
252-
253222
function persistLabelChange(newKey: string) {
254223
const futureOrder = headerMenuProps.headerProps.allColumns.map(
255224
(o: Column) => (o.id === column.id ? newKey : o.id)
@@ -318,15 +287,6 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
318287
return { name: columnName, position: wantedPosition, label: columnLabel };
319288
}
320289

321-
function handleChangeToggleInlineFrontmatter(e: any) {
322-
setIsInline(e.target.checked);
323-
dispatch({
324-
type: ActionTypes.TOGGLE_INLINE_FRONTMATTER,
325-
columnId: column.id,
326-
isInline: e.target.checked,
327-
});
328-
}
329-
330290
return (
331291
<div>
332292
{expanded && (
@@ -460,45 +420,15 @@ const HeaderMenu = (headerMenuProps: HeaderMenuProps) => {
460420
<div style={{ padding: "4px 0px" }}>
461421
<div
462422
className="menu-item sort-button"
463-
// onMouseEnter={() => setShowSettings(true)}
464-
// onMouseLeave={() => setShowSettings(false)}
465423
onClick={() =>
466-
new ColumnModal(initialState.view, column).open()
424+
new ColumnModal(initialState.view, headerMenuProps).open()
467425
}
468-
ref={setSettingsReferenceElement}
469426
>
470427
<span className="svg-icon svg-text icon-margin">
471428
<AdjustmentsIcon />
472429
</span>
473430
<span>Settings</span>
474431
</div>
475-
{/* {showSettings && (
476-
<div
477-
className={`menu ${c("popper")}`}
478-
ref={setSettingsPopperElement}
479-
onMouseEnter={() => setShowSettings(true)}
480-
onMouseLeave={() => setShowSettings(false)}
481-
{...settingsPopper.attributes.popper}
482-
style={{
483-
...settingsPopper.styles.popper,
484-
width: 200,
485-
zIndex: 4,
486-
padding: "4px 0px",
487-
}}
488-
>
489-
<FormGroup>
490-
<FormControlLabel
491-
control={
492-
<Switch
493-
checked={isInline}
494-
onChange={handleChangeToggleInlineFrontmatter}
495-
/>
496-
}
497-
label="Inline"
498-
/>
499-
</FormGroup>
500-
</div>
501-
)} */}
502432
</div>
503433
</div>
504434
)}

src/components/markdown/MarkdownRenderer.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ export async function renderMarkdown(
1414
try {
1515
const view = (cell as any).initialState.view;
1616
const column = cell.column as unknown as DatabaseColumn;
17-
if (isValidHttpUrl(markdownString, column)) {
18-
const { height, width } = view.diskConfig.yaml.config.media_settings;
17+
const { media_height, media_width, enable_media_view } = column.config;
18+
if (enable_media_view && isValidHttpUrl(markdownString)) {
1919
// TODO option to generate Iframes
2020
//markdownString = `<div class=iframe-container> <iframe width="427" height="240" src="${markdownString}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div>`;
21-
markdownString = `![embedded link|${height}x${width}](${markdownString})`;
21+
markdownString = `![embedded link|${media_height}x${media_width}](${markdownString})`;
2222
}
2323

2424
await MarkdownRenderer.renderMarkdown(
@@ -130,7 +130,7 @@ function handleVideo(el: HTMLElement, file: TFile, view: DatabaseView) {
130130
el.addClasses(["media-embed", "is-loaded"]);
131131
}
132132

133-
function isValidHttpUrl(urlCandidate: string, column: DatabaseColumn) {
133+
function isValidHttpUrl(urlCandidate: string) {
134134
let url;
135135

136136
try {
@@ -139,8 +139,5 @@ function isValidHttpUrl(urlCandidate: string, column: DatabaseColumn) {
139139
return false;
140140
}
141141

142-
return (
143-
(url.protocol === "http:" || url.protocol === "https:") &&
144-
column.config.enable_media_view
145-
);
142+
return url.protocol === "http:" || url.protocol === "https:";
146143
}
Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
import { TableColumn } from "cdm/FolderModel";
1+
import { ConfigColumn, TableColumn } from "cdm/FolderModel";
22
import { DatabaseView } from "DatabaseView";
33
import { Modal } from "obsidian";
44
import { add_setting_header } from "settings/SettingsComponents";
5-
import { ColumnHandler } from "components/modals/handlers/AbstractColumnHandler";
6-
import { MediaDimensionsHandler } from "components/modals/handlers/MediaDimensionsHandler";
7-
import { MediaToggleHandler } from "components/modals/handlers/MediaToggleHandler";
8-
import { StyleClasses } from "helpers/Constants";
5+
import { ActionTypes, StyleClasses } from "helpers/Constants";
96
import { ColumnHandlerResponse } from "cdm/ModalSettingsModel";
7+
import { media_settings_section, behavior_settings_section } from "components/modals/ColumnSections";
8+
import { HeaderMenuProps } from "cdm/HeaderModel";
9+
import { Dispatch } from "react";
1010

1111
export class ColumnModal extends Modal {
1212
view: DatabaseView;
13-
column: TableColumn;
13+
headerMenuProps: HeaderMenuProps;
1414
columnSettingsManager: ColumnSettingsManager;
1515
constructor(
1616
view: DatabaseView,
17-
column: TableColumn
17+
headerMenuProps: HeaderMenuProps
1818
) {
1919
super(view.app);
2020
this.view = view;
21-
this.column = column;
22-
this.columnSettingsManager = new ColumnSettingsManager(this.view, this.column);
21+
this.headerMenuProps = headerMenuProps;
22+
this.columnSettingsManager = new ColumnSettingsManager(this.view, this.headerMenuProps.headerProps.column);
2323
}
2424

2525
onOpen() {
@@ -28,12 +28,11 @@ export class ColumnModal extends Modal {
2828
this.columnSettingsManager.constructUI(contentEl);
2929
}
3030

31-
reset(columnHandlerResponse: ColumnHandlerResponse) {
32-
33-
}
34-
3531
onClose() {
3632
const { contentEl } = this;
33+
handleColumnChanges(
34+
(this.headerMenuProps.headerProps as any).dataDispatch,
35+
this.headerMenuProps.headerProps.column)
3736
contentEl.empty();
3837
}
3938
}
@@ -65,6 +64,8 @@ export class ColumnSettingsManager {
6564
}
6665

6766
constructBody(settingHandlerResponse: ColumnHandlerResponse) {
67+
/** behavior section */
68+
behavior_settings_section(settingHandlerResponse);
6869
/** media section */
6970
media_settings_section(settingHandlerResponse);
7071
}
@@ -78,28 +79,10 @@ export class ColumnSettingsManager {
7879
}
7980
}
8081

81-
function media_settings_section(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
82-
const folder_section = settingHandlerResponse.containerEl.createDiv("configuration-section-container-folder");
83-
// title of the section
84-
add_setting_header(folder_section, "Media adjustments", 'h3');
85-
// section settings
86-
const handlers = getHandlers();
87-
let i = 1;
88-
while (i < handlers.length) {
89-
handlers[i - 1].setNext(handlers[i]);
90-
i++;
91-
}
92-
93-
settingHandlerResponse.containerEl = folder_section;
94-
return handlers[0].handle(settingHandlerResponse);
95-
}
96-
97-
/**
98-
* Obtain all classes than extends from AbstractHandler
99-
*/
100-
function getHandlers(): ColumnHandler[] {
101-
return [
102-
new MediaToggleHandler(),
103-
new MediaDimensionsHandler(),
104-
];
82+
function handleColumnChanges(dispatch: Dispatch<any>, column: TableColumn) {
83+
dispatch({
84+
type: ActionTypes.MODIFY_COLUMN_CONFIG,
85+
columnId: column.id,
86+
columnConfig: column.config,
87+
});
10588
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { ColumnHandlerResponse } from "cdm/ModalSettingsModel";
2+
import { add_setting_header } from "settings/SettingsComponents";
3+
import { MediaDimensionsHandler } from "components/modals/handlers/MediaDimensionsHandler";
4+
import { MediaToggleHandler } from "components/modals/handlers/MediaToggleHandler";
5+
import { InlineToggleHandler } from "components/modals/handlers/InlineToggleHandler";
6+
7+
export function behavior_settings_section(settingHandlerResponse: ColumnHandlerResponse) {
8+
const behavior_section = settingHandlerResponse.containerEl.createDiv("column-section-container-behavior");
9+
add_setting_header(behavior_section, "Behavior", "h3");
10+
/**
11+
* Obtain all classes than extends from AbstractHandler
12+
*/
13+
const handlers = [
14+
new InlineToggleHandler()
15+
]
16+
let i = 1;
17+
while (i < handlers.length) {
18+
handlers[i - 1].setNext(handlers[i]);
19+
i++;
20+
}
21+
22+
settingHandlerResponse.containerEl = behavior_section;
23+
return handlers[0].handle(settingHandlerResponse);
24+
}
25+
26+
export function media_settings_section(settingHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
27+
const folder_section = settingHandlerResponse.containerEl.createDiv("column-section-container-media");
28+
// title of the section
29+
add_setting_header(folder_section, "Media adjustments", 'h3');
30+
/**
31+
* Obtain all classes than extends from AbstractHandler
32+
*/
33+
const handlers = [
34+
new MediaToggleHandler(),
35+
new MediaDimensionsHandler(),
36+
]
37+
let i = 1;
38+
while (i < handlers.length) {
39+
handlers[i - 1].setNext(handlers[i]);
40+
i++;
41+
}
42+
43+
settingHandlerResponse.containerEl = folder_section;
44+
return handlers[0].handle(settingHandlerResponse);
45+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { add_toggle } from "settings/SettingsComponents";
2+
import { AbstractColumnHandler } from "components/modals/handlers/AbstractColumnHandler";
3+
import { ColumnHandlerResponse } from "cdm/ModalSettingsModel";
4+
export class InlineToggleHandler extends AbstractColumnHandler {
5+
settingTitle: string = 'Inline field';
6+
handle(columnHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
7+
const { column, containerEl, view } = columnHandlerResponse;
8+
const inline_togle_promise = async (value: boolean): Promise<void> => {
9+
column.config.isInline = value;
10+
// Persist value
11+
await view.diskConfig.updateColumnConfig(column.key, {
12+
isInline: value
13+
});
14+
}
15+
add_toggle(
16+
containerEl,
17+
this.settingTitle,
18+
"Convert field to inline (field:: value) or leave it as frontmatter (---field: value---)",
19+
column.config.isInline,
20+
inline_togle_promise
21+
);
22+
return this.goNext(columnHandlerResponse);
23+
}
24+
}

src/components/modals/handlers/MediaDimensionsHandler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class MediaDimensionsHandler extends AbstractColumnHandler {
2020
const validatedNumber = isNaN(parsedNumber) ? config.media_height : parsedNumber;
2121
config.media_height = validatedNumber;
2222
// Persist changes in local config
23-
view.diskConfig.updateColumnConfig(column.key, {
23+
await view.diskConfig.updateColumnConfig(column.key, {
2424
media_height: validatedNumber
2525
});
2626
})

0 commit comments

Comments
 (0)