/* * Copyright OpenSearch Contributors * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://www.apache.org/licenses/LICENSE-2.0 * * or in the "license" file accompanying this file. This file 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 { EuiButton, EuiComboBox, EuiFlexGroup, EuiFlexItem, EuiSuperSelect } from '@elastic/eui'; import React, { Dispatch, Fragment, SetStateAction } from 'react'; import { isEmpty } from 'lodash'; import { RoleTenantPermission, TenantPermissionType, ComboBoxOptions } from '../../types'; import { appendElementToArray, removeElementFromArray, updateElementInArrayHandler, } from '../../utils/array-state-utils'; import { appendOptionToComboBoxHandler, stringToComboBoxOption, comboBoxOptionToString, } from '../../utils/combo-box-utils'; import { FormRow } from '../../utils/form-row'; import { PanelWithHeader } from '../../utils/panel-with-header'; import { RoleTenantPermissionStateClass } from './types'; import { DocLinks, TENANT_READ_PERMISSION, TENANT_WRITE_PERMISSION } from '../../constants'; import { getTenantPermissionType } from '../../utils/tenant-utils'; export function buildTenantPermissionState( permissions: RoleTenantPermission[] ): RoleTenantPermissionStateClass[] { return permissions.map((permission) => { const permissionType = getTenantPermissionType(permission.allowed_actions); return { tenantPatterns: permission.tenant_patterns.map(stringToComboBoxOption), permissionType, }; }); } const TENANT_PERMISSION_TYPE_DICT: Record = { [TenantPermissionType.ReadWrite]: [TENANT_WRITE_PERMISSION], [TenantPermissionType.Read]: [TENANT_READ_PERMISSION], [TenantPermissionType.None]: [], }; export function unbuildTenantPermissionState( permissions: RoleTenantPermissionStateClass[] ): RoleTenantPermission[] { return permissions.map((permission) => { return { tenant_patterns: permission.tenantPatterns.map(comboBoxOptionToString), allowed_actions: TENANT_PERMISSION_TYPE_DICT[permission.permissionType], }; }); } function getEmptyTenantPermission(): RoleTenantPermissionStateClass { return { tenantPatterns: [], permissionType: TenantPermissionType.ReadWrite, }; } function generateTenantPermissionPanels( tenantPermissions: RoleTenantPermissionStateClass[], permisionOptionsSet: ComboBoxOptions, setPermissions: Dispatch> ) { const panels = tenantPermissions.map((tenantPermission, arrayIndex) => { const onValueChangeHandler = (attributeToUpdate: string) => updateElementInArrayHandler(setPermissions, [arrayIndex, attributeToUpdate]); const onCreateOptionHandler = (attributeToUpdate: string) => appendOptionToComboBoxHandler(setPermissions, [arrayIndex, attributeToUpdate]); return ( removeElementFromArray(setPermissions, [], arrayIndex)} > Remove ); }); return <>{panels}; } export function TenantPanel(props: { state: RoleTenantPermissionStateClass[]; optionUniverse: ComboBoxOptions; setState: Dispatch>; }) { const { state, optionUniverse, setState } = props; // Show one empty row if there is no data. if (isEmpty(state)) { setState([getEmptyTenantPermission()]); } return ( {generateTenantPermissionPanels(state, optionUniverse, setState)} { appendElementToArray(setState, [], getEmptyTenantPermission()); }} > Add another tenant permission ); }