// Handles conversation cleanup. private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var state = await _stateAccessor.GetAsync(stepContext.Context, () => new ToDoSkillState(), cancellationToken); if (stepContext.Context.IsSkill()) { var result = stepContext.Result; if (state.IsAction && result == null) { result = new TodoListInfo() { ActionSuccess = false }; } state.Clear(); return(await stepContext.EndDialogAsync(result, cancellationToken)); } else { state.Clear(); return(await stepContext.ReplaceDialogAsync(InitialDialogId, _templateManager.GenerateActivityForLocale(ToDoMainResponses.CompletedMessage), cancellationToken)); } }
public void InitCell(TodoListInfo todoListInfo) { description.text = todoListInfo.description; if (AchievementManager.Instance.achievementDictionary[todoListInfo.finishAchievement].state == AchievementState.complete) { if (todoListInfo.parentList.Length != 0) { checkIcon.SetActive(true); } description.color = new Color(0, 1, 0); } else { checkIcon.SetActive(false); description.color = new Color(1, 1, 0); } if (todoListInfo.parentList.Length != 0) { //todo: does not support multi level nesting description.rectTransform.offsetMin = new Vector2(40, 0); } }
protected async Task <DialogTurnResult> MarkTaskCompletedAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await ToDoStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken); state.LastListType = state.ListType; var service = await InitListTypeIdsAsync(sc, cancellationToken); string taskTopicToBeMarked = null; if (state.MarkOrDeleteAllTasksFlag) { await service.MarkTasksCompletedAsync(state.ListType, state.AllTasks); state.AllTasks.ForEach(task => task.IsCompleted = true); state.ShowTaskPageIndex = 0; } else { taskTopicToBeMarked = state.AllTasks[state.TaskIndexes[0]].Topic; var tasksToBeMarked = new List <TaskItem>(); state.TaskIndexes.ForEach(i => tasksToBeMarked.Add(state.AllTasks[i])); await service.MarkTasksCompletedAsync(state.ListType, tasksToBeMarked); state.TaskIndexes.ForEach(i => state.AllTasks[i].IsCompleted = true); state.ShowTaskPageIndex = state.TaskIndexes[0] / state.PageSize; } if (state.MarkOrDeleteAllTasksFlag) { if (state.IsAction) { var actionResult = new TodoListInfo() { ActionSuccess = true }; return(await sc.EndDialogAsync(actionResult, cancellationToken)); } var markToDoCard = ToAdaptiveCardForTaskCompletedFlowByLG( sc.Context, state.Tasks, state.AllTasks.Count, taskTopicToBeMarked, state.ListType, state.MarkOrDeleteAllTasksFlag); await sc.Context.SendActivityAsync(markToDoCard.Speak, speak : markToDoCard.Speak, cancellationToken : cancellationToken); } else { if (state.IsAction) { var todoList = new List <string>(); var uncompletedTasks = state.AllTasks.Where(t => t.IsCompleted == false).ToList(); if (uncompletedTasks != null && uncompletedTasks.Any()) { uncompletedTasks.ForEach(x => todoList.Add(x.Topic)); } return(await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList }, cancellationToken)); } var completedTaskIndex = state.AllTasks.FindIndex(t => t.IsCompleted == true); var taskContent = state.AllTasks[completedTaskIndex].Topic; var markToDoCard = ToAdaptiveCardForTaskCompletedFlowByLG( sc.Context, state.Tasks, state.AllTasks.Count, taskContent, state.ListType, state.MarkOrDeleteAllTasksFlag); await sc.Context.SendActivityAsync(markToDoCard.Speak, speak : markToDoCard.Speak, cancellationToken : cancellationToken); int uncompletedTaskCount = state.AllTasks.Where(t => t.IsCompleted == false).Count(); if (uncompletedTaskCount == 1) { var activity = TemplateManager.GenerateActivityForLocale(MarkToDoResponses.AfterCompleteCardSummaryMessageForSingleTask, new { ListType = state.ListType }); await sc.Context.SendActivityAsync(activity, cancellationToken); } else { var activity = TemplateManager.GenerateActivityForLocale(MarkToDoResponses.AfterCompleteCardSummaryMessageForMultipleTasks, new { AllTasksCount = uncompletedTaskCount.ToString(), ListType = state.ListType }); await sc.Context.SendActivityAsync(activity, cancellationToken); } } return(await sc.EndDialogAsync(true, cancellationToken)); } catch (SkillException ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }
protected async Task <DialogTurnResult> DeleteTaskAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken)) { try { var state = await ToDoStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken); state.LastListType = state.ListType; bool canDeleteAnotherTask = false; var cardReply = sc.Context.Activity.CreateReply(); if (!state.MarkOrDeleteAllTasksFlag) { var service = await InitListTypeIdsAsync(sc, cancellationToken); var taskTopicToBeDeleted = state.AllTasks[state.TaskIndexes[0]].Topic; var tasksToBeDeleted = new List <TaskItem>(); state.TaskIndexes.ForEach(i => tasksToBeDeleted.Add(state.AllTasks[i])); await service.DeleteTasksAsync(state.ListType, tasksToBeDeleted); state.AllTasks = await service.GetTasksAsync(state.ListType); var allTasksCount = state.AllTasks.Count; var currentTaskIndex = state.ShowTaskPageIndex * state.PageSize; while (currentTaskIndex >= allTasksCount && currentTaskIndex >= state.PageSize) { currentTaskIndex -= state.PageSize; state.ShowTaskPageIndex--; } state.Tasks = state.AllTasks.GetRange(currentTaskIndex, Math.Min(state.PageSize, allTasksCount - currentTaskIndex)); cardReply = ToAdaptiveCardForTaskDeletedFlowByLG( sc.Context, state.Tasks, state.AllTasks.Count, taskTopicToBeDeleted, state.ListType, false); canDeleteAnotherTask = state.AllTasks.Count > 0 ? true : false; if (state.IsAction) { var todoList = new List <string>(); if (state.AllTasks != null && state.AllTasks.Any()) { state.AllTasks.ForEach(x => todoList.Add(x.Topic)); } return(await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList })); } } else { if (state.DeleteTaskConfirmation) { var service = await InitListTypeIdsAsync(sc, cancellationToken); await service.DeleteTasksAsync(state.ListType, state.AllTasks); state.AllTasks = new List <TaskItem>(); state.Tasks = new List <TaskItem>(); state.ShowTaskPageIndex = 0; state.TaskIndexes = new List <int>(); cardReply = ToAdaptiveCardForTaskDeletedFlowByLG( sc.Context, state.Tasks, state.AllTasks.Count, string.Empty, state.ListType, true); if (state.IsAction) { var actionResult = new TodoListInfo() { ActionSuccess = true }; return(await sc.EndDialogAsync(actionResult, cancellationToken)); } } else { cardReply = ToAdaptiveCardForDeletionRefusedFlowByLG( sc.Context, state.Tasks, state.AllTasks.Count, state.ListType); } } if (canDeleteAnotherTask) { cardReply.InputHint = InputHints.IgnoringInput; await sc.Context.SendActivityAsync(cardReply, cancellationToken); return(await sc.NextAsync(cancellationToken : cancellationToken)); } else { cardReply.InputHint = InputHints.AcceptingInput; await sc.Context.SendActivityAsync(cardReply, cancellationToken); return(await sc.EndDialogAsync(true, cancellationToken)); } } catch (SkillException ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } catch (Exception ex) { await HandleDialogExceptionsAsync(sc, ex, cancellationToken); return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs)); } }