Skip to content

Commit 09e6127

Browse files
authored
Merge pull request #1892 from johnhenley/dev98/features/tiptap-1891
ENH: Implement TipTap editor
2 parents 4763a8d + b246306 commit 09e6127

49 files changed

Lines changed: 46120 additions & 111 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/copilot-instructions.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
<!-- modeled on https://github.com/FritzAndFriends/SharpSite/pull/333 -->
1+
# Copilot Instructions
22

3-
You are a senior .NET developer, experienced in C#, JavaScript, HTML, ASP.NET Framework 4.8, CSS, and SQL.
4-
You understand the principles of DNN (DotNetNuke) and how to develop DNN modules.
5-
You use Visual Studio Enterprise for running, debugging, and testing DNN (DotNetNuke) modules.
3+
## General Guidelines
4+
- You are a senior .NET developer, experienced in C#, JavaScript, HTML, ASP.NET Framework 4.8, CSS, and SQL.
5+
- You understand the principles of DNN (DotNetNuke) and how to develop DNN modules.
6+
- You use Visual Studio Enterprise for running, debugging, and testing DNN (DotNetNuke) modules.
67

78
## Code Style and Structure
89
- Write idiomatic and efficient C# code.
@@ -23,7 +24,7 @@ You use Visual Studio Enterprise for running, debugging, and testing DNN (DotNet
2324
- Use underscore prefix and then PascalCase for private fields.
2425
- Use camelCase for local variables.
2526
- Prefix interface names with "I" (e.g., IUserService).
26-
- Always prefix and class names in DotNetNuke.Modules.ActiveForums so they are easily identifiable as part of the DNN Community Forums module, for example: ForumUserInfo is DotNetNuke.Modules.ActiveForums.Entities.ForumUserInfo.
27+
- Always prefix class names in DotNetNuke.Modules.ActiveForums so they are easily identifiable as part of the DNN Community Forums module, for example: ForumUserInfo is DotNetNuke.Modules.ActiveForums.Entities.ForumUserInfo.
2728

2829
## .NET Specific Guidelines
2930
- Leverage DNN Dependency Injection for services when possible.
@@ -34,6 +35,7 @@ You use Visual Studio Enterprise for running, debugging, and testing DNN (DotNet
3435

3536
## Error Handling and Validation
3637
- Implement proper error handling for Web API calls.
38+
- Use RESX localization resources for validation/user-facing messages instead of hardcoded strings.
3739

3840
## DNN Entities, Controllers, and Services
3941
- Always create and use DNN-style entities (e.g., ForumUserInfo, ForumPostInfo) for data representation.

Dnn.CommunityForums/App_LocalResources/SharedResources.de-DE.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,4 +1919,28 @@ Von
19191919
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
19201920
<value>Ewig</value>
19211921
</data>
1922+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1923+
<value>Von Foren bereitgestellter TipTap-Editor</value>
1924+
</data>
1925+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
1926+
<value>Strikethru-Text</value>
1927+
</data>
1928+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
1929+
<value>Text rückgängig machen Text bearbeiten</value>
1930+
</data>
1931+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
1932+
<value>Textbearbeitung neu</value>
1933+
</data>
1934+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
1935+
<value>Bestellte/Nummerierte Liste</value>
1936+
</data>
1937+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
1938+
<value>Aufzählungsliste</value>
1939+
</data>
1940+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
1941+
<value>Zitierter Text</value>
1942+
</data>
1943+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1944+
<value>Showblöcke</value>
1945+
</data>
19221946
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.es-ES.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,4 +1918,28 @@ De
19181918
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
19191919
<value>Para siempre</value>
19201920
</data>
1921+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1922+
<value>Editor TipTap entregado en foros</value>
1923+
</data>
1924+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
1925+
<value>Texto de Strikethru</value>
1926+
</data>
1927+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
1928+
<value>Deshacer Edición de texto</value>
1929+
</data>
1930+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
1931+
<value>Rehacer edición de texto</value>
1932+
</data>
1933+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
1934+
<value>Lista ordenada/numerada</value>
1935+
</data>
1936+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
1937+
<value>Lista con viñetas</value>
1938+
</data>
1939+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
1940+
<value>Texto citado</value>
1941+
</data>
1942+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1943+
<value>Bloques de exposición</value>
1944+
</data>
19211945
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.fr-FR.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,4 +1915,28 @@ De,
19151915
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
19161916
<value>Pour toujours</value>
19171917
</data>
1918+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1919+
<value>Éditeur TipTap fourni par les forums</value>
1920+
</data>
1921+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
1922+
<value>Texte rayé</value>
1923+
</data>
1924+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
1925+
<value>Annuler la modification du texte</value>
1926+
</data>
1927+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
1928+
<value>Refaire la modification du texte</value>
1929+
</data>
1930+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
1931+
<value>Liste ordonnée/numérotée</value>
1932+
</data>
1933+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
1934+
<value>Liste à puces</value>
1935+
</data>
1936+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
1937+
<value>Texte cité</value>
1938+
</data>
1939+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1940+
<value>Blocs d’exposition</value>
1941+
</data>
19181942
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.it-IT.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,4 +1918,28 @@ Da
19181918
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
19191919
<value>Per sempre</value>
19201920
</data>
1921+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1922+
<value>Editor TipTap fornito dai forum</value>
1923+
</data>
1924+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
1925+
<value>Testo Strikethru</value>
1926+
</data>
1927+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
1928+
<value>Annulla modifica del testo</value>
1929+
</data>
1930+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
1931+
<value>Rifare Modifica Testo</value>
1932+
</data>
1933+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
1934+
<value>Elenco ordinato/numerato</value>
1935+
</data>
1936+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
1937+
<value>Elenco con punti elencati</value>
1938+
</data>
1939+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
1940+
<value>Testo citato</value>
1941+
</data>
1942+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1943+
<value>Blocchi di Mostra</value>
1944+
</data>
19211945
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.nl-NL.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,4 +1954,28 @@ Van,
19541954
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
19551955
<value>Voor altijd</value>
19561956
</data>
1957+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1958+
<value>Forum-geleverd TipTap Editor</value>
1959+
</data>
1960+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
1961+
<value>Strikethru-tekst</value>
1962+
</data>
1963+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
1964+
<value>Tekst ongedaan maken Bewerken</value>
1965+
</data>
1966+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
1967+
<value>Tekst opnieuw bewerken</value>
1968+
</data>
1969+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
1970+
<value>Bestelde/Genummerde Lijst</value>
1971+
</data>
1972+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
1973+
<value>Opsommingslijst</value>
1974+
</data>
1975+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
1976+
<value>Geciteerde tekst</value>
1977+
</data>
1978+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1979+
<value>Showblokken</value>
1980+
</data>
19571981
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.resx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,27 @@
420420
<data name="[RESX:BoldDesc].Text" xml:space="preserve">
421421
<value>Make Text Bold</value>
422422
</data>
423+
<data name="[RESX:StrikeDesc].Text" xml:space="preserve">
424+
<value>Strikethru Text</value>
425+
</data>
426+
<data name="[RESX:UndoDesc].Text" xml:space="preserve">
427+
<value>Undo Text Edit</value>
428+
</data>
429+
<data name="[RESX:RedoDesc].Text" xml:space="preserve">
430+
<value>Redo Text Edit</value>
431+
</data>
423432
<data name="[RESX:ItalicsDesc].Text" xml:space="preserve">
424433
<value>Make Text Italics</value>
425434
</data>
426435
<data name="[RESX:UnderlineDesc].Text" xml:space="preserve">
427436
<value>Underline Text</value>
428437
</data>
438+
<data name="[RESX:OrderedListDesc].Text" xml:space="preserve">
439+
<value>Ordered/Numbered List</value>
440+
</data>
441+
<data name="[RESX:BulletedListDesc].Text" xml:space="preserve">
442+
<value>Bulleted List</value>
443+
</data>
429444
<data name="SendEmail.Body.Text" xml:space="preserve">
430445
<value>Body:</value>
431446
</data>
@@ -966,6 +981,9 @@
966981
<data name="[RESX:Quote].Text" xml:space="preserve">
967982
<value>Quote</value>
968983
</data>
984+
<data name="[RESX:QuoteDesc].Text" xml:space="preserve">
985+
<value>Quoted Text</value>
986+
</data>
969987
<data name="[RESX:Reply].Text" xml:space="preserve">
970988
<value>Reply</value>
971989
</data>
@@ -1918,4 +1936,10 @@ From,
19181936
<data name="[RESX:Attachment].Text" xml:space="preserve">
19191937
<value>Attachment</value>
19201938
</data>
1939+
<data name="[RESX:FORUMSTIPTAPEDITOR].Text" xml:space="preserve">
1940+
<value>Forums-delivered TipTap Editor</value>
1941+
</data>
1942+
<data name="[RESX:ShowBoxesDesc].Text" xml:space="preserve">
1943+
<value>Show Blocks</value>
1944+
</data>
19211945
</root>

Dnn.CommunityForums/Controllers/AttachmentController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ internal void RelocateInlineAttachment(DotNetNuke.Modules.ActiveForums.Entities.
301301
(match.Groups["src"].Value.EndsWith(file.FileName, StringComparison.InvariantCultureIgnoreCase) ||
302302
(!string.IsNullOrEmpty(originalUrl) && match.Groups["src"].Value.ToLowerInvariant().Contains(originalUrl.ToLowerInvariant()))))
303303
{
304-
var tag = Utilities.ResolveUrlInTag($"<img src=\"https://{content.Post.Forum.PortalSettings.DefaultPortalAlias}{this.fileManager.GetUrl(file)}\" width=\"{width}\" height=\"{height}\" loading=\"lazy\" />", content.Post.Forum.PortalSettings.DefaultPortalAlias, content.Post.Forum.PortalSettings.SSLEnabled);
304+
var tag = Utilities.ResolveUrlInTag($"<img src=\"https://{content.Post.Forum.PortalSettings.DefaultPortalAlias}{this.fileManager.GetUrl(file)}\" width=\"{width}\" height=\"{height}\" loading=\"lazy\" />", content.Post.Forum.PortalSettings);
305305
content.Body = content.Body.Replace(match.Groups["tag"].Value, tag);
306306
this.contentController.Save(content, content.ContentId);
307307
}

Dnn.CommunityForums/Controllers/EmoticonController.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1919
// DEALINGS IN THE SOFTWARE.
2020

21+
using DotNetNuke.Modules.ActiveForums.Enums;
22+
2123
namespace DotNetNuke.Modules.ActiveForums.Controllers
2224
{
2325
using DotNetNuke.Modules.ActiveForums.Enums;

Dnn.CommunityForums/Controllers/ForumUserController.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -611,12 +611,16 @@ internal static string UserStatus(string themePath, bool isUserOnline, int userI
611611
return "<span class=\"af-user-status\"><i class=\"fa fa-circle fa-red\"></i></span>";
612612
}
613613

614-
internal static string GetAvatar(PortalSettings portalSettings, int userId, int avatarWidth, int avatarHeight)
614+
internal static string GetAvatarImgTag(PortalSettings portalSettings, int userId, int avatarWidth, int avatarHeight)
615+
{
616+
return string.Format("<img class='af-avatar' alt='' src='{0}' height='{1}px' width='{2}px' loading='lazy' />", GetAvatarImgSrc(portalSettings: portalSettings, userId: userId, avatarWidth: avatarWidth, avatarHeight: avatarHeight), avatarHeight, avatarWidth);
617+
}
618+
619+
internal static string GetAvatarImgSrc(PortalSettings portalSettings, int userId, int avatarWidth, int avatarHeight)
615620
{
616621
// GIF files when reduced using DNN class losses its animation, so for gifs send them as is
617622
var user = new DotNetNuke.Entities.Users.UserController().GetUser(portalSettings.PortalId, userId);
618623
string imgUrl = string.Empty;
619-
string imgTag = string.Empty;
620624

621625
if (user != null)
622626
{
@@ -631,20 +635,14 @@ internal static string GetAvatar(PortalSettings portalSettings, int userId, int
631635
}
632636

633637
imgUrl = $"https://{portalSettings.DefaultPortalAlias}{imgUrl}";
634-
if (!string.IsNullOrEmpty(portalSettings.PortalAlias.CultureCode) && imgUrl.ToLowerInvariant().Contains($"/{portalSettings.PortalAlias.CultureCode.ToLowerInvariant()}/"))
635-
{
636-
imgUrl = imgUrl.ToLowerInvariant().Replace($"/{portalSettings.PortalAlias.CultureCode.ToLowerInvariant()}/", "/");
637-
}
638-
639-
imgTag = string.Format("<img class='af-avatar' alt='' src='{0}' height='{1}px' width='{2}px' loading='lazy' />", imgUrl, avatarHeight, avatarWidth);
640638
}
641639
else
642640
{
643641
/* NOTE: This purposely does not use DNN API GetUserProfilePictureUrl because it inadvertantly requires HttpContext */
644-
imgTag = $"<img class='af-avatar' src='https://{portalSettings.DefaultPortalAlias}/DnnImageHandler.ashx?mode=profilepic&userId={userId}&h={avatarWidth}&w={avatarHeight}' loading='lazy' />";
642+
imgUrl = $"https://{portalSettings.DefaultPortalAlias}/DnnImageHandler.ashx?mode=profilepic&userId={userId}&h={avatarWidth}&w={avatarHeight}";
645643
}
646644

647-
return Utilities.ResolveUrlInTag(template: imgTag, defaultPortalAlias: portalSettings.DefaultPortalAlias, sslEnabled: portalSettings.SSLEnabled);
645+
return Utilities.RemoveCultureFromUrl(Utilities.ResolveUrl(imgUrl, portalSettings), portalSettings);
648646
}
649647

650648
internal static void UpdateUserTopicCount(int portalId, int userId)

0 commit comments

Comments
 (0)