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

Commit 5b7fca0

Browse files
committed
react color
1 parent c9d4731 commit 5b7fca0

File tree

6 files changed

+161
-3
lines changed

6 files changed

+161
-3
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"@types/node": "17.0.31",
2929
"@types/react": "17.0.43",
3030
"@types/react-dom": "17.0.14",
31+
"@types/react-color": "3.0.6",
3132
"@types/react-table": "7.7.11",
3233
"@types/react-window": "1.8.5",
3334
"@types/react-datepicker": "4.4.1",
@@ -60,7 +61,8 @@
6061
"react-dom": "17.0.2",
6162
"react-csv": "2.2.2",
6263
"react-popper": "2.3.0",
63-
"react-table": "7.7.0",
64+
"react-table": "7.8.0",
65+
"react-color": "2.19.3",
6466
"react-window": "1.8.7",
6567
"react-datepicker": "4.8.0",
6668
"regenerator-runtime": "0.13.9",

src/cdm/StyleModel.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1+
import { DatabaseView } from "DatabaseView";
2+
import { ColorResult } from "react-color";
3+
import { RowSelectOption } from "./RowSelectModel";
4+
15
export type ColumnWidthState = {
26
widthRecord: Record<string, number>
37
}
48

59
export type HeaderContextType = {
610
columnWidthState: ColumnWidthState,
711
setColumnWidthState: (a: ColumnWidthState) => void
8-
}
12+
}
13+
14+
export type ColorPickerProps = {
15+
view: DatabaseView;
16+
options: RowSelectOption[];
17+
option: RowSelectOption;
18+
columnKey: string;
19+
};

src/components/ColorPicker.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { ColorPickerProps } from "cdm/StyleModel";
2+
import React from "react";
3+
import { ColorResult, SketchPicker } from "react-color";
4+
import { castHslToString } from "./styles/ColumnWidthStyle";
5+
6+
export function ColorPicker(colorPickerProps: ColorPickerProps) {
7+
const { view, options, option, columnKey } = colorPickerProps;
8+
const [colorState, setColorState] = React.useState(option.backgroundColor);
9+
const [labelState, setLabelState] = React.useState(option.label);
10+
const [showColorPicker, setShowColorPicker] = React.useState(false);
11+
/**
12+
* Manage color picker
13+
*/
14+
async function handleChange(color: ColorResult, event: any) {
15+
setColorState(castHslToString(color.hsl));
16+
setShowColorPicker(false);
17+
option.backgroundColor = castHslToString(color.hsl);
18+
19+
// Persist changes
20+
await view.diskConfig.updateColumnConfig(columnKey, {
21+
options: options,
22+
});
23+
}
24+
25+
return (
26+
<>
27+
<span
28+
className="colorPicker"
29+
onClick={() => setShowColorPicker(!showColorPicker)}
30+
style={{ backgroundColor: colorState, padding: "5px" }}
31+
>
32+
{labelState}
33+
</span>
34+
{showColorPicker && (
35+
<SketchPicker color={colorState} onChange={handleChange} />
36+
)}
37+
</>
38+
);
39+
}

src/components/modals/ColumnSections.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { add_setting_header } from "settings/SettingsComponents";
33
import { MediaDimensionsHandler } from "components/modals/handlers/MediaDimensionsHandler";
44
import { MediaToggleHandler } from "components/modals/handlers/MediaToggleHandler";
55
import { InlineToggleHandler } from "components/modals/handlers/InlineToggleHandler";
6+
import { ColumnHandler } from "./handlers/AbstractColumnHandler";
7+
import { DataTypes } from "helpers/Constants";
8+
import { SelectedColumnOptionsHandler } from "./handlers/SelectedColumnOptionsHandler";
69

710
export function behavior_settings_section(settingHandlerResponse: ColumnHandlerResponse) {
811
const behavior_section = settingHandlerResponse.containerEl.createDiv("column-section-container-behavior");
@@ -33,6 +36,7 @@ export function media_settings_section(settingHandlerResponse: ColumnHandlerResp
3336
const handlers = [
3437
new MediaToggleHandler(),
3538
new MediaDimensionsHandler(),
39+
...addParticularInputSettings(settingHandlerResponse.column.dataType)
3640
]
3741
let i = 1;
3842
while (i < handlers.length) {
@@ -42,4 +46,16 @@ export function media_settings_section(settingHandlerResponse: ColumnHandlerResp
4246

4347
settingHandlerResponse.containerEl = folder_section;
4448
return handlers[0].handle(settingHandlerResponse);
49+
}
50+
51+
function addParticularInputSettings(dataType: string): ColumnHandler[] {
52+
const particularHandlers: ColumnHandler[] = [];
53+
switch (dataType) {
54+
case DataTypes.SELECT:
55+
particularHandlers.push(new SelectedColumnOptionsHandler());
56+
break;
57+
default:
58+
break;
59+
}
60+
return particularHandlers;
4561
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { ColumnHandlerResponse } from "cdm/ModalSettingsModel";
2+
import { ColorPickerProps } from "cdm/StyleModel";
3+
import { ColorPicker } from "components/ColorPicker";
4+
import { AbstractColumnHandler } from "components/modals/handlers/AbstractColumnHandler";
5+
import { castHslToString } from "components/styles/ColumnWidthStyle";
6+
import { randomColor } from "helpers/Colors";
7+
import { ButtonComponent, Setting } from "obsidian";
8+
import React from "react";
9+
import { ColorResult } from "react-color";
10+
import ReactDOM from "react-dom";
11+
import { add_button } from "settings/SettingsComponents";
12+
13+
export class SelectedColumnOptionsHandler extends AbstractColumnHandler {
14+
settingTitle: string = "Column Options";
15+
handle(columnHandlerResponse: ColumnHandlerResponse): ColumnHandlerResponse {
16+
const { column, containerEl, view, columnSettingsManager } =
17+
columnHandlerResponse;
18+
19+
let newLabel = "";
20+
const options = column.options;
21+
const onClickAddPromise = async (): Promise<void> => {
22+
options.push({
23+
label: newLabel,
24+
backgroundColor: randomColor(),
25+
});
26+
// Persist changes
27+
view.diskConfig.updateColumnConfig(column.key, {
28+
options: options,
29+
});
30+
// Force refresh of settings
31+
columnSettingsManager.reset(columnHandlerResponse);
32+
};
33+
34+
new Setting(containerEl)
35+
.setName("Add new label")
36+
.setDesc(
37+
"Adds a new filter to the dataview query when the database is initialized"
38+
)
39+
.addText((text) => {
40+
text
41+
.setPlaceholder("label of option")
42+
.setValue("")
43+
.onChange(async (value: string): Promise<void> => {
44+
newLabel = value;
45+
});
46+
})
47+
.addButton((button: ButtonComponent) => {
48+
button
49+
.setTooltip("Adds new option of Selected column")
50+
.setButtonText("+")
51+
.setCta()
52+
.onClick(onClickAddPromise);
53+
});
54+
55+
options.forEach((option, index) => {
56+
const colorPickerProps: ColorPickerProps = {
57+
view: view,
58+
options: options,
59+
option: option,
60+
columnKey: column.key,
61+
};
62+
63+
const optionContainer = new Setting(containerEl).addExtraButton((cb) => {
64+
cb.setIcon("cross")
65+
.setTooltip("Delete")
66+
.onClick(async (): Promise<void> => {
67+
options.splice(index, 1);
68+
// Persist changes
69+
await view.diskConfig.updateColumnConfig(column.key, {
70+
options: options,
71+
});
72+
// Force refresh of settings
73+
columnSettingsManager.reset(columnHandlerResponse);
74+
});
75+
});
76+
77+
ReactDOM.render(
78+
<ColorPicker {...colorPickerProps} />,
79+
optionContainer.settingEl.createDiv()
80+
);
81+
});
82+
83+
return this.goNext(columnHandlerResponse);
84+
}
85+
}

src/components/styles/ColumnWidthStyle.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ColumnWidthState } from "cdm/StyleModel";
33
import { DataTypes, MetadataColumns, WidthVariables } from "helpers/Constants";
44
import { getNormalizedPath } from "helpers/VaultManagement";
55
import { DateTime } from "luxon";
6+
import { HSLColor } from "react-color";
67
import { Row } from "react-table";
78

89
export const getColumnWidthStyle = (rows: Array<Row<object>>, column: TableColumn, customMaxWidth?: number): number => {
@@ -44,5 +45,9 @@ export const getColumnsWidthStyle = (rows: Array<Row<object>>, columns: TableCol
4445
columns.forEach((column: TableColumn) => {
4546
columnWidthStyle.widthRecord[column.id] = getColumnWidthStyle(rows, column);
4647
})
47-
return columnWidthStyle
48+
return columnWidthStyle;
49+
}
50+
51+
export function castHslToString(color: HSLColor): string {
52+
return `hsl(${color.h},${color.s * 100}%,${color.l * 100}%)`;
4853
}

0 commit comments

Comments
 (0)