+ {
+ toggleIsUnique(event.target.checked);
+ }}
+ label={}
+ // LG Checkbox expects a string description, but we use Description component
+ // to alight with styles from CollapsibleFieldSet that are used on the same form.
+ description={
+ (
+
+ A unique index ensures that the indexed fields do not store
+ duplicate values; i.e. enforces uniqueness for the indexed fields.
+
+ ) as any
+ }
+ checked={isUnique}
+ id={labelId}
+ />
+
+ );
+};
+
+export default UniqueIndexCheckbox;
diff --git a/packages/compass-indexes/src/components/create-index-form/wildcard-projection.tsx b/packages/compass-indexes/src/components/create-index-form/wildcard-projection.tsx
new file mode 100644
index 00000000000..93335b3e5ed
--- /dev/null
+++ b/packages/compass-indexes/src/components/create-index-form/wildcard-projection.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import {
+ Editor,
+ EditorVariant,
+ CollapsibleFieldSet,
+} from '@mongodb-js/compass-components';
+
+type WildcardProjection = {
+ useWildcardProjection: boolean;
+ toggleUseWildcardProjection: (useWildcardProjection: boolean) => void;
+ wildcardProjection?: string;
+ wildcardProjectionChanged: (wildcardProjection: string) => void;
+};
+
+const WildcardProjectionCollapsibleFieldSet = ({
+ useWildcardProjection,
+ toggleUseWildcardProjection,
+ wildcardProjection,
+ wildcardProjectionChanged,
+}: WildcardProjection) => {
+ return (
+
+
+
+ );
+};
+
+export default WildcardProjectionCollapsibleFieldSet;
diff --git a/packages/compass-indexes/src/components/create-index-modal/create-index-modal.jsx b/packages/compass-indexes/src/components/create-index-modal/create-index-modal.jsx
deleted file mode 100644
index 93aa7238b59..00000000000
--- a/packages/compass-indexes/src/components/create-index-modal/create-index-modal.jsx
+++ /dev/null
@@ -1,545 +0,0 @@
-import React, { PureComponent } from 'react';
-import { connect } from 'react-redux';
-import PropTypes from 'prop-types';
-import { Modal } from 'react-bootstrap';
-import { TextButton } from 'hadron-react-buttons';
-import {
- ModalStatusMessage,
- ModalCheckbox,
- ModalInput,
-} from 'hadron-react-components';
-import pluck from 'lodash.pluck';
-
-import styles from './create-index-modal.module.less';
-
-import CreateIndexField from '../create-index-field';
-
-import { toggleInProgress } from '../../modules/in-progress';
-import { toggleShowOptions } from '../../modules/create-index/show-options';
-import {
- addField,
- removeField,
- updateFieldType,
- updateFieldName,
-} from '../../modules/create-index/fields';
-import { changeName } from '../../modules/create-index/name';
-import { changeSchemaFields } from '../../modules/create-index/schema-fields';
-import {
- createNewIndexField,
- clearNewIndexField,
-} from '../../modules/create-index/new-index-field';
-import { clearError, handleError } from '../../modules/error';
-import { toggleIsVisible } from '../../modules/is-visible';
-import { toggleIsUnique } from '../../modules/create-index/is-unique';
-import { toggleIsPartialFilterExpression } from '../../modules/create-index/is-partial-filter-expression';
-import { toggleIsTtl } from '../../modules/create-index/is-ttl';
-import { changeTtl } from '../../modules/create-index/ttl';
-import { toggleHasWildcardProjection } from '../../modules/create-index/has-wildcard-projection';
-import { toggleHasColumnstoreProjection } from '../../modules/create-index/has-columnstore-projection';
-import { wildcardProjectionChanged } from '../../modules/create-index/wildcard-projection';
-import { columnstoreProjectionChanged } from '../../modules/create-index/columnstore-projection';
-import { changePartialFilterExpression } from '../../modules/create-index/partial-filter-expression';
-import { toggleIsCustomCollation } from '../../modules/create-index/is-custom-collation';
-import { collationStringChanged } from '../../modules/create-index/collation-string';
-import { openLink } from '../../modules/link';
-import { createIndex } from '../../modules/create-index';
-import { resetForm } from '../../modules/reset-form';
-
-import getIndexHelpLink from '../../utils/index-link-helper';
-import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
-import { hasColumnstoreIndexesSupport } from '../../utils/has-columnstore-indexes-support';
-const { track } = createLoggerAndTelemetry('COMPASS-IMPORT-EXPORT-UI');
-
-import { Editor, EditorVariant } from '@mongodb-js/compass-components';
-
-/**
- * Component for the create index modal.
- */
-class CreateIndexModal extends PureComponent {
- static displayName = 'CreateIndexModal';
- static propTypes = {
- showOptions: PropTypes.bool.isRequired,
- error: PropTypes.string,
- inProgress: PropTypes.bool.isRequired,
- schemaFields: PropTypes.array.isRequired,
- fields: PropTypes.array.isRequired,
- isVisible: PropTypes.bool.isRequired,
- isUnique: PropTypes.bool.isRequired,
- isTtl: PropTypes.bool.isRequired,
- ttl: PropTypes.string.isRequired,
- hasWildcardProjection: PropTypes.bool.isRequired,
- hasColumnstoreProjection: PropTypes.bool.isRequired,
- wildcardProjection: PropTypes.string.isRequired,
- columnstoreProjection: PropTypes.string.isRequired,
- isPartialFilterExpression: PropTypes.bool.isRequired,
- partialFilterExpression: PropTypes.string.isRequired,
- isCustomCollation: PropTypes.bool.isRequired,
- collationString: PropTypes.string,
- collationStringChanged: PropTypes.func.isRequired,
- name: PropTypes.string.isRequired,
- serverVersion: PropTypes.string.isRequired,
- updateFieldName: PropTypes.func.isRequired,
- updateFieldType: PropTypes.func.isRequired,
- addField: PropTypes.func.isRequired,
- removeField: PropTypes.func.isRequired,
- toggleIsUnique: PropTypes.func.isRequired,
- toggleIsVisible: PropTypes.func.isRequired,
- toggleShowOptions: PropTypes.func.isRequired,
- toggleIsTtl: PropTypes.func.isRequired,
- toggleHasWildcardProjection: PropTypes.func.isRequired,
- toggleHasColumnstoreProjection: PropTypes.func.isRequired,
- toggleIsPartialFilterExpression: PropTypes.func.isRequired,
- toggleIsCustomCollation: PropTypes.func.isRequired,
- resetForm: PropTypes.func.isRequired,
- createIndex: PropTypes.func.isRequired,
- openLink: PropTypes.func.isRequired,
- changeTtl: PropTypes.func.isRequired,
- columnstoreProjectionChanged: PropTypes.func.isRequired,
- wildcardProjectionChanged: PropTypes.func.isRequired,
- changePartialFilterExpression: PropTypes.func.isRequired,
- changeName: PropTypes.func.isRequired,
- newIndexField: PropTypes.string,
- createNewIndexField: PropTypes.func.isRequired,
- };
-
- /**
- * The component constructor.
- *
- * @param {Object} props - The properties.
- */
- constructor(props) {
- super(props);
- }
-
- handleShow() {
- track('Screen', { name: 'create_index_modal' });
- }
-
- /**
- * Close modal and fire clear create index form action.
- */
- handleClose() {
- this.props.toggleIsVisible(false);
- this.props.resetForm();
- }
-
- /**
- * Fire trigger index creation action when create button is clicked and close modal.
- *
- * @param {Object} evt - The click event.
- */
- onFormSubmit(evt) {
- evt.preventDefault();
- evt.stopPropagation();
- this.props.createIndex();
- }
-
- /**
- * Toggle showOptions state value when toggle bar is clicked.
- *
- * @param {Object} evt - The click event.
- */
- handleToggleBarClick(evt) {
- this.props.toggleShowOptions(!this.props.showOptions);
- evt.preventDefault();
- evt.stopPropagation();
- }
-
- /**
- * Fire add field action to add field and type to add index form.
- *
- * @param {Object} evt - The click event.
- */
- handleAddField(evt) {
- this.props.addField();
- evt.preventDefault();
- evt.stopPropagation();
- }
-
- /**
- * Create React components for each selected field in the create index form.
- *
- * @returns {Array} The React components for each field, or null if none are selected.
- */
- renderIndexFields() {
- if (!this.props.fields.length) {
- return null;
- }
-
- const disabledFields = pluck(this.props.fields, 'name');
-
- return this.props.fields.map((field, idx) => {
- return (
- 1)}
- updateFieldName={this.props.updateFieldName}
- updateFieldType={this.props.updateFieldType}
- addField={this.props.addField}
- removeField={this.props.removeField}
- newIndexField={this.props.newIndexField}
- createNewIndexField={this.props.createNewIndexField}
- />
- );
- });
- }
-
- renderOptions() {
- if (!this.props.showOptions) {
- return null;
- }
- return (
-