Skip to content

Commit 35e6fe0

Browse files
authored
Merge pull request #336 from NanaKhadija1980j/feat/env-Implement-Notification
feat(#168): implement notification search experience
2 parents 009f5e8 + cc2319a commit 35e6fe0

9 files changed

Lines changed: 837 additions & 0 deletions

File tree

dashboard/reports/wallet-integration.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"generatedAt": "2026-06-26T13:01:40.990Z",
23
"generatedAt": "2026-06-27T12:47:07.864Z",
34
"total": 3,
45
"passed": 3,

dashboard/src/App.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ type Tab = 'explorer' | 'timeline' | 'templates';
132132
import { ActivityFeed } from './components/ActivityFeed';
133133
import { WebhookDashboardPage } from './pages/WebhookDashboardPage';
134134
import { ExportHistoryPage } from './pages/ExportHistoryPage';
135+
import { NotificationSearchPage } from './pages/NotificationSearchPage';
135136

137+
type Tab = 'explorer' | 'timeline' | 'activity' | 'export-history' | 'search';
136138
type Tab = 'explorer' | 'timeline' | 'activity' | 'webhooks' | 'export-history';
137139

138140
export function App() {
@@ -193,13 +195,22 @@ export function App() {
193195
>
194196
Export History
195197
</button>
198+
<button
199+
role="tab"
200+
aria-selected={tab === 'search'}
201+
className={`app-tabs__btn${tab === 'search' ? ' app-tabs__btn--active' : ''}`}
202+
onClick={() => setTab('search')}
203+
>
204+
Notification Search
205+
</button>
196206
</nav>
197207

198208
{tab === 'explorer' && <EventExplorerPage />}
199209
{tab === 'timeline' && <NotificationTimelineView />}
200210
{tab === 'activity' && <ActivityFeed />}
201211
{tab === 'webhooks' && <WebhookDashboardPage />}
202212
{tab === 'export-history' && <ExportHistoryPage />}
213+
{tab === 'search' && <NotificationSearchPage />}
203214
</div>
204215
);
205216
}

dashboard/src/index.css

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4686,3 +4686,202 @@ body {
46864686
}
46874687
}
46884688

4689+
/* ── Notification Search Page ──────────────────────────────────────────────── */
4690+
4691+
.notif-search-page {
4692+
max-width: 1100px;
4693+
margin: 0 auto;
4694+
padding: 24px;
4695+
}
4696+
4697+
.notif-search-page__header {
4698+
margin-bottom: 24px;
4699+
}
4700+
4701+
.notif-search-page__header h1 {
4702+
margin: 4px 0 8px;
4703+
font-size: 1.75rem;
4704+
}
4705+
4706+
.notif-search-form {
4707+
background: rgba(255,255,255,0.03);
4708+
border: 1px solid rgba(255,255,255,0.08);
4709+
border-radius: 12px;
4710+
padding: 16px;
4711+
margin-bottom: 24px;
4712+
}
4713+
4714+
.notif-search-form__row {
4715+
display: grid;
4716+
grid-template-columns: 2fr repeat(5, 1fr);
4717+
gap: 12px;
4718+
align-items: end;
4719+
}
4720+
4721+
.notif-search-form__group {
4722+
display: flex;
4723+
flex-direction: column;
4724+
gap: 6px;
4725+
}
4726+
4727+
.notif-search-form__group--wide {
4728+
grid-column: span 2;
4729+
}
4730+
4731+
.notif-search-form__label {
4732+
font-size: 0.82rem;
4733+
color: #9aa0a6;
4734+
font-weight: 500;
4735+
}
4736+
4737+
.notif-search-form__input {
4738+
background: rgba(255,255,255,0.05);
4739+
border: 1px solid rgba(255,255,255,0.12);
4740+
border-radius: 8px;
4741+
color: #e8eaed;
4742+
font-size: 0.9rem;
4743+
padding: 8px 12px;
4744+
outline: none;
4745+
width: 100%;
4746+
}
4747+
4748+
.notif-search-form__input:focus {
4749+
border-color: #4a9eff;
4750+
}
4751+
4752+
.notif-search-page__status {
4753+
color: #9aa0a6;
4754+
padding: 8px 0;
4755+
}
4756+
4757+
.notif-search-page__empty {
4758+
text-align: center;
4759+
padding: 64px 24px;
4760+
color: #9aa0a6;
4761+
}
4762+
4763+
.notif-search-page__empty h2 {
4764+
margin: 0 0 8px;
4765+
font-size: 1.25rem;
4766+
color: #e8eaed;
4767+
}
4768+
4769+
.notif-search-page__empty p {
4770+
margin: 0;
4771+
}
4772+
4773+
.notif-search-results {
4774+
display: flex;
4775+
flex-direction: column;
4776+
gap: 12px;
4777+
margin-top: 16px;
4778+
}
4779+
4780+
.notif-result-card {
4781+
background: rgba(255,255,255,0.03);
4782+
border: 1px solid rgba(255,255,255,0.08);
4783+
border-radius: 10px;
4784+
padding: 14px 16px;
4785+
}
4786+
4787+
.notif-result-card__header {
4788+
display: flex;
4789+
gap: 8px;
4790+
align-items: center;
4791+
margin-bottom: 10px;
4792+
flex-wrap: wrap;
4793+
}
4794+
4795+
.notif-result-card__source {
4796+
font-size: 0.75rem;
4797+
padding: 2px 8px;
4798+
border-radius: 4px;
4799+
font-weight: 600;
4800+
text-transform: uppercase;
4801+
letter-spacing: 0.04em;
4802+
}
4803+
4804+
.notif-result-card__source--scheduled { background: rgba(74,158,255,0.15); color: #4a9eff; }
4805+
.notif-result-card__source--processed { background: rgba(52,211,153,0.15); color: #34d399; }
4806+
4807+
.notif-result-card__status {
4808+
font-size: 0.75rem;
4809+
padding: 2px 8px;
4810+
border-radius: 4px;
4811+
font-weight: 600;
4812+
text-transform: uppercase;
4813+
}
4814+
4815+
.notif-result-card__status--completed,
4816+
.notif-result-card__status--processed { background: rgba(52,211,153,0.1); color: #34d399; }
4817+
.notif-result-card__status--pending { background: rgba(251,191,36,0.1); color: #fbbf24; }
4818+
.notif-result-card__status--failed { background: rgba(239,68,68,0.1); color: #ef4444; }
4819+
.notif-result-card__status--processing { background: rgba(74,158,255,0.1); color: #4a9eff; }
4820+
.notif-result-card__status--cancelled { background: rgba(156,163,175,0.1); color: #9ca3af; }
4821+
4822+
.notif-result-card__type {
4823+
font-size: 0.75rem;
4824+
color: #9aa0a6;
4825+
padding: 2px 8px;
4826+
border: 1px solid rgba(255,255,255,0.1);
4827+
border-radius: 4px;
4828+
}
4829+
4830+
.notif-result-card__fields {
4831+
display: grid;
4832+
grid-template-columns: auto 1fr;
4833+
gap: 4px 16px;
4834+
margin: 0;
4835+
font-size: 0.85rem;
4836+
}
4837+
4838+
.notif-result-card__fields dt {
4839+
color: #9aa0a6;
4840+
white-space: nowrap;
4841+
}
4842+
4843+
.notif-result-card__fields dd {
4844+
margin: 0;
4845+
color: #e8eaed;
4846+
overflow: hidden;
4847+
text-overflow: ellipsis;
4848+
white-space: nowrap;
4849+
}
4850+
4851+
.notif-result-card__fields code {
4852+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
4853+
font-size: 0.8rem;
4854+
color: #a5d6ff;
4855+
}
4856+
4857+
.notif-search-page__pagination {
4858+
display: flex;
4859+
align-items: center;
4860+
justify-content: center;
4861+
gap: 16px;
4862+
margin-top: 24px;
4863+
}
4864+
4865+
.pagination__info {
4866+
color: #9aa0a6;
4867+
font-size: 0.9rem;
4868+
}
4869+
4870+
@media (max-width: 768px) {
4871+
.notif-search-form__row {
4872+
grid-template-columns: 1fr 1fr;
4873+
}
4874+
4875+
.notif-search-form__group--wide {
4876+
grid-column: span 2;
4877+
}
4878+
4879+
.notif-result-card__fields {
4880+
grid-template-columns: 1fr;
4881+
}
4882+
4883+
.notif-result-card__fields dt {
4884+
font-weight: 600;
4885+
margin-top: 6px;
4886+
}
4887+
}

0 commit comments

Comments
 (0)