From de8c2050782e20a3f157ee207cdf42bf5a5d8c57 Mon Sep 17 00:00:00 2001 From: Eric Wagner Date: Mon, 8 Mar 2021 12:17:54 -0600 Subject: [PATCH] NEED TO VERSION - Add DisplayOrder column to DnnForge_NewsArticles_ArticleTag table and allow for explicitly defining display order via ucSubmitNews UI --- App_LocalResources/ucSubmitNews.ascx.resx | 6 + Components/TagController.vb | 4 +- Providers/DataProvider/DataProvider.vb | 2 +- .../SqlDataProvider/SqlDataProvider.vb | 4 +- ...ntrian.NewsArticles.SqlDataProvider.vbproj | 1 + .../SqlDataProvider/VersionMe.SqlDataProvider | 62 ++++++++ ucSubmitNews.ascx | 16 +- ucSubmitNews.ascx.designer.vb | 108 +++++++++++++ ucSubmitNews.ascx.vb | 145 +++++++++++++++--- 9 files changed, 318 insertions(+), 30 deletions(-) create mode 100644 Providers/DataProvider/SqlDataProvider/VersionMe.SqlDataProvider diff --git a/App_LocalResources/ucSubmitNews.ascx.resx b/App_LocalResources/ucSubmitNews.ascx.resx index 1ce9ccc..1cfc461 100755 --- a/App_LocalResources/ucSubmitNews.ascx.resx +++ b/App_LocalResources/ucSubmitNews.ascx.resx @@ -459,4 +459,10 @@ Upload Folder: + + Select all desired tags and add to Article Tags list. + + + Re-order article tags for display, and remove existing article tags. + \ No newline at end of file diff --git a/Components/TagController.vb b/Components/TagController.vb index 5e24869..d6f1776 100755 --- a/Components/TagController.vb +++ b/Components/TagController.vb @@ -98,10 +98,10 @@ Namespace Ventrian.NewsArticles End Sub - Public Sub Add(ByVal articleID As Integer, ByVal tagID As Integer) + Public Sub Add(ByVal articleID As Integer, ByVal tagID As Integer, Optional ByVal displayOrder As Integer = 0) RemoveCache(tagID) - DataProvider.Instance().AddArticleTag(articleID, tagID) + DataProvider.Instance().AddArticleTag(articleID, tagID, displayOrder) End Sub diff --git a/Providers/DataProvider/DataProvider.vb b/Providers/DataProvider/DataProvider.vb index fb898fe..2691d58 100755 --- a/Providers/DataProvider/DataProvider.vb +++ b/Providers/DataProvider/DataProvider.vb @@ -133,7 +133,7 @@ Namespace Ventrian.NewsArticles Public MustOverride Sub UpdateTag(ByVal tagID As Integer, ByVal moduleID As Integer, ByVal name As String, ByVal nameLowered As String, ByVal usages As Integer) Public MustOverride Sub DeleteTag(ByVal tagID As Integer) - Public MustOverride Sub AddArticleTag(ByVal articleID As Integer, ByVal tagID As Integer) + Public MustOverride Sub AddArticleTag(ByVal articleID As Integer, ByVal tagID As Integer, Optional ByVal displayOrder As Integer = 0) Public MustOverride Sub DeleteArticleTag(ByVal articleID As Integer) Public MustOverride Sub DeleteArticleTagByTag(ByVal tagID As Integer) diff --git a/Providers/DataProvider/SqlDataProvider/SqlDataProvider.vb b/Providers/DataProvider/SqlDataProvider/SqlDataProvider.vb index 16049d2..242ca2a 100755 --- a/Providers/DataProvider/SqlDataProvider/SqlDataProvider.vb +++ b/Providers/DataProvider/SqlDataProvider/SqlDataProvider.vb @@ -564,8 +564,8 @@ Namespace Ventrian.NewsArticles SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "DnnForge_NewsArticles_TagDelete", tagID) End Sub - Public Overrides Sub AddArticleTag(ByVal articleID As Integer, ByVal tagID As Integer) - SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "DnnForge_NewsArticles_ArticleTagAdd", articleID, tagID) + Public Overrides Sub AddArticleTag(ByVal articleID As Integer, ByVal tagID As Integer, Optional ByVal displayOrder As Integer = 0) + SqlHelper.ExecuteNonQuery(ConnectionString, DatabaseOwner & ObjectQualifier & "DnnForge_NewsArticles_ArticleTagAdd", articleID, tagID, displayOrder) End Sub Public Overrides Sub DeleteArticleTag(ByVal articleID As Integer) diff --git a/Providers/DataProvider/SqlDataProvider/Ventrian.NewsArticles.SqlDataProvider.vbproj b/Providers/DataProvider/SqlDataProvider/Ventrian.NewsArticles.SqlDataProvider.vbproj index c6f3839..9d20d77 100755 --- a/Providers/DataProvider/SqlDataProvider/Ventrian.NewsArticles.SqlDataProvider.vbproj +++ b/Providers/DataProvider/SqlDataProvider/Ventrian.NewsArticles.SqlDataProvider.vbproj @@ -231,6 +231,7 @@ + diff --git a/Providers/DataProvider/SqlDataProvider/VersionMe.SqlDataProvider b/Providers/DataProvider/SqlDataProvider/VersionMe.SqlDataProvider new file mode 100644 index 0000000..20a9772 --- /dev/null +++ b/Providers/DataProvider/SqlDataProvider/VersionMe.SqlDataProvider @@ -0,0 +1,62 @@ +-- Add SortOrder column to DnnForge_NewsArticles_ArticleTag +IF (SELECT TOP 1 c.column_id + FROM sys.tables t + JOIN sys.all_columns c ON t.object_id = c.object_id + WHERE t.name = 'DnnForge_NewsArticles_ArticleTag' AND c.name = 'DisplayOrder') IS NULL +BEGIN + + ALTER TABLE {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag + ADD DisplayOrder INT + + -- Backfill existing article tags + UPDATE {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag + SET DisplayOrder = 0 + +END +GO + +-- Add DisplayOrder param to DnnForge_NewsArticles_ArticleTagAdd store procedure +ALTER PROCEDURE {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTagAdd + @ArticleID int, + @TagID int, + @DisplayOrder int +AS +IF( (SELECT COUNT(*) FROM {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag WHERE ArticleID = @ArticleID and TagID = @TagID) = 0 ) +BEGIN + INSERT INTO + {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag(ArticleID, TagID, DisplayOrder) + VALUES(@ArticleID, @TagID, @DisplayOrder) + + UPDATE + {databaseOwner}{objectQualifier}DnnForge_NewsArticles_Tag + SET + Usages = (select count(*) from {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag pt where pt.TagID = @TagID) + WHERE + TagID = @TagID +END +GO + +-- Alter Ventrian_NewsArticles_SplitTags function to order article tags by DisplayOrder field +ALTER FUNCTION {databaseOwner}{objectQualifier}Ventrian_NewsArticles_SplitTags +(@ArticleID int) +RETURNS nvarchar(2000) +AS + BEGIN + + DECLARE @p_str nvarchar(2000) + SET @p_str = '' + + SELECT @p_str = @p_str + ',' + CAST(t.[Name] AS NVARCHAR(50)) + FROM {databaseOwner}{objectQualifier}DnnForge_NewsArticles_Tag t, {databaseOwner}{objectQualifier}DnnForge_NewsArticles_ArticleTag at + WHERE t.TagID = at.TagID and at.ArticleID = @ArticleID + ORDER BY at.DisplayOrder + + IF( LEN(@p_str) > 0 ) + BEGIN + SELECT @p_str = SUBSTRING(@p_str, 2, (LEN(@p_str)-1)) + END + + RETURN LTRIM(@p_str) + +END +GO \ No newline at end of file diff --git a/ucSubmitNews.ascx b/ucSubmitNews.ascx index 5833065..b0f203e 100755 --- a/ucSubmitNews.ascx +++ b/ucSubmitNews.ascx @@ -225,11 +225,23 @@ - - + +
+ + + + + + + + + + + + diff --git a/ucSubmitNews.ascx.designer.vb b/ucSubmitNews.ascx.designer.vb index d434457..8f13d7b 100755 --- a/ucSubmitNews.ascx.designer.vb +++ b/ucSubmitNews.ascx.designer.vb @@ -662,6 +662,15 @@ Namespace Ventrian.NewsArticles ''' Protected WithEvents trTags As Global.System.Web.UI.HtmlControls.HtmlTableRow + ''' + '''tdTxtTagsTitle control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents tdTxtTagsTitle As Global.System.Web.UI.HtmlControls.HtmlTableCell + ''' '''plTags control. ''' @@ -671,6 +680,15 @@ Namespace Ventrian.NewsArticles ''' Protected WithEvents plTags As Global.System.Web.UI.UserControl + ''' + '''tdTxtTags control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents tdTxtTags As Global.System.Web.UI.HtmlControls.HtmlTableCell + ''' '''txtTags control. ''' @@ -689,6 +707,33 @@ Namespace Ventrian.NewsArticles ''' Protected WithEvents lblTags As Global.System.Web.UI.WebControls.Label + ''' + '''tdAllTagsTitle control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents tdAllTagsTitle As Global.System.Web.UI.HtmlControls.HtmlTableCell + + ''' + '''plAllTags control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents plAllTags As Global.System.Web.UI.UserControl + + ''' + '''tdAllTagsList control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents tdAllTagsList As Global.System.Web.UI.HtmlControls.HtmlTableCell + ''' '''lstTags control. ''' @@ -698,6 +743,69 @@ Namespace Ventrian.NewsArticles ''' Protected WithEvents lstTags As Global.System.Web.UI.WebControls.ListBox + ''' + '''addTags control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents addTags As Global.System.Web.UI.WebControls.ImageButton + + ''' + '''tdStaticTagsList control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents tdStaticTagsList As Global.System.Web.UI.HtmlControls.HtmlTableCell + + ''' + '''plArticleTags control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents plArticleTags As Global.System.Web.UI.UserControl + + ''' + '''lstFinalTags control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents lstFinalTags As Global.System.Web.UI.WebControls.ListBox + + ''' + '''cmdUp control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents cmdUp As Global.System.Web.UI.WebControls.ImageButton + + ''' + '''cmdDown control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents cmdDown As Global.System.Web.UI.WebControls.ImageButton + + ''' + '''cmdDeleteTag control. + ''' + ''' + '''Auto-generated field. + '''To modify move field declaration from designer file to code-behind file. + ''' + Protected WithEvents cmdDeleteTag As Global.System.Web.UI.WebControls.ImageButton + ''' '''phPublish control. ''' diff --git a/ucSubmitNews.ascx.vb b/ucSubmitNews.ascx.vb index 91e0548..ac195ae 100755 --- a/ucSubmitNews.ascx.vb +++ b/ucSubmitNews.ascx.vb @@ -192,8 +192,9 @@ Namespace Ventrian.NewsArticles End If Next - If (ArticleSettings.UseStaticTagsList) Then - SelectTags(objArticle.Tags) + If ArticleSettings.UseStaticTagsList Then + SelectAllTags(objArticle.Tags) + CreateFinalTags(objArticle.Tags) Else txtTags.Text = objArticle.Tags End If @@ -343,22 +344,32 @@ Namespace Ventrian.NewsArticles End Sub Private Sub BindTags() - If (ArticleSettings.UseStaticTagsList) Then - txtTags.Visible = False - lblTags.Visible = False - Dim objTagController As New TagController - Dim objTags As ArrayList = objTagController.List(ModuleId, Null.NullInteger) - - objTags.Sort() - lstTags.DataSource = objTags - lstTags.DataBind() + If ArticleSettings.UseStaticTagsList Then + tdTxtTagsTitle.Visible = False + tdTxtTags.Visible = False + FillTagsList() Else - lstTags.Visible = False + tdAllTagsTitle.Visible = False + tdAllTagsList.Visible = False + tdStaticTagsList.Visible = False End If + + End Sub + + Private Sub FillTagsList() + + Dim objTagController As New TagController + Dim objTags As ArrayList = objTagController.List(ModuleId, Null.NullInteger) + + objTags.Sort() + lstTags.DataSource = objTags + lstTags.DataBind() + End Sub - Private Sub SelectTags(ByVal tagList As String) + Private Sub SelectAllTags(ByVal tagList As String) + Dim objTagController As New TagController For Each tag As String In tagList.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries) Dim objTag As TagInfo = objTagController.Get(ModuleId, tag) @@ -370,6 +381,20 @@ Namespace Ventrian.NewsArticles End If End If Next + + End Sub + + Private Sub CreateFinalTags(ByVal tagList As String) + + Dim objTagController As New TagController + For Each tag As String In tagList.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries) + Dim objTag As TagInfo = objTagController.Get(ModuleId, tag) + + If objTag IsNot Nothing Then + lstFinalTags.Items.Add(objTag.Name) + End If + Next + End Sub Private Sub BindCustomFields() @@ -408,7 +433,7 @@ Namespace Ventrian.NewsArticles Public Function GetAuthorList(ByVal moduleID As Integer) As ArrayList - Dim moduleSettings As Hashtable = Common.GetModuleSettings(moduleId) + Dim moduleSettings As Hashtable = Common.GetModuleSettings(moduleID) Dim distributionList As String = "" Dim userList As New ArrayList @@ -1181,8 +1206,9 @@ Namespace Ventrian.NewsArticles Dim objLinkedArticle As ArticleInfo = objArticleController.GetArticle(Convert.ToInt32(drpMirrorArticle.SelectedValue)) If (objLinkedArticle IsNot Nothing) Then - If (ArticleSettings.UseStaticTagsList) Then - SelectTags(objLinkedArticle.Tags) + If ArticleSettings.UseStaticTagsList Then + SelectAllTags(objLinkedArticle.Tags) + CreateFinalTags(objLinkedArticle.Tags) Else txtTags.Text = objLinkedArticle.Tags End If @@ -1192,14 +1218,16 @@ Namespace Ventrian.NewsArticles Dim objTagController As New TagController objTagController.DeleteArticleTag(articleID) - If (ArticleSettings.UseStaticTagsList) Then - For Each li As ListItem In lstTags.Items - If (li.Selected) Then - Dim objTag As TagInfo = objTagController.Get(ModuleId, li.Value) + If ArticleSettings.UseStaticTagsList Then + Dim order As Integer = 0 - If objTag IsNot Nothing Then - objTagController.Add(articleID, objTag.TagID) - End If + For Each li As ListItem In lstFinalTags.Items + order = order + 1 + + Dim objTag As TagInfo = objTagController.Get(ModuleId, li.Value) + + If objTag IsNot Nothing Then + objTagController.Add(articleID, objTag.TagID, order) End If Next Else @@ -1980,6 +2008,77 @@ Namespace Ventrian.NewsArticles End Sub + Private Sub addTags_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles addTags.Click + + If lstTags.Items.Count > 0 Then + lstFinalTags.Items.Clear() + End If + + For Each li As ListItem In lstTags.Items + If (li.Selected) Then + li.Selected = False + lstFinalTags.Items.Add(li) + End If + Next + + End Sub + + Private Sub cmdUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUp.Click + + moveListItem(-1) + + End Sub + + Private Sub cmdDown_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDown.Click + + moveListItem(1) + + End Sub + + Private Sub moveListItem(direction As Integer) + + Try + With Me.lstFinalTags + Dim selectedIndex As Integer = .SelectedIndex + Dim selectedItem As ListItem = .SelectedItem + Dim totalItems As Integer = .Items.Count + + ' No selected item + If (selectedItem Is Nothing Or selectedIndex < 0) Then + Return + End If + + ' Calculate New index using direction + Dim newIndex As Integer = selectedIndex + direction + + ' New Index out of range + If (newIndex < 0 Or newIndex >= totalItems) Then + Return + End If + + ' Remove old element + .Items.Remove(selectedItem) + + ' Insert into New position + .Items.Insert(newIndex, selectedItem) + + ' Restore selection + .SelectedIndex = newIndex + End With + Catch exc As Exception 'Module failed to load + ProcessModuleLoadException(Me, exc) + End Try + + End Sub + + Private Sub cmdDeleteTag_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDeleteTag.Click + + If lstFinalTags.SelectedItem IsNot Nothing Then + lstFinalTags.Items.Remove(lstFinalTags.SelectedItem) + End If + + End Sub + Private Sub cmdSaveArticle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSaveArticle.Click Try