Skip to content
Snippets Groups Projects
Unverified Commit 059b2ce1 authored by Ryan Laurie's avatar Ryan Laurie Committed by GitHub
Browse files

Remove more metabse settings (#47510)

* remove more metabse settings

* fix missing update for latest version check

* test updates

* fix setting selectors
parent 10775a08
No related branches found
No related tags found
No related merge requests found
Showing
with 115 additions and 176 deletions
...@@ -9,7 +9,7 @@ import SettingHeader from "metabase/admin/settings/components/SettingHeader"; ...@@ -9,7 +9,7 @@ import SettingHeader from "metabase/admin/settings/components/SettingHeader";
import GroupMappingsWidget from "metabase/admin/settings/containers/GroupMappingsWidget"; import GroupMappingsWidget from "metabase/admin/settings/containers/GroupMappingsWidget";
import { updateSamlSettings } from "metabase/admin/settings/settings"; import { updateSamlSettings } from "metabase/admin/settings/settings";
import { settingToFormField } from "metabase/admin/settings/utils"; import { settingToFormField } from "metabase/admin/settings/utils";
import { useDocsUrl } from "metabase/common/hooks"; import { useDocsUrl, useSetting } from "metabase/common/hooks";
import Breadcrumbs from "metabase/components/Breadcrumbs"; import Breadcrumbs from "metabase/components/Breadcrumbs";
import ExternalLink from "metabase/core/components/ExternalLink"; import ExternalLink from "metabase/core/components/ExternalLink";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
...@@ -23,7 +23,6 @@ import { ...@@ -23,7 +23,6 @@ import {
FormTextInput, FormTextInput,
FormTextarea, FormTextarea,
} from "metabase/forms"; } from "metabase/forms";
import MetabaseSettings from "metabase/lib/settings";
import { Stack } from "metabase/ui"; import { Stack } from "metabase/ui";
import { import {
...@@ -72,11 +71,13 @@ const SettingsSAMLForm = ({ elements = [], settingValues = {}, onSubmit }) => { ...@@ -72,11 +71,13 @@ const SettingsSAMLForm = ({ elements = [], settingValues = {}, onSubmit }) => {
"people-and-groups/authenticating-with-saml", "people-and-groups/authenticating-with-saml",
); );
const siteUrl = useSetting("site-url");
return ( return (
<FormProvider <FormProvider
initialValues={{ initialValues={{
...attributeValues, ...attributeValues,
[FAKE_ACS_URL_KEY]: getAcsCustomerUrl(), [FAKE_ACS_URL_KEY]: `${siteUrl}/auth/sso`,
}} }}
onSubmit={handleSubmit} onSubmit={handleSubmit}
enableReinitialize enableReinitialize
...@@ -271,10 +272,6 @@ const getAttributeValues = (values, defaults) => { ...@@ -271,10 +272,6 @@ const getAttributeValues = (values, defaults) => {
); );
}; };
const getAcsCustomerUrl = () => {
return `${MetabaseSettings.get("site-url")}/auth/sso`;
};
SettingsSAMLForm.propTypes = propTypes; SettingsSAMLForm.propTypes = propTypes;
const mapDispatchToProps = { const mapDispatchToProps = {
......
import MetabaseSettings from "metabase/lib/settings";
import { PLUGIN_IS_EE_BUILD } from "metabase/plugins"; import { PLUGIN_IS_EE_BUILD } from "metabase/plugins";
// SETTINGS OVERRIDES: // SETTINGS OVERRIDES:
// NOTE: temporarily use "latest" for Enterprise Edition docs
MetabaseSettings.docsTag = () => "latest";
PLUGIN_IS_EE_BUILD.isEEBuild = () => true; PLUGIN_IS_EE_BUILD.isEEBuild = () => true;
import "./shared"; import "./shared";
......
...@@ -4,12 +4,11 @@ ...@@ -4,12 +4,11 @@
// //
// The following cases are considered errors: // The following cases are considered errors:
// //
// 1. MetabaseSettings.learnUrl(string) // 1. useDocsUrl hook
// 2. useDocsUrl hook // 2. getDocsUrl selector from "metabase/selectors/settings"
// 3. getDocsUrl selector from "metabase/selectors/settings" // 3. getLearnUrl selector from "metabase/selectors/settings"
// 4. getLearnUrl selector from "metabase/selectors/settings" // 4. inline string "metabase.com/docs/"
// 5. inline string "metabase.com/docs/" // 5. inline string "metabase.com/learn/"
// 6. inline string "metabase.com/learn/"
// //
// If a link shouldn't be rendered conditionally e.g. it's only show for admins, or is rendered inside admin settings, you need to disable the rule with a reason. // If a link shouldn't be rendered conditionally e.g. it's only show for admins, or is rendered inside admin settings, you need to disable the rule with a reason.
// e.g. "// eslint-disable-next-line no-unconditional-metabase-links-render -- This link only shows for admins." // e.g. "// eslint-disable-next-line no-unconditional-metabase-links-render -- This link only shows for admins."
...@@ -50,7 +49,6 @@ module.exports = { ...@@ -50,7 +49,6 @@ module.exports = {
}, },
create(context) { create(context) {
let metabaseSettings;
let isGetDocsUrlSelectorImported = false; let isGetDocsUrlSelectorImported = false;
let isGetLearnUrlSelectorImported = false; let isGetLearnUrlSelectorImported = false;
let isGetShowMetabaseLinksSelectorImported = false; let isGetShowMetabaseLinksSelectorImported = false;
...@@ -89,17 +87,6 @@ module.exports = { ...@@ -89,17 +87,6 @@ module.exports = {
return { return {
ImportDeclaration(node) { ImportDeclaration(node) {
if (
getImportedModuleNode(node, {
isDefault: true,
source: "metabase/lib/settings",
})
) {
metabaseSettings = getImportedModuleNode(node, {
isDefault: true,
source: "metabase/lib/settings",
});
}
if ( if (
getImportedModuleNode(node, { getImportedModuleNode(node, {
named: "getDocsUrl", named: "getDocsUrl",
...@@ -171,20 +158,6 @@ module.exports = { ...@@ -171,20 +158,6 @@ module.exports = {
message: ERROR_MESSAGE, message: ERROR_MESSAGE,
}); });
} }
// call `MetabaseSettings.learnUrl`
if (
metabaseSettings?.references.some(
reference => reference.identifier === node?.callee?.object,
) &&
!isGetShowMetabaseLinksSelectorImported &&
["learnUrl", "docsUrl"].includes(node?.callee?.property?.name)
) {
context.report({
node,
message: ERROR_MESSAGE,
});
}
}, },
Literal(node) { Literal(node) {
if (typeof node.value !== "string") { if (typeof node.value !== "string") {
......
...@@ -19,20 +19,6 @@ const ruleTester = new RuleTester({ ...@@ -19,20 +19,6 @@ const ruleTester = new RuleTester({
const VALID_CASES = [ const VALID_CASES = [
{ {
code: ` code: `
import MetabaseSettings from "metabase/lib/settings";
import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
const docsUrl = MetabaseSettings.docsUrl("permissions/data")`,
},
{
code: `
import MetabaseSettings from "metabase/lib/settings";
import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
const docsUrl = MetabaseSettings.learnUrl("permissions/data")`,
},
{
code: `
import { useSelector } from "metabase/lib/redux"; import { useSelector } from "metabase/lib/redux";
import { getDocsUrl } from "metabase/selectors/settings"; import { getDocsUrl } from "metabase/selectors/settings";
import { getShowMetabaseLinks } from "metabase/selectors/whitelabel"; import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
...@@ -97,33 +83,6 @@ const { url } = useDocsUrl("permissions/data");`, ...@@ -97,33 +83,6 @@ const { url } = useDocsUrl("permissions/data");`,
}, },
]; ];
const INVALID_CASES = [ const INVALID_CASES = [
{
name: 'Detect any name of the default import of "metabase/lib/settings"',
code: `
import Settings from "metabase/lib/settings";
const docsUrl = Settings.docsUrl("permissions/data")`,
error:
/Metabase links must be rendered conditionally\.(.|\n)*Please import `getShowMetabaseLinks`(.|\n)*Or add comment to indicate the reason why this rule needs to be disabled/,
},
{
name: "Detect MetabaseSettings.docsUrl()",
code: `
import MetabaseSettings from "metabase/lib/settings";
const docsUrl = MetabaseSettings.docsUrl("permissions/data")`,
error:
/Metabase links must be rendered conditionally\.(.|\n)*Please import `getShowMetabaseLinks`(.|\n)*Or add comment to indicate the reason why this rule needs to be disabled/,
},
{
name: "Detect MetabaseSettings.learn()",
code: `
import MetabaseSettings from "metabase/lib/settings";
const docsUrl = MetabaseSettings.learnUrl("permissions/data")`,
error:
/Metabase links must be rendered conditionally\.(.|\n)*Please import `getShowMetabaseLinks`(.|\n)*Or add comment to indicate the reason why this rule needs to be disabled/,
},
{ {
name: "Detect getDocsUrl()", name: "Detect getDocsUrl()",
code: ` code: `
......
...@@ -200,7 +200,7 @@ export const createMockSettings = ( ...@@ -200,7 +200,7 @@ export const createMockSettings = (
"openai-organization": null, "openai-organization": null,
"openai-model": null, "openai-model": null,
"openai-available-models": [], "openai-available-models": [],
"other-sso-enabled?": null, "other-sso-enabled?": false,
"password-complexity": { total: 6, digit: 1 }, "password-complexity": { total: 6, digit: 1 },
"persisted-models-enabled": false, "persisted-models-enabled": false,
"persisted-model-refresh-cron-schedule": "0 0 0/6 * * ? *", "persisted-model-refresh-cron-schedule": "0 0 0/6 * * ? *",
......
...@@ -246,6 +246,7 @@ interface AdminSettings { ...@@ -246,6 +246,7 @@ interface AdminSettings {
"premium-embedding-token": string | null; "premium-embedding-token": string | null;
"saml-configured"?: boolean; "saml-configured"?: boolean;
"saml-enabled"?: boolean; "saml-enabled"?: boolean;
"other-sso-enabled?"?: boolean; // yes the question mark is in the variable name
"show-database-syncing-modal": boolean; "show-database-syncing-modal": boolean;
"token-status": TokenStatus | null; "token-status": TokenStatus | null;
"version-info": VersionInfo | null; "version-info": VersionInfo | null;
......
import { updateSetting } from "metabase/admin/settings/settings"; import { updateSetting } from "metabase/admin/settings/settings";
import { createAsyncThunk } from "metabase/lib/redux"; import { createAsyncThunk } from "metabase/lib/redux";
import Settings from "metabase/lib/settings";
import { getCurrentVersion } from "../settings/selectors";
export const disableNotice = createAsyncThunk( export const disableNotice = createAsyncThunk(
"metabase/admin/app/DISABLE_NOTICE", "metabase/admin/app/DISABLE_NOTICE",
async (_, { dispatch }) => { async (_, { getState, dispatch }) => {
const setting = { const setting = {
key: "deprecation-notice-version", key: "deprecation-notice-version",
value: Settings.currentVersion(), value: getCurrentVersion(getState()),
}; };
await dispatch(updateSetting(setting)); await dispatch(updateSetting(setting));
}, },
......
...@@ -5,13 +5,12 @@ import { ...@@ -5,13 +5,12 @@ import {
PERSIST_DATABASE, PERSIST_DATABASE,
UNPERSIST_DATABASE, UNPERSIST_DATABASE,
} from "metabase/admin/databases/database"; } from "metabase/admin/databases/database";
import { useDocsUrl } from "metabase/common/hooks"; import { useDocsUrl, useSetting } from "metabase/common/hooks";
import ActionButton from "metabase/components/ActionButton"; import ActionButton from "metabase/components/ActionButton";
import TippyPopover from "metabase/components/Popover/TippyPopover"; import TippyPopover from "metabase/components/Popover/TippyPopover";
import ExternalLink from "metabase/core/components/ExternalLink"; import ExternalLink from "metabase/core/components/ExternalLink";
import ButtonsS from "metabase/css/components/buttons.module.css"; import ButtonsS from "metabase/css/components/buttons.module.css";
import { useDispatch } from "metabase/lib/redux"; import { useDispatch } from "metabase/lib/redux";
import MetabaseSettings from "metabase/lib/settings";
import { MetabaseApi } from "metabase/services"; import { MetabaseApi } from "metabase/services";
import type Database from "metabase-lib/v1/metadata/Database"; import type Database from "metabase-lib/v1/metadata/Database";
import { getModelCacheSchemaName } from "metabase-lib/v1/metadata/utils/models"; import { getModelCacheSchemaName } from "metabase-lib/v1/metadata/utils/models";
...@@ -66,8 +65,8 @@ function ModelCachingControl({ database }: Props) { ...@@ -66,8 +65,8 @@ function ModelCachingControl({ database }: Props) {
? t`Turn model persistence off` ? t`Turn model persistence off`
: t`Turn model persistence on`; : t`Turn model persistence on`;
const siteUUID = MetabaseSettings.get("site-uuid") || ""; const siteUUID = useSetting("site-uuid");
const cacheSchemaName = getModelCacheSchemaName(databaseId, siteUUID); const cacheSchemaName = getModelCacheSchemaName(databaseId, siteUUID || "");
const handleCachingChange = async () => { const handleCachingChange = async () => {
setError(null); setError(null);
......
...@@ -3,9 +3,9 @@ import _ from "underscore"; ...@@ -3,9 +3,9 @@ import _ from "underscore";
import LoadingAndGenericErrorWrapper from "metabase/components/LoadingAndGenericErrorWrapper"; import LoadingAndGenericErrorWrapper from "metabase/components/LoadingAndGenericErrorWrapper";
import Database from "metabase/entities/databases"; import Database from "metabase/entities/databases";
import MetabaseSettings from "metabase/lib/settings";
import { isSyncInProgress } from "metabase/lib/syncing"; import { isSyncInProgress } from "metabase/lib/syncing";
import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
import { getSetting } from "metabase/selectors/settings";
import { getUserIsAdmin } from "metabase/selectors/user"; import { getUserIsAdmin } from "metabase/selectors/user";
import DatabaseList from "../components/DatabaseList"; import DatabaseList from "../components/DatabaseList";
...@@ -41,8 +41,8 @@ const mapStateToProps = (state, props) => ({ ...@@ -41,8 +41,8 @@ const mapStateToProps = (state, props) => ({
created: props.location.query.created, created: props.location.query.created,
createdDbId: props.location.query.createdDbId, createdDbId: props.location.query.createdDbId,
engines: MetabaseSettings.get("engines"), engines: getSetting(state, "engines"),
showSyncingModal: MetabaseSettings.get("show-database-syncing-modal"), showSyncingModal: getSetting(state, "show-database-syncing-modal"),
deletes: getDeletes(state), deletes: getDeletes(state),
deletionError: getDeletionError(state), deletionError: getDeletionError(state),
......
...@@ -6,7 +6,7 @@ import Modal from "metabase/components/Modal"; ...@@ -6,7 +6,7 @@ import Modal from "metabase/components/Modal";
import ModalContent from "metabase/components/ModalContent"; import ModalContent from "metabase/components/ModalContent";
import ButtonsS from "metabase/css/components/buttons.module.css"; import ButtonsS from "metabase/css/components/buttons.module.css";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import MetabaseSettings from "metabase/lib/settings"; import { getLearnUrl } from "metabase/selectors/settings";
import { import {
ButtonLink, ButtonLink,
...@@ -20,7 +20,7 @@ ModelEducationalModal.propTypes = { ...@@ -20,7 +20,7 @@ ModelEducationalModal.propTypes = {
onClose: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired,
}; };
const EDUCATION_URL = MetabaseSettings.learnUrl("getting-started/models"); const EDUCATION_URL = getLearnUrl("getting-started/models");
export function ModelEducationalModal({ isOpen, onClose }) { export function ModelEducationalModal({ isOpen, onClose }) {
return ( return (
......
...@@ -12,7 +12,7 @@ import Button from "metabase/core/components/Button"; ...@@ -12,7 +12,7 @@ import Button from "metabase/core/components/Button";
import Link from "metabase/core/components/Link"; import Link from "metabase/core/components/Link";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import Users from "metabase/entities/users"; import Users from "metabase/entities/users";
import MetabaseSettings from "metabase/lib/settings"; import { getSetting, isSsoEnabled } from "metabase/selectors/settings";
import { clearTemporaryPassword } from "../people"; import { clearTemporaryPassword } from "../people";
import { getUserTemporaryPassword } from "../selectors"; import { getUserTemporaryPassword } from "../selectors";
...@@ -25,10 +25,14 @@ class UserSuccessModal extends Component { ...@@ -25,10 +25,14 @@ class UserSuccessModal extends Component {
} }
render() { render() {
const { onClose, user, temporaryPassword } = this.props; const {
const isSsoEnabled = onClose,
MetabaseSettings.isSsoEnabled() && user,
!MetabaseSettings.isPasswordLoginEnabled(); temporaryPassword,
isSsoEnabled,
isPasswordLoginEnabled,
} = this.props;
const ssoEnabled = isSsoEnabled && !isPasswordLoginEnabled;
return ( return (
<ModalContent <ModalContent
title={t`${user.common_name} has been added`} title={t`${user.common_name} has been added`}
...@@ -38,7 +42,7 @@ class UserSuccessModal extends Component { ...@@ -38,7 +42,7 @@ class UserSuccessModal extends Component {
{temporaryPassword ? ( {temporaryPassword ? (
<PasswordSuccess user={user} temporaryPassword={temporaryPassword} /> <PasswordSuccess user={user} temporaryPassword={temporaryPassword} />
) : ( ) : (
<EmailSuccess isSsoEnabled={isSsoEnabled} user={user} /> <EmailSuccess isSsoEnabled={ssoEnabled} user={user} />
)} )}
</ModalContent> </ModalContent>
); );
...@@ -86,7 +90,6 @@ const PasswordSuccess = ({ user, temporaryPassword }) => ( ...@@ -86,7 +90,6 @@ const PasswordSuccess = ({ user, temporaryPassword }) => (
</div> </div>
</div> </div>
); );
export default _.compose( export default _.compose(
Users.load({ Users.load({
id: (state, props) => props.params.userId, id: (state, props) => props.params.userId,
...@@ -96,6 +99,8 @@ export default _.compose( ...@@ -96,6 +99,8 @@ export default _.compose(
temporaryPassword: getUserTemporaryPassword(state, { temporaryPassword: getUserTemporaryPassword(state, {
userId: props.params.userId, userId: props.params.userId,
}), }),
isSsoEnabled: isSsoEnabled(state),
isPasswordLoginEnabled: getSetting(state, "enable-password-login"),
}), }),
{ {
onClose: () => push("/admin/people"), onClose: () => push("/admin/people"),
......
...@@ -2,8 +2,8 @@ import cx from "classnames"; ...@@ -2,8 +2,8 @@ import cx from "classnames";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { UpsellHostingUpdates } from "metabase/admin/upsells"; import { UpsellHostingUpdates } from "metabase/admin/upsells";
import { useSetting } from "metabase/common/hooks";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import MetabaseSettings from "metabase/lib/settings";
import { Flex } from "metabase/ui"; import { Flex } from "metabase/ui";
import { SettingsSetting } from "../SettingsSetting"; import { SettingsSetting } from "../SettingsSetting";
...@@ -18,16 +18,17 @@ export default function SettingsUpdatesForm({ elements, updateSetting }) { ...@@ -18,16 +18,17 @@ export default function SettingsUpdatesForm({ elements, updateSetting }) {
autoFocus={index === 0} autoFocus={index === 0}
/> />
)); ));
const isHosted = useSetting("is-hosted");
return ( return (
<Flex justify="space-between"> <Flex justify="space-between">
<div style={{ width: "585px" }}> <div style={{ width: "585px" }}>
{!MetabaseSettings.isHosted() && <ul>{settings}</ul>} {!isHosted && <ul>{settings}</ul>}
<div className={CS.px2}> <div className={CS.px2}>
<div <div
className={cx(CS.pt3, { className={cx(CS.pt3, {
[CS.borderTop]: !MetabaseSettings.isHosted(), [CS.borderTop]: !isHosted,
})} })}
> >
<VersionUpdateNotice /> <VersionUpdateNotice />
......
...@@ -51,17 +51,17 @@ function setup({ ...@@ -51,17 +51,17 @@ function setup({
} }
describe("SettingsUpdatesForm", () => { describe("SettingsUpdatesForm", () => {
it("shows custom message for Cloud installations", () => { it("shows custom message for Cloud installations", async () => {
setup({ isHosted: true }); setup({ isHosted: true });
expect( expect(
screen.getByText(/Metabase Cloud keeps your instance up-to-date/), await screen.findByText(/Metabase Cloud keeps your instance up-to-date/),
).toBeInTheDocument(); ).toBeInTheDocument();
}); });
it("shows correct message when latest version is installed", () => { it("shows correct message when latest version is installed", async () => {
setup({ currentVersion: "v1.0.0", latestVersion: "v1.0.0" }); setup({ currentVersion: "v1.0.0", latestVersion: "v1.0.0" });
expect( expect(
screen.getByText(/You're running Metabase 1.0.0/), await screen.findByText(/You're running Metabase 1.0.0/),
).toBeInTheDocument(); ).toBeInTheDocument();
}); });
......
...@@ -2,10 +2,17 @@ import cx from "classnames"; ...@@ -2,10 +2,17 @@ import cx from "classnames";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { t } from "ttag"; import { t } from "ttag";
import {
getCurrentVersion,
getLatestVersion,
} from "metabase/admin/settings/selectors";
import ExternalLink from "metabase/core/components/ExternalLink"; import ExternalLink from "metabase/core/components/ExternalLink";
import ButtonsS from "metabase/css/components/buttons.module.css"; import ButtonsS from "metabase/css/components/buttons.module.css";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import { useSelector } from "metabase/lib/redux";
import MetabaseSettings from "metabase/lib/settings"; import MetabaseSettings from "metabase/lib/settings";
import { newVersionAvailable, versionIsLatest } from "metabase/lib/utils";
import { getIsHosted } from "metabase/setup/selectors";
import { import {
NewVersionContainer, NewVersionContainer,
...@@ -13,18 +20,22 @@ import { ...@@ -13,18 +20,22 @@ import {
} from "./VersionUpdateNotice.styled"; } from "./VersionUpdateNotice.styled";
export default function VersionUpdateNotice() { export default function VersionUpdateNotice() {
const currentVersion = formatVersion(MetabaseSettings.currentVersion()); const currentVersion = useSelector(getCurrentVersion);
const latestVersion = useSelector(getLatestVersion);
const isHosted = useSelector(getIsHosted);
if (MetabaseSettings.isHosted()) { if (isHosted) {
return <CloudCustomers currentVersion={currentVersion} />; return <CloudCustomers currentVersion={currentVersion} />;
} }
if (MetabaseSettings.versionIsLatest()) { const displayVersion = formatVersion(currentVersion);
return <OnLatestVersion currentVersion={currentVersion} />;
if (versionIsLatest({ currentVersion, latestVersion })) {
return <OnLatestVersion currentVersion={displayVersion} />;
} }
if (MetabaseSettings.newVersionAvailable()) { if (newVersionAvailable({ currentVersion, latestVersion })) {
return <NewVersionAvailable currentVersion={currentVersion} />; return <NewVersionAvailable currentVersion={displayVersion} />;
} }
return <div>{t`No successful checks yet.`}</div>; return <div>{t`No successful checks yet.`}</div>;
......
...@@ -6,6 +6,7 @@ import { SMTPConnectionForm } from "metabase/admin/settings/components/Email/SMT ...@@ -6,6 +6,7 @@ import { SMTPConnectionForm } from "metabase/admin/settings/components/Email/SMT
import Breadcrumbs from "metabase/components/Breadcrumbs"; import Breadcrumbs from "metabase/components/Breadcrumbs";
import { DashboardSelector } from "metabase/components/DashboardSelector"; import { DashboardSelector } from "metabase/components/DashboardSelector";
import MetabaseSettings from "metabase/lib/settings"; import MetabaseSettings from "metabase/lib/settings";
import { newVersionAvailable } from "metabase/lib/utils";
import { import {
PLUGIN_ADMIN_SETTINGS_AUTH_TABS, PLUGIN_ADMIN_SETTINGS_AUTH_TABS,
PLUGIN_ADMIN_SETTINGS_UPDATES, PLUGIN_ADMIN_SETTINGS_UPDATES,
...@@ -620,9 +621,30 @@ export const getSettingValues = createSelector(getSettings, settings => { ...@@ -620,9 +621,30 @@ export const getSettingValues = createSelector(getSettings, settings => {
return settingValues; return settingValues;
}); });
export const getNewVersionAvailable = createSelector(getSettings, settings => { export const getCurrentVersion = createSelector(
return MetabaseSettings.newVersionAvailable(settings); getDerivedSettingValues,
}); settings => {
return settings.version?.tag;
},
);
export const getLatestVersion = createSelector(
getDerivedSettingValues,
settings => {
return settings["version-info"]?.latest?.version;
},
);
export const getNewVersionAvailable = createSelector(
getCurrentVersion,
getLatestVersion,
(currentVersion, latestVersion) => {
return newVersionAvailable({
currentVersion,
latestVersion,
});
},
);
export const getSections = createSelector( export const getSections = createSelector(
getSettings, getSettings,
......
...@@ -2,7 +2,7 @@ import { t } from "ttag"; ...@@ -2,7 +2,7 @@ import { t } from "ttag";
import { useUniqueId } from "metabase/hooks/use-unique-id"; import { useUniqueId } from "metabase/hooks/use-unique-id";
import { useSelector } from "metabase/lib/redux"; import { useSelector } from "metabase/lib/redux";
import MetabaseSettings from "metabase/lib/settings"; import { getLearnUrl } from "metabase/selectors/settings";
import { import {
getApplicationName, getApplicationName,
getShowMetabaseLinks, getShowMetabaseLinks,
...@@ -20,7 +20,7 @@ export const HomeHelpCard = (): JSX.Element | null => { ...@@ -20,7 +20,7 @@ export const HomeHelpCard = (): JSX.Element | null => {
} }
return ( return (
<CardRoot href={MetabaseSettings.learnUrl()} aria-labelledby={cardTitleId}> <CardRoot href={getLearnUrl()} aria-labelledby={cardTitleId}>
<CardIcon name="reference" /> <CardIcon name="reference" />
<CardTitle id={cardTitleId}>{t`${applicationName} tips`}</CardTitle> <CardTitle id={cardTitleId}>{t`${applicationName} tips`}</CardTitle>
</CardRoot> </CardRoot>
......
...@@ -3,7 +3,7 @@ import { msgid, ngettext, t } from "ttag"; ...@@ -3,7 +3,7 @@ import { msgid, ngettext, t } from "ttag";
import _ from "underscore"; import _ from "underscore";
import { parseTimestamp } from "metabase/lib/time"; import { parseTimestamp } from "metabase/lib/time";
import { compareVersions, numberToWord } from "metabase/lib/utils"; import { numberToWord } from "metabase/lib/utils";
import type { import type {
PasswordComplexity, PasswordComplexity,
SettingKey, SettingKey,
...@@ -145,13 +145,6 @@ class MetabaseSettings { ...@@ -145,13 +145,6 @@ class MetabaseSettings {
return this.get("cloud-gateway-ips") || []; return this.get("cloud-gateway-ips") || [];
} }
/**
* @deprecated use getSetting(state, "has-user-setup")
*/
hasUserSetup() {
return this.get("has-user-setup");
}
/** /**
* @deprecated use getSetting(state, "hide-embed-branding?") * @deprecated use getSetting(state, "hide-embed-branding?")
*/ */
...@@ -187,17 +180,6 @@ class MetabaseSettings { ...@@ -187,17 +180,6 @@ class MetabaseSettings {
return this.get("other-sso-enabled?"); return this.get("other-sso-enabled?");
} }
/**
* @deprecated use getSetting(state, ...)
*/
isSsoEnabled() {
return (
this.isLdapEnabled() ||
this.isGoogleAuthEnabled() ||
this.isOtherSsoEnabled()
);
}
/** /**
* @deprecated use getSetting(state, "enable-password-login") * @deprecated use getSetting(state, "enable-password-login")
*/ */
...@@ -273,35 +255,6 @@ class MetabaseSettings { ...@@ -273,35 +255,6 @@ class MetabaseSettings {
} }
} }
/**
* @deprecated use getLearnUrl
*/
learnUrl(path = "") {
// eslint-disable-next-line no-unconditional-metabase-links-render -- This is the implementation of MetabaseSettings.learnUrl()
return `https://www.metabase.com/learn/${path}`;
}
/**
* @deprecated use getStoreUrl
*/
storeUrl(path = "") {
return `https://store.metabase.com/${path}`;
}
migrateToCloudGuideUrl() {
return "https://www.metabase.com/cloud/docs/migrate/guide";
}
newVersionAvailable() {
const result = compareVersions(this.currentVersion(), this.latestVersion());
return result != null && result < 0;
}
versionIsLatest() {
const result = compareVersions(this.currentVersion(), this.latestVersion());
return result != null && result >= 0;
}
/** /**
* @deprecated use getSetting(state, "version-info") * @deprecated use getSetting(state, "version-info")
*/ */
......
...@@ -138,4 +138,26 @@ export function compareVersions( ...@@ -138,4 +138,26 @@ export function compareVersions(
return 0; return 0;
} }
export function newVersionAvailable({
currentVersion,
latestVersion,
}: {
currentVersion: string;
latestVersion: string;
}) {
const result = compareVersions(currentVersion, latestVersion);
return result != null && result < 0;
}
export function versionIsLatest({
currentVersion,
latestVersion,
}: {
currentVersion: string;
latestVersion: string;
}) {
const result = compareVersions(currentVersion, latestVersion);
return result != null && result >= 0;
}
export const isEEBuild = () => PLUGIN_IS_EE_BUILD.isEEBuild(); export const isEEBuild = () => PLUGIN_IS_EE_BUILD.isEEBuild();
...@@ -9,12 +9,11 @@ import { Grid } from "metabase/components/Grid"; ...@@ -9,12 +9,11 @@ import { Grid } from "metabase/components/Grid";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import Databases from "metabase/entities/databases"; import Databases from "metabase/entities/databases";
import { useSelector } from "metabase/lib/redux"; import { useSelector } from "metabase/lib/redux";
import MetabaseSettings from "metabase/lib/settings";
import * as Urls from "metabase/lib/urls"; import * as Urls from "metabase/lib/urls";
import NewModelOption from "metabase/models/components/NewModelOption"; import NewModelOption from "metabase/models/components/NewModelOption";
import { NoDatabasesEmptyState } from "metabase/reference/databases/NoDatabasesEmptyState"; import { NoDatabasesEmptyState } from "metabase/reference/databases/NoDatabasesEmptyState";
import { getHasDataAccess, getHasNativeWrite } from "metabase/selectors/data"; import { getHasDataAccess, getHasNativeWrite } from "metabase/selectors/data";
import { getSetting } from "metabase/selectors/settings"; import { getLearnUrl, getSetting } from "metabase/selectors/settings";
import { getShowMetabaseLinks } from "metabase/selectors/whitelabel"; import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
import { import {
...@@ -23,7 +22,7 @@ import { ...@@ -23,7 +22,7 @@ import {
OptionsRoot, OptionsRoot,
} from "./NewModelOptions.styled"; } from "./NewModelOptions.styled";
const EDUCATIONAL_LINK = MetabaseSettings.learnUrl("data-modeling/models"); const EDUCATIONAL_LINK = getLearnUrl("data-modeling/models");
interface NewModelOptionsProps { interface NewModelOptionsProps {
location: Location; location: Location;
......
...@@ -3,7 +3,7 @@ import { jt, t } from "ttag"; ...@@ -3,7 +3,7 @@ import { jt, t } from "ttag";
import Banner from "metabase/components/Banner"; import Banner from "metabase/components/Banner";
import ExternalLink from "metabase/core/components/ExternalLink"; import ExternalLink from "metabase/core/components/ExternalLink";
import CS from "metabase/css/core/index.css"; import CS from "metabase/css/core/index.css";
import MetabaseSettings from "metabase/lib/settings"; import { getStoreUrl } from "metabase/selectors/settings";
import type { TokenStatus } from "metabase-types/api"; import type { TokenStatus } from "metabase-types/api";
interface PaymentBannerProps { interface PaymentBannerProps {
...@@ -19,7 +19,7 @@ export const PaymentBanner = ({ isAdmin, tokenStatus }: PaymentBannerProps) => { ...@@ -19,7 +19,7 @@ export const PaymentBanner = ({ isAdmin, tokenStatus }: PaymentBannerProps) => {
<ExternalLink <ExternalLink
key="payment-past-due" key="payment-past-due"
className={CS.link} className={CS.link}
href={MetabaseSettings.storeUrl()} href={getStoreUrl()}
> >
{t`review your payment settings`} {t`review your payment settings`}
</ExternalLink> </ExternalLink>
...@@ -33,7 +33,7 @@ export const PaymentBanner = ({ isAdmin, tokenStatus }: PaymentBannerProps) => { ...@@ -33,7 +33,7 @@ export const PaymentBanner = ({ isAdmin, tokenStatus }: PaymentBannerProps) => {
<ExternalLink <ExternalLink
key="payment-unpaid" key="payment-unpaid"
className={CS.link} className={CS.link}
href={MetabaseSettings.storeUrl()} href={getStoreUrl()}
> >
{t`Review your payment settings`} {t`Review your payment settings`}
</ExternalLink> </ExternalLink>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment