@glamcor/dna-shared-nav 1.0.3 → 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.
@@ -1 +1 @@
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,2CAoDhB"}
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,17 +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: 'Heat', href: process.env.NEXT_PUBLIC_DNA_HEAT_URL || '/heat' },
12
- { name: 'Methane', href: process.env.NEXT_PUBLIC_DNA_METHANE_URL || '/methane' },
13
- { name: 'Hydrogen', href: process.env.NEXT_PUBLIC_DNA_HYDROGEN_URL || '/hydrogen' },
14
- { name: 'Oxygen', href: process.env.NEXT_PUBLIC_DNA_OXYGEN_URL || '/oxygen' },
15
- { name: 'Ammonia', href: process.env.NEXT_PUBLIC_DNA_AMMONIA_URL || '/ammonia' },
16
- { name: 'Carbon', href: process.env.NEXT_PUBLIC_DNA_CARBON_URL || '/carbon' },
17
- { name: 'Lightning', href: process.env.NEXT_PUBLIC_DNA_LIGHTNING_URL || '/lightning' },
18
- { name: 'CRUSH', href: process.env.NEXT_PUBLIC_DNA_CRUSH_URL || '/crush' },
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' },
19
19
  ];
20
20
  const ROLE_HIERARCHY = ['viewer', 'editor', 'admin', 'superadmin'];
21
21
  function hasPermission(userRole, requiredRole) {
@@ -35,11 +35,17 @@ function getUserInitials(name) {
35
35
  }
36
36
  export function DNAHeader({ user, currentApp = 'Dashboard', items = DEFAULT_NAV_ITEMS, logoSrc, onLogout, }) {
37
37
  const visibleItems = items.filter((item) => {
38
- if (!item.requiredRole)
39
- return true;
40
- if (!user)
41
- return false;
42
- return hasPermission(user.role, item.requiredRole);
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;
43
49
  });
44
50
  // Use provided logoSrc, or fall back to CDN URL
45
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 {
@@ -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;CACjB;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,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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glamcor/dna-shared-nav",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Shared navigation component for DNA microsites",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
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