From 3cc8c2208938c5bc08a36f3931c1b9c4516b03ea Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Thu, 7 Nov 2024 15:08:19 +0100 Subject: [PATCH 01/10] feat: Add f@equinor/fusion-portal-react-utils This is user utils for portal components and hooks for getting the context relations --- .../react/context/src/utils/local-storage.ts | 35 +++++ fusion-portal/react/utils/package.json | 22 +++ fusion-portal/react/utils/src/hooks/index.ts | 1 + .../utils/src/hooks/use-current-user-info.ts | 20 +++ fusion-portal/react/utils/src/index.ts | 3 + .../react/utils/src/queries/index.ts | 1 + .../utils/src/queries/user-info-query.ts | 13 ++ fusion-portal/react/utils/src/types/index.ts | 3 + .../src/types/org/ApproveSnapshotRequest.ts | 4 + .../utils/src/types/org/AssignedPerson.ts | 4 + .../react/utils/src/types/org/BasePosition.ts | 21 +++ .../react/utils/src/types/org/Contract.ts | 21 +++ .../utils/src/types/org/CreateOrgProject.ts | 7 + .../src/types/org/CreateSnapshotRequest.ts | 9 ++ .../org/CreateTransientSnapshotRequest.ts | 5 + .../utils/src/types/org/FusionProject.ts | 15 ++ .../react/utils/src/types/org/OrgProject.ts | 35 +++++ .../utils/src/types/org/OrgProjectDates.ts | 12 ++ .../src/types/org/OrgProjectDescription.ts | 6 + .../utils/src/types/org/OrgProjectLink.ts | 8 ++ .../react/utils/src/types/org/OrgSnapshot.ts | 42 ++++++ .../react/utils/src/types/org/Organisation.ts | 14 ++ .../react/utils/src/types/org/Position.ts | 24 ++++ .../utils/src/types/org/PositionInstance.ts | 33 +++++ .../utils/src/types/org/PositionLocation.ts | 8 ++ .../utils/src/types/org/PositionReportPath.ts | 13 ++ .../utils/src/types/org/PublishDetails.ts | 13 ++ .../utils/src/types/org/RoleDescription.ts | 15 ++ .../react/utils/src/types/org/index.ts | 1 + .../react/utils/src/types/person-details.ts | 79 +++++++++++ .../react/utils/src/types/relations.ts | 132 ++++++++++++++++++ fusion-portal/react/utils/src/utils/index.ts | 2 + .../react/utils/src/utils/personCardUtils.ts | 31 ++++ .../react/utils/src/utils/portalUrl.ts | 21 +++ fusion-portal/react/utils/tsconfig.json | 19 +++ fusion-portal/react/utils/tsconfig.lib.json | 20 +++ package.json | 1 + pnpm-workspace.yaml | 1 + 38 files changed, 714 insertions(+) create mode 100644 fusion-portal/react/context/src/utils/local-storage.ts create mode 100644 fusion-portal/react/utils/package.json create mode 100644 fusion-portal/react/utils/src/hooks/index.ts create mode 100644 fusion-portal/react/utils/src/hooks/use-current-user-info.ts create mode 100644 fusion-portal/react/utils/src/index.ts create mode 100644 fusion-portal/react/utils/src/queries/index.ts create mode 100644 fusion-portal/react/utils/src/queries/user-info-query.ts create mode 100644 fusion-portal/react/utils/src/types/index.ts create mode 100644 fusion-portal/react/utils/src/types/org/ApproveSnapshotRequest.ts create mode 100644 fusion-portal/react/utils/src/types/org/AssignedPerson.ts create mode 100644 fusion-portal/react/utils/src/types/org/BasePosition.ts create mode 100644 fusion-portal/react/utils/src/types/org/Contract.ts create mode 100644 fusion-portal/react/utils/src/types/org/CreateOrgProject.ts create mode 100644 fusion-portal/react/utils/src/types/org/CreateSnapshotRequest.ts create mode 100644 fusion-portal/react/utils/src/types/org/CreateTransientSnapshotRequest.ts create mode 100644 fusion-portal/react/utils/src/types/org/FusionProject.ts create mode 100644 fusion-portal/react/utils/src/types/org/OrgProject.ts create mode 100644 fusion-portal/react/utils/src/types/org/OrgProjectDates.ts create mode 100644 fusion-portal/react/utils/src/types/org/OrgProjectDescription.ts create mode 100644 fusion-portal/react/utils/src/types/org/OrgProjectLink.ts create mode 100644 fusion-portal/react/utils/src/types/org/OrgSnapshot.ts create mode 100644 fusion-portal/react/utils/src/types/org/Organisation.ts create mode 100644 fusion-portal/react/utils/src/types/org/Position.ts create mode 100644 fusion-portal/react/utils/src/types/org/PositionInstance.ts create mode 100644 fusion-portal/react/utils/src/types/org/PositionLocation.ts create mode 100644 fusion-portal/react/utils/src/types/org/PositionReportPath.ts create mode 100644 fusion-portal/react/utils/src/types/org/PublishDetails.ts create mode 100644 fusion-portal/react/utils/src/types/org/RoleDescription.ts create mode 100644 fusion-portal/react/utils/src/types/org/index.ts create mode 100644 fusion-portal/react/utils/src/types/person-details.ts create mode 100644 fusion-portal/react/utils/src/types/relations.ts create mode 100644 fusion-portal/react/utils/src/utils/index.ts create mode 100644 fusion-portal/react/utils/src/utils/personCardUtils.ts create mode 100644 fusion-portal/react/utils/src/utils/portalUrl.ts create mode 100644 fusion-portal/react/utils/tsconfig.json create mode 100644 fusion-portal/react/utils/tsconfig.lib.json diff --git a/fusion-portal/react/context/src/utils/local-storage.ts b/fusion-portal/react/context/src/utils/local-storage.ts new file mode 100644 index 000000000..0a9966d1c --- /dev/null +++ b/fusion-portal/react/context/src/utils/local-storage.ts @@ -0,0 +1,35 @@ +class LocalStorage { + setItem(key: string, data: T): void { + /** Data is null or undefined */ + if (!data) { + localStorage.removeItem(key); + return; + } + + /** Data is already string */ + if (typeof data === 'string') { + localStorage.setItem(key, data); + return; + } + + //Anything else + localStorage.setItem(key, JSON.stringify(data)); + } + + getItem(key: string): string | T | undefined { + const data = localStorage.getItem(key); + if (!data || data === 'undefined') return undefined; + + try { + return JSON.parse(data) as T; + } catch { + return data; + } + } + + removeItem(key: string): void { + localStorage.removeItem(key); + } +} + +export const storage = new LocalStorage(); diff --git a/fusion-portal/react/utils/package.json b/fusion-portal/react/utils/package.json new file mode 100644 index 000000000..66549df8b --- /dev/null +++ b/fusion-portal/react/utils/package.json @@ -0,0 +1,22 @@ +{ + "name": "@equinor/fusion-portal-react-utils", + "version": "0.0.0", + "license": "MIT", + "type": "module", + "main": "./dist/src/index.js", + "module": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "private": true, + "scripts": { + "dev": "npm run build -- --watch", + "dev:local": "npm run dev -- --watch", + "build": "tsc -b -f" + }, + "dependencies": { + "@equinor/fusion-framework-module-http": "^6.2.0", + "@equinor/fusion-react-skeleton": "^0.3.0", + "@equinor/fusion-react-person": "^0.9.2", + "@equinor/fusion-portal-react-context": "workspace:^", + "@equinor/fusion-framework-react": "^7.3.0" + } +} diff --git a/fusion-portal/react/utils/src/hooks/index.ts b/fusion-portal/react/utils/src/hooks/index.ts new file mode 100644 index 000000000..e29bfddd8 --- /dev/null +++ b/fusion-portal/react/utils/src/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-current-user-info'; diff --git a/fusion-portal/react/utils/src/hooks/use-current-user-info.ts b/fusion-portal/react/utils/src/hooks/use-current-user-info.ts new file mode 100644 index 000000000..32e7abf87 --- /dev/null +++ b/fusion-portal/react/utils/src/hooks/use-current-user-info.ts @@ -0,0 +1,20 @@ +import { useFramework } from '@equinor/fusion-framework-react'; +import { useCurrentUser } from '@equinor/fusion-framework-react/hooks'; + +import { useQuery } from '@tanstack/react-query'; + +import { PersonDetails } from '../types/person-details'; +import { getCurrentUserInfo } from '../queries'; + +export const useCurrentUserInfo = () => { + const client = useFramework().modules.serviceDiscovery.createClient('people'); + const user = useCurrentUser(); + + const { data, error, isLoading } = useQuery({ + queryKey: ['current-user-info', user?.localAccountId], + queryFn: async () => getCurrentUserInfo(await client, user?.localAccountId), + enabled: Boolean(user?.localAccountId), + }); + + return { currentUserInfo: data, error, isLoading }; +}; diff --git a/fusion-portal/react/utils/src/index.ts b/fusion-portal/react/utils/src/index.ts new file mode 100644 index 000000000..a31e2405a --- /dev/null +++ b/fusion-portal/react/utils/src/index.ts @@ -0,0 +1,3 @@ +export * from './hooks'; +export * from './types'; +export * from './utils'; diff --git a/fusion-portal/react/utils/src/queries/index.ts b/fusion-portal/react/utils/src/queries/index.ts new file mode 100644 index 000000000..249d90e8b --- /dev/null +++ b/fusion-portal/react/utils/src/queries/index.ts @@ -0,0 +1 @@ +export * from './user-info-query'; diff --git a/fusion-portal/react/utils/src/queries/user-info-query.ts b/fusion-portal/react/utils/src/queries/user-info-query.ts new file mode 100644 index 000000000..394cd374d --- /dev/null +++ b/fusion-portal/react/utils/src/queries/user-info-query.ts @@ -0,0 +1,13 @@ +import { IHttpClient } from '@equinor/fusion-framework-module-http'; +import { PersonDetails } from '../types/person-details'; + +export async function getCurrentUserInfo( + client: IHttpClient, + azureUserId?: string +): Promise { + const res = await client.fetch( + `/persons/${azureUserId}?api-version=3.0&$expand=positions,contracts,roles` + ); + if (!res.ok) throw res; + return res.json(); +} diff --git a/fusion-portal/react/utils/src/types/index.ts b/fusion-portal/react/utils/src/types/index.ts new file mode 100644 index 000000000..ebdb08e54 --- /dev/null +++ b/fusion-portal/react/utils/src/types/index.ts @@ -0,0 +1,3 @@ +export * from './org'; +export * from './relations'; +export * from './person-details'; diff --git a/fusion-portal/react/utils/src/types/org/ApproveSnapshotRequest.ts b/fusion-portal/react/utils/src/types/org/ApproveSnapshotRequest.ts new file mode 100644 index 000000000..6b6d60fd3 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/ApproveSnapshotRequest.ts @@ -0,0 +1,4 @@ +type ApproveSnapshotRequest = { + comment: string; +}; +export default ApproveSnapshotRequest; diff --git a/fusion-portal/react/utils/src/types/org/AssignedPerson.ts b/fusion-portal/react/utils/src/types/org/AssignedPerson.ts new file mode 100644 index 000000000..8df4f0e9f --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/AssignedPerson.ts @@ -0,0 +1,4 @@ +import { PersonDetails } from '../person-details'; + +type AssignedPerson = PersonDetails; +export default AssignedPerson; diff --git a/fusion-portal/react/utils/src/types/org/BasePosition.ts b/fusion-portal/react/utils/src/types/org/BasePosition.ts new file mode 100644 index 000000000..d269a4344 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/BasePosition.ts @@ -0,0 +1,21 @@ +import { RoleDescriptionContent } from './RoleDescription'; + +export type BasePositionSettings = { + directAssignmentEnabled: boolean | null; + isDefaultTaskOwner: boolean; + requireDirectRequest?: boolean; +}; + +type BasePosition = { + id: string; + name: string; + department: string; + discipline: string; + projectType: string; + subDiscipline: string | null; + settings?: BasePositionSettings; + roleDescription?: RoleDescriptionContent; + inactive: boolean; +}; + +export default BasePosition; diff --git a/fusion-portal/react/utils/src/types/org/Contract.ts b/fusion-portal/react/utils/src/types/org/Contract.ts new file mode 100644 index 000000000..f8088b9f3 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/Contract.ts @@ -0,0 +1,21 @@ +import Position from './Position'; + +type Contract = { + id: string; + name: string; + description: string; + contractNumber: string; + isDeleted: boolean; + company: ContractCompany; + companyRep?: Position; + contractRep?: Position; + externalCompanyRep?: Position; + externalContractRep?: Position; +}; + +type ContractCompany = { + id: string; + name: string; +}; + +export default Contract; diff --git a/fusion-portal/react/utils/src/types/org/CreateOrgProject.ts b/fusion-portal/react/utils/src/types/org/CreateOrgProject.ts new file mode 100644 index 000000000..5f53b8996 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/CreateOrgProject.ts @@ -0,0 +1,7 @@ +type CreateOrgProject = { + name: string; + domainId: string; + slugs: string[]; +}; + +export default CreateOrgProject; diff --git a/fusion-portal/react/utils/src/types/org/CreateSnapshotRequest.ts b/fusion-portal/react/utils/src/types/org/CreateSnapshotRequest.ts new file mode 100644 index 000000000..ee90f057e --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/CreateSnapshotRequest.ts @@ -0,0 +1,9 @@ +type CreateSnapshotRequest = { + type: string; + baseline: string; + appliesForDate: Date; + description?: string; + approvalRequired?: boolean; +}; + +export default CreateSnapshotRequest; diff --git a/fusion-portal/react/utils/src/types/org/CreateTransientSnapshotRequest.ts b/fusion-portal/react/utils/src/types/org/CreateTransientSnapshotRequest.ts new file mode 100644 index 000000000..474d201be --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/CreateTransientSnapshotRequest.ts @@ -0,0 +1,5 @@ +type CreateTransientSnapshotRequest = { + appliesForDate: Date; +}; + +export default CreateTransientSnapshotRequest; diff --git a/fusion-portal/react/utils/src/types/org/FusionProject.ts b/fusion-portal/react/utils/src/types/org/FusionProject.ts new file mode 100644 index 000000000..58fb04c1a --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/FusionProject.ts @@ -0,0 +1,15 @@ +type FusionProjectMapping = { + id: string; + key: string; + projectId: string; + type: string; + value: string; +}; +type FusionProject = { + id: string; + isDeleted: boolean; + name: string; + mappings: FusionProjectMapping[]; +}; + +export default FusionProject; diff --git a/fusion-portal/react/utils/src/types/org/OrgProject.ts b/fusion-portal/react/utils/src/types/org/OrgProject.ts new file mode 100644 index 000000000..b3760fd58 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/OrgProject.ts @@ -0,0 +1,35 @@ +import Position from './Position'; +import OrgProjectDates from './OrgProjectDates'; +import OrgProjectDescription from './OrgProjectDescription'; +import OrgProjectLink from './OrgProjectLink'; + +type OrgProjectProperties = { + pimsWriteSyncEnabled?: boolean; + disableSync?: boolean; + orgAdminEnabled?: boolean; + resourceOwnerRequestsEnabled?: boolean; +}; + +export type OrgProject = { + dates: OrgProjectDates; + director: Position; + directorPositionId: string; + domainId: string; + name: string; + projectId: string; + projectType: string; + properties: OrgProjectProperties | null; + description?: OrgProjectDescription; + links?: OrgProjectLink[]; + lineOrganisation?: { + task: { + id: string; + name: string; + }; + orgUnit: { + sapId: string; + name: string; + fullDepartment: string; + }; + }; +}; diff --git a/fusion-portal/react/utils/src/types/org/OrgProjectDates.ts b/fusion-portal/react/utils/src/types/org/OrgProjectDates.ts new file mode 100644 index 000000000..d713ed192 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/OrgProjectDates.ts @@ -0,0 +1,12 @@ +type OrgProjectDates = { + endDate: Date | null; + startDate: Date | null; + gates: { + dG1: Date | null; + dG2: Date | null; + dG3: Date | null; + dG4: Date | null; + }; +}; + +export default OrgProjectDates; diff --git a/fusion-portal/react/utils/src/types/org/OrgProjectDescription.ts b/fusion-portal/react/utils/src/types/org/OrgProjectDescription.ts new file mode 100644 index 000000000..46d2a1bc5 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/OrgProjectDescription.ts @@ -0,0 +1,6 @@ +type OrgProjectDescription = { + content: string; + contentType: string; +}; + +export default OrgProjectDescription; diff --git a/fusion-portal/react/utils/src/types/org/OrgProjectLink.ts b/fusion-portal/react/utils/src/types/org/OrgProjectLink.ts new file mode 100644 index 000000000..2b8d370c7 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/OrgProjectLink.ts @@ -0,0 +1,8 @@ +type OrgProjectLink = { + name: string; + description: string; + url: string; + type: string; +}; + +export default OrgProjectLink; diff --git a/fusion-portal/react/utils/src/types/org/OrgSnapshot.ts b/fusion-portal/react/utils/src/types/org/OrgSnapshot.ts new file mode 100644 index 000000000..303bb8847 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/OrgSnapshot.ts @@ -0,0 +1,42 @@ +import { PersonDetails } from '../person-details'; +import BasePosition from './BasePosition'; + +export type OrgSnapshotApproval = { + approvedBy: PersonDetails; + approved: Date; + comment: string; + positions: { + basePositions: BasePosition[]; + positionIds: string[]; + }; +}; +export type OrgSnapshotStatusProgress = { + total: number; + proceeded: number; +}; + +export type OrgSnapshotStatus = { + hasInvalidEvents: boolean; + initializationCompletedAt: Date | null; + initializedAt: Date | null; + isInitialized: boolean; + message: string; + progress: OrgSnapshotStatusProgress | null; + failedAt?: Date; + errorMessage?: string; +}; + +type OrgSnapshot = { + id: string; + type: string; + baseline: string; + description?: string; + approvalRequired: boolean; + created: Date; + appliesForDate: Date; + createdBy: PersonDetails | null; + approval?: OrgSnapshotApproval; + status: OrgSnapshotStatus; +}; + +export default OrgSnapshot; diff --git a/fusion-portal/react/utils/src/types/org/Organisation.ts b/fusion-portal/react/utils/src/types/org/Organisation.ts new file mode 100644 index 000000000..6be42a556 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/Organisation.ts @@ -0,0 +1,14 @@ +import Position from './Position'; + +export type Organisation = { + id: string | null; + name: string | null; + parentId: string | null; + managerPosition: Position | null; + managerPositionId: string | null; +}; + +export type OrganisationsRespose = { + isFromPims: boolean; + organisations: Organisation[]; +}; diff --git a/fusion-portal/react/utils/src/types/org/Position.ts b/fusion-portal/react/utils/src/types/org/Position.ts new file mode 100644 index 000000000..4782d5ed8 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/Position.ts @@ -0,0 +1,24 @@ +import BasePosition from './BasePosition'; +import PositionInstance from './PositionInstance'; + +type Position = { + id: string; + externalId: string | null; + name: string; + basePosition: BasePosition; + instances: PositionInstance[]; + properties: { + isSupport?: boolean; + hideInTree?: boolean; + resourceType?: 'normal' | 'jointVenture' | 'enterprise'; + }; + directChildCount: number; + totalChildCount: number; + projectId: string; + contractId: string | null; + isTaskOwner: boolean; + isProjectManagementTeam: boolean; + hasChangesInDraft?: boolean; +}; + +export default Position; diff --git a/fusion-portal/react/utils/src/types/org/PositionInstance.ts b/fusion-portal/react/utils/src/types/org/PositionInstance.ts new file mode 100644 index 000000000..c6f1b868e --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/PositionInstance.ts @@ -0,0 +1,33 @@ +import PositionLocation from './PositionLocation'; +import AssignedPerson from './AssignedPerson'; +import { Organisation } from './Organisation'; + +type PositionInstanceType = 'Normal' | 'Rotation'; + +type PositionInstanceProperties = { + workPackId?: string; + hasRequest?: boolean; +}; + +type PositionInstance = { + id: string; + obs: string; + workload: number; + appliesFrom: Date; + appliesTo: Date; + type: PositionInstanceType; // Normal/Offshore/Vacation etc. + location: PositionLocation; + assignedPerson: AssignedPerson | null; + properties: PositionInstanceProperties | null; + rotationId: string | null; + taskOwnerIds: string[] | null; + reportsToIds?: string[]; + isDeleted: boolean; + positionId: string; + externalId: string; + parentPositionId: string | null; + hasChangesInDraft?: boolean; + organisation?: Organisation | null; +}; + +export default PositionInstance; diff --git a/fusion-portal/react/utils/src/types/org/PositionLocation.ts b/fusion-portal/react/utils/src/types/org/PositionLocation.ts new file mode 100644 index 000000000..a676cc2d4 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/PositionLocation.ts @@ -0,0 +1,8 @@ +type PositionLocation = { + id: string; + name: string; + country: string; + code: string; +}; + +export default PositionLocation; diff --git a/fusion-portal/react/utils/src/types/org/PositionReportPath.ts b/fusion-portal/react/utils/src/types/org/PositionReportPath.ts new file mode 100644 index 000000000..49d99e874 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/PositionReportPath.ts @@ -0,0 +1,13 @@ +import Position from './Position'; + +type PositionReportPath = { + path: string[]; + reportPositions: { + id: string; + position: Position; + error?: 'futurePosition' | 'pastPosition'; + }[]; + taskOwners: Position[]; +}; + +export default PositionReportPath; diff --git a/fusion-portal/react/utils/src/types/org/PublishDetails.ts b/fusion-portal/react/utils/src/types/org/PublishDetails.ts new file mode 100644 index 000000000..bb2292cd0 --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/PublishDetails.ts @@ -0,0 +1,13 @@ +type PublishDetails = { + id: string; + created: string; + name: string; + azureUniquePersonId: string; + status: 'Authoring' | 'Publishing' | 'Published' | 'PublishFailed'; + description: string | null; + projectId: string; + publishStartDate: Date; + publishCompletedDate: Date; +}; + +export default PublishDetails; diff --git a/fusion-portal/react/utils/src/types/org/RoleDescription.ts b/fusion-portal/react/utils/src/types/org/RoleDescription.ts new file mode 100644 index 000000000..6f9d3f0fe --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/RoleDescription.ts @@ -0,0 +1,15 @@ +import AssignedPerson from './AssignedPerson'; + +export type RoleDescriptionContent = { + lastUpdated: Date | null; + lastUpdatedBy: AssignedPerson | null; + content: string | null; + type: 'Generic' | 'Personal'; +}; + +type RoleDescription = { + generic: RoleDescriptionContent & { exists: boolean }; + persons: Array; +}; + +export default RoleDescription; diff --git a/fusion-portal/react/utils/src/types/org/index.ts b/fusion-portal/react/utils/src/types/org/index.ts new file mode 100644 index 000000000..bdc42b0ad --- /dev/null +++ b/fusion-portal/react/utils/src/types/org/index.ts @@ -0,0 +1 @@ +export * from './OrgProject'; diff --git a/fusion-portal/react/utils/src/types/person-details.ts b/fusion-portal/react/utils/src/types/person-details.ts new file mode 100644 index 000000000..f037f8501 --- /dev/null +++ b/fusion-portal/react/utils/src/types/person-details.ts @@ -0,0 +1,79 @@ +type PersonBasePosition = { + id: string; + name: string; + type: string; + discipline: string; +}; +export type PersonPosition = { + id: string; + name: string; + positionExternalId: string; + parentPositionId?: string; + obs: string; + project: PersonProject; + taskOwnerIds: string[]; + basePosition: PersonBasePosition; + positionId: string; + appliesFrom: Date | null; + appliesTo: Date | null; + workload: number | null; + isTaskOwner: boolean; +}; + +type PersonProject = { + id: string; + name: string; + domainId: string; + type: string; +}; +type PersonContract = { + id: string; + name: string; + companyId?: string; + companyName: string; + contractNumber: string; + project: PersonProject; +}; +type PersonRoleScope = { + type: string; + value?: string; + valueType?: string; +}; + +export type PersonRole = { + name: string; + displayName: string; + sourceSystem: string; + type: string; + isActive: boolean; + activeToUtc?: string; + onDemandSupport: boolean; + scope: PersonRoleScope; +}; + +export type Role = PersonRole & { + errorMessage?: string; +}; + +type PersonAccountType = 'Consultant' | 'Employee' | 'External' | 'Local'; +type PersonCompany = { + id: string; + name: string; +}; +export type PersonDetails = { + azureUniqueId: string; + accountClassification: string; + name: string; + mail: string | null; + jobTitle: string | null; + department: string | null; + mobilePhone: string | null; + officeLocation: string | null; + upn: string; + managerAzureUniqueId: string; + accountType: PersonAccountType; + company: PersonCompany; + roles?: PersonRole[]; + contracts?: PersonContract[]; + positions?: PersonPosition[]; +}; diff --git a/fusion-portal/react/utils/src/types/relations.ts b/fusion-portal/react/utils/src/types/relations.ts new file mode 100644 index 000000000..ae1befead --- /dev/null +++ b/fusion-portal/react/utils/src/types/relations.ts @@ -0,0 +1,132 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export type RelationsTypes = + | 'EquinorTask' + | 'Contract' + | 'ProjectMaster' + | 'PimsDomain' + | 'Project' + | 'OrgChart' + | 'Facility'; + +export type RelationReturnType = T extends 'ProjectMaster' + ? Relations + : T extends 'Facility' + ? Relations + : T extends 'OrgChart' + ? Relations + : T extends 'EquinorTask' + ? Relations + : T extends 'Contract' + ? Relations + : T extends 'Project' + ? Relations + : T extends 'PimsDomain' + ? Relations + : Relations; + +export interface Relations { + relationSource: string; + relationType?: any; + id: string; + externalId: string; + source?: any; + type: Type; + value: T extends object ? T : Value; + title: string; + isActive: boolean; + isDeleted: boolean; + created: string; + updated?: string; +} + +export type ProjectMaster = { + facilities: string[]; + projectCategory: string; + cvpid: string; + documentManagementId: string; + phase: string; + portfolioOrganizationalUnit: string; +} & Record; + +interface Value { + identity?: string; + sapPlant?: string; + schema?: string; + subFacilities?: string[]; + parentFacility?: any; + contractNumber?: string; + companyName?: string; + startDate?: string; + endDate?: string; + projectMasterId?: string; + isValid?: boolean; + taskName?: string; + taskType?: string; + taskState?: string; + orgChartId?: string; + orgUnitSapId?: string; + orgUnitShortName?: string; + orgUnitName?: string; + orgUnitDepartment?: string; + orgUnitFullDepartment?: string; + orgUnitType?: string; + domainId?: string; + dgPhase?: string; + siteCode?: string; + projectIdentifier?: string; + wbs?: string; +} + +export interface Contract { + contractNumber?: number; + companyName?: string; + startDate?: string; + endDate?: string; + projectMasterId?: string; + isValid: boolean; +} + +export interface Facility { + identity: string; + sapPlant: string; + schema: string; + subFacilities?: string[]; + parentFacility?: string[]; +} + +export interface OrgChart { + orgChartId?: string; + domainId?: string; + dgPhase?: string; +} + +interface EquinorTask { + taskName?: string; + taskType?: string; + taskState?: string; + orgChartId?: string; + orgUnitSapId?: string; + orgUnitShortName?: string; + orgUnitName?: string; + orgUnitDepartment?: string; + orgUnitFullDepartment?: string; + orgUnitType?: string; + projectMasterId?: string; +} + +interface PDP { + siteCode: string; + projectIdentifier: string; +} + +interface PimsDomain { + domainId?: string; + projectMasterId?: string; +} + +interface Type { + id: string; + isChildType: boolean; + parentTypeIds: string[]; +} diff --git a/fusion-portal/react/utils/src/utils/index.ts b/fusion-portal/react/utils/src/utils/index.ts new file mode 100644 index 000000000..34a404d46 --- /dev/null +++ b/fusion-portal/react/utils/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './personCardUtils'; +export * from './portalUrl'; diff --git a/fusion-portal/react/utils/src/utils/personCardUtils.ts b/fusion-portal/react/utils/src/utils/personCardUtils.ts new file mode 100644 index 000000000..d0d78092e --- /dev/null +++ b/fusion-portal/react/utils/src/utils/personCardUtils.ts @@ -0,0 +1,31 @@ +import { PersonDetails } from '../types/person-details'; + +/** + * @returns if the person does not have a job title and if the persons account type is also "External", job title becomes "External" + */ +export const getJobTitle = (person: PersonDetails) => { + if (!person.jobTitle) { + return person.accountClassification === 'External' ? 'External' : null; + } + return person.jobTitle; +}; + +/** + * @returns if the person does not have a department and if that persons account type is "External", department becomes domain name from the email address + */ +export const getDepartment = (person: PersonDetails) => { + const domain = person.mail?.split('@')[1].toLowerCase(); + if (!person.department) { + return person.accountClassification === 'External' ? domain : null; + } + return person.department; +}; + +/** Returns initials from first and if available, last name */ +export const getInitials = (name: string) => { + if (name.split(' ').length > 1) { + return name.split(' ')[0][0] + name.split(' ')[1][0]; + } else { + return name.split(' ')[0][0]; + } +}; diff --git a/fusion-portal/react/utils/src/utils/portalUrl.ts b/fusion-portal/react/utils/src/utils/portalUrl.ts new file mode 100644 index 000000000..43f1d27dc --- /dev/null +++ b/fusion-portal/react/utils/src/utils/portalUrl.ts @@ -0,0 +1,21 @@ +// Todo useAppModule PortalApp env +export const getFusionPortalURL = () => { + switch (window._config_?.fusionLegacyEnvIdentifier?.toLowerCase()) { + case 'fprd': + return 'https://fusion.equinor.com'; + case 'ci': + return 'https://fusion-s-portal-ci.azurewebsites.net'; + case 'fqa': + return 'https://fusion-s-portal-fqa.azurewebsites.net'; + default: + return 'https://fusion-s-portal-ci.azurewebsites.net'; + } +}; + +declare global { + interface Window { + _config_: { + fusionLegacyEnvIdentifier: string; + }; + } +} diff --git a/fusion-portal/react/utils/tsconfig.json b/fusion-portal/react/utils/tsconfig.json new file mode 100644 index 000000000..309ee7b4c --- /dev/null +++ b/fusion-portal/react/utils/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "rootDir": "src", + "types": ["vite/client"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../../tsconfig.base.json" +} diff --git a/fusion-portal/react/utils/tsconfig.lib.json b/fusion-portal/react/utils/tsconfig.lib.json new file mode 100644 index 000000000..44163c588 --- /dev/null +++ b/fusion-portal/react/utils/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "types": ["node"] + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "dist" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx" ] +} diff --git a/package.json b/package.json index 56c91d6d8..bb4469bc0 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "build:reports": "turbo run build --filter ./reports/** --parallel --output-logs errors-only", "build:apps": "turbo run build --filter ./apps/** --parallel --output-logs errors-only", "build:libs": "turbo run build --filter ./libs/* --parallel --output-logs errors-only", + "build:fusion-portal": "turbo build --filter './fusion-portal/**' --output-logs errors-only", "new:app": "nx generate @cc-components/plugins:fusion-app-generator", "new:report": "nx generate @cc-components/plugins:fusion-report-generator", "watch": "node ./run_watch.js dev", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 480ce2b7a..acda1f46b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - 'libs/**' - 'apps/*' + - 'fusion-portal/**' - 'cli' - 'github-action' From d8ad4fdf3a5cc1a5fac6ed72f2922c08ea6e6aee Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Thu, 7 Nov 2024 15:12:15 +0100 Subject: [PATCH 02/10] feat: Add @equinor/fusion-portal-react-context Adding all context related portal functionality needed for portal landing pages --- fusion-portal/react/context/package.json | 22 +++ .../src/components/ContextNotSupported.tsx | 49 ++++++ .../src/components/ContextProvider.tsx | 13 ++ .../src/components/ContextSelector.tsx | 28 ++++ .../context/src/components/NoContext.tsx | 47 ++++++ .../react/context/src/components/index.ts | 4 + .../react/context/src/configurators/index.ts | 2 + .../portal-context-configurators.ts | 48 ++++++ .../configurators/portal-context-history.ts | 76 ++++++++++ .../react/context/src/hooks/index.ts | 3 + .../context/src/hooks/use-context-client.ts | 22 +++ .../context/src/hooks/use-context-resolver.ts | 141 ++++++++++++++++++ .../context/src/hooks/use-current-context.ts | 10 ++ .../src/hooks/use-relations-by-type.ts | 26 ++++ fusion-portal/react/context/src/index.ts | 3 + .../src/queries/get-context-relations.ts | 30 ++++ .../react/context/src/types/relations.ts | 134 +++++++++++++++++ fusion-portal/react/context/tsconfig.json | 19 +++ fusion-portal/react/context/tsconfig.lib.json | 20 +++ 19 files changed, 697 insertions(+) create mode 100644 fusion-portal/react/context/package.json create mode 100644 fusion-portal/react/context/src/components/ContextNotSupported.tsx create mode 100644 fusion-portal/react/context/src/components/ContextProvider.tsx create mode 100644 fusion-portal/react/context/src/components/ContextSelector.tsx create mode 100644 fusion-portal/react/context/src/components/NoContext.tsx create mode 100644 fusion-portal/react/context/src/components/index.ts create mode 100644 fusion-portal/react/context/src/configurators/index.ts create mode 100644 fusion-portal/react/context/src/configurators/portal-context-configurators.ts create mode 100644 fusion-portal/react/context/src/configurators/portal-context-history.ts create mode 100644 fusion-portal/react/context/src/hooks/index.ts create mode 100644 fusion-portal/react/context/src/hooks/use-context-client.ts create mode 100644 fusion-portal/react/context/src/hooks/use-context-resolver.ts create mode 100644 fusion-portal/react/context/src/hooks/use-current-context.ts create mode 100644 fusion-portal/react/context/src/hooks/use-relations-by-type.ts create mode 100644 fusion-portal/react/context/src/index.ts create mode 100644 fusion-portal/react/context/src/queries/get-context-relations.ts create mode 100644 fusion-portal/react/context/src/types/relations.ts create mode 100644 fusion-portal/react/context/tsconfig.json create mode 100644 fusion-portal/react/context/tsconfig.lib.json diff --git a/fusion-portal/react/context/package.json b/fusion-portal/react/context/package.json new file mode 100644 index 000000000..fcb7847e1 --- /dev/null +++ b/fusion-portal/react/context/package.json @@ -0,0 +1,22 @@ +{ + "name": "@equinor/fusion-portal-react-context", + "version": "0.0.0", + "license": "MIT", + "type": "module", + "private": true, + "main": "./dist/src/index.js", + "module": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "scripts": { + "dev": "npm run build -- --watch", + "dev:local": "npm run dev -- --watch", + "build": "tsc -b -f" + }, + "dependencies": { + "@equinor/fusion-framework-module-context": "^5.0.12", + "@equinor/fusion-framework-module-http": "^6.2.0", + "@equinor/fusion-framework-react": "^7.3.0", + "@equinor/fusion-react-context-selector": "^0.6.6", + "@equinor/fusion-framework-react-app": "5.2.10" + } +} diff --git a/fusion-portal/react/context/src/components/ContextNotSupported.tsx b/fusion-portal/react/context/src/components/ContextNotSupported.tsx new file mode 100644 index 000000000..8c8281fd3 --- /dev/null +++ b/fusion-portal/react/context/src/components/ContextNotSupported.tsx @@ -0,0 +1,49 @@ +import { Icon, Typography } from '@equinor/eds-core-react'; +import { tokens } from '@equinor/eds-tokens'; +import styled from 'styled-components'; +import { error_outlined } from '@equinor/eds-icons'; + +const Styles = { + Wrapper: styled.div` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + justify-content: center; + `, + Content: styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + justify-content: center; + `, +}; + +export function ContextNotSupported(props: { contexts: string[] }) { + return ( + + + + + Context not supported + + + + Place select a context of type {props.contexts.join('or ')} for this page to work. + + + + ); +} diff --git a/fusion-portal/react/context/src/components/ContextProvider.tsx b/fusion-portal/react/context/src/components/ContextProvider.tsx new file mode 100644 index 000000000..070ef3359 --- /dev/null +++ b/fusion-portal/react/context/src/components/ContextProvider.tsx @@ -0,0 +1,13 @@ +import { ContextProvider as FusionContextProvider } from '@equinor/fusion-react-context-selector'; +import { ReactNode } from 'react'; +import { useContextResolver } from '../hooks/use-context-resolver'; + +interface PortalContextProviderProps { + children: ReactNode; +} + +export const ContextProvider = ({ children }: PortalContextProviderProps) => { + const resolver = useContextResolver(['ProjectMaster', 'Facility']); + + return {children}; +}; diff --git a/fusion-portal/react/context/src/components/ContextSelector.tsx b/fusion-portal/react/context/src/components/ContextSelector.tsx new file mode 100644 index 000000000..a4c4ab012 --- /dev/null +++ b/fusion-portal/react/context/src/components/ContextSelector.tsx @@ -0,0 +1,28 @@ +import { useContextProvider } from '@equinor/fusion-framework-react-app/context'; +import FusionContextSelector, { ContextResult, ContextSelectEvent } from '@equinor/fusion-react-context-selector'; +import { NavigateFunction } from 'react-router-dom'; + +interface ContextSelectorProps { + variant?: string; + navigate?: NavigateFunction; +} + +export const ContextSelector = ({ variant }: ContextSelectorProps) => { + const contextProvider = useContextProvider(); + + return ( + { + e.stopPropagation(); + // sins this is a single select the will be the next context at index 0 + const context = (e.nativeEvent.detail.selected as ContextResult)[0]; + contextProvider.contextClient.setCurrentContext(context.id); + }} + value={contextProvider.currentContext?.id ? contextProvider.currentContext?.title || '' : ''} + placeholder="Start to type to search..." + selectTextOnFocus={true} + /> + ); +}; diff --git a/fusion-portal/react/context/src/components/NoContext.tsx b/fusion-portal/react/context/src/components/NoContext.tsx new file mode 100644 index 000000000..11a4abb26 --- /dev/null +++ b/fusion-portal/react/context/src/components/NoContext.tsx @@ -0,0 +1,47 @@ +import { Icon, Typography } from '@equinor/eds-core-react'; +import { tokens } from '@equinor/eds-tokens'; +import styled from 'styled-components'; +import { error_outlined } from '@equinor/eds-icons'; + +const Styles = { + Wrapper: styled.div` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + justify-content: center; + `, + Content: styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + justify-content: center; + `, +}; + +export function NoContext() { + return ( + + + + + No Context Selected + + + Place select a context form the context selector + + + ); +} diff --git a/fusion-portal/react/context/src/components/index.ts b/fusion-portal/react/context/src/components/index.ts new file mode 100644 index 000000000..137331cb7 --- /dev/null +++ b/fusion-portal/react/context/src/components/index.ts @@ -0,0 +1,4 @@ +export * from './ContextNotSupported'; +export * from './ContextProvider'; +export * from './ContextSelector'; +export * from './NoContext'; diff --git a/fusion-portal/react/context/src/configurators/index.ts b/fusion-portal/react/context/src/configurators/index.ts new file mode 100644 index 000000000..d727ad295 --- /dev/null +++ b/fusion-portal/react/context/src/configurators/index.ts @@ -0,0 +1,2 @@ +export * from './portal-context-configurators'; +export * from './portal-context-history'; diff --git a/fusion-portal/react/context/src/configurators/portal-context-configurators.ts b/fusion-portal/react/context/src/configurators/portal-context-configurators.ts new file mode 100644 index 000000000..984399601 --- /dev/null +++ b/fusion-portal/react/context/src/configurators/portal-context-configurators.ts @@ -0,0 +1,48 @@ +import { IContextProvider } from '@equinor/fusion-framework-module-context'; + +import { setContextHistory } from './portal-context-history'; +import { storage } from '../utils/local-storage'; + +const CONTEXT_SOCAGE_KEY = 'context'; + +export function storeCurrentContext(contextProvider: IContextProvider) { + contextProvider.currentContext$.subscribe((context) => { + if (context?.title === 'Unexpected error' || !context?.id || !context) { + return; + } + + const storedContextId = storage.getItem(CONTEXT_SOCAGE_KEY); + // Update the history with the current context selected. + setContextHistory(context); + + if (context.id !== storedContextId) { + storage.setItem(CONTEXT_SOCAGE_KEY, context?.id); + } + }); +} + +export function clearLocalContext() { + storage.removeItem(CONTEXT_SOCAGE_KEY); +} + +export function validateLocalContext(contextId: string): boolean { + const storedContextId = storage.getItem(CONTEXT_SOCAGE_KEY); + return contextId === storedContextId; +} + +export function setStoredContext(contextProvider: IContextProvider) { + const storedContextId = storage.getItem(CONTEXT_SOCAGE_KEY); + + const uriContext = getContextFormUrl(); + + if (contextProvider.currentContext?.id !== storedContextId || uriContext) { + contextProvider.contextClient.setCurrentContext(uriContext ? uriContext : storedContextId); + } +} + +export function getContextFormUrl() { + const match = window.location.pathname.match( + /[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/ + ); + return match ? match[0] : undefined; +} diff --git a/fusion-portal/react/context/src/configurators/portal-context-history.ts b/fusion-portal/react/context/src/configurators/portal-context-history.ts new file mode 100644 index 000000000..216150b30 --- /dev/null +++ b/fusion-portal/react/context/src/configurators/portal-context-history.ts @@ -0,0 +1,76 @@ +import { ContextItem } from '@equinor/fusion-framework-module-context'; +import { ContextResult } from '@equinor/fusion-react-context-selector'; + +import { storage } from '../utils/local-storage'; + +const CONTEXT_HISTORY_SOCAGE_KEY = 'contextHistory'; +const CONTEXT_HISTORY_LENGTH_KEY = 'contextHistoryLength'; + +const CONTEXT_HISTORY_LENGTH = 5; + +type ContextHistoryItem = ContextItem>; + +export function setContextHistory(context: ContextHistoryItem) { + const storedContextHistory = + storage.getItem(CONTEXT_HISTORY_SOCAGE_KEY) || []; + + if (typeof storedContextHistory == 'string') return; + + const currentContextIndex: number = storedContextHistory.findIndex( + (storedContext) => storedContext.id === context.id + ); + + if (currentContextIndex !== -1) { + storage.setItem( + CONTEXT_HISTORY_SOCAGE_KEY, + moveItemToTopByIndex(storedContextHistory, currentContextIndex) + ); + } else { + const contextHistory = [context, ...storedContextHistory]; + + storage.setItem( + CONTEXT_HISTORY_SOCAGE_KEY, + contextHistory.slice(0, getContextHistoryLength() - 1) + ); + } +} + +export function getContextHistory(type: string[]): ContextResult { + const storedContextHistory = + storage.getItem(CONTEXT_HISTORY_SOCAGE_KEY) || []; + if (typeof storedContextHistory == 'string') return []; + + return ( + storedContextHistory + .filter((context) => context.type && type.includes(context.type.id)) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + .map((context: any) => ({ ...context, subTitle: context.type.id })) + ); +} + +export function setUserDefinedContextHistoryLength(contextLength?: number) { + const contextHistoryLength = getContextHistoryLength(); + + if (contextLength && contextHistoryLength !== contextLength) { + storage.setItem(CONTEXT_HISTORY_LENGTH_KEY, contextLength); + return; + } + if (contextHistoryLength) { + return; + } + storage.setItem(CONTEXT_HISTORY_LENGTH_KEY, CONTEXT_HISTORY_LENGTH); +} + +export function getContextHistoryLength(): number { + const contextHistoryLength = + storage.getItem(CONTEXT_HISTORY_LENGTH_KEY) || CONTEXT_HISTORY_LENGTH; + + return Number(contextHistoryLength) > 5 ? 5 : Number(contextHistoryLength); +} + +function moveItemToTopByIndex( + storedContextHistory: ContextHistoryItem[], + currentContextIndex: number +): any { + throw new Error('Function not implemented.'); +} diff --git a/fusion-portal/react/context/src/hooks/index.ts b/fusion-portal/react/context/src/hooks/index.ts new file mode 100644 index 000000000..e59ee76eb --- /dev/null +++ b/fusion-portal/react/context/src/hooks/index.ts @@ -0,0 +1,3 @@ +export * from './use-current-context'; +export * from './use-relations-by-type'; +export * from './use-context-resolver'; diff --git a/fusion-portal/react/context/src/hooks/use-context-client.ts b/fusion-portal/react/context/src/hooks/use-context-client.ts new file mode 100644 index 000000000..786cb9f24 --- /dev/null +++ b/fusion-portal/react/context/src/hooks/use-context-client.ts @@ -0,0 +1,22 @@ +import { useEffect, useState } from 'react'; + +import { + ClientMethodType, + ServicesModule, +} from '@equinor/fusion-framework-module-services'; +import { ContextApiClient } from '@equinor/fusion-framework-module-services/context'; +import { useFramework } from '@equinor/fusion-framework-react'; + +export const useContextClient = ( + type: T +): ContextApiClient | null => { + const [client, setClient] = useState | null>(null); + + const { modules } = useFramework<[ServicesModule]>(); + + useEffect(() => { + modules.services.createContextClient(type).then(setClient); + }, [modules.services, setClient, type]); + + return client; +}; diff --git a/fusion-portal/react/context/src/hooks/use-context-resolver.ts b/fusion-portal/react/context/src/hooks/use-context-resolver.ts new file mode 100644 index 000000000..8bde7e17f --- /dev/null +++ b/fusion-portal/react/context/src/hooks/use-context-resolver.ts @@ -0,0 +1,141 @@ +import { QueryContextResponse } from '@equinor/fusion-framework-module-services/context/query'; +import { + ContextResolver, + ContextResult, + ContextResultItem, +} from '@equinor/fusion-react-context-selector'; +import { useCallback } from 'react'; + +import { useContextProvider } from '@equinor/fusion-framework-react-app/context'; + +import { useContextClient } from './use-context-client'; +import { clearLocalContext, getContextHistory } from '../configurators'; + +export const useContextResolver = (type: string[]): ContextResolver => { + const contextProvider = useContextProvider(); + + const client = useContextClient('json'); + const minQueryLength = 2; + + const searchQuery = useCallback( + async (search: string): Promise => { + let searchResult: ContextResult = []; + if (!client) { + return [ + singleItem({ + title: 'Client Error', + subTitle: 'No client provided to framework', + isDisabled: true, + isError: true, + }), + ]; + } + + try { + if (!search || search.length < minQueryLength) { + searchResult.push( + singleItem({ + title: `Need ${minQueryLength - search.length} more chars`, + isDisabled: true, + }) + ); + return searchResult; + } + + const contexts = await client.query('v1', { + query: { search, filter: { type } }, + }); + + if (contexts[0] && !contexts[0].id) return searchResult; + // Structure as type + + searchResult = + type.length > 1 + ? contextResultMappedByTypes(contexts) + : contextResultMapped(contexts); + + if (searchResult.length === 0) { + searchResult.push(singleItem({ title: 'No matches...', isDisabled: true })); + } + + return searchResult; + } catch (e) { + return [ + singleItem({ + title: 'API Error', + subTitle: e, + isDisabled: true, + isError: true, + }), + ]; + } + }, + [client, type] + ); + + const children = getContextHistory(type); + + const historyItems = { + id: 'history', + title: 'History', + type: 'section', + children, + }; + + return { + searchQuery, + initialResult: children.length > 0 ? [singleItem(historyItems)] : [], + closeHandler: (e: MouseEvent) => { + e.stopPropagation(); + contextProvider.clearCurrentContext(); + clearLocalContext(); + }, + }; +}; + +const singleItem = (props: unknown): ContextResultItem => { + return Object.assign({ id: '0', title: 'Dummy title' }, props); +}; + +function contextResultMappedByTypes(contexts: QueryContextResponse<'v1'>): ContextResult { + return contexts.reduce((result, context) => { + const index = result.findIndex((r) => r.title === context.type.id); + if (index === -1) { + result.push( + singleItem({ + id: context.type.id, + title: context.type.id, + type: 'section', + children: [ + singleItem({ + id: context.id, + title: context.title || '', + subTitle: context.type?.id, + }), + ], + }) + ); + return result; + } + + result[index].children?.push( + singleItem({ + id: context.id, + title: context.title || '', + subTitle: context.type?.id, + }) + ); + + return result; + }, [] as ContextResult); +} + +function contextResultMapped(contexts: QueryContextResponse<'v1'>): ContextResult { + return contexts.map((context) => + singleItem({ + id: context.id, + title: context.title || '', + subTitle: context.type?.id, + }) + ); +} diff --git a/fusion-portal/react/context/src/hooks/use-current-context.ts b/fusion-portal/react/context/src/hooks/use-current-context.ts new file mode 100644 index 000000000..df44c48c1 --- /dev/null +++ b/fusion-portal/react/context/src/hooks/use-current-context.ts @@ -0,0 +1,10 @@ +import { ContextItem } from '@equinor/fusion-framework-module-context'; +import { useContextProvider } from '@equinor/fusion-framework-react-app/context'; +import { useObservableState } from '@equinor/fusion-observable/react'; + +export const useCurrentContext = >() => { + const provider = useContextProvider(); + const currentContext = useObservableState(provider.currentContext$).value; + + return currentContext as ContextItem | undefined; +}; diff --git a/fusion-portal/react/context/src/hooks/use-relations-by-type.ts b/fusion-portal/react/context/src/hooks/use-relations-by-type.ts new file mode 100644 index 000000000..33f1d5b4f --- /dev/null +++ b/fusion-portal/react/context/src/hooks/use-relations-by-type.ts @@ -0,0 +1,26 @@ +import { useEffect, useMemo, useState } from 'react'; +import { RelationReturnType, RelationsTypes } from '../types/relations'; +import { useContextRelationsQuery } from '../queries/get-context-relations'; + +export function useRelationsByType( + type: RT, + contextId?: string +) { + const [error, setError] = useState(); + const { data, isLoading } = useContextRelationsQuery(contextId); + + const filteredRelations = useMemo(() => { + setError(undefined); + return ( + data?.filter((relation: RelationReturnType) => relation.type.id === type) || [] + ); + }, [data]); + + useEffect(() => { + if (!isLoading && filteredRelations?.length === 0) { + setError(Error(`No context relation found for ${type}`)); + } + }, [isLoading, filteredRelations]); + + return { relations: filteredRelations, isLoading, error }; +} diff --git a/fusion-portal/react/context/src/index.ts b/fusion-portal/react/context/src/index.ts new file mode 100644 index 000000000..349eeccda --- /dev/null +++ b/fusion-portal/react/context/src/index.ts @@ -0,0 +1,3 @@ +export * from './configurators'; +export * from './hooks'; +export * from './components'; diff --git a/fusion-portal/react/context/src/queries/get-context-relations.ts b/fusion-portal/react/context/src/queries/get-context-relations.ts new file mode 100644 index 000000000..51f7c7653 --- /dev/null +++ b/fusion-portal/react/context/src/queries/get-context-relations.ts @@ -0,0 +1,30 @@ +import { useFramework } from '@equinor/fusion-framework-react'; +import { useQuery } from '@tanstack/react-query'; +import { IHttpClient } from '@equinor/fusion-framework-module-http'; +import { RelationReturnType, RelationsTypes } from '../types/relations'; + +export async function getContextRelations( + client: IHttpClient, + contextId?: string, + signal?: AbortSignal +): Promise[] | undefined> { + if (!contextId) return; + const res = await client.fetch(`/contexts/${contextId}/relations`, { signal }); + if (!res.ok) throw res; + return (await res.json()) as RelationReturnType[]; +} + +import { UseQueryResult } from '@tanstack/react-query'; + +export const useContextRelationsQuery = ( + contextId?: string +): UseQueryResult[] | undefined> => { + const client = useFramework().modules.serviceDiscovery.createClient('context'); + + return useQuery({ + queryKey: ['context-relations', contextId], + queryFn: async ({ signal }) => + getContextRelations(await client, contextId, signal), + enabled: Boolean(contextId), + }); +}; diff --git a/fusion-portal/react/context/src/types/relations.ts b/fusion-portal/react/context/src/types/relations.ts new file mode 100644 index 000000000..9bb204243 --- /dev/null +++ b/fusion-portal/react/context/src/types/relations.ts @@ -0,0 +1,134 @@ + + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export type RelationsTypes = + | 'EquinorTask' + | 'Contract' + | 'ProjectMaster' + | 'PimsDomain' + | 'Project' + | 'OrgChart' + | 'Facility'; + +export type RelationReturnType = T extends 'ProjectMaster' + ? Relations + : T extends 'Facility' + ? Relations + : T extends 'OrgChart' + ? Relations + : T extends 'EquinorTask' + ? Relations + : T extends 'Contract' + ? Relations + : T extends 'Project' + ? Relations + : T extends 'PimsDomain' + ? Relations + : Relations; + +export interface Relations { + relationSource: string; + relationType?: any; + id: string; + externalId: string; + source?: any; + type: Type; + value: T extends object ? T : Value; + title: string; + isActive: boolean; + isDeleted: boolean; + created: string; + updated?: string; +} + +export type ProjectMaster = { + facilities: string[]; + projectCategory: string; + cvpid: string; + documentManagementId: string; + phase: string; + portfolioOrganizationalUnit: string; +} & Record; + +interface Value { + identity?: string; + sapPlant?: string; + schema?: string; + subFacilities?: string[]; + parentFacility?: any; + contractNumber?: string; + companyName?: string; + startDate?: string; + endDate?: string; + projectMasterId?: string; + isValid?: boolean; + taskName?: string; + taskType?: string; + taskState?: string; + orgChartId?: string; + orgUnitSapId?: string; + orgUnitShortName?: string; + orgUnitName?: string; + orgUnitDepartment?: string; + orgUnitFullDepartment?: string; + orgUnitType?: string; + domainId?: string; + dgPhase?: string; + siteCode?: string; + projectIdentifier?: string; + wbs?: string; +} + +export interface Contract { + contractNumber?: number; + companyName?: string; + startDate?: string; + endDate?: string; + projectMasterId?: string; + isValid: boolean; +} + +export interface Facility { + identity: string; + sapPlant: string; + schema: string; + subFacilities?: string[]; + parentFacility?: string[]; +} + +export interface OrgChart { + orgChartId?: string; + domainId?: string; + dgPhase?: string; +} + +interface EquinorTask { + taskName?: string; + taskType?: string; + taskState?: string; + orgChartId?: string; + orgUnitSapId?: string; + orgUnitShortName?: string; + orgUnitName?: string; + orgUnitDepartment?: string; + orgUnitFullDepartment?: string; + orgUnitType?: string; + projectMasterId?: string; +} + +interface PDP { + siteCode: string; + projectIdentifier: string; +} + +interface PimsDomain { + domainId?: string; + projectMasterId?: string; +} + +interface Type { + id: string; + isChildType: boolean; + parentTypeIds: string[]; +} diff --git a/fusion-portal/react/context/tsconfig.json b/fusion-portal/react/context/tsconfig.json new file mode 100644 index 000000000..4850365c0 --- /dev/null +++ b/fusion-portal/react/context/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "rootDir": "src", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "types": ["vite/client"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../../tsconfig.base.json" +} diff --git a/fusion-portal/react/context/tsconfig.lib.json b/fusion-portal/react/context/tsconfig.lib.json new file mode 100644 index 000000000..2352aae6c --- /dev/null +++ b/fusion-portal/react/context/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "types": ["node"] + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "dist" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} From 4a0196878b4566f12beaff9cc2984e7c425dd790 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Thu, 7 Nov 2024 15:13:29 +0100 Subject: [PATCH 03/10] feat: Add @equinor/fusion-portal-react-components Adding user components and use-full portal components --- fusion-portal/react/components/package.json | 21 ++++ .../react/components/src/components/index.ts | 4 + .../src/components/message/Message.tsx | 113 +++++++++++++++++ .../project-position/ProjectPosition.tsx | 117 ++++++++++++++++++ .../src/components/skeleton/Skeleton.tsx | 58 +++++++++ .../src/components/user/UserCard.tsx | 17 +++ fusion-portal/react/components/src/index.ts | 1 + .../profile-card-header/ProfileCardHeader.tsx | 66 ++++++++++ fusion-portal/react/components/tsconfig.json | 19 +++ .../react/components/tsconfig.lib.json | 20 +++ 10 files changed, 436 insertions(+) create mode 100644 fusion-portal/react/components/package.json create mode 100644 fusion-portal/react/components/src/components/index.ts create mode 100644 fusion-portal/react/components/src/components/message/Message.tsx create mode 100644 fusion-portal/react/components/src/components/project-position/ProjectPosition.tsx create mode 100644 fusion-portal/react/components/src/components/skeleton/Skeleton.tsx create mode 100644 fusion-portal/react/components/src/components/user/UserCard.tsx create mode 100644 fusion-portal/react/components/src/index.ts create mode 100644 fusion-portal/react/components/src/profile-card-header/ProfileCardHeader.tsx create mode 100644 fusion-portal/react/components/tsconfig.json create mode 100644 fusion-portal/react/components/tsconfig.lib.json diff --git a/fusion-portal/react/components/package.json b/fusion-portal/react/components/package.json new file mode 100644 index 000000000..5cbb0494a --- /dev/null +++ b/fusion-portal/react/components/package.json @@ -0,0 +1,21 @@ +{ + "name": "@equinor/fusion-portal-react-components", + "version": "0.0.0", + "license": "MIT", + "type": "module", + "main": "./dist/src/index.js", + "module": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "private": true, + "scripts": { + "dev": "npm run build -- --watch", + "dev:local": "npm run dev -- --watch", + "build": "tsc -b -f" + }, + "dependencies": { + "@equinor/fusion-react-skeleton": "^0.3.0", + "@equinor/fusion-react-person": "^0.9.2", + "@equinor/fusion-portal-react-context": "workspace:^", + "@equinor/fusion-portal-react-utils": "workspace:^" + } +} diff --git a/fusion-portal/react/components/src/components/index.ts b/fusion-portal/react/components/src/components/index.ts new file mode 100644 index 000000000..5a3b7c71a --- /dev/null +++ b/fusion-portal/react/components/src/components/index.ts @@ -0,0 +1,4 @@ +export * from './skeleton/Skeleton'; +export { User } from './user/UserCard'; + +export { Message } from './message/Message'; diff --git a/fusion-portal/react/components/src/components/message/Message.tsx b/fusion-portal/react/components/src/components/message/Message.tsx new file mode 100644 index 000000000..ae14d1eb9 --- /dev/null +++ b/fusion-portal/react/components/src/components/message/Message.tsx @@ -0,0 +1,113 @@ +import { IconData, error_outlined, warning_outlined } from '@equinor/eds-icons'; +import { Icon } from '@equinor/eds-core-react'; +import { tokens } from '@equinor/eds-tokens'; +import styled from 'styled-components'; +import { PropsWithChildren } from 'react'; + +export type Variant = 'Warning' | 'Error' | 'Info' | 'NoContent'; + +export const getIconVariant = (type: Variant) => { + const variant: Record = { + Error: { + data: warning_outlined, + color: tokens.colors.interactive.danger__resting.rgba, + backColor: tokens.colors.interactive.danger__highlight.hex, + type: 'Error', + }, + Warning: { + data: error_outlined, + color: tokens.colors.interactive.warning__resting.rgba, + backColor: tokens.colors.interactive.warning__highlight.hex, + type: 'Warning', + }, + Info: { + data: error_outlined, + color: tokens.colors.infographic.primary__moss_green_100.rgba, + backColor: tokens.colors.interactive.primary__selected_highlight.hex, + type: 'Info', + }, + NoContent: { + data: error_outlined, + color: tokens.colors.infographic.primary__moss_green_100.rgba, + backColor: tokens.colors.interactive.primary__selected_highlight.hex, + type: 'NoContent', + }, + }; + return variant[type]; +}; + +export type MessageProps = { + type?: Variant; + title: string; + messages?: string[]; +}; + +export const Styled = { + StyledCardIndicator: styled.div<{ color: string }>` + position: absolute; + display: block; + left: 0; + width: 8px; + height: 100%; + background-color: ${({ color }) => color}; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + `, + Content: styled.div` + padding: 1rem 1.5rem; + display: flex; + flex-direction: column; + `, + Header: styled.div` + display: flex; + flex-direction: row; + align-items: center; + `, + Icon: styled.span<{ color: string }>` + flex: none; + border-radius: 100px; + background-color: ${({ color }) => color}; + width: 40px; + height: 40px; + margin-right: 16px; + display: inline-flex; + align-items: center; + justify-content: center; + overflow: visible; + `, + UL: styled.ul` + display: block; + list-style-type: disc; + margin-block-start: 1em; + margin-block-end: 0px; + margin-inline-start: 0px; + margin-inline-end: 0px; + padding-inline-start: 35px; + & > li { + padding-bottom: 0.5rem; + } + `, +}; + +export const Message = ({ title, messages, type = 'Info', children }: PropsWithChildren) => { + const variant = getIconVariant(type); + + return ( + + + + + + {title} + + {messages && ( + + {messages?.map((message, i) => ( +
  • {message}
  • + ))} +
    + )} + {children && children} +
    + ); +}; diff --git a/fusion-portal/react/components/src/components/project-position/ProjectPosition.tsx b/fusion-portal/react/components/src/components/project-position/ProjectPosition.tsx new file mode 100644 index 000000000..a8d303224 --- /dev/null +++ b/fusion-portal/react/components/src/components/project-position/ProjectPosition.tsx @@ -0,0 +1,117 @@ +import { Typography, Icon } from '@equinor/eds-core-react'; + +import { tokens } from '@equinor/eds-tokens'; +import styled from 'styled-components'; + +import { external_link, tag_relations } from '@equinor/eds-icons'; + +import { useMemo } from 'react'; + +import { useRelationsByType } from '@equinor/fusion-portal-react-context'; + +import { useFrameworkCurrentContext } from '@equinor/fusion-framework-react-app/context'; +import { PersonPosition, getFusionPortalURL } from '@equinor/fusion-portal-react-utils'; + +const Style = { + Wrapper: styled.div` + display: flex; + flex-direction: column; + gap: ${tokens.spacings.comfortable.medium}; + padding: ${tokens.spacings.comfortable.medium}; + `, + PositionWrapper: styled.span` + display: flex; + flex-direction: column; + `, + ProjectHeader: styled.div` + display: flex; + justify-content: space-between; + border-bottom: 1px solid ${tokens.colors.ui.background__medium.hex}; + padding: ${tokens.spacings.comfortable.small}; + `, + PositionLink: styled.a` + height: auto; + border: 1px solid ${tokens.colors.ui.background__medium.hex}; + color: ${tokens.colors.interactive.primary__resting.hex}; + border-radius: 4px; + width: 100%; + text-decoration: none; + :hover { + background-color: ${tokens.colors.interactive.primary__hover_alt.hex}; + } + :focus { + background-color: ${tokens.colors.interactive.primary__hover_alt.hex}; + } + `, + Content: styled.div` + padding: ${tokens.spacings.comfortable.medium_small}; + display: flex; + align-items: center; + height: auto; + `, + Icon: styled(Icon)` + padding-right: 1rem; + `, +}; + +export const ProjectPosition = ({ positions }: { positions?: PersonPosition[] }) => { + const { currentContext } = useFrameworkCurrentContext(); + const { relations: equinorTask } = useRelationsByType('OrgChart', currentContext?.id); + + const projectPositions = useMemo(() => { + return ( + positions?.filter((item) => { + return ( + item.appliesTo && + new Date(item.appliesTo) > new Date() && + item.project.id === equinorTask[0]?.externalId + ); + }) || [] + ); + }, [positions, equinorTask]); + + return ( + <> + {projectPositions.length > 0 ? ( + + {projectPositions.map((position) => ( + + + + {position.project.name} + + + + +
    + + {position.name} + + + <> + {position.appliesFrom && + new Date(position.appliesFrom).toLocaleDateString('en-US')} + {' - '} + {position.appliesTo && + new Date(position.appliesTo).toLocaleDateString('en-US')} + ({position.workload}%) + + +
    +
    +
    +
    + ))} +
    + ) : null} + + ); +}; diff --git a/fusion-portal/react/components/src/components/skeleton/Skeleton.tsx b/fusion-portal/react/components/src/components/skeleton/Skeleton.tsx new file mode 100644 index 000000000..75eb593c4 --- /dev/null +++ b/fusion-portal/react/components/src/components/skeleton/Skeleton.tsx @@ -0,0 +1,58 @@ +import FusionSkeleton, { SkeletonSize, SkeletonVariant } from '@equinor/fusion-react-skeleton'; +import { CSSProperties, FC } from 'react'; + +type SkeletonProps = { + width?: number | string; + height?: number | string; + size?: keyof typeof skeletonSize; + variant?: keyof typeof skeletonVariant; + fluid?: boolean; +}; + +const skeletonVariant = { + circle: SkeletonVariant.Circle, + rectangle: SkeletonVariant.Rectangle, + square: SkeletonVariant.Square, + text: SkeletonVariant.Text, +}; + +const skeletonSize = { + xSmall: SkeletonSize.XSmall, + small: SkeletonSize.small, + large: SkeletonSize.Large, + medium: SkeletonSize.Medium, +}; + +/** + * Skeleton Component + * + * The `Skeleton` component is a simplified ree-export of `@equinor/fusion-react-skeleton` a React component used to render skeleton loading elements. + * + * @param width - number (optional) - Specifies the width of the skeleton element in present% + * @param type - string (optional) - Specifies the type of skeleton to render. Should be one of "xSmall" | "small" | "large" | "medium" default is xSmall. + * @param variant - string (optional) - Specifies the variant or shape of the skeleton. Should be one of "circle" | "rectangle" | "square" | "text", default is text. + * @param fluid - boolean (optional) - Expands the skeleton element width to the width of the parent + * + * @returns JSX.Element - A skeleton loading element with the specified type, variant, and width (if provided). + */ +export const Skeleton: FC = ({ + width, + height, + size, + variant, + style, + fluid, +}) => { + return ( + + ); +}; diff --git a/fusion-portal/react/components/src/components/user/UserCard.tsx b/fusion-portal/react/components/src/components/user/UserCard.tsx new file mode 100644 index 000000000..99f842096 --- /dev/null +++ b/fusion-portal/react/components/src/components/user/UserCard.tsx @@ -0,0 +1,17 @@ +import { Card } from '@equinor/eds-core-react'; + +import { useCurrentUserInfo } from '@equinor/fusion-portal-react-utils'; + +import { ProfileCardHeader } from '../../profile-card-header/ProfileCardHeader'; +import { ProjectPosition } from '../project-position/ProjectPosition'; + +export const User = () => { + const { currentUserInfo } = useCurrentUserInfo(); + + return ( + + + + + ); +}; diff --git a/fusion-portal/react/components/src/index.ts b/fusion-portal/react/components/src/index.ts new file mode 100644 index 000000000..07635cbbc --- /dev/null +++ b/fusion-portal/react/components/src/index.ts @@ -0,0 +1 @@ +export * from './components'; diff --git a/fusion-portal/react/components/src/profile-card-header/ProfileCardHeader.tsx b/fusion-portal/react/components/src/profile-card-header/ProfileCardHeader.tsx new file mode 100644 index 000000000..8581376d8 --- /dev/null +++ b/fusion-portal/react/components/src/profile-card-header/ProfileCardHeader.tsx @@ -0,0 +1,66 @@ +import styled from 'styled-components'; +import { Typography } from '@equinor/eds-core-react'; + +import { PersonAvatar } from '@equinor/fusion-react-person'; + +import { Skeleton } from '../components/skeleton/Skeleton'; +import { + PersonDetails, + getDepartment, + getJobTitle, +} from '@equinor/fusion-portal-react-utils'; + +const Style = { + InfoWrapper: styled.div<{ paddingNone?: boolean }>` + display: flex; + align-items: center; + gap: 1rem; + padding: ${({ paddingNone }) => (paddingNone ? '0px' : '1rem')}; + `, +}; + +export const ProfileCardHeader = ({ + user, + trigger = 'none', + paddingNone, +}: { + user?: PersonDetails; + trigger?: 'click' | 'hover' | 'none'; + paddingNone?: boolean; +}) => { + if (!user) { + return ( + + + +
    + +
    + + +
    +
    +
    + ); + } + + return ( + + +
    + {user?.name} +
    + {getDepartment(user)} + {getJobTitle(user)} +
    +
    +
    + ); +}; diff --git a/fusion-portal/react/components/tsconfig.json b/fusion-portal/react/components/tsconfig.json new file mode 100644 index 000000000..309ee7b4c --- /dev/null +++ b/fusion-portal/react/components/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "rootDir": "src", + "types": ["vite/client"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../../tsconfig.base.json" +} diff --git a/fusion-portal/react/components/tsconfig.lib.json b/fusion-portal/react/components/tsconfig.lib.json new file mode 100644 index 000000000..2352aae6c --- /dev/null +++ b/fusion-portal/react/components/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "types": ["node"] + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "dist" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} From c336974797fd2742d856a205824b272897b57a39 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Thu, 7 Nov 2024 15:14:37 +0100 Subject: [PATCH 04/10] feat: Add @equinor/project-portal-common This adds common components use between the project portal landing pages --- package.json | 1 + pnpm-lock.yaml | 1205 +++++++++++++++-- pnpm-workspace.yaml | 1 + portal/project-portal-common/package.json | 20 + .../src/components/index.ts | 1 + .../ProjectPortalInfoBox.tsx | 52 + .../project-portal-common/src/hooks/index.ts | 1 + .../hooks/use-navigate-on-context-change.ts | 27 + portal/project-portal-common/src/index.ts | 3 + .../src/utils/context.ts | 18 + .../project-portal-common/src/utils/header.ts | 21 + .../project-portal-common/src/utils/index.ts | 2 + portal/project-portal-common/tsconfig.json | 18 + .../project-portal-common/tsconfig.lib.json | 20 + 14 files changed, 1257 insertions(+), 133 deletions(-) create mode 100644 portal/project-portal-common/package.json create mode 100644 portal/project-portal-common/src/components/index.ts create mode 100644 portal/project-portal-common/src/components/project-portal-info-box/ProjectPortalInfoBox.tsx create mode 100644 portal/project-portal-common/src/hooks/index.ts create mode 100644 portal/project-portal-common/src/hooks/use-navigate-on-context-change.ts create mode 100644 portal/project-portal-common/src/index.ts create mode 100644 portal/project-portal-common/src/utils/context.ts create mode 100644 portal/project-portal-common/src/utils/header.ts create mode 100644 portal/project-portal-common/src/utils/index.ts create mode 100644 portal/project-portal-common/tsconfig.json create mode 100644 portal/project-portal-common/tsconfig.lib.json diff --git a/package.json b/package.json index bb4469bc0..b8c44ad7f 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "build:reports": "turbo run build --filter ./reports/** --parallel --output-logs errors-only", "build:apps": "turbo run build --filter ./apps/** --parallel --output-logs errors-only", "build:libs": "turbo run build --filter ./libs/* --parallel --output-logs errors-only", + "build:portal": "turbo run build --filter './portal/*' --output-logs errors-only", "build:fusion-portal": "turbo build --filter './fusion-portal/**' --output-logs errors-only", "new:app": "nx generate @cc-components/plugins:fusion-app-generator", "new:report": "nx generate @cc-components/plugins:fusion-report-generator", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9f59f599..9416239ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@equinor/fusion-framework-react-app': specifier: 5.2.10 - version: 5.2.10(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module-msal@3.1.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-bookmark@2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@equinor/fusion-observable@8.4.1(@types/react@18.3.2)(react@18.2.0))(@remix-run/router@1.20.0)(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + version: 5.2.10(n44wd5xnla6pamnggo76zwudvm) '@equinor/fusion-framework-react-module-bookmark': specifier: ^2.1.18 version: 2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) @@ -284,6 +284,57 @@ importers: specifier: workspace:^ version: link:../../libs/workorderapp + fusion-portal/react/components: + dependencies: + '@equinor/fusion-portal-react-context': + specifier: workspace:^ + version: link:../context + '@equinor/fusion-portal-react-utils': + specifier: workspace:^ + version: link:../utils + '@equinor/fusion-react-person': + specifier: ^0.9.2 + version: 0.9.2(react@18.3.1) + '@equinor/fusion-react-skeleton': + specifier: ^0.3.0 + version: 0.3.0(react@18.3.1) + + fusion-portal/react/context: + dependencies: + '@equinor/fusion-framework-module-context': + specifier: ^5.0.12 + version: 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-framework-module-http': + specifier: ^6.2.0 + version: 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react': + specifier: ^7.3.0 + version: 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-app': + specifier: 5.2.10 + version: 5.2.10(unatfo4xzgvrlbpygkkg6vhj3i) + '@equinor/fusion-react-context-selector': + specifier: ^0.6.6 + version: 0.6.6(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + fusion-portal/react/utils: + dependencies: + '@equinor/fusion-framework-module-http': + specifier: ^6.2.0 + version: 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react': + specifier: ^7.3.0 + version: 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@equinor/fusion-portal-react-context': + specifier: workspace:^ + version: link:../context + '@equinor/fusion-react-person': + specifier: ^0.9.2 + version: 0.9.2(react@18.3.1) + '@equinor/fusion-react-skeleton': + specifier: ^0.3.0 + version: 0.3.0(react@18.3.1) + github-action: dependencies: '@actions/core': @@ -606,10 +657,10 @@ importers: version: 2.0.8 '@remirror/react': specifier: ^2.0.35 - version: 2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/react-editors': specifier: ^1.0.41 - version: 1.0.41(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + version: 1.0.41(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@remirror/styles': specifier: ^2.0.7 version: 2.0.7(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) @@ -703,6 +754,69 @@ importers: specifier: workspace:^ version: link:../workordershared + portal/project-portal-common: + dependencies: + '@equinor/fusion-framework-module-context': + specifier: ^5.0.12 + version: 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-portal-react-components': + specifier: workspace:^ + version: link:../../fusion-portal/react/components + '@equinor/fusion-portal-react-context': + specifier: workspace:^ + version: link:../../fusion-portal/react/context + '@equinor/fusion-portal-react-utils': + specifier: workspace:^ + version: link:../../fusion-portal/react/utils + '@equinor/fusion-react-person': + specifier: ^0.9.2 + version: 0.9.2(react@18.3.1) + + portal/project-portal-landingpage: + dependencies: + '@equinor/fusion-framework-module-context': + specifier: ^5.0.12 + version: 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-framework-module-event': + specifier: ^4.2.4 + version: 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-feature-flag': + specifier: ^1.1.9 + version: 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1) + '@equinor/fusion-framework-module-http': + specifier: ^6.2.0 + version: 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react-app': + specifier: 5.2.10 + version: 5.2.10(g4xgb4x7vd3zfrz3mnhr6bpk6i) + '@equinor/fusion-framework-react-module-context': + specifier: ^6.2.13 + version: 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-portal-react-components': + specifier: workspace:^ + version: link:../../fusion-portal/react/components + '@equinor/fusion-portal-react-context': + specifier: workspace:^ + version: link:../../fusion-portal/react/context + '@equinor/fusion-portal-react-utils': + specifier: workspace:^ + version: link:../../fusion-portal/react/utils + '@equinor/fusion-react-context-selector': + specifier: ^0.6.6 + version: 0.6.6(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-react-person': + specifier: ^0.9.2 + version: 0.9.2(react@18.3.1) + '@equinor/fusion-react-skeleton': + specifier: ^0.3.0 + version: 0.3.0(react@18.3.1) + '@equinor/project-portal-common': + specifier: workspace:^ + version: link:../project-portal-common + react-router-dom: + specifier: ^6.27.0 + version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + packages: '@actions/core@1.10.1': @@ -1961,9 +2075,21 @@ packages: '@equinor/eds-tokens': ^0.9.2 '@equinor/fusion-react-styles': ^0.6.2 + '@equinor/fusion-react-context-selector@0.6.6': + resolution: {integrity: sha512-ZTyXR1XQu/Vfl2WRwThU9xew+49v0UjIzQrLws/3NqaT/Fovm9WnMO917FKM76+4ozuWPoKmZofgHbmO8Bs2iQ==} + '@equinor/fusion-react-person@0.8.6': resolution: {integrity: sha512-TqV1mGPHwm9vZouGh7GsDHfCbvy8v24mWzYAMmwiYSDqGBTiBy91QJ4YzTt/D3+TBsZNmEQ76usA1wK+1O4nBQ==} + '@equinor/fusion-react-person@0.9.2': + resolution: {integrity: sha512-FmKZTHkup0zLtKmIBPQ+QUwG8gwo1CCyPYbEtZC1NTV1IYSTS7tIm1jdiQi45DLWOIrilTIvFbNiHf3b4ynuvA==} + + '@equinor/fusion-react-searchable-dropdown@0.5.2': + resolution: {integrity: sha512-spfXwfFBMyv8c8biX0tn3GJhzM5TOWoxTRBgNBbzuDZzBKZ8KpmdzzHth5EOgV7BqsiVGLtQheZBZP9rNI1G/A==} + + '@equinor/fusion-react-skeleton@0.3.0': + resolution: {integrity: sha512-7YBUC2M2FcrV1XmHqjHb243kptPFW5LQZR5C+ejFCbYJltfRiHDCbXIRC8l1G7URPbt6h8TgJGbyGnNanoIC6w==} + '@equinor/fusion-react-styles@0.6.2': resolution: {integrity: sha512-cfyq1TCrXffsv4mekdIJyzocvkiHpga708o+W9RsgvMCv076qV1pIau1fLNmbXLpeCtMzEG0V9soIVKRylJ4uw==} peerDependencies: @@ -1984,48 +2110,90 @@ packages: '@equinor/fusion-wc-avatar@3.2.1': resolution: {integrity: sha512-JpqJt88pHDJekuh+IlIa2TnZeKhQc4ox7LABQeFMnneqFGK+BxqgBCIxx+zeqxVsXmWeKg4H2G6ktasyMwV5Tg==} + '@equinor/fusion-wc-avatar@3.2.3': + resolution: {integrity: sha512-R4QrPz+lzIdYnc1s/6RixQb6MQ/sn1t1h+/P9MictC1bpxXaBKNA7XonxOXQyP9ivZHXLIZK8lNW6vtxiZXurQ==} + '@equinor/fusion-wc-badge@1.3.1': resolution: {integrity: sha512-Tf3+vRg/CP8b9BwnQkJZYJhnKy5c6/QrP97a/cMF5VBiqDo81pOI0ckTILNEIgxIJ7XEgEwlB/H8ahjQGSoEng==} + '@equinor/fusion-wc-badge@1.3.2': + resolution: {integrity: sha512-RnwtNC+USW388qFafoOxM+7EEmCgWC2sxbjlcyIfBlp0ladgMCEdSnJiSJL1Nb/Qdne7BJWQi3oAA9xnku4Rhg==} + '@equinor/fusion-wc-button@2.4.1': resolution: {integrity: sha512-ESPnClP78oOX1YYBgBtHXPS6pH5wgd5O19AlAD39w05Zeyqdd0i0gQ8M7YUH0grIZuQw4IEQ7tKE9OVxkJsPAg==} + '@equinor/fusion-wc-button@2.4.2': + resolution: {integrity: sha512-NPhY6GLO6MQnZLNnqtLrAbZrodm1ogsK65OL+VleN0NlYZzZ7i2li99itXSMSgXg5fit1YZ4ONonPzZ9BN4HFw==} + '@equinor/fusion-wc-checkbox@1.1.1': resolution: {integrity: sha512-anLfHPuyO9VIsByGp5BAZEMo/wRy/YiCilnE0dlqi4AY5/DxfnjHkvMEinbQ9yeu2y3r/Mp3Oi6TBmYN4cIBXw==} + '@equinor/fusion-wc-checkbox@1.1.2': + resolution: {integrity: sha512-lAD6yh4cvuTCNisiYjyB1BvGg566YkQFa9m+/hzIVIlQRk0UQn9/FHa8BB/DnAj9O/K6IrgRx7tabrXIDrzHUg==} + '@equinor/fusion-wc-core@2.0.0': resolution: {integrity: sha512-yxUepfQhMIkKNYn2Vc73R6/cyvyO0hde3LXFitCCaa8QR9woK0UXZlxP+RwnEYzve528l9K1t7SnEsX6x5eyPg==} '@equinor/fusion-wc-divider@1.1.1': resolution: {integrity: sha512-vM09tJy8yoGXVSwCVlptb1uu/9PeOON84vZiSmsuWySkNiDM3xpRARjLhT83XWW/rO7Y8oyM/3D61LVvX274gA==} + '@equinor/fusion-wc-divider@1.1.2': + resolution: {integrity: sha512-kb5kmq8S+aMqe+91RNHmJtjCg8ecrnB5DYrcm6RzucLicxL0NTwlLAJfy49xDR5kzt2laoyq6XsQ+4MqnlTbyw==} + '@equinor/fusion-wc-icon@2.3.0': resolution: {integrity: sha512-CRyIHnvmZ/WOzZwhsoxNL3DkN30wk7jskEa6i+YsiqFkV1xAGgMPQJjhmXI1jhewRoT4o09WcUjnLaYQ6CUdsQ==} + '@equinor/fusion-wc-icon@2.3.1': + resolution: {integrity: sha512-uwmlMWb0/ZOXzHgzFge7x3ZEWfDzvuHPhTfBe9gF4hCNE2ZpQU3TlQd/UZh4B6/0xVhdfAMdZyhAOmjW7OzDZA==} + '@equinor/fusion-wc-list@1.1.2': resolution: {integrity: sha512-oY8P7t/h/BMkK8h0CNKqvbvRk02OiIKxKwd5o5HmA3IKmBDrY49PvlEEVyhP5yjshbEfolIPnhe8tSeigKVbYA==} + '@equinor/fusion-wc-list@1.1.3': + resolution: {integrity: sha512-eKzpPA1/8k6uQu6/5ozfywJWHUBPcwOzcZbHz4/Rzu1fb5b932Eot/yUsacDRhnSigbgBvsOqU0phDp2OuV6yA==} + '@equinor/fusion-wc-person@2.6.7': resolution: {integrity: sha512-uSb1GCWthFmJmjcP/binAN/GK3Ph/x4MPWHl0tGiUEk8zGkhLOs+URG3wk3mLTIDlY3LtnjDA1mnRbeLhPU80w==} + '@equinor/fusion-wc-person@3.0.3': + resolution: {integrity: sha512-e+c/3UvldhNoeHqLl2kHDNF9YCnA0srMv9h2lHBZFxSfWZLszrVdbnXxEPNrd9au1C8fp2NYN3arEvuJO5X+GA==} + '@equinor/fusion-wc-picture@3.1.0': resolution: {integrity: sha512-3RQmbd0ZBJ4IBI93EP5e7P535qCG8BMKYkEAi67O9vKPOppzijtRenrdKQKHLAZ7jBtW7bRPTsW8dl6hyunjig==} + '@equinor/fusion-wc-picture@3.1.1': + resolution: {integrity: sha512-TeZd46sjyg43HHlbE4h9Ebk9wCBnif5j9XGodIdVTCaC7rLz2YEd7C6RS7vj3nS+goFIZmowiUUmg6gZemzY4w==} + '@equinor/fusion-wc-radio@1.1.1': resolution: {integrity: sha512-Id5krecYRBFbeaIn0S22RNZzHiJ8ZSJnsaeXcqgjy61u4w88bguDaVmwH2kBO0kCG31HBJiBilvrs2YwnxdqzA==} + '@equinor/fusion-wc-radio@1.1.2': + resolution: {integrity: sha512-XO0rGD74dVQTtyI4GIjg1CuINbQ7DUUiNohvBWsYoLdG6TmvnCuO+2KfRNMdlwVTyog7Nm6qIl9agjQUOHQS0Q==} + '@equinor/fusion-wc-ripple@1.1.0': resolution: {integrity: sha512-eoWfj39NFnNhT4/stqw3x706pT68Kkc9oA6LIeOJW2H5rBKhJ/5vzMWwFo7CWPISd7jf52t/wlLF9Zfj0JXW7A==} + '@equinor/fusion-wc-ripple@1.1.1': + resolution: {integrity: sha512-TuyBqTRekg7Kh+09+guD7P0HldGOkE7gicYF+rW1yfVFJGwCjBWQ+2EDqhImDPViRq5RWvE73Y8Ajayt/wO0Qw==} + '@equinor/fusion-wc-searchable-dropdown@3.7.3': resolution: {integrity: sha512-2NzLqDK6zQpYTRNWYeemoY9Bz0O1HzG1bVjKZuFExCoSHThMeBXXaf5+WTWtkhpikSGU9GAjFMgDVGhQ0/8T0w==} + '@equinor/fusion-wc-searchable-dropdown@3.7.4': + resolution: {integrity: sha512-ED34b/1f6Sg05TT5lUhakhZHGfWiLpMLy0PhAuO18BhWVpHMHikQeoaZU1P13he6ks/GCIXt+K+2/Y47nBi4Ng==} + '@equinor/fusion-wc-skeleton@2.1.1': resolution: {integrity: sha512-X0z5EHEShzANHTrw3BPvpNJUMDdmlU9OcOucfYfzk2sY0adqVPNEPnnDV56hP+0JMsQ7OYgFPsfrEf+44yTutw==} + '@equinor/fusion-wc-skeleton@2.1.2': + resolution: {integrity: sha512-LqrfUAg6BEqBi59kNs08UG+K7ESCvYJ6NMDIXI8EBTy1x2nt12D2JRXAE5zIeYU4+I084/zwKwt62Gx3yFtSkA==} + '@equinor/fusion-wc-textinput@1.1.1': resolution: {integrity: sha512-vEjbkiKulwTPesTl0mycNKtiA2/rZoJSJPlPZA1KmOwy6INDHaIP86QwfHiA3/nzqSAg8XRNcpZlLdN2XGr16g==} + '@equinor/fusion-wc-textinput@1.1.2': + resolution: {integrity: sha512-ZnN3nCCIvSJnfN6aLiE6Zr2euC0gSQB9X6R/2RxQYRPK++vRfbMH5gkafCJDDyS89A1WU0orDL7Ulgkq1XowMw==} + '@equinor/fusion-wc-theme@1.1.1': resolution: {integrity: sha512-zuiBp3pzVCwQtJ2zoejBdkdillx95R//NAw4rutYIwtrM/08V6J1T5OgFRY5w7nGwTjxL0D/KC3ZNrppG3wsVA==} @@ -2410,6 +2578,9 @@ packages: '@floating-ui/core@1.6.1': resolution: {integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.5': resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} @@ -2447,6 +2618,9 @@ packages: '@floating-ui/utils@0.2.2': resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@formatjs/ecma402-abstract@1.18.2': resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==} @@ -2684,6 +2858,9 @@ packages: '@lit-labs/observers@2.0.2': resolution: {integrity: sha512-eZb5+W9Cb0e/Y5m1DNxBSGTvGB2TAVTGMnTxL/IzFhPQEcZIAHewW1eVBhN8W07A5tirRaAmmF6fGL1V20p3gQ==} + '@lit-labs/observers@2.0.4': + resolution: {integrity: sha512-x95jhDPGb+HtYU3hEdqkcLxb6v2JBP3tcajaiOijs1F/ZmOgRT0pRPn0v+jhhk8mAAbEO12SZJjPCmuysunssQ==} + '@lit-labs/ssr-dom-shim@1.2.0': resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} @@ -4413,6 +4590,9 @@ packages: '@tanstack/query-core@5.51.21': resolution: {integrity: sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==} + '@tanstack/query-core@5.59.17': + resolution: {integrity: sha512-jWdDiif8kaqnRGHNXAa9CnudtxY5v9DUxXhodgqX2Rwzj+1UwStDHEbBd9IA5C7VYAaJ2s+BxFR6PUBs8ERorA==} + '@tanstack/query-devtools@5.59.19': resolution: {integrity: sha512-Gw+3zsADpqiYgx/6MMr9bP1+x2LR8vOuGjo5Un/89qwwP3z7WAHPWFagLFDYkLq68NX7ekUpW/EOYlUMugMXGA==} @@ -4427,6 +4607,11 @@ packages: peerDependencies: react: 18.2.0 + '@tanstack/react-query@5.59.19': + resolution: {integrity: sha512-xLRfyFyQOFcLltKCds0LijfC6/HQJrrTTnZB8ciyn74LIkVAm++vZJ6eUVG20RmJtdP8REdy7vSOYW4M3//XLA==} + peerDependencies: + react: 18.2.0 + '@tanstack/react-virtual@3.0.0-beta.30': resolution: {integrity: sha512-Sn1SSbSjDwb++jVOtgiQ/OHFMdcXFg8Qx02/cn0eq9xxHIhm/SqrKDpywIeydgNdOsdfBomOfxm/4gqTLrY1gg==} peerDependencies: @@ -4691,6 +4876,9 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -6642,12 +6830,18 @@ packages: lit-element@4.0.5: resolution: {integrity: sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==} + lit-element@4.1.1: + resolution: {integrity: sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==} + lit-html@2.8.0: resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} lit-html@3.1.3: resolution: {integrity: sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==} + lit-html@3.2.1: + resolution: {integrity: sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==} + lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} @@ -6657,6 +6851,9 @@ packages: lit@3.1.2: resolution: {integrity: sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==} + lit@3.2.0: + resolution: {integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==} + load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -7566,6 +7763,19 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-router-dom@6.27.0: + resolution: {integrity: sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: 18.2.0 + react-dom: 18.2.0 + + react-router@6.27.0: + resolution: {integrity: sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: 18.2.0 + react-sortablejs@6.1.4: resolution: {integrity: sha512-fc7cBosfhnbh53Mbm6a45W+F735jwZ1UFIYSrIqcO/gRIFoDyZeMtgKlpV4DdyQfbCzdh5LoALLTDRxhMpTyXQ==} peerDependencies: @@ -10042,7 +10252,7 @@ snapshots: '@emnapi/runtime@1.1.1': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 optional: true '@emotion/babel-plugin@11.11.0': @@ -10207,18 +10417,18 @@ snapshots: lodash: 4.17.21 three: 0.154.0 - '@equinor/eds-core-react@0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/eds-core-react@0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: '@babel/runtime': 7.24.5 '@equinor/eds-icons': 0.17.0 '@equinor/eds-tokens': 0.9.0 - '@equinor/eds-utils': 0.7.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-utils': 0.7.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@floating-ui/react-dom-interactions': 0.10.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-virtual': 3.0.0-beta.30(react@18.2.0) downshift: 7.6.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -10258,6 +10468,25 @@ snapshots: react-dom: 18.2.0(react@18.2.0) styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/eds-core-react@0.37.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@babel/runtime': 7.24.5 + '@equinor/eds-icons': 0.21.0 + '@equinor/eds-tokens': 0.9.2 + '@equinor/eds-utils': 0.8.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@floating-ui/react': 0.26.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@internationalized/date': 3.5.3 + '@react-aria/utils': 3.24.0(react@18.2.0) + '@react-stately/calendar': 3.5.0(react@18.2.0) + '@react-stately/datepicker': 3.9.3(react@18.2.0) + '@react-types/shared': 3.23.0(react@18.2.0) + '@tanstack/react-virtual': 3.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + downshift: 9.0.4(react@18.2.0) + react: 18.2.0 + react-aria: 3.33.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/eds-icons@0.17.0': {} '@equinor/eds-icons@0.18.0': {} @@ -10270,7 +10499,7 @@ snapshots: '@equinor/eds-tokens@0.9.2': {} - '@equinor/eds-utils@0.7.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/eds-utils@0.7.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: '@babel/runtime': 7.24.5 '@equinor/eds-tokens': 0.9.0 @@ -10279,7 +10508,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-popper: 2.3.0(@popperjs/core@2.11.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -10306,6 +10535,31 @@ snapshots: react-dom: 18.2.0(react@18.2.0) styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/eds-utils@0.8.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@babel/runtime': 7.24.5 + '@equinor/eds-tokens': 0.9.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + '@equinor/fusion-framework-app@9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework': 7.2.8(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1) + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + optionalDependencies: + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - odata-query + - react + '@equinor/fusion-framework-app@9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0)': dependencies: '@equinor/fusion-framework': 7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0) @@ -10323,6 +10577,23 @@ snapshots: - odata-query - react + '@equinor/fusion-framework-app@9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework': 7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + optionalDependencies: + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - odata-query + - react + '@equinor/fusion-framework-cli@10.0.2(@types/node@20.12.7)(typescript@5.0.2)': dependencies: '@vitejs/plugin-react': 4.3.3(vite@5.4.10(@types/node@20.12.7)) @@ -10362,6 +10633,18 @@ snapshots: '@ag-grid-enterprise/core': 32.2.2 '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-app@6.0.0(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.12)(react@18.3.1) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - chalk + - react + '@equinor/fusion-framework-module-app@6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)': dependencies: '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) @@ -10374,6 +10657,18 @@ snapshots: - chalk - react + '@equinor/fusion-framework-module-app@6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.3.1) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - chalk + - react + '@equinor/fusion-framework-module-bookmark@1.2.12(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.2.0)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10386,6 +10681,17 @@ snapshots: - chalk - react + '@equinor/fusion-framework-module-context@5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1) + fast-deep-equal: 3.1.3 + rxjs: 7.8.1 + transitivePeerDependencies: + - '@types/react' + - chalk + - react + '@equinor/fusion-framework-module-context@5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)(rxjs@7.8.1)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10397,6 +10703,17 @@ snapshots: - chalk - react + '@equinor/fusion-framework-module-context@5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) + fast-deep-equal: 3.1.3 + rxjs: 7.8.1 + transitivePeerDependencies: + - '@types/react' + - chalk + - react + '@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10404,6 +10721,19 @@ snapshots: transitivePeerDependencies: - '@types/semver' + '@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.12)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + uuid: 10.0.0 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - react + optional: true + '@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10417,6 +10747,18 @@ snapshots: - react optional: true + '@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + uuid: 10.0.0 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - react + '@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10439,6 +10781,19 @@ snapshots: '@remix-run/router': 1.20.0 rxjs: 7.8.1 + '@equinor/fusion-framework-module-service-discovery@8.0.1(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1) + rxjs: 7.8.1 + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - react + '@equinor/fusion-framework-module-service-discovery@8.0.1(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.2.0)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10452,6 +10807,19 @@ snapshots: - chalk - react + '@equinor/fusion-framework-module-service-discovery@8.0.1(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) + rxjs: 7.8.1 + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - react + '@equinor/fusion-framework-module-services@4.1.5(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(odata-query@7.0.6)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10464,24 +10832,24 @@ snapshots: optionalDependencies: '@types/semver': 7.5.8 - ? '@equinor/fusion-framework-react-app@5.2.10(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module-msal@3.1.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-bookmark@2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@equinor/fusion-observable@8.4.1(@types/react@18.3.2)(react@18.2.0))(@remix-run/router@1.20.0)(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1)' - : dependencies: - '@equinor/fusion-framework-app': 9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0) + '@equinor/fusion-framework-react-app@5.2.10(g4xgb4x7vd3zfrz3mnhr6bpk6i)': + dependencies: + '@equinor/fusion-framework-app': 9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) - '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) + '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) '@equinor/fusion-framework-module-navigation': 4.0.7(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@remix-run/router@1.20.0)(rxjs@7.8.1) - '@equinor/fusion-framework-react': 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 + '@equinor/fusion-framework-react': 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 optionalDependencies: - '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0) + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1) '@equinor/fusion-framework-react-module-bookmark': 2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) - '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1) '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) '@types/react': 18.3.2 - react-dom: 18.2.0(react@18.2.0) + react-dom: 18.3.1(react@18.3.1) rxjs: 7.8.1 transitivePeerDependencies: - '@equinor/fusion-framework-module-event' @@ -10492,36 +10860,92 @@ snapshots: - chalk - odata-query - '@equinor/fusion-framework-react-module-bookmark@2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1)': + '@equinor/fusion-framework-react-app@5.2.10(n44wd5xnla6pamnggo76zwudvm)': dependencies: - '@equinor/fusion-framework-module-bookmark': 1.2.12(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.2.0) - '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-app': 9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-navigation': 4.0.7(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@remix-run/router@1.20.0)(rxjs@7.8.1) '@equinor/fusion-framework-react': 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) - '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 - rxjs: 7.8.1 optionalDependencies: + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0) + '@equinor/fusion-framework-react-module-bookmark': 2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) '@types/react': 18.3.2 react-dom: 18.2.0(react@18.2.0) + rxjs: 7.8.1 transitivePeerDependencies: - - '@equinor/fusion-framework-module' - '@equinor/fusion-framework-module-event' - - '@equinor/fusion-framework-module-feature-flag' - '@equinor/fusion-framework-module-http' - - '@equinor/fusion-framework-react-module-context' - '@equinor/fusion-framework-react-module-signalr' + - '@remix-run/router' - '@types/semver' - chalk - odata-query - '@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1)': + '@equinor/fusion-framework-react-app@5.2.10(unatfo4xzgvrlbpygkkg6vhj3i)': dependencies: - '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)(rxjs@7.8.1) - '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) - '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) + '@equinor/fusion-framework-app': 9.1.10(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-app': 6.0.0(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-navigation': 4.0.7(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@remix-run/router@1.20.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react': 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1) + '@equinor/fusion-framework-react-module-bookmark': 2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) + '@types/react': 18.3.12 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.1 + transitivePeerDependencies: + - '@equinor/fusion-framework-module-event' + - '@equinor/fusion-framework-module-http' + - '@equinor/fusion-framework-react-module-signalr' + - '@remix-run/router' + - '@types/semver' + - chalk + - odata-query + + '@equinor/fusion-framework-react-module-bookmark@2.1.18(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1)': + dependencies: + '@equinor/fusion-framework-module-bookmark': 1.2.12(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.2.0) + '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react': 7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) + react: 18.2.0 + rxjs: 7.8.1 + optionalDependencies: + '@types/react': 18.3.2 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@equinor/fusion-framework-module' + - '@equinor/fusion-framework-module-event' + - '@equinor/fusion-framework-module-feature-flag' + - '@equinor/fusion-framework-module-http' + - '@equinor/fusion-framework-react-module-context' + - '@equinor/fusion-framework-react-module-signalr' + - '@types/semver' + - chalk + - odata-query + + '@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1)': + dependencies: + '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)(rxjs@7.8.1) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.2.0) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0) react: 18.2.0 optionalDependencies: '@types/react': 18.3.2 @@ -10532,6 +10956,40 @@ snapshots: - chalk - rxjs + '@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)': + dependencies: + '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.3.1) + '@equinor/fusion-query': 5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.2 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@equinor/fusion-framework-module' + - '@types/semver' + - chalk + - rxjs + + '@equinor/fusion-framework-react-module-http@8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + react-dom: 18.2.0(react@18.3.1) + + '@equinor/fusion-framework-react-module-http@8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + react-dom: 18.3.1(react@18.3.1) + '@equinor/fusion-framework-react-module-http@8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) @@ -10541,6 +10999,35 @@ snapshots: '@types/react': 18.3.2 react-dom: 18.2.0(react@18.2.0) + '@equinor/fusion-framework-react-module-http@8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.2 + react-dom: 18.3.1(react@18.3.1) + + '@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + react-dom: 18.2.0(react@18.3.1) + transitivePeerDependencies: + - '@types/semver' + + '@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/semver' + '@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10551,6 +11038,58 @@ snapshots: transitivePeerDependencies: - '@types/semver' + '@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.2 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/semver' + + '@equinor/fusion-framework-react@7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework': 7.2.8(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.2.0(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + rxjs: 7.8.1 + optionalDependencies: + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@types/react': 18.3.12 + react-dom: 18.2.0(react@18.3.1) + transitivePeerDependencies: + - '@equinor/fusion-framework-module-http' + - '@types/semver' + - chalk + - odata-query + + '@equinor/fusion-framework-react@7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework': 7.2.8(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.12)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + rxjs: 7.8.1 + optionalDependencies: + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.12)(@types/semver@7.5.8)(react@18.3.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1) + '@types/react': 18.3.12 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@equinor/fusion-framework-module-http' + - '@types/semver' + - chalk + - odata-query + '@equinor/fusion-framework-react@7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.2.0))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@equinor/fusion-framework': 7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0) @@ -10572,6 +11111,44 @@ snapshots: - chalk - odata-query + '@equinor/fusion-framework-react@7.3.0(@equinor/fusion-framework-module-event@4.2.4(@types/semver@7.5.8))(@equinor/fusion-framework-module-feature-flag@1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1))(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module-context@6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-framework': 7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1) + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-react-module': 3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-framework-react-module-http': 8.0.0(@equinor/fusion-framework-module-http@6.2.0(@types/semver@7.5.8))(@equinor/fusion-framework-react-module@3.1.6(@types/react@18.3.2)(@types/semver@7.5.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.3.1) + react: 18.3.1 + rxjs: 7.8.1 + optionalDependencies: + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-feature-flag': 1.1.9(@types/react@18.3.2)(@types/semver@7.5.8)(react@18.3.1) + '@equinor/fusion-framework-react-module-context': 6.2.13(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1) + '@types/react': 18.3.2 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@equinor/fusion-framework-module-http' + - '@types/semver' + - chalk + - odata-query + + '@equinor/fusion-framework@7.2.8(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-service-discovery': 8.0.1(@types/react@18.3.12)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.3.1) + '@equinor/fusion-framework-module-services': 4.1.5(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(odata-query@7.0.6) + rxjs: 7.8.1 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - odata-query + - react + '@equinor/fusion-framework@7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.2.0)': dependencies: '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) @@ -10589,11 +11166,37 @@ snapshots: - odata-query - react + '@equinor/fusion-framework@7.2.8(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(odata-query@7.0.6)(react@18.3.1)': + dependencies: + '@equinor/fusion-framework-module': 4.3.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-context': 5.0.12(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)(rxjs@7.8.1) + '@equinor/fusion-framework-module-event': 4.2.4(@types/semver@7.5.8) + '@equinor/fusion-framework-module-http': 6.2.0(@types/semver@7.5.8) + '@equinor/fusion-framework-module-msal': 3.1.5(@types/semver@7.5.8) + '@equinor/fusion-framework-module-service-discovery': 8.0.1(@types/react@18.3.2)(@types/semver@7.5.8)(chalk@5.3.0)(react@18.3.1) + '@equinor/fusion-framework-module-services': 4.1.5(@equinor/fusion-framework-module@4.3.5(@types/semver@7.5.8))(odata-query@7.0.6) + rxjs: 7.8.1 + transitivePeerDependencies: + - '@types/react' + - '@types/semver' + - chalk + - odata-query + - react + '@equinor/fusion-log@1.1.0(chalk@5.3.0)(rxjs@7.8.1)': dependencies: chalk: 5.3.0 rxjs: 7.8.1 + '@equinor/fusion-observable@8.4.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + immer: 9.0.21 + react: 18.3.1 + rxjs: 7.8.1 + uuid: 10.0.0 + optionalDependencies: + '@types/react': 18.3.12 + '@equinor/fusion-observable@8.4.1(@types/react@18.3.2)(react@18.2.0)': dependencies: immer: 9.0.21 @@ -10603,6 +11206,28 @@ snapshots: optionalDependencies: '@types/react': 18.3.2 + '@equinor/fusion-observable@8.4.1(@types/react@18.3.2)(react@18.3.1)': + dependencies: + immer: 9.0.21 + react: 18.3.1 + rxjs: 7.8.1 + uuid: 10.0.0 + optionalDependencies: + '@types/react': 18.3.2 + + '@equinor/fusion-query@5.1.3(@types/react@18.3.12)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-log': 1.1.0(chalk@5.3.0)(rxjs@7.8.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.12)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + uuid: 10.0.0 + optionalDependencies: + '@types/react': 18.3.12 + react: 18.3.1 + transitivePeerDependencies: + - chalk + '@equinor/fusion-query@5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.2.0)': dependencies: '@equinor/fusion-log': 1.1.0(chalk@5.3.0)(rxjs@7.8.1) @@ -10616,6 +11241,19 @@ snapshots: transitivePeerDependencies: - chalk + '@equinor/fusion-query@5.1.3(@types/react@18.3.2)(chalk@5.3.0)(react@18.3.1)': + dependencies: + '@equinor/fusion-log': 1.1.0(chalk@5.3.0)(rxjs@7.8.1) + '@equinor/fusion-observable': 8.4.1(@types/react@18.3.2)(react@18.3.1) + immer: 9.0.21 + rxjs: 7.8.1 + uuid: 10.0.0 + optionalDependencies: + '@types/react': 18.3.2 + react: 18.3.1 + transitivePeerDependencies: + - chalk + '@equinor/fusion-react-ag-grid-styles@31.2.1(@ag-grid-community/styles@32.3.2)(@equinor/fusion-react-styles@0.6.2(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: '@ag-grid-community/styles': 32.3.2 @@ -10627,6 +11265,30 @@ snapshots: '@equinor/eds-tokens': 0.9.2 '@equinor/fusion-react-styles': 0.6.2(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@equinor/fusion-react-context-selector@0.6.6(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-react-searchable-dropdown': 0.5.2(react@18.3.1) + '@equinor/fusion-react-styles': 0.6.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-react-utils': 2.1.1(react@18.3.1) + '@equinor/fusion-wc-icon': 2.3.0 + '@equinor/fusion-wc-searchable-dropdown': 3.7.3 + transitivePeerDependencies: + - '@types/react' + - react + - react-dom + + '@equinor/fusion-react-context-selector@0.6.6(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-react-searchable-dropdown': 0.5.2(react@18.3.1) + '@equinor/fusion-react-styles': 0.6.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@equinor/fusion-react-utils': 2.1.1(react@18.3.1) + '@equinor/fusion-wc-icon': 2.3.0 + '@equinor/fusion-wc-searchable-dropdown': 3.7.3 + transitivePeerDependencies: + - '@types/react' + - react + - react-dom + '@equinor/fusion-react-person@0.8.6(react@18.2.0)': dependencies: '@equinor/fusion-react-utils': 2.1.1(react@18.2.0) @@ -10634,6 +11296,28 @@ snapshots: transitivePeerDependencies: - react + '@equinor/fusion-react-person@0.9.2(react@18.3.1)': + dependencies: + '@equinor/fusion-react-utils': 2.1.1(react@18.3.1) + '@equinor/fusion-wc-person': 3.0.3 + transitivePeerDependencies: + - react + + '@equinor/fusion-react-searchable-dropdown@0.5.2(react@18.3.1)': + dependencies: + '@equinor/fusion-react-utils': 2.1.1(react@18.3.1) + '@equinor/fusion-wc-icon': 2.3.0 + '@equinor/fusion-wc-searchable-dropdown': 3.7.3 + transitivePeerDependencies: + - react + + '@equinor/fusion-react-skeleton@0.3.0(react@18.3.1)': + dependencies: + '@equinor/fusion-react-utils': 2.1.1(react@18.3.1) + '@equinor/fusion-wc-skeleton': 2.1.1 + transitivePeerDependencies: + - react + '@equinor/fusion-react-styles@0.6.2(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@equinor/fusion-wc-theme': 1.1.1 @@ -10645,6 +11329,17 @@ snapshots: '@types/react': 18.3.12 react-dom: 18.2.0(react@18.2.0) + '@equinor/fusion-react-styles@0.6.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-wc-theme': 1.1.1 + '@equinor/fusion-web-theme': 0.1.10 + '@material-ui/styles': 4.11.5(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + react-dom: 18.3.1(react@18.3.1) + '@equinor/fusion-react-styles@0.6.2(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@equinor/fusion-wc-theme': 1.1.1 @@ -10656,11 +11351,27 @@ snapshots: '@types/react': 18.3.2 react-dom: 18.2.0(react@18.2.0) + '@equinor/fusion-react-styles@0.6.2(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@equinor/fusion-wc-theme': 1.1.1 + '@equinor/fusion-web-theme': 0.1.10 + '@material-ui/styles': 4.11.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.2 + react-dom: 18.3.1(react@18.3.1) + '@equinor/fusion-react-utils@2.1.1(react@18.2.0)': dependencies: date-fns: 3.6.0 react: 18.2.0 + '@equinor/fusion-react-utils@2.1.1(react@18.3.1)': + dependencies: + date-fns: 3.6.0 + react: 18.3.1 + '@equinor/fusion-wc-avatar@3.2.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10669,6 +11380,14 @@ snapshots: '@equinor/fusion-web-theme': 0.1.10 lit: 3.1.2 + '@equinor/fusion-wc-avatar@3.2.3': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-picture': 3.1.1 + '@equinor/fusion-wc-ripple': 1.1.1 + '@equinor/fusion-web-theme': 0.1.10 + lit: 3.2.0 + '@equinor/fusion-wc-badge@1.3.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10676,6 +11395,13 @@ snapshots: '@equinor/fusion-web-theme': 0.1.10 lit: 3.1.2 + '@equinor/fusion-wc-badge@1.3.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-web-theme': 0.1.10 + lit: 3.2.0 + '@equinor/fusion-wc-button@2.4.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10686,6 +11412,16 @@ snapshots: '@material/mwc-icon-button-toggle': 0.27.0 lit: 3.1.2 + '@equinor/fusion-wc-button@2.4.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-web-theme': 0.1.10 + '@material/mwc-button': 0.27.0 + '@material/mwc-icon-button': 0.27.0 + '@material/mwc-icon-button-toggle': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-checkbox@1.1.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10693,6 +11429,13 @@ snapshots: '@material/mwc-checkbox': 0.27.0 lit: 3.1.2 + '@equinor/fusion-wc-checkbox@1.1.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-web-theme': 0.1.10 + '@material/mwc-checkbox': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-core@2.0.0': {} '@equinor/fusion-wc-divider@1.1.1': @@ -10701,12 +11444,24 @@ snapshots: '@equinor/fusion-web-theme': 0.1.10 lit: 3.1.2 + '@equinor/fusion-wc-divider@1.1.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-web-theme': 0.1.10 + lit: 3.2.0 + '@equinor/fusion-wc-icon@2.3.0': dependencies: '@equinor/eds-icons': 0.19.3 '@equinor/fusion-wc-core': 2.0.0 lit: 3.0.2 + '@equinor/fusion-wc-icon@2.3.1': + dependencies: + '@equinor/eds-icons': 0.21.0 + '@equinor/fusion-wc-core': 2.0.0 + lit: 3.2.0 + '@equinor/fusion-wc-list@1.1.2': dependencies: '@equinor/fusion-wc-checkbox': 1.1.1 @@ -10718,6 +11473,17 @@ snapshots: '@material/mwc-list': 0.27.0 lit: 3.1.2 + '@equinor/fusion-wc-list@1.1.3': + dependencies: + '@equinor/fusion-wc-checkbox': 1.1.2 + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-divider': 1.1.2 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-wc-radio': 1.1.2 + '@equinor/fusion-web-theme': 0.1.10 + '@material/mwc-list': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-person@2.6.7': dependencies: '@equinor/fusion-wc-avatar': 3.2.1 @@ -10735,11 +11501,33 @@ snapshots: '@lit-labs/task': 3.1.0 lit: 3.1.2 + '@equinor/fusion-wc-person@3.0.3': + dependencies: + '@equinor/fusion-wc-avatar': 3.2.3 + '@equinor/fusion-wc-badge': 1.3.2 + '@equinor/fusion-wc-button': 2.4.2 + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-wc-list': 1.1.3 + '@equinor/fusion-wc-searchable-dropdown': 3.7.4 + '@equinor/fusion-wc-skeleton': 2.1.2 + '@equinor/fusion-wc-textinput': 1.1.2 + '@equinor/fusion-web-theme': 0.1.10 + '@floating-ui/dom': 1.6.12 + '@lit-labs/observers': 2.0.4 + '@lit-labs/task': 3.1.0 + lit: 3.2.0 + '@equinor/fusion-wc-picture@3.1.0': dependencies: '@equinor/fusion-wc-core': 2.0.0 lit: 3.0.2 + '@equinor/fusion-wc-picture@3.1.1': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + lit: 3.2.0 + '@equinor/fusion-wc-radio@1.1.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10747,12 +11535,25 @@ snapshots: '@material/mwc-radio': 0.27.0 lit: 3.1.2 + '@equinor/fusion-wc-radio@1.1.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-web-theme': 0.1.10 + '@material/mwc-radio': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-ripple@1.1.0': dependencies: '@equinor/fusion-wc-core': 2.0.0 '@material/mwc-ripple': 0.27.0 lit: 3.0.2 + '@equinor/fusion-wc-ripple@1.1.1': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@material/mwc-ripple': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-searchable-dropdown@3.7.3': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10767,12 +11568,32 @@ snapshots: lit: 3.1.2 uuid: 9.0.1 + '@equinor/fusion-wc-searchable-dropdown@3.7.4': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-divider': 1.1.2 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-wc-list': 1.1.3 + '@equinor/fusion-wc-textinput': 1.1.2 + '@equinor/fusion-web-theme': 0.1.10 + '@lit-labs/task': 3.1.0 + '@material/mwc-textfield': 0.27.0 + '@types/uuid': 10.0.0 + lit: 3.2.0 + uuid: 10.0.0 + '@equinor/fusion-wc-skeleton@2.1.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 '@equinor/fusion-web-theme': 0.1.10 lit: 3.1.2 + '@equinor/fusion-wc-skeleton@2.1.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-web-theme': 0.1.10 + lit: 3.2.0 + '@equinor/fusion-wc-textinput@1.1.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10781,6 +11602,14 @@ snapshots: '@material/mwc-textfield': 0.27.0 lit: 3.1.2 + '@equinor/fusion-wc-textinput@1.1.2': + dependencies: + '@equinor/fusion-wc-core': 2.0.0 + '@equinor/fusion-wc-icon': 2.3.1 + '@equinor/fusion-web-theme': 0.1.10 + '@material/mwc-textfield': 0.27.0 + lit: 3.2.0 + '@equinor/fusion-wc-theme@1.1.1': dependencies: '@equinor/fusion-wc-core': 2.0.0 @@ -10823,7 +11652,7 @@ snapshots: - '@ag-grid-community/styles' - '@types/react' - '@equinor/workspace-ag-grid@3.0.3(@ag-grid-community/styles@32.3.2)(@ag-grid-enterprise/core@31.2.1)(@types/react@18.3.2)(react-is@18.3.1)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/workspace-ag-grid@3.0.3(@ag-grid-community/styles@32.3.2)(@ag-grid-enterprise/core@31.2.1)(@types/react@18.3.2)(react-is@18.3.1)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: '@ag-grid-community/client-side-row-model': 31.2.1 '@ag-grid-community/core': 31.2.1 @@ -10848,17 +11677,17 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.3.1 - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@ag-grid-community/styles' - '@types/react' - '@equinor/workspace-filter@4.0.5(@babel/core@7.24.5)(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/workspace-filter@4.0.5(@babel/core@7.24.5)(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: - '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/eds-icons': 0.18.0 '@equinor/eds-tokens': 0.9.2 - '@tanstack/react-query': 5.51.21(react@18.2.0) + '@tanstack/react-query': 5.59.19(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-error-boundary: 4.1.2(react@18.2.0) @@ -10866,7 +11695,7 @@ snapshots: react-sortablejs: 6.1.4(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sortablejs@1.15.3) react-virtual: 2.10.4(react@18.2.0) sortablejs: 1.15.3 - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@babel/core' - '@types/sortablejs' @@ -10874,20 +11703,20 @@ snapshots: '@equinor/workspace-fusion@9.0.17(@ag-grid-community/styles@32.3.2)(@ag-grid-enterprise/core@31.2.1)(@babel/core@7.24.5)(@types/react@18.3.2)(@types/sortablejs@1.15.8)(immer@10.1.1)(react-is@18.3.1)': dependencies: - '@equinor/eds-core-react': 0.37.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-core-react': 0.37.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/eds-icons': 0.21.0 '@equinor/eds-tokens': 0.9.2 - '@equinor/workspace-ag-grid': 3.0.3(@ag-grid-community/styles@32.3.2)(@ag-grid-enterprise/core@31.2.1)(@types/react@18.3.2)(react-is@18.3.1)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - '@equinor/workspace-filter': 4.0.5(@babel/core@7.24.5)(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - '@equinor/workspace-garden': 8.0.2(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/workspace-ag-grid': 3.0.3(@ag-grid-community/styles@32.3.2)(@ag-grid-enterprise/core@31.2.1)(@types/react@18.3.2)(react-is@18.3.1)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/workspace-filter': 4.0.5(@babel/core@7.24.5)(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/workspace-garden': 8.0.2(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/workspace-powerbi': 3.0.7(@types/sortablejs@1.15.8) - '@equinor/workspace-react': 2.0.1(@babel/core@7.24.5)(@types/react@18.3.2)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - '@tanstack/react-query': 5.51.21(react@18.2.0) + '@equinor/workspace-react': 2.0.1(@babel/core@7.24.5)(@types/react@18.3.2)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@tanstack/react-query': 5.59.19(react@18.2.0) re-resizable: 6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-error-boundary: 4.1.2(react@18.2.0) - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@ag-grid-community/styles' - '@ag-grid-enterprise/core' @@ -10898,29 +11727,29 @@ snapshots: - react-is - supports-color - '@equinor/workspace-garden@8.0.2(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/workspace-garden@8.0.2(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: - '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/eds-icons': 0.18.0 '@equinor/eds-tokens': 0.9.0 - '@tanstack/react-query': 5.51.21(react@18.2.0) - '@tanstack/react-query-devtools': 5.59.19(@tanstack/react-query@5.51.21(react@18.2.0))(react@18.2.0) + '@tanstack/react-query': 5.59.19(react@18.2.0) + '@tanstack/react-query-devtools': 5.59.19(@tanstack/react-query@5.59.19(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-error-boundary: 4.1.2(react@18.2.0) react-is: 18.3.1 react-virtual: 2.10.4(react@18.2.0) - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@babel/core' - supports-color '@equinor/workspace-powerbi@3.0.7(@types/sortablejs@1.15.8)': dependencies: - '@equinor/eds-core-react': 0.37.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-core-react': 0.37.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/eds-icons': 0.21.0 '@equinor/eds-tokens': 0.9.2 - '@tanstack/react-query': 5.51.21(react@18.2.0) + '@tanstack/react-query': 5.59.19(react@18.2.0) markdown-to-jsx: 7.5.0(react@18.2.0) powerbi-client: 2.23.1 powerbi-client-react: 1.4.0(react@18.2.0) @@ -10931,19 +11760,19 @@ snapshots: react-sortablejs: 6.1.4(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sortablejs@1.15.3) react-virtual: 2.10.4(react@18.2.0) sortablejs: 1.15.3 - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) transitivePeerDependencies: - '@types/sortablejs' - '@equinor/workspace-react@2.0.1(@babel/core@7.24.5)(@types/react@18.3.2)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@equinor/workspace-react@2.0.1(@babel/core@7.24.5)(@types/react@18.3.2)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: - '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@equinor/eds-core-react': 0.28.0(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@equinor/eds-icons': 0.18.0 '@equinor/eds-tokens': 0.9.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.3.1 - styled-components: 6.1.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: 6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) zustand: 4.5.5(@types/react@18.3.2)(immer@10.1.1)(react@18.2.0) transitivePeerDependencies: - '@babel/core' @@ -11160,6 +11989,11 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.2 + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.1 + '@floating-ui/utils': 0.2.8 + '@floating-ui/dom@1.6.5': dependencies: '@floating-ui/core': 1.6.1 @@ -11215,29 +12049,31 @@ snapshots: '@floating-ui/utils@0.2.2': {} + '@floating-ui/utils@0.2.8': {} + '@formatjs/ecma402-abstract@1.18.2': dependencies: '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 + tslib: 2.8.1 '@formatjs/fast-memoize@2.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@formatjs/icu-messageformat-parser@2.7.6': dependencies: '@formatjs/ecma402-abstract': 1.18.2 '@formatjs/icu-skeleton-parser': 1.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@formatjs/icu-skeleton-parser@1.8.0': dependencies: '@formatjs/ecma402-abstract': 1.18.2 - tslib: 2.6.2 + tslib: 2.8.1 '@formatjs/intl-localematcher@0.5.4': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@humanfs/core@0.19.1': {} @@ -11470,6 +12306,11 @@ snapshots: dependencies: '@lit/reactive-element': 2.0.4 + '@lit-labs/observers@2.0.4': + dependencies: + '@lit/reactive-element': 2.0.4 + lit-html: 3.2.1 + '@lit-labs/ssr-dom-shim@1.2.0': {} '@lit-labs/task@3.1.0': @@ -11511,6 +12352,29 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + '@material-ui/styles@4.11.5(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/hash': 0.8.0 + '@material-ui/types': 5.1.0(@types/react@18.3.12) + '@material-ui/utils': 4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 1.2.1 + csstype: 2.6.21 + hoist-non-react-statics: 3.3.2 + jss: 10.10.0 + jss-plugin-camel-case: 10.10.0 + jss-plugin-default-unit: 10.10.0 + jss-plugin-global: 10.10.0 + jss-plugin-nested: 10.10.0 + jss-plugin-props-sort: 10.10.0 + jss-plugin-rule-value-function: 10.10.0 + jss-plugin-vendor-prefixer: 10.10.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@material-ui/styles@4.11.5(@types/react@18.3.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 @@ -11534,6 +12398,29 @@ snapshots: optionalDependencies: '@types/react': 18.3.2 + '@material-ui/styles@4.11.5(@types/react@18.3.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.5 + '@emotion/hash': 0.8.0 + '@material-ui/types': 5.1.0(@types/react@18.3.2) + '@material-ui/utils': 4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 1.2.1 + csstype: 2.6.21 + hoist-non-react-statics: 3.3.2 + jss: 10.10.0 + jss-plugin-camel-case: 10.10.0 + jss-plugin-default-unit: 10.10.0 + jss-plugin-global: 10.10.0 + jss-plugin-nested: 10.10.0 + jss-plugin-props-sort: 10.10.0 + jss-plugin-rule-value-function: 10.10.0 + jss-plugin-vendor-prefixer: 10.10.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.2 + '@material-ui/types@5.1.0(@types/react@18.3.12)': optionalDependencies: '@types/react': 18.3.12 @@ -11550,22 +12437,30 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-is: 17.0.2 + '@material-ui/utils@4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.5 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 17.0.2 + '@material/animation@14.0.0-canary.53b3cad2f.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@material/base@14.0.0-canary.53b3cad2f.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@material/density@14.0.0-canary.53b3cad2f.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@material/dom@14.0.0-canary.53b3cad2f.0': dependencies: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/elevation@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11574,15 +12469,15 @@ snapshots: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/rtl': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/feature-targeting@14.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@material/feature-targeting@14.0.0-canary.53b3cad2f.0': dependencies: - tslib: 2.6.2 + tslib: 2.8.1 '@material/floating-label@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11593,7 +12488,7 @@ snapshots: '@material/rtl': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 '@material/typography': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/focus-ring@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11607,7 +12502,7 @@ snapshots: '@material/base': 14.0.0-canary.53b3cad2f.0 '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/list@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11620,14 +12515,14 @@ snapshots: '@material/shape': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 '@material/typography': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-base@0.27.0': dependencies: '@material/base': 14.0.0-canary.53b3cad2f.0 '@material/dom': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-button@0.27.0': dependencies: @@ -11641,13 +12536,13 @@ snapshots: '@material/mwc-base': 0.27.0 '@material/mwc-ripple': 0.27.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-floating-label@0.27.0': dependencies: '@material/floating-label': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-icon-button-toggle@0.27.0': dependencies: @@ -11666,13 +12561,13 @@ snapshots: '@material/mwc-icon@0.27.0': dependencies: lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-line-ripple@0.27.0': dependencies: '@material/line-ripple': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-list@0.27.0': dependencies: @@ -11691,7 +12586,7 @@ snapshots: '@material/mwc-base': 0.27.0 '@material/notched-outline': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-radio@0.27.0': dependencies: @@ -11699,7 +12594,7 @@ snapshots: '@material/mwc-ripple': 0.27.0 '@material/radio': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-ripple@0.27.0': dependencies: @@ -11707,7 +12602,7 @@ snapshots: '@material/mwc-base': 0.27.0 '@material/ripple': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/mwc-textfield@0.27.0': dependencies: @@ -11719,7 +12614,7 @@ snapshots: '@material/mwc-notched-outline': 0.27.0 '@material/textfield': 14.0.0-canary.53b3cad2f.0 lit: 2.8.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/notched-outline@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11729,7 +12624,7 @@ snapshots: '@material/rtl': 14.0.0-canary.53b3cad2f.0 '@material/shape': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/radio@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11742,7 +12637,7 @@ snapshots: '@material/ripple': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 '@material/touch-target': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/ripple@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11752,19 +12647,19 @@ snapshots: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/rtl': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/rtl@14.0.0-canary.53b3cad2f.0': dependencies: '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/shape@14.0.0-canary.53b3cad2f.0': dependencies: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/rtl': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/textfield@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11782,7 +12677,7 @@ snapshots: '@material/theme': 14.0.0-canary.53b3cad2f.0 '@material/tokens': 14.0.0-canary.53b3cad2f.0 '@material/typography': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/theme@14.0.0': dependencies: @@ -11792,7 +12687,7 @@ snapshots: '@material/theme@14.0.0-canary.53b3cad2f.0': dependencies: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/tokens@14.0.0-canary.53b3cad2f.0': dependencies: @@ -11803,13 +12698,13 @@ snapshots: '@material/base': 14.0.0-canary.53b3cad2f.0 '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/rtl': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@material/typography@14.0.0-canary.53b3cad2f.0': dependencies: '@material/feature-targeting': 14.0.0-canary.53b3cad2f.0 '@material/theme': 14.0.0-canary.53b3cad2f.0 - tslib: 2.6.2 + tslib: 2.8.1 '@messageformat/parser@5.1.0': dependencies: @@ -12040,7 +12935,7 @@ snapshots: '@nrwl/tao@18.3.4(@swc-node/register@1.9.0(@swc/core@1.5.6(@swc/helpers@0.5.12))(@swc/types@0.1.12)(typescript@5.0.2))(@swc/core@1.5.6(@swc/helpers@0.5.12))': dependencies: nx: 18.3.4(@swc-node/register@1.9.0(@swc/core@1.5.6(@swc/helpers@0.5.12))(@swc/types@0.1.12)(typescript@5.0.2))(@swc/core@1.5.6(@swc/helpers@0.5.12)) - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -13584,7 +14479,7 @@ snapshots: - jsdom - supports-color - '@remirror/extension-react-component@2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/extension-react-component@2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.12.7) @@ -13595,13 +14490,13 @@ snapshots: react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/extension-react-tables@2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/extension-react-tables@2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@emotion/css': 11.11.2 @@ -13614,9 +14509,9 @@ snapshots: '@remirror/messages': 2.0.6 '@remirror/pm': 2.0.8 '@remirror/preset-core': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.12.7) - '@remirror/react-components': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-components': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/theme': 2.0.9(@remirror/pm@2.0.8) optionalDependencies: react: 18.2.0 @@ -13879,19 +14774,19 @@ snapshots: - jsdom - supports-color - '@remirror/preset-react@2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/preset-react@2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.12.7) '@remirror/extension-placeholder': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7) - '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/pm': 2.0.8 '@remirror/react-utils': 2.0.7(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@types/node' - jsdom @@ -13930,7 +14825,7 @@ snapshots: - prettier - supports-color - '@remirror/react-components@2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/react-components@2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@emotion/react': 11.11.4(@types/react@18.3.12)(react@18.2.0) @@ -13965,8 +14860,8 @@ snapshots: '@remirror/icons': 2.0.3 '@remirror/messages': 2.0.6 '@remirror/pm': 2.0.8 - '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/react-utils': 2.0.7(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) '@remirror/theme': 2.0.9(@remirror/pm@2.0.8) '@seznam/compose-react-refs': 1.0.6 @@ -13979,7 +14874,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@types/node' - '@types/prettier' @@ -13987,16 +14882,16 @@ snapshots: - prettier - supports-color - '@remirror/react-core@2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/react-core@2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.12.7) '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.12.7) - '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/i18n': 2.0.5 '@remirror/pm': 2.0.8 '@remirror/preset-core': 2.0.16(@remirror/pm@2.0.8)(@types/node@20.12.7) - '@remirror/preset-react': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/preset-react': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/react-renderer': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react@18.3.12)(react@18.2.0) '@remirror/react-utils': 2.0.7(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) '@remirror/theme': 2.0.9(@remirror/pm@2.0.8) @@ -14009,19 +14904,19 @@ snapshots: tiny-warning: 1.0.3 optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@types/node' - jsdom - supports-color - '@remirror/react-editors@1.0.41(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@remirror/react-editors@1.0.41(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: '@babel/runtime': 7.24.5 '@remirror/core-helpers': 3.0.0 - '@remirror/extension-react-tables': 2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/extension-react-tables': 2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/pm': 2.0.8 - '@remirror/react': 2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react': 2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/styles': 2.0.7(@emotion/css@11.13.4)(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)(styled-components@6.1.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) '@svgmoji/noto': 3.2.0 '@types/refractor': 3.4.1 @@ -14033,7 +14928,7 @@ snapshots: svgmoji: 3.2.0 optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@emotion/css' - '@emotion/react' @@ -14046,7 +14941,7 @@ snapshots: - styled-components - supports-color - '@remirror/react-hooks@2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/react-hooks@2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@remirror/core': 2.0.19(@remirror/pm@2.0.8)(@types/node@20.12.7) @@ -14058,14 +14953,14 @@ snapshots: '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.12.7) '@remirror/i18n': 2.0.5 '@remirror/pm': 2.0.8 - '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/react-utils': 2.0.7(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) multishift: 2.0.9(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.2.0) use-previous: 1.2.0(@types/react@18.3.12)(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -14098,24 +14993,24 @@ snapshots: transitivePeerDependencies: - '@remirror/pm' - '@remirror/react@2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@remirror/react@2.0.35(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.24.5 '@remirror/extension-placeholder': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7) '@remirror/extension-positioner': 2.1.8(@remirror/pm@2.0.8)(@types/node@20.12.7) - '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/extension-react-tables': 2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/preset-react': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-components': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.0)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/extension-react-component': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/extension-react-tables': 2.2.19(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/preset-react': 2.0.14(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-components': 2.1.17(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-core': 2.0.21(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@remirror/react-hooks': 2.0.25(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@remirror/react-renderer': 2.0.13(@remirror/pm@2.0.8)(@types/node@20.12.7)(@types/react@18.3.12)(react@18.2.0) '@remirror/react-utils': 2.0.7(@remirror/pm@2.0.8)(@types/react@18.3.12)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 - '@types/react-dom': 18.3.0 + '@types/react-dom': 18.3.1 transitivePeerDependencies: - '@remirror/pm' - '@types/node' @@ -14375,7 +15270,7 @@ snapshots: '@swc/helpers@0.4.36': dependencies: legacy-swc-helpers: '@swc/helpers@0.4.14' - tslib: 2.6.2 + tslib: 2.8.1 '@swc/helpers@0.5.12': dependencies: @@ -14391,12 +15286,14 @@ snapshots: '@tanstack/query-core@5.51.21': {} + '@tanstack/query-core@5.59.17': {} + '@tanstack/query-devtools@5.59.19': {} - '@tanstack/react-query-devtools@5.59.19(@tanstack/react-query@5.51.21(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query-devtools@5.59.19(@tanstack/react-query@5.59.19(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/query-devtools': 5.59.19 - '@tanstack/react-query': 5.51.21(react@18.2.0) + '@tanstack/react-query': 5.59.19(react@18.2.0) react: 18.2.0 '@tanstack/react-query@5.51.21(react@18.2.0)': @@ -14404,6 +15301,11 @@ snapshots: '@tanstack/query-core': 5.51.21 react: 18.2.0 + '@tanstack/react-query@5.59.19(react@18.2.0)': + dependencies: + '@tanstack/query-core': 5.59.17 + react: 18.2.0 + '@tanstack/react-virtual@3.0.0-beta.30(react@18.2.0)': dependencies: '@tanstack/virtual-core': 3.0.0-beta.30 @@ -14664,6 +15566,8 @@ snapshots: '@types/unist@3.0.2': {} + '@types/uuid@10.0.0': {} + '@types/uuid@9.0.8': {} '@types/webxr@0.5.16': {} @@ -14734,7 +15638,7 @@ snapshots: '@yarnpkg/parsers@3.0.0-rc.46': dependencies: js-yaml: 3.14.1 - tslib: 2.6.2 + tslib: 2.8.1 '@zkochan/js-yaml@0.0.6': dependencies: @@ -14812,7 +15716,7 @@ snapshots: aria-hidden@1.2.4: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 aria-query@5.3.0: dependencies: @@ -15655,7 +16559,7 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 react-is: 17.0.2 - tslib: 2.6.2 + tslib: 2.8.1 downshift@7.6.2(react@18.3.1): dependencies: @@ -15664,7 +16568,7 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 react-is: 17.0.2 - tslib: 2.6.2 + tslib: 2.8.1 downshift@9.0.4(react@18.2.0): dependencies: @@ -15673,7 +16577,7 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 react-is: 18.3.1 - tslib: 2.6.2 + tslib: 2.8.1 draco3d@1.5.7: {} @@ -16601,7 +17505,7 @@ snapshots: '@formatjs/ecma402-abstract': 1.18.2 '@formatjs/fast-memoize': 2.2.0 '@formatjs/icu-messageformat-parser': 2.7.6 - tslib: 2.6.2 + tslib: 2.8.1 is-alphabetical@1.0.4: {} @@ -17006,6 +17910,12 @@ snapshots: '@lit/reactive-element': 2.0.4 lit-html: 3.1.3 + lit-element@4.1.1: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit/reactive-element': 2.0.4 + lit-html: 3.2.1 + lit-html@2.8.0: dependencies: '@types/trusted-types': 2.0.7 @@ -17014,6 +17924,10 @@ snapshots: dependencies: '@types/trusted-types': 2.0.7 + lit-html@3.2.1: + dependencies: + '@types/trusted-types': 2.0.7 + lit@2.8.0: dependencies: '@lit/reactive-element': 1.6.3 @@ -17032,6 +17946,12 @@ snapshots: lit-element: 4.0.5 lit-html: 3.1.3 + lit@3.2.0: + dependencies: + '@lit/reactive-element': 2.0.4 + lit-element: 4.1.1 + lit-html: 3.2.1 + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -18215,6 +19135,13 @@ snapshots: react: 18.2.0 scheduler: 0.23.2 + react-dom@18.2.0(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + optional: true + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -18261,6 +19188,18 @@ snapshots: react-refresh@0.14.2: {} + react-router-dom@6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.20.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.27.0(react@18.3.1) + + react-router@6.27.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.20.0 + react: 18.3.1 + react-sortablejs@6.1.4(@types/sortablejs@1.15.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sortablejs@1.15.3): dependencies: '@types/sortablejs': 1.15.8 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index acda1f46b..8db582449 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - 'libs/**' - 'apps/*' + - 'portal/*' - 'fusion-portal/**' - 'cli' - 'github-action' diff --git a/portal/project-portal-common/package.json b/portal/project-portal-common/package.json new file mode 100644 index 000000000..b3570fc41 --- /dev/null +++ b/portal/project-portal-common/package.json @@ -0,0 +1,20 @@ +{ + "name": "@equinor/project-portal-common", + "version": "0.0.1", + "license": "MIT", + "main": "./dist/src/index.js", + "module": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "scripts": { + "dev": "npm run build -- --watch", + "dev:local": "npm run dev -- --watch", + "build": "tsc -b -f" + }, + "dependencies": { + "@equinor/fusion-portal-react-context": "workspace:^", + "@equinor/fusion-portal-react-components": "workspace:^", + "@equinor/fusion-framework-module-context": "^5.0.12", + "@equinor/fusion-portal-react-utils": "workspace:^", + "@equinor/fusion-react-person": "^0.9.2" + } +} diff --git a/portal/project-portal-common/src/components/index.ts b/portal/project-portal-common/src/components/index.ts new file mode 100644 index 000000000..ea3f76de0 --- /dev/null +++ b/portal/project-portal-common/src/components/index.ts @@ -0,0 +1 @@ +export * from './project-portal-info-box/ProjectPortalInfoBox'; diff --git a/portal/project-portal-common/src/components/project-portal-info-box/ProjectPortalInfoBox.tsx b/portal/project-portal-common/src/components/project-portal-info-box/ProjectPortalInfoBox.tsx new file mode 100644 index 000000000..d6e04836f --- /dev/null +++ b/portal/project-portal-common/src/components/project-portal-info-box/ProjectPortalInfoBox.tsx @@ -0,0 +1,52 @@ +import styled from 'styled-components'; +import { tokens } from '@equinor/eds-tokens'; +import { Card, Typography } from '@equinor/eds-core-react'; + +const Styled = { + FusionInfo: styled(Card).withConfig({ displayName: 'info-box' })` + background: ${tokens.colors.infographic.primary__moss_green_21.hex}; + position: relative; + padding: ${tokens.spacings.comfortable.medium}; + `, + InfoTitle: styled(Typography).withConfig({ displayName: 'info-box' })` + margin-bottom: ${tokens.spacings.comfortable.small}; + `, + Ul: styled.ul` + margin: 0; + padding-left: ${tokens.spacings.comfortable.medium}; + `, + CloseButton: styled.div` + position: absolute; + top: ${tokens.spacings.comfortable.small}; + right: ${tokens.spacings.comfortable.small}; + `, +}; + +export const ProjectPortalInfoBox = (): JSX.Element => { + return ( + + + Project Portal gives you quick access to + + +
  • + + Verified data from multiple sources + +
  • +
  • + + Information customized to your position + +
  • +
  • + + Application scoped to your project or facility + +
  • +
    +
    + ); +}; + +export default ProjectPortalInfoBox; diff --git a/portal/project-portal-common/src/hooks/index.ts b/portal/project-portal-common/src/hooks/index.ts new file mode 100644 index 000000000..21bde8424 --- /dev/null +++ b/portal/project-portal-common/src/hooks/index.ts @@ -0,0 +1 @@ +export { useNavigateOnContextChange } from './use-navigate-on-context-change'; diff --git a/portal/project-portal-common/src/hooks/use-navigate-on-context-change.ts b/portal/project-portal-common/src/hooks/use-navigate-on-context-change.ts new file mode 100644 index 000000000..74f06fb48 --- /dev/null +++ b/portal/project-portal-common/src/hooks/use-navigate-on-context-change.ts @@ -0,0 +1,27 @@ +import { useEffect } from 'react'; +import { NavigationModule } from '@equinor/fusion-framework-module-navigation'; +import { useFramework } from '@equinor/fusion-framework-react-app/framework'; +import { EventModule } from '@equinor/fusion-framework-module-event'; + +import { getContextPageURL } from '../utils'; + +/** + * Custom hook that listens for context changes and navigates to the appropriate URL. + * + * This hook uses the `useFramework` hook to access the `NavigationModule` and `EventModule`. + * It sets up an event listener for the `onCurrentContextChanged` event, which triggers + * navigation to a new URL based on the next context provided in the event details. + * + * @returns {void} + */ +export const useNavigateOnContextChange = () => { + const { modules } = useFramework<[NavigationModule, EventModule]>(); + + useEffect(() => { + return modules.event.addEventListener('onCurrentContextChanged', (event) => { + const url = new URL(getContextPageURL(event.detail.next), location.origin); + + modules.navigation.push(url); + }); + }, [modules]); +}; diff --git a/portal/project-portal-common/src/index.ts b/portal/project-portal-common/src/index.ts new file mode 100644 index 000000000..b744aa75a --- /dev/null +++ b/portal/project-portal-common/src/index.ts @@ -0,0 +1,3 @@ +export * from './utils'; +export * from './components'; +export * from './hooks'; diff --git a/portal/project-portal-common/src/utils/context.ts b/portal/project-portal-common/src/utils/context.ts new file mode 100644 index 000000000..1c0047e7d --- /dev/null +++ b/portal/project-portal-common/src/utils/context.ts @@ -0,0 +1,18 @@ +import { ContextItem } from '@equinor/fusion-framework-module-context'; + +const CONTEXT_TYPE_TO_ROUTE_MAP: Record = { + Facility: 'Facility', + ProjectMaster: 'Project', +}; + +export function getContextTypeName(contextTypeId?: string | null) { + return contextTypeId ? CONTEXT_TYPE_TO_ROUTE_MAP[contextTypeId] || '' : ''; +} + +export function getContextPageURL(context?: ContextItem | null) { + if (!context) return `/`; + + if (location.pathname.includes('apps')) return `/${location.pathname}/${context.id}`; + + return `${getContextTypeName(context.type.id).toLowerCase()}/${context.id}`; +} diff --git a/portal/project-portal-common/src/utils/header.ts b/portal/project-portal-common/src/utils/header.ts new file mode 100644 index 000000000..b1c4ce4b0 --- /dev/null +++ b/portal/project-portal-common/src/utils/header.ts @@ -0,0 +1,21 @@ +/** + * Returns a greeting message based on the current time of day. + * + * - "Good morning" if the current time is between 5 AM and 12 PM. + * - "Good afternoon" if the current time is between 12 PM and 5 PM. + * - "Good evening" if the current time is after 5 PM or before 5 AM. + * + * @returns {string} A greeting message. + */ +export const getGreeting = () => { + const currTime = new Date(); + const currHours = currTime.getHours(); + + if (currHours >= 5 && currHours < 12) { + return 'Good morning'; + } else if (currHours >= 12 && currHours < 17) { + return 'Good afternoon'; + } else { + return 'Good evening'; + } +}; diff --git a/portal/project-portal-common/src/utils/index.ts b/portal/project-portal-common/src/utils/index.ts new file mode 100644 index 000000000..fb3b542c3 --- /dev/null +++ b/portal/project-portal-common/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './context'; +export * from './header'; diff --git a/portal/project-portal-common/tsconfig.json b/portal/project-portal-common/tsconfig.json new file mode 100644 index 000000000..6734c59c0 --- /dev/null +++ b/portal/project-portal-common/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "types": ["vite/client"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../tsconfig.base.json" +} diff --git a/portal/project-portal-common/tsconfig.lib.json b/portal/project-portal-common/tsconfig.lib.json new file mode 100644 index 000000000..2352aae6c --- /dev/null +++ b/portal/project-portal-common/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "types": ["node"] + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "dist" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} From af6d41f243cb3375d3a0e920d1a33105d40089f4 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Thu, 7 Nov 2024 15:16:50 +0100 Subject: [PATCH 05/10] feat: Add project-portal-landingpage --- .gitignore | 4 + .../project-portal-landingpage/app.config.ts | 7 ++ .../app.manifest.config.ts | 5 + .../project-portal-landingpage/package.json | 32 +++++ portal/project-portal-landingpage/src/App.tsx | 12 ++ .../src/assets/background.svg | 24 ++++ .../components/allocations/AllocationItem.tsx | 53 ++++++++ .../components/allocations/Allocations.tsx | 116 ++++++++++++++++++ .../context/PortalContextSelector.tsx | 70 +++++++++++ .../src/components/page-header/PageHeader.tsx | 49 ++++++++ .../project-portal-landingpage/src/config.ts | 35 ++++++ .../src/hooks/useUserContexts.ts | 85 +++++++++++++ .../src/import.d.ts | 4 + .../project-portal-landingpage/src/index.ts | 21 ++++ .../src/pages/ProjectPortalPage.tsx | 75 +++++++++++ .../tsconfig.app.json | 23 ++++ .../project-portal-landingpage/tsconfig.json | 22 ++++ .../project-portal-landingpage/vite.config.ts | 26 ++++ 18 files changed, 663 insertions(+) create mode 100644 portal/project-portal-landingpage/app.config.ts create mode 100644 portal/project-portal-landingpage/app.manifest.config.ts create mode 100644 portal/project-portal-landingpage/package.json create mode 100644 portal/project-portal-landingpage/src/App.tsx create mode 100644 portal/project-portal-landingpage/src/assets/background.svg create mode 100644 portal/project-portal-landingpage/src/components/allocations/AllocationItem.tsx create mode 100644 portal/project-portal-landingpage/src/components/allocations/Allocations.tsx create mode 100644 portal/project-portal-landingpage/src/components/context/PortalContextSelector.tsx create mode 100644 portal/project-portal-landingpage/src/components/page-header/PageHeader.tsx create mode 100644 portal/project-portal-landingpage/src/config.ts create mode 100644 portal/project-portal-landingpage/src/hooks/useUserContexts.ts create mode 100644 portal/project-portal-landingpage/src/import.d.ts create mode 100644 portal/project-portal-landingpage/src/index.ts create mode 100644 portal/project-portal-landingpage/src/pages/ProjectPortalPage.tsx create mode 100644 portal/project-portal-landingpage/tsconfig.app.json create mode 100644 portal/project-portal-landingpage/tsconfig.json create mode 100644 portal/project-portal-landingpage/vite.config.ts diff --git a/.gitignore b/.gitignore index 4e38c8c4a..5ff20d3f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # See http://help.github.com/ignore-files/ for more about ignoring files. + + # compiled output /.nx /workspace @@ -47,3 +49,5 @@ Thumbs.db .astro .turbo + +!import.d.ts diff --git a/portal/project-portal-landingpage/app.config.ts b/portal/project-portal-landingpage/app.config.ts new file mode 100644 index 000000000..611d74452 --- /dev/null +++ b/portal/project-portal-landingpage/app.config.ts @@ -0,0 +1,7 @@ +import { defineAppConfig } from '@equinor/fusion-framework-cli'; + +export default defineAppConfig(() => ({ + environment: { + // some env data + }, +})); diff --git a/portal/project-portal-landingpage/app.manifest.config.ts b/portal/project-portal-landingpage/app.manifest.config.ts new file mode 100644 index 000000000..a1ca7b19b --- /dev/null +++ b/portal/project-portal-landingpage/app.manifest.config.ts @@ -0,0 +1,5 @@ +import { defineAppManifest } from '@equinor/fusion-framework-cli'; + +export default defineAppManifest(async (_env) => ({ + displayName: 'Project Portal Landingpage', +})); diff --git a/portal/project-portal-landingpage/package.json b/portal/project-portal-landingpage/package.json new file mode 100644 index 000000000..f0f0e7ac9 --- /dev/null +++ b/portal/project-portal-landingpage/package.json @@ -0,0 +1,32 @@ +{ + "name": "project-portal-landingpage", + "version": "0.0.9", + "description": "", + "private": true, + "type": "module", + "main": "src/index.ts", + "scripts": { + "dev": "fusion-framework-cli app dev", + "build": "tsc -b -f", + "pr:deploy": "tsx ../../github-action/src/releasePr.ts release", + "fprd:deploy": "tsx ../../github-action/src/releaseMain.ts release" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@equinor/fusion-framework-module-context": "^5.0.12", + "@equinor/fusion-framework-module-event": "^4.2.4", + "@equinor/fusion-framework-module-feature-flag": "^1.1.9", + "@equinor/fusion-framework-module-http": "^6.2.0", + "@equinor/fusion-framework-react-app": "5.2.10", + "@equinor/fusion-framework-react-module-context": "^6.2.13", + "@equinor/fusion-react-context-selector": "^0.6.6", + "@equinor/fusion-react-person": "^0.9.2", + "@equinor/fusion-react-skeleton": "^0.3.0", + "@equinor/fusion-portal-react-context": "workspace:^", + "@equinor/fusion-portal-react-components": "workspace:^", + "@equinor/project-portal-common": "workspace:^", + "@equinor/fusion-portal-react-utils": "workspace:^", + "react-router-dom": "^6.27.0" + } +} diff --git a/portal/project-portal-landingpage/src/App.tsx b/portal/project-portal-landingpage/src/App.tsx new file mode 100644 index 000000000..63274359c --- /dev/null +++ b/portal/project-portal-landingpage/src/App.tsx @@ -0,0 +1,12 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ProjectPortalPage } from './pages/ProjectPortalPage'; + +const queryClient = new QueryClient(); + +export const App = () => ( + + ; + +); + +export default App; diff --git a/portal/project-portal-landingpage/src/assets/background.svg b/portal/project-portal-landingpage/src/assets/background.svg new file mode 100644 index 000000000..b407bb339 --- /dev/null +++ b/portal/project-portal-landingpage/src/assets/background.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/portal/project-portal-landingpage/src/components/allocations/AllocationItem.tsx b/portal/project-portal-landingpage/src/components/allocations/AllocationItem.tsx new file mode 100644 index 000000000..679c11eea --- /dev/null +++ b/portal/project-portal-landingpage/src/components/allocations/AllocationItem.tsx @@ -0,0 +1,53 @@ +import { ProjectMaster, Relations } from '@equinor/fusion-portal-react-utils'; +import { useFramework } from '@equinor/fusion-framework-react'; +import { NavigationModule } from '@equinor/fusion-framework-module-navigation'; +import { Typography } from '@equinor/eds-core-react'; +import styled from 'styled-components'; + +const Styles = { + LinkWrapper: styled.span` + display: flex; + align-items: center; + gap: 0.5rem; + `, +}; + +/** + * AllocationItem component renders a single allocation item with a clickable title. + * It navigates to the project page when the title is clicked. + * + * @param {Object} props - The component props. + * @param {Relations} props.allocation - The allocation data. + * @param {number} props.allocationsCount - The total number of allocations. + * @param {number} props.index - The index of the current allocation. + * + * @returns {JSX.Element} The rendered allocation item. + */ +export const AllocationItem = ({ + allocation, + allocationsCount, + index, +}: { + allocation: Relations; + allocationsCount: number; + index: number; +}) => { + const { modules } = useFramework<[NavigationModule]>(); + return ( + +
    {}}>
    + ) => { + e.preventDefault(); + modules.navigation.replace(`/project/${allocation.id}`); + }} + link + title={allocation.title} + href={`/project/${allocation.id}`} + > + {allocation.title} + + {allocationsCount > index + 1 && |} +
    + ); +}; diff --git a/portal/project-portal-landingpage/src/components/allocations/Allocations.tsx b/portal/project-portal-landingpage/src/components/allocations/Allocations.tsx new file mode 100644 index 000000000..c7c8b80c1 --- /dev/null +++ b/portal/project-portal-landingpage/src/components/allocations/Allocations.tsx @@ -0,0 +1,116 @@ +import { Checkbox, LinearProgress, Typography } from '@equinor/eds-core-react'; +import { tokens } from '@equinor/eds-tokens'; +import { useState } from 'react'; +import styled from 'styled-components'; + +import { useUserOrgDetails } from '../../hooks/useUserContexts'; +import { AllocationItem } from './AllocationItem'; + +export const Styles = { + Section: styled.span` + width: 40vw; + display: flex; + flex-direction: column; + gap: 0.5rem; + `, + Heading: styled.div` + padding-top: 1rem; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + `, + + Nav: styled.nav` + padding: 1rem 0; + gap: 0.5rem; + display: flex; + flex-wrap: wrap; + width: 25%; + `, + Loading: styled.div` + padding: 1rem 0; + width: 25%; + `, + Padding: styled.span` + padding: 2rem; + `, +}; + +/** + * Allocations component displays a list of allocated projects for the user. + * It allows toggling between current and all past allocations using a checkbox. + * + * @component + * @example + * return ( + * + * ) + * + * @returns {JSX.Element} The rendered component. + * + * @remarks + * This component uses the `useUserOrgDetails` hook to fetch user organization details. + * It displays a loading indicator while the data is being fetched. + * If no allocations are found, it shows a message indicating that no projects were found. + * + * @hook + * @name useUserOrgDetails + * @param {boolean} value - A boolean indicating whether to fetch all past allocations or only current ones. + * + * @state {boolean} value - State to manage the checkbox value. + * @state {Function} setValue - Function to update the checkbox value. + * + * @returns {JSX.Element} The rendered component. + */ +export const Allocations = () => { + const [showAll, setShowAll] = useState(false); + + const { data: userOrgDetails, isLoading } = useUserOrgDetails(showAll); + + return ( + + + + Allocated Projects + { + setShowAll((show) => !show); + }} + /> + + {showAll ? 'All' : 'Current'} projects: + + {isLoading ? ( + + + Finding your allocations... + + ) : ( + + {userOrgDetails && userOrgDetails.length > 0 ? ( + userOrgDetails.map((allocation, index) => ( + + )) + ) : ( + <> + {userOrgDetails && ( + + Sorry, we could not find any projects from your allocations. + + )} + + )} + + )} + + ); +}; diff --git a/portal/project-portal-landingpage/src/components/context/PortalContextSelector.tsx b/portal/project-portal-landingpage/src/components/context/PortalContextSelector.tsx new file mode 100644 index 000000000..7a3725c41 --- /dev/null +++ b/portal/project-portal-landingpage/src/components/context/PortalContextSelector.tsx @@ -0,0 +1,70 @@ +import { Button } from '@equinor/eds-core-react'; +import styled from 'styled-components'; + +import { + ContextProvider, + ContextSelector, + useCurrentContext, +} from '@equinor/fusion-portal-react-context'; +import { getContextPageURL } from '@equinor/project-portal-common'; +import { NavigationModule } from '@equinor/fusion-framework-module-navigation'; +import { useFramework } from '@equinor/fusion-framework-react'; + +const StyledWrapper = styled.div` + display: flex; + width: 50vw; + flex-direction: row; + justify-content: flex-start; + align-items: center; + gap: 0.5rem; + + > fwc-searchable-dropdown-provider { + flex: 1; + } + + @media only screen and (max-width: 60rem) { + width: 80vw; + } + @media only screen and (max-width: 45rem) { + width: 90vw; + flex-direction: column; + } +`; + +const StyledButton = styled(Button)` + white-space: nowrap; +`; +const StyledActionWrapper = styled.div` + min-width: 120px; +`; + +/** + * PortalContextSelector component provides a UI for selecting and navigating to different contexts within the portal. + * It utilizes the current context and framework modules to render a button that navigates to the selected context's page. + * + * @returns {JSX.Element} The rendered PortalContextSelector component. + */ +export const PortalContextSelector = () => { + const currentContext = useCurrentContext(); + const { modules } = useFramework<[NavigationModule]>(); + + return ( + + + + + {currentContext && ( + { + modules.navigation.push(getContextPageURL(currentContext)); + }} + > + Go to {currentContext.title} + + )} + + + + ); +}; diff --git a/portal/project-portal-landingpage/src/components/page-header/PageHeader.tsx b/portal/project-portal-landingpage/src/components/page-header/PageHeader.tsx new file mode 100644 index 000000000..93cced91b --- /dev/null +++ b/portal/project-portal-landingpage/src/components/page-header/PageHeader.tsx @@ -0,0 +1,49 @@ +import { Typography } from '@equinor/eds-core-react'; +import styled from 'styled-components'; +import background from '../../assets/background.svg'; +import { PropsWithChildren } from 'react'; +import { useCurrentUser } from '@equinor/fusion-framework-react/hooks'; +import { getGreeting } from '@equinor/project-portal-common'; + +export const StyledBackgroundWrapper = styled.section` + background-image: url(${background}); + width: 100%; + height: calc(100vh - var(--header-height, 48px)); + background-size: cover; + background-repeat: no-repeat; + background-position: bottom; + background-color: #dee5e7; + display: flex; + flex-direction: column; + overflow: hidden; +`; + +export const StyledHeader = styled.div` + padding-top: 5%; + display: flex; + flex-direction: column; + align-items: flex-start; + > :not(:first-child) { + margin-left: 0px; + } + margin: 2rem; +`; +export const StyledWrapper = styled.div` + position: relative; +`; + +export const ProjectHeader = ({ children }: PropsWithChildren) => { + const user = useCurrentUser(); + + return ( + + + Welcome to Project Portal + + {getGreeting()} {user?.name} + + + {children} + + ); +}; diff --git a/portal/project-portal-landingpage/src/config.ts b/portal/project-portal-landingpage/src/config.ts new file mode 100644 index 000000000..2d3cacd00 --- /dev/null +++ b/portal/project-portal-landingpage/src/config.ts @@ -0,0 +1,35 @@ +import type { AppModuleInitiator } from '@equinor/fusion-framework-app'; +import { enableContext } from '@equinor/fusion-framework-react-app/context'; +import { enableFeatureFlagging } from '@equinor/fusion-framework-module-feature-flag'; +import { createLocalStoragePlugin } from '@equinor/fusion-framework-module-feature-flag/plugins'; +import { enableNavigation } from '@equinor/fusion-framework-module-navigation'; + +interface Client { + baseUri: string; + defaultScopes: string[]; +} + +export const configure: AppModuleInitiator = (configurator, { env }) => { + const { basename, config } = env; + + enableContext(configurator); + enableNavigation(configurator, basename); + + enableFeatureFlagging(configurator, (builder) => { + builder.addPlugin( + createLocalStoragePlugin([ + { + key: 'project-prediction', + title: 'Allocated Projects', + description: + 'When enabled you will get your allocated projects on the portal landing page', + enabled: true, + }, + ]) + ); + }); + + configurator.onInitialized((f) => console.log(f)); +}; + +export default configure; diff --git a/portal/project-portal-landingpage/src/hooks/useUserContexts.ts b/portal/project-portal-landingpage/src/hooks/useUserContexts.ts new file mode 100644 index 000000000..3143c1f33 --- /dev/null +++ b/portal/project-portal-landingpage/src/hooks/useUserContexts.ts @@ -0,0 +1,85 @@ +import { useFramework } from '@equinor/fusion-framework-react'; +import { useMemo } from 'react'; +import { useQuery } from '@tanstack/react-query'; + +import { from, lastValueFrom, map, mergeMap, reduce, switchMap } from 'rxjs'; +import { + useCurrentUserInfo, + RelationReturnType, + Relations, +} from '@equinor/fusion-portal-react-utils'; + +type ID = { id: string }; + +/** + * Custom hook to fetch user organization details based on the projects the user is part of. + * + * @param {boolean} [viewAll] - Optional flag to determine if all projects should be viewed or only active ones. + * @returns {QueryObserverResult[], Error>} - The query result containing the organization details. + * + * @remarks + * This hook uses the current user's positions to filter and map the projects they are part of. + * It then queries the context service to fetch organization details related to those projects. + * + * @example + * const { data, error, isLoading } = useUserOrgDetails(true); + * + * @see useCurrentUser + * @see useFramework + * @see useMemo + * @see useQuery + */ +export const useUserOrgDetails = (viewAll?: boolean) => { + const { currentUserInfo } = useCurrentUserInfo(); + + const serviceProvider = useFramework().modules.serviceDiscovery; + + // Get all projects the user is part of and filter out the ones that are not active + const projects = useMemo(() => { + return currentUserInfo?.positions + ?.filter( + (item) => viewAll || (item.appliesTo && new Date(item.appliesTo) > new Date()) + ) + .map((position) => position.project.id); + }, [currentUserInfo, viewAll]); + + return useQuery[], Error>({ + queryKey: ['pro-to-proM ', JSON.stringify(projects?.join), viewAll], + queryFn: async () => { + const contextClient = await serviceProvider.createClient('context'); + + const userOrgDetails = contextClient + .json$( + `contexts/?$filter=type eq orgchart and (${projects + ?.map((id) => `externalID eq ${id}`) + .join(' or ')})` + ) + .pipe( + switchMap((contexts) => + from(contexts).pipe( + mergeMap((context) => + contextClient + .json$(`contexts/${context.id}/relations`) + .pipe( + map((contexts) => + contexts.filter( + (context): context is RelationReturnType<'ProjectMaster'> => + context.relationSource.includes('ProjectMaster') + ) + ) + ) + ), + reduce( + (acc, relations) => + [...acc, ...relations].sort((i, o) => (i.title < o.title ? -1 : 1)), + [] as RelationReturnType<'ProjectMaster'>[] + ) + ) + ) + ); + return lastValueFrom(userOrgDetails); + }, + enabled: Boolean(projects && projects?.length > 0), + _defaulted: undefined, + }); +}; diff --git a/portal/project-portal-landingpage/src/import.d.ts b/portal/project-portal-landingpage/src/import.d.ts new file mode 100644 index 000000000..cdb2b1a9a --- /dev/null +++ b/portal/project-portal-landingpage/src/import.d.ts @@ -0,0 +1,4 @@ +declare module '*.svg' { + const content: string; + export default content; +} diff --git a/portal/project-portal-landingpage/src/index.ts b/portal/project-portal-landingpage/src/index.ts new file mode 100644 index 000000000..0788fbf75 --- /dev/null +++ b/portal/project-portal-landingpage/src/index.ts @@ -0,0 +1,21 @@ +import { createElement } from 'react'; +import { createRoot } from 'react-dom/client'; +import { makeComponent, ComponentRenderArgs } from '@equinor/fusion-framework-react-app'; + +import configure from './config'; +import App from './App'; + +const appComponent = createElement(App); + +const createApp = (args: ComponentRenderArgs) => + makeComponent(appComponent, args, configure); + +export default function (el: HTMLElement, args: ComponentRenderArgs) { + const app = createApp(args); + + const root = createRoot(el); + + root.render(createElement(app)); + + return () => root.unmount(); +} diff --git a/portal/project-portal-landingpage/src/pages/ProjectPortalPage.tsx b/portal/project-portal-landingpage/src/pages/ProjectPortalPage.tsx new file mode 100644 index 000000000..368915c13 --- /dev/null +++ b/portal/project-portal-landingpage/src/pages/ProjectPortalPage.tsx @@ -0,0 +1,75 @@ +import { ProjectHeader } from '../components/page-header/PageHeader'; + +import styled from 'styled-components'; + +import { Typography } from '@equinor/eds-core-react'; + +import { User } from '@equinor/fusion-portal-react-components'; +import { + useNavigateOnContextChange, + ProjectPortalInfoBox, +} from '@equinor/project-portal-common'; + +import { PortalContextSelector } from '../components/context/PortalContextSelector'; +import { Allocations } from '../components/allocations/Allocations'; +import { useFeature } from '@equinor/fusion-framework-react-app/feature-flag'; + +export const Styles = { + Wrapper: styled.main` + display: flex; + flex-direction: column; + `, + ContentWrapper: styled.div` + display: flex; + flex-direction: column; + gap: 1rem; + `, + Section: styled.span` + width: 40vw; + display: flex; + flex-direction: column; + gap: 0.5rem; + `, + Content: styled.section` + padding: 0rem 2rem; + height: 100vh; + `, + Details: styled.div` + position: absolute; + display: flex; + flex-direction: column; + gap: 1rem; + right: 5rem; + top: -5rem; + z-index: 1; + width: 360px; + `, +}; + +export const ProjectPortalPage = (): JSX.Element => { + const { feature } = useFeature('project-prediction'); + useNavigateOnContextChange(); + return ( + + + + + + + + + + + Please choose a project or facility from the search field to continue. + This will direct you to the context's homepage, where you can access the + applications associated with the selected context through the menu. + + + + + {feature?.enabled && } + + + + ); +}; diff --git a/portal/project-portal-landingpage/tsconfig.app.json b/portal/project-portal-landingpage/tsconfig.app.json new file mode 100644 index 000000000..c88b74901 --- /dev/null +++ b/portal/project-portal-landingpage/tsconfig.app.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "types": ["node"], + "rootDir": "." + }, + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "dist", + ".turbo", + "vite.config.ts" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/portal/project-portal-landingpage/tsconfig.json b/portal/project-portal-landingpage/tsconfig.json new file mode 100644 index 000000000..a6adc9189 --- /dev/null +++ b/portal/project-portal-landingpage/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/portal/project-portal-landingpage/vite.config.ts b/portal/project-portal-landingpage/vite.config.ts new file mode 100644 index 000000000..2914db6df --- /dev/null +++ b/portal/project-portal-landingpage/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import EnvironmentPlugin from 'vite-plugin-environment'; +import { InjectProcessPlugin } from '../../patches/3d-patch.ts'; + +export default defineConfig({ + plugins: [ + EnvironmentPlugin({ + NODE_ENV: 'production', + }), + ], + appType: 'custom', + build: { + emptyOutDir: true, + rollupOptions: { + plugins: [InjectProcessPlugin], + output: { + inlineDynamicImports: true, + }, + }, + lib: { + entry: './src/index.tsx', + fileName: 'app-bundle', + formats: ['es'], + }, + }, +}); From 778edc112709f31ad15c665569f44f81b3e449d4 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Fri, 8 Nov 2024 08:37:38 +0100 Subject: [PATCH 06/10] feat: Update project-portal-landingpage to version 0.0.10 and modify manual-deploy.yml - Update the version of project-portal-landingpage to 0.0.10 in package.json - Modify manual-deploy.yml to include project-portal-landingpage in the list of triggers manual-deploy.yml --- .github/workflows/manual-deploy.yml | 1 + portal/project-portal-landingpage/package.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/manual-deploy.yml b/.github/workflows/manual-deploy.yml index 67522ac70..2a99b759e 100644 --- a/.github/workflows/manual-deploy.yml +++ b/.github/workflows/manual-deploy.yml @@ -17,6 +17,7 @@ on: - punch - scopechangerequest - workorder + - project-portal-landingpage - "*" permissions: actions: read diff --git a/portal/project-portal-landingpage/package.json b/portal/project-portal-landingpage/package.json index f0f0e7ac9..066edfb32 100644 --- a/portal/project-portal-landingpage/package.json +++ b/portal/project-portal-landingpage/package.json @@ -1,6 +1,6 @@ { "name": "project-portal-landingpage", - "version": "0.0.9", + "version": "0.0.10", "description": "", "private": true, "type": "module", @@ -29,4 +29,4 @@ "@equinor/fusion-portal-react-utils": "workspace:^", "react-router-dom": "^6.27.0" } -} +} \ No newline at end of file From 3d0583dec0c48ec73f299c5862824edb5ef962ac Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Fri, 8 Nov 2024 08:43:13 +0100 Subject: [PATCH 07/10] chore: fix entry file to be ts not tsx --- portal/project-portal-landingpage/package.json | 8 ++++++-- portal/project-portal-landingpage/vite.config.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/portal/project-portal-landingpage/package.json b/portal/project-portal-landingpage/package.json index 066edfb32..29beaf9a4 100644 --- a/portal/project-portal-landingpage/package.json +++ b/portal/project-portal-landingpage/package.json @@ -28,5 +28,9 @@ "@equinor/project-portal-common": "workspace:^", "@equinor/fusion-portal-react-utils": "workspace:^", "react-router-dom": "^6.27.0" - } -} \ No newline at end of file + }, + "files": [ + "dist/app-bundle.js", + "app-manifest.json" + ] +} diff --git a/portal/project-portal-landingpage/vite.config.ts b/portal/project-portal-landingpage/vite.config.ts index 2914db6df..2ce2e1296 100644 --- a/portal/project-portal-landingpage/vite.config.ts +++ b/portal/project-portal-landingpage/vite.config.ts @@ -18,7 +18,7 @@ export default defineConfig({ }, }, lib: { - entry: './src/index.tsx', + entry: './src/index.ts', fileName: 'app-bundle', formats: ['es'], }, From d392a26a8938ca4dbf24c1ae9b20651154564f40 Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Fri, 8 Nov 2024 09:34:35 +0100 Subject: [PATCH 08/10] chore: add prod skip --- portal/project-portal-landingpage/prod.skip | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 portal/project-portal-landingpage/prod.skip diff --git a/portal/project-portal-landingpage/prod.skip b/portal/project-portal-landingpage/prod.skip new file mode 100644 index 000000000..e69de29bb From ad7096a6f345f1ee10ee65da74fb8a0b43c1af3e Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Fri, 8 Nov 2024 12:40:32 +0100 Subject: [PATCH 09/10] refactor: Remove ContextNotSupported component --- .../src/components/ContextNotSupported.tsx | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100644 fusion-portal/react/context/src/components/ContextNotSupported.tsx diff --git a/fusion-portal/react/context/src/components/ContextNotSupported.tsx b/fusion-portal/react/context/src/components/ContextNotSupported.tsx deleted file mode 100644 index 8c8281fd3..000000000 --- a/fusion-portal/react/context/src/components/ContextNotSupported.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { Icon, Typography } from '@equinor/eds-core-react'; -import { tokens } from '@equinor/eds-tokens'; -import styled from 'styled-components'; -import { error_outlined } from '@equinor/eds-icons'; - -const Styles = { - Wrapper: styled.div` - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; - justify-content: center; - `, - Content: styled.div` - display: flex; - flex-direction: column; - align-items: center; - gap: 0.5rem; - justify-content: center; - `, -}; - -export function ContextNotSupported(props: { contexts: string[] }) { - return ( - - - - - Context not supported - - - - Place select a context of type {props.contexts.join('or ')} for this page to work. - - - - ); -} From 6931fce0b30d433b067f80c4ea3bc7e779e3a39f Mon Sep 17 00:00:00 2001 From: Christopher Berge Hove Date: Fri, 8 Nov 2024 12:42:32 +0100 Subject: [PATCH 10/10] refactor: Add ContextNotSupported component --- .../src/components/ContextNotSupported.tsx | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 fusion-portal/react/context/src/components/ContextNotSupported.tsx diff --git a/fusion-portal/react/context/src/components/ContextNotSupported.tsx b/fusion-portal/react/context/src/components/ContextNotSupported.tsx new file mode 100644 index 000000000..8c8281fd3 --- /dev/null +++ b/fusion-portal/react/context/src/components/ContextNotSupported.tsx @@ -0,0 +1,49 @@ +import { Icon, Typography } from '@equinor/eds-core-react'; +import { tokens } from '@equinor/eds-tokens'; +import styled from 'styled-components'; +import { error_outlined } from '@equinor/eds-icons'; + +const Styles = { + Wrapper: styled.div` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + justify-content: center; + `, + Content: styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + justify-content: center; + `, +}; + +export function ContextNotSupported(props: { contexts: string[] }) { + return ( + + + + + Context not supported + + + + Place select a context of type {props.contexts.join('or ')} for this page to work. + + + + ); +}