Gridstack.js — это библиотека для динамических сеточных интерфейсов с поддержкой drag-and-drop. Для работы с ней необходимо подключить CSS и JS-файлы. Наиболее распространённый способ — через CDN:
<link href="https://cdn.jsdelivr.net/npm/gridstack@8.2.3/dist/gridstack.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/gridstack@8.2.3/dist/gridstack-h5.js"></script>
Для современных проектов с npm:
npm install gridstack
import { GridStack } from 'gridstack';
import 'gridstack/dist/h5/gridstack-dd-native';
import 'gridstack/dist/gridstack.min.css';
После подключения можно инициализировать сетку:
const grid = GridStack.init({
column: 12,
float: true,
resizable: { handles: 'e, se, s, sw, w' },
});
Gridstack.js предоставляет гибкие механизмы, позволяющие ограничивать действия пользователей внутри сетки. Основные способы ограничения:
Ограничение перетаскивания (drag) С помощью
опции disableDrag можно полностью запретить пользователю
перемещать виджеты:
const grid = GridStack.init({ disableDrag: true });
Для отдельных элементов:
grid.makeWidget(document.querySelector('#widget1'));
grid.disableMove(document.querySelector('#widget1'));Ограничение изменения размера (resize) Опция
disableResize предотвращает изменение размеров
виджетов:
const grid = GridStack.init({ disableResize: true });
Для отдельного элемента:
grid.disableResize(document.querySelector('#widget2'));Ограничение перемещения за границы сетки Gridstack позволяет настроить границы сетки, чтобы виджеты не выходили за пределы:
const grid = GridStack.init({
column: 12,
float: false,
cellHeight: 80,
disableOneColumnMode: true,
});
Можно контролировать перемещение через события:
grid.on('change', function(event, items) {
items.forEach(item => {
if(item.x + item.w > 12) {
item.x = 12 - item.w;
grid.update(item.el, item);
}
});
});Gridstack.js поддерживает событийную модель, позволяющую ограничивать действия на основе логики приложения:
dragstart,
drag, dragstop.resizestart, resize,
resizestop.Пример запрета перемещения для пользователя с ролью «viewer»:
grid.on('dragstart', function(event, el) {
if(user.role === 'viewer') {
event.preventDefault();
}
});
Аналогично для изменения размеров:
grid.on('resizestart', function(event, el) {
if(user.role === 'viewer') {
event.preventDefault();
}
});
Gridstack позволяет контролировать создание и удаление элементов через API:
grid.addWidget()grid.removeWidget()Можно создавать условие на основе прав доступа:
function addWidget(widgetOptions) {
if(user.role === 'editor') {
grid.addWidget(widgetOptions);
} else {
console.warn('Недостаточно прав для добавления виджета');
}
}
function removeWidget(widgetEl) {
if(user.role === 'editor') {
grid.removeWidget(widgetEl);
} else {
console.warn('Удаление виджета запрещено');
}
}
Для полноценного контроля доступа часто используется проверка данных перед их отображением. Gridstack.js хранит состояние сетки в JSON:
const serialized = grid.save();
Можно фильтровать виджеты на основе прав пользователя:
const filteredWidgets = serialized.filter(widget => user.canAccess(widget.id));
grid.load(filteredWidgets);
Дополнительно, можно визуально блокировать элементы для определённых пользователей, добавляя классы:
.widget-locked {
pointer-events: none;
opacity: 0.5;
}
Применение к виджету:
if(user.role !== 'editor') {
document.querySelector('#widget3').classList.add('widget-locked');
}
Gridstack поддерживает адаптивность, но для предотвращения нежелательных действий на мобильных устройствах можно отключить touch-события:
const grid = GridStack.init({
disableDrag: window.innerWidth < 768,
disableResize: window.innerWidth < 768,
});
Все ограничения в Gridstack.js можно связать с системой авторизации приложения. Например, используя JWT или сессии, можно динамически включать или отключать возможность редактирования:
fetch('/api/user')
.then(res => res.json())
.then(user => {
if(user.role !== 'admin') {
grid.disableMove();
grid.disableResize();
}
});
disableDrag, disableResize) — блокируют все
действия для всех виджетов.disableMove, disableResize) — блокировка на
уровне конкретного элемента.Эти механизмы позволяют гибко управлять доступом и обеспечивать безопасность взаимодействия с динамическими сетками в Gridstack.js.