For the life of me, I cannot find out how to update a row's group when I'm using drag and drop to drop a row from one group to another.
Here is my grid's schema:
Here is my grid:
And this is the "change" event function. I would have thought there would be something in the "e" (event parameter) of the change event that tells me the new group I'm dropping this row into. That's all I need to know and I can do the rest:
Here is my grid's schema:
//Defines grid of main Kendo grid for Questions
$scope.questionsDataSource =
new
kendo.data.DataSource({
autoSync:
true
,
schema: {
model: {
fields: {
GroupId: { type:
"int"
, editable:
false
},
GroupName: { type:
"string"
, editable:
false
, title:
"Group"
},
GroupSortOrder: { type:
"int"
, editable:
false
},
Id: { type:
"int"
, editable:
false
},
Text: { type:
"string"
, editable:
true
},
AnswerTypeLU: { type:
"int"
, editable:
false
},
RowNumber: { type:
"int"
, editable:
false
},
IsRequired: { type:
"bool"
, editable:
false
},
IsHidden: { type:
"bool"
, editable:
false
},
AllowNotes: { type:
"bool"
, editable:
false
},
AllowAttachFiles: { type:
"bool"
, editable:
false
},
Special: { type:
"string"
, editable:
false
},
Response: { type:
"string"
, editable:
false
},
AnswerId: { type:
"int"
, editable:
false
},
AnswerValue: { type:
"string"
, editable:
false
},
CorrectAnswer: { type:
"bool"
, editable:
false
},
AnswerBitValue: { type:
"int"
, editable:
false
},
AnswerArray: { type:
"string"
, editable:
false
},
}
}
},
//This allows the Kendo grid to group questions based on the group they are in
group: {
field:
"GroupName"
},
//Sets default sort order for table. Current settings sorts by row and number
sort: [ { field:
"RowNumber"
, dir:
"asc"
}]
});
Here is my grid:
$scope.questionsGrid = {
dataSource: $scope.questionsDataSource,
scrollable:
false
,
sortable:
true
,
selectable:
'multiple'
,
resizable:
true
,
persistSelection:
true
,
filterable:
true
,
reorderable:
true
,
editable:
false
,
columnMenu:
true
,
excel: {
fileName:
"questionnaire.xlsx"
,
allPages:
true
,
proxyURL:
"/Common/FileHandlers/KendoSaveFile.aspx"
},
toolbar: kendo.template(
'<div class="toolbar">'
+
'<a type="button" id="questionsGridExport" class="btn btn-default k-button-icontext k-grid-Export pull-right"><span class="k-icon k-i-excel"></span>Export to Excel</a>'
+
'</div>'
),
dataBound:
function
(e) {
$scope.dataBound(e);
},
columns: [
//Add, remove, or customize kendo columns here
////{ field: "GroupName", template: "#=GroupName#", groupHeaderTemplate: "Group: #=value#" },
//{ title: '<input onclick=\'selectAll(this)\' type=\'checkbox\' />', template: "<input class='checkbox' type='checkbox' />", width: "30px" },
{ field:
"RowNumber"
, title:
"#"
, width:
"10px"
},
{
field:
"Text"
, title:
"Question"
,
groupHeaderTemplate:
"Name: #:count#"
,
template:
//Quick Kendo Tip: 'dataItem' is key for plugging in data
//These 3 rows add icons for if the question is required, notes are allowed, and if attach files are allowed
"<i ng-show='questionAddon(dataItem.IsRequired)' style='color:red; float:right;' class='fa fa-asterisk addon pull-right;'></i>"
+
"<i ng-show='questionAddon(dataItem.AllowNotes)' style='color:orange; float:right;' class='icon icon-note addon'></i>"
+
"<i ng-show='questionAddon(dataItem.AllowAttachFiles)' style='color:dodgerblue; float:right;' class='icon icon-cloud-upload addon'></i>"
+
"<i ng-show='questionAddon(dataItem.MultiFileUpload)' style='color:purple; float:right;' class='fa fa-copy addon'></i>"
+
"#: Text #"
//Kendo template function overides anything that would normally show in the 'field'. So you need to have '#: fieldName #' included in the template to show the field data
},
{ field:
"IsRequired"
, title:
"Required"
, template:
"{{Is_Required[dataItem.IsRequired]}}"
},
{ field:
"AnswerValue"
, title:
"Answer"
},
{ field:
"AnswerTypeLU"
, title:
"Type"
, template:
"{{AnswerTypeLUCodes[dataItem.AnswerTypeLU]}}"
},
{
title:
"Edit"
,
template:
"<button class='btn btn-default' data-target='.edit-question-modal' ng-click='editQuestion(dataItem)' data-toggle='modal' style='margin:0px; padding:2px 5px 2px 5px;'><i class='fa fa-pencil' title='Edit' style='margin-right:5px;'></i>Edit</button>"
,
width:
"30px"
,
},
{ field:
"questionId"
, hidden:
true
, title:
"Id"
, template:
"{{dataItem.Id}}"
},
]
}
And this is the "change" event function. I would have thought there would be something in the "e" (event parameter) of the change event that tells me the new group I'm dropping this row into. That's all I need to know and I can do the rest:
$scope.sortableOptions = {
//This needs it's own Kendo sortable wrapper to make the table sortable in the HTML doc
filter:
".k-grid tr[data-uid]"
,
//cursor: "move",
placeholder:
function
(element) {
return
element
.clone()
.removeAttr(
"uid"
)
.addClass(
"k-state-hover"
)
.css(
"opacity"
, 0.65);
},
container:
".k-grid tbody"
,
change:
function
(e) {
var
grid = $scope.questionsGrid;
var
oldIndex = e.oldIndex;
var
newIndex = e.newIndex;
var
dataItem = grid.dataSource.getByUid(e.item.data(
"uid"
));
// reorder the datasource
if
(newIndex != oldIndex) {
grid.dataSource.remove(dataItem);
grid.dataSource.insert(newIndex, dataItem);
}
var
droppedQuestions = $.grep($scope.questionnaire.FlatQuestions,
function
(data, index) {
return
dataItem.Id === data.Id;
});
var
questiontoUpdate = droppedQuestions[0];
questiontoUpdate.SortOrder = newIndex;
questiontoUpdate.RowNumber = newIndex + 1;
var
questionsGrid = $(
"#questionsGrid"
).data(
"kendoGrid"
);
var
data = questionsGrid.dataSource.data();
var
totalNumber = data.length;
var
csv_sorted_questioIds =
""
;
var
currentGroupId =
null
;
var
currentGroupName =
""
;
var
currentGroupSortOrder = 0;
var
needToSaveQuestion =
false
;
// get the list of questionIds in the order we want
for
(
var
i = 0; i < totalNumber; i++) {
var
currentDataItem = data[i];
// get the group info of the current data item
currentGroupId = currentDataItem.GroupId;
currentGroupName = currentDataItem.GroupName;
currentGroupSortOrder = currentDataItem.GroupSortOrder;
if
(csv_sorted_questioIds ===
""
) {
csv_sorted_questioIds = currentDataItem.Id.toString();
}
else
{
csv_sorted_questioIds +=
","
+ currentDataItem.Id.toString();
}
if
(newIndex === i && questiontoUpdate.GroupId !== currentGroupId) {
// update the row with the new group info
questiontoUpdate.GroupId = currentGroupId;
questiontoUpdate.GroupName = currentGroupName;
questiontoUpdate.GroupSortOrder = currentGroupSortOrder;
needToSaveQuestion =
true
;
}
}
$scope.saveQuestionSortOrder($scope.clientData.EventId, $scope.clientData.QuestionnaireId, $scope.questionnaire.HostCompanyId, $scope.questionnaire.Name, $scope.questionnaire.Label, csv_sorted_questioIds);
}
};