2 Commits

Author SHA1 Message Date
b09763b1eb Fixed truncate on column header 2026-02-18 21:16:11 +01:00
5724c96917 Fixed scrollbar behavior 2026-02-17 21:53:02 +01:00
6 changed files with 21 additions and 7 deletions

1
.gitignore vendored
View File

@@ -25,6 +25,7 @@ tools.db
.idea_bak .idea_bak
**/*.prof **/*.prof
**/*.db **/*.db
screenshot*
# Created by .ignore support plugin (hsz.mobi) # Created by .ignore support plugin (hsz.mobi)
### Python template ### Python template

View File

@@ -161,9 +161,10 @@
.dt2-table { .dt2-table {
--color-border: color-mix(in oklab, var(--color-base-content) 20%, #0000); --color-border: color-mix(in oklab, var(--color-base-content) 20%, #0000);
--color-resize: color-mix(in oklab, var(--color-base-content) 50%, #0000); --color-resize: color-mix(in oklab, var(--color-base-content) 50%, #0000);
height: 100%; height: fit-content;
max-height: 100%;
display: grid; display: grid;
grid-template-rows: auto 1fr auto; /* header, body, footer */ grid-template-rows: auto minmax(auto, 1fr) auto; /* header, body, footer */
overflow-x: auto; /* Enable horizontal scroll */ overflow-x: auto; /* Enable horizontal scroll */
overflow-y: hidden; /* No vertical scroll on table */ overflow-y: hidden; /* No vertical scroll on table */
scrollbar-width: none; /* Firefox: hide scrollbar */ scrollbar-width: none; /* Firefox: hide scrollbar */
@@ -225,6 +226,11 @@
width: 8px; width: 8px;
} }
/* Extra row reserved when horizontal scrollbar is visible */
.dt2-table.dt2-has-hscroll {
grid-template-rows: auto minmax(auto, 1fr) auto 8px; /* header, body, footer, scrollbar */
}
/* Horizontal scrollbar wrapper - bottom, full width minus vertical scrollbar */ /* Horizontal scrollbar wrapper - bottom, full width minus vertical scrollbar */
.dt2-scrollbars-horizontal-wrapper { .dt2-scrollbars-horizontal-wrapper {
left: 0; left: 0;

View File

@@ -225,6 +225,7 @@ function initDataGridScrollbars(gridId) {
// PHASE 3: Write all DOM properties (already in RAF) // PHASE 3: Write all DOM properties (already in RAF)
verticalWrapper.style.display = isVerticalRequired ? "block" : "none"; verticalWrapper.style.display = isVerticalRequired ? "block" : "none";
horizontalWrapper.style.display = isHorizontalRequired ? "block" : "none"; horizontalWrapper.style.display = isHorizontalRequired ? "block" : "none";
table.classList.toggle("dt2-has-hscroll", isHorizontalRequired && isVerticalRequired);
verticalScrollbar.style.height = `${scrollbarHeight}px`; verticalScrollbar.style.height = `${scrollbarHeight}px`;
horizontalScrollbar.style.width = `${scrollbarWidth}px`; horizontalScrollbar.style.width = `${scrollbarWidth}px`;
verticalScrollbar.style.top = `${verticalTop}px`; verticalScrollbar.style.top = `${verticalTop}px`;
@@ -631,7 +632,10 @@ function moveColumn(table, sourceColId, targetColId) {
function updateDatagridSelection(datagridId) { function updateDatagridSelection(datagridId) {
const selectionManager = document.getElementById(`tsm_${datagridId}`); const selectionManager = document.getElementById(`tsm_${datagridId}`);
if (!selectionManager) return; if (!selectionManager) {
console.warn(`DataGrid selection manager not found for ${datagridId}`);
return;
}
// Re-enable tooltips after drag // Re-enable tooltips after drag
const wrapper = document.getElementById(`tw_${datagridId}`); const wrapper = document.getElementById(`tw_${datagridId}`);

View File

@@ -567,7 +567,7 @@ class DataGrid(MultipleInstance):
return self.render_partial("body") return self.render_partial("body")
def on_click(self, combination, is_inside, cell_id): def on_click(self, combination, is_inside, cell_id):
logger.debug(f"on_click {combination=} {is_inside=} {cell_id=}") logger.debug(f"on_click table={self.get_table_name()} {combination=} {is_inside=} {cell_id=}")
if is_inside and cell_id: if is_inside and cell_id:
self._state.selection.extra_selected.clear() self._state.selection.extra_selected.clear()
@@ -596,7 +596,7 @@ class DataGrid(MultipleInstance):
return self.render_partial() return self.render_partial()
def on_key_pressed(self, combination, has_focus, is_inside): def on_key_pressed(self, combination, has_focus, is_inside):
logger.debug(f"on_key_pressed {combination=} {has_focus=} {is_inside=}") logger.debug(f"on_key_pressed table={self.get_table_name()} {combination=} {has_focus=} {is_inside=}")
if combination == "esc": if combination == "esc":
self._update_current_position(None) self._update_current_position(None)
self._state.selection.extra_selected.clear() self._state.selection.extra_selected.clear()
@@ -650,6 +650,7 @@ class DataGrid(MultipleInstance):
mk.label(col_def.title, icon=icons.get(col_def.type, None)), mk.label(col_def.title, icon=icons.get(col_def.type, None)),
# make room for sort and filter indicators # make room for sort and filter indicators
cls="flex truncate cursor-default", cls="flex truncate cursor-default",
data_tooltip=col_def.title,
) )
def _mk_header(col_def: DataGridColumnState): def _mk_header(col_def: DataGridColumnState):

View File

@@ -104,9 +104,9 @@ class mk:
command: Command | CommandTemplate = None, command: Command | CommandTemplate = None,
binding: Binding = None, binding: Binding = None,
**kwargs): **kwargs):
merged_cls = merge_classes("flex truncate items-center", "mf-button" if command else None, cls, kwargs) merged_cls = merge_classes("flex truncate items-center pr-2", "mf-button" if command else None, cls, kwargs)
icon_part = Span(icon, cls=f"mf-icon-{mk.convert_size(size)} mr-1") if icon else None icon_part = Span(icon, cls=f"mf-icon-{mk.convert_size(size)} mr-1") if icon else None
text_part = Span(text, cls=f"text-{size}") text_part = Span(text, cls=f"text-{size} truncate")
return mk.mk(Label(icon_part, text_part, cls=merged_cls, **kwargs), command=command, binding=binding) return mk.mk(Label(icon_part, text_part, cls=merged_cls, **kwargs), command=command, binding=binding)
@staticmethod @staticmethod

View File

@@ -88,8 +88,10 @@ class Command:
if auto_register: if auto_register:
if self._key is not None: if self._key is not None:
if self._key in CommandsManager.commands_by_key: if self._key in CommandsManager.commands_by_key:
logger.debug(f"Command {self.name} with key={self._key} will not be registered.")
self.id = CommandsManager.commands_by_key[self._key].id self.id = CommandsManager.commands_by_key[self._key].id
else: else:
logger.debug(f"Command {self.name} with key={self._key} will be registered.")
CommandsManager.register(self) CommandsManager.register(self)
else: else:
logger.warning(f"Command {self.name} has no key, it will not be registered.") logger.warning(f"Command {self.name} has no key, it will not be registered.")