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

Commit fd7a899

Browse files
committed
header menu refactor part 1
1 parent b331dbd commit fd7a899

18 files changed

+160
-177
lines changed

src/cdm/HeaderActionModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export type HeaderActionResponse = {
44
buttons: JSX.Element[]
55
headerMenuProps: HeaderMenuProps
66
hooks: {
7-
setExpanded: (expanded: boolean) => void,
7+
setMenuEl: (expanded: null | HTMLElement) => void,
88
setKeyState: (key: string) => void,
99
keyState: string,
1010
[key: string]: any | ((a: any) => void)

src/cdm/HeaderModel.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ import { DatabaseHeaderProps, RowDataType, TableColumn } from "cdm/FolderModel";
44
export type HeaderMenuProps = {
55
headerProps: DatabaseHeaderProps;
66
propertyIcon: JSX.Element;
7-
expanded: boolean;
8-
setExpanded: (expanded: boolean) => void;
9-
created: boolean;
7+
menuEl: null | HTMLElement;
8+
setMenuEl: (menuEl: null | HTMLElement) => void;
109
referenceElement: HTMLDivElement;
1110
labelState: string;
1211
setLabelState: (label: string) => void;

src/components/DefaultHeader.tsx

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from "react";
1+
import React, { MouseEventHandler, useState } from "react";
22
import TextIcon from "components/img/Text";
33
import MultiIcon from "components/img/Multi";
44
import HashIcon from "components/img/Hash";
@@ -31,8 +31,6 @@ import { AddColumnModalProps } from "cdm/ModalsModel";
3131
*/
3232
export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
3333
LOGGER.debug(`=>Header ${headerProps.column.columnDef}`);
34-
// TODO : add a tooltip to the header
35-
const created: boolean = false;
3634
/** Properties of header */
3735
const { header, table } = headerProps;
3836
const { tableState } = table.options.meta;
@@ -47,7 +45,7 @@ export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
4745
/** Column values */
4846
const { id, input, label, config } = header.column.columnDef as TableColumn;
4947
/** reducer asociated to database */
50-
const [expanded, setExpanded] = useState(created || false);
48+
const [menuEl, setMenuEl] = useState<null | HTMLElement>(null);
5149
const [referenceElement, setReferenceElement] = useState(null);
5250
const [labelState, setLabelState] = useState(label);
5351

@@ -110,12 +108,16 @@ export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
110108
new AddColumnModal(table.options.meta.view, addColumnProps).open();
111109
}
112110

111+
const openMenuHandler: MouseEventHandler<HTMLDivElement> = (event) => {
112+
setMenuEl(menuEl ? null : event.currentTarget);
113+
};
114+
113115
LOGGER.debug(`<=Header ${label}`);
114116
return id !== MetadataColumns.ADD_COLUMN ? (
115117
<>
116118
<div
117119
className={`${c("th-content")}`}
118-
onClick={() => setExpanded(true)}
120+
onClick={openMenuHandler}
119121
ref={setReferenceElement}
120122
>
121123
<span className="svg-icon svg-gray icon-margin">{propertyIcon}</span>
@@ -139,19 +141,15 @@ export default function DefaultHeader(headerProps: DatabaseHeaderProps) {
139141
</span>
140142
)}
141143
</div>
142-
{ReactDOM.createPortal(
143-
<HeaderMenu
144-
headerProps={headerProps}
145-
propertyIcon={propertyIcon}
146-
expanded={expanded}
147-
setExpanded={setExpanded}
148-
created={created}
149-
referenceElement={referenceElement}
150-
labelState={labelState}
151-
setLabelState={setLabelState}
152-
/>,
153-
activeDocument.body
154-
)}
144+
<HeaderMenu
145+
headerProps={headerProps}
146+
propertyIcon={propertyIcon}
147+
menuEl={menuEl}
148+
setMenuEl={setMenuEl}
149+
referenceElement={referenceElement}
150+
labelState={labelState}
151+
setLabelState={setLabelState}
152+
/>
155153
</>
156154
) : (
157155
<div

0 commit comments

Comments
 (0)