diff --git a/Examples/Projects/Project/Project.yaml b/Examples/Projects/Project/Project.yaml index 8bc892c..3fb5347 100644 --- a/Examples/Projects/Project/Project.yaml +++ b/Examples/Projects/Project/Project.yaml @@ -1,5 +1,6 @@ name: Project titlePlural: Projects +instanceTitle: '{{ Title }}' headerFields: - property: Title diff --git a/UvA.Workflow.Api/Submissions/Dtos/SubmissionDto.cs b/UvA.Workflow.Api/Submissions/Dtos/SubmissionDto.cs index e11deaa..afe2e31 100644 --- a/UvA.Workflow.Api/Submissions/Dtos/SubmissionDto.cs +++ b/UvA.Workflow.Api/Submissions/Dtos/SubmissionDto.cs @@ -125,7 +125,8 @@ public record SubmissionDto( string InstanceId, Answer[] Answers, DateTime? DateSubmitted, - FormDto Form) + FormDto Form, + RoleAction[] Permissions) { public static SubmissionDto FromEntity(WorkflowInstance inst, Form form, @@ -138,7 +139,8 @@ public static SubmissionDto FromEntity(WorkflowInstance inst, inst.Id, shownQuestionIds == null ? [] : Answer.Create(inst, form, shownQuestionIds, fileService), sub?.Date, - FormDto.Create(form) + FormDto.Create(form), + [] // TODO: set permissions ); } diff --git a/UvA.Workflow.Api/WorkflowInstances/Dtos/WorkflowInstanceDto.cs b/UvA.Workflow.Api/WorkflowInstances/Dtos/WorkflowInstanceDto.cs index 3b4c1bd..4f87da6 100644 --- a/UvA.Workflow.Api/WorkflowInstances/Dtos/WorkflowInstanceDto.cs +++ b/UvA.Workflow.Api/WorkflowInstances/Dtos/WorkflowInstanceDto.cs @@ -12,10 +12,9 @@ public record WorkflowInstanceBasicDto( public record WorkflowInstanceDto( string Id, + string? Title, EntityTypeDto EntityType, string? CurrentStep, - Dictionary Properties, - Dictionary Events, string? ParentId, ActionDto[] Actions, FieldDto[] Fields, @@ -26,7 +25,17 @@ RoleAction[] Permissions public record FieldDto(); -public record StepDto(); +public record StepDto(string Id, BilingualString Title, string? Event, DateTime? DateCompleted, StepDto[]? Children) +{ + public static StepDto Create(Step step, WorkflowInstance instance) + => new( + step.Name, + step.DisplayTitle, + step.EndEvent, + step.GetEndDate(instance), + step.Children.Length != 0 ? step.Children.Select(s => Create(s, instance)).ToArray() : null + ); +} public record ActionDto( ActionType Type, diff --git a/UvA.Workflow.Api/WorkflowInstances/WorkflowInstanceDtoService.cs b/UvA.Workflow.Api/WorkflowInstances/WorkflowInstanceDtoService.cs index f7a0d07..b8034ca 100644 --- a/UvA.Workflow.Api/WorkflowInstances/WorkflowInstanceDtoService.cs +++ b/UvA.Workflow.Api/WorkflowInstances/WorkflowInstanceDtoService.cs @@ -1,9 +1,11 @@ using UvA.Workflow.Api.EntityTypes.Dtos; +using UvA.Workflow.Api.Submissions.Dtos; using UvA.Workflow.Api.WorkflowInstances.Dtos; namespace UvA.Workflow.Api.WorkflowInstances; -public class WorkflowInstanceDtoService(InstanceService instanceService, ModelService modelService) +public class WorkflowInstanceDtoService(InstanceService instanceService, ModelService modelService, + FileService fileService) { /// /// Creates a WorkflowInstanceDto from a WorkflowInstance domain entity @@ -11,21 +13,21 @@ public class WorkflowInstanceDtoService(InstanceService instanceService, ModelSe public async Task Create(WorkflowInstance instance, CancellationToken ct) { var actions = await instanceService.GetAllowedActions(instance, ct); + var submissions = await instanceService.GetAllowedSubmissions(instance, ct); + var entityType = modelService.EntityTypes[instance.EntityType]; return new WorkflowInstanceDto( instance.Id, + entityType.InstanceTitleTemplate?.Apply(modelService.CreateContext(instance)), EntityTypeDto.Create(modelService.EntityTypes[instance.EntityType]), instance.CurrentStep, - instance.Properties.ToDictionary(k => k.Key, v => BsonTypeMapper.MapToDotNetValue(v.Value)), - instance.Events.ToDictionary( - kvp => kvp.Key, - kvp => InstanceEventDto.Create(kvp.Value) - ), instance.ParentId, actions.Select(ActionDto.Create).ToArray(), [], - [], - [], + entityType.Steps.Select(s => StepDto.Create(s, instance)).ToArray(), + submissions + .Select(s => SubmissionDto.FromEntity(instance, s.Form, s.Event, s.QuestionStatus, fileService)) + .ToArray(), [] ); } diff --git a/UvA.Workflow/WorkflowInstances/InstanceService.cs b/UvA.Workflow/WorkflowInstances/InstanceService.cs index 2f07df7..c624479 100644 --- a/UvA.Workflow/WorkflowInstances/InstanceService.cs +++ b/UvA.Workflow/WorkflowInstances/InstanceService.cs @@ -111,4 +111,24 @@ public async Task> GetAllowedActions(WorkflowInstance return actions; } + + public record AllowedSubmission(InstanceEvent Event, Form Form, Dictionary QuestionStatus); + + public async Task> GetAllowedSubmissions(WorkflowInstance instance, CancellationToken ct) + { + var allowed = await rightsService.GetAllowedActions(instance, RoleAction.View); + var allowedHidden = await rightsService.GetAllowedActions(instance, RoleAction.ViewHidden); + + var forms = allowed.SelectMany(a => a.AllForms).Distinct() + .ToDictionary(f => f, f => modelService.GetForm(instance, f)); + var hiddenForms = allowedHidden.SelectMany(a => a.AllForms).Distinct().ToList(); + + var subs = instance.Events + .Select(e => e.Value) + .Where(s => forms.ContainsKey(s.Id)) + .OrderBy(s => s.Date) + .ToList(); + return subs.Select(s => new AllowedSubmission(s, forms[s.Id], + modelService.GetQuestionStatus(instance, forms[s.Id], hiddenForms.Contains(s.Id)))); + } } \ No newline at end of file