Save unpublished news articles (#31491)

* Add draft saving to news consoles

* fix after bui changes

* comments + rename vars

* no
This commit is contained in:
themias
2024-09-09 15:38:49 -04:00
committed by GitHub
parent f91672974c
commit ec4d59f608
8 changed files with 87 additions and 6 deletions

View File

@@ -47,8 +47,10 @@
</Control> </Control>
<Control HorizontalExpand="True"/> <Control HorizontalExpand="True"/>
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
<Button Name="ButtonSaveDraft" SetHeight="32" SetWidth="85"
StyleClasses="OpenRight" Text="{Loc news-write-ui-save-text}"/>
<Button Name="ButtonPreview" SetHeight="32" SetWidth="85" <Button Name="ButtonPreview" SetHeight="32" SetWidth="85"
StyleClasses="OpenRight" Text="{Loc news-write-ui-preview-text}"/> StyleClasses="OpenBoth" Text="{Loc news-write-ui-preview-text}"/>
<Button Name="ButtonPublish" SetHeight="32" SetWidth="85" Text="{Loc news-write-ui-publish-text}" Access="Public"/> <Button Name="ButtonPublish" SetHeight="32" SetWidth="85" Text="{Loc news-write-ui-publish-text}" Access="Public"/>
</BoxContainer> </BoxContainer>
</BoxContainer> </BoxContainer>

View File

@@ -14,6 +14,7 @@ namespace Content.Client.MassMedia.Ui;
public sealed partial class ArticleEditorPanel : Control public sealed partial class ArticleEditorPanel : Control
{ {
public event Action? PublishButtonPressed; public event Action? PublishButtonPressed;
public event Action<string, string>? ArticleDraftUpdated;
private bool _preview; private bool _preview;
@@ -45,6 +46,7 @@ public sealed partial class ArticleEditorPanel : Control
ButtonPreview.OnPressed += OnPreview; ButtonPreview.OnPressed += OnPreview;
ButtonCancel.OnPressed += OnCancel; ButtonCancel.OnPressed += OnCancel;
ButtonPublish.OnPressed += OnPublish; ButtonPublish.OnPressed += OnPublish;
ButtonSaveDraft.OnPressed += OnDraftSaved;
TitleField.OnTextChanged += args => OnTextChanged(args.Text.Length, args.Control, SharedNewsSystem.MaxTitleLength); TitleField.OnTextChanged += args => OnTextChanged(args.Text.Length, args.Control, SharedNewsSystem.MaxTitleLength);
ContentField.OnTextChanged += args => OnTextChanged(Rope.CalcTotalLength(args.TextRope), args.Control, SharedNewsSystem.MaxContentLength); ContentField.OnTextChanged += args => OnTextChanged(Rope.CalcTotalLength(args.TextRope), args.Control, SharedNewsSystem.MaxContentLength);
@@ -68,6 +70,9 @@ public sealed partial class ArticleEditorPanel : Control
ButtonPublish.Disabled = false; ButtonPublish.Disabled = false;
ButtonPreview.Disabled = false; ButtonPreview.Disabled = false;
} }
// save draft regardless; they can edit down the length later
ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
} }
private void OnPreview(BaseButton.ButtonEventArgs eventArgs) private void OnPreview(BaseButton.ButtonEventArgs eventArgs)
@@ -92,6 +97,12 @@ public sealed partial class ArticleEditorPanel : Control
Visible = false; Visible = false;
} }
private void OnDraftSaved(BaseButton.ButtonEventArgs eventArgs)
{
ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
Visible = false;
}
private void Reset() private void Reset()
{ {
_preview = false; _preview = false;
@@ -100,6 +111,7 @@ public sealed partial class ArticleEditorPanel : Control
PreviewLabel.SetMarkup(""); PreviewLabel.SetMarkup("");
TitleField.Text = ""; TitleField.Text = "";
ContentField.TextRope = Rope.Leaf.Empty; ContentField.TextRope = Rope.Leaf.Empty;
ArticleDraftUpdated?.Invoke(string.Empty, string.Empty);
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)

View File

@@ -25,6 +25,9 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
_menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed; _menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed;
_menu.DeleteButtonPressed += OnDeleteButtonPressed; _menu.DeleteButtonPressed += OnDeleteButtonPressed;
_menu.CreateButtonPressed += OnCreateButtonPressed;
_menu.ArticleEditorPanel.ArticleDraftUpdated += OnArticleDraftUpdated;
SendMessage(new NewsWriterArticlesRequestMessage()); SendMessage(new NewsWriterArticlesRequestMessage());
} }
@@ -34,7 +37,7 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
if (state is not NewsWriterBoundUserInterfaceState cast) if (state is not NewsWriterBoundUserInterfaceState cast)
return; return;
_menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish); _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish, cast.DraftTitle, cast.DraftContent);
} }
private void OnPublishButtonPressed() private void OnPublishButtonPressed()
@@ -67,4 +70,14 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
SendMessage(new NewsWriterDeleteMessage(articleNum)); SendMessage(new NewsWriterDeleteMessage(articleNum));
} }
private void OnCreateButtonPressed()
{
SendMessage(new NewsWriterRequestDraftMessage());
}
private void OnArticleDraftUpdated(string title, string content)
{
SendMessage(new NewsWriterSaveDraftMessage(title, content));
}
} }

View File

@@ -4,6 +4,7 @@ using Robust.Client.UserInterface.XAML;
using Content.Shared.MassMedia.Systems; using Content.Shared.MassMedia.Systems;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
namespace Content.Client.MassMedia.Ui; namespace Content.Client.MassMedia.Ui;
@@ -16,6 +17,8 @@ public sealed partial class NewsWriterMenu : FancyWindow
public event Action<int>? DeleteButtonPressed; public event Action<int>? DeleteButtonPressed;
public event Action? CreateButtonPressed;
public NewsWriterMenu() public NewsWriterMenu()
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
@@ -31,7 +34,7 @@ public sealed partial class NewsWriterMenu : FancyWindow
ButtonCreate.OnPressed += OnCreate; ButtonCreate.OnPressed += OnCreate;
} }
public void UpdateUI(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish) public void UpdateUI(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish, string draftTitle, string draftContent)
{ {
ArticlesContainer.Children.Clear(); ArticlesContainer.Children.Clear();
ArticleCount.Text = Loc.GetString("news-write-ui-article-count-text", ("count", articles.Length)); ArticleCount.Text = Loc.GetString("news-write-ui-article-count-text", ("count", articles.Length));
@@ -54,6 +57,9 @@ public sealed partial class NewsWriterMenu : FancyWindow
ButtonCreate.Disabled = !publishEnabled; ButtonCreate.Disabled = !publishEnabled;
_nextPublish = nextPublish; _nextPublish = nextPublish;
ArticleEditorPanel.TitleField.Text = draftTitle;
ArticleEditorPanel.ContentField.TextRope = new Rope.Leaf(draftContent);
} }
protected override void FrameUpdate(FrameEventArgs args) protected override void FrameUpdate(FrameEventArgs args)
@@ -93,5 +99,6 @@ public sealed partial class NewsWriterMenu : FancyWindow
private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs) private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs)
{ {
ArticleEditorPanel.Visible = true; ArticleEditorPanel.Visible = true;
CreateButtonPressed?.Invoke();
} }
} }

View File

@@ -22,4 +22,16 @@ public sealed partial class NewsWriterComponent : Component
[DataField] [DataField]
public SoundSpecifier ConfirmSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg"); public SoundSpecifier ConfirmSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg");
/// <summary>
/// This stores the working title of the current article
/// </summary>
[DataField, ViewVariables]
public string DraftTitle = "";
/// <summary>
/// This stores the working content of the current article
/// </summary>
[DataField, ViewVariables]
public string DraftContent = "";
} }

View File

@@ -51,6 +51,8 @@ public sealed class NewsSystem : SharedNewsSystem
subs.Event<NewsWriterDeleteMessage>(OnWriteUiDeleteMessage); subs.Event<NewsWriterDeleteMessage>(OnWriteUiDeleteMessage);
subs.Event<NewsWriterArticlesRequestMessage>(OnRequestArticlesUiMessage); subs.Event<NewsWriterArticlesRequestMessage>(OnRequestArticlesUiMessage);
subs.Event<NewsWriterPublishMessage>(OnWriteUiPublishMessage); subs.Event<NewsWriterPublishMessage>(OnWriteUiPublishMessage);
subs.Event<NewsWriterSaveDraftMessage>(OnNewsWriterDraftUpdatedMessage);
subs.Event<NewsWriterRequestDraftMessage>(OnRequestArticleDraftMessage);
}); });
// News reader // News reader
@@ -256,7 +258,7 @@ public sealed class NewsSystem : SharedNewsSystem
if (!TryGetArticles(ent, out var articles)) if (!TryGetArticles(ent, out var articles))
return; return;
var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish); var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish, ent.Comp.DraftTitle, ent.Comp.DraftContent);
_ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state); _ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state);
} }
@@ -318,4 +320,14 @@ public sealed class NewsSystem : SharedNewsSystem
return true; return true;
} }
private void OnNewsWriterDraftUpdatedMessage(Entity<NewsWriterComponent> ent, ref NewsWriterSaveDraftMessage args)
{
ent.Comp.DraftTitle = args.DraftTitle;
ent.Comp.DraftContent = args.DraftContent;
}
private void OnRequestArticleDraftMessage(Entity<NewsWriterComponent> ent, ref NewsWriterRequestDraftMessage msg)
{
UpdateWriterUi(ent);
}
} }

View File

@@ -15,12 +15,16 @@ public sealed class NewsWriterBoundUserInterfaceState : BoundUserInterfaceState
public readonly NewsArticle[] Articles; public readonly NewsArticle[] Articles;
public readonly bool PublishEnabled; public readonly bool PublishEnabled;
public readonly TimeSpan NextPublish; public readonly TimeSpan NextPublish;
public readonly string DraftTitle;
public readonly string DraftContent;
public NewsWriterBoundUserInterfaceState(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish) public NewsWriterBoundUserInterfaceState(NewsArticle[] articles, bool publishEnabled, TimeSpan nextPublish, string draftTitle, string draftContent)
{ {
Articles = articles; Articles = articles;
PublishEnabled = publishEnabled; PublishEnabled = publishEnabled;
NextPublish = nextPublish; NextPublish = nextPublish;
DraftTitle = draftTitle;
DraftContent = draftContent;
} }
} }
@@ -53,3 +57,21 @@ public sealed class NewsWriterDeleteMessage : BoundUserInterfaceMessage
public sealed class NewsWriterArticlesRequestMessage : BoundUserInterfaceMessage public sealed class NewsWriterArticlesRequestMessage : BoundUserInterfaceMessage
{ {
} }
[Serializable, NetSerializable]
public sealed class NewsWriterSaveDraftMessage : BoundUserInterfaceMessage
{
public readonly string DraftTitle;
public readonly string DraftContent;
public NewsWriterSaveDraftMessage(string draftTitle, string draftContent)
{
DraftTitle = draftTitle;
DraftContent = draftContent;
}
}
[Serializable, NetSerializable]
public sealed class NewsWriterRequestDraftMessage : BoundUserInterfaceMessage
{
}

View File

@@ -15,7 +15,8 @@ news-write-ui-articles-label = Articles:
news-write-ui-delete-text = Delete news-write-ui-delete-text = Delete
news-write-ui-publish-text = Publish news-write-ui-publish-text = Publish
news-write-ui-create-text = Create news-write-ui-create-text = Create
news-write-ui-cancel-text = Cancel news-write-ui-cancel-text = Clear
news-write-ui-save-text = Save
news-write-ui-preview-text = Preview news-write-ui-preview-text = Preview
news-write-ui-article-count-0 = 0 Articles news-write-ui-article-count-0 = 0 Articles
news-write-ui-article-count-text = {$count} Articles news-write-ui-article-count-text = {$count} Articles