@licklist/design 0.78.5-dev.69 → 0.78.5-dev.70
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/styles/themes/bookedit/_fonts.scss +2 -0
- package/dist/v2/components/ActionMenu/ActionMenu.d.ts.map +1 -1
- package/dist/v2/components/ActionMenu/ActionMenu.js +5 -3
- package/dist/v2/components/AvatarUpload/AvatarUpload.d.ts +12 -0
- package/dist/v2/components/AvatarUpload/AvatarUpload.d.ts.map +1 -0
- package/dist/v2/components/AvatarUpload/index.d.ts +2 -0
- package/dist/v2/components/AvatarUpload/index.d.ts.map +1 -0
- package/dist/v2/components/Button/Button.d.ts +1 -1
- package/dist/v2/components/Button/Button.d.ts.map +1 -1
- package/dist/v2/components/Button/Button.scss.js +1 -1
- package/dist/v2/components/DataTable/DataTable.d.ts +41 -0
- package/dist/v2/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/v2/components/DataTable/index.d.ts +3 -0
- package/dist/v2/components/DataTable/index.d.ts.map +1 -0
- package/dist/v2/components/EmptyState/EmptyState.d.ts +14 -0
- package/dist/v2/components/EmptyState/EmptyState.d.ts.map +1 -0
- package/dist/v2/components/EmptyState/index.d.ts +3 -0
- package/dist/v2/components/EmptyState/index.d.ts.map +1 -0
- package/dist/v2/components/FormField/FormField.scss.js +1 -1
- package/dist/v2/components/InfoGrid/InfoGrid.d.ts +13 -0
- package/dist/v2/components/InfoGrid/InfoGrid.d.ts.map +1 -0
- package/dist/v2/components/InfoGrid/index.d.ts +2 -0
- package/dist/v2/components/InfoGrid/index.d.ts.map +1 -0
- package/dist/v2/components/NewTable/NewTable.scss.js +1 -1
- package/dist/v2/components/RadioCard/RadioCard.d.ts +17 -0
- package/dist/v2/components/RadioCard/RadioCard.d.ts.map +1 -0
- package/dist/v2/components/RadioCard/index.d.ts +2 -0
- package/dist/v2/components/RadioCard/index.d.ts.map +1 -0
- package/dist/v2/components/StatusBadge/StatusBadge.d.ts +8 -0
- package/dist/v2/components/StatusBadge/StatusBadge.d.ts.map +1 -0
- package/dist/v2/components/StatusBadge/index.d.ts +3 -0
- package/dist/v2/components/StatusBadge/index.d.ts.map +1 -0
- package/dist/v2/components/StepIndicator/StepIndicator.d.ts +9 -0
- package/dist/v2/components/StepIndicator/StepIndicator.d.ts.map +1 -0
- package/dist/v2/components/StepIndicator/index.d.ts +2 -0
- package/dist/v2/components/StepIndicator/index.d.ts.map +1 -0
- package/dist/v2/components/TableControls/TableControls.d.ts +28 -0
- package/dist/v2/components/TableControls/TableControls.d.ts.map +1 -0
- package/dist/v2/components/TableControls/index.d.ts +3 -0
- package/dist/v2/components/TableControls/index.d.ts.map +1 -0
- package/dist/v2/components/Tabs/Tabs.d.ts +15 -0
- package/dist/v2/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/v2/components/Tabs/index.d.ts +3 -0
- package/dist/v2/components/Tabs/index.d.ts.map +1 -0
- package/dist/v2/icons/index.d.ts +42 -0
- package/dist/v2/icons/index.d.ts.map +1 -1
- package/dist/v2/index.d.ts +18 -0
- package/dist/v2/index.d.ts.map +1 -1
- package/dist/v2/pages/CreateUser/CreateUserPage.d.ts +110 -0
- package/dist/v2/pages/CreateUser/CreateUserPage.d.ts.map +1 -0
- package/dist/v2/pages/CreateUser/index.d.ts +3 -0
- package/dist/v2/pages/CreateUser/index.d.ts.map +1 -0
- package/dist/v2/pages/RoleSelection/RoleSelectionPage.d.ts +26 -0
- package/dist/v2/pages/RoleSelection/RoleSelectionPage.d.ts.map +1 -0
- package/dist/v2/pages/RoleSelection/index.d.ts +3 -0
- package/dist/v2/pages/RoleSelection/index.d.ts.map +1 -0
- package/dist/v2/pages/UserDetails/UserDetailsPage.d.ts +37 -0
- package/dist/v2/pages/UserDetails/UserDetailsPage.d.ts.map +1 -0
- package/dist/v2/pages/UserDetails/index.d.ts +3 -0
- package/dist/v2/pages/UserDetails/index.d.ts.map +1 -0
- package/dist/v2/pages/auth/CreatePassword/CreatePasswordPage.d.ts.map +1 -1
- package/dist/v2/pages/auth/Login/LoginPage.d.ts.map +1 -1
- package/dist/v2/pages/auth/ResetPassword/ResetPasswordPage.d.ts.map +1 -1
- package/dist/v2/styles/components/Button.scss +27 -0
- package/package.json +2 -2
- package/src/styles/themes/bookedit/_fonts.scss +2 -0
- package/src/v2/components/ActionMenu/ActionMenu.tsx +4 -2
- package/src/v2/components/AvatarUpload/AvatarUpload.scss +68 -0
- package/src/v2/components/AvatarUpload/AvatarUpload.stories.tsx +83 -0
- package/src/v2/components/AvatarUpload/AvatarUpload.tsx +69 -0
- package/src/v2/components/AvatarUpload/index.ts +1 -0
- package/src/v2/components/Button/Button.tsx +1 -0
- package/src/v2/components/DataTable/DataTable.scss +181 -0
- package/src/v2/components/DataTable/DataTable.tsx +256 -0
- package/src/v2/components/DataTable/index.ts +7 -0
- package/src/v2/components/EmptyState/EmptyState.scss +39 -0
- package/src/v2/components/EmptyState/EmptyState.stories.tsx +45 -0
- package/src/v2/components/EmptyState/EmptyState.tsx +37 -0
- package/src/v2/components/EmptyState/index.ts +2 -0
- package/src/v2/components/FormField/FormField.scss +12 -0
- package/src/v2/components/InfoGrid/InfoGrid.scss +51 -0
- package/src/v2/components/InfoGrid/InfoGrid.stories.tsx +76 -0
- package/src/v2/components/InfoGrid/InfoGrid.tsx +28 -0
- package/src/v2/components/InfoGrid/index.ts +1 -0
- package/src/v2/components/NewTable/NewTable.scss +4 -4
- package/src/v2/components/RadioCard/RadioCard.scss +76 -0
- package/src/v2/components/RadioCard/RadioCard.stories.tsx +115 -0
- package/src/v2/components/RadioCard/RadioCard.tsx +68 -0
- package/src/v2/components/RadioCard/index.ts +1 -0
- package/src/v2/components/StatusBadge/StatusBadge.scss +53 -0
- package/src/v2/components/StatusBadge/StatusBadge.tsx +31 -0
- package/src/v2/components/StatusBadge/index.ts +2 -0
- package/src/v2/components/StepIndicator/StepIndicator.scss +62 -0
- package/src/v2/components/StepIndicator/StepIndicator.stories.tsx +37 -0
- package/src/v2/components/StepIndicator/StepIndicator.tsx +41 -0
- package/src/v2/components/StepIndicator/index.ts +1 -0
- package/src/v2/components/TableControls/TableControls.scss +63 -0
- package/src/v2/components/TableControls/TableControls.tsx +110 -0
- package/src/v2/components/TableControls/index.ts +7 -0
- package/src/v2/components/Tabs/Tabs.scss +36 -0
- package/src/v2/components/Tabs/Tabs.stories.tsx +75 -0
- package/src/v2/components/Tabs/Tabs.tsx +52 -0
- package/src/v2/components/Tabs/index.ts +2 -0
- package/src/v2/icons/index.tsx +219 -0
- package/src/v2/index.ts +98 -0
- package/src/v2/pages/CreateUser/CreateUserPage.scss +760 -0
- package/src/v2/pages/CreateUser/CreateUserPage.stories.tsx +157 -0
- package/src/v2/pages/CreateUser/CreateUserPage.tsx +1062 -0
- package/src/v2/pages/CreateUser/index.ts +13 -0
- package/src/v2/pages/RoleSelection/RoleSelectionPage.scss +193 -0
- package/src/v2/pages/RoleSelection/RoleSelectionPage.stories.tsx +112 -0
- package/src/v2/pages/RoleSelection/RoleSelectionPage.tsx +127 -0
- package/src/v2/pages/RoleSelection/index.ts +2 -0
- package/src/v2/pages/UserDetails/UserDetailsPage.scss +236 -0
- package/src/v2/pages/UserDetails/UserDetailsPage.stories.tsx +84 -0
- package/src/v2/pages/UserDetails/UserDetailsPage.tsx +210 -0
- package/src/v2/pages/UserDetails/index.ts +2 -0
- package/src/v2/pages/auth/AuthLayout/AuthLayout.scss +8 -6
- package/src/v2/pages/auth/CreatePassword/CreatePasswordPage.tsx +1 -3
- package/src/v2/pages/auth/Login/LoginPage.tsx +1 -3
- package/src/v2/pages/auth/ResetPassword/ResetPasswordPage.scss +2 -0
- package/src/v2/pages/auth/ResetPassword/ResetPasswordPage.tsx +1 -2
- package/src/v2/styles/components/Button.scss +27 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
3
|
+
import { CreateUserPage } from './CreateUserPage'
|
|
4
|
+
import type { ExistingUser, EntityResult, VenueAssignment } from './CreateUserPage'
|
|
5
|
+
|
|
6
|
+
// ─── Mock data ────────────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
const mockExistingUser: ExistingUser = {
|
|
9
|
+
id: 'usr-001',
|
|
10
|
+
fullName: 'Jane Smith',
|
|
11
|
+
email: 'jane.smith@example.com',
|
|
12
|
+
userNumber: 1042,
|
|
13
|
+
assignments: [
|
|
14
|
+
{ id: 'venue-001', name: 'The Grand Arena', type: 'venue', friendlyId: 'V-10203', role: 'admin' },
|
|
15
|
+
{ id: 'company-001', name: 'Events Co.', type: 'company', friendlyId: 'C-7890', role: 'manager' },
|
|
16
|
+
],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const mockEntityResults: EntityResult[] = [
|
|
20
|
+
{ id: 'venue-002', name: 'Sunset Pavilion', type: 'venue', friendlyId: 'V-20101' },
|
|
21
|
+
{ id: 'company-002', name: 'Live Events Group', type: 'company', friendlyId: 'C-5501' },
|
|
22
|
+
{ id: 'venue-003', name: 'City Bowl Stadium', type: 'venue', friendlyId: 'V-30302' },
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
const mockNestedProviders: EntityResult[] = [
|
|
26
|
+
{ id: 'venue-004', name: 'North Wing Venue', type: 'venue', friendlyId: 'V-40101' },
|
|
27
|
+
{ id: 'venue-005', name: 'South Hall', type: 'venue', friendlyId: 'V-40202' },
|
|
28
|
+
{ id: 'promo-001', name: 'Live Events Promoter', type: 'promoter', friendlyId: 'P-40303' },
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
const mockVenues: VenueAssignment[] = [
|
|
32
|
+
{ id: 'venue-101', name: 'Main Arena', type: 'venue', friendlyId: 'V-1001', role: 'admin', selected: true },
|
|
33
|
+
{ id: 'venue-102', name: 'North Pavilion', type: 'venue', friendlyId: 'V-1002', role: 'admin', selected: true },
|
|
34
|
+
{ id: 'venue-103', name: 'South Court', type: 'venue', friendlyId: 'V-1003', role: 'admin', selected: false },
|
|
35
|
+
{ id: 'promo-101', name: 'Events Promoter', type: 'promoter', friendlyId: 'P-1001', role: 'admin', selected: true },
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
// ─── Shared mock handlers ────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
/** Type "existing" in the email field to trigger the existing-user path */
|
|
41
|
+
async function checkEmail(email: string): Promise<ExistingUser | null> {
|
|
42
|
+
await delay(600)
|
|
43
|
+
return email.toLowerCase().includes('existing') ? mockExistingUser : null
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function searchEntities(query: string): Promise<EntityResult[]> {
|
|
47
|
+
await delay(400)
|
|
48
|
+
return mockEntityResults.filter((e) => e.name.toLowerCase().includes(query.toLowerCase()))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function fetchCompanyProviders(): Promise<EntityResult[]> {
|
|
52
|
+
await delay(300)
|
|
53
|
+
return mockNestedProviders
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function fetchCompanyVenues(): Promise<VenueAssignment[]> {
|
|
57
|
+
await delay(300)
|
|
58
|
+
return mockVenues
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function delay(ms: number) {
|
|
62
|
+
return new Promise<void>((r) => setTimeout(r, ms))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ─── Meta ─────────────────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
const meta: Meta<typeof CreateUserPage> = {
|
|
68
|
+
title: 'v2/Pages/CreateUser',
|
|
69
|
+
component: CreateUserPage,
|
|
70
|
+
parameters: { layout: 'fullscreen' },
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export default meta
|
|
74
|
+
type Story = StoryObj<typeof CreateUserPage>
|
|
75
|
+
|
|
76
|
+
// ─── Stories — one per real entry context ────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* **Admin Panel** — `/admin/users/add`
|
|
80
|
+
*
|
|
81
|
+
* A super or system admin adds any kind of user to the platform.
|
|
82
|
+
*
|
|
83
|
+
* Flow:
|
|
84
|
+
* - Email → Name → **Role selection** (Super Admin / System Admin / Provider User)
|
|
85
|
+
* - If Provider User: → Search & select companies/venues → Set role per entity → Create User
|
|
86
|
+
* - If Super/System Admin: → Send Invitation
|
|
87
|
+
* - If existing email: → Existing user card → View User (flow ends)
|
|
88
|
+
*
|
|
89
|
+
* Try typing "existing" in the email field to trigger the existing-user path.
|
|
90
|
+
* Try searching "sunset" or "city" on the Providers step.
|
|
91
|
+
*/
|
|
92
|
+
export const AdminPanel: Story = {
|
|
93
|
+
name: 'Admin Panel',
|
|
94
|
+
args: {
|
|
95
|
+
mode: 'admin-panel',
|
|
96
|
+
onCheckEmail: checkEmail,
|
|
97
|
+
onSearchEntities: searchEntities,
|
|
98
|
+
onFetchCompanyProviders: fetchCompanyProviders,
|
|
99
|
+
onInviteUser: async (data) => { await delay(1000); console.log('Invite sent:', data) },
|
|
100
|
+
onViewUser: (id) => console.log('Navigate to user:', id),
|
|
101
|
+
onCancel: () => console.log('Cancel'),
|
|
102
|
+
},
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* **Provider Team** — `/venue|promoter/{id}/settings/team-settings/add`
|
|
107
|
+
*
|
|
108
|
+
* A provider admin adds a team member to their single provider.
|
|
109
|
+
*
|
|
110
|
+
* Flow:
|
|
111
|
+
* - Email → Name (new) or User card (existing) → **Role selection** (provider roles) → Send Invitation / Add User
|
|
112
|
+
*
|
|
113
|
+
* The role is always chosen inside the wizard — there is no pre-selection.
|
|
114
|
+
* Try typing "existing" in the email field to see the existing-user card path.
|
|
115
|
+
*/
|
|
116
|
+
export const ProviderTeam: Story = {
|
|
117
|
+
name: 'Provider Team',
|
|
118
|
+
args: {
|
|
119
|
+
mode: 'provider-team',
|
|
120
|
+
entityContext: {
|
|
121
|
+
id: 'venue-001',
|
|
122
|
+
name: 'The Grand Arena',
|
|
123
|
+
type: 'venue',
|
|
124
|
+
},
|
|
125
|
+
onCheckEmail: checkEmail,
|
|
126
|
+
onInviteUser: async (data) => { await delay(1000); console.log('Invite sent:', data) },
|
|
127
|
+
onCancel: () => console.log('Cancel'),
|
|
128
|
+
},
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* **Company Team** — `/company/{id}/settings/team/add`
|
|
133
|
+
*
|
|
134
|
+
* A company admin adds a team member, choosing which venues to grant access to
|
|
135
|
+
* and setting a role for each.
|
|
136
|
+
*
|
|
137
|
+
* Flow:
|
|
138
|
+
* - Email → Name (new) or User card (existing) → **Venue & company access selection** → Set role per entity → Send Invitation / Add User
|
|
139
|
+
*
|
|
140
|
+
* The venues are pre-loaded from the company context (some pre-selected, some not).
|
|
141
|
+
* Try typing "existing" in the email field to see the existing-user card path.
|
|
142
|
+
*/
|
|
143
|
+
export const CompanyTeam: Story = {
|
|
144
|
+
name: 'Company Team',
|
|
145
|
+
args: {
|
|
146
|
+
mode: 'company-team',
|
|
147
|
+
entityContext: {
|
|
148
|
+
id: 'company-001',
|
|
149
|
+
name: 'Live Events Group',
|
|
150
|
+
type: 'company',
|
|
151
|
+
},
|
|
152
|
+
onCheckEmail: checkEmail,
|
|
153
|
+
onFetchCompanyVenues: fetchCompanyVenues,
|
|
154
|
+
onInviteUser: async (data) => { await delay(1000); console.log('Invite sent:', data) },
|
|
155
|
+
onCancel: () => console.log('Cancel'),
|
|
156
|
+
},
|
|
157
|
+
}
|