Skip to content

Commit 428be60

Browse files
authored
Обновления распечатки для игры Киев: Быль и не быль (#3055)
* Показывать кнопку публикации без прав (но выключенную) * Поправить сломанное добавление элементов раздатки * Всегда показывать отв. мастера * Поправить задержку регистрации * контейнер должен сохранять порядок, если его получил * Сюжеты группируются по папкам, если не задана сортировка * Новое форматирование загрузов
1 parent 66763b2 commit 428be60

File tree

12 files changed

+231
-99
lines changed

12 files changed

+231
-99
lines changed

src/JoinRpg.Domain/OrderingExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static IReadOnlyList<PlotElement> GetOrderedPlots(this Character characte
2020
=> character.GetCharacterPlotContainer(elements).OrderedItems;
2121

2222
public static VirtualOrderContainer<PlotElement> GetCharacterPlotContainer(this Character character,
23-
IReadOnlyCollection<PlotElement> plots) => VirtualOrderContainerFacade.Create(plots, character.PlotElementOrderData);
23+
IReadOnlyCollection<PlotElement> plots) => VirtualOrderContainerFacade.Create(plots.OrderBy(pe => pe.PlotFolderId), character.PlotElementOrderData);
2424

2525
public static IReadOnlyList<ProjectFieldDropdownValue> GetOrderedValues(this ProjectField field)
2626
=> field.GetFieldValuesContainer().OrderedItems;

src/JoinRpg.Helpers/VirtualOrderContainer.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,42 @@ public interface IOrderableEntity
88
public static class VirtualOrderContainerFacade
99
{
1010
//Factory function enable type inference
11-
public static VirtualOrderContainer<TChild> Create<TChild>(IEnumerable<TChild> childs,
12-
string ordering) where TChild : class, IOrderableEntity => new(ordering, childs);
11+
public static VirtualOrderContainer<TChild>
12+
Create<TChild>(IEnumerable<TChild> childs, string ordering)
13+
where TChild : class, IOrderableEntity
14+
=> new(ordering, childs);
15+
16+
public static VirtualOrderContainer<TChild>
17+
Create<TChild>(IOrderedEnumerable<TChild> childs, string ordering)
18+
where TChild : class, IOrderableEntity
19+
=> new(ordering, childs);
1320

1421
public static Lazy<VirtualOrderContainer<TChild>>
1522
CreateLazy<TChild>(IEnumerable<TChild> childs, string ordering)
1623
where TChild : class, IOrderableEntity
1724
=> new(() => new(ordering, childs));
1825

26+
public static Lazy<VirtualOrderContainer<TChild>>
27+
CreateLazy<TChild>(IOrderedEnumerable<TChild> childs, string ordering)
28+
where TChild : class, IOrderableEntity
29+
=> new(() => new(ordering, childs));
30+
1931
}
2032

2133
public class VirtualOrderContainer<TItem> where TItem : class, IOrderableEntity
2234
{
2335
private const char Separator = ',';
2436

2537

26-
private List<TItem> Items { get; } = new List<TItem>();
38+
private List<TItem> Items { get; } = [];
2739

28-
29-
public VirtualOrderContainer(
30-
string? storedOrder,
31-
IEnumerable<TItem> entites)
40+
public VirtualOrderContainer(string? storedOrder, IOrderedEnumerable<TItem> entities)
3241
{
3342
storedOrder ??= "";
3443

35-
ArgumentNullException.ThrowIfNull(entites);
44+
ArgumentNullException.ThrowIfNull(entities);
3645

37-
var list = entites.ToList(); // Copy
46+
var list = entities.ToList(); // Copy
3847

3948
foreach (var virtualOrderItem in storedOrder.AsSpan().ParseToIntList())
4049
{
@@ -45,7 +54,15 @@ public VirtualOrderContainer(
4554
}
4655
}
4756

48-
Items.AddRange(list.OrderBy(li => li.Id));
57+
Items.AddRange(list);
58+
}
59+
60+
61+
public VirtualOrderContainer(
62+
string? storedOrder,
63+
IEnumerable<TItem> entities) : this(storedOrder, entities.OrderBy(li => li.Id))
64+
{
65+
4966
}
5067

5168
private static TItem? FindItem(List<TItem> list, int virtualOrderItem)

src/JoinRpg.Portal/Views/Plot/CreateHandout.cshtml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
1+
@using JoinRpg.PrimitiveTypes
2+
23
@model JoinRpg.Web.Models.Plot.AddPlotHandoutViewModel
34

45
@{
@@ -27,6 +28,18 @@
2728
</div>
2829
</div>
2930

31+
<div class="form-group">
32+
@Html.LabelFor(model => model.PlotFolderId, htmlAttributes: new { @class = "control-label col-md-2" })
33+
<div class="col-md-10">
34+
<component type="typeof(JoinRpg.Web.Plots.PlotFolderSelector)"
35+
param-Name="nameof(Model.PlotFolderId)"
36+
param-ProjectId="@(new ProjectIdentification(Model.ProjectId))"
37+
param-SelectedId="@Model.PlotFolderId"
38+
render-mode="Static" />
39+
@Html.DescriptionFor(model => model.PlotFolderId)
40+
</div>
41+
</div>
42+
3043
<div class="form-group">
3144
@Html.LabelFor(model => model.Content, htmlAttributes: new { @class = "control-label col-md-2" })
3245
<div class="col-md-10">

src/JoinRpg.Portal/Views/Plot/EditElementPartial.cshtml

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,26 +122,39 @@
122122
Изменить
123123
</a>
124124

125-
if ((Model.CurrentVersion > Model.PublishedVersion || Model.PublishedVersion == null) && Model.HasEditAccess)
125+
if ((Model.CurrentVersion > Model.PublishedVersion || Model.PublishedVersion == null))
126126
{
127-
if (string.IsNullOrWhiteSpace(Model.TodoField) && Model.TargetsForDisplay.Any())
127+
if (Model.HasEditAccess)
128128
{
129-
<button type="button"
130-
class="btn btn-success btn-sm"
131-
data-toggle="modal"
132-
data-target="#publishElementModal"
133-
data-element="@Model.PlotElementId"
134-
data-version="@Model.CurrentVersion">
135-
<span class="glyphicon glyphicon-share-alt"></span>
136-
Опубликовать
137-
</button>
129+
if (string.IsNullOrWhiteSpace(Model.TodoField) && Model.TargetsForDisplay.Any())
130+
{
131+
<button type="button"
132+
class="btn btn-success btn-sm"
133+
data-toggle="modal"
134+
data-target="#publishElementModal"
135+
data-element="@Model.PlotElementId"
136+
data-version="@Model.CurrentVersion">
137+
<span class="glyphicon glyphicon-share-alt"></span>
138+
Опубликовать
139+
</button>
140+
}
141+
else
142+
{
143+
<button type="button"
144+
class="btn btn-success btn-sm disabled"
145+
disabled="disabled"
146+
title="Невозможно опубликовать вводную. Убедитесь что: Все TODO закрыты и поле очищено; вводная привязана к чему-то.">
147+
<span class="glyphicon glyphicon-share-alt"></span>
148+
Опубликовать
149+
</button>
150+
}
138151
}
139152
else
140153
{
141154
<button type="button"
142155
class="btn btn-success btn-sm disabled"
143156
disabled="disabled"
144-
title="Невозможно опубликовать вводную. Убедитесь что: Все TODO закрыты и поле очищено; вводная привязана к чему-то.">
157+
title="У вас должны быть права редактора сюжетов для этого">
145158
<span class="glyphicon glyphicon-share-alt"></span>
146159
Опубликовать
147160
</button>

src/JoinRpg.Portal/Views/Print/Character.cshtml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@
99
<html>
1010
<head>
1111
<title>@Model.ProjectName: @Model.CharacterName</title>
12-
<link href="~/Content/Print.css" rel="stylesheet" />
12+
<link href="~/css/print.css" rel="stylesheet" />
1313
<link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700,700i&amp;subset=cyrillic" rel="stylesheet" />
1414
</head>
1515
<body>
1616
<div>
1717
@await Html.PartialAsync("CharacterListHeader", Model)
18-
@await Html.PartialAsync("_CharacterHandout", Model.Handouts)
1918
@await Html.PartialAsync("PrintCharacter", Model)
2019
</div>
2120
</body>
22-
</html>
21+
</html>

src/JoinRpg.Portal/Views/Print/CharacterList.cshtml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99
<html>
1010
<head>
1111
<title>@Model.First().ProjectName</title>
12-
<link href="~/Content/Print.css" rel="stylesheet" />
12+
<link href="~/css/print.css" rel="stylesheet" />
1313
<link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700,700i&amp;subset=cyrillic" rel="stylesheet" />
1414
</head>
1515
<body>
16-
1716
@foreach (var item in Model)
1817
{
19-
2018
@await Html.PartialAsync("CharacterListHeader", item)
21-
@await Html.PartialAsync("_CharacterHandout", item.Handouts)
2219
@await Html.PartialAsync("PrintCharacter", item)
2320
}
2421

2522
</body>
26-
</html>
23+
</html>

src/JoinRpg.Portal/Views/Print/CharacterListHeader.cshtml

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,30 @@
22
@using JoinRpg.Web.Models.Plot
33
@using JoinRpg.Helpers
44
@model JoinRpg.Web.Models.Print.PrintCharacterViewModel
5-
<div style="border: solid 5px">
6-
<h1 style="">@Model.CharacterName</h1>
7-
<table class="table table-bordered">
5+
<div class="print-character-header">
6+
7+
<br>
8+
<div class="print-character-box">
9+
<h1>
10+
@if (Model.RegistrationOnHold)
11+
{
12+
<span class="print-character-holdalert">(Не готов)</span>
13+
}
14+
@Model.CharacterName
15+
16+
</h1>
17+
<p class="print-character-gamename">@Model.ProjectName</p>
18+
<table class="table">
19+
@if (Model.Groups.Count > 0)
20+
{
821
<tr>
922
<th>Группы</th>
1023
<td>@Model.Groups.Select(g => g.Name).JoinStrings("")</td>
1124
</tr>
25+
}
1226
<tr>
1327
<th>Мастер</th>
14-
<td>
15-
@if (Model.ResponsibleMaster == null)
16-
{
17-
<text>нет</text>
18-
}
19-
else
20-
{
21-
@Model.ResponsibleMaster.GetDisplayName()
22-
}
23-
</td>
28+
<td>@Model.ResponsibleMaster.GetDisplayName()</td>
2429

2530
</tr>
2631
@if (Model.PlayerDisplayName != null)
@@ -47,24 +52,30 @@
4752
}
4853

4954
</table>
55+
<div class="print-character-footer">
56+
создано при помощи joinrpg.ru
57+
</div>
58+
59+
</div>
60+
5061
@if (Model.RegistrationOnHold)
5162
{
52-
<div class="panel panel-danger">
53-
<div class="panel-heading">Перед выдачей конверта</div>
54-
<div class="panel-body">
63+
<div class="print-character-registration-alert ">
64+
<h2>Конверт не готов к выдаче</h2>
5565
<ul>
5666
@if (Model.FeeDue > 0)
5767
{
58-
<li><b>Доплатить взнос:</b> @Model.FeeDue</li>
68+
<li><b>Доплатить взнос:</b> @Model.FeeDue</li>
5969
}
6070
@if (Model.Plots.HasUnready)
6171
{
62-
<li>
63-
Часть загрузов помечены как не готовы!
64-
</li>
72+
<li>
73+
Часть загрузов помечены как не готовы!
74+
</li>
6575
}
6676
</ul>
6777
</div>
68-
</div>
6978
}
79+
80+
<partial name="_CharacterHandout" model="@Model.Handouts" />
7081
</div>
Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
11
@model JoinRpg.Web.Models.Print.PrintCharacterViewModel
2-
<h1 style="page-break-before: always">@Model.CharacterName</h1>
3-
<h1>Группы</h1>
4-
<dl>
5-
@foreach (var group in Model.Groups)
2+
<div class="print-character-main">
3+
<h1>@Model.CharacterName</h1>
4+
<p class="print-character-gamename">@Model.ProjectName</p>
5+
6+
@if (Model.Fields.AnythingAccessible)
67
{
7-
<dt>@group.Name</dt>
8-
<dd>@Html.DisplayFor(model => group.Description)</dd>
8+
<div class="print-character-fields">
9+
<h2>Поля персонажа</h2>
10+
<dl>
11+
@foreach (var field in Model.Fields.Fields.Where(f => f.HasValue && f.CanView))
12+
{
13+
<dt>@field.FieldName</dt>
14+
<dd>@field.DisplayString</dd>
15+
}
16+
</dl>
17+
</div>
918
}
10-
</dl>
11-
12-
@if (Model.Fields.AnythingAccessible)
13-
{
14-
<h1 style="page-break-before: always">Поля персонажа</h1>
15-
<dl>
16-
@foreach (var field in Model.Fields.Fields.Where(f => f.HasValue && f.CanView))
17-
{
18-
<dt>@field.FieldName</dt>
19-
<dd>@field.DisplayString</dd>
20-
}
21-
</dl>
22-
}
2319

24-
@if (Model.Plots.Elements.Any())
25-
{
26-
<h1 style="page-break-before: always; page-break-after: avoid">Загрузы (@Model.Plots.Elements.Count()) </h1>
20+
@if (Model.Plots.Elements.Any())
21+
{
22+
<div class="print-character-plots">
23+
<h2>Загрузы (@Model.Plots.Elements.Count()) </h2>
2724

2825

29-
foreach (var plot in Model.Plots.Elements)
30-
{
31-
<div style="page-break-inside: avoid">
32-
@plot.Content
26+
@foreach (var plot in Model.Plots.Elements)
27+
{
28+
<div class="print-character-plot-element">
29+
@plot.Content
30+
</div>
31+
}
32+
</div>
33+
<div class="print-character-footer">
34+
создано при помощи joinrpg.ru
3335
</div>
3436
}
35-
}
36-
<br style="page-break-after: always"/>
37+
</div>
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
@model IReadOnlyCollection<JoinRpg.Web.Models.Print.HandoutListItemViewModel>
22
@if (Model.Any())
33
{
4-
<h1>Раздатка</h1>
5-
<p>Здесь собраны все вещи, которые нужно положить в конверт.</p>
6-
<table style="border-spacing: 10px; border-collapse: separate; font-size: 120%">
7-
@foreach (var handout in Model)
8-
{
9-
<tr>
10-
<td style="vertical-align: text-top"><div style="width: 2em; height: 2em; border: black solid thick;"></div></td>
11-
12-
<td>@handout.Text</td>
13-
</tr>
14-
}
15-
16-
</table>
4+
<div class="print-character-handout">
5+
<h1>Раздатка</h1>
6+
<p>Здесь собраны все вещи, которые нужно положить в конверт.</p>
7+
<table>
8+
@foreach (var handout in Model)
9+
{
10+
<tr>
11+
<td class="handout-checkbox-cell"><div>&nbsp;</div></td>
12+
<td>@handout.Text</td>
13+
</tr>
14+
}
15+
</table>
16+
</div>
1717
}

0 commit comments

Comments
 (0)