Save unpublished news articles (#31491)
* Add draft saving to news consoles * fix after bui changes * comments + rename vars * no
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user