UNPKG

@finos/legend-application-marketplace

Version:
286 lines 14.4 kB
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; /** * Copyright (c) 2020-present, Goldman Sachs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { getOrganizationalScopeTypeName, getOrganizationalScopeTypeDetails, UserRenderer, MultiUserRenderer, stringifyOrganizationalScope, DataContractViewerState, PermitDataAccessRequestState, } from '@finos/legend-extension-dsl-data-product'; import { GraphManagerState, V1_LiteDataContractWithUserStatus, V1_ResourceType, V1_AccessPointGroupReference, V1_ContractState, V1_RequestState, V1_WorkflowTaskStatus, V1_deserializeDataRequestsWithWorkflowResponse, } from '@finos/legend-graph'; import { formatOrderDate } from '../stores/orders/OrderHelpers.js'; import { InfoCircleIcon } from '@finos/legend-art'; import { Tooltip } from '@mui/material'; import { observer } from 'mobx-react-lite'; import { useMemo } from 'react'; import { useLegendMarketplaceBaseStore } from '../application/providers/LegendMarketplaceFrameworkProvider.js'; import { generateContractPagePath, generateLakehouseDataProductPath, generatePermitDataAccessRequestPagePath, } from '../__lib__/LegendMarketplaceNavigation.js'; export const UNKNOWN = 'Unknown'; export const ROW_KIND_CONTRACT = 'contract'; export const ROW_KIND_REQUEST = 'request'; export var EntitlementsColumnHeader; (function (EntitlementsColumnHeader) { EntitlementsColumnHeader["TYPE"] = "Type"; EntitlementsColumnHeader["DATE_CREATED"] = "Date Created"; EntitlementsColumnHeader["CONSUMER_TYPE"] = "Consumer Type"; EntitlementsColumnHeader["TARGET_USERS"] = "Target User(s)"; EntitlementsColumnHeader["REQUESTER"] = "Requester"; EntitlementsColumnHeader["TARGET_DATA_PRODUCT"] = "Target Data Product"; EntitlementsColumnHeader["TARGET_ACCESS_POINT_GROUP"] = "Target Access Point Group"; EntitlementsColumnHeader["BUSINESS_JUSTIFICATION"] = "Business Justification"; EntitlementsColumnHeader["STATE"] = "State"; EntitlementsColumnHeader["ASSIGNEES"] = "Assignees"; })(EntitlementsColumnHeader || (EntitlementsColumnHeader = {})); export const CONTRACT_STATE_DISPLAY_LABELS = { [V1_ContractState.DRAFT]: 'Draft', [V1_ContractState.PENDING_DATA_OWNER_APPROVAL]: 'Data Owner Approval', [V1_ContractState.OPEN_FOR_PRIVILEGE_MANAGER_APPROVAL]: 'Privilege Manager Approval', [V1_ContractState.COMPLETED]: 'Completed', [V1_ContractState.REJECTED]: 'Rejected', [V1_ContractState.CLOSED]: 'Closed', }; export const TERMINAL_DATA_REQUEST_STATES = new Set([ V1_RequestState.COMPLETED, V1_RequestState.REJECTED, V1_RequestState.INVALIDATED, V1_RequestState.OBSOLETE, ]); export const ENTITLEMENTS_DEFAULT_COL_DEF = { minWidth: 50, sortable: true, resizable: true, flex: 1, }; export const getContractData = (row) => row.kind === ROW_KIND_CONTRACT ? row.data.contractResultLite : undefined; export const getRequestData = (row) => row.kind === ROW_KIND_REQUEST ? row.data.dataRequest : undefined; export const getSelectedRowId = (row) => row ? (getContractData(row)?.guid ?? getRequestData(row)?.guid) : undefined; export const getSelectedContractGuid = (row) => (row ? getContractData(row)?.guid : undefined); export const getOpenTaskAssignees = (data) => { const openTask = data.workflows .flatMap((w) => w.tasks) .find((t) => t.status === V1_WorkflowTaskStatus.OPEN); return openTask?.assignees.toSorted() ?? []; }; export const getConsumer = (row) => getContractData(row)?.consumer ?? getRequestData(row)?.consumer; const TargetUserCellRenderer = observer((props) => { const { row, entitlementsStore } = props; if (!row) { return _jsx(_Fragment, { children: UNKNOWN }); } if (row.kind === ROW_KIND_CONTRACT) { const dataContract = row.data; const userIds = dataContract instanceof V1_LiteDataContractWithUserStatus ? [dataContract.user] : dataContract.sortedMemberIds; return (_jsx(MultiUserRenderer, { userIds: userIds, applicationStore: entitlementsStore.applicationStore, userSearchService: entitlementsStore.marketplaceBaseStore.userSearchService, disableOnClick: true, singleUserClassName: "marketplace-lakehouse-entitlements__grid__user-display" })); } const consumer = row.data.dataRequest.consumer; return (_jsx(_Fragment, { children: stringifyOrganizationalScope(consumer, entitlementsStore.applicationStore.pluginManager.getApplicationPlugins()) })); }); export const getCommonEntitlementsColDefs = (dashboardState) => [ { headerName: EntitlementsColumnHeader.TYPE, colId: 'type', valueGetter: (params) => params.data?.kind === ROW_KIND_CONTRACT ? 'Data Contract' : 'Data Request', }, { headerName: EntitlementsColumnHeader.DATE_CREATED, colId: 'dateCreated', sort: 'desc', comparator: (_, __, val1, val2) => { const getTime = (row) => { if (!row) { return 0; } const contract = getContractData(row); if (contract) { return contract.createdAt ? new Date(contract.createdAt).getTime() : 0; } if (row.kind !== ROW_KIND_REQUEST) { return 0; } const c = row.data.workflows[0]?.tasks[0]?.createdOn; if (!c) { return 0; } const dateStr = c instanceof Date ? c.toISOString() : String(c); return new Date(dateStr).getTime(); }; return getTime(val1.data) - getTime(val2.data); }, valueGetter: (params) => { if (!params.data) { return UNKNOWN; } const contract = getContractData(params.data); if (contract) { return formatOrderDate(contract.createdAt) ?? UNKNOWN; } if (params.data.kind !== ROW_KIND_REQUEST) { return UNKNOWN; } const createdOn = params.data.data.workflows[0]?.tasks[0]?.createdOn; if (!createdOn) { return UNKNOWN; } return (formatOrderDate(createdOn instanceof Date ? createdOn.toISOString() : String(createdOn)) ?? UNKNOWN); }, }, { colId: 'consumerType', headerName: EntitlementsColumnHeader.CONSUMER_TYPE, valueGetter: (params) => { if (!params.data) { return UNKNOWN; } const consumer = getConsumer(params.data); return consumer ? getOrganizationalScopeTypeName(consumer, dashboardState.lakehouseEntitlementsStore.applicationStore.pluginManager.getApplicationPlugins()) : UNKNOWN; }, cellRenderer: (params) => { if (!params.data) { return UNKNOWN; } const consumer = getConsumer(params.data); const plugins = dashboardState.lakehouseEntitlementsStore.applicationStore.pluginManager.getApplicationPlugins(); const typeName = consumer ? getOrganizationalScopeTypeName(consumer, plugins) : undefined; const typeDetails = consumer ? getOrganizationalScopeTypeDetails(consumer, plugins) : undefined; return (_jsxs(_Fragment, { children: [typeName ?? UNKNOWN, typeDetails !== undefined && (_jsx(Tooltip, { className: "marketplace-lakehouse-entitlements__grid__consumer-type__tooltip__icon", title: typeDetails, children: _jsx(InfoCircleIcon, {}) }))] })); }, }, { headerName: EntitlementsColumnHeader.TARGET_USERS, colId: 'targetUser', valueGetter: (params) => { if (!params.data) { return UNKNOWN; } if (params.data.kind === ROW_KIND_CONTRACT) { const userIds = params.data.data instanceof V1_LiteDataContractWithUserStatus ? [params.data.data.user] : params.data.data.sortedMemberIds; return userIds.length > 0 ? userIds.join(', ') : UNKNOWN; } const consumer = params.data.data.dataRequest.consumer; return stringifyOrganizationalScope(consumer, dashboardState.lakehouseEntitlementsStore.applicationStore.pluginManager.getApplicationPlugins()); }, cellRenderer: (params) => (_jsx(TargetUserCellRenderer, { row: params.data, entitlementsStore: dashboardState.lakehouseEntitlementsStore })), }, { headerName: EntitlementsColumnHeader.REQUESTER, colId: 'requester', valueGetter: (params) => { if (!params.data) { return UNKNOWN; } return (getContractData(params.data)?.createdBy ?? getRequestData(params.data)?.createdBy ?? UNKNOWN); }, cellRenderer: (params) => { if (!params.data) { return _jsx(_Fragment, { children: UNKNOWN }); } const requester = getContractData(params.data)?.createdBy ?? getRequestData(params.data)?.createdBy; return requester ? (_jsx(UserRenderer, { userId: requester, applicationStore: dashboardState.lakehouseEntitlementsStore.applicationStore, userSearchService: dashboardState.lakehouseEntitlementsStore.marketplaceBaseStore .userSearchService, disableOnClick: true, className: "marketplace-lakehouse-entitlements__grid__user-display" })) : (_jsx(_Fragment, { children: UNKNOWN })); }, }, { headerName: EntitlementsColumnHeader.TARGET_DATA_PRODUCT, valueGetter: (params) => { if (!params.data) { return UNKNOWN; } const contract = getContractData(params.data); if (contract) { return contract.resourceId; } const resource = getRequestData(params.data)?.resource; return resource instanceof V1_AccessPointGroupReference ? resource.dataProduct.name : UNKNOWN; }, }, { headerName: EntitlementsColumnHeader.TARGET_ACCESS_POINT_GROUP, valueGetter: (params) => { if (!params.data) { return UNKNOWN; } const contract = getContractData(params.data); if (contract) { const accessPointGroup = contract.resourceType === V1_ResourceType.ACCESS_POINT_GROUP ? contract.accessPointGroup : `${contract.accessPointGroup ?? UNKNOWN} (${contract.resourceType})`; return accessPointGroup ?? UNKNOWN; } const resource = getRequestData(params.data)?.resource; return resource instanceof V1_AccessPointGroupReference ? resource.accessPointGroup : UNKNOWN; }, }, { headerName: EntitlementsColumnHeader.BUSINESS_JUSTIFICATION, valueGetter: (params) => { if (!params.data) { return UNKNOWN; } return (getContractData(params.data)?.description ?? getRequestData(params.data)?.businessJustification ?? UNKNOWN); }, }, ]; export const useSelectedViewerState = (selectedRow, selectedRowId) => { const marketplaceBaseStore = useLegendMarketplaceBaseStore(); return useMemo(() => { if (!selectedRow) { return undefined; } if (selectedRow.kind === ROW_KIND_CONTRACT) { const contract = selectedRow.data.contractResultLite; return new DataContractViewerState(contract, (contractId, taskId) => marketplaceBaseStore.applicationStore.navigationService.navigator.generateAddress(generateContractPagePath(contractId, taskId)), undefined, marketplaceBaseStore.applicationStore, marketplaceBaseStore.lakehouseContractServerClient, new GraphManagerState(marketplaceBaseStore.applicationStore.pluginManager, marketplaceBaseStore.applicationStore.logService), marketplaceBaseStore.userSearchService); } const guid = selectedRow.data.dataRequest.guid; const authClient = marketplaceBaseStore.lakehouseContractServerClient; const pluginManager = marketplaceBaseStore.applicationStore.pluginManager; return new PermitDataAccessRequestState(guid, marketplaceBaseStore.applicationStore, marketplaceBaseStore.permitWorkflowServerClient, marketplaceBaseStore.userSearchService, { authServerClient: authClient, initialData: selectedRow.data, fetchFresh: async (token) => { const raw = await authClient.getDataAccessRequestWithWorkflow(guid, token); return V1_deserializeDataRequestsWithWorkflowResponse(raw, pluginManager.getPureProtocolProcessorPlugins())[0]; }, getTaskPageUrl: (id) => marketplaceBaseStore.applicationStore.navigationService.navigator.generateAddress(generatePermitDataAccessRequestPagePath(id)), }); // Re-create only when the selected row changes (different guid) // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedRowId]); }; export const useGetDataProductUrl = () => { const marketplaceBaseStore = useLegendMarketplaceBaseStore(); return (dataProductId, deploymentId) => marketplaceBaseStore.applicationStore.navigationService.navigator.generateAddress(generateLakehouseDataProductPath(dataProductId, deploymentId)); }; //# sourceMappingURL=EntitlementsUtils.js.map