<!DOCTYPE html>
<html>
<head>
<title>Text (type:'text') for plaform jQuery, Online Survey Library Example</title>
<script src="https://unpkg.com/jquery"></script>
<script src="https://unpkg.com/sortablejs@1.7.0/Sortable.js"></script>
<script src="https://surveyjs.azureedge.net/1.0.14/survey.jquery.js"></script>
<link href="https://surveyjs.azureedge.net/1.0.14/survey.css" type="text/css" rel="stylesheet"/>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<div id="surveyElement"></div>
<div id="surveyResult"></div>
<script type="text/javascript" src="./customwidget.js"></script>
<script type="text/javascript" src="./index.js"></script>
</body>
</html>
var json = {
elements: [
{
type: "sortablelist",
name: "q1",
choices: [
"http://rubaxa.github.io/Sortable/st/face-01.jpg",
"http://rubaxa.github.io/Sortable/st/face-02.jpg",
"http://rubaxa.github.io/Sortable/st/face-03.jpg",
"http://rubaxa.github.io/Sortable/st/face-04.jpg",
],
}
]
};
var survey = new Survey.Model(json);
survey
.onComplete
.add(function (result) {
document
.querySelector('#surveyResult')
.innerHTML = "result: " + JSON.stringify(result.data);
});
$("#surveyElement").Survey({model: survey});
var widget = {
name: "sortablelist",
title: "Sortable list",
iconName: "icon-sortablelist",
widgetIsLoaded: function() {
return typeof Sortable != "undefined";
},
defaultJSON: { choices: ["Item 1", "Item 2", "Item 3"] },
areaStyle: "border: 1px solid #1ab394; width:100%; min-height:50px",
itemStyle: "background-color:#1ab394;color:#fff;margin:5px;padding:10px; border-radius: 50%;",
isFit: function(question) {
return question.getType() === "sortablelist";
},
htmlTemplate:
"<div></div><style>.container_grid { display: flex; flex-wrap: wrap; align-content: flex-start; }</style>",
activatedByChanged: function(activatedBy) {
Survey.JsonObject.metaData.addClass(
"sortablelist",
[
{ name: "hasOther", visible: false },
{ name: "storeOthersAsComment", visible: false }
],
null,
"checkbox"
);
Survey.JsonObject.metaData.addProperty("sortablelist", {
name: "emptyText",
default: "Move items here."
});
},
afterRender: function(question, el) {
var rootWidget = this;
el.style.width = "100%";
var source, result;
var resultEl = document.createElement("div");
var emptyEl = document.createElement("span");
var sourceEl = document.createElement("div");
resultEl.className = "container_grid";
sourceEl.className = "container_grid";
resultEl.style.cssText = rootWidget.areaStyle;
emptyEl.innerHTML = question.emptyText;
resultEl.appendChild(emptyEl);
sourceEl.style.cssText = rootWidget.areaStyle;
sourceEl.style.marginTop = "10px";
el.appendChild(resultEl);
el.appendChild(sourceEl);
var hasValueInResults = function(val) {
var res = question.value;
if (!Array.isArray(res)) return false;
for (var i = 0; i < res.length; i++) {
if (res[i] == val) return true;
}
return false;
};
var isUpdatingQuestionValue = false;
var updateValueHandler = function() {
if (isUpdatingQuestionValue) return;
resultEl.innerHTML = "";
resultEl.appendChild(emptyEl);
sourceEl.innerHTML = "";
var wasInResults = false;
question.activeChoices.forEach(function(choice) {
var inResutls = hasValueInResults(choice.value);
wasInResults = wasInResults || inResutls;
var srcEl = inResutls ? resultEl : sourceEl;
var newEl = document.createElement("div");
newEl.innerHTML =
"<img style='" +
rootWidget.itemStyle +
"' src='" +
choice.text +
"'/>";
newEl.dataset["value"] = choice.value;
srcEl.appendChild(newEl);
});
emptyEl.style.display = wasInResults ? "none" : "";
};
result = question.resultEl = Sortable.create(resultEl, {
animation: 150,
disabled: question.isReadOnly,
group: question.name,
onSort: function(evt) {
var result = [];
if (resultEl.children.length === 1) {
emptyEl.style.display = "";
} else {
emptyEl.style.display = "none";
for (var i = 0; i < resultEl.children.length; i++) {
if (typeof resultEl.children[i].dataset.value === "undefined")
continue;
result.push(resultEl.children[i].dataset.value);
}
}
isUpdatingQuestionValue = true;
question.value = result;
isUpdatingQuestionValue = false;
}
});
source = question.sourceEl = Sortable.create(sourceEl, {
animation: 150,
disabled: question.isReadOnly,
group: question.name
});
question.valueChangedCallback = updateValueHandler;
question.readOnlyChangedCallback = function() {
if (question.isReadOnly) {
result.options.disabled = true;
source.options.disabled = true;
} else {
result.options.disabled = false;
source.options.disabled = false;
}
};
updateValueHandler();
},
willUnmount: function(question, el) {
question.resultEl.destroy();
question.sourceEl.destroy();
question.readOnlyChangedCallback = null;
}
};
Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, "customtype");