@glamcor/dna-shared-nav 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DNAHeader.d.ts.map +1 -1
- package/dist/DNAHeader.js +22 -15
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/README.md +0 -190
package/dist/DNAHeader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DNAHeader.d.ts","sourceRoot":"","sources":["../src/DNAHeader.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DNAHeader.d.ts","sourceRoot":"","sources":["../src/DNAHeader.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AAsCrD,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,UAAwB,EACxB,KAAyB,EACzB,OAAO,EACP,QAAQ,GACT,EAAE,cAAc,2CAyDhB"}
|
package/dist/DNAHeader.js
CHANGED
|
@@ -5,16 +5,17 @@ import { AvatarMenu } from './AvatarMenu';
|
|
|
5
5
|
const DNA_LOGO_URL = 'https://dscoblw2zo8x9.cloudfront.net/assets/1770003640504-w0rs6vl-DNA_LOGO.png';
|
|
6
6
|
const DEFAULT_NAV_ITEMS = [
|
|
7
7
|
{ name: 'Dashboard', href: process.env.NEXT_PUBLIC_DNA_DASHBOARD_URL || '/' },
|
|
8
|
-
{ name: 'SPOT', href: process.env.NEXT_PUBLIC_SPOT_URL || '/spot' },
|
|
9
|
-
{ name: 'Nitrogen', href: process.env.NEXT_PUBLIC_DNA_NITROGEN_URL || '/nitrogen' },
|
|
10
|
-
{ name: 'Water', href: process.env.NEXT_PUBLIC_DNA_WATER_URL || '/water' },
|
|
11
|
-
{ name: '
|
|
12
|
-
{ name: '
|
|
13
|
-
{ name: '
|
|
14
|
-
{ name: '
|
|
15
|
-
{ name: '
|
|
16
|
-
{ name: '
|
|
17
|
-
{ name: '
|
|
8
|
+
{ name: 'SPOT', href: process.env.NEXT_PUBLIC_SPOT_URL || '/spot', appKey: 'spot' },
|
|
9
|
+
{ name: 'Nitrogen', href: process.env.NEXT_PUBLIC_DNA_NITROGEN_URL || '/nitrogen', appKey: 'nitrogen' },
|
|
10
|
+
{ name: 'Water', href: process.env.NEXT_PUBLIC_DNA_WATER_URL || '/water', appKey: 'water' },
|
|
11
|
+
{ name: 'Heat', href: process.env.NEXT_PUBLIC_DNA_HEAT_URL || '/heat', appKey: 'heat' },
|
|
12
|
+
{ name: 'Methane', href: process.env.NEXT_PUBLIC_DNA_METHANE_URL || '/methane', appKey: 'methane' },
|
|
13
|
+
{ name: 'Hydrogen', href: process.env.NEXT_PUBLIC_DNA_HYDROGEN_URL || '/hydrogen', appKey: 'hydrogen' },
|
|
14
|
+
{ name: 'Oxygen', href: process.env.NEXT_PUBLIC_DNA_OXYGEN_URL || '/oxygen', appKey: 'oxygen' },
|
|
15
|
+
{ name: 'Ammonia', href: process.env.NEXT_PUBLIC_DNA_AMMONIA_URL || '/ammonia', appKey: 'ammonia' },
|
|
16
|
+
{ name: 'Carbon', href: process.env.NEXT_PUBLIC_DNA_CARBON_URL || '/carbon', appKey: 'carbon' },
|
|
17
|
+
{ name: 'Lightning', href: process.env.NEXT_PUBLIC_DNA_LIGHTNING_URL || '/lightning', appKey: 'lightning' },
|
|
18
|
+
{ name: 'CRUSH', href: process.env.NEXT_PUBLIC_DNA_CRUSH_URL || '/crush', appKey: 'crush' },
|
|
18
19
|
];
|
|
19
20
|
const ROLE_HIERARCHY = ['viewer', 'editor', 'admin', 'superadmin'];
|
|
20
21
|
function hasPermission(userRole, requiredRole) {
|
|
@@ -34,11 +35,17 @@ function getUserInitials(name) {
|
|
|
34
35
|
}
|
|
35
36
|
export function DNAHeader({ user, currentApp = 'Dashboard', items = DEFAULT_NAV_ITEMS, logoSrc, onLogout, }) {
|
|
36
37
|
const visibleItems = items.filter((item) => {
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
if (item.requiredRole) {
|
|
39
|
+
if (!user)
|
|
40
|
+
return false;
|
|
41
|
+
if (!hasPermission(user.role, item.requiredRole))
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (item.appKey && user?.appAccess && user.appAccess.length > 0 && user.role !== 'superadmin') {
|
|
45
|
+
if (!user.appAccess.includes(item.appKey))
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
42
49
|
});
|
|
43
50
|
// Use provided logoSrc, or fall back to CDN URL
|
|
44
51
|
const logoSource = logoSrc || DNA_LOGO_URL;
|
package/dist/types.d.ts
CHANGED
|
@@ -4,11 +4,13 @@ export interface DNAUser {
|
|
|
4
4
|
name: string;
|
|
5
5
|
role?: 'superadmin' | 'admin' | 'editor' | 'viewer';
|
|
6
6
|
avatar?: string;
|
|
7
|
+
appAccess?: string[];
|
|
7
8
|
}
|
|
8
9
|
export interface DNANavItem {
|
|
9
10
|
name: string;
|
|
10
11
|
href: string;
|
|
11
12
|
requiredRole?: 'viewer' | 'editor' | 'admin' | 'superadmin';
|
|
13
|
+
appKey?: string;
|
|
12
14
|
hasNotification?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export interface AppSubnavItem {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC"}
|
package/package.json
CHANGED
package/README.md
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
# @glamcor/dna-shared-nav
|
|
2
|
-
|
|
3
|
-
Shared navigation component for DNA microsites. Provides a consistent two-row navigation across all DNA applications.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @glamcor/dna-shared-nav
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Usage
|
|
12
|
-
|
|
13
|
-
```tsx
|
|
14
|
-
import { DNANavigation } from '@glamcor/dna-shared-nav';
|
|
15
|
-
import '@glamcor/dna-shared-nav/dist/styles.css';
|
|
16
|
-
|
|
17
|
-
export default function Layout({ children }) {
|
|
18
|
-
const user = {
|
|
19
|
-
id: '1',
|
|
20
|
-
name: 'John Doe',
|
|
21
|
-
email: 'john@example.com',
|
|
22
|
-
role: 'admin',
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<>
|
|
27
|
-
<DNANavigation
|
|
28
|
-
user={user}
|
|
29
|
-
currentApp="Water"
|
|
30
|
-
appName="Water"
|
|
31
|
-
subnavItems={[
|
|
32
|
-
{ name: 'Dashboard', href: '/admin', isActive: true },
|
|
33
|
-
{ name: 'Customers', href: '/admin/customers' },
|
|
34
|
-
{ name: 'Jobs', href: '/admin/jobs' },
|
|
35
|
-
]}
|
|
36
|
-
pinnedJobs={[
|
|
37
|
-
{
|
|
38
|
-
id: '1',
|
|
39
|
-
appName: 'Water',
|
|
40
|
-
jobName: 'Q4 Enrichment',
|
|
41
|
-
progress: 59,
|
|
42
|
-
appColor: '#38bdf8',
|
|
43
|
-
},
|
|
44
|
-
]}
|
|
45
|
-
onUnpinJob={(id) => console.log('Unpin:', id)}
|
|
46
|
-
onLogout={() => signOut()}
|
|
47
|
-
/>
|
|
48
|
-
<main>{children}</main>
|
|
49
|
-
</>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Components
|
|
55
|
-
|
|
56
|
-
### DNANavigation
|
|
57
|
-
|
|
58
|
-
Main wrapper that renders both the header and app subnav.
|
|
59
|
-
|
|
60
|
-
| Prop | Type | Required | Description |
|
|
61
|
-
|------|------|----------|-------------|
|
|
62
|
-
| `user` | `DNAUser \| null` | Yes | Current user object |
|
|
63
|
-
| `currentApp` | `string` | No | Name of active app in header nav |
|
|
64
|
-
| `appName` | `string` | Yes | Name shown in subnav |
|
|
65
|
-
| `headerItems` | `DNANavItem[]` | No | Override default header nav items |
|
|
66
|
-
| `subnavItems` | `AppSubnavItem[]` | Yes | App-specific subnav links |
|
|
67
|
-
| `pinnedJobs` | `PinnedJob[]` | No | Jobs to show in pinned area |
|
|
68
|
-
| `logoSrc` | `string` | No | Custom logo URL (defaults to CloudFront CDN) |
|
|
69
|
-
| `onLogout` | `() => void` | No | Logout handler |
|
|
70
|
-
| `onUnpinJob` | `(id: string) => void` | No | Handler for unpinning jobs |
|
|
71
|
-
|
|
72
|
-
### DNAHeader
|
|
73
|
-
|
|
74
|
-
Just the top header bar (logo, inter-app nav, avatar).
|
|
75
|
-
|
|
76
|
-
### AppSubnav
|
|
77
|
-
|
|
78
|
-
Just the second row (app name, pages, pinned jobs).
|
|
79
|
-
|
|
80
|
-
### AvatarMenu
|
|
81
|
-
|
|
82
|
-
Standalone avatar dropdown component.
|
|
83
|
-
|
|
84
|
-
### PinnedJobs
|
|
85
|
-
|
|
86
|
-
Standalone pinned jobs carousel.
|
|
87
|
-
|
|
88
|
-
## Default Nav Items
|
|
89
|
-
|
|
90
|
-
The header includes these nav links by default:
|
|
91
|
-
|
|
92
|
-
| Name | Environment Variable |
|
|
93
|
-
|------|---------------------|
|
|
94
|
-
| Dashboard | `NEXT_PUBLIC_DNA_DASHBOARD_URL` |
|
|
95
|
-
| SPOT | `NEXT_PUBLIC_SPOT_URL` |
|
|
96
|
-
| Nitrogen | `NEXT_PUBLIC_DNA_NITROGEN_URL` |
|
|
97
|
-
| Water | `NEXT_PUBLIC_DNA_WATER_URL` |
|
|
98
|
-
| Methane | `NEXT_PUBLIC_DNA_METHANE_URL` |
|
|
99
|
-
| Hydrogen | `NEXT_PUBLIC_DNA_HYDROGEN_URL` |
|
|
100
|
-
| Oxygen | `NEXT_PUBLIC_DNA_OXYGEN_URL` |
|
|
101
|
-
| Ammonia | `NEXT_PUBLIC_DNA_AMMONIA_URL` |
|
|
102
|
-
| Carbon | `NEXT_PUBLIC_DNA_CARBON_URL` |
|
|
103
|
-
| Lightning | `NEXT_PUBLIC_DNA_LIGHTNING_URL` |
|
|
104
|
-
| CRUSH | `NEXT_PUBLIC_DNA_CRUSH_URL` |
|
|
105
|
-
|
|
106
|
-
## Logo
|
|
107
|
-
|
|
108
|
-
The logo defaults to the CloudFront CDN URL. To use a custom logo:
|
|
109
|
-
|
|
110
|
-
```tsx
|
|
111
|
-
<DNANavigation
|
|
112
|
-
logoSrc="/your-custom-logo.png"
|
|
113
|
-
// ... other props
|
|
114
|
-
/>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Environment Variables
|
|
118
|
-
|
|
119
|
-
Configure inter-app navigation URLs in your `.env.local`:
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
NEXT_PUBLIC_DNA_DASHBOARD_URL=https://dna-dashboard.vercel.app
|
|
123
|
-
NEXT_PUBLIC_SPOT_URL=https://spot.vercel.app
|
|
124
|
-
NEXT_PUBLIC_DNA_NITROGEN_URL=https://dna-nitrogen.vercel.app
|
|
125
|
-
NEXT_PUBLIC_DNA_WATER_URL=https://dna-water.vercel.app
|
|
126
|
-
NEXT_PUBLIC_DNA_METHANE_URL=https://dna-methane.vercel.app
|
|
127
|
-
NEXT_PUBLIC_DNA_HYDROGEN_URL=https://dna-hydrogen.vercel.app
|
|
128
|
-
NEXT_PUBLIC_DNA_OXYGEN_URL=https://dna-oxygen.vercel.app
|
|
129
|
-
NEXT_PUBLIC_DNA_AMMONIA_URL=https://dna-ammonia.vercel.app
|
|
130
|
-
NEXT_PUBLIC_DNA_CARBON_URL=https://dna-carbon.vercel.app
|
|
131
|
-
NEXT_PUBLIC_DNA_LIGHTNING_URL=https://dna-lightning.vercel.app
|
|
132
|
-
NEXT_PUBLIC_DNA_CRUSH_URL=https://dna-crush.vercel.app
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Development
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
# Install dependencies
|
|
139
|
-
npm install
|
|
140
|
-
|
|
141
|
-
# Build
|
|
142
|
-
npm run build
|
|
143
|
-
|
|
144
|
-
# Watch mode
|
|
145
|
-
npm run dev
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
## Types
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
interface DNAUser {
|
|
152
|
-
id: string;
|
|
153
|
-
email: string;
|
|
154
|
-
name: string;
|
|
155
|
-
role?: 'superadmin' | 'admin' | 'editor' | 'viewer';
|
|
156
|
-
avatar?: string;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
interface DNANavItem {
|
|
160
|
-
name: string;
|
|
161
|
-
href: string;
|
|
162
|
-
requiredRole?: 'viewer' | 'editor' | 'admin' | 'superadmin';
|
|
163
|
-
hasNotification?: boolean;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
interface AppSubnavItem {
|
|
167
|
-
name: string;
|
|
168
|
-
href: string;
|
|
169
|
-
isActive?: boolean;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
interface PinnedJob {
|
|
173
|
-
id: string;
|
|
174
|
-
appName: string;
|
|
175
|
-
appColor?: string;
|
|
176
|
-
jobName: string;
|
|
177
|
-
progress: number;
|
|
178
|
-
meta?: string;
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Changelog
|
|
183
|
-
|
|
184
|
-
### 1.0.2
|
|
185
|
-
- Updated nav items: SPOT, Nitrogen, Water, Methane, Hydrogen, Oxygen, Ammonia, Carbon, Lightning, CRUSH
|
|
186
|
-
- Logo now defaults to CloudFront CDN URL
|
|
187
|
-
- Fixed installation instructions for npm
|
|
188
|
-
|
|
189
|
-
### 1.0.1
|
|
190
|
-
- Initial npm publish
|