jsl-ui 9.8.3 → 9.10.0

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.
@@ -0,0 +1,27 @@
1
+ import "./overlay.css";
2
+ import { IJSLComponent, IJSLVNode } from "jsl-render";
3
+ export interface IOverlayComponentOptions {
4
+ content: IJSLVNode | string | IJSLComponent;
5
+ showCloseButton?: boolean;
6
+ closeOnEscape?: boolean;
7
+ closeOnOverlayClick?: boolean;
8
+ onClose?: () => void | boolean;
9
+ onOpen?: () => void;
10
+ animate?: boolean;
11
+ direction?: "left" | "top";
12
+ size?: string;
13
+ class?: string;
14
+ style?: string;
15
+ }
16
+ export declare class OverlayComponent implements IJSLComponent {
17
+ static show(options: IOverlayComponentOptions): OverlayComponent;
18
+ private static lastRenderedDlg;
19
+ private closeIcon;
20
+ private onKeydownEvent;
21
+ close(): void;
22
+ private options;
23
+ constructor(options: IOverlayComponentOptions);
24
+ onCreate(node: IJSLVNode): void;
25
+ render(): IJSLVNode;
26
+ private toNode;
27
+ }
@@ -0,0 +1,149 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import "./overlay.css";
13
+ import { JSLRender } from "jsl-render";
14
+ var OverlayComponent = /** @class */ (function () {
15
+ function OverlayComponent(options) {
16
+ var _this = this;
17
+ this.closeIcon = {
18
+ tag: "div", content: "🗙", attr: {
19
+ class: "overl-close-btn", click: function () {
20
+ _this.close();
21
+ }
22
+ }
23
+ };
24
+ this.options = __assign({ closeOnEscape: true, closeOnOverlayClick: true, showCloseButton: true, direction: "left", animate: true }, options);
25
+ if (this.options.closeOnEscape) {
26
+ this.onKeydownEvent = document.addEventListener("keydown", function (args) {
27
+ if (args.keyCode === 27) { // escape
28
+ _this.close();
29
+ }
30
+ });
31
+ }
32
+ }
33
+ OverlayComponent.show = function (options) {
34
+ var container = document.createElement("div");
35
+ document.body.appendChild(container);
36
+ var oldRenderer = JSLRender.lastCreatedRenderer;
37
+ var oldLastDlg = OverlayComponent.lastRenderedDlg;
38
+ var renderer = new JSLRender(container, oldRenderer != null);
39
+ if (oldRenderer != null) {
40
+ JSLRender.lastCreatedRenderer = renderer;
41
+ }
42
+ var o = __assign({}, options);
43
+ o.onClose = function () {
44
+ if (options.onClose) {
45
+ if (options.onClose() === false) {
46
+ return;
47
+ }
48
+ }
49
+ document.body.removeChild(container);
50
+ JSLRender.lastCreatedRenderer = oldRenderer;
51
+ if (oldRenderer != null) {
52
+ oldRenderer.refresh();
53
+ }
54
+ OverlayComponent.lastRenderedDlg = oldLastDlg;
55
+ };
56
+ var dlg = new OverlayComponent(o);
57
+ OverlayComponent.lastRenderedDlg = dlg;
58
+ renderer.render(dlg);
59
+ return dlg;
60
+ };
61
+ OverlayComponent.prototype.close = function () {
62
+ if (this.options.onClose) {
63
+ if (this.options.onClose() === false) {
64
+ return;
65
+ }
66
+ }
67
+ // this.overlay.style.display = "none";
68
+ if (this.onKeydownEvent != null) {
69
+ document.removeEventListener("keydown", this.onKeydownEvent);
70
+ }
71
+ };
72
+ OverlayComponent.prototype.onCreate = function (node) {
73
+ var bodyDom = node.dom.querySelector(".overl-body");
74
+ if (bodyDom != null) {
75
+ if (this.options.direction === "left") {
76
+ node.dom.style.width = this.options.size;
77
+ if (this.options.animate) {
78
+ var realWidth = bodyDom.getBoundingClientRect().width;
79
+ node.dom.style.left = -realWidth + "px";
80
+ JSLRender.animate(node, { attr: "left", from: -realWidth + "px", to: "0px", duration: 500, easing: "easeOutSine" });
81
+ }
82
+ }
83
+ else {
84
+ node.dom.style.height = this.options.size;
85
+ if (this.options.animate) {
86
+ var realHeight = bodyDom.getBoundingClientRect().height;
87
+ node.dom.style.top = -realHeight + "px";
88
+ JSLRender.animate(node, { attr: "top", from: -realHeight + "px", to: "0px", duration: 500, easing: "easeOutSine" });
89
+ }
90
+ }
91
+ }
92
+ else {
93
+ console.error("overl-body class not found");
94
+ }
95
+ };
96
+ OverlayComponent.prototype.render = function () {
97
+ var _this = this;
98
+ var body = this.toNode(this.options.content);
99
+ // let styleW = "";
100
+ // let styleH = "";
101
+ // if (this.options.width != null) {
102
+ // styleW += "width:" + this.options.width + ";";
103
+ // }
104
+ // if (this.options.minWidth != null) {
105
+ // styleW += "min-width:" + this.options.minWidth + ";";
106
+ // }
107
+ // if (this.options.maxWidth != null) {
108
+ // styleW += "max-width:" + this.options.maxWidth + ";";
109
+ // }
110
+ // if (this.options.height != null) {
111
+ // styleH += "height:" + this.options.height + ";";
112
+ // }
113
+ // if (this.options.minHeight != null) {
114
+ // styleH += "min-height:" + this.options.minHeight + ";";
115
+ // }
116
+ // if (this.options.maxHeight != null) {
117
+ // styleH += "max-height:" + this.options.maxHeight + ";";
118
+ // }
119
+ // const headerStyle = this.options.allowMove ? "cursor:move" : undefined;
120
+ return {
121
+ tag: "div", attr: {
122
+ class: "jsl-overlay-overlay", click: function (e) {
123
+ if (_this.options.closeOnOverlayClick && e.target.classList.contains("jsl-overlay-overlay")) {
124
+ _this.close();
125
+ }
126
+ }, wheel: function (e) {
127
+ e.stopImmediatePropagation();
128
+ e.stopPropagation();
129
+ }
130
+ }, children: [
131
+ {
132
+ tag: "div", attr: { class: ("overl-body-" + this.options.direction) + " overl-body " + (this.options.class || ""), style: this.options.style }, children: [{
133
+ tag: "div", attr: { class: "overl-header" },
134
+ children: this.options.showCloseButton ? [this.closeIcon] : []
135
+ }, body]
136
+ }
137
+ ]
138
+ // }]
139
+ };
140
+ };
141
+ OverlayComponent.prototype.toNode = function (content) {
142
+ if (typeof content === "string") {
143
+ return { tag: "div", content: content };
144
+ }
145
+ return content;
146
+ };
147
+ return OverlayComponent;
148
+ }());
149
+ export { OverlayComponent };
@@ -0,0 +1,57 @@
1
+ .jsl-overlay-overlay {
2
+ position: fixed;
3
+ left: 0;
4
+ top: 0;
5
+ bottom: 0;
6
+ right: 0;
7
+ z-index: 2001;
8
+ background: rgba(255, 255, 255, 0.6);
9
+ height: 100vh;
10
+ }
11
+
12
+ .overl-header {
13
+ position:absolute;
14
+ right: 0;
15
+ top: 0;
16
+ }
17
+
18
+ .overl-body {
19
+ position: absolute;
20
+ overflow: auto;
21
+ background: rgb(255, 255, 255);
22
+ }
23
+
24
+ .overl-body-left {
25
+ left:0;
26
+ top:0;
27
+ bottom:0;
28
+ min-width: 50%;
29
+ box-shadow: 5px 0px 6px 0px rgba(34, 34, 34, 0.2);
30
+ }
31
+
32
+ .overl-body-top {
33
+ left:0;
34
+ top:0;
35
+ right:0;
36
+ min-height: 50%;
37
+ box-shadow: 0px 5px 4px 0px rgba(34,34,34,0.2);
38
+ }
39
+
40
+
41
+ .overl-close-btn {
42
+ color: #555555;
43
+ font-size: 2rem;
44
+ line-height: 2.2rem;
45
+ font-weight: bold;
46
+ position: absolute;
47
+ right: 0;
48
+ top: 0;
49
+ width: 2.2rem;
50
+ box-sizing: border-box;
51
+ border-top-right-radius: 0.8rem;
52
+ cursor: pointer;
53
+ }
54
+
55
+ .overl-close-btn:hover {
56
+ color: #B22121;
57
+ }
@@ -16,6 +16,10 @@
16
16
  width: 100%;
17
17
  }
18
18
 
19
+ .stackpanel-comp.hstackpanel:not(.responsive) > div {
20
+ display: flex;
21
+ }
22
+
19
23
  @media (min-width: 70em) {
20
24
 
21
25
  .stackpanel-comp.hstackpanel {
@@ -15,13 +15,13 @@ var TabsComponent = /** @class */ (function () {
15
15
  this.options = options;
16
16
  this.State = { selectedIndex: null };
17
17
  this.options = (_a = this.options) !== null && _a !== void 0 ? _a : {};
18
- this.checkForDuplicateIds();
19
18
  this.options.tabs = (_b = this.options.tabs) !== null && _b !== void 0 ? _b : [];
20
19
  this.options.selectedIndex = (_c = this.options.selectedIndex) !== null && _c !== void 0 ? _c : 0;
21
20
  }
22
21
  TabsComponent.prototype.render = function () {
23
22
  var _this = this;
24
23
  var _a, _b, _c, _d, _e;
24
+ this.checkForDuplicateIds();
25
25
  var index = -1;
26
26
  var activeIndex = (_a = this.State.selectedIndex) !== null && _a !== void 0 ? _a : this.options.selectedIndex;
27
27
  if (activeIndex > -1 &&
package/lib/core/jq.d.ts CHANGED
@@ -30,8 +30,8 @@ export interface IjQueryWrapper {
30
30
  }
31
31
  export interface IjQueryReplacement {
32
32
  (selector?: string | HTMLElement | Document): IjQueryWrapper;
33
- deepExtend?: (out: any, ...a: any[]) => any;
34
- shallowExtend?: (out: any, ...a: any[]) => any;
35
- each?: (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void) => void;
33
+ deepExtend: (out: any, ...a: any[]) => any;
34
+ shallowExtend: (out: any, ...a: any[]) => any;
35
+ each: (array: any[] | IjQueryWrapper, fnc: (idx: number, val: any) => void) => void;
36
36
  }
37
- export declare let jQueryReplacement: IjQueryReplacement;
37
+ export declare let jQueryReplacement: ((selector?: string | HTMLElement) => IjQueryWrapper) & IjQueryReplacement;
package/lib/core/jq.js CHANGED
@@ -309,7 +309,7 @@ function jQWrapper(elements) {
309
309
  };
310
310
  return _elements;
311
311
  }
312
- export var jQueryReplacement = function (selector) {
312
+ var jqueryCreate = function (selector) {
313
313
  var elements = [];
314
314
  if (typeof selector === "string") {
315
315
  if (selector[0] === '<') {
@@ -336,13 +336,12 @@ export var jQueryReplacement = function (selector) {
336
336
  }
337
337
  return jQWrapper(elements);
338
338
  };
339
- jQueryReplacement.deepExtend = deepExtend;
340
- jQueryReplacement.each = function (array, fnc) {
339
+ function each(array, fnc) {
341
340
  for (var i = 0; i < array.length; i++) {
342
341
  fnc(i, array[i]);
343
342
  }
344
- };
345
- jQueryReplacement.shallowExtend = function (out) {
343
+ }
344
+ function shallowExtend(out) {
346
345
  var rest = [];
347
346
  for (var _i = 1; _i < arguments.length; _i++) {
348
347
  rest[_i - 1] = arguments[_i];
@@ -357,4 +356,8 @@ jQueryReplacement.shallowExtend = function (out) {
357
356
  }
358
357
  }
359
358
  return out;
360
- };
359
+ }
360
+ jqueryCreate.deepExtend = deepExtend;
361
+ jqueryCreate.each = each;
362
+ jqueryCreate.shallowExtend = shallowExtend;
363
+ export var jQueryReplacement = jqueryCreate;
@@ -0,0 +1,8 @@
1
+ .cell-reorder {
2
+ cursor: move;
3
+ /* background: red; */
4
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAADAFBMVEUAAACWlpbY2NgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpIfcAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAABlJREFUCNdj+I8EGFA5jHAA5DDBAW2VIQEAmyRUB6U7kZIAAAAASUVORK5CYII=);
5
+ background-repeat: no-repeat;
6
+ background-position-x: center;
7
+ background-position-y: center;
8
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Row Move Manager options:
3
+ * cssClass: A CSS class to be added to the menu item container.
4
+ * columnId: Column definition id (defaults to "_move")
5
+ * cancelEditOnDrag: Do we want to cancel any Editing while dragging a row (defaults to false)
6
+ * disableRowSelection: Do we want to disable the row selection? (defaults to false)
7
+ * hideRowMoveShadow: Do we want to hide the row move shadow clone? (defaults to true)
8
+ * rowMoveShadowMarginTop: When row move shadow is shown, optional margin-top (defaults to 0)
9
+ * rowMoveShadowMarginLeft: When row move shadow is shown, optional margin-left (defaults to 0)
10
+ * rowMoveShadowOpacity: When row move shadow is shown, what is its opacity? (defaults to 0.95)
11
+ * rowMoveShadowScale: When row move shadow is shown, what is its size scale? (default to 0.75)
12
+ * singleRowMove: Do we want a single row move? Setting this to false means that it's a multple row move (defaults to false)
13
+ * width: Width of the column
14
+ * usabilityOverride: Callback method that user can override the default behavior of the row being moveable or not
15
+ *
16
+ */
17
+ import "./slick.rowmovemanager.css";
18
+ export declare function RowMoveManager(options: any): void;
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Row Move Manager options:
3
+ * cssClass: A CSS class to be added to the menu item container.
4
+ * columnId: Column definition id (defaults to "_move")
5
+ * cancelEditOnDrag: Do we want to cancel any Editing while dragging a row (defaults to false)
6
+ * disableRowSelection: Do we want to disable the row selection? (defaults to false)
7
+ * hideRowMoveShadow: Do we want to hide the row move shadow clone? (defaults to true)
8
+ * rowMoveShadowMarginTop: When row move shadow is shown, optional margin-top (defaults to 0)
9
+ * rowMoveShadowMarginLeft: When row move shadow is shown, optional margin-left (defaults to 0)
10
+ * rowMoveShadowOpacity: When row move shadow is shown, what is its opacity? (defaults to 0.95)
11
+ * rowMoveShadowScale: When row move shadow is shown, what is its size scale? (default to 0.75)
12
+ * singleRowMove: Do we want a single row move? Setting this to false means that it's a multple row move (defaults to false)
13
+ * width: Width of the column
14
+ * usabilityOverride: Callback method that user can override the default behavior of the row being moveable or not
15
+ *
16
+ */
17
+ import "./slick.rowmovemanager.css";
18
+ import { jQueryReplacement } from "../../core/jq";
19
+ import { Slick } from "../slick.core";
20
+ var $ = jQueryReplacement;
21
+ // register namespace
22
+ $.deepExtend(window, {
23
+ "Slick": {
24
+ "RowMoveManager": RowMoveManager
25
+ }
26
+ });
27
+ export function RowMoveManager(options) {
28
+ var _grid;
29
+ var _canvas;
30
+ var _dragging;
31
+ var _self = this;
32
+ var _usabilityOverride = null;
33
+ var _handler = new Slick.EventHandler();
34
+ var _defaults = {
35
+ columnId: "_move",
36
+ cssClass: null,
37
+ cancelEditOnDrag: false,
38
+ disableRowSelection: false,
39
+ hideRowMoveShadow: true,
40
+ rowMoveShadowMarginTop: 0,
41
+ rowMoveShadowMarginLeft: 0,
42
+ rowMoveShadowOpacity: 0.95,
43
+ rowMoveShadowScale: 0.75,
44
+ singleRowMove: false,
45
+ width: 40,
46
+ };
47
+ // user could override the expandable icon logic from within the options or after instantiating the plugin
48
+ if (options && typeof options.usabilityOverride === 'function') {
49
+ usabilityOverride(options.usabilityOverride);
50
+ }
51
+ function init(grid) {
52
+ options = $.deepExtend({}, _defaults, options);
53
+ _grid = grid;
54
+ _canvas = _grid.getCanvasNode();
55
+ _handler
56
+ .subscribe(_grid.onDragInit, handleDragInit)
57
+ .subscribe(_grid.onDragStart, handleDragStart)
58
+ .subscribe(_grid.onDrag, handleDrag)
59
+ .subscribe(_grid.onDragEnd, handleDragEnd);
60
+ }
61
+ function destroy() {
62
+ _handler.unsubscribeAll();
63
+ }
64
+ function setOptions(newOptions) {
65
+ options = $.shallowExtend({}, options, newOptions);
66
+ }
67
+ function handleDragInit(e) {
68
+ // prevent the grid from cancelling drag'n'drop by default
69
+ e.stopImmediatePropagation();
70
+ }
71
+ function handleDragStart(e, dd) {
72
+ var cell = _grid.getCellFromEvent(e);
73
+ var currentRow = cell && cell.row;
74
+ var dataContext = _grid.getDataItem(currentRow);
75
+ if (!checkUsabilityOverride(currentRow, dataContext, _grid)) {
76
+ return;
77
+ }
78
+ if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
79
+ _grid.getEditorLock().cancelCurrentEdit();
80
+ }
81
+ if (_grid.getEditorLock().isActive() || !isHandlerColumn(cell.cell)) {
82
+ return false;
83
+ }
84
+ _dragging = true;
85
+ e.stopImmediatePropagation();
86
+ // optionally create a shadow element of the row so that we can see all the time which row exactly we're dragging
87
+ if (!options.hideRowMoveShadow) {
88
+ var $slickRowElm = $(_grid.getCellNode(cell.row, cell.cell)).closestClass('slick-row');
89
+ if ($slickRowElm.length) {
90
+ dd.clonedSlickRow = $($slickRowElm[0].cloneNode(true))
91
+ .addClass('slick-reorder-shadow-row')
92
+ .css("marginTop", options.rowMoveShadowMarginTop || 0)
93
+ .css("marginLeft", options.rowMoveShadowMarginLeft || 0)
94
+ .css("opacity", options.rowMoveShadowOpacity || 0.95)
95
+ .css("transform", "scale(" + options.rowMoveShadowScale + ")")
96
+ .css("display", "none")
97
+ .appendTo(_canvas);
98
+ }
99
+ }
100
+ var selectedRows = options.singleRowMove ? [cell.row] : _grid.getSelectedRows();
101
+ if (selectedRows.length === 0 || selectedRows.indexOf(cell.row) === -1) {
102
+ selectedRows = [cell.row];
103
+ if (!options.disableRowSelection) {
104
+ _grid.setSelectedRows(selectedRows);
105
+ }
106
+ }
107
+ var rowHeight = _grid.getOptions().rowHeight;
108
+ dd.selectedRows = selectedRows;
109
+ var canvasWidth = _canvas.getBoundingClientRect().width;
110
+ dd.selectionProxy = $(document.createElement("div")) //"<div class='slick-reorder-proxy'/>")
111
+ .addClass("slick-reorder-proxy")
112
+ .css("position", "absolute")
113
+ .css("zIndex", "99999")
114
+ .css("width", canvasWidth) // $(_canvas).innerWidth())
115
+ .css("height", rowHeight * selectedRows.length)
116
+ .css("display", "none")
117
+ .appendTo(_canvas);
118
+ dd.guide = $(document.createElement("div")) // "<div class='slick-reorder-guide'/>")
119
+ .addClass("slick-reorder-guide")
120
+ .css("position", "absolute")
121
+ .css("zIndex", "99998")
122
+ .css("width", canvasWidth)
123
+ .css("top", -1000)
124
+ .appendTo(_canvas);
125
+ dd.insertBefore = -1;
126
+ }
127
+ function handleDrag(e, dd) {
128
+ if (!_dragging) {
129
+ return;
130
+ }
131
+ // e.preventDefault();
132
+ e.stopImmediatePropagation();
133
+ var top = dd.pageY - $(_canvas).offset().top;
134
+ dd.selectionProxy.css("top", top - 5).css("display", ""); //.show();
135
+ // if the row move shadow is enabled, we'll also make it follow the mouse cursor
136
+ if (dd.clonedSlickRow) {
137
+ var offsetY = dd.pageY - $(_canvas).offset().top;
138
+ dd.clonedSlickRow.css("top", offsetY - 6).css("display", ""); //.show();
139
+ }
140
+ var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
141
+ if (insertBefore !== dd.insertBefore) {
142
+ var eventData = {
143
+ "grid": _grid,
144
+ "rows": dd.selectedRows,
145
+ "insertBefore": insertBefore
146
+ };
147
+ if (_self.onBeforeMoveRows.notify(eventData) === false) {
148
+ dd.canMove = false;
149
+ }
150
+ else {
151
+ dd.canMove = true;
152
+ }
153
+ // if there's a UsabilityOverride defined, we also need to verify that the condition is valid
154
+ if (_usabilityOverride && dd.canMove) {
155
+ var insertBeforeDataContext = _grid.getDataItem(insertBefore);
156
+ dd.canMove = checkUsabilityOverride(insertBefore, insertBeforeDataContext, _grid);
157
+ }
158
+ // if the new target is possible we'll display the dark blue bar (representin the acceptability) at the target position
159
+ // else it won't show up (it will be off the screen)
160
+ if (!dd.canMove) {
161
+ dd.guide.css("top", -1000);
162
+ }
163
+ else {
164
+ dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
165
+ }
166
+ dd.insertBefore = insertBefore;
167
+ }
168
+ }
169
+ function handleDragEnd(e, dd) {
170
+ if (!_dragging) {
171
+ return;
172
+ }
173
+ _dragging = false;
174
+ e.stopImmediatePropagation();
175
+ if (dd.guide == null) {
176
+ console.log("dd.guide");
177
+ }
178
+ else
179
+ dd.guide.remove();
180
+ if (dd.selectionProxy == null) {
181
+ console.log(" dd.selectionProxy");
182
+ }
183
+ else
184
+ dd.selectionProxy.remove();
185
+ if (dd.clonedSlickRow) {
186
+ dd.clonedSlickRow.remove();
187
+ dd.clonedSlickRow = null;
188
+ }
189
+ if (dd.canMove) {
190
+ var eventData = {
191
+ "grid": _grid,
192
+ "rows": dd.selectedRows,
193
+ "insertBefore": dd.insertBefore
194
+ };
195
+ // TODO: _grid.remapCellCssClasses ?
196
+ _self.onMoveRows.notify(eventData);
197
+ }
198
+ }
199
+ function getColumnDefinition() {
200
+ return {
201
+ id: options.columnId || "_move",
202
+ name: "",
203
+ field: "move",
204
+ width: options.width || 40,
205
+ behavior: "selectAndMove",
206
+ selectable: false,
207
+ resizable: false,
208
+ cssClass: options.cssClass,
209
+ formatter: moveIconFormatter
210
+ };
211
+ }
212
+ function moveIconFormatter(row, cell, value, columnDef, dataContext, grid) {
213
+ if (!checkUsabilityOverride(row, dataContext, grid)) {
214
+ return null;
215
+ }
216
+ else {
217
+ return { addClasses: "cell-reorder dnd", text: "" };
218
+ }
219
+ }
220
+ function checkUsabilityOverride(row, dataContext, grid) {
221
+ if (typeof _usabilityOverride === 'function') {
222
+ return _usabilityOverride(row, dataContext, grid);
223
+ }
224
+ return true;
225
+ }
226
+ /**
227
+ * Method that user can pass to override the default behavior or making every row moveable.
228
+ * In order word, user can choose which rows to be an available as moveable (or not) by providing his own logic show/hide icon and usability.
229
+ * @param overrideFn: override function callback
230
+ */
231
+ function usabilityOverride(overrideFn) {
232
+ _usabilityOverride = overrideFn;
233
+ }
234
+ function isHandlerColumn(columnIndex) {
235
+ return /move|selectAndMove/.test(_grid.getColumns()[columnIndex].behavior);
236
+ }
237
+ $.shallowExtend(this, {
238
+ "onBeforeMoveRows": new Slick.Event(),
239
+ "onMoveRows": new Slick.Event(),
240
+ "init": init,
241
+ "destroy": destroy,
242
+ "getColumnDefinition": getColumnDefinition,
243
+ "setOptions": setOptions,
244
+ "usabilityOverride": usabilityOverride,
245
+ "isHandlerColumn": isHandlerColumn,
246
+ "pluginName": "RowMoveManager"
247
+ });
248
+ }
249
+ // })(jQuery);
@@ -75,6 +75,7 @@ export interface ISlickColumn {
75
75
  asyncPostRenderCleanup?: (node: HTMLElement, row: number, column: ISlickColumn) => void;
76
76
  cannotTriggerInsert?: boolean;
77
77
  groupTotalsFormatter?: (item: any, columnDef: ISlickColumn, grid: any) => string | ISlickFormatterResult;
78
+ behavior?: string;
78
79
  }
79
80
  export declare let Slick: ISlick;
80
81
  /***
@@ -15,6 +15,7 @@ export interface ISlickCreatorOptions extends ISlickGridOptions {
15
15
  [key: string]: any[];
16
16
  } | any[]>;
17
17
  showFilterDialog?: (column: ISlickColumn, grid: IJSLGrid<any>) => void;
18
+ allowRowMove?: boolean;
18
19
  }
19
20
  export interface IJSLGrid<T> extends ISlickGrid<T> {
20
21
  dataView: ISlickDataView<T>;
@@ -9,6 +9,7 @@ import { HeaderButtons } from "./plugins/slick.headerbuttons";
9
9
  import { TextFormatter } from "./slick.formatters";
10
10
  import { ExcelFilter } from "./filterDialogs/excelFilter";
11
11
  import { UILang } from "../core/lang";
12
+ import { RowMoveManager } from "./plugins/slick.rowmovemanager";
12
13
  var $ = jQueryReplacement;
13
14
  export function createJSLGrid(selector, data, columns, option) {
14
15
  var formulaObjects = [];
@@ -60,6 +61,50 @@ export function createJSLGrid(selector, data, columns, option) {
60
61
  setupHeaderMenu();
61
62
  }
62
63
  setupHeaderButtons();
64
+ if (options.allowRowMove) {
65
+ var rowMovePlugin = new RowMoveManager({
66
+ cancelEditOnDrag: true,
67
+ singleRowMove: true,
68
+ disableRowSelection: true,
69
+ hideRowMoveShadow: false,
70
+ rowMoveShadowScale: 0.7,
71
+ rowMoveShadowOpacity: 0.9 // defaults to 0.95
72
+ });
73
+ grid.registerPlugin(rowMovePlugin);
74
+ rowMovePlugin.onBeforeMoveRows.subscribe(function (e, args) {
75
+ // debugger;
76
+ });
77
+ rowMovePlugin.onMoveRows.subscribe(function (e, args) {
78
+ var extractedRows = [], left, right;
79
+ var rows = args.rows;
80
+ var insertBefore = args.insertBefore;
81
+ left = data.slice(0, insertBefore);
82
+ right = data.slice(insertBefore, data.length);
83
+ rows.sort(function (a, b) { return a - b; });
84
+ for (var i = 0; i < rows.length; i++) {
85
+ extractedRows.push(data[rows[i]]);
86
+ }
87
+ rows.reverse();
88
+ for (var i = 0; i < rows.length; i++) {
89
+ var row = rows[i];
90
+ if (row < insertBefore) {
91
+ left.splice(row, 1);
92
+ }
93
+ else {
94
+ right.splice(row - insertBefore, 1);
95
+ }
96
+ }
97
+ data = left.concat(extractedRows.concat(right));
98
+ var selectedRows = [];
99
+ for (var i = 0; i < rows.length; i++)
100
+ selectedRows.push(left.length + i);
101
+ // grid.resetActiveCell();
102
+ dataView.beginUpdate();
103
+ dataView.setItems(data);
104
+ dataView.endUpdate();
105
+ grid.render();
106
+ });
107
+ }
63
108
  if (!option.explicitInitialization) {
64
109
  grid.init();
65
110
  }