PromucFlow_constructor/app/client/src/components/formControls/DynamicTextFieldControl.tsx
Ravi Kumar Prasad fa930838aa
feat: code commenting #9369 (#18667)
## Description
Adds code commenting in JS objects code editor and JS fields. Users can
use `Cmd + /` on Mac and `Ctrl + /` on other systems to
comment/uncomment code now.

Fixes #9369



## Type of change
- New feature (non-breaking change which adds functionality)

## How Has This Been Tested?
- Manual
- Jest

### Test Plan
- [x] https://github.com/appsmithorg/TestSmith/issues/2120
- [x] https://github.com/appsmithorg/TestSmith/issues/2121
- [x] https://github.com/appsmithorg/TestSmith/issues/2122

### Issues raised during DP testing
- [ ]
https://github.com/appsmithorg/appsmith/pull/18667#issuecomment-1348354145


## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test

Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
2023-01-06 11:57:53 +00:00

116 lines
3.2 KiB
TypeScript

import React from "react";
import { formValueSelector } from "redux-form";
import { connect } from "react-redux";
import BaseControl, { ControlProps } from "./BaseControl";
import { ControlType } from "constants/PropertyControlConstants";
import DynamicTextField from "components/editorComponents/form/fields/DynamicTextField";
import {
EditorSize,
EditorModes,
TabBehaviour,
} from "components/editorComponents/CodeEditor/EditorConfig";
import { QUERY_EDITOR_FORM_NAME } from "@appsmith/constants/forms";
import { AppState } from "@appsmith/reducers";
import styled from "styled-components";
import { getPluginResponseTypes } from "selectors/entitiesSelector";
import { actionPathFromName } from "components/formControls/utils";
import { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory";
import { getLineCommentString } from "components/editorComponents/CodeEditor/utils/codeComment";
const Wrapper = styled.div`
width: 872px;
.dynamic-text-field {
border-radius: 4px;
font-size: 14px;
min-height: calc(100vh / 4);
}
&& {
.CodeMirror-lines {
padding: 10px;
}
}
`;
interface DynamicTextControlState {
showTemplateMenu: boolean;
}
class DynamicTextControl extends BaseControl<
DynamicTextFieldProps,
DynamicTextControlState
> {
constructor(props: DynamicTextFieldProps) {
super(props);
this.state = {
showTemplateMenu: true,
};
}
getControlType(): ControlType {
return "QUERY_DYNAMIC_TEXT";
}
render() {
const {
actionName,
configProperty,
evaluationSubstitutionType,
placeholderText,
responseType,
} = this.props;
const dataTreePath = actionPathFromName(actionName, configProperty);
const mode =
responseType === "TABLE"
? EditorModes.SQL_WITH_BINDING
: EditorModes.JSON_WITH_BINDING;
const lineCommentString = getLineCommentString(mode);
return (
<Wrapper className={`t--${configProperty}`}>
<DynamicTextField
className="dynamic-text-field"
dataTreePath={dataTreePath}
disabled={this.props.disabled}
evaluationSubstitutionType={evaluationSubstitutionType}
lineCommentString={lineCommentString}
mode={mode}
name={this.props.configProperty}
placeholder={placeholderText}
showLineNumbers={this.props.showLineNumbers}
size={EditorSize.EXTENDED}
tabBehaviour={TabBehaviour.INDENT}
/>
</Wrapper>
);
}
}
export interface DynamicTextFieldProps extends ControlProps {
actionName: string;
pluginId: string;
responseType: string;
placeholderText?: string;
evaluationSubstitutionType: EvaluationSubstitutionType;
mutedHinting?: boolean;
}
const mapStateToProps = (state: AppState, props: DynamicTextFieldProps) => {
const valueSelector = formValueSelector(
props.formName || QUERY_EDITOR_FORM_NAME,
);
const actionName = valueSelector(state, "name");
const pluginId = valueSelector(state, "datasource.pluginId");
const responseTypes = getPluginResponseTypes(state);
return {
actionName,
pluginId,
responseType: responseTypes[pluginId],
};
};
export default connect(mapStateToProps)(DynamicTextControl);