diff --git a/src/apps/dashboard/static/apps/dashboard/recognition.js b/src/apps/dashboard/static/apps/dashboard/recognition.js new file mode 100644 index 0000000..f4f891c --- /dev/null +++ b/src/apps/dashboard/static/apps/dashboard/recognition.js @@ -0,0 +1,49 @@ +const Recognition = (() => { + 'use strict'; + + function showBanner(recognition) { + if (!recognition) return; + + const earned = new Date(recognition.earned_at); + const dateStr = earned.toLocaleDateString(undefined, { + year: 'numeric', month: 'short', day: 'numeric', + }); + + const banner = document.createElement('div'); + banner.className = 'recog-banner'; + banner.innerHTML = + '
' + + '' + + '' + + 'FYI'; + + banner.querySelector('.recog-banner__nvm').addEventListener('click', function () { + banner.remove(); + }); + + var h2 = document.querySelector('h2'); + if (h2 && h2.parentNode) { + h2.parentNode.insertBefore(banner, h2.nextSibling); + } else { + document.body.insertBefore(banner, document.body.firstChild); + } + } + + function handleSaveResponse(data) { + showBanner(data && data.recognition); + } + + function _esc(str) { + var d = document.createElement('div'); + d.textContent = str || ''; + return d.innerHTML; + } + + return { showBanner: showBanner, handleSaveResponse: handleSaveResponse }; +})(); diff --git a/src/static/tests/RecognitionSpec.js b/src/static/tests/RecognitionSpec.js new file mode 100644 index 0000000..740006f --- /dev/null +++ b/src/static/tests/RecognitionSpec.js @@ -0,0 +1,143 @@ +// ── RecognitionSpec.js ──────────────────────────────────────────────────────── +// +// Unit specs for recognition.js — banner injection from sky/save response. +// +// DOM contract assumed by showBanner(): +// Any