text: function init(Survey) {
    var widget = {
      settings: {
        supportedTypes: ["radiogroup", "checkbox", "boolean"],
        radiogroup: {
          rootClass: "pretty p-default p-round",
          inputType: "radio",
          states: [{ stateClass: "state p-success", addOn: "" }]
        },
        checkbox: {
          rootClass: "pretty p-default",
          inputType: "checkbox",
          states: [{ stateClass: "state p-success", addOn: "" }]
        },
        boolean: {
          rootClass: "pretty p-icon p-default p-has-indeterminate",
          inputType: "checkbox",
          states: [
            { stateClass: "state p-success", addOn: "" },
            {
              stateClass: "state p-success p-is-indeterminate",
              iconClass: "icon mdi mdi-minus",
              addOn: ""
            }
          ]
        }
      },
      name: "pretty-checkbox",
      activatedBy: "property",
      widgetIsLoaded: function() {
        return true;
      },
      htmlTemplate: "<fieldset></fieldset>",
      isFit: function(question) {
        var isFitByType =
          widget.settings.supportedTypes.indexOf(question.getType()) !== -1;
  
        if (widget.activatedBy === "property") {
          return question["renderAs"] === "prettycheckbox" && isFitByType;
        } else if (widget.activatedBy === "type") {
          return isFitByType;
        }
  
        return false;
      },
      activatedByChanged: function(value) {
        if (this.widgetIsLoaded()) {
          widget.activatedBy = value;
          widget.settings.supportedTypes.forEach(function(supportedType) {
            Survey.JsonObject.metaData.removeProperty(supportedType, "renderAs");
  
            if (value === "property") {
              Survey.JsonObject.metaData.addProperty(supportedType, {
                name: "renderAs",
                default: "standard",
                choices: ["standard", "prettycheckbox"]
              });
            }
          });
        }
      },
      isDefaultRender: false,
      afterRender: function(question, element) {
        var itemInputs = {};
        var questionType = question.getType();
        var options = this.settings[questionType];
        var checkboxType = questionType === "checkbox";
        var radiogroupType = questionType === "radiogroup";
        var booleanType = questionType === "boolean";
  
        var inChangeHandler = false;
        var changeHandler = function(event) {
          inChangeHandler = true;
          try {
            var target = arguments[0].target;
            var targetValue = target.value;
            var targetChecked = target.checked;
  
            if (checkboxType) {
              var questionValue = question.value || [];
              var valueIndex = questionValue.indexOf(targetValue);
              if (targetChecked) {
                if (valueIndex === -1) {
                  questionValue.push(targetValue);
                }
              } else {
                if (valueIndex !== -1) {
                  questionValue.splice(valueIndex, 1);
                }
              }
  
              question.value = questionValue;
            } else if (radiogroupType) {
              question.value = targetValue;
            } else {
              question.value = targetChecked;
            }
          } finally {
            inChangeHandler = false;
          }
        };
  
        var itemWidth =
          question.colCount > 0 ? 100 / question.colCount + "%" : "";
  
        var choices = booleanType
          ? [{ locText: question.locTitle, value: !!question.value }]
          : question.choices;
        choices.forEach(function(choiceItem, index) {
          var input = document.createElement("input");
          input.type = options.inputType;
          input.name = question.name + (checkboxType ? "" + index : "");
          input.onchange = changeHandler;
          input.value = choiceItem.value;
  
          if (booleanType) {
            input.indeterminate = question.defaultValue === "indeterminate";
          }
  
          var controlRoot = document.createElement("div");
          controlRoot.className = options.rootClass;
          controlRoot.appendChild(input);
  
          options.states.forEach(function(state) {
            var stateRoot = document.createElement("div");
            stateRoot.className = state.stateClass;
            if (!!state.iconClass) {
              var icon = document.createElement("i");
              icon.className = state.iconClass;
              stateRoot.appendChild(icon);
            }
  
            var label = document.createElement("label");
            if (choiceItem.locText.hasHtml) {
              label.innerHTML = choiceItem.locText.html;
            } else {
              label.textContent = choiceItem.locText.text;
            }
            stateRoot.appendChild(label);
  
            controlRoot.appendChild(stateRoot);
            if (!!state.addOn) {
              stateRoot.insertAdjacentHTML("afterbegin", state.addOn);
            }
          });
  
          var itemRoot = document.createElement("div");
          itemRoot.className = "sv_cw_pretty_checkbox_" + questionType;
          itemRoot.style.display = "inline-block";
          itemRoot.style.width = itemWidth;
          itemRoot.appendChild(controlRoot);
  
          element.appendChild(itemRoot);
  
          itemInputs[choiceItem.value] = input;
        });
  
        var updateValueHandler = function(newValue) {
          if (!inChangeHandler) {
            var checkedItems = newValue || [];
            if (radiogroupType) {
              checkedItems = [newValue];
            }
  
            Object.values(itemInputs).forEach(function(inputItem) {
              if (checkedItems.indexOf(inputItem.value) !== -1) {
                inputItem.setAttribute("checked", undefined);
              } else {
                inputItem.removeAttribute("checked");
              }
            });
          }
        };
        var readOnlyHandler = function() {
          Object.values(itemInputs).forEach(function(inputItem) {
            if (question.isReadOnly) {
              inputItem.setAttribute("disabled", true);
            } else {
              inputItem.removeAttribute("disabled");
            }
          });
        };
  
        question.valueChangedCallback = updateValueHandler;
        question.readOnlyChangedCallback = readOnlyHandler;
        updateValueHandler(question.value);
        readOnlyHandler();
      },
      willUnmount: function(question, el) {
        question.valueChangedCallback = undefined;
      }
    };
  
    Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, "property");
  }
  
  if (typeof Survey !== "undefined") {
    init(Survey);
  }
  
  export default init;
  