diff --git a/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/AddStoryCommandHandler.cs b/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/AddStoryCommandHandler.cs index b5f42fb8..485f5906 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/AddStoryCommandHandler.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/AddStoryCommandHandler.cs @@ -43,8 +43,8 @@ public async Task Handle(AddStoryCommand command, CancellationTok command.MessageContext.LanguageId, command.Title); - foreach (var link in command.Links) - story.AddLink(link); + if(command.Links.Any()) + story.AddLink(command.Links.Single()); foreach (var teammate in command.Teammates) story.AddStoryForEstimate(new StoryForEstimate( diff --git a/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/Validators/AddStoryCommandValidator.cs b/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/Validators/AddStoryCommandValidator.cs index 93de0bd8..aeaf3a6d 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/Validators/AddStoryCommandValidator.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/CommandHandlers/AddStory/Validators/AddStoryCommandValidator.cs @@ -1,12 +1,16 @@ using FluentValidation; using Inc.TeamAssistant.Appraiser.Model.Commands.AddStory; +using Inc.TeamAssistant.Primitives.Languages; namespace Inc.TeamAssistant.Appraiser.Application.CommandHandlers.AddStory.Validators; internal sealed class AddStoryCommandValidator : AbstractValidator { - public AddStoryCommandValidator() + private readonly IMessageBuilder _messageBuilder; + public AddStoryCommandValidator(IMessageBuilder messageBuilder) { + _messageBuilder = messageBuilder ?? throw new ArgumentNullException(nameof(messageBuilder)); + RuleFor(e => e.TeamId) .NotEmpty(); @@ -18,10 +22,37 @@ public AddStoryCommandValidator() .Must(e => !e.StartsWith("/")) .WithMessage("'{PropertyName}' please enter text value."); - RuleForEach(e => e.Links) - .NotEmpty(); + RuleFor(e => e.Links) + .CustomAsync(CheckLinks); RuleFor(e => e.Teammates) .NotEmpty(); } + + private async Task CheckLinks( + IReadOnlyCollection links, + ValidationContext context, + CancellationToken token) + { + ArgumentNullException.ThrowIfNull(links); + ArgumentNullException.ThrowIfNull(context); + + if (links.Count > 1) + { + var errorMessage = await _messageBuilder.Build(Messages.Appraiser_MultipleLinkError, + context.InstanceToValidate.MessageContext.LanguageId); + context.AddFailure(nameof(AddStoryCommand.Links), errorMessage); + } + else + { + var link = links.FirstOrDefault(); + + if (!string.IsNullOrWhiteSpace(link) && link.Length > 2000) + { + var errorMessage = await _messageBuilder.Build(Messages.Appraiser_LinkLengthError, + context.InstanceToValidate.MessageContext.LanguageId); + context.AddFailure(nameof(AddStoryCommand.Links), errorMessage); + } + } + } } \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.Application/Converters/StoryConverter.cs b/src/Inc.TeamAssistant.Appraiser.Application/Converters/StoryConverter.cs index 88b9fe09..859307d2 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/Converters/StoryConverter.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/Converters/StoryConverter.cs @@ -28,11 +28,12 @@ public static StoryDto Convert(Story story) return new( story.Id, story.Title, - story.Links.ToArray(), items, story.EstimateEnded, story.CalculateMean().DisplayValue, story.CalculateMedian().DisplayValue, - story.AcceptedValue.DisplayValue); + story.AcceptedValue.DisplayValue, + story.RoundsCount, + story.Url); } } \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.Application/Converters/SummaryByStoryConverter.cs b/src/Inc.TeamAssistant.Appraiser.Application/Converters/SummaryByStoryConverter.cs index 581c7200..ccad8aa2 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/Converters/SummaryByStoryConverter.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/Converters/SummaryByStoryConverter.cs @@ -35,7 +35,6 @@ public static SummaryByStory ConvertTo(Story story) story.ExternalId, story.Title, story.StoryType.ToString(), - story.Links.ToArray(), story.EstimateEnded, story.CalculateMean().DisplayValue, story.CalculateMedian().DisplayValue, @@ -43,6 +42,8 @@ public static SummaryByStory ConvertTo(Story story) storyForEstimates, assessments, story.Accepted, - assessmentsToAccept); + assessmentsToAccept, + story.RoundsCount, + story.Url); } } \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.Application/Messages.cs b/src/Inc.TeamAssistant.Appraiser.Application/Messages.cs index a459f583..44e79269 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/Messages.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/Messages.cs @@ -15,4 +15,7 @@ internal static class Messages public static readonly MessageId Appraiser_Revote = new(nameof(Appraiser_Revote)); public static readonly MessageId Connector_TeamNotFound = new(nameof(Connector_TeamNotFound)); public static readonly MessageId Appraiser_MissingTaskForEvaluate = new(nameof(Appraiser_MissingTaskForEvaluate)); + public static readonly MessageId Appraiser_NumberOfRounds = new(nameof(Appraiser_NumberOfRounds)); + public static readonly MessageId Appraiser_MultipleLinkError = new(nameof(Appraiser_MultipleLinkError)); + public static readonly MessageId Appraiser_LinkLengthError = new(nameof(Appraiser_LinkLengthError)); } \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.Application/Services/SummaryByStoryBuilder.cs b/src/Inc.TeamAssistant.Appraiser.Application/Services/SummaryByStoryBuilder.cs index fe5650ff..0fbce6a4 100644 --- a/src/Inc.TeamAssistant.Appraiser.Application/Services/SummaryByStoryBuilder.cs +++ b/src/Inc.TeamAssistant.Appraiser.Application/Services/SummaryByStoryBuilder.cs @@ -39,6 +39,8 @@ public async Task Build(SummaryByStory summary) if (summary.Accepted) await AddAcceptedValue(builder, summary); + await AddRoundsInfo(builder, summary); + var notification = summary.StoryExternalId.HasValue ? NotificationMessage.Edit( new ChatMessage(summary.ChatId, summary.StoryExternalId.Value), @@ -68,10 +70,11 @@ private async Task AddBody(StringBuilder builder, SummaryByStory summary) summary.LanguageId); builder.AppendLine(storyHeader); + builder.AppendLine(summary.StoryTitle); - if (summary.StoryLinks.Any()) - foreach (var link in summary.StoryLinks) - builder.AppendLine(link); + + if (!string.IsNullOrWhiteSpace(summary.Url)) + builder.AppendLine(summary.Url); } private async Task AddEstimateSummary(StringBuilder builder, SummaryByStory summary) @@ -161,4 +164,14 @@ private string BuildLinkForDashboard(Guid teamId, LanguageId languageId) languageId.Value, teamId.ToString("N")); } + + private async Task AddRoundsInfo(StringBuilder builder, SummaryByStory summary) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(summary); + + builder.AppendLine(); + var roundsInfo = await _messageBuilder.Build(Messages.Appraiser_NumberOfRounds, summary.LanguageId); + builder.AppendLine($"{roundsInfo} {summary.RoundsCount}"); + } } \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.DataAccess/Internal/GetStoryQuery.cs b/src/Inc.TeamAssistant.Appraiser.DataAccess/Internal/GetStoryQuery.cs index 5470b5be..481de138 100644 --- a/src/Inc.TeamAssistant.Appraiser.DataAccess/Internal/GetStoryQuery.cs +++ b/src/Inc.TeamAssistant.Appraiser.DataAccess/Internal/GetStoryQuery.cs @@ -25,8 +25,9 @@ public static async Task> Get( s.language_id AS languageid, s.title AS title, s.external_id AS externalid, - s.links AS links, - s.total_value AS totalvalue + s.total_value AS totalvalue, + s.rounds_count AS roundscount, + s.url AS url FROM appraiser.stories AS s WHERE s.id = ANY(@story_ids); diff --git a/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryReader.cs b/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryReader.cs index b0151519..2b9e6237 100644 --- a/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryReader.cs +++ b/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryReader.cs @@ -33,8 +33,9 @@ public async Task> GetStories( s.language_id AS languageid, s.title AS title, s.external_id AS externalid, - s.links AS links, - s.total_value AS totalvalue + s.total_value AS totalvalue, + s.rounds_count AS roundscount, + s.url AS url FROM appraiser.stories AS s WHERE s.team_id = @team_id AND s.created <= @before AND (@from is null OR s.created >= @from);", new diff --git a/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryRepository.cs b/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryRepository.cs index d256b453..4bec3bb8 100644 --- a/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryRepository.cs +++ b/src/Inc.TeamAssistant.Appraiser.DataAccess/StoryRepository.cs @@ -47,10 +47,10 @@ public async Task Upsert(Story story, CancellationToken token) var upsertStory = new CommandDefinition(@" INSERT INTO appraiser.stories ( id, bot_id, story_type, created, team_id, chat_id, moderator_id, language_id, title, - external_id, links, total_value) + external_id, total_value, rounds_count, url) VALUES ( @id, @bot_id, @story_type, @created, @team_id, @chat_id, @moderator_id, @language_id, @title, - @external_id, @links::jsonb, @total_value) + @external_id, @total_value, @rounds_count, @url) ON CONFLICT (id) DO UPDATE SET bot_id = EXCLUDED.bot_id, story_type = EXCLUDED.story_type, @@ -61,8 +61,9 @@ ON CONFLICT (id) DO UPDATE SET language_id = EXCLUDED.language_id, title = EXCLUDED.title, external_id = EXCLUDED.external_id, - links = EXCLUDED.links, - total_value = EXCLUDED.total_value;", + total_value = EXCLUDED.total_value, + rounds_count = EXCLUDED.rounds_count, + url = EXCLUDED.url;", new { id = story.Id, @@ -75,8 +76,9 @@ ON CONFLICT (id) DO UPDATE SET language_id = story.LanguageId.Value, title = story.Title, external_id = story.ExternalId, - links = JsonSerializer.Serialize(story.Links), - total_value = story.TotalValue + total_value = story.TotalValue, + rounds_count = story.RoundsCount, + url = story.Url }, flags: CommandFlags.None, cancellationToken: token); diff --git a/src/Inc.TeamAssistant.Appraiser.Domain/Story.cs b/src/Inc.TeamAssistant.Appraiser.Domain/Story.cs index fabce6ae..751a3828 100644 --- a/src/Inc.TeamAssistant.Appraiser.Domain/Story.cs +++ b/src/Inc.TeamAssistant.Appraiser.Domain/Story.cs @@ -17,18 +17,17 @@ public sealed class Story public int? ExternalId { get; private set; } public bool Accepted => TotalValue.HasValue; public int? TotalValue { get; private set; } + public int RoundsCount { get; private set; } + public string? Url { get; private set; } private readonly List _storyForEstimates; public IReadOnlyCollection StoryForEstimates => _storyForEstimates; - public ICollection Links { get; private set; } - private IEstimationStrategy EstimationStrategy => EstimationStrategyFactory.Create(StoryType); private Story() { _storyForEstimates = new(); - Links = new List(); } public Story( @@ -53,7 +52,8 @@ public Story( LanguageId = languageId ?? throw new ArgumentNullException(nameof(languageId)); TeamId = teamId; Title = title; - } + RoundsCount = 1; + } public void SetExternalId(int storyExternalId) => ExternalId = storyExternalId; @@ -77,8 +77,8 @@ public void AddStoryForEstimate(StoryForEstimate storyForEstimate) public void AddLink(string link) { ArgumentException.ThrowIfNullOrWhiteSpace(link); - - Links.Add(link); + + Url = link; } public void Reset(long participantId, bool hasManagerAccess) @@ -91,6 +91,8 @@ public void Reset(long participantId, bool hasManagerAccess) foreach (var storyForEstimate in _storyForEstimates) storyForEstimate.Reset(); + + RoundsCount++; } public void Finish(long participantId, bool hasManagerAccess) diff --git a/src/Inc.TeamAssistant.Appraiser.Model/Common/StoryDto.cs b/src/Inc.TeamAssistant.Appraiser.Model/Common/StoryDto.cs index 783dbcc3..196ae1ca 100644 --- a/src/Inc.TeamAssistant.Appraiser.Model/Common/StoryDto.cs +++ b/src/Inc.TeamAssistant.Appraiser.Model/Common/StoryDto.cs @@ -3,9 +3,10 @@ namespace Inc.TeamAssistant.Appraiser.Model.Common; public sealed record StoryDto( Guid Id, string Title, - IReadOnlyCollection Links, IReadOnlyCollection StoryForEstimates, bool EstimateEnded, string Mean, string Median, - string AcceptedValue); \ No newline at end of file + string AcceptedValue, + int RoundsCount, + string? Url); \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Appraiser.Model/Common/SummaryByStory.cs b/src/Inc.TeamAssistant.Appraiser.Model/Common/SummaryByStory.cs index 7d6f1caf..c020d9f4 100644 --- a/src/Inc.TeamAssistant.Appraiser.Model/Common/SummaryByStory.cs +++ b/src/Inc.TeamAssistant.Appraiser.Model/Common/SummaryByStory.cs @@ -10,7 +10,6 @@ public sealed record SummaryByStory( int? StoryExternalId, string StoryTitle, string StoryType, - IReadOnlyCollection StoryLinks, bool EstimateEnded, string Mean, string Median, @@ -18,4 +17,6 @@ public sealed record SummaryByStory( IReadOnlyCollection Items, IReadOnlyCollection Assessments, bool Accepted, - IReadOnlyCollection AssessmentsToAccept); \ No newline at end of file + IReadOnlyCollection AssessmentsToAccept, + int RoundsCount, + string? Url); \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Gateway/wwwroot/langs/en.json b/src/Inc.TeamAssistant.Gateway/wwwroot/langs/en.json index 27c79aea..2e1d01ce 100644 --- a/src/Inc.TeamAssistant.Gateway/wwwroot/langs/en.json +++ b/src/Inc.TeamAssistant.Gateway/wwwroot/langs/en.json @@ -40,6 +40,9 @@ "Appraiser_PowerOfTwo_16SP": "16", "Appraiser_PowerOfTwo_32SP": "32", "Appraiser_PowerOfTwo_64SP": "64", + "Appraiser_NumberOfRounds": "Number of evaluation rounds", + "Appraiser_MultipleLinkError": "Description must contain one link", + "Appraiser_LinkLengthError": "Link length must be less than 2000 symbols", "CheckIn_GetStarted": "To get started, please add the bot to your chat room", "CheckIn_ConnectLinkText": "Use {0} to see our locations", diff --git a/src/Inc.TeamAssistant.Gateway/wwwroot/langs/ru.json b/src/Inc.TeamAssistant.Gateway/wwwroot/langs/ru.json index efd58027..209aad7f 100644 --- a/src/Inc.TeamAssistant.Gateway/wwwroot/langs/ru.json +++ b/src/Inc.TeamAssistant.Gateway/wwwroot/langs/ru.json @@ -40,6 +40,9 @@ "Appraiser_PowerOfTwo_16SP": "16", "Appraiser_PowerOfTwo_32SP": "32", "Appraiser_PowerOfTwo_64SP": "64", + "Appraiser_NumberOfRounds": "Количество раундов оценки", + "Appraiser_MultipleLinkError": "Описание должно содержать одну ссылку", + "Appraiser_LinkLengthError": "Длина ссылки не должна превышать 2000 символов", "CheckIn_GetStarted": "Добавьте бота в чат для начала работы", "CheckIn_ConnectLinkText": "Перейдите по ссылке {0} чтобы увидеть наши локации", diff --git a/src/Inc.TeamAssistant.Migrations/2024_11_07_0_AddRoundsCount.cs b/src/Inc.TeamAssistant.Migrations/2024_11_07_0_AddRoundsCount.cs new file mode 100644 index 00000000..7e13dc99 --- /dev/null +++ b/src/Inc.TeamAssistant.Migrations/2024_11_07_0_AddRoundsCount.cs @@ -0,0 +1,27 @@ +using FluentMigrator; + +namespace Inc.TeamAssistant.Migrations; + +[Migration(2024_11_07_0)] + +public sealed class AddRoundsCount : Migration +{ + public override void Up() + { + Create + .Column("rounds_count") + .OnTable("stories") + .InSchema("appraiser") + .AsInt32() + .NotNullable() + .SetExistingRowsTo(1); + } + + public override void Down() + { + Delete + .Column("rounds_count") + .FromTable("stories") + .InSchema("appraiser"); + } +} \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Migrations/2024_11_25_0_AddUrl.cs b/src/Inc.TeamAssistant.Migrations/2024_11_25_0_AddUrl.cs new file mode 100644 index 00000000..9f95efc4 --- /dev/null +++ b/src/Inc.TeamAssistant.Migrations/2024_11_25_0_AddUrl.cs @@ -0,0 +1,64 @@ +using FluentMigrator; + +namespace Inc.TeamAssistant.Migrations; + +[Migration(2024_11_25_0)] + +public sealed class AddUrl : Migration +{ + public override void Up() + { + Create + .Column("url") + .OnTable("stories") + .InSchema("appraiser") + .AsString(2000) + .Nullable(); + + Execute.Sql( + """ + UPDATE appraiser.stories + SET url = links->>0; + """, + "Add single url to story"); + + Delete + .Column("links") + .FromTable("stories") + .InSchema("appraiser"); + } + + public override void Down() + { + Create + .Column("links") + .OnTable("stories") + .InSchema("appraiser") + .AsCustom("jsonb") + .Nullable(); + + Execute.Sql( + """ + UPDATE appraiser.stories as s + SET links = + CASE + WHEN s.url IS NULL + THEN '[]'::JSONB + ELSE to_jsonb(ARRAY[s.url]) + END; + """, + "Move url to links"); + + Alter + .Column("links") + .OnTable("stories") + .InSchema("appraiser") + .AsCustom("jsonb") + .NotNullable(); + + Delete + .Column("url") + .FromTable("stories") + .InSchema("appraiser"); + } +} \ No newline at end of file diff --git a/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSession.stories.razor b/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSession.stories.razor index 79e7894a..a32660c8 100644 --- a/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSession.stories.razor +++ b/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSession.stories.razor @@ -79,7 +79,6 @@ new StoryDto( Id: Guid.NewGuid(), Title: "Create order from user card", - Links: ["https://amazon.com", "https://ozon.ru"], StoryForEstimates: [ new StoryForEstimateDto( ParticipantId: 0, @@ -103,7 +102,9 @@ EstimateEnded: true, Mean: "9.6", Median: "8", - AcceptedValue: string.Empty)); + AcceptedValue: string.Empty, + RoundsCount: 1, + Url: "https://ozon.ru")); private void OnViewChanged(AssessmentType view) { diff --git a/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSessionHistory.stories.razor b/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSessionHistory.stories.razor index 06047164..f0d435a1 100644 --- a/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSessionHistory.stories.razor +++ b/src/Inc.TeamAssistant.Stories/Features/AssessmentSession/AssessmentSessionHistory.stories.razor @@ -50,7 +50,6 @@ new( Id: Guid.NewGuid(), Title: "Create order from user card", - Links: ["https://amazon.com", "https://ozon.ru"], StoryForEstimates: [ new StoryForEstimateDto( @@ -75,11 +74,12 @@ EstimateEnded: true, Mean: "9.6", Median: "8", - AcceptedValue: "8"), + AcceptedValue: "8", + RoundsCount: 1, + Url: "https://ozon.ru"), new( Id: Guid.NewGuid(), Title: "Create order from user card", - Links: ["https://amazon.com", "https://ozon.ru"], StoryForEstimates: [ new StoryForEstimateDto( @@ -104,11 +104,12 @@ EstimateEnded: true, Mean: "9.6", Median: "8", - AcceptedValue: "8"), + AcceptedValue: "8", + RoundsCount: 1, + Url: "https://ozon.ru"), new( Id: Guid.NewGuid(), Title: "Create order from user card", - Links: ["https://amazon.com", "https://ozon.ru"], StoryForEstimates: [ new StoryForEstimateDto( @@ -133,7 +134,9 @@ EstimateEnded: true, Mean: "9.6", Median: "8", - AcceptedValue: "8") + AcceptedValue: "8", + RoundsCount: 1, + Url: "https://ozon.ru") ]; private void OnViewChanged(AssessmentType view) diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.Designer.cs b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.Designer.cs index 04bf17c9..92fe7431 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.Designer.cs +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.Designer.cs @@ -57,6 +57,12 @@ internal static string MedianRating { } } + internal static string RoundsCount { + get { + return ResourceManager.GetString("RoundsCount", resourceCulture); + } + } + internal static string AcceptedValue { get { return ResourceManager.GetString("AcceptedValue", resourceCulture); diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.resx b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.resx index 5ba2102a..beeed07a 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.resx +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.resx @@ -24,6 +24,9 @@ median + + round + accepted diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.Designer.cs b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.Designer.cs index f6e39eb9..064d9318 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.Designer.cs +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.Designer.cs @@ -57,6 +57,12 @@ internal static string MedianRating { } } + internal static string RoundsCount { + get { + return ResourceManager.GetString("RoundsCount", resourceCulture); + } + } + internal static string AcceptedValue { get { return ResourceManager.GetString("AcceptedValue", resourceCulture); diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.resx b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.resx index 332b5f13..bd8f8e43 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.resx +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/AssessmentSessionResources.ru.resx @@ -24,6 +24,9 @@ медиана + + раунд + принята diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryDetails.razor b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryDetails.razor index 0bb92f5e..8220e6ca 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryDetails.razor +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryDetails.razor @@ -1,15 +1,13 @@
-

@Story.Title

- @if (Story.Links.Any()) + @if (String.IsNullOrWhiteSpace(Story.Url)) { -
    - @foreach (var link in Story.Links) - { -
  • - @link -
  • - } -
+

@Story.Title

+ } + else + { +

+ @Story.Title +

}
diff --git a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryTotal.razor b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryTotal.razor index 6273602c..807e4e68 100644 --- a/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryTotal.razor +++ b/src/Inc.TeamAssistant.WebUI/Features/AssessmentSession/StoryTotal.razor @@ -17,6 +17,10 @@ @Localizer["AcceptedValue"] } + + @Story.RoundsCount + @Localizer["RoundsCount"] +