diff --git a/application/views/admin/templateoptions/_form.php b/application/views/admin/templateoptions/_form.php
index e31b6f77ebe..194fcdb2470 100644
--- a/application/views/admin/templateoptions/_form.php
+++ b/application/views/admin/templateoptions/_form.php
@@ -8,10 +8,6 @@
beginWidget('CActiveForm', array(
'id'=>'template-options-form',
- // Please note: When you enable ajax validation, make sure the corresponding
- // controller action is handling ajax validation correctly.
- // There is a call to performAjaxValidation() commented in generated controller code.
- // See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
diff --git a/assets/packages/lstutorial/build/lstutorial.js b/assets/packages/lstutorial/build/lstutorial.js
new file mode 100644
index 00000000000..6b2355c7a73
--- /dev/null
+++ b/assets/packages/lstutorial/build/lstutorial.js
@@ -0,0 +1,1182 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bootstrap_tour__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_bootstrap_tour___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_bootstrap_tour__);
+
+
+const firstStartTour = new __WEBPACK_IMPORTED_MODULE_0_bootstrap_tour___default.a({
+ steps: [
+ {
+ orphan: true,
+ title: 'Welcome to LimeSurvey!',
+ content: `
+
This tour will help you get a hold of LimeSurvey.
+
We know that LimeSurvey may be hard to use at the beginning, that's why we would like to help with a quick tour through the most essential functions and features
+ `,
+ backdrop: true
+ },
+ {
+ element: '.selector__lstour--mainfunctionboxes',
+ title: 'The basic functions',
+ content: `The three top boxes are the most basic functions of LimeSurvey.
+ From left to right it should be "Create survey", "List surveys" and "Global settings"
+ At best we start by creating a survey.
+ Click on Create survey or Next in this box`,
+ reflex: '.selector__lstour--createsurvey',
+ redirect: (/\/index\.php(\/)?\?r=admin/.test(window.location.href) ? '/index.php?r=admin/survey?sa=newsurvey' : '/index.php/admin/survey/sa/newsurvey'),
+ backdrop: false
+ },
+ {
+ element: '#surveyls_title',
+ title: 'The survey title',
+ content: `This is the title of your survey.
+ Your participants will see this title as well in the browsers titlebar, als also on the welcome screen.
+
Tip: Make your surveys shine with a meaningful title
`
+ },
+ {
+ element: '#cke_description',
+ title: 'The survey description',
+ content: `This is the description of the survey.
+ Your participants will see this at first on their welcome screen.
+ Try to describe what your survey is about, but don't ask any qustion, yet.`
+ },
+ {
+ element: '.bootstrap-switch-id-createsample',
+ title: 'Create a sample question and question group',
+ content: `Since we are just beginning it is a good practice to let the wizard create a sample question and questiongroup for you.
+ If you like you can do this yourself, too`
+ },
+ {
+ element: '#cke_welcome',
+ title: 'The welcome message',
+ content: `This message is shown directly under the survey description on the welcome page.
+ You may leave this blank and concentrate on a good text for your description, or vice versa.`
+ },
+ {
+ element: '#cke_endtext',
+ title: 'The end message',
+ content: `This message is shown at the end of your survey to every participant.
+ It's a great way to say thank you, or to give some links or hints where to go next.`
+ },
+ {
+ element: '#save-form-button',
+ title: 'Thats it for now',
+ content: `You may play around with more settings, or just get to editing your survey now.
+ Just click on save.`
+ }
+ ],
+});
+
+window.tourLibrary = {
+ firstStartTour() {
+ firstStartTour.init();
+ firstStartTour.start();
+ }
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* ========================================================================
+ * bootstrap-tour - v0.11.0
+ * http://bootstraptour.com
+ * ========================================================================
+ * Copyright 2012-2015 Ulrich Sossou
+ *
+ * ========================================================================
+ * Licensed under the MIT License (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://opensource.org/licenses/MIT
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================================
+ */
+
+var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+
+(function(window, factory) {
+ if (true) {
+ return !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3)], __WEBPACK_AMD_DEFINE_RESULT__ = function(jQuery) {
+ return window.Tour = factory(jQuery);
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ } else if (typeof exports === 'object') {
+ return module.exports = factory(require('jquery'));
+ } else {
+ return window.Tour = factory(window.jQuery);
+ }
+})(window, function($) {
+ var Tour, document;
+ document = window.document;
+ Tour = (function() {
+ function Tour(options) {
+ this._showPopoverAndOverlay = bind(this._showPopoverAndOverlay, this);
+ var storage;
+ try {
+ storage = window.localStorage;
+ } catch (error) {
+ storage = false;
+ }
+ this._options = $.extend({
+ name: 'tour',
+ steps: [],
+ container: 'body',
+ autoscroll: true,
+ keyboard: true,
+ storage: storage,
+ debug: false,
+ backdrop: false,
+ backdropContainer: 'body',
+ backdropPadding: 0,
+ redirect: true,
+ orphan: false,
+ duration: false,
+ delay: false,
+ basePath: '',
+ template: '
We know that LimeSurvey may be hard to use at the beginning, that's why we would like to help with a quick tour through the most essential functions and features
\n `,\n backdrop: true\n },\n {\n element: '.selector__lstour--mainfunctionboxes',\n title: 'The basic functions',\n content: `The three top boxes are the most basic functions of LimeSurvey.\n From left to right it should be \"Create survey\", \"List surveys\" and \"Global settings\"\n At best we start by creating a survey.\n Click on Create survey or Next in this box`,\n reflex: '.selector__lstour--createsurvey',\n redirect: (/\\/index\\.php(\\/)?\\?r=admin/.test(window.location.href) ? '/index.php?r=admin/survey?sa=newsurvey' : '/index.php/admin/survey/sa/newsurvey'),\n backdrop: false\n },\n {\n element: '#surveyls_title',\n title: 'The survey title',\n content: `This is the title of your survey.\n Your participants will see this title as well in the browsers titlebar, als also on the welcome screen.\n
Tip: Make your surveys shine with a meaningful title
`\n },\n {\n element: '#cke_description',\n title: 'The survey description',\n content: `This is the description of the survey.\n Your participants will see this at first on their welcome screen.\n Try to describe what your survey is about, but don't ask any qustion, yet.`\n },\n {\n element: '.bootstrap-switch-id-createsample',\n title: 'Create a sample question and question group',\n content: `Since we are just beginning it is a good practice to let the wizard create a sample question and questiongroup for you.\n If you like you can do this yourself, too`\n },\n {\n element: '#cke_welcome',\n title: 'The welcome message',\n content: `This message is shown directly under the survey description on the welcome page.\n You may leave this blank and concentrate on a good text for your description, or vice versa.`\n },\n {\n element: '#cke_endtext',\n title: 'The end message',\n content: `This message is shown at the end of your survey to every participant.\n It's a great way to say thank you, or to give some links or hints where to go next.`\n },\n {\n element: '#save-form-button',\n title: 'Thats it for now',\n content: `You may play around with more settings, or just get to editing your survey now.\n Just click on save.`\n }\n ],\n});\n\nwindow.tourLibrary = {\n firstStartTour() {\n firstStartTour.init();\n firstStartTour.start();\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/main.js\n// module id = 1\n// module chunks = 0","/* ========================================================================\n * bootstrap-tour - v0.11.0\n * http://bootstraptour.com\n * ========================================================================\n * Copyright 2012-2015 Ulrich Sossou\n *\n * ========================================================================\n * Licensed under the MIT License (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://opensource.org/licenses/MIT\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================================\n */\n\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n(function(window, factory) {\n if (typeof define === 'function' && define.amd) {\n return define(['jquery'], function(jQuery) {\n return window.Tour = factory(jQuery);\n });\n } else if (typeof exports === 'object') {\n return module.exports = factory(require('jquery'));\n } else {\n return window.Tour = factory(window.jQuery);\n }\n})(window, function($) {\n var Tour, document;\n document = window.document;\n Tour = (function() {\n function Tour(options) {\n this._showPopoverAndOverlay = bind(this._showPopoverAndOverlay, this);\n var storage;\n try {\n storage = window.localStorage;\n } catch (error) {\n storage = false;\n }\n this._options = $.extend({\n name: 'tour',\n steps: [],\n container: 'body',\n autoscroll: true,\n keyboard: true,\n storage: storage,\n debug: false,\n backdrop: false,\n backdropContainer: 'body',\n backdropPadding: 0,\n redirect: true,\n orphan: false,\n duration: false,\n delay: false,\n basePath: '',\n template: '
We know that LimeSurvey may be hard to use at the beginning, that's why we would like to help with a quick tour through the most essential functions and features
\n ",backdrop:!0},{element:".selector__lstour--mainfunctionboxes",title:"The basic functions",content:'The three top boxes are the most basic functions of LimeSurvey.\n From left to right it should be "Create survey", "List surveys" and "Global settings"\n At best we start by creating a survey.\n Click on Create survey or Next in this box',reflex:".selector__lstour--createsurvey",redirect:/\/index\.php(\/)?\?r=admin/.test(window.location.href)?"/index.php?r=admin/survey?sa=newsurvey":"/index.php/admin/survey/sa/newsurvey",backdrop:!1},{element:"#surveyls_title",title:"The survey title",content:'This is the title of your survey.\n Your participants will see this title as well in the browsers titlebar, als also on the welcome screen.\n
Tip: Make your surveys shine with a meaningful title
'},{element:"#cke_description",title:"The survey description",content:"This is the description of the survey.\n Your participants will see this at first on their welcome screen.\n Try to describe what your survey is about, but don't ask any qustion, yet."},{element:".bootstrap-switch-id-createsample",title:"Create a sample question and question group",content:"Since we are just beginning it is a good practice to let the wizard create a sample question and questiongroup for you.\n If you like you can do this yourself, too"},{element:"#cke_welcome",title:"The welcome message",content:"This message is shown directly under the survey description on the welcome page.\n You may leave this blank and concentrate on a good text for your description, or vice versa."},{element:"#cke_endtext",title:"The end message",content:"This message is shown at the end of your survey to every participant.\n It's a great way to say thank you, or to give some links or hints where to go next."},{element:"#save-form-button",title:"Thats it for now",content:"You may play around with more settings, or just get to editing your survey now.\n Just click on save."}]});window.tourLibrary={firstStartTour:function(){i.init(),i.start()}}},function(t,e,o){var n,i,r=function(t,e){return function(){return t.apply(e,arguments)}};!function(r,s){n=[o(3)],void 0!==(i=function(t){return r.Tour=s(t)}.apply(e,n))&&(t.exports=i)}(window,function(t){var e;return e=window.document,function(){function o(e){this._showPopoverAndOverlay=r(this._showPopoverAndOverlay,this);var o;try{o=window.localStorage}catch(t){o=!1}this._options=t.extend({name:"tour",steps:[],container:"body",autoscroll:!0,keyboard:!0,storage:o,debug:!1,backdrop:!1,backdropContainer:"body",backdropPadding:0,redirect:!0,orphan:!1,duration:!1,delay:!1,basePath:"",template:'
We know that LimeSurvey may be hard to use at the beginning, that's why we would like to help with a quick tour through the most essential functions and features
+ `,
+ backdrop: true
+ },
+ {
+ element: '.selector__lstour--mainfunctionboxes',
+ title: 'The basic functions',
+ content: `The three top boxes are the most basic functions of LimeSurvey.
+ From left to right it should be "Create survey", "List surveys" and "Global settings"
+ At best we start by creating a survey.
+ Click on Create survey or Next in this box`,
+ reflex: '.selector__lstour--createsurvey',
+ redirect: (/\/index\.php(\/)?\?r=admin/.test(window.location.href) ? '/index.php?r=admin/survey?sa=newsurvey' : '/index.php/admin/survey/sa/newsurvey'),
+ backdrop: false
+ },
+ {
+ element: '#surveyls_title',
+ title: 'The survey title',
+ content: `This is the title of your survey.
+ Your participants will see this title as well in the browsers titlebar, als also on the welcome screen.
+
Tip: Make your surveys shine with a meaningful title
`
+ },
+ {
+ element: '#cke_description',
+ title: 'The survey description',
+ content: `This is the description of the survey.
+ Your participants will see this at first on their welcome screen.
+ Try to describe what your survey is about, but don't ask any qustion, yet.`
+ },
+ {
+ element: '.bootstrap-switch-id-createsample',
+ title: 'Create a sample question and question group',
+ content: `Since we are just beginning it is a good practice to let the wizard create a sample question and questiongroup for you.
+ If you like you can do this yourself, too`
+ },
+ {
+ element: '#cke_welcome',
+ title: 'The welcome message',
+ content: `This message is shown directly under the survey description on the welcome page.
+ You may leave this blank and concentrate on a good text for your description, or vice versa.`
+ },
+ {
+ element: '#cke_endtext',
+ title: 'The end message',
+ content: `This message is shown at the end of your survey to every participant.
+ It's a great way to say thank you, or to give some links or hints where to go next.`
+ },
+ {
+ element: '#save-form-button',
+ title: 'Thats it for now',
+ content: `You may play around with more settings, or just get to editing your survey now.
+ Just click on save.`
+ }
+ ],
+});
+
+export const tourLibrary = {
+ firstStartTour() {
+ firstStartTour.init();
+ firstStartTour.start();
+ }
+};
diff --git a/assets/packages/lstutorial/webpack.config.js b/assets/packages/lstutorial/webpack.config.js
new file mode 100644
index 00000000000..fe47a12bd43
--- /dev/null
+++ b/assets/packages/lstutorial/webpack.config.js
@@ -0,0 +1,65 @@
+var webpack = require('webpack');
+var path = require('path');
+
+
+// Naming and path settings
+var appName = 'lstutorial';
+var entryPoint = ['./src/main.js'];
+var exportPath = path.resolve(__dirname, './build');
+
+// Enviroment flag
+var plugins = [
+ new webpack.EnvironmentPlugin(['NODE_ENV'])
+];
+
+appName = appName + '.js';
+
+
+// Main Settings config
+module.exports = {
+ entry: entryPoint,
+ devtool: 'source-map',
+ output: {
+ path: exportPath,
+ filename: appName
+ },
+ externals: {
+ jquery: 'jQuery',
+ pjax: 'Pjax',
+ },
+ module: {
+ rules: [{
+ test: /\.scss$/,
+ use: [{
+ loader: 'style-loader' // creates style nodes from JS strings
+ }, {
+ loader: 'css-loader' // translates CSS into CommonJS
+ }, {
+ loader: 'sass-loader' // compiles Sass to CSS
+ }]
+ },
+ ],
+ loaders: [{
+ test: /\.js$/,
+ exclude: /(node_modules|bower_components)/,
+ loader: [
+ 'eslint-loader',
+ 'babel'
+ ],
+ options: {
+ data: '$env: ' + process.env.NODE_ENV + ';'
+ },
+ query: {
+ presets: ['es2015']
+ }
+ },
+ {
+ loader: 'sass-loader',
+ options: {
+ data: '$env: ' + process.env.NODE_ENV + ';'
+ }
+ }
+ ]
+ },
+ plugins
+};