mirror of
https://github.com/ajnart/homarr.git
synced 2025-11-15 09:46:19 +01:00
💄 Adjust grid stack
This commit is contained in:
@@ -35,9 +35,13 @@ export const GridstackTileWrapper = ({
|
||||
data-type={type}
|
||||
data-id={id}
|
||||
gs-x={x}
|
||||
data-gridstack-x={x}
|
||||
gs-y={y}
|
||||
data-gridstack-y={y}
|
||||
gs-w={width}
|
||||
data-gridstack-w={width}
|
||||
gs-h={height}
|
||||
data-gridstack-h={height}
|
||||
gs-min-w={minWidth}
|
||||
gs-min-h={minHeight}
|
||||
gs-max-w={maxWidth}
|
||||
|
||||
@@ -12,6 +12,7 @@ export const initializeGridstack = (
|
||||
items: AppType[],
|
||||
widgets: IWidget<string, any>[],
|
||||
isEditMode: boolean,
|
||||
isLargerThanSm: boolean,
|
||||
events: {
|
||||
onChange: (changedNode: GridStackNode) => void;
|
||||
onAdd: (addedNode: GridStackNode) => void;
|
||||
@@ -19,7 +20,7 @@ export const initializeGridstack = (
|
||||
) => {
|
||||
if (!wrapperRef.current) return;
|
||||
// calculates the currently available count of columns
|
||||
const columnCount = areaType === 'sidebar' ? 4 : 12;
|
||||
const columnCount = areaType === 'sidebar' ? 4 : isLargerThanSm || typeof isLargerThanSm === 'undefined' ? 12 : 6;
|
||||
const minRow = areaType !== 'sidebar' ? 1 : Math.floor(wrapperRef.current.offsetHeight / 64);
|
||||
// initialize gridstack
|
||||
const newGrid = gridRef;
|
||||
|
||||
@@ -11,11 +11,13 @@ import {
|
||||
import { useConfigContext } from '../../../../config/provider';
|
||||
import { useConfigStore } from '../../../../config/store';
|
||||
import { useResize } from '../../../../hooks/use-resize';
|
||||
import { useScreenLargerThan } from '../../../../hooks/useScreenLargerThan';
|
||||
import { AppType } from '../../../../types/app';
|
||||
import { AreaType } from '../../../../types/area';
|
||||
import { IWidget } from '../../../../widgets/widgets';
|
||||
import { useEditModeStore } from '../../Views/useEditModeStore';
|
||||
import { initializeGridstack } from './init-gridstack';
|
||||
import { ShapeType } from '../../../../types/shape';
|
||||
|
||||
interface UseGristackReturnType {
|
||||
apps: AppType[];
|
||||
@@ -31,6 +33,7 @@ export const useGridstack = (
|
||||
areaType: 'wrapper' | 'category' | 'sidebar',
|
||||
areaId: string
|
||||
): UseGristackReturnType => {
|
||||
const isLargerThanSm = useScreenLargerThan('sm');
|
||||
const isEditMode = useEditModeStore((x) => x.enabled);
|
||||
const { config, configVersion, name: configName } = useConfigContext();
|
||||
const updateConfig = useConfigStore((x) => x.updateConfig);
|
||||
@@ -78,8 +81,48 @@ export const useGridstack = (
|
||||
// change column count depending on the width and the gridRef
|
||||
useEffect(() => {
|
||||
if (areaType === 'sidebar') return;
|
||||
gridRef.current?.column(12);
|
||||
}, [gridRef, width]);
|
||||
gridRef.current?.column(isLargerThanSm || typeof isLargerThanSm === 'undefined' ? 12 : 6, (column, prevColumn, newNodes, nodes) => {
|
||||
let nextRow = 0;
|
||||
let available = 6;
|
||||
|
||||
if (column === prevColumn) {
|
||||
newNodes.concat(nodes);
|
||||
return;
|
||||
}
|
||||
|
||||
nodes.reverse().forEach(node => {
|
||||
const width = parseInt(node.el!.getAttribute('data-gridstack-w')!, 10);
|
||||
const height = parseInt(node.el!.getAttribute('data-gridstack-h')!, 10);
|
||||
const x = parseInt(node.el!.getAttribute('data-gridstack-x')!, 10);
|
||||
const y = parseInt(node.el!.getAttribute('data-gridstack-y')!, 10);
|
||||
|
||||
if (column === 6) {
|
||||
node.x = available >= width ? 6 - available : 0;
|
||||
node.y = nextRow;
|
||||
|
||||
if (width > 6) {
|
||||
node.w = 6;
|
||||
nextRow += 2;
|
||||
available = 6;
|
||||
} else if (available >= width) {
|
||||
available -= width;
|
||||
if (available === 0) {
|
||||
nextRow += 2;
|
||||
available = 6;
|
||||
}
|
||||
} else if (available < width) {
|
||||
node.y = node.y! + 2;
|
||||
available = 6 - width;
|
||||
nextRow += 2;
|
||||
}
|
||||
} else {
|
||||
node.x = y % 2 === 1 ? x + 6 : x;
|
||||
node.y = Math.floor(y / 2);
|
||||
}
|
||||
newNodes.push(node);
|
||||
});
|
||||
});
|
||||
}, [isLargerThanSm]);
|
||||
|
||||
const onChange = isEditMode
|
||||
? (changedNode: GridStackNode) => {
|
||||
@@ -236,6 +279,7 @@ export const useGridstack = (
|
||||
items,
|
||||
widgets ?? [],
|
||||
isEditMode,
|
||||
isLargerThanSm,
|
||||
{
|
||||
onChange,
|
||||
onAdd,
|
||||
|
||||
@@ -18,19 +18,19 @@
|
||||
.grid-stack>.grid-stack-item[gs-max-w="#{$i}"] { max-width: ($i / 12) * 100 + "%" }
|
||||
}
|
||||
|
||||
@for $i from 1 to 13 {
|
||||
.grid-stack>.grid-stack-item[gs-h="#{$i}"] { height: ($i / 12) * 100 + "%" }
|
||||
.grid-stack>.grid-stack-item[gs-min-h="#{$i}"] { min-height: ($i / 12) * 100 + "%" }
|
||||
.grid-stack>.grid-stack-item[gs-max-h="#{$i}"] { max-height: ($i / 12) * 100 + "%" }
|
||||
@for $i from 1 to 96 {
|
||||
.grid-stack>.grid-stack-item[gs-h="#{$i}"] { height: $i * 64 + "px" }
|
||||
.grid-stack>.grid-stack-item[gs-min-h="#{$i}"] { min-height: $i * 64 + "px" }
|
||||
.grid-stack>.grid-stack-item[gs-max-h="#{$i}"] { max-height: $i * 64 + "px" }
|
||||
}
|
||||
|
||||
@for $i from 1 to 96 {
|
||||
@for $i from 1 to 13 {
|
||||
.grid-stack>.grid-stack-item[gs-x="#{$i}"] { left: ($i / 12) * 100 + "%" }
|
||||
}
|
||||
|
||||
|
||||
@for $i from 1 to 96 {
|
||||
.grid-stack>.grid-stack-item[gs-y="#{$i}"] { top: ($i / 12) * 100 + "%" }
|
||||
.grid-stack>.grid-stack-item[gs-y="#{$i}"] { top: $i * 64 + "px" }
|
||||
}
|
||||
|
||||
.grid-stack>.grid-stack-item>.grid-stack-item-content,
|
||||
@@ -54,3 +54,19 @@
|
||||
.grid-stack.grid-stack-animate {
|
||||
transition: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
@for $i from 1 to 7 {
|
||||
.grid-stack>.grid-stack-item[gs-w="#{$i}"] { width: percentage(($i / 6)) !important }
|
||||
.grid-stack>.grid-stack-item[gs-min-w="#{$i}"] { min-width: percentage(($i / 6)) !important }
|
||||
.grid-stack>.grid-stack-item[gs-max-w="#{$i}"] { max-width: percentage(($i / 6)) !important }
|
||||
}
|
||||
|
||||
@for $i from 1 to 7 {
|
||||
.grid-stack>.grid-stack-item[gs-x="#{$i}"] { left: percentage(($i / 6)) }
|
||||
}
|
||||
|
||||
.grid-stack>.grid-stack-item {
|
||||
min-width: percentage(1/6) !important;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user