diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
new file mode 100644
index 0000000..2b11178
--- /dev/null
+++ b/.github/workflows/pre-commit.yml
@@ -0,0 +1,14 @@
+name: pre-commit
+
+on:
+ pull_request:
+ push:
+ branches: [main]
+
+jobs:
+ pre-commit:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ - uses: pre-commit/action@v3.0.1
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
new file mode 100644
index 0000000..8c98299
--- /dev/null
+++ b/.github/workflows/python-publish.yml
@@ -0,0 +1,25 @@
+name: Upload Python Package
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install build
+ - name: Build package
+ run: python -m build
+ - name: Publish package
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1e487fc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,162 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+netbox_reorder_rack/static_dev/node_modules/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..a18af21
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,20 @@
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.3.0
+ hooks:
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+- repo: https://github.com/asottile/reorder-python-imports
+ rev: v3.12.0
+ hooks:
+ - id: reorder-python-imports
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ # Ruff version.
+ rev: v0.3.1
+ hooks:
+ # Run the linter.
+ - id: ruff
+ args: [ --fix ]
+ # Run the formatter.
+ - id: ruff-format
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..4db8a7d
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include netbox_reorder_rack/static *
+recursive-include netbox_reorder_rack/templates *
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3712e53
--- /dev/null
+++ b/README.md
@@ -0,0 +1,58 @@
+# Netbox Reorder Rack Plugin
+
+![Version](https://img.shields.io/pypi/v/netbox-reorder-rack) ![Downloads](https://img.shields.io/pypi/dm/netbox-reorder-rack)
+
+Allow the ability to reorder rack units in NetBox using a drag and drop interface.
+
+![Reorder Rack](docs/img/netbox-reorder-rack.gif)
+
+## Installation
+
+**_NOTE:_** For docker please see: [Docker install](https://github.com/netbox-community/netbox-docker/wiki/Using-Netbox-Plugins)
+
+The plugin is available as a Python package and can be installed with pip.
+
+Run the following commands to install the required package after activating the virtual environment:
+
+```shell
+source /opt/netbox/venv/bin/activate
+pip install netbox-reorder-rack
+```
+
+To ensure the plugin is automatically re-installed during future upgrades, create a file named `local_requirements.txt` (if it does not exist already) in the NetBox root directory (alongside `requirements.txt`) and list the `netbox-reorder-rack` package:
+
+```shell
+echo netbox-reorder-rack >> local_requirements.txt
+```
+
+Once installed, the plugin needs to be enabled in your `configuration.py`
+
+```python
+# In your configuration.py
+PLUGINS = ["netbox_reorder_rack"]
+```
+
+You may need to collect static files and restart NetBox for the plugin to be properly installed.
+
+```shell
+python3 manage.py collectstatic --no-input
+systemctl restart netbox
+```
+
+
+## Compatibility Matrix
+
+| netbox version | plugin version |
+| -------------- | ----------------------------- |
+| >= 3.7.0 | >= v1.0.0 |
+
+### Update
+
+To update the plugin, you need to update the package and restart NetBox.
+
+```shell
+source /opt/netbox/venv/bin/activate
+pip install netbox-reorder-rack
+python3 manage.py collectstatic --no-input
+systemctl restart netbox
+```
diff --git a/docs/img/development.md b/docs/img/development.md
new file mode 100644
index 0000000..c193be4
--- /dev/null
+++ b/docs/img/development.md
@@ -0,0 +1,27 @@
+# Development - Netbox Reorder Rack
+
+## Installation
+```shell
+git clone ...
+cd netbox-reorder-rack
+source /opt/netbox/venv/bin/activate
+pip install -e .
+```
+
+Edit `configuration.py` to include the plugin:
+```python
+PLUGINS = ["netbox_reorder_rack"]
+```
+
+Start the development server:
+```shell
+python3 manage.py runserver
+```
+
+## JavaScript Development
+To edit javascript you must change files contained within static_dev and then run the following command to compile the javascript:
+```shell
+node bundle.js
+```
+
+## Build
diff --git a/docs/img/netbox-reorder-rack.gif b/docs/img/netbox-reorder-rack.gif
new file mode 100644
index 0000000..aa52a7f
Binary files /dev/null and b/docs/img/netbox-reorder-rack.gif differ
diff --git a/netbox_reorder_rack/__init__.py b/netbox_reorder_rack/__init__.py
new file mode 100644
index 0000000..a19fed8
--- /dev/null
+++ b/netbox_reorder_rack/__init__.py
@@ -0,0 +1,12 @@
+from extras.plugins import PluginConfig
+
+
+class NetboxReorderRackConfig(PluginConfig):
+ name = "netbox_reorder_rack"
+ verbose_name = "NetBox Reorder Rack"
+ description = "NetBox plugin to reorder rack layouts."
+ version = "1.0.0"
+ base_url = "reorder"
+
+
+config = NetboxReorderRackConfig
diff --git a/netbox_reorder_rack/api/__init__.py b/netbox_reorder_rack/api/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/netbox_reorder_rack/api/urls.py b/netbox_reorder_rack/api/urls.py
new file mode 100644
index 0000000..3e3ebc2
--- /dev/null
+++ b/netbox_reorder_rack/api/urls.py
@@ -0,0 +1,9 @@
+from netbox.api.routers import NetBoxRouter
+
+from netbox_reorder_rack.api import views
+
+router = NetBoxRouter()
+
+router.register("save", views.SaveViewSet, basename="reorder")
+
+urlpatterns = router.urls
diff --git a/netbox_reorder_rack/api/views.py b/netbox_reorder_rack/api/views.py
new file mode 100644
index 0000000..7da30f1
--- /dev/null
+++ b/netbox_reorder_rack/api/views.py
@@ -0,0 +1,59 @@
+import decimal
+
+from dcim.models import Device
+from dcim.models import Rack
+from django.contrib.auth.mixins import PermissionRequiredMixin
+from django.db import transaction
+from django.shortcuts import get_object_or_404
+from rest_framework import serializers
+from rest_framework import status
+from rest_framework import viewsets
+from rest_framework.response import Response
+
+
+class ReorderRackSerializer(serializers.Serializer):
+ rack_id = serializers.IntegerField()
+ front = serializers.ListField(child=serializers.JSONField())
+ rear = serializers.ListField(child=serializers.JSONField())
+ other = serializers.ListField(child=serializers.JSONField())
+
+
+class SaveViewSet(PermissionRequiredMixin, viewsets.ViewSet):
+ permission_required = ["dcim.change_device", "dcim.view_device"]
+ serializer_class = ReorderRackSerializer
+ queryset = Device.objects.none()
+ schema = None
+
+ def update(self, request, pk):
+ rack = get_object_or_404(Rack, pk=pk)
+ try:
+ serializer = ReorderRackSerializer(request.data)
+ with transaction.atomic():
+ for device in rack.devices.all():
+ device.position = None
+ device.clean()
+ device.save()
+
+ for new in request.data["front"]:
+ device = rack.devices.filter(pk=new["id"]).first()
+ device.position = decimal.Decimal(new["y"])
+ device.face = new["face"]
+ device.clean()
+ device.save()
+
+ for new in request.data["rear"]:
+ device = rack.devices.filter(pk=new["id"]).first()
+ device.position = decimal.Decimal(new["y"])
+ device.face = new["face"]
+ device.clean()
+ device.save()
+
+ return Response(
+ {"message": "POST request received", "data": serializer.data},
+ status=status.HTTP_201_CREATED,
+ )
+ except Exception as e:
+ return Response(
+ {"message": "Error saving data", "error": str(e)},
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
+ )
diff --git a/netbox_reorder_rack/static/netbox_reorder_rack/css/rack.css b/netbox_reorder_rack/static/netbox_reorder_rack/css/rack.css
new file mode 100644
index 0000000..ceaa566
--- /dev/null
+++ b/netbox_reorder_rack/static/netbox_reorder_rack/css/rack.css
@@ -0,0 +1,62 @@
+/* css/rack.css */
+:root {
+ --nbx-rack-bg: #e9ecef;
+ --nbx-rack-border: #000;
+ --nbx-rack-slot-bg: #e9ecef;
+ --nbx-rack-slot-border: #adb5bd;
+ --nbx-rack-slot-hover-bg: #ced4da;
+ --nbx-rack-link-color: #0d6efd;
+ --nbx-rack-unit-color: #6c757d ;
+}
+:root[data-netbox-color-mode=dark] {
+ --nbx-rack-bg: #343a40;
+ --nbx-rack-border: #6c757d;
+ --nbx-rack-slot-bg: #343a40;
+ --nbx-rack-slot-border: #495057;
+ --nbx-rack-slot-hover-bg: #212529;
+ --nbx-rack-link-color: #9ec5fe;
+ --nbx-rack-unit-color: #6c757d ;
+}
+.device_rear {
+ background:
+ repeating-linear-gradient(
+ 45deg,
+ #f7f7f7,
+ #f7f7f7 12.5px,
+ #ffc0c0 12.5px,
+ #ffc0c0 25px);
+}
+ul.unit_numbers {
+ list-style-type: none;
+ font-size: 0.7em;
+ color: var(--nbx-rack-unit-color);
+ float: left;
+}
+ul.unit_numbers li {
+ width: 20px;
+ margin-bottom: 2px;
+ line-height: 20px;
+}
+.rack {
+ width: 217px;
+ background:
+ var(--nbx-rack-slot-bg) repeating-linear-gradient(
+ to bottom,
+ var(--nbx-rack-slot-bg) 0px,
+ var(--nbx-rack-slot-bg) 20px,
+ var(--nbx-rack-slot-border) 20px,
+ var(--nbx-rack-slot-border) 22px);
+ border: 2px solid var(--nbx-rack-unit-color);
+ float: left;
+}
+.grid-stack > .grid-stack-item[gs-w="2"] {
+ width: 100%;
+}
+.grid-stack-item > .grid-stack-item-content {
+ border: 1px solid var(--nbx-rack-slot-border);
+ border-radius: 3px;
+}
+.grid-stack-placeholder > .placeholder-content {
+ border: 1px dashed #8a8a8a;
+ background-color: #f3f3f329;
+}
diff --git a/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js b/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js
new file mode 100644
index 0000000..725a8ac
--- /dev/null
+++ b/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js
@@ -0,0 +1,4739 @@
+(() => {
+ var __create = Object.create;
+ var __defProp = Object.defineProperty;
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
+ var __getOwnPropNames = Object.getOwnPropertyNames;
+ var __getProtoOf = Object.getPrototypeOf;
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
+ var __commonJS = (cb, mod) => function __require() {
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+ };
+ var __copyProps = (to, from, except, desc) => {
+ if (from && typeof from === "object" || typeof from === "function") {
+ for (let key of __getOwnPropNames(from))
+ if (!__hasOwnProp.call(to, key) && key !== except)
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
+ }
+ return to;
+ };
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
+ // If the importer is in node compatibility mode or this is not an ESM
+ // file that has been converted to a CommonJS file using a Babel-
+ // compatible transform (i.e. "__esModule" has not been set), then set
+ // "default" to the CommonJS "module.exports" for node compatibility.
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
+ mod
+ ));
+
+ // node_modules/gridstack/dist/utils.js
+ var require_utils = __commonJS({
+ "node_modules/gridstack/dist/utils.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;
+ function obsolete(self, f, oldName, newName, rev) {
+ let wrapper = (...args) => {
+ console.warn("gridstack.js: Function `" + oldName + "` is deprecated in " + rev + " and has been replaced with `" + newName + "`. It will be **removed** in a future release");
+ return f.apply(self, args);
+ };
+ wrapper.prototype = f.prototype;
+ return wrapper;
+ }
+ exports.obsolete = obsolete;
+ function obsoleteOpts(opts, oldName, newName, rev) {
+ if (opts[oldName] !== void 0) {
+ opts[newName] = opts[oldName];
+ console.warn("gridstack.js: Option `" + oldName + "` is deprecated in " + rev + " and has been replaced with `" + newName + "`. It will be **removed** in a future release");
+ }
+ }
+ exports.obsoleteOpts = obsoleteOpts;
+ function obsoleteOptsDel(opts, oldName, rev, info) {
+ if (opts[oldName] !== void 0) {
+ console.warn("gridstack.js: Option `" + oldName + "` is deprecated in " + rev + info);
+ }
+ }
+ exports.obsoleteOptsDel = obsoleteOptsDel;
+ function obsoleteAttr(el, oldName, newName, rev) {
+ let oldAttr = el.getAttribute(oldName);
+ if (oldAttr !== null) {
+ el.setAttribute(newName, oldAttr);
+ console.warn("gridstack.js: attribute `" + oldName + "`=" + oldAttr + " is deprecated on this object in " + rev + " and has been replaced with `" + newName + "`. It will be **removed** in a future release");
+ }
+ }
+ exports.obsoleteAttr = obsoleteAttr;
+ var Utils = class _Utils {
+ /** convert a potential selector into actual list of html elements */
+ static getElements(els) {
+ if (typeof els === "string") {
+ let list = document.querySelectorAll(els);
+ if (!list.length && els[0] !== "." && els[0] !== "#") {
+ list = document.querySelectorAll("." + els);
+ if (!list.length) {
+ list = document.querySelectorAll("#" + els);
+ }
+ }
+ return Array.from(list);
+ }
+ return [els];
+ }
+ /** convert a potential selector into actual single element */
+ static getElement(els) {
+ if (typeof els === "string") {
+ if (!els.length)
+ return null;
+ if (els[0] === "#") {
+ return document.getElementById(els.substring(1));
+ }
+ if (els[0] === "." || els[0] === "[") {
+ return document.querySelector(els);
+ }
+ if (!isNaN(+els[0])) {
+ return document.getElementById(els);
+ }
+ let el = document.querySelector(els);
+ if (!el) {
+ el = document.getElementById(els);
+ }
+ if (!el) {
+ el = document.querySelector("." + els);
+ }
+ return el;
+ }
+ return els;
+ }
+ /** returns true if a and b overlap */
+ static isIntercepted(a, b) {
+ return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);
+ }
+ /** returns true if a and b touch edges or corners */
+ static isTouching(a, b) {
+ return _Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });
+ }
+ /** returns the area a and b overlap */
+ static areaIntercept(a, b) {
+ let x0 = a.x > b.x ? a.x : b.x;
+ let x1 = a.x + a.w < b.x + b.w ? a.x + a.w : b.x + b.w;
+ if (x1 <= x0)
+ return 0;
+ let y0 = a.y > b.y ? a.y : b.y;
+ let y1 = a.y + a.h < b.y + b.h ? a.y + a.h : b.y + b.h;
+ if (y1 <= y0)
+ return 0;
+ return (x1 - x0) * (y1 - y0);
+ }
+ /** returns the area */
+ static area(a) {
+ return a.w * a.h;
+ }
+ /**
+ * Sorts array of nodes
+ * @param nodes array to sort
+ * @param dir 1 for asc, -1 for desc (optional)
+ * @param width width of the grid. If undefined the width will be calculated automatically (optional).
+ **/
+ static sort(nodes, dir, column) {
+ column = column || nodes.reduce((col, n) => Math.max(n.x + n.w, col), 0) || 12;
+ if (dir === -1)
+ return nodes.sort((a, b) => b.x + b.y * column - (a.x + a.y * column));
+ else
+ return nodes.sort((b, a) => b.x + b.y * column - (a.x + a.y * column));
+ }
+ /**
+ * creates a style sheet with style id under given parent
+ * @param id will set the 'gs-style-id' attribute to that id
+ * @param parent to insert the stylesheet as first child,
+ * if none supplied it will be appended to the document head instead.
+ */
+ static createStylesheet(id, parent, options2) {
+ let style = document.createElement("style");
+ const nonce = options2 === null || options2 === void 0 ? void 0 : options2.nonce;
+ if (nonce)
+ style.nonce = nonce;
+ style.setAttribute("type", "text/css");
+ style.setAttribute("gs-style-id", id);
+ if (style.styleSheet) {
+ style.styleSheet.cssText = "";
+ } else {
+ style.appendChild(document.createTextNode(""));
+ }
+ if (!parent) {
+ parent = document.getElementsByTagName("head")[0];
+ parent.appendChild(style);
+ } else {
+ parent.insertBefore(style, parent.firstChild);
+ }
+ return style.sheet;
+ }
+ /** removed the given stylesheet id */
+ static removeStylesheet(id) {
+ let el = document.querySelector("STYLE[gs-style-id=" + id + "]");
+ if (el && el.parentNode)
+ el.remove();
+ }
+ /** inserts a CSS rule */
+ static addCSSRule(sheet, selector, rules) {
+ if (typeof sheet.addRule === "function") {
+ sheet.addRule(selector, rules);
+ } else if (typeof sheet.insertRule === "function") {
+ sheet.insertRule(`${selector}{${rules}}`);
+ }
+ }
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ static toBool(v) {
+ if (typeof v === "boolean") {
+ return v;
+ }
+ if (typeof v === "string") {
+ v = v.toLowerCase();
+ return !(v === "" || v === "no" || v === "false" || v === "0");
+ }
+ return Boolean(v);
+ }
+ static toNumber(value) {
+ return value === null || value.length === 0 ? void 0 : Number(value);
+ }
+ static parseHeight(val) {
+ let h;
+ let unit = "px";
+ if (typeof val === "string") {
+ let match = val.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);
+ if (!match) {
+ throw new Error("Invalid height");
+ }
+ unit = match[2] || "px";
+ h = parseFloat(match[1]);
+ } else {
+ h = val;
+ }
+ return { h, unit };
+ }
+ /** copies unset fields in target to use the given default sources values */
+ // eslint-disable-next-line
+ static defaults(target, ...sources) {
+ sources.forEach((source) => {
+ for (const key in source) {
+ if (!source.hasOwnProperty(key))
+ return;
+ if (target[key] === null || target[key] === void 0) {
+ target[key] = source[key];
+ } else if (typeof source[key] === "object" && typeof target[key] === "object") {
+ this.defaults(target[key], source[key]);
+ }
+ }
+ });
+ return target;
+ }
+ /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */
+ static same(a, b) {
+ if (typeof a !== "object")
+ return a == b;
+ if (typeof a !== typeof b)
+ return false;
+ if (Object.keys(a).length !== Object.keys(b).length)
+ return false;
+ for (const key in a) {
+ if (a[key] !== b[key])
+ return false;
+ }
+ return true;
+ }
+ /** copies over b size & position (GridStackPosition), and optionally min/max as well */
+ static copyPos(a, b, doMinMax = false) {
+ a.x = b.x;
+ a.y = b.y;
+ a.w = b.w;
+ a.h = b.h;
+ if (doMinMax) {
+ if (b.minW)
+ a.minW = b.minW;
+ if (b.minH)
+ a.minH = b.minH;
+ if (b.maxW)
+ a.maxW = b.maxW;
+ if (b.maxH)
+ a.maxH = b.maxH;
+ }
+ return a;
+ }
+ /** true if a and b has same size & position */
+ static samePos(a, b) {
+ return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;
+ }
+ /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */
+ static removeInternalAndSame(a, b) {
+ if (typeof a !== "object" || typeof b !== "object")
+ return;
+ for (let key in a) {
+ let val = a[key];
+ if (key[0] === "_" || val === b[key]) {
+ delete a[key];
+ } else if (val && typeof val === "object" && b[key] !== void 0) {
+ for (let i in val) {
+ if (val[i] === b[key][i] || i[0] === "_") {
+ delete val[i];
+ }
+ }
+ if (!Object.keys(val).length) {
+ delete a[key];
+ }
+ }
+ }
+ }
+ /** removes internal fields '_' and default values for saving */
+ static removeInternalForSave(n, removeEl = true) {
+ for (let key in n) {
+ if (key[0] === "_" || n[key] === null || n[key] === void 0)
+ delete n[key];
+ }
+ delete n.grid;
+ if (removeEl)
+ delete n.el;
+ if (!n.autoPosition)
+ delete n.autoPosition;
+ if (!n.noResize)
+ delete n.noResize;
+ if (!n.noMove)
+ delete n.noMove;
+ if (!n.locked)
+ delete n.locked;
+ if (n.w === 1 || n.w === n.minW)
+ delete n.w;
+ if (n.h === 1 || n.h === n.minH)
+ delete n.h;
+ }
+ /** return the closest parent (or itself) matching the given class */
+ static closestUpByClass(el, name) {
+ while (el) {
+ if (el.classList.contains(name))
+ return el;
+ el = el.parentElement;
+ }
+ return null;
+ }
+ /** delay calling the given function for given delay, preventing new calls from happening while waiting */
+ static throttle(func, delay) {
+ let isWaiting = false;
+ return (...args) => {
+ if (!isWaiting) {
+ isWaiting = true;
+ setTimeout(() => {
+ func(...args);
+ isWaiting = false;
+ }, delay);
+ }
+ };
+ }
+ static removePositioningStyles(el) {
+ let style = el.style;
+ if (style.position) {
+ style.removeProperty("position");
+ }
+ if (style.left) {
+ style.removeProperty("left");
+ }
+ if (style.top) {
+ style.removeProperty("top");
+ }
+ if (style.width) {
+ style.removeProperty("width");
+ }
+ if (style.height) {
+ style.removeProperty("height");
+ }
+ }
+ /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */
+ static getScrollElement(el) {
+ if (!el)
+ return document.scrollingElement || document.documentElement;
+ const style = getComputedStyle(el);
+ const overflowRegex = /(auto|scroll)/;
+ if (overflowRegex.test(style.overflow + style.overflowY)) {
+ return el;
+ } else {
+ return this.getScrollElement(el.parentElement);
+ }
+ }
+ /** @internal */
+ static updateScrollPosition(el, position, distance) {
+ let rect = el.getBoundingClientRect();
+ let innerHeightOrClientHeight = window.innerHeight || document.documentElement.clientHeight;
+ if (rect.top < 0 || rect.bottom > innerHeightOrClientHeight) {
+ let offsetDiffDown = rect.bottom - innerHeightOrClientHeight;
+ let offsetDiffUp = rect.top;
+ let scrollEl = this.getScrollElement(el);
+ if (scrollEl !== null) {
+ let prevScroll = scrollEl.scrollTop;
+ if (rect.top < 0 && distance < 0) {
+ if (el.offsetHeight > innerHeightOrClientHeight) {
+ scrollEl.scrollTop += distance;
+ } else {
+ scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;
+ }
+ } else if (distance > 0) {
+ if (el.offsetHeight > innerHeightOrClientHeight) {
+ scrollEl.scrollTop += distance;
+ } else {
+ scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;
+ }
+ }
+ position.top += scrollEl.scrollTop - prevScroll;
+ }
+ }
+ }
+ /**
+ * @internal Function used to scroll the page.
+ *
+ * @param event `MouseEvent` that triggers the resize
+ * @param el `HTMLElement` that's being resized
+ * @param distance Distance from the V edges to start scrolling
+ */
+ static updateScrollResize(event, el, distance) {
+ const scrollEl = this.getScrollElement(el);
+ const height = scrollEl.clientHeight;
+ const offsetTop = scrollEl === this.getScrollElement() ? 0 : scrollEl.getBoundingClientRect().top;
+ const pointerPosY = event.clientY - offsetTop;
+ const top = pointerPosY < distance;
+ const bottom = pointerPosY > height - distance;
+ if (top) {
+ scrollEl.scrollBy({ behavior: "smooth", top: pointerPosY - distance });
+ } else if (bottom) {
+ scrollEl.scrollBy({ behavior: "smooth", top: distance - (height - pointerPosY) });
+ }
+ }
+ /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */
+ static clone(obj) {
+ if (obj === null || obj === void 0 || typeof obj !== "object") {
+ return obj;
+ }
+ if (obj instanceof Array) {
+ return [...obj];
+ }
+ return Object.assign({}, obj);
+ }
+ /**
+ * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.
+ * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.
+ */
+ static cloneDeep(obj) {
+ const skipFields = ["parentGrid", "el", "grid", "subGrid", "engine"];
+ const ret = _Utils.clone(obj);
+ for (const key in ret) {
+ if (ret.hasOwnProperty(key) && typeof ret[key] === "object" && key.substring(0, 2) !== "__" && !skipFields.find((k) => k === key)) {
+ ret[key] = _Utils.cloneDeep(obj[key]);
+ }
+ }
+ return ret;
+ }
+ /** deep clone the given HTML node, removing teh unique id field */
+ static cloneNode(el) {
+ const node = el.cloneNode(true);
+ node.removeAttribute("id");
+ return node;
+ }
+ static appendTo(el, parent) {
+ let parentNode;
+ if (typeof parent === "string") {
+ parentNode = document.querySelector(parent);
+ } else {
+ parentNode = parent;
+ }
+ if (parentNode) {
+ parentNode.appendChild(el);
+ }
+ }
+ // public static setPositionRelative(el: HTMLElement): void {
+ // if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {
+ // el.style.position = "relative";
+ // }
+ // }
+ static addElStyles(el, styles) {
+ if (styles instanceof Object) {
+ for (const s in styles) {
+ if (styles.hasOwnProperty(s)) {
+ if (Array.isArray(styles[s])) {
+ styles[s].forEach((val) => {
+ el.style[s] = val;
+ });
+ } else {
+ el.style[s] = styles[s];
+ }
+ }
+ }
+ }
+ }
+ static initEvent(e, info) {
+ const evt = { type: info.type };
+ const obj = {
+ button: 0,
+ which: 0,
+ buttons: 1,
+ bubbles: true,
+ cancelable: true,
+ target: info.target ? info.target : e.target
+ };
+ if (e.dataTransfer) {
+ evt["dataTransfer"] = e.dataTransfer;
+ }
+ ["altKey", "ctrlKey", "metaKey", "shiftKey"].forEach((p) => evt[p] = e[p]);
+ ["pageX", "pageY", "clientX", "clientY", "screenX", "screenY"].forEach((p) => evt[p] = e[p]);
+ return Object.assign(Object.assign({}, evt), obj);
+ }
+ /** copies the MouseEvent properties and sends it as another event to the given target */
+ static simulateMouseEvent(e, simulatedType, target) {
+ const simulatedEvent = document.createEvent("MouseEvents");
+ simulatedEvent.initMouseEvent(
+ simulatedType,
+ // type
+ true,
+ // bubbles
+ true,
+ // cancelable
+ window,
+ // view
+ 1,
+ // detail
+ e.screenX,
+ // screenX
+ e.screenY,
+ // screenY
+ e.clientX,
+ // clientX
+ e.clientY,
+ // clientY
+ e.ctrlKey,
+ // ctrlKey
+ e.altKey,
+ // altKey
+ e.shiftKey,
+ // shiftKey
+ e.metaKey,
+ // metaKey
+ 0,
+ // button
+ e.target
+ // relatedTarget
+ );
+ (target || e.target).dispatchEvent(simulatedEvent);
+ }
+ };
+ exports.Utils = Utils;
+ }
+ });
+
+ // node_modules/gridstack/dist/gridstack-engine.js
+ var require_gridstack_engine = __commonJS({
+ "node_modules/gridstack/dist/gridstack-engine.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.GridStackEngine = void 0;
+ var utils_1 = require_utils();
+ var GridStackEngine = class _GridStackEngine {
+ constructor(opts = {}) {
+ this.addedNodes = [];
+ this.removedNodes = [];
+ this.column = opts.column || 12;
+ this.maxRow = opts.maxRow;
+ this._float = opts.float;
+ this.nodes = opts.nodes || [];
+ this.onChange = opts.onChange;
+ }
+ batchUpdate(flag = true) {
+ if (!!this.batchMode === flag)
+ return this;
+ this.batchMode = flag;
+ if (flag) {
+ this._prevFloat = this._float;
+ this._float = true;
+ this.saveInitial();
+ } else {
+ this._float = this._prevFloat;
+ delete this._prevFloat;
+ this._packNodes()._notify();
+ }
+ return this;
+ }
+ // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip
+ _useEntireRowArea(node, nn) {
+ return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);
+ }
+ /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.
+ * return true if we moved. */
+ _fixCollisions(node, nn = node, collide, opt = {}) {
+ this.sortNodes(-1);
+ collide = collide || this.collide(node, nn);
+ if (!collide)
+ return false;
+ if (node._moving && !opt.nested && !this.float) {
+ if (this.swap(node, collide))
+ return true;
+ }
+ let area = nn;
+ if (this._useEntireRowArea(node, nn)) {
+ area = { x: 0, w: this.column, y: nn.y, h: nn.h };
+ collide = this.collide(node, area, opt.skip);
+ }
+ let didMove = false;
+ let newOpt = { nested: true, pack: false };
+ while (collide = collide || this.collide(node, area, opt.skip)) {
+ let moved;
+ if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float && // can take space we had, or before where we're going
+ (!this.collide(collide, Object.assign(Object.assign({}, collide), { y: node.y }), node) || !this.collide(collide, Object.assign(Object.assign({}, collide), { y: nn.y - collide.h }), node))) {
+ node._skipDown = node._skipDown || nn.y > node.y;
+ moved = this.moveNode(node, Object.assign(Object.assign(Object.assign({}, nn), { y: collide.y + collide.h }), newOpt));
+ if (collide.locked && moved) {
+ utils_1.Utils.copyPos(nn, node);
+ } else if (!collide.locked && moved && opt.pack) {
+ this._packNodes();
+ nn.y = collide.y + collide.h;
+ utils_1.Utils.copyPos(node, nn);
+ }
+ didMove = didMove || moved;
+ } else {
+ moved = this.moveNode(collide, Object.assign(Object.assign(Object.assign({}, collide), { y: nn.y + nn.h, skip: node }), newOpt));
+ }
+ if (!moved) {
+ return didMove;
+ }
+ collide = void 0;
+ }
+ return didMove;
+ }
+ /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */
+ collide(skip, area = skip, skip2) {
+ return this.nodes.find((n) => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));
+ }
+ collideAll(skip, area = skip, skip2) {
+ return this.nodes.filter((n) => n !== skip && n !== skip2 && utils_1.Utils.isIntercepted(n, area));
+ }
+ /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */
+ directionCollideCoverage(node, o, collides) {
+ if (!o.rect || !node._rect)
+ return;
+ let r0 = node._rect;
+ let r = Object.assign({}, o.rect);
+ if (r.y > r0.y) {
+ r.h += r.y - r0.y;
+ r.y = r0.y;
+ } else {
+ r.h += r0.y - r.y;
+ }
+ if (r.x > r0.x) {
+ r.w += r.x - r0.x;
+ r.x = r0.x;
+ } else {
+ r.w += r0.x - r.x;
+ }
+ let collide;
+ collides.forEach((n) => {
+ if (n.locked || !n._rect)
+ return;
+ let r2 = n._rect;
+ let yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5;
+ if (r0.y < r2.y) {
+ yOver = (r.y + r.h - r2.y) / r2.h;
+ } else if (r0.y + r0.h > r2.y + r2.h) {
+ yOver = (r2.y + r2.h - r.y) / r2.h;
+ }
+ if (r0.x < r2.x) {
+ xOver = (r.x + r.w - r2.x) / r2.w;
+ } else if (r0.x + r0.w > r2.x + r2.w) {
+ xOver = (r2.x + r2.w - r.x) / r2.w;
+ }
+ let over = Math.min(xOver, yOver);
+ if (over > overMax) {
+ overMax = over;
+ collide = n;
+ }
+ });
+ o.collide = collide;
+ return collide;
+ }
+ /** does a pixel coverage returning the node that has the most coverage by area */
+ /*
+ protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {
+ let collide: GridStackNode;
+ let overMax = 0;
+ collides.forEach(n => {
+ if (n.locked || !n._rect) return;
+ let over = Utils.areaIntercept(r, n._rect);
+ if (over > overMax) {
+ overMax = over;
+ collide = n;
+ }
+ });
+ return {collide, over: overMax};
+ }
+ */
+ /** called to cache the nodes pixel rectangles used for collision detection during drag */
+ cacheRects(w, h, top, right, bottom, left) {
+ this.nodes.forEach((n) => n._rect = {
+ y: n.y * h + top,
+ x: n.x * w + left,
+ w: n.w * w - left - right,
+ h: n.h * h - top - bottom
+ });
+ return this;
+ }
+ /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */
+ swap(a, b) {
+ if (!b || b.locked || !a || a.locked)
+ return false;
+ function _doSwap() {
+ let x = b.x, y = b.y;
+ b.x = a.x;
+ b.y = a.y;
+ if (a.h != b.h) {
+ a.x = x;
+ a.y = b.y + b.h;
+ } else if (a.w != b.w) {
+ a.x = b.x + b.w;
+ a.y = y;
+ } else {
+ a.x = x;
+ a.y = y;
+ }
+ a._dirty = b._dirty = true;
+ return true;
+ }
+ let touching;
+ if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = utils_1.Utils.isTouching(a, b)))
+ return _doSwap();
+ if (touching === false)
+ return;
+ if (a.w === b.w && a.x === b.x && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {
+ if (b.y < a.y) {
+ let t = a;
+ a = b;
+ b = t;
+ }
+ return _doSwap();
+ }
+ if (touching === false)
+ return;
+ if (a.h === b.h && a.y === b.y && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {
+ if (b.x < a.x) {
+ let t = a;
+ a = b;
+ b = t;
+ }
+ return _doSwap();
+ }
+ return false;
+ }
+ isAreaEmpty(x, y, w, h) {
+ let nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };
+ return !this.collide(nn);
+ }
+ /** re-layout grid items to reclaim any empty space */
+ compact() {
+ if (this.nodes.length === 0)
+ return this;
+ this.batchUpdate().sortNodes();
+ let copyNodes = this.nodes;
+ this.nodes = [];
+ copyNodes.forEach((node) => {
+ if (!node.locked) {
+ node.autoPosition = true;
+ }
+ this.addNode(node, false);
+ node._dirty = true;
+ });
+ return this.batchUpdate(false);
+ }
+ /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */
+ set float(val) {
+ if (this._float === val)
+ return;
+ this._float = val || false;
+ if (!val) {
+ this._packNodes()._notify();
+ }
+ }
+ /** float getter method */
+ get float() {
+ return this._float || false;
+ }
+ /** sort the nodes array from first to last, or reverse. Called during collision/placement to force an order */
+ sortNodes(dir) {
+ this.nodes = utils_1.Utils.sort(this.nodes, dir, this.column);
+ return this;
+ }
+ /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */
+ _packNodes() {
+ if (this.batchMode) {
+ return this;
+ }
+ this.sortNodes();
+ if (this.float) {
+ this.nodes.forEach((n) => {
+ if (n._updating || n._orig === void 0 || n.y === n._orig.y)
+ return;
+ let newY = n.y;
+ while (newY > n._orig.y) {
+ --newY;
+ let collide = this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
+ if (!collide) {
+ n._dirty = true;
+ n.y = newY;
+ }
+ }
+ });
+ } else {
+ this.nodes.forEach((n, i) => {
+ if (n.locked)
+ return;
+ while (n.y > 0) {
+ let newY = i === 0 ? 0 : n.y - 1;
+ let canBeMoved = i === 0 || !this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });
+ if (!canBeMoved)
+ break;
+ n._dirty = n.y !== newY;
+ n.y = newY;
+ }
+ });
+ }
+ return this;
+ }
+ /**
+ * given a random node, makes sure it's coordinates/values are valid in the current grid
+ * @param node to adjust
+ * @param resizing if out of bound, resize down or move into the grid to fit ?
+ */
+ prepareNode(node, resizing) {
+ node = node || {};
+ node._id = node._id || _GridStackEngine._idSeq++;
+ if (node.x === void 0 || node.y === void 0 || node.x === null || node.y === null) {
+ node.autoPosition = true;
+ }
+ let defaults = { x: 0, y: 0, w: 1, h: 1 };
+ utils_1.Utils.defaults(node, defaults);
+ if (!node.autoPosition) {
+ delete node.autoPosition;
+ }
+ if (!node.noResize) {
+ delete node.noResize;
+ }
+ if (!node.noMove) {
+ delete node.noMove;
+ }
+ if (typeof node.x == "string") {
+ node.x = Number(node.x);
+ }
+ if (typeof node.y == "string") {
+ node.y = Number(node.y);
+ }
+ if (typeof node.w == "string") {
+ node.w = Number(node.w);
+ }
+ if (typeof node.h == "string") {
+ node.h = Number(node.h);
+ }
+ if (isNaN(node.x)) {
+ node.x = defaults.x;
+ node.autoPosition = true;
+ }
+ if (isNaN(node.y)) {
+ node.y = defaults.y;
+ node.autoPosition = true;
+ }
+ if (isNaN(node.w)) {
+ node.w = defaults.w;
+ }
+ if (isNaN(node.h)) {
+ node.h = defaults.h;
+ }
+ return this.nodeBoundFix(node, resizing);
+ }
+ /** part2 of preparing a node to fit inside our grid - checks for x,y,w from grid dimensions */
+ nodeBoundFix(node, resizing) {
+ let before = node._orig || utils_1.Utils.copyPos({}, node);
+ if (node.maxW) {
+ node.w = Math.min(node.w, node.maxW);
+ }
+ if (node.maxH) {
+ node.h = Math.min(node.h, node.maxH);
+ }
+ if (node.minW && node.minW <= this.column) {
+ node.w = Math.max(node.w, node.minW);
+ }
+ if (node.minH) {
+ node.h = Math.max(node.h, node.minH);
+ }
+ const saveOrig = this.column === 1 || node.x + node.w > this.column;
+ if (saveOrig && this.column < 12 && !this._inColumnResize && node._id && this.findCacheLayout(node, 12) === -1) {
+ let copy = Object.assign({}, node);
+ if (copy.autoPosition) {
+ delete copy.x;
+ delete copy.y;
+ } else
+ copy.x = Math.min(11, copy.x);
+ copy.w = Math.min(12, copy.w);
+ this.cacheOneLayout(copy, 12);
+ }
+ if (node.w > this.column) {
+ node.w = this.column;
+ } else if (node.w < 1) {
+ node.w = 1;
+ }
+ if (this.maxRow && node.h > this.maxRow) {
+ node.h = this.maxRow;
+ } else if (node.h < 1) {
+ node.h = 1;
+ }
+ if (node.x < 0) {
+ node.x = 0;
+ }
+ if (node.y < 0) {
+ node.y = 0;
+ }
+ if (node.x + node.w > this.column) {
+ if (resizing) {
+ node.w = this.column - node.x;
+ } else {
+ node.x = this.column - node.w;
+ }
+ }
+ if (this.maxRow && node.y + node.h > this.maxRow) {
+ if (resizing) {
+ node.h = this.maxRow - node.y;
+ } else {
+ node.y = this.maxRow - node.h;
+ }
+ }
+ if (!utils_1.Utils.samePos(node, before)) {
+ node._dirty = true;
+ }
+ return node;
+ }
+ /** returns a list of modified nodes from their original values */
+ getDirtyNodes(verify) {
+ if (verify) {
+ return this.nodes.filter((n) => n._dirty && !utils_1.Utils.samePos(n, n._orig));
+ }
+ return this.nodes.filter((n) => n._dirty);
+ }
+ /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */
+ _notify(removedNodes) {
+ if (this.batchMode || !this.onChange)
+ return this;
+ let dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());
+ this.onChange(dirtyNodes);
+ return this;
+ }
+ /** @internal remove dirty and last tried info */
+ cleanNodes() {
+ if (this.batchMode)
+ return this;
+ this.nodes.forEach((n) => {
+ delete n._dirty;
+ delete n._lastTried;
+ });
+ return this;
+ }
+ /** @internal called to save initial position/size to track real dirty state.
+ * Note: should be called right after we call change event (so next API is can detect changes)
+ * as well as right before we start move/resize/enter (so we can restore items to prev values) */
+ saveInitial() {
+ this.nodes.forEach((n) => {
+ n._orig = utils_1.Utils.copyPos({}, n);
+ delete n._dirty;
+ });
+ this._hasLocked = this.nodes.some((n) => n.locked);
+ return this;
+ }
+ /** @internal restore all the nodes back to initial values (called when we leave) */
+ restoreInitial() {
+ this.nodes.forEach((n) => {
+ if (utils_1.Utils.samePos(n, n._orig))
+ return;
+ utils_1.Utils.copyPos(n, n._orig);
+ n._dirty = true;
+ });
+ this._notify();
+ return this;
+ }
+ /** find the first available empty spot for the given node width/height, updating the x,y attributes. return true if found.
+ * optionally you can pass your own existing node list and column count, otherwise defaults to that engine data.
+ */
+ findEmptyPosition(node, nodeList = this.nodes, column = this.column) {
+ nodeList = utils_1.Utils.sort(nodeList, -1, column);
+ let found = false;
+ for (let i = 0; !found; ++i) {
+ let x = i % column;
+ let y = Math.floor(i / column);
+ if (x + node.w > column) {
+ continue;
+ }
+ let box = { x, y, w: node.w, h: node.h };
+ if (!nodeList.find((n) => utils_1.Utils.isIntercepted(box, n))) {
+ node.x = x;
+ node.y = y;
+ delete node.autoPosition;
+ found = true;
+ }
+ }
+ return found;
+ }
+ /** call to add the given node to our list, fixing collision and re-packing */
+ addNode(node, triggerAddEvent = false) {
+ let dup = this.nodes.find((n) => n._id === node._id);
+ if (dup)
+ return dup;
+ node = this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);
+ delete node._temporaryRemoved;
+ delete node._removeDOM;
+ if (node.autoPosition && this.findEmptyPosition(node)) {
+ delete node.autoPosition;
+ }
+ this.nodes.push(node);
+ if (triggerAddEvent) {
+ this.addedNodes.push(node);
+ }
+ this._fixCollisions(node);
+ if (!this.batchMode) {
+ this._packNodes()._notify();
+ }
+ return node;
+ }
+ removeNode(node, removeDOM = true, triggerEvent = false) {
+ if (!this.nodes.find((n) => n === node)) {
+ return this;
+ }
+ if (triggerEvent) {
+ this.removedNodes.push(node);
+ }
+ if (removeDOM)
+ node._removeDOM = true;
+ this.nodes = this.nodes.filter((n) => n !== node);
+ return this._packNodes()._notify([node]);
+ }
+ removeAll(removeDOM = true) {
+ delete this._layouts;
+ if (this.nodes.length === 0)
+ return this;
+ removeDOM && this.nodes.forEach((n) => n._removeDOM = true);
+ this.removedNodes = this.nodes;
+ this.nodes = [];
+ return this._notify(this.removedNodes);
+ }
+ /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.
+ * In more complicated cases (maxRow) it will attempt at moving the item and fixing
+ * others in a clone first, then apply those changes if still within specs. */
+ moveNodeCheck(node, o) {
+ if (!this.changedPosConstrain(node, o))
+ return false;
+ o.pack = true;
+ if (!this.maxRow) {
+ return this.moveNode(node, o);
+ }
+ let clonedNode;
+ let clone = new _GridStackEngine({
+ column: this.column,
+ float: this.float,
+ nodes: this.nodes.map((n) => {
+ if (n === node) {
+ clonedNode = Object.assign({}, n);
+ return clonedNode;
+ }
+ return Object.assign({}, n);
+ })
+ });
+ if (!clonedNode)
+ return false;
+ let canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= this.maxRow;
+ if (!canMove && !o.resizing && o.collide) {
+ let collide = o.collide.el.gridstackNode;
+ if (this.swap(node, collide)) {
+ this._notify();
+ return true;
+ }
+ }
+ if (!canMove)
+ return false;
+ clone.nodes.filter((n) => n._dirty).forEach((c) => {
+ let n = this.nodes.find((a) => a._id === c._id);
+ if (!n)
+ return;
+ utils_1.Utils.copyPos(n, c);
+ n._dirty = true;
+ });
+ this._notify();
+ return true;
+ }
+ /** return true if can fit in grid height constrain only (always true if no maxRow) */
+ willItFit(node) {
+ delete node._willFitPos;
+ if (!this.maxRow)
+ return true;
+ let clone = new _GridStackEngine({
+ column: this.column,
+ float: this.float,
+ nodes: this.nodes.map((n2) => {
+ return Object.assign({}, n2);
+ })
+ });
+ let n = Object.assign({}, node);
+ this.cleanupNode(n);
+ delete n.el;
+ delete n._id;
+ delete n.content;
+ delete n.grid;
+ clone.addNode(n);
+ if (clone.getRow() <= this.maxRow) {
+ node._willFitPos = utils_1.Utils.copyPos({}, n);
+ return true;
+ }
+ return false;
+ }
+ /** true if x,y or w,h are different after clamping to min/max */
+ changedPosConstrain(node, p) {
+ p.w = p.w || node.w;
+ p.h = p.h || node.h;
+ if (node.x !== p.x || node.y !== p.y)
+ return true;
+ if (node.maxW) {
+ p.w = Math.min(p.w, node.maxW);
+ }
+ if (node.maxH) {
+ p.h = Math.min(p.h, node.maxH);
+ }
+ if (node.minW) {
+ p.w = Math.max(p.w, node.minW);
+ }
+ if (node.minH) {
+ p.h = Math.max(p.h, node.minH);
+ }
+ return node.w !== p.w || node.h !== p.h;
+ }
+ /** return true if the passed in node was actually moved (checks for no-op and locked) */
+ moveNode(node, o) {
+ var _a, _b;
+ if (!node || /*node.locked ||*/
+ !o)
+ return false;
+ let wasUndefinedPack;
+ if (o.pack === void 0) {
+ wasUndefinedPack = o.pack = true;
+ }
+ if (typeof o.x !== "number") {
+ o.x = node.x;
+ }
+ if (typeof o.y !== "number") {
+ o.y = node.y;
+ }
+ if (typeof o.w !== "number") {
+ o.w = node.w;
+ }
+ if (typeof o.h !== "number") {
+ o.h = node.h;
+ }
+ let resizing = node.w !== o.w || node.h !== o.h;
+ let nn = utils_1.Utils.copyPos({}, node, true);
+ utils_1.Utils.copyPos(nn, o);
+ nn = this.nodeBoundFix(nn, resizing);
+ utils_1.Utils.copyPos(o, nn);
+ if (utils_1.Utils.samePos(node, o))
+ return false;
+ let prevPos = utils_1.Utils.copyPos({}, node);
+ let collides = this.collideAll(node, nn, o.skip);
+ let needToMove = true;
+ if (collides.length) {
+ let activeDrag = node._moving && !o.nested;
+ let collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];
+ if (activeDrag && collide && ((_b = (_a = node.grid) === null || _a === void 0 ? void 0 : _a.opts) === null || _b === void 0 ? void 0 : _b.subGridDynamic) && !node.grid._isTemp) {
+ let over = utils_1.Utils.areaIntercept(o.rect, collide._rect);
+ let a1 = utils_1.Utils.area(o.rect);
+ let a2 = utils_1.Utils.area(collide._rect);
+ let perc = over / (a1 < a2 ? a1 : a2);
+ if (perc > 0.8) {
+ collide.grid.makeSubGrid(collide.el, void 0, node);
+ collide = void 0;
+ }
+ }
+ if (collide) {
+ needToMove = !this._fixCollisions(node, nn, collide, o);
+ } else {
+ needToMove = false;
+ if (wasUndefinedPack)
+ delete o.pack;
+ }
+ }
+ if (needToMove) {
+ node._dirty = true;
+ utils_1.Utils.copyPos(node, nn);
+ }
+ if (o.pack) {
+ this._packNodes()._notify();
+ }
+ return !utils_1.Utils.samePos(node, prevPos);
+ }
+ getRow() {
+ return this.nodes.reduce((row, n) => Math.max(row, n.y + n.h), 0);
+ }
+ beginUpdate(node) {
+ if (!node._updating) {
+ node._updating = true;
+ delete node._skipDown;
+ if (!this.batchMode)
+ this.saveInitial();
+ }
+ return this;
+ }
+ endUpdate() {
+ let n = this.nodes.find((n2) => n2._updating);
+ if (n) {
+ delete n._updating;
+ delete n._skipDown;
+ }
+ return this;
+ }
+ /** saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode) so we don't loose orig layout,
+ * returning a list of widgets for serialization */
+ save(saveElement = true) {
+ var _a;
+ let len = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a.length;
+ let layout = len && this.column !== len - 1 ? this._layouts[len - 1] : null;
+ let list = [];
+ this.sortNodes();
+ this.nodes.forEach((n) => {
+ let wl = layout === null || layout === void 0 ? void 0 : layout.find((l) => l._id === n._id);
+ let w = Object.assign({}, n);
+ if (wl) {
+ w.x = wl.x;
+ w.y = wl.y;
+ w.w = wl.w;
+ }
+ utils_1.Utils.removeInternalForSave(w, !saveElement);
+ list.push(w);
+ });
+ return list;
+ }
+ /** @internal called whenever a node is added or moved - updates the cached layouts */
+ layoutsNodesChange(nodes) {
+ if (!this._layouts || this._inColumnResize)
+ return this;
+ this._layouts.forEach((layout, column) => {
+ if (!layout || column === this.column)
+ return this;
+ if (column < this.column) {
+ this._layouts[column] = void 0;
+ } else {
+ let ratio = column / this.column;
+ nodes.forEach((node) => {
+ if (!node._orig)
+ return;
+ let n = layout.find((l) => l._id === node._id);
+ if (!n)
+ return;
+ if (node.y !== node._orig.y) {
+ n.y += node.y - node._orig.y;
+ }
+ if (node.x !== node._orig.x) {
+ n.x = Math.round(node.x * ratio);
+ }
+ if (node.w !== node._orig.w) {
+ n.w = Math.round(node.w * ratio);
+ }
+ });
+ }
+ });
+ return this;
+ }
+ /**
+ * @internal Called to scale the widget width & position up/down based on the column change.
+ * Note we store previous layouts (especially original ones) to make it possible to go
+ * from say 12 -> 1 -> 12 and get back to where we were.
+ *
+ * @param prevColumn previous number of columns
+ * @param column new column number
+ * @param nodes different sorted list (ex: DOM order) instead of current list
+ * @param layout specify the type of re-layout that will happen (position, size, etc...).
+ * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column
+ */
+ updateNodeWidths(prevColumn, column, nodes, layout = "moveScale") {
+ var _a;
+ if (!this.nodes.length || !column || prevColumn === column)
+ return this;
+ this.cacheLayout(this.nodes, prevColumn);
+ this.batchUpdate();
+ let newNodes = [];
+ let domOrder = false;
+ if (column === 1 && (nodes === null || nodes === void 0 ? void 0 : nodes.length)) {
+ domOrder = true;
+ let top = 0;
+ nodes.forEach((n) => {
+ n.x = 0;
+ n.w = 1;
+ n.y = Math.max(n.y, top);
+ top = n.y + n.h;
+ });
+ newNodes = nodes;
+ nodes = [];
+ } else {
+ nodes = utils_1.Utils.sort(this.nodes, -1, prevColumn);
+ }
+ let cacheNodes = [];
+ if (column > prevColumn) {
+ cacheNodes = this._layouts[column] || [];
+ let lastIndex = this._layouts.length - 1;
+ if (!cacheNodes.length && prevColumn !== lastIndex && ((_a = this._layouts[lastIndex]) === null || _a === void 0 ? void 0 : _a.length)) {
+ prevColumn = lastIndex;
+ this._layouts[lastIndex].forEach((cacheNode) => {
+ let n = nodes.find((n2) => n2._id === cacheNode._id);
+ if (n) {
+ n.x = cacheNode.x;
+ n.y = cacheNode.y;
+ n.w = cacheNode.w;
+ }
+ });
+ }
+ }
+ cacheNodes.forEach((cacheNode) => {
+ let j = nodes.findIndex((n) => n._id === cacheNode._id);
+ if (j !== -1) {
+ if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {
+ this.findEmptyPosition(cacheNode, newNodes);
+ }
+ if (!cacheNode.autoPosition) {
+ nodes[j].x = cacheNode.x;
+ nodes[j].y = cacheNode.y;
+ nodes[j].w = cacheNode.w;
+ newNodes.push(nodes[j]);
+ }
+ nodes.splice(j, 1);
+ }
+ });
+ if (nodes.length) {
+ if (typeof layout === "function") {
+ layout(column, prevColumn, newNodes, nodes);
+ } else if (!domOrder) {
+ let ratio = column / prevColumn;
+ let move = layout === "move" || layout === "moveScale";
+ let scale = layout === "scale" || layout === "moveScale";
+ nodes.forEach((node) => {
+ node.x = column === 1 ? 0 : move ? Math.round(node.x * ratio) : Math.min(node.x, column - 1);
+ node.w = column === 1 || prevColumn === 1 ? 1 : scale ? Math.round(node.w * ratio) || 1 : Math.min(node.w, column);
+ newNodes.push(node);
+ });
+ nodes = [];
+ }
+ }
+ if (!domOrder)
+ newNodes = utils_1.Utils.sort(newNodes, -1, column);
+ this._inColumnResize = true;
+ this.nodes = [];
+ newNodes.forEach((node) => {
+ this.addNode(node, false);
+ delete node._orig;
+ });
+ this.batchUpdate(false);
+ delete this._inColumnResize;
+ return this;
+ }
+ /**
+ * call to cache the given layout internally to the given location so we can restore back when column changes size
+ * @param nodes list of nodes
+ * @param column corresponding column index to save it under
+ * @param clear if true, will force other caches to be removed (default false)
+ */
+ cacheLayout(nodes, column, clear = false) {
+ let copy = [];
+ nodes.forEach((n, i) => {
+ n._id = n._id || _GridStackEngine._idSeq++;
+ copy[i] = { x: n.x, y: n.y, w: n.w, _id: n._id };
+ });
+ this._layouts = clear ? [] : this._layouts || [];
+ this._layouts[column] = copy;
+ return this;
+ }
+ /**
+ * call to cache the given node layout internally to the given location so we can restore back when column changes size
+ * @param node single node to cache
+ * @param column corresponding column index to save it under
+ */
+ cacheOneLayout(n, column) {
+ n._id = n._id || _GridStackEngine._idSeq++;
+ let l = { x: n.x, y: n.y, w: n.w, _id: n._id };
+ if (n.autoPosition) {
+ delete l.x;
+ delete l.y;
+ l.autoPosition = true;
+ }
+ this._layouts = this._layouts || [];
+ this._layouts[column] = this._layouts[column] || [];
+ let index = this.findCacheLayout(n, column);
+ if (index === -1)
+ this._layouts[column].push(l);
+ else
+ this._layouts[column][index] = l;
+ return this;
+ }
+ findCacheLayout(n, column) {
+ var _a, _b, _c;
+ return (_c = (_b = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a[column]) === null || _b === void 0 ? void 0 : _b.findIndex((l) => l._id === n._id)) !== null && _c !== void 0 ? _c : -1;
+ }
+ /** called to remove all internal values but the _id */
+ cleanupNode(node) {
+ for (let prop in node) {
+ if (prop[0] === "_" && prop !== "_id")
+ delete node[prop];
+ }
+ return this;
+ }
+ };
+ exports.GridStackEngine = GridStackEngine;
+ GridStackEngine._idSeq = 1;
+ }
+ });
+
+ // node_modules/gridstack/dist/types.js
+ var require_types = __commonJS({
+ "node_modules/gridstack/dist/types.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.dragInDefaultOptions = exports.gridDefaults = void 0;
+ exports.gridDefaults = {
+ alwaysShowResizeHandle: "mobile",
+ animate: true,
+ auto: true,
+ cellHeight: "auto",
+ cellHeightThrottle: 100,
+ cellHeightUnit: "px",
+ column: 12,
+ draggable: { handle: ".grid-stack-item-content", appendTo: "body", scroll: true },
+ handle: ".grid-stack-item-content",
+ itemClass: "grid-stack-item",
+ margin: 10,
+ marginUnit: "px",
+ maxRow: 0,
+ minRow: 0,
+ oneColumnSize: 768,
+ placeholderClass: "grid-stack-placeholder",
+ placeholderText: "",
+ removableOptions: { accept: ".grid-stack-item" },
+ resizable: { handles: "se" },
+ rtl: "auto"
+ };
+ exports.dragInDefaultOptions = {
+ handle: ".grid-stack-item-content",
+ appendTo: "body"
+ };
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-manager.js
+ var require_dd_manager = __commonJS({
+ "node_modules/gridstack/dist/dd-manager.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDManager = void 0;
+ var DDManager = class {
+ };
+ exports.DDManager = DDManager;
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-touch.js
+ var require_dd_touch = __commonJS({
+ "node_modules/gridstack/dist/dd-touch.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.pointerleave = exports.pointerenter = exports.pointerdown = exports.touchend = exports.touchmove = exports.touchstart = exports.isTouch = void 0;
+ var dd_manager_1 = require_dd_manager();
+ exports.isTouch = typeof window !== "undefined" && typeof document !== "undefined" && ("ontouchstart" in document || "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0);
+ var DDTouch = class {
+ };
+ function simulateMouseEvent(e, simulatedType) {
+ if (e.touches.length > 1)
+ return;
+ if (e.cancelable)
+ e.preventDefault();
+ const touch = e.changedTouches[0], simulatedEvent = document.createEvent("MouseEvents");
+ simulatedEvent.initMouseEvent(
+ simulatedType,
+ // type
+ true,
+ // bubbles
+ true,
+ // cancelable
+ window,
+ // view
+ 1,
+ // detail
+ touch.screenX,
+ // screenX
+ touch.screenY,
+ // screenY
+ touch.clientX,
+ // clientX
+ touch.clientY,
+ // clientY
+ false,
+ // ctrlKey
+ false,
+ // altKey
+ false,
+ // shiftKey
+ false,
+ // metaKey
+ 0,
+ // button
+ null
+ // relatedTarget
+ );
+ e.target.dispatchEvent(simulatedEvent);
+ }
+ function simulatePointerMouseEvent(e, simulatedType) {
+ if (e.cancelable)
+ e.preventDefault();
+ const simulatedEvent = document.createEvent("MouseEvents");
+ simulatedEvent.initMouseEvent(
+ simulatedType,
+ // type
+ true,
+ // bubbles
+ true,
+ // cancelable
+ window,
+ // view
+ 1,
+ // detail
+ e.screenX,
+ // screenX
+ e.screenY,
+ // screenY
+ e.clientX,
+ // clientX
+ e.clientY,
+ // clientY
+ false,
+ // ctrlKey
+ false,
+ // altKey
+ false,
+ // shiftKey
+ false,
+ // metaKey
+ 0,
+ // button
+ null
+ // relatedTarget
+ );
+ e.target.dispatchEvent(simulatedEvent);
+ }
+ function touchstart(e) {
+ if (DDTouch.touchHandled)
+ return;
+ DDTouch.touchHandled = true;
+ simulateMouseEvent(e, "mousedown");
+ }
+ exports.touchstart = touchstart;
+ function touchmove(e) {
+ if (!DDTouch.touchHandled)
+ return;
+ simulateMouseEvent(e, "mousemove");
+ }
+ exports.touchmove = touchmove;
+ function touchend(e) {
+ if (!DDTouch.touchHandled)
+ return;
+ if (DDTouch.pointerLeaveTimeout) {
+ window.clearTimeout(DDTouch.pointerLeaveTimeout);
+ delete DDTouch.pointerLeaveTimeout;
+ }
+ const wasDragging = !!dd_manager_1.DDManager.dragElement;
+ simulateMouseEvent(e, "mouseup");
+ if (!wasDragging) {
+ simulateMouseEvent(e, "click");
+ }
+ DDTouch.touchHandled = false;
+ }
+ exports.touchend = touchend;
+ function pointerdown(e) {
+ e.target.releasePointerCapture(e.pointerId);
+ }
+ exports.pointerdown = pointerdown;
+ function pointerenter(e) {
+ if (!dd_manager_1.DDManager.dragElement) {
+ return;
+ }
+ simulatePointerMouseEvent(e, "mouseenter");
+ }
+ exports.pointerenter = pointerenter;
+ function pointerleave(e) {
+ if (!dd_manager_1.DDManager.dragElement) {
+ return;
+ }
+ DDTouch.pointerLeaveTimeout = window.setTimeout(() => {
+ delete DDTouch.pointerLeaveTimeout;
+ simulatePointerMouseEvent(e, "mouseleave");
+ }, 10);
+ }
+ exports.pointerleave = pointerleave;
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-resizable-handle.js
+ var require_dd_resizable_handle = __commonJS({
+ "node_modules/gridstack/dist/dd-resizable-handle.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDResizableHandle = void 0;
+ var dd_touch_1 = require_dd_touch();
+ var DDResizableHandle = class _DDResizableHandle {
+ constructor(host, direction, option) {
+ this.moving = false;
+ this.host = host;
+ this.dir = direction;
+ this.option = option;
+ this._mouseDown = this._mouseDown.bind(this);
+ this._mouseMove = this._mouseMove.bind(this);
+ this._mouseUp = this._mouseUp.bind(this);
+ this._init();
+ }
+ /** @internal */
+ _init() {
+ const el = document.createElement("div");
+ el.classList.add("ui-resizable-handle");
+ el.classList.add(`${_DDResizableHandle.prefix}${this.dir}`);
+ el.style.zIndex = "100";
+ el.style.userSelect = "none";
+ this.el = el;
+ this.host.appendChild(this.el);
+ this.el.addEventListener("mousedown", this._mouseDown);
+ if (dd_touch_1.isTouch) {
+ this.el.addEventListener("touchstart", dd_touch_1.touchstart);
+ this.el.addEventListener("pointerdown", dd_touch_1.pointerdown);
+ }
+ return this;
+ }
+ /** call this when resize handle needs to be removed and cleaned up */
+ destroy() {
+ if (this.moving)
+ this._mouseUp(this.mouseDownEvent);
+ this.el.removeEventListener("mousedown", this._mouseDown);
+ if (dd_touch_1.isTouch) {
+ this.el.removeEventListener("touchstart", dd_touch_1.touchstart);
+ this.el.removeEventListener("pointerdown", dd_touch_1.pointerdown);
+ }
+ this.host.removeChild(this.el);
+ delete this.el;
+ delete this.host;
+ return this;
+ }
+ /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */
+ _mouseDown(e) {
+ this.mouseDownEvent = e;
+ document.addEventListener("mousemove", this._mouseMove, true);
+ document.addEventListener("mouseup", this._mouseUp, true);
+ if (dd_touch_1.isTouch) {
+ this.el.addEventListener("touchmove", dd_touch_1.touchmove);
+ this.el.addEventListener("touchend", dd_touch_1.touchend);
+ }
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ /** @internal */
+ _mouseMove(e) {
+ let s = this.mouseDownEvent;
+ if (this.moving) {
+ this._triggerEvent("move", e);
+ } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {
+ this.moving = true;
+ this._triggerEvent("start", this.mouseDownEvent);
+ this._triggerEvent("move", e);
+ }
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ /** @internal */
+ _mouseUp(e) {
+ if (this.moving) {
+ this._triggerEvent("stop", e);
+ }
+ document.removeEventListener("mousemove", this._mouseMove, true);
+ document.removeEventListener("mouseup", this._mouseUp, true);
+ if (dd_touch_1.isTouch) {
+ this.el.removeEventListener("touchmove", dd_touch_1.touchmove);
+ this.el.removeEventListener("touchend", dd_touch_1.touchend);
+ }
+ delete this.moving;
+ delete this.mouseDownEvent;
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ /** @internal */
+ _triggerEvent(name, event) {
+ if (this.option[name])
+ this.option[name](event);
+ return this;
+ }
+ };
+ exports.DDResizableHandle = DDResizableHandle;
+ DDResizableHandle.prefix = "ui-resizable-";
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-base-impl.js
+ var require_dd_base_impl = __commonJS({
+ "node_modules/gridstack/dist/dd-base-impl.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDBaseImplement = void 0;
+ var DDBaseImplement = class {
+ constructor() {
+ this._eventRegister = {};
+ }
+ /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */
+ get disabled() {
+ return this._disabled;
+ }
+ on(event, callback) {
+ this._eventRegister[event] = callback;
+ }
+ off(event) {
+ delete this._eventRegister[event];
+ }
+ enable() {
+ this._disabled = false;
+ }
+ disable() {
+ this._disabled = true;
+ }
+ destroy() {
+ delete this._eventRegister;
+ }
+ triggerEvent(eventName, event) {
+ if (!this.disabled && this._eventRegister && this._eventRegister[eventName])
+ return this._eventRegister[eventName](event);
+ }
+ };
+ exports.DDBaseImplement = DDBaseImplement;
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-resizable.js
+ var require_dd_resizable = __commonJS({
+ "node_modules/gridstack/dist/dd-resizable.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDResizable = void 0;
+ var dd_resizable_handle_1 = require_dd_resizable_handle();
+ var dd_base_impl_1 = require_dd_base_impl();
+ var utils_1 = require_utils();
+ var dd_manager_1 = require_dd_manager();
+ var DDResizable = class _DDResizable extends dd_base_impl_1.DDBaseImplement {
+ constructor(el, opts = {}) {
+ super();
+ this._ui = () => {
+ const containmentEl = this.el.parentElement;
+ const containmentRect = containmentEl.getBoundingClientRect();
+ const newRect = {
+ width: this.originalRect.width,
+ height: this.originalRect.height + this.scrolled,
+ left: this.originalRect.left,
+ top: this.originalRect.top - this.scrolled
+ };
+ const rect = this.temporalRect || newRect;
+ return {
+ position: {
+ left: rect.left - containmentRect.left,
+ top: rect.top - containmentRect.top
+ },
+ size: {
+ width: rect.width,
+ height: rect.height
+ }
+ /* Gridstack ONLY needs position set above... keep around in case.
+ element: [this.el], // The object representing the element to be resized
+ helper: [], // TODO: not support yet - The object representing the helper that's being resized
+ originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped
+ originalPosition: { // The position represented as { left, top } before the resizable is resized
+ left: this.originalRect.left - containmentRect.left,
+ top: this.originalRect.top - containmentRect.top
+ },
+ originalSize: { // The size represented as { width, height } before the resizable is resized
+ width: this.originalRect.width,
+ height: this.originalRect.height
+ }
+ */
+ };
+ };
+ this.el = el;
+ this.option = opts;
+ this._mouseOver = this._mouseOver.bind(this);
+ this._mouseOut = this._mouseOut.bind(this);
+ this.enable();
+ this._setupAutoHide(this.option.autoHide);
+ this._setupHandlers();
+ }
+ on(event, callback) {
+ super.on(event, callback);
+ }
+ off(event) {
+ super.off(event);
+ }
+ enable() {
+ super.enable();
+ this.el.classList.add("ui-resizable");
+ this.el.classList.remove("ui-resizable-disabled");
+ this._setupAutoHide(this.option.autoHide);
+ }
+ disable() {
+ super.disable();
+ this.el.classList.add("ui-resizable-disabled");
+ this.el.classList.remove("ui-resizable");
+ this._setupAutoHide(false);
+ }
+ destroy() {
+ this._removeHandlers();
+ this._setupAutoHide(false);
+ this.el.classList.remove("ui-resizable");
+ delete this.el;
+ super.destroy();
+ }
+ updateOption(opts) {
+ let updateHandles = opts.handles && opts.handles !== this.option.handles;
+ let updateAutoHide = opts.autoHide && opts.autoHide !== this.option.autoHide;
+ Object.keys(opts).forEach((key) => this.option[key] = opts[key]);
+ if (updateHandles) {
+ this._removeHandlers();
+ this._setupHandlers();
+ }
+ if (updateAutoHide) {
+ this._setupAutoHide(this.option.autoHide);
+ }
+ return this;
+ }
+ /** @internal turns auto hide on/off */
+ _setupAutoHide(auto) {
+ if (auto) {
+ this.el.classList.add("ui-resizable-autohide");
+ this.el.addEventListener("mouseover", this._mouseOver);
+ this.el.addEventListener("mouseout", this._mouseOut);
+ } else {
+ this.el.classList.remove("ui-resizable-autohide");
+ this.el.removeEventListener("mouseover", this._mouseOver);
+ this.el.removeEventListener("mouseout", this._mouseOut);
+ if (dd_manager_1.DDManager.overResizeElement === this) {
+ delete dd_manager_1.DDManager.overResizeElement;
+ }
+ }
+ return this;
+ }
+ /** @internal */
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ _mouseOver(e) {
+ if (dd_manager_1.DDManager.overResizeElement || dd_manager_1.DDManager.dragElement)
+ return;
+ dd_manager_1.DDManager.overResizeElement = this;
+ this.el.classList.remove("ui-resizable-autohide");
+ }
+ /** @internal */
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ _mouseOut(e) {
+ if (dd_manager_1.DDManager.overResizeElement !== this)
+ return;
+ delete dd_manager_1.DDManager.overResizeElement;
+ this.el.classList.add("ui-resizable-autohide");
+ }
+ /** @internal */
+ _setupHandlers() {
+ let handlerDirection = this.option.handles || "e,s,se";
+ if (handlerDirection === "all") {
+ handlerDirection = "n,e,s,w,se,sw,ne,nw";
+ }
+ this.handlers = handlerDirection.split(",").map((dir) => dir.trim()).map((dir) => new dd_resizable_handle_1.DDResizableHandle(this.el, dir, {
+ start: (event) => {
+ this._resizeStart(event);
+ },
+ stop: (event) => {
+ this._resizeStop(event);
+ },
+ move: (event) => {
+ this._resizing(event, dir);
+ }
+ }));
+ return this;
+ }
+ /** @internal */
+ _resizeStart(event) {
+ this.originalRect = this.el.getBoundingClientRect();
+ this.scrollEl = utils_1.Utils.getScrollElement(this.el);
+ this.scrollY = this.scrollEl.scrollTop;
+ this.scrolled = 0;
+ this.startEvent = event;
+ this._setupHelper();
+ this._applyChange();
+ const ev = utils_1.Utils.initEvent(event, { type: "resizestart", target: this.el });
+ if (this.option.start) {
+ this.option.start(ev, this._ui());
+ }
+ this.el.classList.add("ui-resizable-resizing");
+ this.triggerEvent("resizestart", ev);
+ return this;
+ }
+ /** @internal */
+ _resizing(event, dir) {
+ this.scrolled = this.scrollEl.scrollTop - this.scrollY;
+ this.temporalRect = this._getChange(event, dir);
+ this._applyChange();
+ const ev = utils_1.Utils.initEvent(event, { type: "resize", target: this.el });
+ if (this.option.resize) {
+ this.option.resize(ev, this._ui());
+ }
+ this.triggerEvent("resize", ev);
+ return this;
+ }
+ /** @internal */
+ _resizeStop(event) {
+ const ev = utils_1.Utils.initEvent(event, { type: "resizestop", target: this.el });
+ if (this.option.stop) {
+ this.option.stop(ev);
+ }
+ this.el.classList.remove("ui-resizable-resizing");
+ this.triggerEvent("resizestop", ev);
+ this._cleanHelper();
+ delete this.startEvent;
+ delete this.originalRect;
+ delete this.temporalRect;
+ delete this.scrollY;
+ delete this.scrolled;
+ return this;
+ }
+ /** @internal */
+ _setupHelper() {
+ this.elOriginStyleVal = _DDResizable._originStyleProp.map((prop) => this.el.style[prop]);
+ this.parentOriginStylePosition = this.el.parentElement.style.position;
+ if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {
+ this.el.parentElement.style.position = "relative";
+ }
+ this.el.style.position = "absolute";
+ this.el.style.opacity = "0.8";
+ return this;
+ }
+ /** @internal */
+ _cleanHelper() {
+ _DDResizable._originStyleProp.forEach((prop, i) => {
+ this.el.style[prop] = this.elOriginStyleVal[i] || null;
+ });
+ this.el.parentElement.style.position = this.parentOriginStylePosition || null;
+ return this;
+ }
+ /** @internal */
+ _getChange(event, dir) {
+ const oEvent = this.startEvent;
+ const newRect = {
+ width: this.originalRect.width,
+ height: this.originalRect.height + this.scrolled,
+ left: this.originalRect.left,
+ top: this.originalRect.top - this.scrolled
+ };
+ const offsetX = event.clientX - oEvent.clientX;
+ const offsetY = event.clientY - oEvent.clientY;
+ if (dir.indexOf("e") > -1) {
+ newRect.width += offsetX;
+ } else if (dir.indexOf("w") > -1) {
+ newRect.width -= offsetX;
+ newRect.left += offsetX;
+ }
+ if (dir.indexOf("s") > -1) {
+ newRect.height += offsetY;
+ } else if (dir.indexOf("n") > -1) {
+ newRect.height -= offsetY;
+ newRect.top += offsetY;
+ }
+ const constrain = this._constrainSize(newRect.width, newRect.height);
+ if (Math.round(newRect.width) !== Math.round(constrain.width)) {
+ if (dir.indexOf("w") > -1) {
+ newRect.left += newRect.width - constrain.width;
+ }
+ newRect.width = constrain.width;
+ }
+ if (Math.round(newRect.height) !== Math.round(constrain.height)) {
+ if (dir.indexOf("n") > -1) {
+ newRect.top += newRect.height - constrain.height;
+ }
+ newRect.height = constrain.height;
+ }
+ return newRect;
+ }
+ /** @internal constrain the size to the set min/max values */
+ _constrainSize(oWidth, oHeight) {
+ const maxWidth = this.option.maxWidth || Number.MAX_SAFE_INTEGER;
+ const minWidth = this.option.minWidth || oWidth;
+ const maxHeight = this.option.maxHeight || Number.MAX_SAFE_INTEGER;
+ const minHeight = this.option.minHeight || oHeight;
+ const width = Math.min(maxWidth, Math.max(minWidth, oWidth));
+ const height = Math.min(maxHeight, Math.max(minHeight, oHeight));
+ return { width, height };
+ }
+ /** @internal */
+ _applyChange() {
+ let containmentRect = { left: 0, top: 0, width: 0, height: 0 };
+ if (this.el.style.position === "absolute") {
+ const containmentEl = this.el.parentElement;
+ const { left, top } = containmentEl.getBoundingClientRect();
+ containmentRect = { left, top, width: 0, height: 0 };
+ }
+ if (!this.temporalRect)
+ return this;
+ Object.keys(this.temporalRect).forEach((key) => {
+ const value = this.temporalRect[key];
+ this.el.style[key] = value - containmentRect[key] + "px";
+ });
+ return this;
+ }
+ /** @internal */
+ _removeHandlers() {
+ this.handlers.forEach((handle) => handle.destroy());
+ delete this.handlers;
+ return this;
+ }
+ };
+ exports.DDResizable = DDResizable;
+ DDResizable._originStyleProp = ["width", "height", "position", "left", "top", "opacity", "zIndex"];
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-draggable.js
+ var require_dd_draggable = __commonJS({
+ "node_modules/gridstack/dist/dd-draggable.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDDraggable = void 0;
+ var dd_manager_1 = require_dd_manager();
+ var utils_1 = require_utils();
+ var dd_base_impl_1 = require_dd_base_impl();
+ var dd_touch_1 = require_dd_touch();
+ var DDDraggable = class _DDDraggable extends dd_base_impl_1.DDBaseImplement {
+ constructor(el, option = {}) {
+ super();
+ this.el = el;
+ this.option = option;
+ let handleName = option.handle.substring(1);
+ this.dragEl = el.classList.contains(handleName) ? el : el.querySelector(option.handle) || el;
+ this._mouseDown = this._mouseDown.bind(this);
+ this._mouseMove = this._mouseMove.bind(this);
+ this._mouseUp = this._mouseUp.bind(this);
+ this.enable();
+ }
+ on(event, callback) {
+ super.on(event, callback);
+ }
+ off(event) {
+ super.off(event);
+ }
+ enable() {
+ if (this.disabled === false)
+ return;
+ super.enable();
+ this.dragEl.addEventListener("mousedown", this._mouseDown);
+ if (dd_touch_1.isTouch) {
+ this.dragEl.addEventListener("touchstart", dd_touch_1.touchstart);
+ this.dragEl.addEventListener("pointerdown", dd_touch_1.pointerdown);
+ }
+ this.el.classList.remove("ui-draggable-disabled");
+ this.el.classList.add("ui-draggable");
+ }
+ disable(forDestroy = false) {
+ if (this.disabled === true)
+ return;
+ super.disable();
+ this.dragEl.removeEventListener("mousedown", this._mouseDown);
+ if (dd_touch_1.isTouch) {
+ this.dragEl.removeEventListener("touchstart", dd_touch_1.touchstart);
+ this.dragEl.removeEventListener("pointerdown", dd_touch_1.pointerdown);
+ }
+ this.el.classList.remove("ui-draggable");
+ if (!forDestroy)
+ this.el.classList.add("ui-draggable-disabled");
+ }
+ destroy() {
+ if (this.dragTimeout)
+ window.clearTimeout(this.dragTimeout);
+ delete this.dragTimeout;
+ if (this.dragging)
+ this._mouseUp(this.mouseDownEvent);
+ this.disable(true);
+ delete this.el;
+ delete this.helper;
+ delete this.option;
+ super.destroy();
+ }
+ updateOption(opts) {
+ Object.keys(opts).forEach((key) => this.option[key] = opts[key]);
+ return this;
+ }
+ /** @internal call when mouse goes down before a dragstart happens */
+ _mouseDown(e) {
+ if (dd_manager_1.DDManager.mouseHandled)
+ return;
+ if (e.button !== 0)
+ return true;
+ const skipMouseDown = ["input", "textarea", "button", "select", "option"];
+ const name = e.target.nodeName.toLowerCase();
+ if (skipMouseDown.find((skip) => skip === name))
+ return true;
+ if (e.target.closest('[contenteditable="true"]'))
+ return true;
+ this.mouseDownEvent = e;
+ delete this.dragging;
+ delete dd_manager_1.DDManager.dragElement;
+ delete dd_manager_1.DDManager.dropElement;
+ document.addEventListener("mousemove", this._mouseMove, true);
+ document.addEventListener("mouseup", this._mouseUp, true);
+ if (dd_touch_1.isTouch) {
+ this.dragEl.addEventListener("touchmove", dd_touch_1.touchmove);
+ this.dragEl.addEventListener("touchend", dd_touch_1.touchend);
+ }
+ e.preventDefault();
+ if (document.activeElement)
+ document.activeElement.blur();
+ dd_manager_1.DDManager.mouseHandled = true;
+ return true;
+ }
+ /** @internal method to call actual drag event */
+ _callDrag(e) {
+ if (!this.dragging)
+ return;
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "drag" });
+ if (this.option.drag) {
+ this.option.drag(ev, this.ui());
+ }
+ this.triggerEvent("drag", ev);
+ }
+ /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */
+ _mouseMove(e) {
+ var _a;
+ let s = this.mouseDownEvent;
+ if (this.dragging) {
+ this._dragFollow(e);
+ if (dd_manager_1.DDManager.pauseDrag) {
+ const pause = Number.isInteger(dd_manager_1.DDManager.pauseDrag) ? dd_manager_1.DDManager.pauseDrag : 100;
+ if (this.dragTimeout)
+ window.clearTimeout(this.dragTimeout);
+ this.dragTimeout = window.setTimeout(() => this._callDrag(e), pause);
+ } else {
+ this._callDrag(e);
+ }
+ } else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {
+ this.dragging = true;
+ dd_manager_1.DDManager.dragElement = this;
+ let grid = (_a = this.el.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid;
+ if (grid) {
+ dd_manager_1.DDManager.dropElement = grid.el.ddElement.ddDroppable;
+ } else {
+ delete dd_manager_1.DDManager.dropElement;
+ }
+ this.helper = this._createHelper(e);
+ this._setupHelperContainmentStyle();
+ this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "dragstart" });
+ this._setupHelperStyle(e);
+ if (this.option.start) {
+ this.option.start(ev, this.ui());
+ }
+ this.triggerEvent("dragstart", ev);
+ }
+ e.preventDefault();
+ return true;
+ }
+ /** @internal call when the mouse gets released to drop the item at current location */
+ _mouseUp(e) {
+ var _a;
+ document.removeEventListener("mousemove", this._mouseMove, true);
+ document.removeEventListener("mouseup", this._mouseUp, true);
+ if (dd_touch_1.isTouch) {
+ this.dragEl.removeEventListener("touchmove", dd_touch_1.touchmove, true);
+ this.dragEl.removeEventListener("touchend", dd_touch_1.touchend, true);
+ }
+ if (this.dragging) {
+ delete this.dragging;
+ if (((_a = dd_manager_1.DDManager.dropElement) === null || _a === void 0 ? void 0 : _a.el) === this.el.parentElement) {
+ delete dd_manager_1.DDManager.dropElement;
+ }
+ this.helperContainment.style.position = this.parentOriginStylePosition || null;
+ if (this.helper === this.el) {
+ this._removeHelperStyle();
+ } else {
+ this.helper.remove();
+ }
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "dragstop" });
+ if (this.option.stop) {
+ this.option.stop(ev);
+ }
+ this.triggerEvent("dragstop", ev);
+ if (dd_manager_1.DDManager.dropElement) {
+ dd_manager_1.DDManager.dropElement.drop(e);
+ }
+ }
+ delete this.helper;
+ delete this.mouseDownEvent;
+ delete dd_manager_1.DDManager.dragElement;
+ delete dd_manager_1.DDManager.dropElement;
+ delete dd_manager_1.DDManager.mouseHandled;
+ e.preventDefault();
+ }
+ /** @internal create a clone copy (or user defined method) of the original drag item if set */
+ _createHelper(event) {
+ let helper = this.el;
+ if (typeof this.option.helper === "function") {
+ helper = this.option.helper(event);
+ } else if (this.option.helper === "clone") {
+ helper = utils_1.Utils.cloneNode(this.el);
+ }
+ if (!document.body.contains(helper)) {
+ utils_1.Utils.appendTo(helper, this.option.appendTo === "parent" ? this.el.parentNode : this.option.appendTo);
+ }
+ if (helper === this.el) {
+ this.dragElementOriginStyle = _DDDraggable.originStyleProp.map((prop) => this.el.style[prop]);
+ }
+ return helper;
+ }
+ /** @internal set the fix position of the dragged item */
+ _setupHelperStyle(e) {
+ this.helper.classList.add("ui-draggable-dragging");
+ const style = this.helper.style;
+ style.pointerEvents = "none";
+ style["min-width"] = 0;
+ style.width = this.dragOffset.width + "px";
+ style.height = this.dragOffset.height + "px";
+ style.willChange = "left, top";
+ style.position = "fixed";
+ this._dragFollow(e);
+ style.transition = "none";
+ setTimeout(() => {
+ if (this.helper) {
+ style.transition = null;
+ }
+ }, 0);
+ return this;
+ }
+ /** @internal restore back the original style before dragging */
+ _removeHelperStyle() {
+ var _a;
+ this.helper.classList.remove("ui-draggable-dragging");
+ let node = (_a = this.helper) === null || _a === void 0 ? void 0 : _a.gridstackNode;
+ if (!(node === null || node === void 0 ? void 0 : node._isAboutToRemove) && this.dragElementOriginStyle) {
+ let helper = this.helper;
+ let transition = this.dragElementOriginStyle["transition"] || null;
+ helper.style.transition = this.dragElementOriginStyle["transition"] = "none";
+ _DDDraggable.originStyleProp.forEach((prop) => helper.style[prop] = this.dragElementOriginStyle[prop] || null);
+ setTimeout(() => helper.style.transition = transition, 50);
+ }
+ delete this.dragElementOriginStyle;
+ return this;
+ }
+ /** @internal updates the top/left position to follow the mouse */
+ _dragFollow(e) {
+ let containmentRect = { left: 0, top: 0 };
+ const style = this.helper.style;
+ const offset = this.dragOffset;
+ style.left = e.clientX + offset.offsetLeft - containmentRect.left + "px";
+ style.top = e.clientY + offset.offsetTop - containmentRect.top + "px";
+ }
+ /** @internal */
+ _setupHelperContainmentStyle() {
+ this.helperContainment = this.helper.parentElement;
+ if (this.helper.style.position !== "fixed") {
+ this.parentOriginStylePosition = this.helperContainment.style.position;
+ if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {
+ this.helperContainment.style.position = "relative";
+ }
+ }
+ return this;
+ }
+ /** @internal */
+ _getDragOffset(event, el, parent) {
+ let xformOffsetX = 0;
+ let xformOffsetY = 0;
+ if (parent) {
+ const testEl = document.createElement("div");
+ utils_1.Utils.addElStyles(testEl, {
+ opacity: "0",
+ position: "fixed",
+ top: "0px",
+ left: "0px",
+ width: "1px",
+ height: "1px",
+ zIndex: "-999999"
+ });
+ parent.appendChild(testEl);
+ const testElPosition = testEl.getBoundingClientRect();
+ parent.removeChild(testEl);
+ xformOffsetX = testElPosition.left;
+ xformOffsetY = testElPosition.top;
+ }
+ const targetOffset = el.getBoundingClientRect();
+ return {
+ left: targetOffset.left,
+ top: targetOffset.top,
+ offsetLeft: -event.clientX + targetOffset.left - xformOffsetX,
+ offsetTop: -event.clientY + targetOffset.top - xformOffsetY,
+ width: targetOffset.width,
+ height: targetOffset.height
+ };
+ }
+ /** @internal TODO: set to public as called by DDDroppable! */
+ ui() {
+ const containmentEl = this.el.parentElement;
+ const containmentRect = containmentEl.getBoundingClientRect();
+ const offset = this.helper.getBoundingClientRect();
+ return {
+ position: {
+ top: offset.top - containmentRect.top,
+ left: offset.left - containmentRect.left
+ }
+ /* not used by GridStack for now...
+ helper: [this.helper], //The object arr representing the helper that's being dragged.
+ offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.
+ */
+ };
+ }
+ };
+ exports.DDDraggable = DDDraggable;
+ DDDraggable.originStyleProp = ["transition", "pointerEvents", "position", "left", "top", "minWidth", "willChange"];
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-droppable.js
+ var require_dd_droppable = __commonJS({
+ "node_modules/gridstack/dist/dd-droppable.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDDroppable = void 0;
+ var dd_manager_1 = require_dd_manager();
+ var dd_base_impl_1 = require_dd_base_impl();
+ var utils_1 = require_utils();
+ var dd_touch_1 = require_dd_touch();
+ var DDDroppable = class extends dd_base_impl_1.DDBaseImplement {
+ constructor(el, opts = {}) {
+ super();
+ this.el = el;
+ this.option = opts;
+ this._mouseEnter = this._mouseEnter.bind(this);
+ this._mouseLeave = this._mouseLeave.bind(this);
+ this.enable();
+ this._setupAccept();
+ }
+ on(event, callback) {
+ super.on(event, callback);
+ }
+ off(event) {
+ super.off(event);
+ }
+ enable() {
+ if (this.disabled === false)
+ return;
+ super.enable();
+ this.el.classList.add("ui-droppable");
+ this.el.classList.remove("ui-droppable-disabled");
+ this.el.addEventListener("mouseenter", this._mouseEnter);
+ this.el.addEventListener("mouseleave", this._mouseLeave);
+ if (dd_touch_1.isTouch) {
+ this.el.addEventListener("pointerenter", dd_touch_1.pointerenter);
+ this.el.addEventListener("pointerleave", dd_touch_1.pointerleave);
+ }
+ }
+ disable(forDestroy = false) {
+ if (this.disabled === true)
+ return;
+ super.disable();
+ this.el.classList.remove("ui-droppable");
+ if (!forDestroy)
+ this.el.classList.add("ui-droppable-disabled");
+ this.el.removeEventListener("mouseenter", this._mouseEnter);
+ this.el.removeEventListener("mouseleave", this._mouseLeave);
+ if (dd_touch_1.isTouch) {
+ this.el.removeEventListener("pointerenter", dd_touch_1.pointerenter);
+ this.el.removeEventListener("pointerleave", dd_touch_1.pointerleave);
+ }
+ }
+ destroy() {
+ this.disable(true);
+ this.el.classList.remove("ui-droppable");
+ this.el.classList.remove("ui-droppable-disabled");
+ super.destroy();
+ }
+ updateOption(opts) {
+ Object.keys(opts).forEach((key) => this.option[key] = opts[key]);
+ this._setupAccept();
+ return this;
+ }
+ /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */
+ _mouseEnter(e) {
+ if (!dd_manager_1.DDManager.dragElement)
+ return;
+ if (!this._canDrop(dd_manager_1.DDManager.dragElement.el))
+ return;
+ e.preventDefault();
+ e.stopPropagation();
+ if (dd_manager_1.DDManager.dropElement && dd_manager_1.DDManager.dropElement !== this) {
+ dd_manager_1.DDManager.dropElement._mouseLeave(e);
+ }
+ dd_manager_1.DDManager.dropElement = this;
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "dropover" });
+ if (this.option.over) {
+ this.option.over(ev, this._ui(dd_manager_1.DDManager.dragElement));
+ }
+ this.triggerEvent("dropover", ev);
+ this.el.classList.add("ui-droppable-over");
+ }
+ /** @internal called when the item is leaving our area, stop tracking if we had moving item */
+ _mouseLeave(e) {
+ var _a;
+ if (!dd_manager_1.DDManager.dragElement || dd_manager_1.DDManager.dropElement !== this)
+ return;
+ e.preventDefault();
+ e.stopPropagation();
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "dropout" });
+ if (this.option.out) {
+ this.option.out(ev, this._ui(dd_manager_1.DDManager.dragElement));
+ }
+ this.triggerEvent("dropout", ev);
+ if (dd_manager_1.DDManager.dropElement === this) {
+ delete dd_manager_1.DDManager.dropElement;
+ let parentDrop;
+ let parent = this.el.parentElement;
+ while (!parentDrop && parent) {
+ parentDrop = (_a = parent.ddElement) === null || _a === void 0 ? void 0 : _a.ddDroppable;
+ parent = parent.parentElement;
+ }
+ if (parentDrop) {
+ parentDrop._mouseEnter(e);
+ }
+ }
+ }
+ /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */
+ drop(e) {
+ e.preventDefault();
+ const ev = utils_1.Utils.initEvent(e, { target: this.el, type: "drop" });
+ if (this.option.drop) {
+ this.option.drop(ev, this._ui(dd_manager_1.DDManager.dragElement));
+ }
+ this.triggerEvent("drop", ev);
+ }
+ /** @internal true if element matches the string/method accept option */
+ _canDrop(el) {
+ return el && (!this.accept || this.accept(el));
+ }
+ /** @internal */
+ _setupAccept() {
+ if (!this.option.accept)
+ return this;
+ if (typeof this.option.accept === "string") {
+ this.accept = (el) => el.matches(this.option.accept);
+ } else {
+ this.accept = this.option.accept;
+ }
+ return this;
+ }
+ /** @internal */
+ _ui(drag) {
+ return Object.assign({ draggable: drag.el }, drag.ui());
+ }
+ };
+ exports.DDDroppable = DDDroppable;
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-element.js
+ var require_dd_element = __commonJS({
+ "node_modules/gridstack/dist/dd-element.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDElement = void 0;
+ var dd_resizable_1 = require_dd_resizable();
+ var dd_draggable_1 = require_dd_draggable();
+ var dd_droppable_1 = require_dd_droppable();
+ var DDElement = class _DDElement {
+ constructor(el) {
+ this.el = el;
+ }
+ static init(el) {
+ if (!el.ddElement) {
+ el.ddElement = new _DDElement(el);
+ }
+ return el.ddElement;
+ }
+ on(eventName, callback) {
+ if (this.ddDraggable && ["drag", "dragstart", "dragstop"].indexOf(eventName) > -1) {
+ this.ddDraggable.on(eventName, callback);
+ } else if (this.ddDroppable && ["drop", "dropover", "dropout"].indexOf(eventName) > -1) {
+ this.ddDroppable.on(eventName, callback);
+ } else if (this.ddResizable && ["resizestart", "resize", "resizestop"].indexOf(eventName) > -1) {
+ this.ddResizable.on(eventName, callback);
+ }
+ return this;
+ }
+ off(eventName) {
+ if (this.ddDraggable && ["drag", "dragstart", "dragstop"].indexOf(eventName) > -1) {
+ this.ddDraggable.off(eventName);
+ } else if (this.ddDroppable && ["drop", "dropover", "dropout"].indexOf(eventName) > -1) {
+ this.ddDroppable.off(eventName);
+ } else if (this.ddResizable && ["resizestart", "resize", "resizestop"].indexOf(eventName) > -1) {
+ this.ddResizable.off(eventName);
+ }
+ return this;
+ }
+ setupDraggable(opts) {
+ if (!this.ddDraggable) {
+ this.ddDraggable = new dd_draggable_1.DDDraggable(this.el, opts);
+ } else {
+ this.ddDraggable.updateOption(opts);
+ }
+ return this;
+ }
+ cleanDraggable() {
+ if (this.ddDraggable) {
+ this.ddDraggable.destroy();
+ delete this.ddDraggable;
+ }
+ return this;
+ }
+ setupResizable(opts) {
+ if (!this.ddResizable) {
+ this.ddResizable = new dd_resizable_1.DDResizable(this.el, opts);
+ } else {
+ this.ddResizable.updateOption(opts);
+ }
+ return this;
+ }
+ cleanResizable() {
+ if (this.ddResizable) {
+ this.ddResizable.destroy();
+ delete this.ddResizable;
+ }
+ return this;
+ }
+ setupDroppable(opts) {
+ if (!this.ddDroppable) {
+ this.ddDroppable = new dd_droppable_1.DDDroppable(this.el, opts);
+ } else {
+ this.ddDroppable.updateOption(opts);
+ }
+ return this;
+ }
+ cleanDroppable() {
+ if (this.ddDroppable) {
+ this.ddDroppable.destroy();
+ delete this.ddDroppable;
+ }
+ return this;
+ }
+ };
+ exports.DDElement = DDElement;
+ }
+ });
+
+ // node_modules/gridstack/dist/dd-gridstack.js
+ var require_dd_gridstack = __commonJS({
+ "node_modules/gridstack/dist/dd-gridstack.js"(exports) {
+ "use strict";
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.DDGridStack = void 0;
+ var utils_1 = require_utils();
+ var dd_manager_1 = require_dd_manager();
+ var dd_element_1 = require_dd_element();
+ var DDGridStack = class {
+ resizable(el, opts, key, value) {
+ this._getDDElements(el).forEach((dEl) => {
+ if (opts === "disable" || opts === "enable") {
+ dEl.ddResizable && dEl.ddResizable[opts]();
+ } else if (opts === "destroy") {
+ dEl.ddResizable && dEl.cleanResizable();
+ } else if (opts === "option") {
+ dEl.setupResizable({ [key]: value });
+ } else {
+ const grid = dEl.el.gridstackNode.grid;
+ let handles = dEl.el.getAttribute("gs-resize-handles") ? dEl.el.getAttribute("gs-resize-handles") : grid.opts.resizable.handles;
+ let autoHide = !grid.opts.alwaysShowResizeHandle;
+ dEl.setupResizable(Object.assign(Object.assign(Object.assign({}, grid.opts.resizable), { handles, autoHide }), {
+ start: opts.start,
+ stop: opts.stop,
+ resize: opts.resize
+ }));
+ }
+ });
+ return this;
+ }
+ draggable(el, opts, key, value) {
+ this._getDDElements(el).forEach((dEl) => {
+ if (opts === "disable" || opts === "enable") {
+ dEl.ddDraggable && dEl.ddDraggable[opts]();
+ } else if (opts === "destroy") {
+ dEl.ddDraggable && dEl.cleanDraggable();
+ } else if (opts === "option") {
+ dEl.setupDraggable({ [key]: value });
+ } else {
+ const grid = dEl.el.gridstackNode.grid;
+ dEl.setupDraggable(Object.assign(Object.assign({}, grid.opts.draggable), {
+ // containment: (grid.parentGridItem && !grid.opts.dragOut) ? grid.el.parentElement : (grid.opts.draggable.containment || null),
+ start: opts.start,
+ stop: opts.stop,
+ drag: opts.drag
+ }));
+ }
+ });
+ return this;
+ }
+ dragIn(el, opts) {
+ this._getDDElements(el).forEach((dEl) => dEl.setupDraggable(opts));
+ return this;
+ }
+ droppable(el, opts, key, value) {
+ if (typeof opts.accept === "function" && !opts._accept) {
+ opts._accept = opts.accept;
+ opts.accept = (el2) => opts._accept(el2);
+ }
+ this._getDDElements(el).forEach((dEl) => {
+ if (opts === "disable" || opts === "enable") {
+ dEl.ddDroppable && dEl.ddDroppable[opts]();
+ } else if (opts === "destroy") {
+ if (dEl.ddDroppable) {
+ dEl.cleanDroppable();
+ }
+ } else if (opts === "option") {
+ dEl.setupDroppable({ [key]: value });
+ } else {
+ dEl.setupDroppable(opts);
+ }
+ });
+ return this;
+ }
+ /** true if element is droppable */
+ isDroppable(el) {
+ return !!(el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled);
+ }
+ /** true if element is draggable */
+ isDraggable(el) {
+ return !!(el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled);
+ }
+ /** true if element is draggable */
+ isResizable(el) {
+ return !!(el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled);
+ }
+ on(el, name, callback) {
+ this._getDDElements(el).forEach((dEl) => dEl.on(name, (event) => {
+ callback(event, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.el : event.target, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.helper : null);
+ }));
+ return this;
+ }
+ off(el, name) {
+ this._getDDElements(el).forEach((dEl) => dEl.off(name));
+ return this;
+ }
+ /** @internal returns a list of DD elements, creating them on the fly by default */
+ _getDDElements(els, create = true) {
+ let hosts = utils_1.Utils.getElements(els);
+ if (!hosts.length)
+ return [];
+ let list = hosts.map((e) => e.ddElement || (create ? dd_element_1.DDElement.init(e) : null));
+ if (!create) {
+ list.filter((d) => d);
+ }
+ return list;
+ }
+ };
+ exports.DDGridStack = DDGridStack;
+ }
+ });
+
+ // node_modules/gridstack/dist/gridstack.js
+ var require_gridstack = __commonJS({
+ "node_modules/gridstack/dist/gridstack.js"(exports) {
+ "use strict";
+ var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) {
+ if (k2 === void 0)
+ k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() {
+ return m[k];
+ } });
+ } : function(o, m, k, k2) {
+ if (k2 === void 0)
+ k2 = k;
+ o[k2] = m[k];
+ });
+ var __exportStar = exports && exports.__exportStar || function(m, exports2) {
+ for (var p in m)
+ if (p !== "default" && !exports2.hasOwnProperty(p))
+ __createBinding(exports2, m, p);
+ };
+ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.GridStack = void 0;
+ var gridstack_engine_1 = require_gridstack_engine();
+ var utils_1 = require_utils();
+ var types_1 = require_types();
+ var dd_gridstack_1 = require_dd_gridstack();
+ var dd_touch_1 = require_dd_touch();
+ var dd_manager_1 = require_dd_manager();
+ var dd = new dd_gridstack_1.DDGridStack();
+ __exportStar(require_types(), exports);
+ __exportStar(require_utils(), exports);
+ __exportStar(require_gridstack_engine(), exports);
+ __exportStar(require_dd_gridstack(), exports);
+ var GridStack2 = class _GridStack {
+ /**
+ * Construct a grid item from the given element and options
+ * @param el
+ * @param opts
+ */
+ constructor(el, opts = {}) {
+ var _a, _b;
+ this._gsEventHandler = {};
+ this._extraDragRow = 0;
+ this.el = el;
+ opts = opts || {};
+ if (!el.classList.contains("grid-stack")) {
+ this.el.classList.add("grid-stack");
+ }
+ if (opts.row) {
+ opts.minRow = opts.maxRow = opts.row;
+ delete opts.row;
+ }
+ let rowAttr = utils_1.Utils.toNumber(el.getAttribute("gs-row"));
+ if (opts.column === "auto") {
+ delete opts.column;
+ }
+ let anyOpts = opts;
+ if (anyOpts.minWidth !== void 0) {
+ opts.oneColumnSize = opts.oneColumnSize || anyOpts.minWidth;
+ delete anyOpts.minWidth;
+ }
+ if (opts.alwaysShowResizeHandle !== void 0) {
+ opts._alwaysShowResizeHandle = opts.alwaysShowResizeHandle;
+ }
+ let defaults = Object.assign(Object.assign({}, utils_1.Utils.cloneDeep(types_1.gridDefaults)), { column: utils_1.Utils.toNumber(el.getAttribute("gs-column")) || types_1.gridDefaults.column, minRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute("gs-min-row")) || types_1.gridDefaults.minRow, maxRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute("gs-max-row")) || types_1.gridDefaults.maxRow, staticGrid: utils_1.Utils.toBool(el.getAttribute("gs-static")) || types_1.gridDefaults.staticGrid, draggable: {
+ handle: (opts.handleClass ? "." + opts.handleClass : opts.handle ? opts.handle : "") || types_1.gridDefaults.draggable.handle
+ }, removableOptions: {
+ accept: opts.itemClass ? "." + opts.itemClass : types_1.gridDefaults.removableOptions.accept
+ } });
+ if (el.getAttribute("gs-animate")) {
+ defaults.animate = utils_1.Utils.toBool(el.getAttribute("gs-animate"));
+ }
+ this.opts = utils_1.Utils.defaults(opts, defaults);
+ opts = null;
+ this._initMargin();
+ if (this.opts.column !== 1 && !this.opts.disableOneColumnMode && this._widthOrContainer() <= this.opts.oneColumnSize) {
+ this._prevColumn = this.getColumn();
+ this.opts.column = 1;
+ }
+ if (this.opts.rtl === "auto") {
+ this.opts.rtl = el.style.direction === "rtl";
+ }
+ if (this.opts.rtl) {
+ this.el.classList.add("grid-stack-rtl");
+ }
+ let parentGridItem = (_a = utils_1.Utils.closestUpByClass(this.el, types_1.gridDefaults.itemClass)) === null || _a === void 0 ? void 0 : _a.gridstackNode;
+ if (parentGridItem) {
+ parentGridItem.subGrid = this;
+ this.parentGridItem = parentGridItem;
+ this.el.classList.add("grid-stack-nested");
+ parentGridItem.el.classList.add("grid-stack-sub-grid");
+ }
+ this._isAutoCellHeight = this.opts.cellHeight === "auto";
+ if (this._isAutoCellHeight || this.opts.cellHeight === "initial") {
+ this.cellHeight(void 0, false);
+ } else {
+ if (typeof this.opts.cellHeight == "number" && this.opts.cellHeightUnit && this.opts.cellHeightUnit !== types_1.gridDefaults.cellHeightUnit) {
+ this.opts.cellHeight = this.opts.cellHeight + this.opts.cellHeightUnit;
+ delete this.opts.cellHeightUnit;
+ }
+ this.cellHeight(this.opts.cellHeight, false);
+ }
+ if (this.opts.alwaysShowResizeHandle === "mobile") {
+ this.opts.alwaysShowResizeHandle = dd_touch_1.isTouch;
+ }
+ this._styleSheetClass = "grid-stack-instance-" + gridstack_engine_1.GridStackEngine._idSeq++;
+ this.el.classList.add(this._styleSheetClass);
+ this._setStaticClass();
+ let engineClass = this.opts.engineClass || _GridStack.engineClass || gridstack_engine_1.GridStackEngine;
+ this.engine = new engineClass({
+ column: this.getColumn(),
+ float: this.opts.float,
+ maxRow: this.opts.maxRow,
+ onChange: (cbNodes) => {
+ let maxH = 0;
+ this.engine.nodes.forEach((n) => {
+ maxH = Math.max(maxH, n.y + n.h);
+ });
+ cbNodes.forEach((n) => {
+ let el2 = n.el;
+ if (!el2)
+ return;
+ if (n._removeDOM) {
+ if (el2)
+ el2.remove();
+ delete n._removeDOM;
+ } else {
+ this._writePosAttr(el2, n);
+ }
+ });
+ this._updateStyles(false, maxH);
+ }
+ });
+ if (this.opts.auto) {
+ this.batchUpdate();
+ this.getGridItems().forEach((el2) => this._prepareElement(el2));
+ this.batchUpdate(false);
+ }
+ if (this.opts.children) {
+ let children = this.opts.children;
+ delete this.opts.children;
+ if (children.length)
+ this.load(children);
+ }
+ this.setAnimation(this.opts.animate);
+ this._updateStyles();
+ if (this.opts.column != 12) {
+ this.el.classList.add("grid-stack-" + this.opts.column);
+ }
+ if (this.opts.dragIn)
+ _GridStack.setupDragIn(this.opts.dragIn, this.opts.dragInOptions);
+ delete this.opts.dragIn;
+ delete this.opts.dragInOptions;
+ if (this.opts.subGridDynamic && !dd_manager_1.DDManager.pauseDrag)
+ dd_manager_1.DDManager.pauseDrag = true;
+ if (((_b = this.opts.draggable) === null || _b === void 0 ? void 0 : _b.pause) !== void 0)
+ dd_manager_1.DDManager.pauseDrag = this.opts.draggable.pause;
+ this._setupRemoveDrop();
+ this._setupAcceptWidget();
+ this._updateWindowResizeEvent();
+ }
+ /**
+ * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will
+ * simply return the existing instance (ignore any passed options). There is also an initAll() version that support
+ * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.
+ * @param options grid options (optional)
+ * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)
+ *
+ * @example
+ * let grid = GridStack.init();
+ *
+ * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later
+ * let grid = document.querySelector('.grid-stack').gridstack;
+ */
+ static init(options2 = {}, elOrString = ".grid-stack") {
+ let el = _GridStack.getGridElement(elOrString);
+ if (!el) {
+ if (typeof elOrString === "string") {
+ console.error('GridStack.initAll() no grid was found with selector "' + elOrString + '" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.');
+ } else {
+ console.error("GridStack.init() no grid element was passed.");
+ }
+ return null;
+ }
+ if (!el.gridstack) {
+ el.gridstack = new _GridStack(el, utils_1.Utils.cloneDeep(options2));
+ }
+ return el.gridstack;
+ }
+ /**
+ * Will initialize a list of elements (given a selector) and return an array of grids.
+ * @param options grid options (optional)
+ * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)
+ *
+ * @example
+ * let grids = GridStack.initAll();
+ * grids.forEach(...)
+ */
+ static initAll(options2 = {}, selector = ".grid-stack") {
+ let grids2 = [];
+ _GridStack.getGridElements(selector).forEach((el) => {
+ if (!el.gridstack) {
+ el.gridstack = new _GridStack(el, utils_1.Utils.cloneDeep(options2));
+ delete options2.dragIn;
+ delete options2.dragInOptions;
+ }
+ grids2.push(el.gridstack);
+ });
+ if (grids2.length === 0) {
+ console.error('GridStack.initAll() no grid was found with selector "' + selector + '" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.');
+ }
+ return grids2;
+ }
+ /**
+ * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then
+ * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from
+ * JSON serialized data, including options.
+ * @param parent HTML element parent to the grid
+ * @param opt grids options used to initialize the grid, and list of children
+ */
+ static addGrid(parent, opt = {}) {
+ if (!parent)
+ return null;
+ let el = parent;
+ const parentIsGrid = parent.classList.contains("grid-stack");
+ if (!parentIsGrid || opt.addRemoveCB) {
+ if (opt.addRemoveCB) {
+ el = opt.addRemoveCB(parent, opt, true, true);
+ } else {
+ let doc = document.implementation.createHTMLDocument("");
+ doc.body.innerHTML = `
`;
+ el = doc.body.children[0];
+ parent.appendChild(el);
+ }
+ }
+ let grid = _GridStack.init(opt, el);
+ return grid;
+ }
+ /** call this method to register your engine instead of the default one.
+ * See instead `GridStackOptions.engineClass` if you only need to
+ * replace just one instance.
+ */
+ static registerEngine(engineClass) {
+ _GridStack.engineClass = engineClass;
+ }
+ /** @internal create placeholder DIV as needed */
+ get placeholder() {
+ if (!this._placeholder) {
+ let placeholderChild = document.createElement("div");
+ placeholderChild.className = "placeholder-content";
+ if (this.opts.placeholderText) {
+ placeholderChild.innerHTML = this.opts.placeholderText;
+ }
+ this._placeholder = document.createElement("div");
+ this._placeholder.classList.add(this.opts.placeholderClass, types_1.gridDefaults.itemClass, this.opts.itemClass);
+ this.placeholder.appendChild(placeholderChild);
+ }
+ return this._placeholder;
+ }
+ /**
+ * add a new widget and returns it.
+ *
+ * Widget will be always placed even if result height is more than actual grid height.
+ * You need to use `willItFit()` before calling addWidget for additional check.
+ * See also `makeWidget()`.
+ *
+ * @example
+ * let grid = GridStack.init();
+ * grid.addWidget({w: 3, content: 'hello'});
+ * grid.addWidget('
hello
', {w: 3});
+ *
+ * @param el GridStackWidget (which can have content string as well), html element, or string definition to add
+ * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget
+ */
+ addWidget(els, options2) {
+ function isGridStackWidget(w) {
+ return w.el !== void 0 || w.x !== void 0 || w.y !== void 0 || w.w !== void 0 || w.h !== void 0 || w.content !== void 0 ? true : false;
+ }
+ let el;
+ let node;
+ if (typeof els === "string") {
+ let doc = document.implementation.createHTMLDocument("");
+ doc.body.innerHTML = els;
+ el = doc.body.children[0];
+ } else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {
+ node = options2 = els;
+ if (node === null || node === void 0 ? void 0 : node.el) {
+ el = node.el;
+ } else if (this.opts.addRemoveCB) {
+ el = this.opts.addRemoveCB(this.el, options2, true, false);
+ } else {
+ let content = (options2 === null || options2 === void 0 ? void 0 : options2.content) || "";
+ let doc = document.implementation.createHTMLDocument("");
+ doc.body.innerHTML = `
${content}
`;
+ el = doc.body.children[0];
+ }
+ } else {
+ el = els;
+ }
+ if (!el)
+ return;
+ let domAttr = this._readAttr(el);
+ options2 = utils_1.Utils.cloneDeep(options2) || {};
+ utils_1.Utils.defaults(options2, domAttr);
+ node = this.engine.prepareNode(options2);
+ this._writeAttr(el, options2);
+ if (this._insertNotAppend) {
+ this.el.prepend(el);
+ } else {
+ this.el.appendChild(el);
+ }
+ this._prepareElement(el, true, options2);
+ this._updateContainerHeight();
+ if (node.subGrid) {
+ this.makeSubGrid(node.el, void 0, void 0, false);
+ }
+ if (this._prevColumn && this.opts.column === 1) {
+ this._ignoreLayoutsNodeChange = true;
+ }
+ this._triggerAddEvent();
+ this._triggerChangeEvent();
+ delete this._ignoreLayoutsNodeChange;
+ return el;
+ }
+ /**
+ * Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them
+ * from the parent's subGrid options.
+ * @param el gridItem element to convert
+ * @param ops (optional) sub-grid options, else default to node, then parent settings, else defaults
+ * @param nodeToAdd (optional) node to add to the newly created sub grid (used when dragging over existing regular item)
+ * @returns newly created grid
+ */
+ makeSubGrid(el, ops, nodeToAdd, saveContent = true) {
+ var _a, _b, _c;
+ let node = el.gridstackNode;
+ if (!node) {
+ node = this.makeWidget(el).gridstackNode;
+ }
+ if ((_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el)
+ return node.subGrid;
+ let subGridTemplate;
+ let grid = this;
+ while (grid && !subGridTemplate) {
+ subGridTemplate = (_b = grid.opts) === null || _b === void 0 ? void 0 : _b.subGrid;
+ grid = (_c = grid.parentGridItem) === null || _c === void 0 ? void 0 : _c.grid;
+ }
+ ops = utils_1.Utils.cloneDeep(Object.assign(Object.assign(Object.assign({}, subGridTemplate || {}), { children: void 0 }), ops || node.subGrid));
+ node.subGrid = ops;
+ let autoColumn;
+ if (ops.column === "auto") {
+ autoColumn = true;
+ ops.column = Math.max(node.w || 1, (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd.w) || 1);
+ ops.disableOneColumnMode = true;
+ }
+ let content = node.el.querySelector(".grid-stack-item-content");
+ let newItem;
+ let newItemOpt;
+ if (saveContent) {
+ this._removeDD(node.el);
+ newItemOpt = Object.assign(Object.assign({}, node), { x: 0, y: 0 });
+ utils_1.Utils.removeInternalForSave(newItemOpt);
+ delete newItemOpt.subGrid;
+ if (node.content) {
+ newItemOpt.content = node.content;
+ delete node.content;
+ }
+ if (this.opts.addRemoveCB) {
+ newItem = this.opts.addRemoveCB(this.el, newItemOpt, true, false);
+ } else {
+ let doc = document.implementation.createHTMLDocument("");
+ doc.body.innerHTML = ``;
+ newItem = doc.body.children[0];
+ newItem.appendChild(content);
+ doc.body.innerHTML = ``;
+ content = doc.body.children[0];
+ node.el.appendChild(content);
+ }
+ this._prepareDragDropByNode(node);
+ }
+ if (nodeToAdd) {
+ let w = autoColumn ? ops.column : node.w;
+ let h = node.h + nodeToAdd.h;
+ let style = node.el.style;
+ style.transition = "none";
+ this.update(node.el, { w, h });
+ setTimeout(() => style.transition = null);
+ }
+ if (this.opts.addRemoveCB) {
+ ops.addRemoveCB = ops.addRemoveCB || this.opts.addRemoveCB;
+ }
+ let subGrid = node.subGrid = _GridStack.addGrid(content, ops);
+ if (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd._moving)
+ subGrid._isTemp = true;
+ if (autoColumn)
+ subGrid._autoColumn = true;
+ if (saveContent) {
+ subGrid.addWidget(newItem, newItemOpt);
+ }
+ if (nodeToAdd) {
+ if (nodeToAdd._moving) {
+ window.setTimeout(() => utils_1.Utils.simulateMouseEvent(nodeToAdd._event, "mouseenter", subGrid.el), 0);
+ } else {
+ subGrid.addWidget(node.el, node);
+ }
+ }
+ return subGrid;
+ }
+ /**
+ * called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back
+ * to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)
+ */
+ removeAsSubGrid(nodeThatRemoved) {
+ var _a;
+ let pGrid = (_a = this.parentGridItem) === null || _a === void 0 ? void 0 : _a.grid;
+ if (!pGrid)
+ return;
+ pGrid.batchUpdate();
+ pGrid.removeWidget(this.parentGridItem.el, true, true);
+ this.engine.nodes.forEach((n) => {
+ n.x += this.parentGridItem.x;
+ n.y += this.parentGridItem.y;
+ pGrid.addWidget(n.el, n);
+ });
+ pGrid.batchUpdate(false);
+ if (this.parentGridItem)
+ delete this.parentGridItem.subGrid;
+ delete this.parentGridItem;
+ if (nodeThatRemoved) {
+ window.setTimeout(() => utils_1.Utils.simulateMouseEvent(nodeThatRemoved._event, "mouseenter", pGrid.el), 0);
+ }
+ }
+ /**
+ /**
+ * saves the current layout returning a list of widgets for serialization which might include any nested grids.
+ * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will
+ * be removed.
+ * @param saveGridOpt if true (default false), save the grid options itself, so you can call the new GridStack.addGrid()
+ * to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.
+ * @returns list of widgets or full grid option, including .children list of widgets
+ */
+ save(saveContent = true, saveGridOpt = false) {
+ let list = this.engine.save(saveContent);
+ list.forEach((n) => {
+ var _a;
+ if (saveContent && n.el && !n.subGrid) {
+ let sub = n.el.querySelector(".grid-stack-item-content");
+ n.content = sub ? sub.innerHTML : void 0;
+ if (!n.content)
+ delete n.content;
+ } else {
+ if (!saveContent) {
+ delete n.content;
+ }
+ if ((_a = n.subGrid) === null || _a === void 0 ? void 0 : _a.el) {
+ const listOrOpt = n.subGrid.save(saveContent, saveGridOpt);
+ n.subGrid = saveGridOpt ? listOrOpt : { children: listOrOpt };
+ }
+ }
+ delete n.el;
+ });
+ if (saveGridOpt) {
+ let o = utils_1.Utils.cloneDeep(this.opts);
+ if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {
+ o.margin = o.marginTop;
+ delete o.marginTop;
+ delete o.marginRight;
+ delete o.marginBottom;
+ delete o.marginLeft;
+ }
+ if (o.rtl === (this.el.style.direction === "rtl")) {
+ o.rtl = "auto";
+ }
+ if (this._isAutoCellHeight) {
+ o.cellHeight = "auto";
+ }
+ if (this._autoColumn) {
+ o.column = "auto";
+ delete o.disableOneColumnMode;
+ }
+ const origShow = o._alwaysShowResizeHandle;
+ delete o._alwaysShowResizeHandle;
+ if (origShow !== void 0) {
+ o.alwaysShowResizeHandle = origShow;
+ } else {
+ delete o.alwaysShowResizeHandle;
+ }
+ utils_1.Utils.removeInternalAndSame(o, types_1.gridDefaults);
+ o.children = list;
+ return o;
+ }
+ return list;
+ }
+ /**
+ * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.
+ *
+ * @param layout list of widgets definition to update/create
+ * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving
+ * the user control of insertion.
+ *
+ * @example
+ * see http://gridstackjs.com/demo/serialization.html
+ **/
+ load(layout, addRemove = this.opts.addRemoveCB || true) {
+ let items = _GridStack.Utils.sort([...layout], -1, this._prevColumn || this.getColumn());
+ this._insertNotAppend = true;
+ if (this._prevColumn && this._prevColumn !== this.opts.column && items.some((n) => n.x + n.w > this.opts.column)) {
+ this._ignoreLayoutsNodeChange = true;
+ this.engine.cacheLayout(items, this._prevColumn, true);
+ }
+ const prevCB = this.opts.addRemoveCB;
+ if (typeof addRemove === "function")
+ this.opts.addRemoveCB = addRemove;
+ let removed = [];
+ this.batchUpdate();
+ if (addRemove) {
+ let copyNodes = [...this.engine.nodes];
+ copyNodes.forEach((n) => {
+ let item = items.find((w) => n.id === w.id);
+ if (!item) {
+ if (this.opts.addRemoveCB)
+ this.opts.addRemoveCB(this.el, n, false, false);
+ removed.push(n);
+ this.removeWidget(n.el, true, false);
+ }
+ });
+ }
+ items.forEach((w) => {
+ let item = w.id || w.id === 0 ? this.engine.nodes.find((n) => n.id === w.id) : void 0;
+ if (item) {
+ this.update(item.el, w);
+ if (w.subGrid && w.subGrid.children) {
+ let sub = item.el.querySelector(".grid-stack");
+ if (sub && sub.gridstack) {
+ sub.gridstack.load(w.subGrid.children);
+ this._insertNotAppend = true;
+ }
+ }
+ } else if (addRemove) {
+ this.addWidget(w);
+ }
+ });
+ this.engine.removedNodes = removed;
+ this.batchUpdate(false);
+ delete this._ignoreLayoutsNodeChange;
+ delete this._insertNotAppend;
+ prevCB ? this.opts.addRemoveCB = prevCB : delete this.opts.addRemoveCB;
+ return this;
+ }
+ /**
+ * use before calling a bunch of `addWidget()` to prevent un-necessary relayouts in between (more efficient)
+ * and get a single event callback. You will see no changes until `batchUpdate(false)` is called.
+ */
+ batchUpdate(flag = true) {
+ this.engine.batchUpdate(flag);
+ if (!flag) {
+ this._triggerRemoveEvent();
+ this._triggerAddEvent();
+ this._triggerChangeEvent();
+ }
+ return this;
+ }
+ /**
+ * Gets current cell height.
+ */
+ getCellHeight(forcePixel = false) {
+ if (this.opts.cellHeight && this.opts.cellHeight !== "auto" && (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === "px")) {
+ return this.opts.cellHeight;
+ }
+ let el = this.el.querySelector("." + this.opts.itemClass);
+ if (el) {
+ let height = utils_1.Utils.toNumber(el.getAttribute("gs-h"));
+ return Math.round(el.offsetHeight / height);
+ }
+ let rows = parseInt(this.el.getAttribute("gs-current-row"));
+ return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight;
+ }
+ /**
+ * Update current cell height - see `GridStackOptions.cellHeight` for format.
+ * This method rebuilds an internal CSS style sheet.
+ * Note: You can expect performance issues if call this method too often.
+ *
+ * @param val the cell height. If not passed (undefined), cells content will be made square (match width minus margin),
+ * if pass 0 the CSS will be generated by the application instead.
+ * @param update (Optional) if false, styles will not be updated
+ *
+ * @example
+ * grid.cellHeight(100); // same as 100px
+ * grid.cellHeight('70px');
+ * grid.cellHeight(grid.cellWidth() * 1.2);
+ */
+ cellHeight(val, update = true) {
+ if (update && val !== void 0) {
+ if (this._isAutoCellHeight !== (val === "auto")) {
+ this._isAutoCellHeight = val === "auto";
+ this._updateWindowResizeEvent();
+ }
+ }
+ if (val === "initial" || val === "auto") {
+ val = void 0;
+ }
+ if (val === void 0) {
+ let marginDiff = -this.opts.marginRight - this.opts.marginLeft + this.opts.marginTop + this.opts.marginBottom;
+ val = this.cellWidth() + marginDiff;
+ }
+ let data = utils_1.Utils.parseHeight(val);
+ if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {
+ return this;
+ }
+ this.opts.cellHeightUnit = data.unit;
+ this.opts.cellHeight = data.h;
+ if (update) {
+ this._updateStyles(true);
+ }
+ return this;
+ }
+ /** Gets current cell width. */
+ cellWidth() {
+ return this._widthOrContainer() / this.getColumn();
+ }
+ /** return our expected width (or parent) for 1 column check */
+ _widthOrContainer() {
+ return this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth;
+ }
+ /** re-layout grid items to reclaim any empty space */
+ compact() {
+ this.engine.compact();
+ this._triggerChangeEvent();
+ return this;
+ }
+ /**
+ * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,
+ * as well as cache the original layout so you can revert back to previous positions without loss.
+ * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],
+ * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)
+ * @param column - Integer > 0 (default 12).
+ * @param layout specify the type of re-layout that will happen (position, size, etc...).
+ * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column
+ */
+ column(column, layout = "moveScale") {
+ if (column < 1 || this.opts.column === column)
+ return this;
+ let oldColumn = this.getColumn();
+ if (column === 1) {
+ this._prevColumn = oldColumn;
+ } else {
+ delete this._prevColumn;
+ }
+ this.el.classList.remove("grid-stack-" + oldColumn);
+ this.el.classList.add("grid-stack-" + column);
+ this.opts.column = this.engine.column = column;
+ let domNodes;
+ if (column === 1 && this.opts.oneColumnModeDomSort) {
+ domNodes = [];
+ this.getGridItems().forEach((el) => {
+ if (el.gridstackNode) {
+ domNodes.push(el.gridstackNode);
+ }
+ });
+ if (!domNodes.length) {
+ domNodes = void 0;
+ }
+ }
+ this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);
+ if (this._isAutoCellHeight)
+ this.cellHeight();
+ this._ignoreLayoutsNodeChange = true;
+ this._triggerChangeEvent();
+ delete this._ignoreLayoutsNodeChange;
+ return this;
+ }
+ /**
+ * get the number of columns in the grid (default 12)
+ */
+ getColumn() {
+ return this.opts.column;
+ }
+ /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children in DOM order */
+ getGridItems() {
+ return Array.from(this.el.children).filter((el) => el.matches("." + this.opts.itemClass) && !el.matches("." + this.opts.placeholderClass));
+ }
+ /**
+ * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.
+ * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).
+ */
+ destroy(removeDOM = true) {
+ if (!this.el)
+ return;
+ this._updateWindowResizeEvent(true);
+ this.setStatic(true, false);
+ this.setAnimation(false);
+ if (!removeDOM) {
+ this.removeAll(removeDOM);
+ this.el.classList.remove(this._styleSheetClass);
+ } else {
+ this.el.parentNode.removeChild(this.el);
+ }
+ this._removeStylesheet();
+ this.el.removeAttribute("gs-current-row");
+ if (this.parentGridItem)
+ delete this.parentGridItem.subGrid;
+ delete this.parentGridItem;
+ delete this.opts;
+ delete this._placeholder;
+ delete this.engine;
+ delete this.el.gridstack;
+ delete this.el;
+ return this;
+ }
+ /**
+ * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)
+ */
+ float(val) {
+ if (this.opts.float !== val) {
+ this.opts.float = this.engine.float = val;
+ this._triggerChangeEvent();
+ }
+ return this;
+ }
+ /**
+ * get the current float mode
+ */
+ getFloat() {
+ return this.engine.float;
+ }
+ /**
+ * Get the position of the cell under a pixel on screen.
+ * @param position the position of the pixel to resolve in
+ * absolute coordinates, as an object with top and left properties
+ * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).
+ * Useful when grid is within `position: relative` element
+ *
+ * Returns an object with properties `x` and `y` i.e. the column and row in the grid.
+ */
+ getCellFromPixel(position, useDocRelative = false) {
+ let box = this.el.getBoundingClientRect();
+ let containerPos;
+ if (useDocRelative) {
+ containerPos = { top: box.top + document.documentElement.scrollTop, left: box.left };
+ } else {
+ containerPos = { top: this.el.offsetTop, left: this.el.offsetLeft };
+ }
+ let relativeLeft = position.left - containerPos.left;
+ let relativeTop = position.top - containerPos.top;
+ let columnWidth = box.width / this.getColumn();
+ let rowHeight = box.height / parseInt(this.el.getAttribute("gs-current-row"));
+ return { x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight) };
+ }
+ /** returns the current number of rows, which will be at least `minRow` if set */
+ getRow() {
+ return Math.max(this.engine.getRow(), this.opts.minRow);
+ }
+ /**
+ * Checks if specified area is empty.
+ * @param x the position x.
+ * @param y the position y.
+ * @param w the width of to check
+ * @param h the height of to check
+ */
+ isAreaEmpty(x, y, w, h) {
+ return this.engine.isAreaEmpty(x, y, w, h);
+ }
+ /**
+ * If you add elements to your grid by hand, you have to tell gridstack afterwards to make them widgets.
+ * If you want gridstack to add the elements for you, use `addWidget()` instead.
+ * Makes the given element a widget and returns it.
+ * @param els widget or single selector to convert.
+ *
+ * @example
+ * let grid = GridStack.init();
+ * grid.el.appendChild('');
+ * grid.makeWidget('#gsi-1');
+ */
+ makeWidget(els) {
+ let el = _GridStack.getElement(els);
+ this._prepareElement(el, true);
+ this._updateContainerHeight();
+ this._triggerAddEvent();
+ this._triggerChangeEvent();
+ return el;
+ }
+ /**
+ * Event handler that extracts our CustomEvent data out automatically for receiving custom
+ * notifications (see doc for supported events)
+ * @param name of the event (see possible values) or list of names space separated
+ * @param callback function called with event and optional second/third param
+ * (see README documentation for each signature).
+ *
+ * @example
+ * grid.on('added', function(e, items) { log('added ', items)} );
+ * or
+ * grid.on('added removed change', function(e, items) { log(e.type, items)} );
+ *
+ * Note: in some cases it is the same as calling native handler and parsing the event.
+ * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );
+ *
+ */
+ on(name, callback) {
+ if (name.indexOf(" ") !== -1) {
+ let names2 = name.split(" ");
+ names2.forEach((name2) => this.on(name2, callback));
+ return this;
+ }
+ if (name === "change" || name === "added" || name === "removed" || name === "enable" || name === "disable") {
+ let noData = name === "enable" || name === "disable";
+ if (noData) {
+ this._gsEventHandler[name] = (event) => callback(event);
+ } else {
+ this._gsEventHandler[name] = (event) => callback(event, event.detail);
+ }
+ this.el.addEventListener(name, this._gsEventHandler[name]);
+ } else if (name === "drag" || name === "dragstart" || name === "dragstop" || name === "resizestart" || name === "resize" || name === "resizestop" || name === "dropped") {
+ this._gsEventHandler[name] = callback;
+ } else {
+ console.log("GridStack.on(" + name + ') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');
+ }
+ return this;
+ }
+ /**
+ * unsubscribe from the 'on' event below
+ * @param name of the event (see possible values)
+ */
+ off(name) {
+ if (name.indexOf(" ") !== -1) {
+ let names2 = name.split(" ");
+ names2.forEach((name2) => this.off(name2));
+ return this;
+ }
+ if (name === "change" || name === "added" || name === "removed" || name === "enable" || name === "disable") {
+ if (this._gsEventHandler[name]) {
+ this.el.removeEventListener(name, this._gsEventHandler[name]);
+ }
+ }
+ delete this._gsEventHandler[name];
+ return this;
+ }
+ /**
+ * Removes widget from the grid.
+ * @param el widget or selector to modify
+ * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).
+ * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).
+ */
+ removeWidget(els, removeDOM = true, triggerEvent = true) {
+ _GridStack.getElements(els).forEach((el) => {
+ if (el.parentElement && el.parentElement !== this.el)
+ return;
+ let node = el.gridstackNode;
+ if (!node) {
+ node = this.engine.nodes.find((n) => el === n.el);
+ }
+ if (!node)
+ return;
+ delete el.gridstackNode;
+ this._removeDD(el);
+ this.engine.removeNode(node, removeDOM, triggerEvent);
+ if (removeDOM && el.parentElement) {
+ el.remove();
+ }
+ });
+ if (triggerEvent) {
+ this._triggerRemoveEvent();
+ this._triggerChangeEvent();
+ }
+ return this;
+ }
+ /**
+ * Removes all widgets from the grid.
+ * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).
+ */
+ removeAll(removeDOM = true) {
+ this.engine.nodes.forEach((n) => {
+ delete n.el.gridstackNode;
+ this._removeDD(n.el);
+ });
+ this.engine.removeAll(removeDOM);
+ this._triggerRemoveEvent();
+ return this;
+ }
+ /**
+ * Toggle the grid animation state. Toggles the `grid-stack-animate` class.
+ * @param doAnimate if true the grid will animate.
+ */
+ setAnimation(doAnimate) {
+ if (doAnimate) {
+ this.el.classList.add("grid-stack-animate");
+ } else {
+ this.el.classList.remove("grid-stack-animate");
+ }
+ return this;
+ }
+ /**
+ * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.
+ * Also toggle the grid-stack-static class.
+ * @param val if true the grid become static.
+ * @param updateClass true (default) if css class gets updated
+ * @param recurse true (default) if sub-grids also get updated
+ */
+ setStatic(val, updateClass = true, recurse = true) {
+ if (this.opts.staticGrid === val)
+ return this;
+ this.opts.staticGrid = val;
+ this._setupRemoveDrop();
+ this._setupAcceptWidget();
+ this.engine.nodes.forEach((n) => {
+ this._prepareDragDropByNode(n);
+ if (n.subGrid && recurse)
+ n.subGrid.setStatic(val, updateClass, recurse);
+ });
+ if (updateClass) {
+ this._setStaticClass();
+ }
+ return this;
+ }
+ /**
+ * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.
+ * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)
+ * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.
+ */
+ update(els, opt) {
+ if (arguments.length > 2) {
+ console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon");
+ let a = arguments, i = 1;
+ opt = { x: a[i++], y: a[i++], w: a[i++], h: a[i++] };
+ return this.update(els, opt);
+ }
+ _GridStack.getElements(els).forEach((el) => {
+ if (!el || !el.gridstackNode)
+ return;
+ let n = el.gridstackNode;
+ let w = utils_1.Utils.cloneDeep(opt);
+ delete w.autoPosition;
+ let keys = ["x", "y", "w", "h"];
+ let m;
+ if (keys.some((k) => w[k] !== void 0 && w[k] !== n[k])) {
+ m = {};
+ keys.forEach((k) => {
+ m[k] = w[k] !== void 0 ? w[k] : n[k];
+ delete w[k];
+ });
+ }
+ if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {
+ m = {};
+ }
+ if (w.content) {
+ let sub = el.querySelector(".grid-stack-item-content");
+ if (sub && sub.innerHTML !== w.content) {
+ sub.innerHTML = w.content;
+ }
+ delete w.content;
+ }
+ let changed = false;
+ let ddChanged = false;
+ for (const key in w) {
+ if (key[0] !== "_" && n[key] !== w[key]) {
+ n[key] = w[key];
+ changed = true;
+ ddChanged = ddChanged || !this.opts.staticGrid && (key === "noResize" || key === "noMove" || key === "locked");
+ }
+ }
+ if (m) {
+ this.engine.cleanNodes().beginUpdate(n).moveNode(n, m);
+ this._updateContainerHeight();
+ this._triggerChangeEvent();
+ this.engine.endUpdate();
+ }
+ if (changed) {
+ this._writeAttr(el, n);
+ }
+ if (ddChanged) {
+ this._prepareDragDropByNode(n);
+ }
+ });
+ return this;
+ }
+ /**
+ * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).
+ * @param value margin value
+ */
+ margin(value) {
+ let isMultiValue = typeof value === "string" && value.split(" ").length > 1;
+ if (!isMultiValue) {
+ let data = utils_1.Utils.parseHeight(value);
+ if (this.opts.marginUnit === data.unit && this.opts.margin === data.h)
+ return;
+ }
+ this.opts.margin = value;
+ this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = void 0;
+ this._initMargin();
+ this._updateStyles(true);
+ return this;
+ }
+ /** returns current margin number value (undefined if 4 sides don't match) */
+ getMargin() {
+ return this.opts.margin;
+ }
+ /**
+ * Returns true if the height of the grid will be less than the vertical
+ * constraint. Always returns true if grid doesn't have height constraint.
+ * @param node contains x,y,w,h,auto-position options
+ *
+ * @example
+ * if (grid.willItFit(newWidget)) {
+ * grid.addWidget(newWidget);
+ * } else {
+ * alert('Not enough free space to place the widget');
+ * }
+ */
+ willItFit(node) {
+ if (arguments.length > 1) {
+ console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");
+ let a = arguments, i = 0, w = { x: a[i++], y: a[i++], w: a[i++], h: a[i++], autoPosition: a[i++] };
+ return this.willItFit(w);
+ }
+ return this.engine.willItFit(node);
+ }
+ /** @internal */
+ _triggerChangeEvent() {
+ if (this.engine.batchMode)
+ return this;
+ let elements = this.engine.getDirtyNodes(true);
+ if (elements && elements.length) {
+ if (!this._ignoreLayoutsNodeChange) {
+ this.engine.layoutsNodesChange(elements);
+ }
+ this._triggerEvent("change", elements);
+ }
+ this.engine.saveInitial();
+ return this;
+ }
+ /** @internal */
+ _triggerAddEvent() {
+ if (this.engine.batchMode)
+ return this;
+ if (this.engine.addedNodes && this.engine.addedNodes.length > 0) {
+ if (!this._ignoreLayoutsNodeChange) {
+ this.engine.layoutsNodesChange(this.engine.addedNodes);
+ }
+ this.engine.addedNodes.forEach((n) => {
+ delete n._dirty;
+ });
+ this._triggerEvent("added", this.engine.addedNodes);
+ this.engine.addedNodes = [];
+ }
+ return this;
+ }
+ /** @internal */
+ _triggerRemoveEvent() {
+ if (this.engine.batchMode)
+ return this;
+ if (this.engine.removedNodes && this.engine.removedNodes.length > 0) {
+ this._triggerEvent("removed", this.engine.removedNodes);
+ this.engine.removedNodes = [];
+ }
+ return this;
+ }
+ /** @internal */
+ _triggerEvent(type, data) {
+ let event = data ? new CustomEvent(type, { bubbles: false, detail: data }) : new Event(type);
+ this.el.dispatchEvent(event);
+ return this;
+ }
+ /** @internal called to delete the current dynamic style sheet used for our layout */
+ _removeStylesheet() {
+ if (this._styles) {
+ utils_1.Utils.removeStylesheet(this._styleSheetClass);
+ delete this._styles;
+ }
+ return this;
+ }
+ /** @internal updated/create the CSS styles for row based layout and initial margin setting */
+ _updateStyles(forceUpdate = false, maxH) {
+ if (forceUpdate) {
+ this._removeStylesheet();
+ }
+ if (!maxH)
+ maxH = this.getRow();
+ this._updateContainerHeight();
+ if (this.opts.cellHeight === 0) {
+ return this;
+ }
+ let cellHeight = this.opts.cellHeight;
+ let cellHeightUnit = this.opts.cellHeightUnit;
+ let prefix = `.${this._styleSheetClass} > .${this.opts.itemClass}`;
+ if (!this._styles) {
+ let styleLocation = this.opts.styleInHead ? void 0 : this.el.parentNode;
+ this._styles = utils_1.Utils.createStylesheet(this._styleSheetClass, styleLocation, {
+ nonce: this.opts.nonce
+ });
+ if (!this._styles)
+ return this;
+ this._styles._max = 0;
+ utils_1.Utils.addCSSRule(this._styles, prefix, `min-height: ${cellHeight}${cellHeightUnit}`);
+ let top = this.opts.marginTop + this.opts.marginUnit;
+ let bottom = this.opts.marginBottom + this.opts.marginUnit;
+ let right = this.opts.marginRight + this.opts.marginUnit;
+ let left = this.opts.marginLeft + this.opts.marginUnit;
+ let content = `${prefix} > .grid-stack-item-content`;
+ let placeholder = `.${this._styleSheetClass} > .grid-stack-placeholder > .placeholder-content`;
+ utils_1.Utils.addCSSRule(this._styles, content, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);
+ utils_1.Utils.addCSSRule(this._styles, placeholder, `top: ${top}; right: ${right}; bottom: ${bottom}; left: ${left};`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-ne`, `right: ${right}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-e`, `right: ${right}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-se`, `right: ${right}; bottom: ${bottom}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-nw`, `left: ${left}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-w`, `left: ${left}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix} > .ui-resizable-sw`, `left: ${left}; bottom: ${bottom}`);
+ }
+ maxH = maxH || this._styles._max;
+ if (maxH > this._styles._max) {
+ let getHeight = (rows) => cellHeight * rows + cellHeightUnit;
+ for (let i = this._styles._max + 1; i <= maxH; i++) {
+ let h = getHeight(i);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-y="${i - 1}"]`, `top: ${getHeight(i - 1)}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-h="${i}"]`, `height: ${h}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-min-h="${i}"]`, `min-height: ${h}`);
+ utils_1.Utils.addCSSRule(this._styles, `${prefix}[gs-max-h="${i}"]`, `max-height: ${h}`);
+ }
+ this._styles._max = maxH;
+ }
+ return this;
+ }
+ /** @internal */
+ _updateContainerHeight() {
+ if (!this.engine || this.engine.batchMode)
+ return this;
+ let row = this.getRow() + this._extraDragRow;
+ this.el.setAttribute("gs-current-row", String(row));
+ if (row === 0) {
+ this.el.style.removeProperty("min-height");
+ return this;
+ }
+ let cellHeight = this.opts.cellHeight;
+ let unit = this.opts.cellHeightUnit;
+ if (!cellHeight)
+ return this;
+ this.el.style.minHeight = row * cellHeight + unit;
+ return this;
+ }
+ /** @internal */
+ _prepareElement(el, triggerAddEvent = false, node) {
+ el.classList.add(this.opts.itemClass);
+ node = node || this._readAttr(el);
+ el.gridstackNode = node;
+ node.el = el;
+ node.grid = this;
+ let copy = Object.assign({}, node);
+ node = this.engine.addNode(node, triggerAddEvent);
+ if (!utils_1.Utils.same(node, copy)) {
+ this._writeAttr(el, node);
+ }
+ this._prepareDragDropByNode(node);
+ return this;
+ }
+ /** @internal call to write position x,y,w,h attributes back to element */
+ _writePosAttr(el, n) {
+ if (n.x !== void 0 && n.x !== null) {
+ el.setAttribute("gs-x", String(n.x));
+ }
+ if (n.y !== void 0 && n.y !== null) {
+ el.setAttribute("gs-y", String(n.y));
+ }
+ if (n.w) {
+ el.setAttribute("gs-w", String(n.w));
+ }
+ if (n.h) {
+ el.setAttribute("gs-h", String(n.h));
+ }
+ return this;
+ }
+ /** @internal call to write any default attributes back to element */
+ _writeAttr(el, node) {
+ if (!node)
+ return this;
+ this._writePosAttr(el, node);
+ let attrs = {
+ autoPosition: "gs-auto-position",
+ minW: "gs-min-w",
+ minH: "gs-min-h",
+ maxW: "gs-max-w",
+ maxH: "gs-max-h",
+ noResize: "gs-no-resize",
+ noMove: "gs-no-move",
+ locked: "gs-locked",
+ id: "gs-id"
+ };
+ for (const key in attrs) {
+ if (node[key]) {
+ el.setAttribute(attrs[key], String(node[key]));
+ } else {
+ el.removeAttribute(attrs[key]);
+ }
+ }
+ return this;
+ }
+ /** @internal call to read any default attributes from element */
+ _readAttr(el) {
+ let node = {};
+ node.x = utils_1.Utils.toNumber(el.getAttribute("gs-x"));
+ node.y = utils_1.Utils.toNumber(el.getAttribute("gs-y"));
+ node.w = utils_1.Utils.toNumber(el.getAttribute("gs-w"));
+ node.h = utils_1.Utils.toNumber(el.getAttribute("gs-h"));
+ node.maxW = utils_1.Utils.toNumber(el.getAttribute("gs-max-w"));
+ node.minW = utils_1.Utils.toNumber(el.getAttribute("gs-min-w"));
+ node.maxH = utils_1.Utils.toNumber(el.getAttribute("gs-max-h"));
+ node.minH = utils_1.Utils.toNumber(el.getAttribute("gs-min-h"));
+ node.autoPosition = utils_1.Utils.toBool(el.getAttribute("gs-auto-position"));
+ node.noResize = utils_1.Utils.toBool(el.getAttribute("gs-no-resize"));
+ node.noMove = utils_1.Utils.toBool(el.getAttribute("gs-no-move"));
+ node.locked = utils_1.Utils.toBool(el.getAttribute("gs-locked"));
+ node.id = el.getAttribute("gs-id");
+ for (const key in node) {
+ if (!node.hasOwnProperty(key))
+ return;
+ if (!node[key] && node[key] !== 0) {
+ delete node[key];
+ }
+ }
+ return node;
+ }
+ /** @internal */
+ _setStaticClass() {
+ let classes = ["grid-stack-static"];
+ if (this.opts.staticGrid) {
+ this.el.classList.add(...classes);
+ this.el.setAttribute("gs-static", "true");
+ } else {
+ this.el.classList.remove(...classes);
+ this.el.removeAttribute("gs-static");
+ }
+ return this;
+ }
+ /**
+ * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off
+ * and remember the prev columns we used, or get our count from parent, as well as check for auto cell height (square)
+ */
+ onParentResize() {
+ if (!this.el || !this.el.clientWidth)
+ return;
+ let changedColumn = false;
+ if (this._autoColumn && this.parentGridItem) {
+ if (this.opts.column !== this.parentGridItem.w) {
+ changedColumn = true;
+ this.column(this.parentGridItem.w, "none");
+ }
+ } else {
+ let oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize;
+ if (this.opts.column === 1 !== oneColumn) {
+ changedColumn = true;
+ if (this.opts.animate) {
+ this.setAnimation(false);
+ }
+ this.column(oneColumn ? 1 : this._prevColumn);
+ if (this.opts.animate) {
+ this.setAnimation(true);
+ }
+ }
+ }
+ if (this._isAutoCellHeight) {
+ if (!changedColumn && this.opts.cellHeightThrottle) {
+ if (!this._cellHeightThrottle) {
+ this._cellHeightThrottle = utils_1.Utils.throttle(() => this.cellHeight(), this.opts.cellHeightThrottle);
+ }
+ this._cellHeightThrottle();
+ } else {
+ this.cellHeight();
+ }
+ }
+ this.engine.nodes.forEach((n) => {
+ if (n.subGrid) {
+ n.subGrid.onParentResize();
+ }
+ });
+ return this;
+ }
+ /** add or remove the window size event handler */
+ _updateWindowResizeEvent(forceRemove = false) {
+ const workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.parentGridItem;
+ if (!forceRemove && workTodo && !this._windowResizeBind) {
+ this._windowResizeBind = this.onParentResize.bind(this);
+ window.addEventListener("resize", this._windowResizeBind);
+ } else if ((forceRemove || !workTodo) && this._windowResizeBind) {
+ window.removeEventListener("resize", this._windowResizeBind);
+ delete this._windowResizeBind;
+ }
+ return this;
+ }
+ /** @internal convert a potential selector into actual element */
+ static getElement(els = ".grid-stack-item") {
+ return utils_1.Utils.getElement(els);
+ }
+ /** @internal */
+ static getElements(els = ".grid-stack-item") {
+ return utils_1.Utils.getElements(els);
+ }
+ /** @internal */
+ static getGridElement(els) {
+ return _GridStack.getElement(els);
+ }
+ /** @internal */
+ static getGridElements(els) {
+ return utils_1.Utils.getElements(els);
+ }
+ /** @internal initialize margin top/bottom/left/right and units */
+ _initMargin() {
+ let data;
+ let margin = 0;
+ let margins = [];
+ if (typeof this.opts.margin === "string") {
+ margins = this.opts.margin.split(" ");
+ }
+ if (margins.length === 2) {
+ this.opts.marginTop = this.opts.marginBottom = margins[0];
+ this.opts.marginLeft = this.opts.marginRight = margins[1];
+ } else if (margins.length === 4) {
+ this.opts.marginTop = margins[0];
+ this.opts.marginRight = margins[1];
+ this.opts.marginBottom = margins[2];
+ this.opts.marginLeft = margins[3];
+ } else {
+ data = utils_1.Utils.parseHeight(this.opts.margin);
+ this.opts.marginUnit = data.unit;
+ margin = this.opts.margin = data.h;
+ }
+ if (this.opts.marginTop === void 0) {
+ this.opts.marginTop = margin;
+ } else {
+ data = utils_1.Utils.parseHeight(this.opts.marginTop);
+ this.opts.marginTop = data.h;
+ delete this.opts.margin;
+ }
+ if (this.opts.marginBottom === void 0) {
+ this.opts.marginBottom = margin;
+ } else {
+ data = utils_1.Utils.parseHeight(this.opts.marginBottom);
+ this.opts.marginBottom = data.h;
+ delete this.opts.margin;
+ }
+ if (this.opts.marginRight === void 0) {
+ this.opts.marginRight = margin;
+ } else {
+ data = utils_1.Utils.parseHeight(this.opts.marginRight);
+ this.opts.marginRight = data.h;
+ delete this.opts.margin;
+ }
+ if (this.opts.marginLeft === void 0) {
+ this.opts.marginLeft = margin;
+ } else {
+ data = utils_1.Utils.parseHeight(this.opts.marginLeft);
+ this.opts.marginLeft = data.h;
+ delete this.opts.margin;
+ }
+ this.opts.marginUnit = data.unit;
+ if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {
+ this.opts.margin = this.opts.marginTop;
+ }
+ return this;
+ }
+ /* ===========================================================================================
+ * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts
+ * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039
+ * ===========================================================================================
+ */
+ /** get the global (but static to this code) DD implementation */
+ static getDD() {
+ return dd;
+ }
+ /**
+ * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.
+ * Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar
+ * is dynamically create and needs to be set later.
+ * @param dragIn string selector (ex: '.sidebar .grid-stack-item')
+ * @param dragInOptions options - see DDDragInOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}
+ **/
+ static setupDragIn(dragIn, dragInOptions) {
+ if ((dragInOptions === null || dragInOptions === void 0 ? void 0 : dragInOptions.pause) !== void 0) {
+ dd_manager_1.DDManager.pauseDrag = dragInOptions.pause;
+ }
+ if (typeof dragIn === "string") {
+ dragInOptions = Object.assign(Object.assign({}, types_1.dragInDefaultOptions), dragInOptions || {});
+ utils_1.Utils.getElements(dragIn).forEach((el) => {
+ if (!dd.isDraggable(el))
+ dd.dragIn(el, dragInOptions);
+ });
+ }
+ }
+ /**
+ * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.
+ * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.
+ * @param els widget or selector to modify.
+ * @param val if true widget will be draggable.
+ */
+ movable(els, val) {
+ if (this.opts.staticGrid)
+ return this;
+ _GridStack.getElements(els).forEach((el) => {
+ let node = el.gridstackNode;
+ if (!node)
+ return;
+ if (val)
+ delete node.noMove;
+ else
+ node.noMove = true;
+ this._prepareDragDropByNode(node);
+ });
+ return this;
+ }
+ /**
+ * Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.
+ * @param els widget or selector to modify
+ * @param val if true widget will be resizable.
+ */
+ resizable(els, val) {
+ if (this.opts.staticGrid)
+ return this;
+ _GridStack.getElements(els).forEach((el) => {
+ let node = el.gridstackNode;
+ if (!node)
+ return;
+ if (val)
+ delete node.noResize;
+ else
+ node.noResize = true;
+ this._prepareDragDropByNode(node);
+ });
+ return this;
+ }
+ /**
+ * Temporarily disables widgets moving/resizing.
+ * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.
+ * Note: no-op for static grid
+ * This is a shortcut for:
+ * @example
+ * grid.enableMove(false);
+ * grid.enableResize(false);
+ * @param recurse true (default) if sub-grids also get updated
+ */
+ disable(recurse = true) {
+ if (this.opts.staticGrid)
+ return;
+ this.enableMove(false, recurse);
+ this.enableResize(false, recurse);
+ this._triggerEvent("disable");
+ return this;
+ }
+ /**
+ * Re-enables widgets moving/resizing - see disable().
+ * Note: no-op for static grid.
+ * This is a shortcut for:
+ * @example
+ * grid.enableMove(true);
+ * grid.enableResize(true);
+ * @param recurse true (default) if sub-grids also get updated
+ */
+ enable(recurse = true) {
+ if (this.opts.staticGrid)
+ return;
+ this.enableMove(true, recurse);
+ this.enableResize(true, recurse);
+ this._triggerEvent("enable");
+ return this;
+ }
+ /**
+ * Enables/disables widget moving. No-op for static grids.
+ * @param recurse true (default) if sub-grids also get updated
+ */
+ enableMove(doEnable, recurse = true) {
+ if (this.opts.staticGrid)
+ return this;
+ this.opts.disableDrag = !doEnable;
+ this.engine.nodes.forEach((n) => {
+ this.movable(n.el, doEnable);
+ if (n.subGrid && recurse)
+ n.subGrid.enableMove(doEnable, recurse);
+ });
+ return this;
+ }
+ /**
+ * Enables/disables widget resizing. No-op for static grids.
+ * @param recurse true (default) if sub-grids also get updated
+ */
+ enableResize(doEnable, recurse = true) {
+ if (this.opts.staticGrid)
+ return this;
+ this.opts.disableResize = !doEnable;
+ this.engine.nodes.forEach((n) => {
+ this.resizable(n.el, doEnable);
+ if (n.subGrid && recurse)
+ n.subGrid.enableResize(doEnable, recurse);
+ });
+ return this;
+ }
+ /** @internal removes any drag&drop present (called during destroy) */
+ _removeDD(el) {
+ dd.draggable(el, "destroy").resizable(el, "destroy");
+ if (el.gridstackNode) {
+ delete el.gridstackNode._initDD;
+ }
+ delete el.ddElement;
+ return this;
+ }
+ /** @internal called to add drag over to support widgets being added externally */
+ _setupAcceptWidget() {
+ if (this.opts.staticGrid || !this.opts.acceptWidgets && !this.opts.removable) {
+ dd.droppable(this.el, "destroy");
+ return this;
+ }
+ let cellHeight, cellWidth;
+ let onDrag = (event, el, helper) => {
+ let node = el.gridstackNode;
+ if (!node)
+ return;
+ helper = helper || el;
+ let parent = this.el.getBoundingClientRect();
+ let { top, left } = helper.getBoundingClientRect();
+ left -= parent.left;
+ top -= parent.top;
+ let ui = { position: { top, left } };
+ if (node._temporaryRemoved) {
+ node.x = Math.max(0, Math.round(left / cellWidth));
+ node.y = Math.max(0, Math.round(top / cellHeight));
+ delete node.autoPosition;
+ this.engine.nodeBoundFix(node);
+ if (!this.engine.willItFit(node)) {
+ node.autoPosition = true;
+ if (!this.engine.willItFit(node)) {
+ dd.off(el, "drag");
+ return;
+ }
+ if (node._willFitPos) {
+ utils_1.Utils.copyPos(node, node._willFitPos);
+ delete node._willFitPos;
+ }
+ }
+ this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);
+ } else {
+ this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);
+ }
+ };
+ dd.droppable(this.el, {
+ accept: (el) => {
+ let node = el.gridstackNode;
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this)
+ return true;
+ if (!this.opts.acceptWidgets)
+ return false;
+ let canAccept = true;
+ if (typeof this.opts.acceptWidgets === "function") {
+ canAccept = this.opts.acceptWidgets(el);
+ } else {
+ let selector = this.opts.acceptWidgets === true ? ".grid-stack-item" : this.opts.acceptWidgets;
+ canAccept = el.matches(selector);
+ }
+ if (canAccept && node && this.opts.maxRow) {
+ let n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH };
+ canAccept = this.engine.willItFit(n);
+ }
+ return canAccept;
+ }
+ }).on(this.el, "dropover", (event, el, helper) => {
+ let node = el.gridstackNode;
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._temporaryRemoved) {
+ return false;
+ }
+ if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== this && !node._temporaryRemoved) {
+ let otherGrid = node.grid;
+ otherGrid._leave(el, helper);
+ }
+ cellWidth = this.cellWidth();
+ cellHeight = this.getCellHeight(true);
+ if (!node) {
+ node = this._readAttr(el);
+ }
+ if (!node.grid) {
+ node._isExternal = true;
+ el.gridstackNode = node;
+ }
+ helper = helper || el;
+ let w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;
+ let h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;
+ if (node.grid && node.grid !== this) {
+ if (!el._gridstackNodeOrig)
+ el._gridstackNodeOrig = node;
+ el.gridstackNode = node = Object.assign(Object.assign({}, node), { w, h, grid: this });
+ this.engine.cleanupNode(node).nodeBoundFix(node);
+ node._initDD = node._isExternal = // DOM needs to be re-parented on a drop
+ node._temporaryRemoved = true;
+ } else {
+ node.w = w;
+ node.h = h;
+ node._temporaryRemoved = true;
+ }
+ this._itemRemoving(node.el, false);
+ dd.on(el, "drag", onDrag);
+ onDrag(event, el, helper);
+ return false;
+ }).on(this.el, "dropout", (event, el, helper) => {
+ let node = el.gridstackNode;
+ if (!node)
+ return false;
+ if (!node.grid || node.grid === this) {
+ this._leave(el, helper);
+ if (this._isTemp) {
+ this.removeAsSubGrid(node);
+ }
+ }
+ return false;
+ }).on(this.el, "drop", (event, el, helper) => {
+ var _a, _b;
+ let node = el.gridstackNode;
+ if ((node === null || node === void 0 ? void 0 : node.grid) === this && !node._isExternal)
+ return false;
+ let wasAdded = !!this.placeholder.parentElement;
+ this.placeholder.remove();
+ let origNode = el._gridstackNodeOrig;
+ delete el._gridstackNodeOrig;
+ if (wasAdded && (origNode === null || origNode === void 0 ? void 0 : origNode.grid) && origNode.grid !== this) {
+ let oGrid = origNode.grid;
+ oGrid.engine.removedNodes.push(origNode);
+ oGrid._triggerRemoveEvent()._triggerChangeEvent();
+ if (oGrid.parentGridItem && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {
+ oGrid.removeAsSubGrid();
+ }
+ }
+ if (!node)
+ return false;
+ if (wasAdded) {
+ this.engine.cleanupNode(node);
+ node.grid = this;
+ }
+ dd.off(el, "drag");
+ if (helper !== el) {
+ helper.remove();
+ el.gridstackNode = origNode;
+ if (wasAdded) {
+ el = el.cloneNode(true);
+ }
+ } else {
+ el.remove();
+ this._removeDD(el);
+ }
+ if (!wasAdded)
+ return false;
+ el.gridstackNode = node;
+ node.el = el;
+ let subGrid = (_b = (_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el) === null || _b === void 0 ? void 0 : _b.gridstack;
+ utils_1.Utils.copyPos(node, this._readAttr(this.placeholder));
+ utils_1.Utils.removePositioningStyles(el);
+ this._writeAttr(el, node);
+ el.classList.add(types_1.gridDefaults.itemClass, this.opts.itemClass);
+ this.el.appendChild(el);
+ if (subGrid) {
+ subGrid.parentGridItem = node;
+ if (!subGrid.opts.styleInHead)
+ subGrid._updateStyles(true);
+ }
+ this._updateContainerHeight();
+ this.engine.addedNodes.push(node);
+ this._triggerAddEvent();
+ this._triggerChangeEvent();
+ this.engine.endUpdate();
+ if (this._gsEventHandler["dropped"]) {
+ this._gsEventHandler["dropped"](Object.assign(Object.assign({}, event), { type: "dropped" }), origNode && origNode.grid ? origNode : void 0, node);
+ }
+ window.setTimeout(() => {
+ if (node.el && node.el.parentElement) {
+ this._prepareDragDropByNode(node);
+ } else {
+ this.engine.removeNode(node);
+ }
+ delete node.grid._isTemp;
+ });
+ return false;
+ });
+ return this;
+ }
+ /** @internal mark item for removal */
+ _itemRemoving(el, remove) {
+ let node = el ? el.gridstackNode : void 0;
+ if (!node || !node.grid)
+ return;
+ remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;
+ remove ? el.classList.add("grid-stack-item-removing") : el.classList.remove("grid-stack-item-removing");
+ }
+ /** @internal called to setup a trash drop zone if the user specifies it */
+ _setupRemoveDrop() {
+ if (!this.opts.staticGrid && typeof this.opts.removable === "string") {
+ let trashEl = document.querySelector(this.opts.removable);
+ if (!trashEl)
+ return this;
+ if (!dd.isDroppable(trashEl)) {
+ dd.droppable(trashEl, this.opts.removableOptions).on(trashEl, "dropover", (event, el) => this._itemRemoving(el, true)).on(trashEl, "dropout", (event, el) => this._itemRemoving(el, false));
+ }
+ }
+ return this;
+ }
+ /** @internal prepares the element for drag&drop **/
+ _prepareDragDropByNode(node) {
+ let el = node.el;
+ const noMove = node.noMove || this.opts.disableDrag;
+ const noResize = node.noResize || this.opts.disableResize;
+ if (this.opts.staticGrid || noMove && noResize) {
+ if (node._initDD) {
+ this._removeDD(el);
+ delete node._initDD;
+ }
+ el.classList.add("ui-draggable-disabled", "ui-resizable-disabled");
+ return this;
+ }
+ if (!node._initDD) {
+ let cellWidth;
+ let cellHeight;
+ let onStartMoving = (event, ui) => {
+ if (this._gsEventHandler[event.type]) {
+ this._gsEventHandler[event.type](event, event.target);
+ }
+ cellWidth = this.cellWidth();
+ cellHeight = this.getCellHeight(true);
+ this._onStartMoving(el, event, ui, node, cellWidth, cellHeight);
+ };
+ let dragOrResize = (event, ui) => {
+ this._dragOrResize(el, event, ui, node, cellWidth, cellHeight);
+ };
+ let onEndMoving = (event) => {
+ this.placeholder.remove();
+ delete node._moving;
+ delete node._event;
+ delete node._lastTried;
+ let target = event.target;
+ if (!target.gridstackNode || target.gridstackNode.grid !== this)
+ return;
+ node.el = target;
+ if (node._isAboutToRemove) {
+ let gridToNotify = el.gridstackNode.grid;
+ if (gridToNotify._gsEventHandler[event.type]) {
+ gridToNotify._gsEventHandler[event.type](event, target);
+ }
+ this._removeDD(el);
+ gridToNotify.engine.removedNodes.push(node);
+ gridToNotify._triggerRemoveEvent();
+ delete el.gridstackNode;
+ delete node.el;
+ el.remove();
+ } else {
+ utils_1.Utils.removePositioningStyles(target);
+ if (node._temporaryRemoved) {
+ utils_1.Utils.copyPos(node, node._orig);
+ this._writePosAttr(target, node);
+ this.engine.addNode(node);
+ } else {
+ this._writePosAttr(target, node);
+ }
+ if (this._gsEventHandler[event.type]) {
+ this._gsEventHandler[event.type](event, target);
+ }
+ }
+ this._extraDragRow = 0;
+ this._updateContainerHeight();
+ this._triggerChangeEvent();
+ this.engine.endUpdate();
+ };
+ dd.draggable(el, {
+ start: onStartMoving,
+ stop: onEndMoving,
+ drag: dragOrResize
+ }).resizable(el, {
+ start: onStartMoving,
+ stop: onEndMoving,
+ resize: dragOrResize
+ });
+ node._initDD = true;
+ }
+ dd.draggable(el, noMove ? "disable" : "enable").resizable(el, noResize ? "disable" : "enable");
+ return this;
+ }
+ /** @internal handles actual drag/resize start **/
+ _onStartMoving(el, event, ui, node, cellWidth, cellHeight) {
+ this.engine.cleanNodes().beginUpdate(node);
+ this._writePosAttr(this.placeholder, node);
+ this.el.appendChild(this.placeholder);
+ node.el = this.placeholder;
+ node._lastUiPosition = ui.position;
+ node._prevYPix = ui.position.top;
+ node._moving = event.type === "dragstart";
+ delete node._lastTried;
+ if (event.type === "dropover" && node._temporaryRemoved) {
+ this.engine.addNode(node);
+ node._moving = true;
+ }
+ this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);
+ if (event.type === "resizestart") {
+ dd.resizable(el, "option", "minWidth", cellWidth * (node.minW || 1)).resizable(el, "option", "minHeight", cellHeight * (node.minH || 1));
+ if (node.maxW) {
+ dd.resizable(el, "option", "maxWidth", cellWidth * node.maxW);
+ }
+ if (node.maxH) {
+ dd.resizable(el, "option", "maxHeight", cellHeight * node.maxH);
+ }
+ }
+ }
+ /** @internal handles actual drag/resize **/
+ _dragOrResize(el, event, ui, node, cellWidth, cellHeight) {
+ let p = Object.assign({}, node._orig);
+ let resizing;
+ let mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;
+ let mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);
+ mLeft = Math.min(mLeft, mWidth);
+ mRight = Math.min(mRight, mWidth);
+ mTop = Math.min(mTop, mHeight);
+ mBottom = Math.min(mBottom, mHeight);
+ if (event.type === "drag") {
+ if (node._temporaryRemoved)
+ return;
+ let distance = ui.position.top - node._prevYPix;
+ node._prevYPix = ui.position.top;
+ if (this.opts.draggable.scroll !== false) {
+ utils_1.Utils.updateScrollPosition(el, ui.position, distance);
+ }
+ let left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);
+ let top = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);
+ p.x = Math.round(left / cellWidth);
+ p.y = Math.round(top / cellHeight);
+ let prev = this._extraDragRow;
+ if (this.engine.collide(node, p)) {
+ let row = this.getRow();
+ let extra = Math.max(0, p.y + node.h - row);
+ if (this.opts.maxRow && row + extra > this.opts.maxRow) {
+ extra = Math.max(0, this.opts.maxRow - row);
+ }
+ this._extraDragRow = extra;
+ } else
+ this._extraDragRow = 0;
+ if (this._extraDragRow !== prev)
+ this._updateContainerHeight();
+ if (node.x === p.x && node.y === p.y)
+ return;
+ } else if (event.type === "resize") {
+ if (p.x < 0)
+ return;
+ utils_1.Utils.updateScrollResize(event, el, cellHeight);
+ p.w = Math.round((ui.size.width - mLeft) / cellWidth);
+ p.h = Math.round((ui.size.height - mTop) / cellHeight);
+ if (node.w === p.w && node.h === p.h)
+ return;
+ if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)
+ return;
+ let left = ui.position.left + mLeft;
+ let top = ui.position.top + mTop;
+ p.x = Math.round(left / cellWidth);
+ p.y = Math.round(top / cellHeight);
+ resizing = true;
+ }
+ node._event = event;
+ node._lastTried = p;
+ let rect = {
+ x: ui.position.left + mLeft,
+ y: ui.position.top + mTop,
+ w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,
+ h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom
+ };
+ if (this.engine.moveNodeCheck(node, Object.assign(Object.assign({}, p), { cellWidth, cellHeight, rect, resizing }))) {
+ node._lastUiPosition = ui.position;
+ this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);
+ delete node._skipDown;
+ if (resizing && node.subGrid) {
+ node.subGrid.onParentResize();
+ }
+ this._extraDragRow = 0;
+ this._updateContainerHeight();
+ let target = event.target;
+ this._writePosAttr(target, node);
+ if (this._gsEventHandler[event.type]) {
+ this._gsEventHandler[event.type](event, target);
+ }
+ }
+ }
+ /** @internal called when item leaving our area by either cursor dropout event
+ * or shape is outside our boundaries. remove it from us, and mark temporary if this was
+ * our item to start with else restore prev node values from prev grid it came from.
+ **/
+ _leave(el, helper) {
+ let node = el.gridstackNode;
+ if (!node)
+ return;
+ dd.off(el, "drag");
+ if (node._temporaryRemoved)
+ return;
+ node._temporaryRemoved = true;
+ this.engine.removeNode(node);
+ node.el = node._isExternal && helper ? helper : el;
+ if (this.opts.removable === true) {
+ this._itemRemoving(el, true);
+ }
+ if (el._gridstackNodeOrig) {
+ el.gridstackNode = el._gridstackNodeOrig;
+ delete el._gridstackNodeOrig;
+ } else if (node._isExternal) {
+ delete node.el;
+ delete el.gridstackNode;
+ this.engine.restoreInitial();
+ }
+ }
+ // legacy method removed
+ commit() {
+ utils_1.obsolete(this, this.batchUpdate(false), "commit", "batchUpdate", "5.2");
+ return this;
+ }
+ };
+ exports.GridStack = GridStack2;
+ GridStack2.Utils = utils_1.Utils;
+ GridStack2.Engine = gridstack_engine_1.GridStackEngine;
+ GridStack2.GDRev = "7.3.0";
+ }
+ });
+
+ // js/rack.js
+ var import_gridstack = __toESM(require_gridstack());
+ var changesMade = false;
+ var gridItemsMap = [];
+ var grids = [];
+ function getItems(grids2) {
+ grids2.forEach(function(grid, gridIndex) {
+ var gridItems = grid.getGridItems();
+ gridItemsMap[gridIndex] = {};
+ gridItems.forEach(function(item) {
+ gridItemsMap[gridIndex][item.gridstackNode.id] = item;
+ });
+ });
+ }
+ function acceptWidgets(el) {
+ var gridId = el.gridstackNode.grid.el.getAttribute("data-grid-id");
+ if (gridId === "2") {
+ return true;
+ } else if (el.getAttribute("data-full-depth") === "False") {
+ return true;
+ }
+ return false;
+ }
+ function acceptOtherWidgets(e) {
+ return true;
+ }
+ function initializeGrid(element, acceptWidgets2) {
+ return import_gridstack.GridStack.init(options = {
+ cellHeight: 11,
+ margin: 0,
+ marginBottom: 1,
+ float: true,
+ disableOneColumnMode: true,
+ animate: true,
+ removeTimeout: 100,
+ disableResize: true,
+ acceptWidgets: acceptWidgets2
+ }, element);
+ }
+ function saveRack(rack_id, desc_units) {
+ getItems(grids);
+ console.log(desc_units);
+ var data = {};
+ gridItemsMap.forEach((grid, gridIndex) => {
+ let gridData = [];
+ for (let key in grid) {
+ let item = grid[key];
+ if (item.getAttribute("data-item-face") !== "back") {
+ let y = parseInt(item.getAttribute("gs-y")) / 2;
+ let u_height = parseInt(item.getAttribute("gs-h")) / 2;
+ let rack_height = item.gridstackNode.grid.el.getAttribute("gs-max-row") / 2;
+ let u_position;
+ if (desc_units) {
+ u_position = y + 1;
+ } else {
+ u_position = u_height > 1 ? rack_height - y - u_height + 1 : rack_height - y;
+ }
+ gridData.push({
+ "id": parseInt(item.getAttribute("gs-id")),
+ "x": parseInt(item.getAttribute("gs-x")),
+ "y": u_position,
+ "is_full_depth": item.getAttribute("data-full-depth"),
+ "face": item.getAttribute("data-item-face")
+ });
+ }
+ }
+ names = {
+ 0: "front",
+ 1: "rear",
+ 2: "other"
+ };
+ data[names[gridIndex]] = gridData;
+ data["rack_id"] = rack_id;
+ });
+ try {
+ const res = fetch("/" + basePath + "api/plugins/reorder/save/" + rack_id + "/", {
+ method: "PUT",
+ headers: {
+ "Content-Type": "application/json",
+ "X-CSRFToken": netbox_csrf_token
+ },
+ body: JSON.stringify(data)
+ });
+ res.then((response) => {
+ if (response.ok) {
+ changesMade = false;
+ var button = document.getElementById("saveButton");
+ button.setAttribute("disabled", "disabled");
+ response.json().then((jsonData) => {
+ console.log(jsonData);
+ });
+ window.location.href = returnUrl;
+ }
+ });
+ } catch (error) {
+ console.error("Error:", error);
+ }
+ }
+ var frontGrid = initializeGrid("#grid-front", acceptWidgets);
+ var rearGrid = initializeGrid("#grid-rear", acceptWidgets);
+ var nonRackedGrid = initializeGrid("#grid-other", acceptOtherWidgets);
+ grids = [frontGrid, rearGrid, nonRackedGrid];
+ getItems(grids);
+ grids.forEach(function(grid, gridIndex) {
+ grid.on("change", function(event, items) {
+ changesMade = true;
+ var button = document.getElementById("saveButton");
+ button.removeAttribute("disabled");
+ items.forEach(function(item) {
+ var otherGridIndex = gridIndex === 0 ? 1 : 0;
+ var otherGridItemsMap = gridItemsMap[otherGridIndex];
+ if (otherGridItemsMap && otherGridItemsMap[item.id]) {
+ var otherItem = otherGridItemsMap[item.id];
+ var otherGrid = grids[otherGridIndex];
+ otherGrid.update(otherItem, {
+ "x": item.x,
+ "y": item.y
+ });
+ }
+ });
+ });
+ grid.on("dropped", function(event, previousWidget, newWidget) {
+ changesMade = true;
+ var button = document.getElementById("saveButton");
+ button.removeAttribute("disabled");
+ var originGrid = grids.indexOf(previousWidget.grid);
+ if (gridIndex === 0) {
+ newWidget.el.setAttribute("data-item-face", "front");
+ } else if (gridIndex === 1) {
+ newWidget.el.setAttribute("data-item-face", "rear");
+ }
+ if (originGrid === 2) {
+ var otherGridIndex = gridIndex === 0 ? 1 : 0;
+ var otherGrid = grids[otherGridIndex];
+ if (otherGrid) {
+ if (newWidget.el.getAttribute("data-full-depth") === "True") {
+ var itemContent = newWidget.el.cloneNode(true);
+ var subDiv = itemContent.querySelector(".grid-stack-item-content");
+ subDiv.removeAttribute("style");
+ subDiv.classList.add("device_rear");
+ itemContent.setAttribute("data-item-face", "back");
+ otherGrid.addWidget(itemContent);
+ }
+ }
+ getItems(grids);
+ } else if ((originGrid === 0 || originGrid === 1) && gridIndex === 2) {
+ if (newWidget.el.getAttribute("data-full-depth") === "True") {
+ var itemContent = newWidget.el.querySelector(".grid-stack-item-content");
+ itemContent.removeAttribute("style");
+ itemContent.classList.remove("device_rear");
+ itemContent.setAttribute("data-item-face", "front");
+ var backgroundColor = newWidget.el.getAttribute("data-item-color");
+ var textColor = newWidget.el.getAttribute("data-item-text-color");
+ itemContent.style = "background-color: #" + backgroundColor + "; color: #" + textColor + ";";
+ var otherGridIndex = originGrid === 0 ? 1 : 0;
+ var otherGrid = grids[otherGridIndex];
+ var widget = gridItemsMap[otherGridIndex][previousWidget.el.getAttribute("gs-id")];
+ otherGrid.removeWidget(widget);
+ }
+ getItems(grids);
+ }
+ });
+ });
+ var saveButton = document.getElementById("saveButton");
+ saveButton.addEventListener("click", function(event) {
+ saveRack(rackId, descUnits);
+ });
+ window.addEventListener("beforeunload", function(event) {
+ if (changesMade) {
+ event.returnValue = "Are you sure you want to leave? Changes you made may not be saved.";
+ }
+ });
+})();
+/*! Bundled license information:
+
+gridstack/dist/gridstack.js:
+ (*!
+ * GridStack 7.3.0
+ * https://gridstackjs.com/
+ *
+ * Copyright (c) 2021-2022 Alain Dumesny
+ * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE
+ *)
+*/
diff --git a/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js.map b/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js.map
new file mode 100644
index 0000000..9e9f1c3
--- /dev/null
+++ b/netbox_reorder_rack/static/netbox_reorder_rack/js/rack.js.map
@@ -0,0 +1,6 @@
+{
+ "version": 3,
+ "sources": ["../../../static_dev/node_modules/gridstack/src/utils.ts", "../../../static_dev/node_modules/gridstack/src/gridstack-engine.ts", "../../../static_dev/node_modules/gridstack/src/types.ts", "../../../static_dev/node_modules/gridstack/src/dd-manager.ts", "../../../static_dev/node_modules/gridstack/src/dd-touch.ts", "../../../static_dev/node_modules/gridstack/src/dd-resizable-handle.ts", "../../../static_dev/node_modules/gridstack/src/dd-base-impl.ts", "../../../static_dev/node_modules/gridstack/src/dd-resizable.ts", "../../../static_dev/node_modules/gridstack/src/dd-draggable.ts", "../../../static_dev/node_modules/gridstack/src/dd-droppable.ts", "../../../static_dev/node_modules/gridstack/src/dd-element.ts", "../../../static_dev/node_modules/gridstack/src/dd-gridstack.ts", "../../../static_dev/node_modules/gridstack/src/gridstack.ts", "../../../static_dev/js/rack.js"],
+ "mappings": "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",
+ "names": ["options", "n", "el", "GridStack", "el", "options", "grids", "names", "name", "grids", "acceptWidgets"]
+}
diff --git a/netbox_reorder_rack/static_dev/bundle.js b/netbox_reorder_rack/static_dev/bundle.js
new file mode 100644
index 0000000..9747e76
--- /dev/null
+++ b/netbox_reorder_rack/static_dev/bundle.js
@@ -0,0 +1,94 @@
+const esbuild = require('esbuild')
+const { sassPlugin } = require('esbuild-sass-plugin')
+
+const options = {
+ bundle: true,
+ minify: false,
+ sourcemap: 'external',
+ sourcesContent: false,
+ logLevel: 'error'
+}
+
+const ARGS = process.argv.slice(2)
+const noCache = ARGS.includes('--no-cache')
+
+async function bundleScripts() {
+ const entryPoints = {
+ rack: 'js/rack.js',
+ }
+
+ try {
+ const result = await esbuild.build({
+ ...options,
+ outdir: '../static/netbox_reorder_rack/js/',
+ entryPoints,
+ target: 'es2016'
+ })
+ if (result.errors.length !== 0) return
+
+ for (const [targetName, sourceName] of Object.entries(entryPoints)) {
+ const source = sourceName.split('/').pop() // take last element
+ console.log(
+ `✅ Bundled source file '${source}' to '${targetName}.js'`
+ )
+ }
+ } catch (err) {
+ console.error(err)
+ }
+}
+
+async function bundleStyles() {
+ try {
+ const entryPoints = {
+ rack: 'css/rack.css',
+ }
+ const pluginOptions = { outputStyle: 'compressed' }
+ // Allow cache disabling.
+ if (noCache) {
+ pluginOptions.cache = false
+ }
+
+ const result = await esbuild.build({
+ ...options,
+ outdir: '../static/netbox_reorder_rack/css/',
+ // Disable sourcemaps for CSS/SCSS files, see #7068
+ sourcemap: false,
+ entryPoints,
+ plugins: [sassPlugin(pluginOptions)],
+ loader: {
+ '.eot': 'file',
+ '.woff': 'file',
+ '.woff2': 'file',
+ '.svg': 'file',
+ '.ttf': 'file'
+ }
+ })
+ if (result.errors.length === 0) {
+ for (const [targetName, sourceName] of Object.entries(
+ entryPoints
+ )) {
+ const source = sourceName.split('/')[1]
+ console.log(
+ `✅ Bundled source file '${source}' to '${targetName}.css'`
+ )
+ }
+ }
+ } catch (err) {
+ console.error(err)
+ }
+}
+
+async function bundleAll() {
+ if (ARGS.includes('--styles')) {
+ // Only run style jobs.
+ return await bundleStyles()
+ }
+ if (ARGS.includes('--scripts')) {
+ // Only run script jobs.
+ return await bundleScripts()
+ }
+ await bundleStyles()
+ await bundleScripts()
+}
+
+bundleAll()
diff --git a/netbox_reorder_rack/static_dev/css/rack.css b/netbox_reorder_rack/static_dev/css/rack.css
new file mode 100644
index 0000000..69d363a
--- /dev/null
+++ b/netbox_reorder_rack/static_dev/css/rack.css
@@ -0,0 +1,57 @@
+:root {
+ --nbx-rack-bg: #e9ecef;
+ --nbx-rack-border: #000;
+ --nbx-rack-slot-bg: #e9ecef;
+ --nbx-rack-slot-border: #adb5bd;
+ --nbx-rack-slot-hover-bg: #ced4da;
+ --nbx-rack-link-color: #0d6efd;
+ --nbx-rack-unit-color: #6c757d
+}
+
+:root[data-netbox-color-mode=dark] {
+ --nbx-rack-bg: #343a40;
+ --nbx-rack-border: #6c757d;
+ --nbx-rack-slot-bg: #343a40;
+ --nbx-rack-slot-border: #495057;
+ --nbx-rack-slot-hover-bg: #212529;
+ --nbx-rack-link-color: #9ec5fe;
+ --nbx-rack-unit-color: #6c757d
+}
+
+.device_rear {
+ background: repeating-linear-gradient(45deg, #f7f7f7, #f7f7f7 12.5px, #ffc0c0 12.5px, #ffc0c0 25px);
+}
+
+ul.unit_numbers {
+ list-style-type: none;
+ font-size: 0.7em;
+ color: var(--nbx-rack-unit-color);
+ float: left;
+}
+
+ul.unit_numbers li {
+ width: 20px;
+ margin-bottom: 2px;
+ line-height: 20px;
+}
+
+.rack {
+ width: 217px;
+ background: var(--nbx-rack-slot-bg) repeating-linear-gradient(to bottom, var(--nbx-rack-slot-bg) 0px, var(--nbx-rack-slot-bg) 20px, var(--nbx-rack-slot-border) 20px, var(--nbx-rack-slot-border) 22px);
+ border: 2px solid var(--nbx-rack-unit-color);
+ float: left;
+}
+
+.grid-stack>.grid-stack-item[gs-w="2"] {
+ width: 100%;
+}
+
+.grid-stack-item>.grid-stack-item-content {
+ border: 1px solid var(--nbx-rack-slot-border);
+ border-radius: 3px;
+}
+
+.grid-stack-placeholder>.placeholder-content {
+ border: 1px dashed #8a8a8a;
+ background-color: #f3f3f329;
+}
diff --git a/netbox_reorder_rack/static_dev/js/rack.js b/netbox_reorder_rack/static_dev/js/rack.js
new file mode 100644
index 0000000..32c8337
--- /dev/null
+++ b/netbox_reorder_rack/static_dev/js/rack.js
@@ -0,0 +1,273 @@
+// Variable to track whether changes have been made
+import { GridStack } from 'gridstack';
+
+var changesMade = false;
+var gridItemsMap = [];
+var grids = [];
+
+// Function to get the items from the grids
+function getItems(grids) {
+ // Initialize the gridItemsMap
+ grids.forEach(function (grid, gridIndex) {
+ // Get the grid items
+ var gridItems = grid.getGridItems();
+ gridItemsMap[gridIndex] = {};
+ // Iterate over the grid items and add them to the gridItemsMap
+ gridItems.forEach(function (item) {
+ gridItemsMap[gridIndex][item.gridstackNode.id] = item;
+ });
+ });
+}
+
+function acceptWidgets(el) {
+ // Get the grid ID
+ var gridId = el.gridstackNode.grid.el.getAttribute('data-grid-id');
+
+ // If the grid ID is 2 or the item is not full depth, return true
+ if (gridId === "2") {
+ return true;
+ } else if (el.getAttribute('data-full-depth') === "False") {
+ return true;
+ }
+ return false;
+}
+
+function acceptOtherWidgets(e) {
+ return true;
+}
+
+function initializeGrid(element, acceptWidgets) {
+ return GridStack.init(options = {
+ cellHeight: 11,
+ margin: 0,
+ marginBottom: 1,
+ float: true,
+ disableOneColumnMode: true,
+ animate: true,
+ removeTimeout: 100,
+ disableResize: true,
+ acceptWidgets: acceptWidgets,
+ }, element);
+}
+
+function saveRack(rack_id, desc_units) {
+ getItems(grids);
+ console.log(desc_units);
+ var data = {};
+
+ // Get the items from the grids
+ gridItemsMap.forEach((grid, gridIndex) => {
+ // Initialize an array to store the data for each grid
+ let gridData = [];
+
+ // Iterate over the keys in the grid object
+ for (let key in grid) {
+ // Get the item associated with the current key
+ let item = grid[key];
+
+ // If the face is not "back", process the item
+ if (item.getAttribute('data-item-face') !== "back") {
+ // Get the 'y' attribute of the item and divide by 2
+ let y = parseInt(item.getAttribute('gs-y')) / 2;
+
+ // Get the 'height' attribute of the item and divide by 2
+ let u_height = parseInt(item.getAttribute('gs-h')) / 2 ;
+
+ // Get the 'max-row' attribute of the grid and divide by 2
+ let rack_height = item.gridstackNode.grid.el.getAttribute('gs-max-row') / 2;
+
+ let u_position;
+ // Calculate the 'u_position' based on the 'u_height' and 'y'
+ if (desc_units) {
+ u_position = y + 1;
+ } else {
+ u_position = u_height > 1 ? rack_height - y - u_height + 1 : rack_height - y;
+ }
+
+ // Push the item data to the 'gridData' array
+ gridData.push({
+ 'id': parseInt(item.getAttribute('gs-id')),
+ 'x': parseInt(item.getAttribute('gs-x')),
+ 'y': u_position,
+ 'is_full_depth': item.getAttribute('data-full-depth'),
+ 'face': item.getAttribute('data-item-face'),
+ });
+ }
+ }
+
+ // Assign the 'gridData' array to the corresponding index in the 'data' array
+ names = {
+ 0: 'front',
+ 1: 'rear',
+ 2: 'other'
+ }
+ data[names[gridIndex]] = gridData;
+ data['rack_id'] = rack_id;
+ });
+
+ try {
+ const res = fetch('/' + basePath + 'api/plugins/reorder/save/' + rack_id + '/', {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'X-CSRFToken': netbox_csrf_token,
+ },
+ body: JSON.stringify(data),
+ })
+
+ res.then(response => {
+ if (response.ok) {
+ changesMade = false;
+ var button = document.getElementById('saveButton');
+ button.setAttribute('disabled', 'disabled');
+
+ // Get JSON data from response
+ response.json().then(jsonData => {
+ console.log(jsonData);
+ // Do something with the jsonData
+ });
+
+ window.location.href = returnUrl;
+ }
+ });
+ } catch (error) {
+ console.error('Error:', error);
+ }
+}
+
+let frontGrid = initializeGrid("#grid-front", acceptWidgets);
+let rearGrid = initializeGrid("#grid-rear", acceptWidgets);
+let nonRackedGrid = initializeGrid("#grid-other", acceptOtherWidgets);
+
+grids = [frontGrid, rearGrid, nonRackedGrid];
+// Get the items from the grids
+getItems(grids);
+
+// Attach change event listener to each grid
+grids.forEach(function (grid, gridIndex) {
+ grid.on('change', function (event, items) {
+ // Set changesMade to true when a change occurs
+ changesMade = true;
+
+ // Select the button element by its ID or any other selector
+ var button = document.getElementById('saveButton');
+
+ // Remove the disabled attribute
+ button.removeAttribute('disabled');
+
+ items.forEach(function (item) {
+ // Find the other grid
+ var otherGridIndex = (gridIndex === 0) ? 1 : 0;
+ var otherGridItemsMap = gridItemsMap[otherGridIndex];
+
+ // If the item is in the other grid, update the item in the other grid
+ if (otherGridItemsMap && otherGridItemsMap[item.id]) {
+ var otherItem = otherGridItemsMap[item.id];
+ var otherGrid = grids[otherGridIndex];
+ otherGrid.update(otherItem, {
+ 'x': item.x,
+ 'y': item.y
+ });
+ }
+ });
+ });
+ grid.on('dropped', function (event, previousWidget, newWidget) {
+ // Set changesMade to true when a change occurs
+ changesMade = true;
+
+ // Select the button element by its ID or any other selector
+ var button = document.getElementById('saveButton');
+
+ // Remove the disabled attribute
+ button.removeAttribute('disabled');
+
+ // Get the index of the grid where the widget was dropped
+ var originGrid = grids.indexOf(previousWidget.grid);
+
+ if (gridIndex === 0) {
+ newWidget.el.setAttribute('data-item-face', 'front');
+ } else if (gridIndex === 1) {
+ newWidget.el.setAttribute('data-item-face', 'rear');
+ }
+
+ // If the widget was dropped in the non-racked grid
+ if (originGrid === 2) {
+ // Find the other grid
+ var otherGridIndex = (gridIndex === 0) ? 1 : 0;
+
+ // Get the other grid
+ var otherGrid = grids[otherGridIndex];
+
+ // If the widget is full depth, clone it and add it to the other grid
+ if (otherGrid) {
+ if (newWidget.el.getAttribute('data-full-depth') === "True") {
+ // Clone the dropped widget
+ var itemContent = newWidget.el.cloneNode(true); // Clone the dropped widget
+
+ // Remove inline styles
+ var subDiv = itemContent.querySelector('.grid-stack-item-content');
+ subDiv.removeAttribute('style');
+ // Apply CSS class
+ subDiv.classList.add('device_rear');
+ itemContent.setAttribute('data-item-face', 'back');
+
+ // Add the cloned widget to the other grid
+ otherGrid.addWidget(itemContent);
+ }
+ }
+
+ // Get the items from the grids
+ getItems(grids);
+
+ // If the widget was dropped non-racked grid from the front or rear grid
+ } else if ((originGrid === 0 || originGrid === 1) && gridIndex === 2) {
+ // If the widget is full depth, remove the widget from the other grid
+ if (newWidget.el.getAttribute('data-full-depth') === "True") {
+ // Get the item content
+ var itemContent = newWidget.el.querySelector('.grid-stack-item-content');
+
+ // Remove the inline styles and apply the CSS class
+ itemContent.removeAttribute('style');
+ itemContent.classList.remove('device_rear');
+ itemContent.setAttribute('data-item-face', 'front');
+
+ // Get the background color and text color from the dropped widget
+ var backgroundColor = newWidget.el.getAttribute('data-item-color');
+ var textColor = newWidget.el.getAttribute('data-item-text-color');
+
+ // Add style to the dropped widget
+ itemContent.style = "background-color: #" + backgroundColor + "; color: #" + textColor + ";";
+
+ // Find the other grid
+ var otherGridIndex = (originGrid === 0) ? 1 : 0;
+ var otherGrid = grids[otherGridIndex];
+
+ // Get the widget from the other grid
+ var widget = gridItemsMap[otherGridIndex][previousWidget.el.getAttribute('gs-id')];
+
+ // Remove the widget from the other grid
+ otherGrid.removeWidget(widget);
+ }
+ // Get the items from the grids
+ getItems(grids);
+ }
+ });
+});
+
+// Get reference to the button
+const saveButton = document.getElementById('saveButton');
+
+// Attach click event listener to the button
+saveButton.addEventListener('click', function (event) {
+ // Call the saveRack function
+ saveRack(rackId, descUnits);
+});
+
+// Attach event listener for beforeunload
+window.addEventListener('beforeunload', function (event) {
+ // Check if changes have been made
+ if (changesMade) {
+ // Display confirmation message
+ event.returnValue = 'Are you sure you want to leave? Changes you made may not be saved.';
+ }
+});
diff --git a/netbox_reorder_rack/static_dev/package.json b/netbox_reorder_rack/static_dev/package.json
new file mode 100644
index 0000000..5db2f6e
--- /dev/null
+++ b/netbox_reorder_rack/static_dev/package.json
@@ -0,0 +1,18 @@
+{
+ "private": true,
+ "name": "netbox_topology_views",
+ "version": "1.0.0",
+ "scripts": {
+ "bundle": "node bundle.js",
+ "bundle:styles": "node bundle.js --styles",
+ "bundle:scripts": "node bundle.js --scripts"
+ },
+ "dependencies": {
+ "bootstrap": "~5.0.2",
+ "gridstack": "^7.2.3"
+ },
+ "devDependencies": {
+ "esbuild": "^0.20.1",
+ "esbuild-sass-plugin": "^3.1.0"
+ }
+}
diff --git a/netbox_reorder_rack/static_dev/yarn.lock b/netbox_reorder_rack/static_dev/yarn.lock
new file mode 100644
index 0000000..a912adc
--- /dev/null
+++ b/netbox_reorder_rack/static_dev/yarn.lock
@@ -0,0 +1,324 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@esbuild/aix-ppc64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5"
+ integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==
+
+"@esbuild/android-arm64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6"
+ integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==
+
+"@esbuild/android-arm@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a"
+ integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==
+
+"@esbuild/android-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22"
+ integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==
+
+"@esbuild/darwin-arm64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46"
+ integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==
+
+"@esbuild/darwin-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2"
+ integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==
+
+"@esbuild/freebsd-arm64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774"
+ integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==
+
+"@esbuild/freebsd-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951"
+ integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==
+
+"@esbuild/linux-arm64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156"
+ integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==
+
+"@esbuild/linux-arm@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21"
+ integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==
+
+"@esbuild/linux-ia32@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48"
+ integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==
+
+"@esbuild/linux-loong64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33"
+ integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==
+
+"@esbuild/linux-mips64el@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea"
+ integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==
+
+"@esbuild/linux-ppc64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d"
+ integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==
+
+"@esbuild/linux-riscv64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e"
+ integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==
+
+"@esbuild/linux-s390x@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7"
+ integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==
+
+"@esbuild/linux-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f"
+ integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==
+
+"@esbuild/netbsd-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407"
+ integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==
+
+"@esbuild/openbsd-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76"
+ integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==
+
+"@esbuild/sunos-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5"
+ integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==
+
+"@esbuild/win32-arm64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b"
+ integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==
+
+"@esbuild/win32-ia32@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe"
+ integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==
+
+"@esbuild/win32-x64@0.20.1":
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz#77583b6ea54cee7c1410ebbd54051b6a3fcbd8ba"
+ integrity sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bootstrap@~5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.0.2.tgz#aff23d5e0e03c31255ad437530ee6556e78e728e"
+ integrity sha512-1Ge963tyEQWJJ+8qtXFU6wgmAVj9gweEjibUdbmcCEYsn38tVwRk8107rk2vzt6cfQcRr3SlZ8aQBqaD8aqf+Q==
+
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+"chokidar@>=3.0.0 <4.0.0":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+esbuild-sass-plugin@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/esbuild-sass-plugin/-/esbuild-sass-plugin-3.1.0.tgz#a6d1ed0e0f7ea0366c928009d4d11a80612416e9"
+ integrity sha512-LX/PhMuA7KskPDT8yB10/o3C3fTKVWEzcfzGnGH0wqjZm3FEtm4d6dCxUn+252kuWZAgFOGzGOnBv1FpzClJrA==
+ dependencies:
+ resolve "^1.22.8"
+ sass "^1.71.1"
+
+esbuild@^0.20.1:
+ version "0.20.1"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e"
+ integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.20.1"
+ "@esbuild/android-arm" "0.20.1"
+ "@esbuild/android-arm64" "0.20.1"
+ "@esbuild/android-x64" "0.20.1"
+ "@esbuild/darwin-arm64" "0.20.1"
+ "@esbuild/darwin-x64" "0.20.1"
+ "@esbuild/freebsd-arm64" "0.20.1"
+ "@esbuild/freebsd-x64" "0.20.1"
+ "@esbuild/linux-arm" "0.20.1"
+ "@esbuild/linux-arm64" "0.20.1"
+ "@esbuild/linux-ia32" "0.20.1"
+ "@esbuild/linux-loong64" "0.20.1"
+ "@esbuild/linux-mips64el" "0.20.1"
+ "@esbuild/linux-ppc64" "0.20.1"
+ "@esbuild/linux-riscv64" "0.20.1"
+ "@esbuild/linux-s390x" "0.20.1"
+ "@esbuild/linux-x64" "0.20.1"
+ "@esbuild/netbsd-x64" "0.20.1"
+ "@esbuild/openbsd-x64" "0.20.1"
+ "@esbuild/sunos-x64" "0.20.1"
+ "@esbuild/win32-arm64" "0.20.1"
+ "@esbuild/win32-ia32" "0.20.1"
+ "@esbuild/win32-x64" "0.20.1"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+gridstack@^7.2.3:
+ version "7.3.0"
+ resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-7.3.0.tgz#7b32395edcd885bc39b84068ac86f2831f7a2451"
+ integrity sha512-JKZgsHzm1ljkn1NnBZpf8j4NDOBCXTuw0m1ZC0sr6NKUh0BFWzXAONIxtX1hWGUVeKLj5l1VcmnTwCXw5ypDNw==
+
+hasown@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+immutable@^4.0.0:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0"
+ integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.13.0:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+resolve@^1.22.8:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+sass@^1.71.1:
+ version "1.71.1"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54"
+ integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==
+ dependencies:
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
+
+"source-map-js@>=0.6.2 <2.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
diff --git a/netbox_reorder_rack/template_content.py b/netbox_reorder_rack/template_content.py
new file mode 100644
index 0000000..7ee2bc3
--- /dev/null
+++ b/netbox_reorder_rack/template_content.py
@@ -0,0 +1,11 @@
+from netbox.plugins import PluginTemplateExtension
+
+
+class ReorderButton(PluginTemplateExtension):
+ model = "dcim.rack"
+
+ def buttons(self):
+ return self.render("netbox_reorder_rack/inc/rack_button.html")
+
+
+template_extensions = [ReorderButton]
diff --git a/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_button.html b/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_button.html
new file mode 100644
index 0000000..77ade05
--- /dev/null
+++ b/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_button.html
@@ -0,0 +1,6 @@
+
+{% if perms.dcim.change_device %}
+
+ Reorder
+
+{% endif %}
diff --git a/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_elevation.html b/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_elevation.html
new file mode 100644
index 0000000..f377332
--- /dev/null
+++ b/netbox_reorder_rack/templates/netbox_reorder_rack/inc/rack_elevation.html
@@ -0,0 +1,34 @@
+{% load rack %}
+
+
+
+ {% for unit in object.units %}
+ {% if unit|rack_unit %}
+
{{ unit|rack_unit_to_int }}
+ {% else %}
+
+ {% endif %}
+ {% endfor %}
+
+
+ {% for device in units %}
+ {% if device.device %}
+ {% if device.device.face == face %}
+