From ec4d59f6088ecc14b9231d51df18a4a4334d28ff Mon Sep 17 00:00:00 2001
From: themias <89101928+themias@users.noreply.github.com>
Date: Mon, 9 Sep 2024 15:38:49 -0400
Subject: [PATCH] Save unpublished news articles (#31491)
* Add draft saving to news consoles
* fix after bui changes
* comments + rename vars
* no
---
.../MassMedia/Ui/ArticleEditorPanel.xaml | 4 +++-
.../MassMedia/Ui/ArticleEditorPanel.xaml.cs | 12 ++++++++++
.../Ui/NewsWriterBoundUserInterface.cs | 15 +++++++++++-
.../MassMedia/Ui/NewsWriterMenu.xaml.cs | 9 ++++++-
.../Components/NewsWriterComponent.cs | 12 ++++++++++
.../MassMedia/Systems/NewsSystem.cs | 14 ++++++++++-
.../Components/NewsWriterBuiMessages.cs | 24 ++++++++++++++++++-
Resources/Locale/en-US/mass-media/news-ui.ftl | 3 ++-
8 files changed, 87 insertions(+), 6 deletions(-)
diff --git a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml
index 2b600845ca..f4fb9da062 100644
--- a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml
+++ b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml
@@ -47,8 +47,10 @@
+
+ StyleClasses="OpenBoth" Text="{Loc news-write-ui-preview-text}"/>
diff --git a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs
index 5e068f1e9c..90a66bec7f 100644
--- a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs
+++ b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs
@@ -14,6 +14,7 @@ namespace Content.Client.MassMedia.Ui;
public sealed partial class ArticleEditorPanel : Control
{
public event Action? PublishButtonPressed;
+ public event Action? ArticleDraftUpdated;
private bool _preview;
@@ -45,6 +46,7 @@ public sealed partial class ArticleEditorPanel : Control
ButtonPreview.OnPressed += OnPreview;
ButtonCancel.OnPressed += OnCancel;
ButtonPublish.OnPressed += OnPublish;
+ ButtonSaveDraft.OnPressed += OnDraftSaved;
TitleField.OnTextChanged += args => OnTextChanged(args.Text.Length, args.Control, SharedNewsSystem.MaxTitleLength);
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;
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)
@@ -92,6 +97,12 @@ public sealed partial class ArticleEditorPanel : Control
Visible = false;
}
+ private void OnDraftSaved(BaseButton.ButtonEventArgs eventArgs)
+ {
+ ArticleDraftUpdated?.Invoke(TitleField.Text, Rope.Collapse(ContentField.TextRope));
+ Visible = false;
+ }
+
private void Reset()
{
_preview = false;
@@ -100,6 +111,7 @@ public sealed partial class ArticleEditorPanel : Control
PreviewLabel.SetMarkup("");
TitleField.Text = "";
ContentField.TextRope = Rope.Leaf.Empty;
+ ArticleDraftUpdated?.Invoke(string.Empty, string.Empty);
}
protected override void Dispose(bool disposing)
diff --git a/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs b/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs
index 22e5bc452a..4f21361990 100644
--- a/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs
+++ b/Content.Client/MassMedia/Ui/NewsWriterBoundUserInterface.cs
@@ -25,6 +25,9 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
_menu.ArticleEditorPanel.PublishButtonPressed += OnPublishButtonPressed;
_menu.DeleteButtonPressed += OnDeleteButtonPressed;
+ _menu.CreateButtonPressed += OnCreateButtonPressed;
+ _menu.ArticleEditorPanel.ArticleDraftUpdated += OnArticleDraftUpdated;
+
SendMessage(new NewsWriterArticlesRequestMessage());
}
@@ -34,7 +37,7 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
if (state is not NewsWriterBoundUserInterfaceState cast)
return;
- _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish);
+ _menu?.UpdateUI(cast.Articles, cast.PublishEnabled, cast.NextPublish, cast.DraftTitle, cast.DraftContent);
}
private void OnPublishButtonPressed()
@@ -67,4 +70,14 @@ public sealed class NewsWriterBoundUserInterface : BoundUserInterface
SendMessage(new NewsWriterDeleteMessage(articleNum));
}
+
+ private void OnCreateButtonPressed()
+ {
+ SendMessage(new NewsWriterRequestDraftMessage());
+ }
+
+ private void OnArticleDraftUpdated(string title, string content)
+ {
+ SendMessage(new NewsWriterSaveDraftMessage(title, content));
+ }
}
diff --git a/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs b/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs
index c059ce785a..af1f9a9441 100644
--- a/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs
+++ b/Content.Client/MassMedia/Ui/NewsWriterMenu.xaml.cs
@@ -4,6 +4,7 @@ using Robust.Client.UserInterface.XAML;
using Content.Shared.MassMedia.Systems;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Timing;
+using Robust.Shared.Utility;
namespace Content.Client.MassMedia.Ui;
@@ -16,6 +17,8 @@ public sealed partial class NewsWriterMenu : FancyWindow
public event Action? DeleteButtonPressed;
+ public event Action? CreateButtonPressed;
+
public NewsWriterMenu()
{
RobustXamlLoader.Load(this);
@@ -31,7 +34,7 @@ public sealed partial class NewsWriterMenu : FancyWindow
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();
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;
_nextPublish = nextPublish;
+
+ ArticleEditorPanel.TitleField.Text = draftTitle;
+ ArticleEditorPanel.ContentField.TextRope = new Rope.Leaf(draftContent);
}
protected override void FrameUpdate(FrameEventArgs args)
@@ -93,5 +99,6 @@ public sealed partial class NewsWriterMenu : FancyWindow
private void OnCreate(BaseButton.ButtonEventArgs buttonEventArgs)
{
ArticleEditorPanel.Visible = true;
+ CreateButtonPressed?.Invoke();
}
}
diff --git a/Content.Server/MassMedia/Components/NewsWriterComponent.cs b/Content.Server/MassMedia/Components/NewsWriterComponent.cs
index 7005600c10..fcd1250e8b 100644
--- a/Content.Server/MassMedia/Components/NewsWriterComponent.cs
+++ b/Content.Server/MassMedia/Components/NewsWriterComponent.cs
@@ -22,4 +22,16 @@ public sealed partial class NewsWriterComponent : Component
[DataField]
public SoundSpecifier ConfirmSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg");
+
+ ///
+ /// This stores the working title of the current article
+ ///
+ [DataField, ViewVariables]
+ public string DraftTitle = "";
+
+ ///
+ /// This stores the working content of the current article
+ ///
+ [DataField, ViewVariables]
+ public string DraftContent = "";
}
diff --git a/Content.Server/MassMedia/Systems/NewsSystem.cs b/Content.Server/MassMedia/Systems/NewsSystem.cs
index fd49ebf188..899e941993 100644
--- a/Content.Server/MassMedia/Systems/NewsSystem.cs
+++ b/Content.Server/MassMedia/Systems/NewsSystem.cs
@@ -51,6 +51,8 @@ public sealed class NewsSystem : SharedNewsSystem
subs.Event(OnWriteUiDeleteMessage);
subs.Event(OnRequestArticlesUiMessage);
subs.Event(OnWriteUiPublishMessage);
+ subs.Event(OnNewsWriterDraftUpdatedMessage);
+ subs.Event(OnRequestArticleDraftMessage);
});
// News reader
@@ -256,7 +258,7 @@ public sealed class NewsSystem : SharedNewsSystem
if (!TryGetArticles(ent, out var articles))
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);
}
@@ -318,4 +320,14 @@ public sealed class NewsSystem : SharedNewsSystem
return true;
}
+ private void OnNewsWriterDraftUpdatedMessage(Entity ent, ref NewsWriterSaveDraftMessage args)
+ {
+ ent.Comp.DraftTitle = args.DraftTitle;
+ ent.Comp.DraftContent = args.DraftContent;
+ }
+
+ private void OnRequestArticleDraftMessage(Entity ent, ref NewsWriterRequestDraftMessage msg)
+ {
+ UpdateWriterUi(ent);
+ }
}
diff --git a/Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs b/Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs
index f3dda48730..ad37a832e9 100644
--- a/Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs
+++ b/Content.Shared/MassMedia/Components/NewsWriterBuiMessages.cs
@@ -15,12 +15,16 @@ public sealed class NewsWriterBoundUserInterfaceState : BoundUserInterfaceState
public readonly NewsArticle[] Articles;
public readonly bool PublishEnabled;
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;
PublishEnabled = publishEnabled;
NextPublish = nextPublish;
+ DraftTitle = draftTitle;
+ DraftContent = draftContent;
}
}
@@ -53,3 +57,21 @@ public sealed class NewsWriterDeleteMessage : 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
+{
+}
diff --git a/Resources/Locale/en-US/mass-media/news-ui.ftl b/Resources/Locale/en-US/mass-media/news-ui.ftl
index 678f20a81a..b6c826936b 100644
--- a/Resources/Locale/en-US/mass-media/news-ui.ftl
+++ b/Resources/Locale/en-US/mass-media/news-ui.ftl
@@ -15,7 +15,8 @@ news-write-ui-articles-label = Articles:
news-write-ui-delete-text = Delete
news-write-ui-publish-text = Publish
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-article-count-0 = 0 Articles
news-write-ui-article-count-text = {$count} Articles