feat: redo settings and all org pages. (#601)

* feat: new components, deploy storybook

* refactor: simplify component field definitions and enhance button loading state

- Removed unnecessary type imports and simplified the FIELDS array definitions across multiple components in Storybook.
- Updated button component to use a loading state instead of isLoading, improving clarity and consistency in props.
- Adjusted button stories to reflect the new loading prop and enhanced the button's loading visual feedback.
- Minor CSS adjustments for better layout and styling consistency.

* chore: add field, card, password components

* feat: improve page component & update AuthUI path

* chore: update bits-ui to version 2.14.4 and all org related UI's

- Updated bits-ui dependency in pnpm-lock.yaml and package.json to version 2.14.4.
- Refactored imports for RoleBasedSecurity and UpgradeBanner components to use the new ui feature directory.
- Removed unused Course components and related files to clean up the codebase.
- Enhanced various components to improve consistency and maintainability.

* chore: move all setting buttons to the top and update auth ui styles

* chore: remove svelte-loading-spinners and replace with @cio/ui/base/spinner

- Removed all instances of svelte-loading-spinners from the project.
- Updated components to use the new Spinner from @cio/ui/base/spinner.
- Cleaned up pnpm-lock.yaml and package.json to reflect the removal of svelte-loading-spinners.
- Added new CSS animations for rocket launch effects in app.css.
- Enhanced email change flow with updated verification messages in translations.

* chore: remove supabase file upload from dashboard and move to r2

* chore: update organization API and UI components

- Added new API methods for organization plan operations and team management.
- Introduced middleware for API key authentication and organization admin checks.
- Refactored organization-related components to utilize the new API structure.
- Updated various UI components to improve consistency and maintainability.
- Enhanced error handling and validation for organization-related actions.
- Removed deprecated services and streamlined the codebase.
This commit is contained in:
Rotimi Best
2025-12-02 09:54:38 +01:00
committed by GitHub
parent 531516a8f7
commit c7854efae3
350 changed files with 13928 additions and 3895 deletions
@@ -12,3 +12,5 @@ export const ALLOWED_DOCUMENT_TYPES = [
'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
'application/msword' // .doc
] as const;
export const ALLOWED_IMAGE_TYPES = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/gif'] as const;
+1
View File
@@ -3,5 +3,6 @@ export * from './constants';
export * from './account';
export * from './course';
export * from './mail';
export * from './media';
export * from './onboarding';
export * from './organization';
@@ -0,0 +1 @@
export * from './media';
@@ -0,0 +1,12 @@
import { ALLOWED_IMAGE_TYPES } from '../constants';
import { z } from 'zod';
/**
* Schema for image upload presign URL request
* Used for generating presigned URLs for image uploads (avatars, etc.)
*/
export const ZMediaImagePresignUrlUpload = z.object({
fileName: z.string().min(1),
fileType: z.enum(ALLOWED_IMAGE_TYPES)
});
export type TMediaImagePresignUrlUpload = z.infer<typeof ZMediaImagePresignUrlUpload>;
@@ -1,5 +1,7 @@
import * as z from 'zod';
import { blockedSubdomain } from '@cio/utils/constants';
export const ZGetOrganizations = z.object({
siteName: z.string().min(1).optional(),
customDomain: z.string().min(1).optional(),
@@ -14,6 +16,12 @@ export const ZGetOrganizationTeam = z.object({
export type TGetOrganizationTeam = z.infer<typeof ZGetOrganizationTeam>;
export const ZUpdateOrganizationParam = z.object({
orgId: z.uuid()
});
export type TUpdateOrganizationParam = z.infer<typeof ZUpdateOrganizationParam>;
export const ZGetOrganizationAudience = z.object({
orgId: z.uuid()
});
@@ -26,6 +34,12 @@ export const ZGetCoursesBySiteName = z.object({
export type TGetCoursesBySiteName = z.infer<typeof ZGetCoursesBySiteName>;
export const ZGetOrgSetup = z.object({
siteName: z.string().min(1)
});
export type TGetOrgSetup = z.infer<typeof ZGetOrgSetup>;
export const ZCreateOrgPlan = z.object({
orgId: z.uuid(),
planName: z.enum(['EARLY_ADOPTER', 'ENTERPRISE', 'BASIC']),
@@ -49,3 +63,56 @@ export const ZCancelOrgPlan = z.object({
});
export type TCancelOrgPlan = z.infer<typeof ZCancelOrgPlan>;
export const ZCreateOrganization = z.object({
name: z
.string()
.min(5)
.refine((val) => !/^[-]|[-]$/.test(val), {
message: 'Organization name cannot start or end with a hyphen'
}),
siteName: z
.string()
.min(5)
.refine((val) => !/^[-]|[-]$/.test(val), {
message: 'Site name cannot start or end with a hyphen'
})
.refine((val) => !blockedSubdomain.includes(val), {
message: 'Sitename already exists.'
})
});
export type TCreateOrganization = z.infer<typeof ZCreateOrganization>;
export const ZUpdateOrganization = z.object({
name: z
.string()
.min(5)
.refine((val) => !/^[-]|[-]$/.test(val), {
message: 'Organization name cannot start or end with a hyphen'
})
.optional(),
avatarUrl: z.url().optional(),
theme: z.string().optional(),
landingpage: z.record(z.string(), z.unknown()).optional(),
siteName: z.string().min(1).optional(),
customDomain: z.string().nullable().optional(),
isCustomDomainVerified: z.boolean().optional(),
customization: z.record(z.string(), z.unknown()).optional()
});
export type TUpdateOrganization = z.infer<typeof ZUpdateOrganization>;
export const ZInviteTeamMembers = z.object({
emails: z.array(z.string().email()).min(1).max(50),
roleId: z.number().int().positive()
});
export type TInviteTeamMembers = z.infer<typeof ZInviteTeamMembers>;
export const ZRemoveTeamMember = z.object({
orgId: z.uuid(),
memberId: z.number().int().positive()
});
export type TRemoveTeamMember = z.infer<typeof ZRemoveTeamMember>;