From 8ca3ffd17bba77ce41cc94fb5010861fe2a0e1f4 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Tue, 18 Jul 2017 11:41:09 +0200 Subject: [PATCH 1/7] Move property editor files to folders --- .../picker}/picker.overlay.controller.js | 0 .../picker}/picker.overlay.html | 13 ++++++----- .../{ => picker}/picker.controller.js | 22 +++++++++++-------- .../propertyEditors/{ => picker}/picker.html | 4 ++-- .../Client/lang/en-US.xml | 4 ++++ .../Client/lang/nl-NL.xml | 4 ++++ .../Client/package.manifest | 6 ++--- .../Qvision.Umbraco.PollIt.csproj | 8 +++---- 8 files changed, 38 insertions(+), 23 deletions(-) rename Source/Qvision.Umbraco.PollIt/Client/backoffice/{propertyEditors => overlays/picker}/picker.overlay.controller.js (100%) rename Source/Qvision.Umbraco.PollIt/Client/backoffice/{propertyEditors => overlays/picker}/picker.overlay.html (68%) rename Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/{ => picker}/picker.controller.js (56%) rename Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/{ => picker}/picker.html (60%) diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.overlay.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js similarity index 100% rename from Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.overlay.controller.js rename to Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.overlay.html b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.html similarity index 68% rename from Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.overlay.html rename to Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.html index af2e495..3a34c3f 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.overlay.html +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.html @@ -3,7 +3,7 @@ -
+
-
    +
    diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js similarity index 56% rename from Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.controller.js rename to Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js index 6ab4469..34a79d1 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js @@ -1,39 +1,43 @@ -function PickerController($scope, pollItResource) { - $scope.content = { selectedPoll: null, error: null } +function PickerController($scope, pollItResource, localizationService) { + $scope.content = { selection: null, error: null } if ($scope.model.value) { pollItResource.getQuestionById($scope.model.value).then(function(result) { - $scope.content.selectedPoll = result.data; + $scope.content.selection = result.data; }, function(error) { var currentValue = angular.copy($scope.model.value); - $scope.content.error = "The saved/picked poll with id '" + currentValue + "' no longer exists. Pick another poll below or clear out the old saved poll"; + $scope.content.error = "The saved/picked poll with id '" + currentValue + "' no longer exists. Pick another poll"; }); } $scope.openPollPicker = function () { if (!$scope.content.pollPickerOverlay) { $scope.content.pollPickerOverlay = { - view: "../App_Plugins/pollit/backoffice/propertyeditors/picker.overlay.html", + view: "../App_Plugins/pollit/backoffice/overlays/picker/picker.overlay.html", + title: localizationService.localize("pollIt_selectQuestions"), show: true, + hideSubmitButton: true, submit: function (model) { - if (model.selectedPolls && model.selectedPolls.length > 0) { - $scope.content.selectedPoll = model.selectedPolls[0]; - $scope.model.value = model.selectedPolls[0].id; + if (model.selection && model.selection.length > 0) { + $scope.content.selection = model.selection[0]; + $scope.model.value = model.selection[0].id; } $scope.content.pollPickerOverlay.show = false; $scope.content.pollPickerOverlay = null; + $scope.content.error = null; }, close: function () { $scope.content.pollPickerOverlay.show = false; $scope.content.pollPickerOverlay = null; + $scope.content.error = null; } } } } $scope.remove = function () { - $scope.content.selectedPoll = null; + $scope.content.selection = null; $scope.model.value = null; } } diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.html b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.html similarity index 60% rename from Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.html rename to Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.html index e734fa3..1fd1042 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker.html +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.html @@ -2,9 +2,9 @@ - + - + Add diff --git a/Source/Qvision.Umbraco.PollIt/Client/lang/en-US.xml b/Source/Qvision.Umbraco.PollIt/Client/lang/en-US.xml index ffc406b..33b478b 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/lang/en-US.xml +++ b/Source/Qvision.Umbraco.PollIt/Client/lang/en-US.xml @@ -9,6 +9,7 @@ Responses Answers Responses + Save the question in order to add answers. Add Answers Add and remove answers from the list @@ -16,5 +17,8 @@ Poll is visible from (optional) End date The poll will be closed and the result page will be shown from (optional) + + No quesions + Select a poll \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/lang/nl-NL.xml b/Source/Qvision.Umbraco.PollIt/Client/lang/nl-NL.xml index 551cbe9..6768086 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/lang/nl-NL.xml +++ b/Source/Qvision.Umbraco.PollIt/Client/lang/nl-NL.xml @@ -9,6 +9,7 @@ Reacties Antwoorden Reacties + Sla de vraag op om antwoorden toe te voegen. Antwoord toevoegen Voeg en verwijder antwoorden uit de lijst @@ -16,5 +17,8 @@ Poll is zichtbaar vanaf (optioneel) Eind datum De poll wordt afgesloten en de resultatenpagina wordt getoond van (optioneel) + + Geen polls gevonden + Selecteer een poll \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/package.manifest b/Source/Qvision.Umbraco.PollIt/Client/package.manifest index e49de98..c790113 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/package.manifest +++ b/Source/Qvision.Umbraco.PollIt/Client/package.manifest @@ -6,7 +6,7 @@ icon: "icon-poll", group: "Pickers", editor: { - view: "~/App_Plugins/pollit/backoffice/propertyEditors/picker.html", + view: "~/App_Plugins/pollit/backoffice/propertyEditors/picker/picker.html", "valueType": "JSON" } } @@ -15,8 +15,8 @@ '~/App_Plugins/pollit/backoffice/poll/delete.controller.js', '~/App_Plugins/pollit/backoffice/poll/edit.controller.js', - '~/App_Plugins/pollit/backoffice/propertyeditors/picker.controller.js', - '~/App_Plugins/pollit/backoffice/propertyeditors/picker.overlay.controller.js', + '~/App_Plugins/pollit/backoffice/propertyeditors/picker/picker.controller.js', + '~/App_Plugins/pollit/backoffice/overlays/picker/picker.overlay.controller.js', '~/App_Plugins/pollit/backoffice/dashboard/dashboard.controller.js', '~/App_Plugins/pollit/backoffice/pollIt-resource.js' diff --git a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj index 5be740e..cdf345c 100644 --- a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj +++ b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj @@ -310,15 +310,15 @@ + - - - - + + + From 939a83f38b3fb803f7e8e3dc25a41d44dfe0d663 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Tue, 18 Jul 2017 11:41:27 +0200 Subject: [PATCH 2/7] Add missing update --- .../picker/picker.overlay.controller.js | 31 +++---------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js index bb40d22..06981b8 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js @@ -11,36 +11,13 @@ $scope.isLoading = false; }); - if (!$scope.model.title) { - $scope.model.title = "Select a poll"; - } - - if (!$scope.model.multiPicker) { - $scope.model.hideSubmitButton = true; - } - - if (!$scope.model.selectedPolls) { - $scope.model.selectedPolls = []; + if (!$scope.model.selection) { + $scope.model.selection = []; } $scope.pickPoll = function (question) { - if (question.selected) { - question.selected = false; - - angular.forEach($scope.model.selectedPolls, function (selectedPoll, index) { - if (selectedPoll.id === question.id) { - $scope.model.selectedPolls.splice(index, 1); - } - }); - } else { - question.selected = true; - - $scope.model.selectedPolls.push(question); - - if (!$scope.model.multiPicker) { - $scope.model.submit($scope.model); - } - } + $scope.model.selection.push(question); + $scope.model.submit($scope.model); } } From cd83290b9b2088c1f9bba96da5247f3b3f3e202d Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Thu, 10 Aug 2017 09:50:39 +0200 Subject: [PATCH 3/7] Move and rename pollit.resource file --- Source/Qvision.Umbraco.PollIt/Client/package.manifest | 5 +++-- .../pollIt-resource.js => resources/pollIt.resource.js} | 0 Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) rename Source/Qvision.Umbraco.PollIt/Client/{backoffice/pollIt-resource.js => resources/pollIt.resource.js} (100%) diff --git a/Source/Qvision.Umbraco.PollIt/Client/package.manifest b/Source/Qvision.Umbraco.PollIt/Client/package.manifest index c790113..0d2cd79 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/package.manifest +++ b/Source/Qvision.Umbraco.PollIt/Client/package.manifest @@ -12,13 +12,14 @@ } ], javascript: [ + '~/App_Plugins/pollit/resources/pollIt.resource.js', + '~/App_Plugins/pollit/backoffice/poll/delete.controller.js', '~/App_Plugins/pollit/backoffice/poll/edit.controller.js', '~/App_Plugins/pollit/backoffice/propertyeditors/picker/picker.controller.js', '~/App_Plugins/pollit/backoffice/overlays/picker/picker.overlay.controller.js', - '~/App_Plugins/pollit/backoffice/dashboard/dashboard.controller.js', - '~/App_Plugins/pollit/backoffice/pollIt-resource.js' + '~/App_Plugins/pollit/backoffice/dashboard/dashboard.controller.js' ] } \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/pollIt-resource.js b/Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js similarity index 100% rename from Source/Qvision.Umbraco.PollIt/Client/backoffice/pollIt-resource.js rename to Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js diff --git a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj index cdf345c..7803575 100644 --- a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj +++ b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj @@ -311,7 +311,7 @@ - + From 09c4aab55c37a305308f629b4f04c90c07750c17 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Wed, 4 Oct 2017 15:01:49 +0200 Subject: [PATCH 4/7] Remove updateSort method --- .../Client/resources/pollIt.resource.js | 3 --- .../ApiControllers/AnswerApiController.cs | 24 ++++--------------- .../Models/Repositories/AnswerRepository.cs | 7 ------ Source/Qvision.Umbraco.PollIt/Startup.cs | 3 +-- 4 files changed, 5 insertions(+), 32 deletions(-) diff --git a/Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js b/Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js index a9c816a..a339f26 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js +++ b/Source/Qvision.Umbraco.PollIt/Client/resources/pollIt.resource.js @@ -32,9 +32,6 @@ saveAnswer: function (answer) { return $http.post(Umbraco.Sys.ServerVariables.pollIt.saveAnswer, answer); }, - updateSort: function (ids, questionId) { - return $http.post(Umbraco.Sys.ServerVariables.pollIt.updateSort + "?questionId=" + questionId, ids); - }, deleteAnswer: function (id, questionId) { return $http.delete(Umbraco.Sys.ServerVariables.pollIt.deleteAnswer + "?id=" + id + "&questionId=" + questionId); } diff --git a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs index 672a761..45c4c7a 100644 --- a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs +++ b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs @@ -1,15 +1,15 @@ namespace Qvision.Umbraco.PollIt.Controllers.ApiControllers -{ +{ using System.Net; using System.Net.Http; using System.Web.Http; + using global::Umbraco.Web.Editors; using Qvision.Umbraco.PollIt.Attributes; + using Qvision.Umbraco.PollIt.CacheRefresher; using Qvision.Umbraco.PollIt.Models.Pocos; using Qvision.Umbraco.PollIt.Models.Repositories; - using Qvision.Umbraco.PollIt.CacheRefresher; - [CamelCase] public class AnswerApiController : UmbracoAuthorizedJsonController @@ -28,22 +28,6 @@ public HttpResponseMessage Post(Answer answer) return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't save answer"); } - [HttpPost] - public HttpResponseMessage UpdateSort(int[] ids, int questionId) - { - if (ids != null && ids.Length > 0) - { - for (var i = 0; i < ids.Length; ++i) - { - AnswerRepository.Current.UpdateSort(ids[i], i); - } - } - - PollItCacheRefresher.ClearCache(questionId); - - return this.Request.CreateResponse(HttpStatusCode.OK); - } - [HttpDelete] public HttpResponseMessage Delete(int id, int questionId) { @@ -52,7 +36,7 @@ public HttpResponseMessage Delete(int id, int questionId) if (ResponseRepository.Current.DeleteByAnswerId(id) && AnswerRepository.Current.Delete(id)) { transaction.Complete(); - PollItCacheRefresher.ClearCache(questionId); + PollItCacheRefresher.ClearCache(questionId); return this.Request.CreateResponse(HttpStatusCode.OK); } diff --git a/Source/Qvision.Umbraco.PollIt/Models/Repositories/AnswerRepository.cs b/Source/Qvision.Umbraco.PollIt/Models/Repositories/AnswerRepository.cs index 1091248..8982f94 100644 --- a/Source/Qvision.Umbraco.PollIt/Models/Repositories/AnswerRepository.cs +++ b/Source/Qvision.Umbraco.PollIt/Models/Repositories/AnswerRepository.cs @@ -42,13 +42,6 @@ public Answer Save(Answer answer) return answer; } - public bool UpdateSort(int id, int index) - { - var result = this.Database.Update(new Answer { Id = id, Index = index }, new[] { "index" }); - - return result > 0; - } - public bool Delete(int id) { var result = this.Database.Delete(id); diff --git a/Source/Qvision.Umbraco.PollIt/Startup.cs b/Source/Qvision.Umbraco.PollIt/Startup.cs index f55a782..36b7679 100644 --- a/Source/Qvision.Umbraco.PollIt/Startup.cs +++ b/Source/Qvision.Umbraco.PollIt/Startup.cs @@ -138,8 +138,7 @@ private void ServerVariablesParserParsing(object sender, Dictionary("PostAnswer") }, { "getQuestionResponsesById", urlHelper.GetUmbracoApiService("GetResponses") }, - { "saveAnswer", urlHelper.GetUmbracoApiService("Post") }, - { "updateSort", urlHelper.GetUmbracoApiService("UpdateSort") }, + { "saveAnswer", urlHelper.GetUmbracoApiService("Post") }, { "deleteAnswer", urlHelper.GetUmbracoApiService("Delete") } }; From fa4e997380a25b47817edbb2e3cbff6740505575 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Wed, 4 Oct 2017 15:02:32 +0200 Subject: [PATCH 5/7] Add missing return when creating Answer --- .../Controllers/ApiControllers/AnswerApiController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs index 45c4c7a..9c09115 100644 --- a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs +++ b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/AnswerApiController.cs @@ -22,7 +22,7 @@ public HttpResponseMessage Post(Answer answer) if (result != null) { PollItCacheRefresher.ClearCache(answer.QuestionId); - this.Request.CreateResponse(HttpStatusCode.OK, answer); + return this.Request.CreateResponse(HttpStatusCode.OK, answer); } return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't save answer"); From c1ce77c3d5f24cd3bf19965fbe7fb9f5c2d03a43 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Wed, 4 Oct 2017 15:04:40 +0200 Subject: [PATCH 6/7] Move from tabs to subviews - When saving a question, update the answers instead of without the save button --- .../backoffice/poll/delete.controller.js | 1 - .../Client/backoffice/poll/edit.controller.js | 131 ++++-------------- .../Client/backoffice/poll/edit.html | 78 ++--------- .../subviews/content/content.controller.js | 84 +++++++++++ .../poll/subviews/content/content.html | 27 ++++ .../responses/responses.controller.js | 21 +++ .../poll/subviews/responses/responses.html | 34 +++++ .../Client/package.manifest | 3 + .../ApiControllers/QuestionApiController.cs | 43 ++++-- .../Qvision.Umbraco.PollIt.csproj | 4 + 10 files changed, 241 insertions(+), 185 deletions(-) create mode 100644 Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.controller.js create mode 100644 Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.html create mode 100644 Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.controller.js create mode 100644 Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.html diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/delete.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/delete.controller.js index 7ac3022..c316e64 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/delete.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/delete.controller.js @@ -1,6 +1,5 @@ function DeleteController($scope, $location, navigationService, treeService, editorState, dialogService, notificationsService, pollItResource) { $scope.performDelete = function () { - // stop from firing again on double-click if ($scope.busy) { return false; diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.controller.js index e2cf501..a0c0bf0 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.controller.js @@ -1,142 +1,61 @@ function EditController($scope, $routeParams, $filter, $location, navigationService, editorState, formHelper, localizationService, pollItResource) { - $scope.page = { loading: false, create: true, tabs: [{ id: 1, label: localizationService.localize("pollIt_tabContent") }, { id: 2, label: localizationService.localize("pollIt_tabResponses") }] }; - $scope.content = { question: {}, answers: [], answer: { value: '', hasError: false }, responses: [] }; - $scope.config = { - datePicker: { - pickDate: true, - pickTime: true, - useSeconds: false, - useMinutes: false, - format: "YYYY-MM-DD HH:mm:ss", - icons: { - time: "icon-time", - date: "icon-calendar", - up: "icon-chevron-up", - down: "icon-chevron-down", - today: "icon-locate" - } - } - } + $scope.page = { loading: false }; + $scope.model = { question: { answers: [] } }; + + $scope.page.navigation = [ + { + "name": localizationService.localize("pollIt_tabContent"), + "icon": "icon-document", + "view": "/app_plugins/pollit/backoffice/poll/subviews/content/content.html", + "active": true + }, { + "name": localizationService.localize("pollIt_tabResponses"), + "icon": "icon-poll", + "view": "/app_plugins/pollit/backoffice/poll/subviews/responses/responses.html" + }]; - $scope.startDatePicker = { view: 'datepicker', value: null, config: $.extend({}, $scope.config.datePicker) }; - $scope.endDatePicker = { view: 'datepicker', value: null, config: $.extend({}, $scope.config.datePicker) }; if (!$routeParams.create) { $scope.page.isLoading = true; - $scope.page.create = false; pollItResource.getQuestionById($routeParams.id).then(function (result) { - $scope.content.question = result.data; - - $scope.startDatePicker.value = $scope.content.question.startDate; - $scope.endDatePicker.value = $scope.content.question.endDate; + $scope.model.question = result.data; //set a shared state - editorState.set($scope.content.question); + editorState.set($scope.model.question); - $scope.page.isLoading = false; + pollItResource.getQuestionAnswersById($routeParams.id).then(function (result) { + $scope.model.question.answers = $filter('orderBy')(result.data, 'index'); + $scope.page.isLoading = false; + }); });; - - pollItResource.getQuestionAnswersById($routeParams.id).then(function (result) { - $scope.content.answers = $filter('orderBy')(result.data, 'index'); - }); - - pollItResource.getQuestionResponsesById($routeParams.id).then(function (result) { - $scope.content.responses = result.data; - }); - } - - $scope.getResponsesPercentage = function (id) { - var amount = $filter('filter')($scope.content.responses, { answerId: id }).length; - return amount > 0 ? Math.round(amount / $scope.content.responses.length * 100) : 0; } - $scope.getResponses = function (id) { - return $filter('filter')($scope.content.responses, { answerId: id }).length; - } - - $scope.$watch('startDatePicker', function () { - if ($scope.startDatePicker != undefined) { - $scope.content.question.startDate = $scope.startDatePicker.value; - } - }, true); - - $scope.$watch('endDatePicker', function () { - if ($scope.endDatePicker != undefined) { - $scope.content.question.endDate = $scope.endDatePicker.value; - } - }, true); - $scope.save = function () { if (formHelper.submitForm({ scope: $scope, statusMessage: "Saving..." })) { $scope.page.saveButtonState = "busy"; - pollItResource.saveQuestion($scope.content.question).then(function (result) { + pollItResource.saveQuestion($scope.model.question).then(function (result) { formHelper.resetForm({ scope: $scope }); $scope.page.saveButtonState = "success"; - $scope.content.question = result.data; + $scope.model.question = result.data; //set a shared state - editorState.set($scope.content.question); + editorState.set($scope.model.question); - navigationService.syncTree({ tree: 'poll', path: ['-1', $scope.content.question.id.toString()], forceReload: true, activate: true }); + navigationService.syncTree({ tree: 'poll', path: ['-1', $scope.model.question.id.toString()], forceReload: true, activate: true }); if ($scope.page.create) { $scope.page.create = false; - $location.url("/pollIt/poll/edit/" + $scope.content.question.id); + $location.url("/pollIt/poll/edit/" + $scope.model.question.id); } }, function () { $scope.page.saveButtonState = "error"; });; } }; - - $scope.sortableOptions = { - axis: 'y', - containment: 'parent', - cursor: 'move', - items: '> div.control-group', - tolerance: 'pointer', - stop: function () { - pollItResource.updateSort($scope.content.answers.map(function (answer) { return answer.id }), $scope.content.question.id); - } - }; - - $scope.addAnswer = function (event) { - event.preventDefault(); - - if ($scope.content.answer.value) { - if (!_.find($scope.content.answers, function (item) { return item.value === $scope.content.answer.value })) { - var answer = { value: $scope.content.answer.value, index: $scope.content.answers.length }; - - pollItResource.postQuestionAnswer($routeParams.id, answer).then(function (result) { - $scope.content.answers.push(result.data); - $scope.content.answer = { value: '', hasError: false }; - return; - }); - } - } - - $scope.content.answer = { hasError: true }; - }; - - $scope.updateAnswer = function (answer, event) { - event.preventDefault(); - - pollItResource.saveAnswer(answer); - } - - $scope.removeAnswer = function (answer, event) { - event.preventDefault(); - - pollItResource.deleteAnswer(answer.id, $routeParams.id).then(function () { - $scope.content.answers = _.reject($scope.content.answers, function (x) { - return x.id === answer.id; - }); - }); - }; } angular.module("umbraco").controller("PollIt.EditController", EditController); \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.html b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.html index 13199e8..866e377 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.html +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/edit.html @@ -1,82 +1,20 @@ 
    +
    - + - - + - + - - - - -
    -
    - - -
    -
    -
    - - - -
    -
    -
    -
    - Save the question in order to add answers -
    -
    - - - - - - - - -
    - -
    - - - - - - - - - - - - - - - -
    AnswersResponses
    - {{getResponsesPercentage(answer.id)}}% - - {{answer.value}} - - {{getResponses(answer.id)}} -
    -
    - - -

    Create answers

    -
    -
    -
    + + - +
    diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.controller.js new file mode 100644 index 0000000..60da7b2 --- /dev/null +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.controller.js @@ -0,0 +1,84 @@ +function ContentController($scope, $routeParams, angularHelper) { + $scope.answerInput = { value: '', hasError: false }; + + $scope.sortableOptions = { + axis: 'y', + containment: 'parent', + cursor: 'move', + items: '> div.control-group', + tolerance: 'pointer', + stop: function (ev, ui) { + angularHelper.safeApply($scope, function () { + angular.forEach($scope.model.question.answers, function (val, index) { + val.index = index; + }); + + }); + } + }; + + $scope.config = { + datePicker: { + pickDate: true, + pickTime: false, + useSeconds: false, + useMinutes: false, + format: "YYYY-MM-DD HH:mm:ss", + icons: { + time: "icon-time", + date: "icon-calendar", + up: "icon-chevron-up", + down: "icon-chevron-down", + today: "icon-locate" + } + } + } + + $scope.startDatePicker = { view: 'datepicker', value: $scope.model.question.startDate, config: $.extend({}, $scope.config.datePicker) }; + $scope.endDatePicker = { view: 'datepicker', value: $scope.model.question.endDate, config: $.extend({}, $scope.config.datePicker) }; + + $scope.$watch('startDatePicker', function () { + if ($scope.startDatePicker != undefined) { + $scope.model.question.startDate = $scope.startDatePicker.value; + } + }, true); + + $scope.$watch('endDatePicker', function () { + if ($scope.endDatePicker != undefined) { + $scope.model.question.endDate = $scope.endDatePicker.value; + } + }, true); + + $scope.addAnswer = function (event) { + event.preventDefault(); + + if ($scope.answerInput.value) { + if (!_.find($scope.model.question.answers, function (item) { return item.value === $scope.answerInput.value })) { + var answer = { value: $scope.answerInput.value, index: $scope.model.question.answers.length }; + + $scope.model.question.answers.push(answer); + $scope.answerInput = { value: '', hasError: false }; + } + } else { + $scope.answerInput.hasError = true; + } + }; + + $scope.updateAnswer = function (answer) { + if (!_.find($scope.model.question.answers, function (item) { return item.value === answer.value && item.id !== answer.id })) { + answer.hasError = false; + } else { + answer.hasError = true; + } + }; + + $scope.removeAnswer = function (answer, event) { + event.preventDefault(); + + $scope.model.question.answers = _.reject($scope.model.question.answers, function (x) { + return x.id === answer.id; + }); + }; +} + +angular.module("umbraco").controller("PollIt.ContentController", ContentController); \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.html b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.html new file mode 100644 index 0000000..47b8393 --- /dev/null +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/content/content.html @@ -0,0 +1,27 @@ +
    + +
    + + +
    +
    +
    + + + +
    +
    +
    + + + + + + + + +
    \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.controller.js new file mode 100644 index 0000000..a18cf7e --- /dev/null +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.controller.js @@ -0,0 +1,21 @@ +function ResponsesController($scope, $routeParams, $filter, pollItResource) { + + $scope.responses = []; + + if (!$routeParams.create) { + pollItResource.getQuestionResponsesById($routeParams.id).then(function (result) { + $scope.responses = result.data; + }); + } + + $scope.getResponsesPercentage = function (id) { + var amount = $filter('filter')($scope.responses, { answerId: id }).length; + return amount > 0 ? Math.round(amount / $scope.responses.length * 100) : 0; + }; + + $scope.getResponses = function (id) { + return $filter('filter')($scope.responses, { answerId: id }).length; + }; +} + +angular.module("umbraco").controller("PollIt.ResponsesController", ResponsesController); \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.html b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.html new file mode 100644 index 0000000..0a74520 --- /dev/null +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/poll/subviews/responses/responses.html @@ -0,0 +1,34 @@ +
    +
    + + + + + + + + + + + + + + + +
    + Answers + + Responses +
    + {{getResponsesPercentage(answer.id)}}% + + {{answer.value}} + + {{getResponses(answer.id)}} +
    +
    + + +

    Create answers

    +
    +
    \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/package.manifest b/Source/Qvision.Umbraco.PollIt/Client/package.manifest index 0d2cd79..a93f2b0 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/package.manifest +++ b/Source/Qvision.Umbraco.PollIt/Client/package.manifest @@ -17,6 +17,9 @@ '~/App_Plugins/pollit/backoffice/poll/delete.controller.js', '~/App_Plugins/pollit/backoffice/poll/edit.controller.js', + '~/App_Plugins/pollit/backoffice/poll/subviews/content/content.controller.js', + '~/App_Plugins/pollit/backoffice/poll/subviews/responses/responses.controller.js', + '~/App_Plugins/pollit/backoffice/propertyeditors/picker/picker.controller.js', '~/App_Plugins/pollit/backoffice/overlays/picker/picker.overlay.controller.js', diff --git a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/QuestionApiController.cs b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/QuestionApiController.cs index faa44ab..fcba44a 100644 --- a/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/QuestionApiController.cs +++ b/Source/Qvision.Umbraco.PollIt/Controllers/ApiControllers/QuestionApiController.cs @@ -1,5 +1,6 @@ namespace Qvision.Umbraco.PollIt.Controllers.ApiControllers { + using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; @@ -31,16 +32,42 @@ public HttpResponseMessage GetById(int id) [HttpPost] public HttpResponseMessage Post(Question question) { - var result = QuestionRepository.Current.Save(question); - - if (result != null) + using (var transaction = this.ApplicationContext.DatabaseContext.Database.GetTransaction()) { - PollItCacheRefresher.ClearCache(result.Id); - - return this.Request.CreateResponse(HttpStatusCode.OK, result); + // add or update question + question = QuestionRepository.Current.Save(question); + + if (question != null) + { + // remove old answers, they don't appear in the result.answers array + var oldAnswers = QuestionRepository.Current.GetAnswers(question.Id).Where(a => !question.Answers.Any(r => r.Id.Equals(a.Id))); + foreach (var deletedAnswer in oldAnswers) + { + if (!ResponseRepository.Current.DeleteByAnswerId(deletedAnswer.Id) && !AnswerRepository.Current.Delete(deletedAnswer.Id)) + { + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't delete old answers, Error add of update of the quesion"); + } + } + + // add or update answers + foreach (var answer in question.Answers) + { + var result = answer.Id != 0 ? AnswerRepository.Current.Save(answer) : QuestionRepository.Current.PostAnswer(question.Id, answer); + + if (result != null) + { + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't add answer to question"); + } + } + + transaction.Complete(); + PollItCacheRefresher.ClearCache(question.Id); + + return this.Request.CreateResponse(HttpStatusCode.OK, question); + } + + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't save question"); } - - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Can't save question"); } [HttpDelete] diff --git a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj index 7803575..8d5d900 100644 --- a/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj +++ b/Source/Qvision.Umbraco.PollIt/Qvision.Umbraco.PollIt.csproj @@ -311,6 +311,10 @@ + + + + From f2d9620f21f53f88803fd611a3cb16ef00918274 Mon Sep 17 00:00:00 2001 From: Jan van Helvoort Date: Wed, 4 Oct 2017 15:05:01 +0200 Subject: [PATCH 7/7] Some code clean-up --- .../dashboard/dashboard.controller.js | 2 +- .../picker/picker.overlay.controller.js | 32 +++++++++---------- .../picker/picker.controller.js | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/dashboard/dashboard.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/dashboard/dashboard.controller.js index b70f4ff..2f7028f 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/dashboard/dashboard.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/dashboard/dashboard.controller.js @@ -5,7 +5,7 @@ pollItResource.getOverview().then(function (result) { $scope.content.questions = result.data; $scope.page.isLoading = false; - });; + }); $scope.navigate = function (id) { var location = "/pollIt/poll/edit/" + id; diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js index 06981b8..6730723 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/overlays/picker/picker.overlay.controller.js @@ -1,24 +1,24 @@ function PickerOverlayController($scope, pollItResource) { - $scope.isLoading = true; - $scope.content = { questions: [], error: null } + $scope.isLoading = true; + $scope.content = { questions: [], error: null } - pollItResource.getQuestions().then(function (result) { - $scope.content.questions = result.data; - $scope.isLoading = false; - }, function (error) { - $scope.content.error = "An Error has occured while loading!"; - $scope.isLoading = false; - }); + pollItResource.getQuestions().then(function (result) { + $scope.content.questions = result.data; + $scope.isLoading = false; + }, function () { + $scope.content.error = "An Error has occured while loading!"; + $scope.isLoading = false; + }); - if (!$scope.model.selection) { - $scope.model.selection = []; - } + if (!$scope.model.selection) { + $scope.model.selection = []; + } - $scope.pickPoll = function (question) { - $scope.model.selection.push(question); - $scope.model.submit($scope.model); - } + $scope.pickPoll = function (question) { + $scope.model.selection.push(question); + $scope.model.submit($scope.model); + } } angular.module("umbraco").controller("PollIt.PickerOverlayController", PickerOverlayController); \ No newline at end of file diff --git a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js index 34a79d1..66f1bbe 100644 --- a/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js +++ b/Source/Qvision.Umbraco.PollIt/Client/backoffice/propertyEditors/picker/picker.controller.js @@ -1,4 +1,4 @@ -function PickerController($scope, pollItResource, localizationService) { +function PickerController($scope, localizationService, pollItResource) { $scope.content = { selection: null, error: null } if ($scope.model.value) {