diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx index 3dc762e43f3d294b43dad1387bf95472e52e6271..870d29d92cb2f944af7e10a3c5b13e8c82bce14c 100644 --- a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx +++ b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx @@ -144,7 +144,10 @@ export default class DatabaseEditApp extends Component { <DatabaseEditContent> <DatabaseEditForm> <Form> - <FormField name="engine" /> + <FormField + name="engine" + disabled={database.is_sample} + /> <DriverWarning engine={values.engine} onChange={engine => diff --git a/frontend/src/metabase/components/form/widgets/FormSelectWidget.jsx b/frontend/src/metabase/components/form/widgets/FormSelectWidget.jsx index 12768f9156153e86f2a31beb0c55b691f3ce4b82..443cebe3b952cd0d3cc8fe9cb8eff7c0c922448e 100644 --- a/frontend/src/metabase/components/form/widgets/FormSelectWidget.jsx +++ b/frontend/src/metabase/components/form/widgets/FormSelectWidget.jsx @@ -3,12 +3,13 @@ import React from "react"; import Select, { Option } from "metabase/core/components/Select"; -const FormSelectWidget = ({ placeholder, options = [], field }) => ( +const FormSelectWidget = ({ placeholder, options = [], field, disabled }) => ( <Select placeholder={placeholder} {...field} // react-redux expects to be raw value onChange={e => field.onChange(e.target.value)} + disabled={disabled} buttonProps={{ style: { minWidth: 200 } }} > {options.map(({ name, value, icon }) => ( diff --git a/frontend/src/metabase/core/components/Select/Select.jsx b/frontend/src/metabase/core/components/Select/Select.jsx index 0fd99c418ca3b1fac34b1fcf2e18a6dc7a4d0cb1..c651225aa13652ca9460bd2a08b9415535022aff 100644 --- a/frontend/src/metabase/core/components/Select/Select.jsx +++ b/frontend/src/metabase/core/components/Select/Select.jsx @@ -33,6 +33,7 @@ export default class Select extends Component { onChange: PropTypes.func.isRequired, multiple: PropTypes.bool, placeholder: PropTypes.string, + disabled: PropTypes.bool, // PopoverWithTrigger props isInitiallyOpen: PropTypes.bool, @@ -191,6 +192,7 @@ export default class Select extends Component { hideEmptySectionsInSearch, isInitiallyOpen, onClose, + disabled, } = this.props; const sections = this._getSections(); @@ -210,6 +212,7 @@ export default class Select extends Component { ref={this.selectButtonRef} className="flex-full" hasValue={selectedNames.length > 0} + disabled={disabled} {...buttonProps} > {selectedNames.length > 0 @@ -226,6 +229,7 @@ export default class Select extends Component { onClose={composeEventHandlers(onClose, this.handleClose)} triggerClasses={cx("flex", className)} isInitiallyOpen={isInitiallyOpen} + disabled={disabled} verticalAttachments={["top", "bottom"]} // keep the popover from jumping around one its been opened, // this can happen when filtering items via search diff --git a/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js index 7ae4ca6c2d195202d72e7a5bb9c710856915ebbe..b0434c253ac40a72c984eda6ac9635d946e6e55f 100644 --- a/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js +++ b/frontend/test/metabase/scenarios/admin/databases/edit.cy.spec.js @@ -15,6 +15,15 @@ describe("scenarios > admin > databases > edit", () => { cy.route("PUT", "/api/database/*").as("databaseUpdate"); }); + describe("Database type", () => { + it("should be disabled for the Sample Dataset (metabase#16382)", () => { + cy.visit("/admin/databases/1"); + cy.findByText("H2") + .parentsUntil("a") + .should("be.disabled"); + }); + }); + describe("Connection settings", () => { it("shows the connection settings for sample database correctly", () => { cy.visit("/admin/databases/1");