-
Notifications
You must be signed in to change notification settings - Fork 0
/
fl.meteor.GridHelper.js
145 lines (128 loc) · 4.68 KB
/
fl.meteor.GridHelper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
angular.module('fl.meteor').factory('GridHelper', GridHelper);
GridHelper.$inject = ['ModalService', 'LoadingIndicator'];
function GridHelper(ModalService, LoadingIndicator) {
return {
factory: {
remove: remove,
removeSelected: removeSelected
},
attachNeedLoadMoreData: attachNeedLoadMoreData,
attachAfterCellEdit: attachAfterCellEdit,
attachAutorun: attachAutorun,
attachWatchQuery: attachWatchQuery,
generateGridOptions: generateGridOptions
};
function generateGridOptions(source) {
return _.defaults(source, {
enableFooterTotalSelected: true,
enableRowSelection: true,
enableSelectAll: true,
enableInfiniteScroll: true,
selectionRowHeaderWidth: 35,
rowHeight: 35,
showGridFooter: true,
infiniteScrollRowsFromEnd: 40,
multiSelect: true,
columnDefs: [],
data: []
});
}
function attachAutorun($scope, gridApi, subscribeKey, counterKey) {
$scope.$meteorAutorun(function(computation) {
$log.debug("onAutorun: ", $scope.getReactively("limit"), computation.firstRun);
var limit = $scope.getReactively("limit");
var query = $scope.getReactively("query", true);
gridApi.infiniteScroll.saveScrollPercentage();
LoadingIndicator.start();
$scope.$meteorSubscribe(subscribeKey, query, limit).then(function() {
$scope.totalCounts = $scope.$meteorObject(Counts, counterKey, false);
}).finally(function() {
LoadingIndicator.stop();
gridApi.infiniteScroll.dataLoaded(false, !isLast($scope.totalCounts, $scope.gridOptions));
});
});
}
function isLast(totalCounts, gridOptions) {
return gridOptions.data.length === 0 || (totalCounts && totalCounts.count !== 0 && gridOptions.data.length === totalCounts.count);
}
function confirmRemove($event) {
return ModalService.confirm("정말 삭제하시겠습니까?", {$event: $event, okLabel: "삭제"});
}
function removeSelected(gridApi, fnRemove) {
return _.wrap(function($event) {
confirmRemove($event).then(function() {
var selectedRows = gridApi.selection.getSelectedRows();
gridApi.selection.clearSelectedRows();
fnRemove(_.map(selectedRows, "_id")).then(function() {
ModalService.toast("삭제가 되었습니다.");
}, function(error) {
_.each(selectedRows, function(rowEntity) {
gridApi.selection.selectRow(rowEntity);
});
onError(error);
});
});
}, checkSelected(gridApi));
}
function remove(gridApi, fnRemove) {
return function(rowEntity, $event) {
confirmRemove($event).then(function() {
var selectedRows = gridApi.selection.getSelectedRows();
var isSelectRow = !!_.find(selectedRows, rowEntity);
if(isSelectRow) {
gridApi.selection.unSelectRow(rowEntity);
}
fnRemove([rowEntity._id]).then(function() {
ModalService.toast("삭제가 되었습니다.");
}, function(error) {
if(isSelectRow) {
gridApi.selection.selectRow(rowEntity);
}
onError(error);
});
});
}
}
function onError(error) {
ModalService.toast("실패 : " + error.reason);
}
function attachNeedLoadMoreData($scope, gridApi, size) {
gridApi.infiniteScroll.on.needLoadMoreData($scope, function onNeedLoadMoreData() {
$log.debug("onNeedLoadMoreData : ", $scope.limit);
gridApi.infiniteScroll.dataLoaded(false, false);
$scope.limit += size;
});
}
function attachAfterCellEdit($scope, gridApi, fnUpdate) {
gridApi.edit.on.afterCellEdit($scope, function onAfterCellEdit(rowEntity, colDef, newValue, oldValue) {
$log.debug(arguments);
if(newValue === oldValue) {
return;
}
fnUpdate(rowEntity).then(function() {
ModalService.toast("변경에 성공했습니다.");
}, function(error) {
onError(error);
rowEntity[colDef.field] = oldValue;
});
}
);
}
function checkSelected(gridApi) {
return function(afterFn) {
check(afterFn, Function);
$log.debug("$scope.gridApi.selection.getSelectedRows() : ", gridApi.selection.getSelectedRows());
if(gridApi.selection.getSelectedRows().length === 0) {
return ModalService.alert("최소 한개 이상 선택해주세요.");
}
return afterFn.apply(this, Array.prototype.slice.call(arguments, 1));
}
}
function attachWatchQuery($scope, gridApi, size) {
$scope.$watch("query", _.wrap(function() {
$log.debug("onChangeQuery : ", arguments);
gridApi.infiniteScroll.resetScroll(false, false);
$scope.limit = size;
}, NUTIL.checkChange), true);
}
}