@conduction/nextcloud-vue 2.89.1 → 2.89.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +27 -10
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +8 -8
- package/dist/esm/utils/gridStack.js +7 -3
- package/dist/esm/utils/gridStack.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +34 -14
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +8 -8
- package/package.json +1 -1
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +27 -10
- package/src/utils/gridStack.js +7 -3
|
@@ -38141,17 +38141,17 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38141
38141
|
}
|
|
38142
38142
|
|
|
38143
38143
|
|
|
38144
|
-
.cn-dashboard-grid[data-v-
|
|
38144
|
+
.cn-dashboard-grid[data-v-a76b6fc6] {
|
|
38145
38145
|
width: 100%;
|
|
38146
38146
|
min-height: 200px;
|
|
38147
38147
|
}
|
|
38148
|
-
.grid-stack[data-v-
|
|
38148
|
+
.grid-stack[data-v-a76b6fc6] {
|
|
38149
38149
|
background: transparent;
|
|
38150
38150
|
}
|
|
38151
38151
|
|
|
38152
38152
|
/* Screen-reader-only text: the keyboard key map and the live region. Kept in
|
|
38153
38153
|
the layout (not `display: none`) so assistive tech still reads it. */
|
|
38154
|
-
.cn-dashboard-grid__sr-only[data-v-
|
|
38154
|
+
.cn-dashboard-grid__sr-only[data-v-a76b6fc6] {
|
|
38155
38155
|
position: absolute;
|
|
38156
38156
|
width: 1px;
|
|
38157
38157
|
height: 1px;
|
|
@@ -38166,7 +38166,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38166
38166
|
/* Grid items become tab stops in edit mode — give them a visible focus ring
|
|
38167
38167
|
that satisfies WCAG 2.1 SC 2.4.7 without relying on the widget's own
|
|
38168
38168
|
styling. `outline-offset` keeps the ring outside the rounded card. */
|
|
38169
|
-
.grid-stack-item[data-v-
|
|
38169
|
+
.grid-stack-item[data-v-a76b6fc6]:focus-visible {
|
|
38170
38170
|
outline: 2px solid var(--color-primary-element, #0082c9);
|
|
38171
38171
|
outline-offset: 2px;
|
|
38172
38172
|
border-radius: var(--border-radius-container-large, 16px);
|
|
@@ -38178,19 +38178,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38178
38178
|
cell never shrank: "Waiting for me" stayed a tall card around one row. In
|
|
38179
38179
|
such a cell the child takes its own height. A cell without the key keeps
|
|
38180
38180
|
the filling child. */
|
|
38181
|
-
.cn-dashboard-grid__item--fit[data-v-
|
|
38181
|
+
.cn-dashboard-grid__item--fit[data-v-a76b6fc6] > .grid-stack-item-content > * {
|
|
38182
38182
|
height: auto;
|
|
38183
38183
|
}
|
|
38184
|
-
[data-v-
|
|
38184
|
+
[data-v-a76b6fc6] .grid-stack-item-content {
|
|
38185
38185
|
background: var(--color-main-background);
|
|
38186
38186
|
border: none;
|
|
38187
38187
|
box-shadow: none;
|
|
38188
38188
|
overflow: hidden;
|
|
38189
38189
|
}
|
|
38190
|
-
[data-v-
|
|
38190
|
+
[data-v-a76b6fc6] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
|
|
38191
38191
|
background: transparent;
|
|
38192
38192
|
}
|
|
38193
|
-
[data-v-
|
|
38193
|
+
[data-v-a76b6fc6] .grid-stack-placeholder > .placeholder-content {
|
|
38194
38194
|
background: var(--color-primary-element-light);
|
|
38195
38195
|
border: 2px dashed var(--color-primary-element);
|
|
38196
38196
|
border-radius: var(--border-radius-large);
|
|
@@ -65,8 +65,11 @@ function readGridGeometry(items) {
|
|
|
65
65
|
* full-width card under the stat tiles landed below the lists.
|
|
66
66
|
*
|
|
67
67
|
* @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
|
|
68
|
-
*
|
|
69
|
-
*
|
|
68
|
+
* The growing item is never among the items it moves, also when `nodes`
|
|
69
|
+
* holds another reference to it (a proxy of the same node, matched by `el`).
|
|
70
|
+
*
|
|
71
|
+
* @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
|
|
72
|
+
* @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
|
|
70
73
|
* @param {number} h Its new height, in grid rows.
|
|
71
74
|
* @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
|
|
72
75
|
*/
|
|
@@ -81,7 +84,8 @@ function planGrowth(nodes, node, h) {
|
|
|
81
84
|
while (queue.length > 0) {
|
|
82
85
|
const rect = queue.shift();
|
|
83
86
|
for (const other of nodes) {
|
|
84
|
-
|
|
87
|
+
const self = other === node || (node.el && other.el === node.el);
|
|
88
|
+
if (self || moved.has(other) || !overlaps(rect, other)) {
|
|
85
89
|
continue
|
|
86
90
|
}
|
|
87
91
|
const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridStack.js","sources":["../../../src/utils/gridStack.js"],"sourcesContent":["/**\n * Thin GridStack bootstrap shared by the drag/resize grids (CnDashboardGrid and\n * CnWidgetGrid's editable body slot). Keeps the GridStack option shape in one\n * place so the two engines stay consistent.\n *\n * @module utils/gridStack\n */\n\nimport { GridStack } from 'gridstack'\n// `gridstack` is a peerDependency, not bundled — see the matching comment in\n// CnDashboardGrid.vue. The consumer must install `gridstack` themselves and\n// import its stylesheet (`gridstack/dist/gridstack.min.css`) from that same\n// copy; nc-vue ships no GridStack CSS of its own so the JS driving the grid\n// and the CSS sizing it can never come from two different versions.\n\n/**\n * Initialise a GridStack instance on a `.grid-stack` element.\n *\n * @param {HTMLElement} el The `.grid-stack` container element.\n * @param {object} opts Options.\n * @param {number} opts.columns Column count.\n * @param {boolean} opts.editable Whether drag + resize are enabled.\n * @param {number} [opts.cellHeight] Cell height in px (default 80).\n * @param {number} [opts.margin] Grid margin in px (default 12).\n * @return {import('gridstack').GridStack} The GridStack instance.\n */\nexport function initGridStack(el, opts) {\n\tconst { columns, editable, cellHeight = 80, margin = 12 } = opts\n\treturn GridStack.init({\n\t\tcolumn: columns,\n\t\tcellHeight,\n\t\tmargin,\n\t\tfloat: true,\n\t\tanimate: true,\n\t\tdisableDrag: !editable,\n\t\tdisableResize: !editable,\n\t\tremovable: false,\n\t}, el)\n}\n\n/**\n * Read the geometry GridStack reports for a changed set of items into a plain\n * map keyed by node id.\n *\n * @param {Array<{id: (string|number), x: number, y: number, w: number, h: number}>} items\n * The items GridStack passes to its `change` handler.\n * @return {Map<string, {gridX: number, gridY: number, gridWidth: number, gridHeight: number}>}\n */\nexport function readGridGeometry(items) {\n\tconst map = new Map()\n\tfor (const it of items || []) {\n\t\tmap.set(String(it.id), { gridX: it.x, gridY: it.y, gridWidth: it.w, gridHeight: it.h })\n\t}\n\treturn map\n}\n\n/**\n * Where the items under a growing cell go so they keep their order: every item\n * the growth would overlap moves down by the growth, and so does every item\n * that move would overlap in turn. Items beside the cell stay put.\n *\n * GridStack resolves the same collision itself, but not in order: when\n * pipelinq's size-to-content banner grew from two rows to three, the\n * full-width card under the stat tiles landed below the lists.\n *\n * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it\n * @param {Array<{x: number, y: number, w: number, h: number}>} nodes The grid's items (the growing one among them).\n * @param {{x: number, y: number, w: number, h: number}} node The growing item.\n * @param {number} h Its new height, in grid rows.\n * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.\n */\nexport function planGrowth(nodes, node, h) {\n\tconst delta = h - node.h\n\tif (!(delta > 0)) {\n\t\treturn []\n\t}\n\tconst moved = new Map()\n\tconst overlaps = (a, b) => a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h\n\tconst queue = [{ x: node.x, y: node.y, w: node.w, h }]\n\twhile (queue.length > 0) {\n\t\tconst rect = queue.shift()\n\t\tfor (const other of nodes) {\n\t\t\
|
|
1
|
+
{"version":3,"file":"gridStack.js","sources":["../../../src/utils/gridStack.js"],"sourcesContent":["/**\n * Thin GridStack bootstrap shared by the drag/resize grids (CnDashboardGrid and\n * CnWidgetGrid's editable body slot). Keeps the GridStack option shape in one\n * place so the two engines stay consistent.\n *\n * @module utils/gridStack\n */\n\nimport { GridStack } from 'gridstack'\n// `gridstack` is a peerDependency, not bundled — see the matching comment in\n// CnDashboardGrid.vue. The consumer must install `gridstack` themselves and\n// import its stylesheet (`gridstack/dist/gridstack.min.css`) from that same\n// copy; nc-vue ships no GridStack CSS of its own so the JS driving the grid\n// and the CSS sizing it can never come from two different versions.\n\n/**\n * Initialise a GridStack instance on a `.grid-stack` element.\n *\n * @param {HTMLElement} el The `.grid-stack` container element.\n * @param {object} opts Options.\n * @param {number} opts.columns Column count.\n * @param {boolean} opts.editable Whether drag + resize are enabled.\n * @param {number} [opts.cellHeight] Cell height in px (default 80).\n * @param {number} [opts.margin] Grid margin in px (default 12).\n * @return {import('gridstack').GridStack} The GridStack instance.\n */\nexport function initGridStack(el, opts) {\n\tconst { columns, editable, cellHeight = 80, margin = 12 } = opts\n\treturn GridStack.init({\n\t\tcolumn: columns,\n\t\tcellHeight,\n\t\tmargin,\n\t\tfloat: true,\n\t\tanimate: true,\n\t\tdisableDrag: !editable,\n\t\tdisableResize: !editable,\n\t\tremovable: false,\n\t}, el)\n}\n\n/**\n * Read the geometry GridStack reports for a changed set of items into a plain\n * map keyed by node id.\n *\n * @param {Array<{id: (string|number), x: number, y: number, w: number, h: number}>} items\n * The items GridStack passes to its `change` handler.\n * @return {Map<string, {gridX: number, gridY: number, gridWidth: number, gridHeight: number}>}\n */\nexport function readGridGeometry(items) {\n\tconst map = new Map()\n\tfor (const it of items || []) {\n\t\tmap.set(String(it.id), { gridX: it.x, gridY: it.y, gridWidth: it.w, gridHeight: it.h })\n\t}\n\treturn map\n}\n\n/**\n * Where the items under a growing cell go so they keep their order: every item\n * the growth would overlap moves down by the growth, and so does every item\n * that move would overlap in turn. Items beside the cell stay put.\n *\n * GridStack resolves the same collision itself, but not in order: when\n * pipelinq's size-to-content banner grew from two rows to three, the\n * full-width card under the stat tiles landed below the lists.\n *\n * @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it\n * The growing item is never among the items it moves, also when `nodes`\n * holds another reference to it (a proxy of the same node, matched by `el`).\n *\n * @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).\n * @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.\n * @param {number} h Its new height, in grid rows.\n * @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.\n */\nexport function planGrowth(nodes, node, h) {\n\tconst delta = h - node.h\n\tif (!(delta > 0)) {\n\t\treturn []\n\t}\n\tconst moved = new Map()\n\tconst overlaps = (a, b) => a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h\n\tconst queue = [{ x: node.x, y: node.y, w: node.w, h }]\n\twhile (queue.length > 0) {\n\t\tconst rect = queue.shift()\n\t\tfor (const other of nodes) {\n\t\t\tconst self = other === node || (node.el && other.el === node.el)\n\t\t\tif (self || moved.has(other) || !overlaps(rect, other)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst next = { x: other.x, y: other.y + delta, w: other.w, h: other.h }\n\t\t\tmoved.set(other, next.y)\n\t\t\tqueue.push(next)\n\t\t}\n\t}\n\treturn [...moved.entries()]\n\t\t.map(([item, y]) => ({ node: item, y }))\n\t\t.sort((a, b) => b.y - a.y)\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -307002,8 +307002,11 @@ function readGridGeometry(items) {
|
|
|
307002
307002
|
* full-width card under the stat tiles landed below the lists.
|
|
307003
307003
|
*
|
|
307004
307004
|
* @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
|
|
307005
|
-
*
|
|
307006
|
-
*
|
|
307005
|
+
* The growing item is never among the items it moves, also when `nodes`
|
|
307006
|
+
* holds another reference to it (a proxy of the same node, matched by `el`).
|
|
307007
|
+
*
|
|
307008
|
+
* @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
|
|
307009
|
+
* @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
|
|
307007
307010
|
* @param {number} h Its new height, in grid rows.
|
|
307008
307011
|
* @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
|
|
307009
307012
|
*/
|
|
@@ -307018,7 +307021,8 @@ function planGrowth(nodes, node, h) {
|
|
|
307018
307021
|
while (queue.length > 0) {
|
|
307019
307022
|
const rect = queue.shift();
|
|
307020
307023
|
for (const other of nodes) {
|
|
307021
|
-
|
|
307024
|
+
const self = other === node || (node.el && other.el === node.el);
|
|
307025
|
+
if (self || moved.has(other) || !overlaps(rect, other)) {
|
|
307022
307026
|
continue
|
|
307023
307027
|
}
|
|
307024
307028
|
const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h };
|
|
@@ -307642,16 +307646,27 @@ var script$1t = {
|
|
|
307642
307646
|
* (`itemsInRowOrder`). A cell that shrinks is left to GridStack as
|
|
307643
307647
|
* before.
|
|
307644
307648
|
*
|
|
307649
|
+
* The grid is read raw: through Vue's proxy `engine.nodes` holds proxies
|
|
307650
|
+
* while `el.gridstackNode` is the plain node, so the growing cell would
|
|
307651
|
+
* not be recognised among the nodes and would be moved down by its own
|
|
307652
|
+
* growth. Moving a cell makes GridStack measure it again, so a cell the
|
|
307653
|
+
* wrapper is already growing goes straight to GridStack.
|
|
307654
|
+
*
|
|
307645
307655
|
* @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
|
|
307646
307656
|
* @return {void}
|
|
307647
307657
|
*/
|
|
307648
307658
|
keepOrderOnGrowth() {
|
|
307649
|
-
const grid = this.grid;
|
|
307659
|
+
const grid = vue$1.toRaw(this.grid);
|
|
307650
307660
|
if (!grid || typeof grid.resizeToContent !== 'function' || typeof grid.update !== 'function') {
|
|
307651
307661
|
return
|
|
307652
307662
|
}
|
|
307653
307663
|
const resize = grid.resizeToContent.bind(grid);
|
|
307664
|
+
const growing = new Set();
|
|
307654
307665
|
grid.resizeToContent = (el) => {
|
|
307666
|
+
if (growing.has(el)) {
|
|
307667
|
+
resize(el);
|
|
307668
|
+
return
|
|
307669
|
+
}
|
|
307655
307670
|
const node = el && el.gridstackNode;
|
|
307656
307671
|
const nodes = grid.engine && Array.isArray(grid.engine.nodes) ? grid.engine.nodes : null;
|
|
307657
307672
|
const rows = node && nodes ? this.contentRows(el, node) : null;
|
|
@@ -307662,15 +307677,20 @@ var script$1t = {
|
|
|
307662
307677
|
}
|
|
307663
307678
|
// Inside a batch the moves are not packed until the cell has grown.
|
|
307664
307679
|
const batching = Boolean(grid.engine.batchMode);
|
|
307665
|
-
|
|
307666
|
-
|
|
307667
|
-
|
|
307668
|
-
|
|
307669
|
-
|
|
307670
|
-
|
|
307671
|
-
|
|
307672
|
-
|
|
307673
|
-
|
|
307680
|
+
growing.add(el);
|
|
307681
|
+
try {
|
|
307682
|
+
if (!batching) {
|
|
307683
|
+
grid.batchUpdate();
|
|
307684
|
+
}
|
|
307685
|
+
for (const step of plan) {
|
|
307686
|
+
grid.update(step.node.el, { y: step.y });
|
|
307687
|
+
}
|
|
307688
|
+
resize(el);
|
|
307689
|
+
if (!batching) {
|
|
307690
|
+
grid.batchUpdate(false);
|
|
307691
|
+
}
|
|
307692
|
+
} finally {
|
|
307693
|
+
growing.delete(el);
|
|
307674
307694
|
}
|
|
307675
307695
|
};
|
|
307676
307696
|
},
|
|
@@ -308273,7 +308293,7 @@ function render$1t(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
308273
308293
|
}
|
|
308274
308294
|
|
|
308275
308295
|
script$1t.render = render$1t;
|
|
308276
|
-
script$1t.__scopeId = "data-v-
|
|
308296
|
+
script$1t.__scopeId = "data-v-a76b6fc6";
|
|
308277
308297
|
const __sfc_main$1t = script$1t;
|
|
308278
308298
|
|
|
308279
308299
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
2
|
name: package/dist/nextcloud-vue.cjs.js.map
|
|
3
|
-
size:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 40768932 bytes
|
|
4
|
+
sha256: 5eaf232e7473c7af37c95cfc8b0839550069002fa540192d0ea4b88131fbc06d
|
package/dist/nextcloud-vue.css
CHANGED
|
@@ -38141,17 +38141,17 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38141
38141
|
}
|
|
38142
38142
|
|
|
38143
38143
|
|
|
38144
|
-
.cn-dashboard-grid[data-v-
|
|
38144
|
+
.cn-dashboard-grid[data-v-a76b6fc6] {
|
|
38145
38145
|
width: 100%;
|
|
38146
38146
|
min-height: 200px;
|
|
38147
38147
|
}
|
|
38148
|
-
.grid-stack[data-v-
|
|
38148
|
+
.grid-stack[data-v-a76b6fc6] {
|
|
38149
38149
|
background: transparent;
|
|
38150
38150
|
}
|
|
38151
38151
|
|
|
38152
38152
|
/* Screen-reader-only text: the keyboard key map and the live region. Kept in
|
|
38153
38153
|
the layout (not `display: none`) so assistive tech still reads it. */
|
|
38154
|
-
.cn-dashboard-grid__sr-only[data-v-
|
|
38154
|
+
.cn-dashboard-grid__sr-only[data-v-a76b6fc6] {
|
|
38155
38155
|
position: absolute;
|
|
38156
38156
|
width: 1px;
|
|
38157
38157
|
height: 1px;
|
|
@@ -38166,7 +38166,7 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38166
38166
|
/* Grid items become tab stops in edit mode — give them a visible focus ring
|
|
38167
38167
|
that satisfies WCAG 2.1 SC 2.4.7 without relying on the widget's own
|
|
38168
38168
|
styling. `outline-offset` keeps the ring outside the rounded card. */
|
|
38169
|
-
.grid-stack-item[data-v-
|
|
38169
|
+
.grid-stack-item[data-v-a76b6fc6]:focus-visible {
|
|
38170
38170
|
outline: 2px solid var(--color-primary-element, #0082c9);
|
|
38171
38171
|
outline-offset: 2px;
|
|
38172
38172
|
border-radius: var(--border-radius-container-large, 16px);
|
|
@@ -38178,19 +38178,19 @@ button.cn-object-calendar__overflow[data-v-e1c69ee2] {
|
|
|
38178
38178
|
cell never shrank: "Waiting for me" stayed a tall card around one row. In
|
|
38179
38179
|
such a cell the child takes its own height. A cell without the key keeps
|
|
38180
38180
|
the filling child. */
|
|
38181
|
-
.cn-dashboard-grid__item--fit[data-v-
|
|
38181
|
+
.cn-dashboard-grid__item--fit[data-v-a76b6fc6] > .grid-stack-item-content > * {
|
|
38182
38182
|
height: auto;
|
|
38183
38183
|
}
|
|
38184
|
-
[data-v-
|
|
38184
|
+
[data-v-a76b6fc6] .grid-stack-item-content {
|
|
38185
38185
|
background: var(--color-main-background);
|
|
38186
38186
|
border: none;
|
|
38187
38187
|
box-shadow: none;
|
|
38188
38188
|
overflow: hidden;
|
|
38189
38189
|
}
|
|
38190
|
-
[data-v-
|
|
38190
|
+
[data-v-a76b6fc6] .grid-stack-item-content:has(.cn-widget-wrapper--borderless) {
|
|
38191
38191
|
background: transparent;
|
|
38192
38192
|
}
|
|
38193
|
-
[data-v-
|
|
38193
|
+
[data-v-a76b6fc6] .grid-stack-placeholder > .placeholder-content {
|
|
38194
38194
|
background: var(--color-primary-element-light);
|
|
38195
38195
|
border: 2px dashed var(--color-primary-element);
|
|
38196
38196
|
border-radius: var(--border-radius-large);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduction/nextcloud-vue",
|
|
3
|
-
"version": "2.89.
|
|
3
|
+
"version": "2.89.2",
|
|
4
4
|
"description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
|
|
5
5
|
"homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
<script>
|
|
72
72
|
import { translate as t } from '@nextcloud/l10n'
|
|
73
73
|
import { GridStack } from 'gridstack'
|
|
74
|
+
import { toRaw } from 'vue'
|
|
74
75
|
import { planGrowth } from '../../utils/gridStack.js'
|
|
75
76
|
// `gridstack` is a peerDependency (see package.json), not bundled — this
|
|
76
77
|
// component's JS and the consumer's GridStack stylesheet MUST come from the
|
|
@@ -683,16 +684,27 @@ export default {
|
|
|
683
684
|
* (`itemsInRowOrder`). A cell that shrinks is left to GridStack as
|
|
684
685
|
* before.
|
|
685
686
|
*
|
|
687
|
+
* The grid is read raw: through Vue's proxy `engine.nodes` holds proxies
|
|
688
|
+
* while `el.gridstackNode` is the plain node, so the growing cell would
|
|
689
|
+
* not be recognised among the nodes and would be moved down by its own
|
|
690
|
+
* growth. Moving a cell makes GridStack measure it again, so a cell the
|
|
691
|
+
* wrapper is already growing goes straight to GridStack.
|
|
692
|
+
*
|
|
686
693
|
* @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
|
|
687
694
|
* @return {void}
|
|
688
695
|
*/
|
|
689
696
|
keepOrderOnGrowth() {
|
|
690
|
-
const grid = this.grid
|
|
697
|
+
const grid = toRaw(this.grid)
|
|
691
698
|
if (!grid || typeof grid.resizeToContent !== 'function' || typeof grid.update !== 'function') {
|
|
692
699
|
return
|
|
693
700
|
}
|
|
694
701
|
const resize = grid.resizeToContent.bind(grid)
|
|
702
|
+
const growing = new Set()
|
|
695
703
|
grid.resizeToContent = (el) => {
|
|
704
|
+
if (growing.has(el)) {
|
|
705
|
+
resize(el)
|
|
706
|
+
return
|
|
707
|
+
}
|
|
696
708
|
const node = el && el.gridstackNode
|
|
697
709
|
const nodes = grid.engine && Array.isArray(grid.engine.nodes) ? grid.engine.nodes : null
|
|
698
710
|
const rows = node && nodes ? this.contentRows(el, node) : null
|
|
@@ -703,15 +715,20 @@ export default {
|
|
|
703
715
|
}
|
|
704
716
|
// Inside a batch the moves are not packed until the cell has grown.
|
|
705
717
|
const batching = Boolean(grid.engine.batchMode)
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
718
|
+
growing.add(el)
|
|
719
|
+
try {
|
|
720
|
+
if (!batching) {
|
|
721
|
+
grid.batchUpdate()
|
|
722
|
+
}
|
|
723
|
+
for (const step of plan) {
|
|
724
|
+
grid.update(step.node.el, { y: step.y })
|
|
725
|
+
}
|
|
726
|
+
resize(el)
|
|
727
|
+
if (!batching) {
|
|
728
|
+
grid.batchUpdate(false)
|
|
729
|
+
}
|
|
730
|
+
} finally {
|
|
731
|
+
growing.delete(el)
|
|
715
732
|
}
|
|
716
733
|
}
|
|
717
734
|
},
|
package/src/utils/gridStack.js
CHANGED
|
@@ -64,8 +64,11 @@ export function readGridGeometry(items) {
|
|
|
64
64
|
* full-width card under the stat tiles landed below the lists.
|
|
65
65
|
*
|
|
66
66
|
* @spec openspec/changes/dashboard-growth-keeps-order/specs/dashboard-grid/spec.md#requirement-a-growing-cell-keeps-the-order-of-the-cards-under-it
|
|
67
|
-
*
|
|
68
|
-
*
|
|
67
|
+
* The growing item is never among the items it moves, also when `nodes`
|
|
68
|
+
* holds another reference to it (a proxy of the same node, matched by `el`).
|
|
69
|
+
*
|
|
70
|
+
* @param {Array<{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}>} nodes The grid's items (the growing one among them).
|
|
71
|
+
* @param {{x: number, y: number, w: number, h: number, el: (HTMLElement|undefined)}} node The growing item.
|
|
69
72
|
* @param {number} h Its new height, in grid rows.
|
|
70
73
|
* @return {Array<{node: object, y: number}>} The items to move and their new row, bottom-most first.
|
|
71
74
|
*/
|
|
@@ -80,7 +83,8 @@ export function planGrowth(nodes, node, h) {
|
|
|
80
83
|
while (queue.length > 0) {
|
|
81
84
|
const rect = queue.shift()
|
|
82
85
|
for (const other of nodes) {
|
|
83
|
-
|
|
86
|
+
const self = other === node || (node.el && other.el === node.el)
|
|
87
|
+
if (self || moved.has(other) || !overlaps(rect, other)) {
|
|
84
88
|
continue
|
|
85
89
|
}
|
|
86
90
|
const next = { x: other.x, y: other.y + delta, w: other.w, h: other.h }
|