diff --git a/.l10nignore b/.l10nignore index a87f091..a9827ed 100644 --- a/.l10nignore +++ b/.l10nignore @@ -1,2 +1 @@ -# compiled vue templates -js/create-form.js +js/survey.jquery.min.js diff --git a/Makefile b/Makefile index 34dbb7f..c531472 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ # * npm # * curl: used if phpunit and composer are not installed to fetch them from the web # * tar: for building the archive - +yarn_install=$(shell which yarn) app_name=forms project_dir=$(CURDIR) @@ -27,7 +27,11 @@ all: dev-setup appstore dev-setup: clean-dev npm-init composer npm-init: +ifeq (,$(yarn_install)) npm install +else + yarn +endif # a copy is fetched from the web .PHONY: composer diff --git a/appinfo/routes.php b/appinfo/routes.php index da113a5..fe73e8f 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -32,7 +32,6 @@ return [ ['name' => 'page#delete_form', 'url' => '/delete', 'verb' => 'POST'], ['name' => 'page#insert_vote', 'url' => '/insert/vote', 'verb' => 'POST'], - ['name' => 'page#insert_comment', 'url' => '/insert/comment', 'verb' => 'POST'], ['name' => 'page#search', 'url' => '/search', 'verb' => 'POST'], ['name' => 'page#get_display_name', 'url' => '/get/displayname', 'verb' => 'POST'], @@ -40,7 +39,6 @@ return [ ['name' => 'api#get_form', 'url' => '/get/form/{formIdOrHash}', 'verb' => 'GET'], ['name' => 'api#get_options', 'url' => '/get/options/{formId}', 'verb' => 'GET'], ['name' => 'api#get_votes', 'url' => '/get/votes/{formId}', 'verb' => 'GET'], - ['name' => 'api#get_comments', 'url' => '/get/comments/{formId}', 'verb' => 'GET'], ['name' => 'api#get_shares', 'url' => '/get/shares/{formId}', 'verb' => 'GET'], ['name' => 'api#get_event', 'url' => '/get/event/{formId}', 'verb' => 'GET'], ['name' => 'api#remove_form', 'url' => '/remove/form', 'verb' => 'POST'], diff --git a/css/vote.scss b/css/vote.scss index 407b811..617a4a2 100644 --- a/css/vote.scss +++ b/css/vote.scss @@ -4,17 +4,29 @@ margin-top: 20px; } +.sv-q-description{ + font-size: 420px; +} + +.sv_container{ + h3 { + width: 400px; + font-size: 30px; + } +} + .sv_qstn .sq-root { border: 1px solid gray; border-left: 4px solid #18a689; border-radius: 5px; padding: 20px; + width: 400px; margin-bottom: 30px; font-size: 18px; } .sq-title { - font-size: 22px; + font-size: 20px; margin-left: 20px; } diff --git a/js/vote.js b/js/vote.js index 8b91501..e7fcab1 100644 --- a/js/vote.js +++ b/js/vote.js @@ -17,11 +17,13 @@ function sendDataToServer(survey) { } function cssUpdate(survey, options){ + console.log(options.cssClasses) var classes = options.cssClasses classes.root = 'sq-root' classes.title = 'sq-title' classes.item = 'sq-item' classes.label = 'sq-label' + classes.description = 'sv-q-description' if (options.question.isRequired) { classes.title = 'sq-title sq-title-required' diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 48f81fc..fb0ae20 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -25,7 +25,6 @@ namespace OCA\Forms\AppInfo; use OCA\Forms\Controller\PageController; use OCA\Forms\Controller\ApiController; -use OCA\Forms\Db\CommentMapper; use OCA\Forms\Db\OptionMapper; use OCA\Forms\Db\EventMapper; use OCA\Forms\Db\NotificationMapper; diff --git a/lib/Controller/ApiController.php b/lib/Controller/ApiController.php index 4125c90..690dc43 100644 --- a/lib/Controller/ApiController.php +++ b/lib/Controller/ApiController.php @@ -41,12 +41,8 @@ use OCP\Security\ISecureRandom; use OCA\Forms\Db\Event; use OCA\Forms\Db\EventMapper; -use OCA\Forms\Db\Option; -use OCA\Forms\Db\OptionMapper; use OCA\Forms\Db\Vote; use OCA\Forms\Db\VoteMapper; -use OCA\Forms\Db\Comment; -use OCA\Forms\Db\CommentMapper; use OCA\Forms\Db\Notification; use OCA\Forms\Db\NotificationMapper; @@ -62,9 +58,7 @@ class ApiController extends Controller { private $groupManager; private $userManager; private $eventMapper; - private $optionMapper; private $voteMapper; - private $commentMapper; private $questionMapper; private $answerMapper; @@ -76,9 +70,7 @@ class ApiController extends Controller { * @param IUserManager $userManager * @param string $userId * @param EventMapper $eventMapper - * @param OptionMapper $optionMapper * @param VoteMapper $voteMapper - * @param CommentMapper $commentMapper * @param QuestionMapper $questionMapper * @param AnswerMapper $answerMapper */ @@ -89,9 +81,7 @@ class ApiController extends Controller { IUserManager $userManager, $userId, EventMapper $eventMapper, - OptionMapper $optionMapper, VoteMapper $voteMapper, - CommentMapper $commentMapper, QuestionMapper $questionMapper, AnswerMapper $answerMapper ) { @@ -100,9 +90,7 @@ class ApiController extends Controller { $this->groupManager = $groupManager; $this->userManager = $userManager; $this->eventMapper = $eventMapper; - $this->optionMapper = $optionMapper; $this->voteMapper = $voteMapper; - $this->commentMapper = $commentMapper; $this->questionMapper = $questionMapper; $this->answerMapper = $answerMapper; } @@ -209,23 +197,6 @@ class ApiController extends Controller { return $grantAccessAs; } - /** - * Read all options of a form based on the form id - * @NoAdminRequired - * @NoCSRFRequired - * @param Integer $formId - * @return Array - */ - public function getOptions($formId) { - $optionList = array(); - $options = $this->optionMapper->findByForm($formId); - foreach ($options as $optionElement) { - $optionList[] = $optionElement->read(); - } - - return $optionList; - } - /** * Read all votes of a form based on the form id * @NoAdminRequired @@ -234,6 +205,17 @@ class ApiController extends Controller { * @return Array */ public function getVotes($formId) { + if (!\OC::$server->getUserSession()->getUser() instanceof IUser) { + $currentUser = ''; + } else { + $currentUser = \OC::$server->getUserSession()->getUser()->getUID(); + } + + $event = $this->getEvent($formId); + + $accessList = $this->convertAccessList($event['access']); + + if ($event['owner'] == $currentUser) { $votesList = array(); $votes = $this->voteMapper->findByForm($formId); @@ -243,24 +225,9 @@ class ApiController extends Controller { return $votesList; } + return NULL; +} - /** - * Read all comments of a form based on the form id - * @NoAdminRequired - * @NoCSRFRequired - * @param Integer $formId - * @return Array - */ - public function getComments($formId) { - $commentsList = array(); - $comments = $this->commentMapper->findByForm($formId); - - foreach ($comments as $commentElement) { - $commentsList[] = $commentElement->read(); - } - - return $commentsList; - } /** * Read an entire form based on form id @@ -382,7 +349,6 @@ class ApiController extends Controller { 'grantedAs' => $this->grantAccessAs($event, $shares), 'mode' => $mode, 'event' => $event, - 'comments' => $this->getComments($event['id']), 'votes' => $this->getVotes($event['id']), 'shares' => $shares, 'options' => [ @@ -436,7 +402,6 @@ class ApiController extends Controller { if ($this->userId !== $formToDelete->getOwner() && !$this->groupManager->isAdmin($this->userId)) { return new DataResponse(null, Http::STATUS_UNAUTHORIZED); } - $this->commentMapper->deleteByForm($id); $this->voteMapper->deleteByForm($id); // $this->notificationMapper->deleteByForm($id); $this->questionMapper->deleteByForm($id); @@ -473,8 +438,6 @@ class ApiController extends Controller { $newEvent->setDescription($event['description']); $newEvent->setIsAnonymous($event['isAnonymous']); - $newEvent->setFullAnonymous($event['fullAnonymous']); - $newEvent->setAllowMaybe($event['allowMaybe']); if ($event['access'] === 'select') { $shareAccess = ''; diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 86b6eb6..1755855 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -27,14 +27,10 @@ namespace OCA\Forms\Controller; -use OCA\Forms\Db\Comment; -use OCA\Forms\Db\CommentMapper; use OCA\Forms\Db\Event; use OCA\Forms\Db\EventMapper; use OCA\Forms\Db\Notification; use OCA\Forms\Db\NotificationMapper; -// use OCA\Forms\Db\Option; -// use OCA\Forms\Db\OptionMapper; use OCA\Forms\Db\Vote; use OCA\Forms\Db\VoteMapper; @@ -68,10 +64,8 @@ class PageController extends Controller { private $userId; private $config; - private $commentMapper; private $eventMapper; private $notificationMapper; - // private $optionMapper; private $voteMapper; private $questionMapper; @@ -99,8 +93,6 @@ class PageController extends Controller { * @param IFactory $transFactory * @param IURLGenerator $urlGenerator * @param string $userId - * @param CommentMapper $commentMapper - * @param OptionMapper $optionMapper * @param EventMapper $eventMapper * * @param QuestionMapper $questionMapper @@ -122,8 +114,6 @@ class PageController extends Controller { IFactory $transFactory, IURLGenerator $urlGenerator, $userId, - CommentMapper $commentMapper, - // OptionMapper $optionMapper, EventMapper $eventMapper, QuestionMapper $questionMapper, @@ -144,8 +134,6 @@ class PageController extends Controller { $this->transFactory = $transFactory; $this->urlGenerator = $urlGenerator; $this->userId = $userId; - $this->commentMapper = $commentMapper; - // $this->optionMapper = $optionMapper; $this->eventMapper = $eventMapper; $this->questionMapper = $questionMapper; @@ -358,9 +346,7 @@ class PageController extends Controller { } $form = new Event(); $form->setId($formId); - $this->commentMapper->deleteByForm($formId); $this->voteMapper->deleteByForm($formId); - // $this->optionMapper->deleteByForm($formId); $this->eventMapper->delete($form); $url = $this->urlGenerator->linkToRoute('forms.page.index'); return new RedirectResponse($url); @@ -379,71 +365,50 @@ class PageController extends Controller { * @return RedirectResponse */ public function insertVote($id, $userId, $answers, $questions) { + $form = $this->eventMapper->find($id); $count_answers = count($answers); $count = 1; + $anonID = "anon-user-". hash('md5', (time() + rand())); + for ($i = 0; $i < $count_answers; $i++) { if($questions[$i]['type'] == "checkbox"){ foreach (($answers[$questions[$i]['text']]) as $value) { $vote = new Vote(); $vote->setFormId($id); - $vote->setUserId($userId); + if($form->getIsAnonymous()){ + $vote->setUserId($anonID); + + }else{ + $vote->setUserId($userId); + } $vote->setVoteOptionText(htmlspecialchars($questions[$i]['text'])); $vote->setVoteAnswer($value); $vote->setVoteOptionId($count); + $vote->setVoteOptionType($questions[$i]['type']); $this->voteMapper->insert($vote); } $count++; } else { $vote = new Vote(); $vote->setFormId($id); - $vote->setUserId($userId); + if($form->getIsAnonymous()){ + $vote->setUserId($anonID); + }else{ + $vote->setUserId($userId); + } $vote->setVoteOptionText(htmlspecialchars($questions[$i]['text'])); $vote->setVoteAnswer($answers[$questions[$i]['text']]); $vote->setVoteOptionId($count++); + $vote->setVoteOptionType($questions[$i]['type']); $this->voteMapper->insert($vote); } } - $hash = $form->getHash(); $url = $this->urlGenerator->linkToRoute('forms.page.goto_form', ['hash' => $hash]); return new RedirectResponse($url); } - - /** - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * @param int $formId - * @param string $userId - * @param string $commentBox - * @return JSONResponse - */ - public function insertComment($formId, $userId, $commentBox) { - $comment = new Comment(); - $comment->setFormId($formId); - $comment->setUserId($userId); - $comment->setComment($commentBox); - $comment->setDt(date('Y-m-d H:i:s')); - $this->commentMapper->insert($comment); - $this->sendNotifications($formId, $userId); - $timeStamp = time(); - $displayName = $userId; - $user = $this->userMgr->get($userId); - if ($user !== null) { - $displayName = $user->getDisplayName(); - } - return new JSONResponse(array( - 'userId' => $userId, - 'displayName' => $displayName, - 'timeStamp' => $timeStamp * 100, - 'date' => date('Y-m-d H:i:s', $timeStamp), - 'relativeNow' => $this->trans->t('just now'), - 'comment' => $commentBox - )); - } - /** * @NoAdminRequired * @NoCSRFRequired diff --git a/lib/Db/Comment.php b/lib/Db/Comment.php deleted file mode 100644 index 7ee21bc..0000000 --- a/lib/Db/Comment.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * @author Vinzenz Rosenkranz - * @author Kai Schröer - * @author René Gieling - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\Forms\Db; - -use OCP\AppFramework\Db\Entity; - -/** - * @method string getUserId() - * @method void setUserId(string $value) - * @method string getDt() - * @method void setDt(string $value) - * @method string getComment() - * @method void setComment(string $value) - * @method integer getFormId() - * @method void setFormId(integer $value) - */ -class Comment extends Model { - protected $userId; - protected $dt; - protected $comment; - protected $formId; - - /** - * Comment constructor. - */ - public function __construct() { - $this->addType('formId', 'integer'); - } - - public function read() { - return [ - 'id' => $this->getId(), - 'userId' => $this->getUserId(), - 'date' => $this->getDt() . ' UTC', - 'comment' => $this->getComment() - ]; - - } -} diff --git a/lib/Db/CommentMapper.php b/lib/Db/CommentMapper.php deleted file mode 100644 index f0488c9..0000000 --- a/lib/Db/CommentMapper.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * @author Vinzenz Rosenkranz - * @author René Gieling - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\Forms\Db; - -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IDBConnection; -use OCP\AppFramework\Db\QBMapper; - -class CommentMapper extends QBMapper { - - /** - * CommentMapper constructor. - * @param IDBConnection $db - */ - public function __construct(IDBConnection $db) { - parent::__construct($db, 'forms_comments', '\OCA\Forms\Db\Comment'); - } - - /** - * @param int $formId - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @return Comment[] - */ - - public function findByForm($formId) { - $qb = $this->db->getQueryBuilder(); - - $qb->select('*') - ->from($this->getTableName()) - ->where( - $qb->expr()->eq('form_id', $qb->createNamedParameter($formId, IQueryBuilder::PARAM_INT)) - ); - - return $this->findEntities($qb); - } - - /** - * @param int $formId - */ - public function deleteByForm($formId) { - $qb = $this->db->getQueryBuilder(); - - $qb->delete($this->getTableName()) - ->where( - $qb->expr()->eq('form_id', $qb->createNamedParameter($formId, IQueryBuilder::PARAM_INT)) - ); - - $qb->execute(); - } -} diff --git a/lib/Db/Event.php b/lib/Db/Event.php index 66d37aa..6d0f5b7 100644 --- a/lib/Db/Event.php +++ b/lib/Db/Event.php @@ -44,10 +44,6 @@ use OCP\AppFramework\Db\Entity; * @method void setHash(string $value) * @method integer getIsAnonymous() * @method void setIsAnonymous(integer $value) - * @method integer getFullAnonymous() - * @method void setFullAnonymous(integer $value) - * @method integer getAllowMaybe() - * @method void setAllowMaybe(integer $value) */ class Event extends Model { protected $title; @@ -66,8 +62,6 @@ class Event extends Model { */ public function __construct() { $this->addType('isAnonymous', 'integer'); - $this->addType('fullAnonymous', 'integer'); - $this->addType('allowMaybe', 'integer'); } public function read() { @@ -96,8 +90,6 @@ class Event extends Model { 'expired' => $expired, 'expirationDate' => $this->getExpire(), 'isAnonymous' => $this->getIsAnonymous(), - 'fullAnonymous' => $this->getFullAnonymous(), - 'allowMaybe' => $this->getAllowMaybe() ]; } } diff --git a/lib/Db/Option.php b/lib/Db/Option.php deleted file mode 100644 index 9d7efef..0000000 --- a/lib/Db/Option.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * @author Vinzenz Rosenkranz - * @author Kai Schröer - * @author René Gieling -* - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\Forms\Db; - -use OCP\AppFramework\Db\Entity; - -/** - * @method integer getFormId() - * @method void setFormId(integer $value) - * @method string getFormOptionText() - * @method void setFormOptionText(string $value) - * @method integer getTimestamp() - * @method void setTimestamp(integer $value) - */ -class Option extends Model { - protected $formId; - protected $formOptionText; - protected $timestamp; - - /** - * Option constructor. - */ - public function __construct() { - $this->addType('formId', 'integer'); - $this->addType('timestamp', 'integer'); - } - - public function read() { - return [ - 'id' => $this->getId(), - 'text' => htmlspecialchars_decode($this->getFormOptionText()), - 'timestamp' => $this->getTimestamp() - ]; - } -} diff --git a/lib/Db/OptionMapper.php b/lib/Db/OptionMapper.php deleted file mode 100644 index 2e04afa..0000000 --- a/lib/Db/OptionMapper.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * @author Vinzenz Rosenkranz - * @author René Gieling -* - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\Forms\Db; - -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IDBConnection; -use OCP\AppFramework\Db\QBMapper; - -class OptionMapper extends QBMapper { - - /** - * TextMapper constructor. - * @param IDBConnection $db - */ - public function __construct(IDBConnection $db) { - parent::__construct($db, 'forms_options', '\OCA\Forms\Db\Option'); - } - - /** - * @param int $formId - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @return Option[] - */ - - public function findByForm($formId) { - $qb = $this->db->getQueryBuilder(); - - $qb->select('*') - ->from($this->getTableName()) - ->where( - $qb->expr()->eq('form_id', $qb->createNamedParameter($formId, IQueryBuilder::PARAM_INT)) - ); - - return $this->findEntities($qb); - } - - /** - * @param int $formId - */ - public function deleteByForm($formId) { - $qb = $this->db->getQueryBuilder(); - - $qb->delete($this->getTableName()) - ->where( - $qb->expr()->eq('form_id', $qb->createNamedParameter($formId, IQueryBuilder::PARAM_INT)) - ); - - $qb->execute(); - } -} diff --git a/lib/Db/Vote.php b/lib/Db/Vote.php index 53a7adc..85544a4 100644 --- a/lib/Db/Vote.php +++ b/lib/Db/Vote.php @@ -38,6 +38,8 @@ use OCP\AppFramework\Db\Entity; * @method void setVoteOptionText(string $value) * @method string getVoteAnswer() * @method void setVoteAnswer(string $value) + * @method string getVoteOptionType() + * @method void setVoteOptionType(string $value) */ class Vote extends Model { protected $formId; @@ -45,6 +47,7 @@ class Vote extends Model { protected $voteOptionId; protected $voteOptionText; protected $voteAnswer; + protected $voteOptionType; /** * Options constructor. @@ -60,7 +63,8 @@ class Vote extends Model { 'userId' => $this->getUserId(), 'voteOptionId' => $this->getVoteOptionId(), 'voteOptionText' => htmlspecialchars_decode($this->getVoteOptionText()), - 'voteAnswer' => $this->getVoteAnswer() + 'voteAnswer' => $this->getVoteAnswer(), + 'voteOptionType' => $this->getVoteOptionType() ]; } diff --git a/lib/Migration/Version0009Date20190000000005.php b/lib/Migration/Version0009Date20190000000006.php similarity index 96% rename from lib/Migration/Version0009Date20190000000005.php rename to lib/Migration/Version0009Date20190000000006.php index 34890fc..3a1538b 100644 --- a/lib/Migration/Version0009Date20190000000005.php +++ b/lib/Migration/Version0009Date20190000000006.php @@ -37,7 +37,7 @@ use OCP\Migration\IOutput; * Installation class for the forms app. * Initial db creation */ -class Version0009Date20190000000005 extends SimpleMigrationStep { +class Version0009Date20190000000006 extends SimpleMigrationStep { /** @var IDBConnection */ protected $connection; @@ -182,6 +182,10 @@ class Version0009Date20190000000005 extends SimpleMigrationStep { 'notnull' => false, 'length' => 4096, ]); + $table->addColumn('vote_option_type', Type::STRING, [ + 'notnull' => false, + 'length' => 256, + ]); $table->setPrimaryKey(['id']); } diff --git a/package.json b/package.json index b0c6d72..3b984bf 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "dependencies": { "acorn": "^6.1.1", "bootstrap": "^3.3.7", - "json2csv" : "4.5.1", + "json2csv": "4.5.1", "moment": "^2.23.0", "nextcloud-axios": "^0.1.3", "nextcloud-vue": "^0.9.0", @@ -80,9 +80,7 @@ "vue": "^2.6.8", "vue-click-outside": "^1.0.7", "vue-clipboard2": "^0.3.0", - "vue-router": "^3.0.2", - "survey-vue": "^1.0.56", - "surveyjs-widgets": "^1.0.56" + "vue-router": "^3.0.2" }, "browserslist": [ "> 1%", @@ -121,7 +119,7 @@ "vue-loader": "^15.7.0", "vue-style-loader": "^4.1.1", "vue-template-compiler": "^2.6.8", - "webpack": "^4.29.6", + "webpack": "^4.31.0", "webpack-cli": "^3.2.3", "webpack-merge": "^4.1.5" } diff --git a/src/js/components/_base-Controls.vue b/src/js/components/_base-Controls.vue index f1234a0..dadd4f1 100644 --- a/src/js/components/_base-Controls.vue +++ b/src/js/components/_base-Controls.vue @@ -23,6 +23,9 @@