@finos/legend-application-marketplace
Version:
Legend Marketplace application core
286 lines • 14.4 kB
JavaScript
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