minor cleanups, add logoAlt
authorJustin Wind <justin.wind+git@gmail.com>
Fri, 8 Mar 2024 21:26:55 +0000 (13:26 -0800)
committerJustin Wind <justin.wind+git@gmail.com>
Fri, 8 Mar 2024 21:26:55 +0000 (13:26 -0800)
lib/template-helper.js
test/lib/template-helper.js

index 7e51bcfbb9058a25287bf934978d9234b368bf80..747c5258d571124e342cf9945a8b71d5b5d5728a 100644 (file)
@@ -232,6 +232,7 @@ ${spacer}</nav>` : '';
  * @param {Object} ctx
  * @param {Object} options
  * @param {String[]=} options.logoUrl
+ * @param {String[]=} options.logoAlt
  * @param {String[]=} options.pageTitle
  * @returns {String}
  */
@@ -239,9 +240,10 @@ function htmlHeader(pagePathLevel, ctx, options) {
   const rootPathPfx = '../'.repeat(pagePathLevel);
   const {
     logoUrl = '',
+    logoAlt = 'logo',
     pageTitle = '',
   } = options;
-  const logoImg = logoUrl ? `<img src="${rootPathPfx}${logoUrl}" class="logo">` : '';
+  const logoImg = logoUrl ? `<img src="${rootPathPfx}${logoUrl}" alt="logo" class="${logoAlt}">` : '';
   return `\t\t<header>
 \t\t\t<h1>${logoImg}${pageTitle}</h1>
 ${htmlNav(ctx, options)}
@@ -338,16 +340,16 @@ ${spacer}</ol>`;
  * @param {String[]=} options.notificationContent
  */
 function htmlMessages(ctx, options) {
-  const errorHeading = options && options.errorHeading ? `
+  const errorHeading = options?.errorHeading ? `
 \t<h2>${options.errorHeading}</h2>` : '';
-  const errorContent = options && options.errorContent && options.errorContent.length ? '\n' + options.errorContent.map(((content) => `\t${content}`)).join('\n') : '';
-  const notificationHeading = options && options.notificationHeading ? `\n\t<h2>${options.notificationHeading}</h2>` : '';
-  const notificationContent = options && options.notificationContent && options.notificationContent.length ? '\n' + options.notificationContent.map(((content) => `\t${content}`)).join('\n') : '';
-  const errors = ctx && ctx.errors && ctx.errors.length ? `
+  const errorContent = options?.errorContent?.length ? '\n' + options.errorContent.map(((content) => `\t${content}`)).join('\n') : '';
+  const notificationHeading = options?.notificationHeading ? `\n\t<h2>${options.notificationHeading}</h2>` : '';
+  const notificationContent = options?.notificationContent?.length ? '\n' + options.notificationContent.map(((content) => `\t${content}`)).join('\n') : '';
+  const errors = ctx?.errors?.length ? `
 <section class="error">${errorHeading}${errorContent}
 ${UL(ctx.errors, 1)}
 </section>` : '';
-  const notifications = ctx && ctx.notifications && ctx.notifications.length ? `
+  const notifications = ctx?.notifications?.length ? `
 <section class="notification">${notificationHeading}${notificationContent}
 ${UL(ctx.notifications, 1)}
 </section>` : '';
@@ -367,6 +369,7 @@ ${UL(ctx.notifications, 1)}
  * @param {Object} options
  * @param {String=} options.pageTitle
  * @param {String=} options.logoUrl
+ * @param {String=} options.logoAlt
  * @param {Object[]=} options.bodyAttributes
  * @param {String[]=} options.headElements
  * @param {Object[]=} options.navLinks
@@ -379,16 +382,19 @@ ${UL(ctx.notifications, 1)}
  * @returns {String}
  */
 function htmlPage(pagePathLevel, ctx, options, main = []) {
-  const user = (ctx && ctx.session && ctx.session.authenticatedProfile) || (ctx && ctx.session && ctx.session.authenticatedIdentifier);
+  const user = ctx?.session?.authenticatedProfile || ctx?.session?.authenticatedIdentifier;
   if (user) {
     if (!options.navLinks) {
       options.navLinks = [];
     }
-    const logoutRedirect = ctx && ctx.url ? `?r=${encodeURIComponent(ctx.url)}` : '';
-    const logoutPath = (pagePathLevel > 0) ? `${'../'.repeat(pagePathLevel - 1)}` : 'admin/';
+    const logoutRedirect = ctx?.url ? `?r=${encodeURIComponent(ctx.url)}` : '';
+    const adminPath = (pagePathLevel > 0) ? `${'../'.repeat(pagePathLevel - 1)}` : 'admin/';
     options.navLinks.push({
       text: `Logout (${user})`,
-      href: `${logoutPath}logout${logoutRedirect}`,
+      href: `${adminPath}logout${logoutRedirect}`,
+    }, {
+      text: 'Settings',
+      href: `${adminPath}settings`,
     });
   }
 
index ec7ab5da605315edb2cee3647c938b696944c8f7..75481adfee0b010330cc89a39656fd7f28e862ef 100644 (file)
@@ -16,9 +16,7 @@ describe('Template Helper', function () {
   beforeEach(function () {
     pagePathLevel = 2;
     ctx = {};
-    options = {
-      pageTitle: 'Test Page',
-    };
+    options = {};
   });
 
   describe('initContext', function () {
@@ -264,7 +262,15 @@ describe('Template Helper', function () {
   describe('htmlPage', function () {
     let main;
     beforeEach(function () {
-      main = [];
+      th.initContext(ctx);
+      ctx.errors.push('an error');
+      ctx.notifications.push('a notice');
+      options.headElements = ['<link rel="author" href="https://example.com/">'];
+      options.pageTitle = 'Test Page';
+      main = [
+        th.UL(['an item', 'another item']),
+        th.timeElement(new Date(), { title: 'now' }),
+      ];
     });
     it('covers', async function () {
       const result = th.htmlPage(pagePathLevel, ctx, options, main);