app/addons/documents/mango/components/IndexPanel.js (60 lines of code) (raw):
// 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 PropTypes from 'prop-types';
import React from "react";
import IndexFields from "./IndexFields";
import ReactComponents from '../../../components/react-components';
function ReasonValue({reason, onClick}) {
const _onClick = (ev) => {
ev.preventDefault();
onClick();
};
return <a className='explainReason' href="#" data-bypass="true" onClick={_onClick}>{formatReason(reason)}</a>;
}
export default function IndexPanel ({index, isWinner, reason, covering, onReasonClick, extraInfo}) {
const columnClass = 'col-md-12 col-lg-3 mb-4 mb-lg-0';
const tags = [
index.partitioned ? 'partitioned' : 'global',
];
if (covering) {
tags.push('covering');
}
const tagExplanations = {
'partitioned': 'Index queries over a single data partition',
'global': 'Index queries over all data within database',
'covering': 'Index can return all data needed by the query without having to load document bodies'
};
return (
<div className='row explain-index-panel'>
<div className={columnClass}>
<strong>{index.type}</strong>: {index.name}
<br/>
{index.ddoc ? (<><span className="index-ddoc-name">{index.ddoc}</span><br/></>) : null}
</div>
<div className={columnClass}>
<ReactComponents.BadgeList elements={tags} tagExplanations={tagExplanations} removeBadge={() => {}} />
</div>
<div className={columnClass}>
<IndexFields fields={index.def.fields} isTextIndex={index.type === 'text'}/>
</div>
{isWinner ? <div className={columnClass}>{extraInfo ? extraInfo : ' '}</div> :
<div className={columnClass}>
{reason ? <ReasonValue reason={reason} onClick={onReasonClick} /> : <span>reason not available</span>}
</div>}
</div>
);
}
function formatReason(reason) {
if (typeof reason === 'string') {
return reason;
} else if (reason && reason.length > 0) {
return reason.join(', ');
}
return 'n/a';
}
IndexPanel.propTypes = {
index: PropTypes.object.isRequired,
onReasonClick: PropTypes.func.isRequired,
reason: PropTypes.string,
covering: PropTypes.bool,
isWinner: PropTypes.bool, // 'true' if this is the winning index from the explain response
extraInfo: PropTypes.element, // extra info to display in the last column
};