diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 000000000000..1c02edda5666 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,34 @@ +pipeline { + agent { + docker { + image 'metabasepackage' + args '-v /.npm:/.npm -v /.cache:/.cache -v /.yarn:/.yarn' + } + } + environment { + HOME = "/.cache" + } + stages { + stage("print env variables") { + steps { + script { + echo sh(script: 'env|sort', returnStdout: true) + } + } + } + stage("run build") { + steps { + sh './bin/build no-translations' + } + } + } + post { + success { + archiveArtifacts artifacts: 'target/uberjar/metabase.jar' + slackSend color: 'good', channel: '#jenkins-metabasepackage', message: "*SUCCESSED* - Packaged metabase. Download jar file from Jenkins: <${env.BUILD_URL}|build ${env.BUILD_NUMBER}>" + } + failure { + slackSend color: 'danger', channel: '#jenkins-metabasepackage', message: "*FAILED* - Metabase build failed (<${env.BUILD_URL}|build ${env.BUILD_NUMBER}>) - <${env.BUILD_URL}console|click here to see the console output>" + } + } +} diff --git a/app.json b/app.json index c9d6bcaf1133..62d694e5643b 100644 --- a/app.json +++ b/app.json @@ -1,5 +1,5 @@ { - "name": "Metabase", + "name": "BI Reporting", "description": "Metabase report server", "keywords": [ "business intelligence", diff --git a/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx b/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx index 48e973828284..342045ce3d42 100644 --- a/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx +++ b/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx @@ -119,7 +119,7 @@ export default class DatabaseSchedulingForm extends Component {

- {t`To do some of its magic, Metabase needs to scan your database. We will also rescan it periodically to keep the metadata up-to-date. You can control when the periodic rescans happen below.`} + {t`To do some of its magic, BI Reporting needs to scan your database. We will also rescan it periodically to keep the metadata up-to-date. You can control when the periodic rescans happen below.`}

@@ -150,13 +150,13 @@ export default class DatabaseSchedulingForm extends Component {

{t`Scanning for Filter Values`}

-

{t`Metabase can scan the values present in each +

{t`BI Reporting can scan the values present in each field in this database to enable checkbox filters in dashboards and questions. This can be a somewhat resource-intensive process, particularly if you have a very large database.`}

{t`When should Metabase automatically scan and cache field values?`}

+ >{t`When should BI Reporting automatically scan and cache field values?`}
  1. this.setIsFullSyncIsOnDemand(false, true)} >

    - {t`When a user adds a new filter to a dashboard or a SQL question, Metabase will + {t`When a user adds a new filter to a dashboard or a SQL question, BI Reporting will scan the field(s) mapped to that filter in order to show the list of selectable values.`}

    diff --git a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx index bba9b6dbcc91..db5ed67b7682 100644 --- a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx @@ -304,7 +304,7 @@ const FieldGeneralPane = ({
    rescanFieldValues(field.id)} diff --git a/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx b/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx index 1f68b218404d..48c2f5f0b082 100644 --- a/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx @@ -100,7 +100,7 @@ class UpdateFieldValues extends Component {
    {t`All users belong to the ${getGroupNameLocalized( group, )} group and can't be removed from it. Setting permissions for this group is a great way to - make sure you know what new Metabase users will be able to see.`} + make sure you know what new BI Reporting users will be able to see.`}

    ) : isAdminGroup(group) ? (

    - {t`This is a special group whose members can see everything in the Metabase instance, and who can access and make changes to the + {t`This is a special group whose members can see everything in the BI Reporting instance, and who can access and make changes to the settings in the Admin Panel, including changing permissions! So, add people to this group with care.`}

    - {t`To make sure you don't get locked out of Metabase, there always has to be at least one user in this group.`} + {t`To make sure you don't get locked out of BI Reporting, there always has to be at least one user in this group.`}

    ) : null; diff --git a/frontend/src/metabase/admin/permissions/selectors.js b/frontend/src/metabase/admin/permissions/selectors.js index 5bbd0dcab35c..0110c1a92165 100644 --- a/frontend/src/metabase/admin/permissions/selectors.js +++ b/frontend/src/metabase/admin/permissions/selectors.js @@ -56,9 +56,9 @@ const SPECIAL_GROUP_FILTERS = [ function getTooltipForGroup(group) { if (isAdminGroup(group)) { - return t`Administrators always have the highest level of access to everything in Metabase.`; + return t`Administrators always have the highest level of access to everything in BI Reporting.`; } else if (isDefaultGroup(group)) { - return t`Every Metabase user belongs to the All Users group. If you want to limit or restrict a group's access to something, make sure the All Users group has an equal or lower level of access.`; + return t`Every BI Reporting user belongs to the All Users group. If you want to limit or restrict a group's access to something, make sure the All Users group has an equal or lower level of access.`; } else if (isMetaBotGroup(group)) { return t`MetaBot is Metabase's Slack bot. You can choose what it has access to here.`; } diff --git a/frontend/src/metabase/admin/settings/components/SettingsAuthenticationOptions.jsx b/frontend/src/metabase/admin/settings/components/SettingsAuthenticationOptions.jsx index b26eed85ac80..fb01ad6c088d 100644 --- a/frontend/src/metabase/admin/settings/components/SettingsAuthenticationOptions.jsx +++ b/frontend/src/metabase/admin/settings/components/SettingsAuthenticationOptions.jsx @@ -10,7 +10,7 @@ class SettingsAuthenticationOptions extends Component {

    {t`Sign in with Google`}

    {t`Allows users with existing Metabase accounts to login with a Google account that matches their email address in addition to their Metabase username and password.`}

    + >{t`Allows users with existing BI Reporting accounts to login with a Google account that matches their email address in addition to their BI Reporting username and password.`}

    {t`LDAP`}

    {t`Allows users within your LDAP directory to log in to Metabase with their LDAP credentials, and allows automatic mapping of LDAP groups to Metabase groups.`}

    + >{t`Allows users within your LDAP directory to log in to BI Reporting with their LDAP credentials, and allows automatic mapping of LDAP groups to BI Reporting groups.`}

    {t`Getting set up`}

    -

    {t`A few things you can do to get the most out of Metabase.`}

    +

    {t`A few things you can do to get the most out of BI Reporting.`}

    {t`Sign in with Google`}

    - {t`Allows users with existing Metabase accounts to login with a Google account that matches their email address in addition to their Metabase username and password.`} + {t`Allows users with existing BI Reporting accounts to login with a Google account that matches their email address in addition to their BI Reporting username and password.`}

    - {jt`To allow users to sign in with Google you'll need to give Metabase a Google Developers console application client ID. It only takes a few steps and instructions on how to create a key can be found ${( + {jt`To allow users to sign in with Google you'll need to give BI Reporting a Google Developers console application client ID. It only takes a few steps and instructions on how to create a key can be found ${( ( .

    - {t`In plain English, when you embed charts or dashboards from Metabase in your own application, that application isn't subject to the Affero General Public License that covers the rest of Metabase, provided you keep the Metabase logo and the "Powered by Metabase" visible on those embeds. You should, however, read the license text linked above as that is the actual license that you will be agreeing to by enabling this feature.`} + {t`In plain English, when you embed charts or dashboards from BI Reporting in your own application, that application isn't subject to the Affero General Public License that covers the rest of Metabase, provided you keep the Metabase logo and the "Powered by Metabase" visible on those embeds. You should, however, read the license text linked above as that is the actual license that you will be agreeing to by enabling this feature.`}

    - {t`Mappings allow Metabase to automatically add and remove users from groups based on the membership information provided by the + {t`Mappings allow BI Reporting to automatically add and remove users from groups based on the membership information provided by the directory server. Membership to the Admin group can be granted through mappings, but will not be automatically removed as a failsafe measure.`}

    diff --git a/frontend/src/metabase/admin/settings/selectors.js b/frontend/src/metabase/admin/settings/selectors.js index a76381d4929c..14b6e7187c27 100644 --- a/frontend/src/metabase/admin/settings/selectors.js +++ b/frontend/src/metabase/admin/settings/selectors.js @@ -303,7 +303,7 @@ const SECTIONS = [ { key: "map-tile-server-url", display_name: t`Map tile server URL`, - note: t`Metabase uses OpenStreetMaps by default.`, + note: t`BI Reporting uses OpenStreetMaps by default.`, type: "string", }, { @@ -378,7 +378,7 @@ const SECTIONS = [ }, { key: "enable-embedding", - display_name: t`Enable Embedding Metabase in other Applications`, + display_name: t`Enable Embedding BI Reporting in other Applications`, type: "boolean", getHidden: settings => !settings["enable-embedding"], }, diff --git a/frontend/src/metabase/admin/tasks/containers/TasksApp.jsx b/frontend/src/metabase/admin/tasks/containers/TasksApp.jsx index c554ca324a7b..dcec488dd679 100644 --- a/frontend/src/metabase/admin/tasks/containers/TasksApp.jsx +++ b/frontend/src/metabase/admin/tasks/containers/TasksApp.jsx @@ -35,7 +35,7 @@ class TasksApp extends React.Component { -
    - - - - - - - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    -
    - {/* 09-12-2016 */} -
    +
    ); } diff --git a/frontend/src/metabase/auth/components/GoogleNoAccount.jsx b/frontend/src/metabase/auth/components/GoogleNoAccount.jsx index 7e9219cbe64c..b0c73ab3619b 100644 --- a/frontend/src/metabase/auth/components/GoogleNoAccount.jsx +++ b/frontend/src/metabase/auth/components/GoogleNoAccount.jsx @@ -12,9 +12,9 @@ const GoogleNoAccount = () => (
    -

    {t`No Metabase account exists for this Google account.`}

    +

    {t`No BI Reporting account exists for this Google account.`}

    - {t`You'll need an administrator to create a Metabase account before you can use Google to log in.`} + {t`You'll need an administrator to create a BI Reporting account before you can use Google to log in.`}

    diff --git a/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx b/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx index ab51f7efd8df..87482dda10de 100644 --- a/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx +++ b/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx @@ -81,7 +81,7 @@ export default class ForgotPasswordApp extends Component { this.setState({ email: e.target.value })} defaultValue={this.state.email} diff --git a/frontend/src/metabase/auth/containers/LoginApp.jsx b/frontend/src/metabase/auth/containers/LoginApp.jsx index cfbe749f8c07..9f0e1a021b4f 100644 --- a/frontend/src/metabase/auth/containers/LoginApp.jsx +++ b/frontend/src/metabase/auth/containers/LoginApp.jsx @@ -36,7 +36,9 @@ export default class LoginApp extends Component { credentials: {}, valid: false, rememberMe: true, + hidden: true }; + this.displayLogin = this.displayLogin.bind(this); } validateForm() { @@ -100,6 +102,10 @@ export default class LoginApp extends Component { }); } + displayLogin(e) { + this.setState({hidden : false}); + } + formSubmitted(e) { e.preventDefault(); @@ -115,7 +121,8 @@ export default class LoginApp extends Component { return (
    -
    +
    Please sign in to BI Reporting from simPRO
    +
    @@ -125,7 +132,7 @@ export default class LoginApp extends Component { name="form" onSubmit={e => this.formSubmitted(e)} > -

    {t`Sign in to Metabase`}

    +

    {t`Administrator login`}

    {Settings.ssoEnabled() && (
    @@ -233,6 +240,7 @@ export default class LoginApp extends Component {
    +
    Admin Login
    ); } diff --git a/frontend/src/metabase/components/BrowseApp.jsx b/frontend/src/metabase/components/BrowseApp.jsx index ec3be9c40ac5..34eb74f38637 100644 --- a/frontend/src/metabase/components/BrowseApp.jsx +++ b/frontend/src/metabase/components/BrowseApp.jsx @@ -205,19 +205,6 @@ export class TableBrowser extends React.Component { )} - - - - - diff --git a/frontend/src/metabase/components/ChannelSetupMessage.jsx b/frontend/src/metabase/components/ChannelSetupMessage.jsx index 136d229ce525..e089faf87c89 100644 --- a/frontend/src/metabase/components/ChannelSetupMessage.jsx +++ b/frontend/src/metabase/components/ChannelSetupMessage.jsx @@ -13,7 +13,7 @@ export default class ChannelSetupMessage extends Component { }; static defaultProps = { - channels: ["email", "Slack"], + channels: ["email"], }; render() { diff --git a/frontend/src/metabase/components/ChannelSetupModal.jsx b/frontend/src/metabase/components/ChannelSetupModal.jsx index 667e97c2f9e3..a270a7ad79d5 100644 --- a/frontend/src/metabase/components/ChannelSetupModal.jsx +++ b/frontend/src/metabase/components/ChannelSetupModal.jsx @@ -16,7 +16,7 @@ export default class ChannelSetupModal extends Component { }; static defaultProps = { - channels: ["email", "Slack"], + channels: ["email"], }; render() { diff --git a/frontend/src/metabase/components/CollectionLanding.jsx b/frontend/src/metabase/components/CollectionLanding.jsx index b9c789e77a59..43525c55da33 100644 --- a/frontend/src/metabase/components/CollectionLanding.jsx +++ b/frontend/src/metabase/components/CollectionLanding.jsx @@ -72,7 +72,7 @@ const DashboardEmptyState = () => ( const PulseEmptyState = () => ( } /> @@ -680,7 +680,6 @@ class CollectionLanding extends React.Component { const CollectionSectionHeading = ({ children }) => (
    {children} diff --git a/frontend/src/metabase/components/DatabaseDetailsForm.jsx b/frontend/src/metabase/components/DatabaseDetailsForm.jsx index 2ca3b246daf6..4303b1365885 100644 --- a/frontend/src/metabase/components/DatabaseDetailsForm.jsx +++ b/frontend/src/metabase/components/DatabaseDetailsForm.jsx @@ -268,9 +268,9 @@ export default class DatabaseDetailsForm extends Component {

    {t`This is a large database, so let me choose when Metabase syncs and scans`}

    + >{t`This is a large database, so let me choose when BI Reporting syncs and scans`}
    - {t`By default, Metabase does a lightweight hourly sync and an intensive daily scan of field values. + {t`By default, BI Reporting does a lightweight hourly sync and an intensive daily scan of field values. If you have a large database, we recommend turning this on and reviewing when and how often the field value scans happen.`}
    @@ -345,7 +345,7 @@ export default class DatabaseDetailsForm extends Component { enableAPILink = (
    - {t`To use Metabase with this data you must enable API access in the Google Developers Console.`} + {t`To use BI Reporting with this data you must enable API access in the Google Developers Console.`}
    {jt`${( diff --git a/frontend/src/metabase/components/ItemTypeFilterBar.jsx b/frontend/src/metabase/components/ItemTypeFilterBar.jsx index 91bbb0333901..df69cd7b9b60 100644 --- a/frontend/src/metabase/components/ItemTypeFilterBar.jsx +++ b/frontend/src/metabase/components/ItemTypeFilterBar.jsx @@ -28,7 +28,7 @@ export const FILTERS = [ name: t`Pulses`, filter: "pulse", icon: "pulse", - }, + } ]; const ItemTypeFilterBar = props => { diff --git a/frontend/src/metabase/components/LogoIcon.jsx b/frontend/src/metabase/components/LogoIcon.jsx index c551bcb248a0..b957ff443218 100644 --- a/frontend/src/metabase/components/LogoIcon.jsx +++ b/frontend/src/metabase/components/LogoIcon.jsx @@ -4,7 +4,7 @@ import cx from "classnames"; export default class LogoIcon extends Component { static defaultProps = { - size: 32, + size: 48, }; static propTypes = { @@ -19,16 +19,14 @@ export default class LogoIcon extends Component { return ( - ); } diff --git a/frontend/src/metabase/components/SchedulePicker.jsx b/frontend/src/metabase/components/SchedulePicker.jsx index 80843cbaa72d..f7cd4d2e74af 100644 --- a/frontend/src/metabase/components/SchedulePicker.jsx +++ b/frontend/src/metabase/components/SchedulePicker.jsx @@ -207,7 +207,7 @@ export default class SchedulePicker extends Component { {textBeforeSendTime && (
    {textBeforeSendTime} {hour === 0 ? 12 : hour}:00{" "} - {amPm ? "PM" : "AM"} {timezone}, {t`your Metabase timezone`}. + {amPm ? "PM" : "AM"} {timezone}, {t`your BI Reporting timezone`}.
    )}
    diff --git a/frontend/src/metabase/containers/Overworld.jsx b/frontend/src/metabase/containers/Overworld.jsx index f39bec7189da..2e9db758697c 100644 --- a/frontend/src/metabase/containers/Overworld.jsx +++ b/frontend/src/metabase/containers/Overworld.jsx @@ -76,54 +76,12 @@ class Overworld extends React.Component { const { user, xraysEnabled } = this.props; return ( - - - - - - {Greeting.sayHello(user.first_name)} - - {({ items }) => { let pinnedDashboards = items.filter( d => d.model === "dashboard" && d.collection_position != null, ); - if (xraysEnabled && !pinnedDashboards.length > 0) { - return ( - - {({ candidates, sampleCandidates, isSample }) => { - // if there are no items to show then just hide the section - if (!candidates && !sampleCandidates) { - return null; - } - return ( - - {user.is_superuser && } - - - - {t`Try these x-rays based on your data.`} - - - - - - - - ); - }} - - ); - } - if (pinnedDashboards.length === 0) { return null; } @@ -213,64 +171,6 @@ class Overworld extends React.Component { - - - {({ databases }) => { - if (databases.length === 0) { - return null; - } - return ( - - {t`Our data`} - - - {databases.map(database => ( - - - - - -

    {database.name}

    - - - - - - - - - -
    -
    - -
    - ))} -
    -
    -
    - ); - }} -
    ); } @@ -329,12 +229,11 @@ export class AdminPinMessage extends React.Component { const SectionHeading = ({ children }) => ( -
    {children} -
    +
    ); diff --git a/frontend/src/metabase/css/components/buttons.css b/frontend/src/metabase/css/components/buttons.css index 68b23a44e333..23013a760583 100644 --- a/frontend/src/metabase/css/components/buttons.css +++ b/frontend/src/metabase/css/components/buttons.css @@ -13,7 +13,7 @@ cursor: pointer; text-decoration: none; font-weight: bold; - font-family: "Lato", sans-serif; + font-family: "Roboto", sans-serif; border-radius: var(--default-button-border-radius); } .Button:hover { diff --git a/frontend/src/metabase/css/core/base.css b/frontend/src/metabase/css/core/base.css index 5174d4149c1f..03c17a295a3f 100644 --- a/frontend/src/metabase/css/core/base.css +++ b/frontend/src/metabase/css/core/base.css @@ -1,5 +1,5 @@ :root { - --default-font-family: "Lato"; + --default-font-family: "Roboto"; --default-font-size: 0.875em; --default-font-color: var(--color-text-dark); --default-bg-color: var(--color-bg-light); diff --git a/frontend/src/metabase/css/core/colors.css b/frontend/src/metabase/css/core/colors.css index 1654805937d1..ebc8572ef8af 100644 --- a/frontend/src/metabase/css/core/colors.css +++ b/frontend/src/metabase/css/core/colors.css @@ -2,7 +2,7 @@ * NOTE: KEEP SYNCRONIZED WITH COLORS.JS */ :root { - --color-brand: #509ee3; + --color-brand: #1976d2; --color-accent1: #9cc177; --color-accent2: #a989c5; --color-accent3: #ef8c8c; @@ -23,7 +23,7 @@ --color-bg-black: #2e353b; --color-bg-dark: #93a1ab; --color-bg-medium: #edf2f5; - --color-bg-light: #f9fbfc; + --color-bg-light: #fdfdfd; --color-bg-white: #ffffff; --color-shadow: rgba(0, 0, 0, 0.08); --color-border: #d7dbde; diff --git a/frontend/src/metabase/css/core/overflow.css b/frontend/src/metabase/css/core/overflow.css index 727a2161873a..8e650e611f58 100644 --- a/frontend/src/metabase/css/core/overflow.css +++ b/frontend/src/metabase/css/core/overflow.css @@ -3,7 +3,7 @@ } .overflow-hidden { - overflow: hidden; + overflow: hidden !important; } .overflow-x-hidden { diff --git a/frontend/src/metabase/css/login.css b/frontend/src/metabase/css/login.css index 540edf16482f..a88834280a21 100644 --- a/frontend/src/metabase/css/login.css +++ b/frontend/src/metabase/css/login.css @@ -4,6 +4,10 @@ margin: 0 auto; } +.Login-hide { + visibility: hidden !important; +} + /* the login content should always sit on top of the illustration */ .Login-content { position: relative; diff --git a/frontend/src/metabase/css/pulse.css b/frontend/src/metabase/css/pulse.css index d258aebab509..cae19d03faf9 100644 --- a/frontend/src/metabase/css/pulse.css +++ b/frontend/src/metabase/css/pulse.css @@ -38,7 +38,7 @@ } .PulseListItem button { - font-family: "Lato", Helvetica, sans-serif; + font-family: "Roboto", Helvetica, sans-serif; } .PulseEditButton { diff --git a/frontend/src/metabase/css/query_builder.css b/frontend/src/metabase/css/query_builder.css index 0d3a97a1fa9d..c86c7afe6f56 100644 --- a/frontend/src/metabase/css/query_builder.css +++ b/frontend/src/metabase/css/query_builder.css @@ -285,7 +285,6 @@ } .QueryError-adminEmail:before { - content: "Admin Email"; font-size: 10px; text-align: center; text-transform: uppercase; diff --git a/frontend/src/metabase/hoc/Title.jsx b/frontend/src/metabase/hoc/Title.jsx index 2364182a0efb..7b425cdef1e3 100644 --- a/frontend/src/metabase/hoc/Title.jsx +++ b/frontend/src/metabase/hoc/Title.jsx @@ -6,7 +6,7 @@ const componentStack = []; let SEPARATOR = " · "; let HIERARCHICAL = true; -let BASE_NAME = null; +let BASE_NAME = "BI Reporting"; export const setSeparator = separator => (SEPARATOR = separator); export const setHierarchical = hierarchical => (HIERARCHICAL = hierarchical); @@ -25,7 +25,7 @@ const updateDocumentTitle = _.debounce(() => { let title = componentStack[i]._documentTitle; if (title) { if (BASE_NAME) { - title += SEPARATOR + BASE_NAME; + title += SEPARATOR + "BI Reporting"; } if (document.title !== title) { document.title = title; diff --git a/frontend/src/metabase/home/components/Activity.jsx b/frontend/src/metabase/home/components/Activity.jsx index b86041aee782..317842d37e7d 100644 --- a/frontend/src/metabase/home/components/Activity.jsx +++ b/frontend/src/metabase/home/components/Activity.jsx @@ -81,7 +81,7 @@ export default class Activity extends Component { } else if (user) { return user.first_name; } else { - return "Metabase"; + return "BI Reporting"; } } @@ -249,7 +249,7 @@ export default class Activity extends Component { break; case "install": description.userName = t`Hello World!`; - description.summary = t`Metabase is up and running.`; + description.summary = t`BI Reporting is up and running.`; break; case "metric-create": if (item.model_exists) { diff --git a/frontend/src/metabase/home/containers/SearchApp.jsx b/frontend/src/metabase/home/containers/SearchApp.jsx index b32a2f33ec96..df6fa1a485cf 100644 --- a/frontend/src/metabase/home/containers/SearchApp.jsx +++ b/frontend/src/metabase/home/containers/SearchApp.jsx @@ -48,7 +48,7 @@ export default class SearchApp extends React.Component { } diff --git a/frontend/src/metabase/lib/ace/theme-metabase.js b/frontend/src/metabase/lib/ace/theme-metabase.js index d54a51d97116..e45e6d9921ab 100644 --- a/frontend/src/metabase/lib/ace/theme-metabase.js +++ b/frontend/src/metabase/lib/ace/theme-metabase.js @@ -11,7 +11,7 @@ ace.define( '\ .ace-metabase .ace_gutter {\ background: rgb(220,236,249);\ -color: #509EE3;\ +color: #1976d2;\ font-weight: bold;\ }\ .ace-metabase {\ diff --git a/frontend/src/metabase/lib/analytics.js b/frontend/src/metabase/lib/analytics.js index b22e245fd4bc..99762235ed25 100644 --- a/frontend/src/metabase/lib/analytics.js +++ b/frontend/src/metabase/lib/analytics.js @@ -9,17 +9,6 @@ import { DEBUG } from "metabase/lib/debug"; const MetabaseAnalytics = { // track a pageview (a.k.a. route change) trackPageView: function(url: string) { - if (url) { - // scrub query builder urls to remove serialized json queries from path - url = url.lastIndexOf("/q/", 0) === 0 ? "/q/" : url; - - const { tag } = MetabaseSettings.get("version"); - - // $FlowFixMe - ga("set", "dimension1", tag); - ga("set", "page", url); - ga("send", "pageview", url); - } }, // track an event @@ -29,41 +18,12 @@ const MetabaseAnalytics = { label?: ?(string | number | boolean), value?: ?number, ) { - const { tag } = MetabaseSettings.get("version"); - // category & action are required, rest are optional - if (category && action) { - // $FlowFixMe - ga("set", "dimension1", tag); - ga("send", "event", category, action, label, value); - } - if (DEBUG) { - console.log("trackEvent", { category, action, label, value }); - } }, }; export default MetabaseAnalytics; export function registerAnalyticsClickListener() { - // $FlowFixMe - document.body.addEventListener( - "click", - function(e) { - let node = e.target; - // check the target and all parent elements - while (node) { - if (node.dataset && node.dataset.metabaseEvent) { - // we expect our event to be a semicolon delimited string - const parts = node.dataset.metabaseEvent - .split(";") - .map(p => p.trim()); - MetabaseAnalytics.trackEvent(...parts); - } - node = node.parentNode; - } - }, - true, - ); } diff --git a/frontend/src/metabase/lib/colors.js b/frontend/src/metabase/lib/colors.js index aa359fa06844..68370d60d9e7 100644 --- a/frontend/src/metabase/lib/colors.js +++ b/frontend/src/metabase/lib/colors.js @@ -14,7 +14,7 @@ export type ColorFamily = { [name: ColorName]: ColorString }; // NOTE: KEEP SYNCRONIZED WITH COLORS.CSS /* eslint-disable no-color-literals */ const colors = { - brand: "#509EE3", + brand: "#1976d2", accent1: "#9CC177", accent2: "#A989C5", accent3: "#EF8C8C", @@ -35,7 +35,7 @@ const colors = { "bg-black": "#2E353B", "bg-dark": "#93A1AB", "bg-medium": "#EDF2F5", - "bg-light": "#F9FBFC", + "bg-light": "#FDFDFD", "bg-white": "#FFFFFF", shadow: "rgba(0,0,0,0.08)", border: "#D7DBDE", diff --git a/frontend/src/metabase/lib/core.js b/frontend/src/metabase/lib/core.js index 945607ea6c25..4ad7283eabce 100644 --- a/frontend/src/metabase/lib/core.js +++ b/frontend/src/metabase/lib/core.js @@ -257,6 +257,6 @@ export const field_visibility_types = [ { id: "sensitive", name: t`Do Not Include`, - description: t`Metabase will never retrieve this field. Use this for sensitive or irrelevant information.`, + description: t`BI Reporting will never retrieve this field. Use this for sensitive or irrelevant information.`, }, ]; diff --git a/frontend/src/metabase/lib/greeting.js b/frontend/src/metabase/lib/greeting.js index 966cfb3427fa..5611366e0941 100644 --- a/frontend/src/metabase/lib/greeting.js +++ b/frontend/src/metabase/lib/greeting.js @@ -20,7 +20,7 @@ const Greeting = { const randomIndex = Math.floor( Math.random() * (greetingPrefixes.length - 1), ); - return greetingPrefixes[randomIndex]; + return ''; }, sayHello: function(personalization) { diff --git a/frontend/src/metabase/nav/components/ProfileLink.jsx b/frontend/src/metabase/nav/components/ProfileLink.jsx index 40e29bff3bea..ed449b106d0f 100644 --- a/frontend/src/metabase/nav/components/ProfileLink.jsx +++ b/frontend/src/metabase/nav/components/ProfileLink.jsx @@ -39,12 +39,14 @@ export default class ProfileLink extends Component { const admin = this.props.user.is_superuser; const adminContext = this.props.context === "admin"; return [ - { - title: t`Account settings`, - icon: null, - link: Urls.accountSettings(), - event: `Navbar;Profile Dropdown;Edit Profile`, - }, + ...(admin && [ + { + title: t`Account settings`, + icon: null, + link: Urls.accountSettings(), + event: `Navbar;Profile Dropdown;Edit Profile`, + }, + ]), ...(admin && [ { title: adminContext ? t`Exit admin` : t`Admin`, @@ -68,22 +70,18 @@ export default class ProfileLink extends Component { icon: null, // HACK - for some reason if you use // react router treats the link // as a non local route - link: `//metabase.com/docs/${tag}`, + link: `//helpguide.simprogroup.com/Content/Service-and-Enterprise/Report-builder.htm`, externalLink: true, event: `Navbar;Profile Dropdown;About ${tag}`, }, - { - title: t`About Metabase`, - icon: null, - action: () => this.openModal("about"), - event: `Navbar;Profile Dropdown;About ${tag}`, - }, - { - title: t`Sign out`, - icon: null, - link: "auth/logout", - event: `Navbar;Profile Dropdown;Logout`, - }, + ...(admin && [ + { + title: t`Sign out`, + icon: null, + link: "auth/logout", + event: `Navbar;Profile Dropdown;Logout`, + }, + ]), ]; }; @@ -104,7 +102,7 @@ export default class ProfileLink extends Component {

    - {t`Thanks for using`} Metabase! + {t`Thanks for using`} BI Reporting!

    @@ -124,16 +122,6 @@ export default class ProfileLink extends Component { )}

    -
    - - Metabase{" "} - {t`is a Trademark of`} Metabase, Inc - - {t`and is built with care in San Francisco, CA`} -
    ) : modalOpen === "logs" ? ( diff --git a/frontend/src/metabase/nav/containers/Navbar.jsx b/frontend/src/metabase/nav/containers/Navbar.jsx index fa618569dabe..80b32364863a 100644 --- a/frontend/src/metabase/nav/containers/Navbar.jsx +++ b/frontend/src/metabase/nav/containers/Navbar.jsx @@ -29,11 +29,13 @@ import ProfileLink from "metabase/nav/components/ProfileLink.jsx"; import { getPath, getContext, getUser } from "../selectors"; import { entityListLoader } from "metabase/entities/containers/EntityListLoader"; +import {getMetadata} from "metabase/selectors/metadata"; const mapStateToProps = (state, props) => ({ path: getPath(state, props), context: getContext(state, props), user: getUser(state), + metadata: getMetadata(state) }); const mapDispatchToProps = { @@ -41,33 +43,34 @@ const mapDispatchToProps = { }; const AdminNavItem = ({ name, path, currentPath }) => ( -
  2. - - {name} - -
  3. +
  4. + + {name} + +
  5. ); const DefaultSearchColor = color(colors.brand) - .lighten(0.07) - .string(); + .lighten(0.07) + .string(); const ActiveSearchColor = color(colors.brand) - .lighten(0.1) - .string(); + .lighten(0.1) + .string(); const SearchWrapper = Flex.extend` ${width} background-color: ${props => - props.active ? ActiveSearchColor : DefaultSearchColor}; + props.active ? ActiveSearchColor : DefaultSearchColor}; border-radius: 6px; align-items: center; color: white; transition: background 300ms ease-in; + margin-left: 20px; &:hover { background-color: ${ActiveSearchColor}; } @@ -113,34 +116,34 @@ class SearchBar extends React.Component { render() { const { active, searchText } = this.state; return ( - this.setState({ active: false })} - > - this.setState({ active: true })} - active={active} + this.setState({ active: false })} > - - this.setState({ active: true })} - onChange={e => this.setState({ searchText: e.target.value })} - onKeyPress={e => { - if (e.key === "Enter" && (searchText || "").trim().length > 0) { - this.props.onChangeLocation({ - pathname: "search", - query: { q: searchText }, - }); - } - }} - /> - - + this.setState({ active: true })} + active={active} + > + + this.setState({ active: true })} + onChange={e => this.setState({ searchText: e.target.value })} + onKeyPress={e => { + if (e.key === "Enter" && (searchText || "").trim().length > 0) { + this.props.onChangeLocation({ + pathname: "search", + query: { q: searchText }, + }); + } + }} + /> + + ); } } @@ -186,160 +189,149 @@ export default class Navbar extends Component { renderAdminNav() { return ( - // NOTE: DO NOT REMOVE `Nav` CLASS FOR NOW, USED BY MODALS, FULLSCREEN DASHBOARD, ETC - // TODO: hide nav using state in redux instead? - ); } renderEmptyNav() { return ( - // NOTE: DO NOT REMOVE `Nav` CLASS FOR NOW, USED BY MODALS, FULLSCREEN DASHBOARD, ETC - // TODO: hide nav using state in redux instead? - + // NOTE: DO NOT REMOVE `Nav` CLASS FOR NOW, USED BY MODALS, FULLSCREEN DASHBOARD, ETC + // TODO: hide nav using state in redux instead? + ); } renderMainNav() { const hasDataAccess = - this.props.databases && this.props.databases.length > 0; + this.props.databases && this.props.databases.length > 0; + const hasSQLPermission = db => db.native_permissions === "write"; + const showSQLOption = this.props.databases && + this.props.databases.filter(hasSQLPermission).length > 0; + const itemsNav = [ + { + title: t`New dashboard`, + icon: `dashboard`, + action: () => this.setModal(MODAL_NEW_DASHBOARD), + event: `NavBar;New Dashboard Click;`, + }]; + if (showSQLOption) { + itemsNav.push({ + title: t`New pulse`, + icon: `pulse`, + link: Urls.newPulse(), + event: `NavBar;New Pulse Click;`, + }); + } return ( - - - - - - + + + + + + + + + {hasDataAccess && ( + + + + )} + - - - - {hasDataAccess && ( - - - - )} - this.setModal(MODAL_NEW_DASHBOARD), - event: `NavBar;New Dashboard Click;`, - }, - { - title: t`New pulse`, - icon: `pulse`, - link: Urls.newPulse(), - event: `NavBar;New Pulse Click;`, - }, - ]} - /> - {hasDataAccess && ( - - - - - - - - )} - - - - - - - - + + + {this.renderModal()} - {this.renderModal()} -
    ); } @@ -347,14 +339,14 @@ export default class Navbar extends Component { const { modal } = this.state; if (modal) { return ( - this.setState({ modal: null })}> - {modal === MODAL_NEW_DASHBOARD ? ( - this.setState({ modal: null })} - /> - ) : null} - + this.setState({ modal: null })}> + {modal === MODAL_NEW_DASHBOARD ? ( + this.setState({ modal: null })} + /> + ) : null} + ); } else { return null; diff --git a/frontend/src/metabase/new_query/containers/MetricSearch.jsx b/frontend/src/metabase/new_query/containers/MetricSearch.jsx index 5b774037089b..b892e77e448d 100644 --- a/frontend/src/metabase/new_query/containers/MetricSearch.jsx +++ b/frontend/src/metabase/new_query/containers/MetricSearch.jsx @@ -111,7 +111,7 @@ const MetricEmptyState = fitViewPort(({ fitClassNames }) => ( title={t`No metrics`} image="app/img/metrics_illustration" action={t`How to create metrics`} - link="http://www.metabase.com/docs/latest/administration-guide/07-segments-and-metrics.html" + link="http://helpguide.simprogroup.com/Content/Service-and-Enterprise/Report-builder.htm" className="mt2" imageClassName="mln2" /> diff --git a/frontend/src/metabase/public/components/LogoBadge.jsx b/frontend/src/metabase/public/components/LogoBadge.jsx index 83eaa83e9455..c403d4bbf565 100644 --- a/frontend/src/metabase/public/components/LogoBadge.jsx +++ b/frontend/src/metabase/public/components/LogoBadge.jsx @@ -19,7 +19,7 @@ const LogoBadge = ({ dark }: Props) => ( Powered by{" "} - Metabase + BI Reporting diff --git a/frontend/src/metabase/public/components/widgets/SharingPane.jsx b/frontend/src/metabase/public/components/widgets/SharingPane.jsx index a588b9a312af..a048af742bf3 100644 --- a/frontend/src/metabase/public/components/widgets/SharingPane.jsx +++ b/frontend/src/metabase/public/components/widgets/SharingPane.jsx @@ -115,7 +115,7 @@ export default class SharingPane extends Component {

    {t`Public link`}

    -
    {t`Share this ${resourceType} with people who don't have a Metabase account using the URL below:`}
    +
    {t`Share this ${resourceType} with people who don't have a BI Reporting account using the URL below:`}
    {extensions && extensions.length > 0 && ( diff --git a/frontend/src/metabase/pulse/components/PulseCardPreview.jsx b/frontend/src/metabase/pulse/components/PulseCardPreview.jsx index 2b2c34987626..d1a5b28ac821 100644 --- a/frontend/src/metabase/pulse/components/PulseCardPreview.jsx +++ b/frontend/src/metabase/pulse/components/PulseCardPreview.jsx @@ -151,7 +151,7 @@ const RenderedPulseCardPreview = ({ href, children }) => ( ( [c, i]) - .filter(([c, i]) => c.enabled && c.channel_type === channelSpec.type) + .filter(([c, i]) => c.enabled && c.channel_type === channelSpec.type && c.channel_type !== 'slack') .map(([channel, index]) => this.renderChannel(channel, index, channelSpec), ); - return ( -
  6. -
    - {CHANNEL_ICONS[channelSpec.type] && ( - - )} -

    {channelSpec.name}

    - 0} - onChange={this.toggleChannel.bind(this, channelSpec.type)} - /> -
    - {channels.length > 0 && channelSpec.configured ? ( -
      {channels}
    - ) : channels.length > 0 && !channelSpec.configured ? ( -
    -

    {t`${ - channelSpec.name - } needs to be set up by an administrator.`}

    - -
    - ) : null} -
  7. - ); + if (channelSpec.type === 'email') { + return ( +
  8. +
    + {CHANNEL_ICONS[channelSpec.type] && ( + + )} +

    {channelSpec.name}

    + 0} + onChange={this.toggleChannel.bind(this, channelSpec.type)} + /> +
    + {channels.length > 0 && channelSpec.configured ? ( +
      {channels}
    + ) : channels.length > 0 && !channelSpec.configured ? ( +
    +

    {t`${ + channelSpec.name + } needs to be set up by an administrator.`}

    + +
    + ) : null} +
  9. + ); + } } render() { @@ -296,7 +298,6 @@ export default class PulseEditChannels extends Component { // Default to show the default channels until full formInput is loaded let channels = formInput.channels || { email: { name: t`Email`, type: "email" }, - slack: { name: t`Slack`, type: "slack" }, }; return (
      diff --git a/frontend/src/metabase/pulse/components/RecipientPicker.jsx b/frontend/src/metabase/pulse/components/RecipientPicker.jsx index e881c477ea06..9567d506f90c 100644 --- a/frontend/src/metabase/pulse/components/RecipientPicker.jsx +++ b/frontend/src/metabase/pulse/components/RecipientPicker.jsx @@ -55,9 +55,7 @@ export default class RecipientPicker extends Component { ({ label: user.common_name, value: user })) - : [] + [] } onChange={this.handleOnChange} placeholder={ @@ -76,13 +74,6 @@ export default class RecipientPicker extends Component { {option.value.common_name}
    )} - filterOption={(option, filterString) => - // case insensitive search of name or email - ~option.value.common_name - .toLowerCase() - .indexOf(filterString.toLowerCase()) || - ~option.value.email.toLowerCase().indexOf(filterString.toLowerCase()) - } parseFreeformValue={inputValue => { if (VALID_EMAIL_REGEX.test(inputValue)) { return { email: inputValue }; diff --git a/frontend/src/metabase/pulse/components/WhatsAPulse.jsx b/frontend/src/metabase/pulse/components/WhatsAPulse.jsx index c57b3844c9ab..32f0ab2f6f9c 100644 --- a/frontend/src/metabase/pulse/components/WhatsAPulse.jsx +++ b/frontend/src/metabase/pulse/components/WhatsAPulse.jsx @@ -27,7 +27,7 @@ export default class WhatsAPulse extends Component { className="h3 my3 text-centered text-light text-bold" style={{ maxWidth: "500px" }} > - {t`Pulses let you send data from Metabase to email or Slack on the schedule of your choice.`} + {t`Pulses let you send data from BI Reporting to email on the schedule of your choice.`}
    {this.props.button}
diff --git a/frontend/src/metabase/query_builder/components/AlertModals.jsx b/frontend/src/metabase/query_builder/components/AlertModals.jsx index 19648d5b0e58..ea51e7c2f5a7 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals.jsx @@ -159,7 +159,7 @@ export class CreateAlertModalContent extends Component { user={user} onClose={onCancel} entityNamePlural={t`alerts`} - channels={isAdmin ? ["email", "Slack"] : ["email"]} + channels={isAdmin ? ["email"] : ["email"]} fullPageModal /> ); diff --git a/frontend/src/metabase/query_builder/components/DataSelector.jsx b/frontend/src/metabase/query_builder/components/DataSelector.jsx index 4e0c11ec2538..72b93ae4569d 100644 --- a/frontend/src/metabase/query_builder/components/DataSelector.jsx +++ b/frontend/src/metabase/query_builder/components/DataSelector.jsx @@ -821,7 +821,7 @@ export const TablePicker = ({
{t`Is a question missing?`} {t`Learn more about nested queries`}
diff --git a/frontend/src/metabase/query_builder/components/QueryHeader.jsx b/frontend/src/metabase/query_builder/components/QueryHeader.jsx index de52bccdc84c..9c6644e04a9f 100644 --- a/frontend/src/metabase/query_builder/components/QueryHeader.jsx +++ b/frontend/src/metabase/query_builder/components/QueryHeader.jsx @@ -428,58 +428,6 @@ export default class QueryHeader extends Component { "text-brand": this.props.isShowingDataReference, "text-brand-hover": !this.state.isShowingDataReference, }); - buttonSections.push([ - - - - - , - ]); - - if ( - !isEditing && - card && - question.alertType(visualizationSettings) !== null - ) { - const createAlertItem = { - title: t`Get alerts about this`, - icon: "alert", - action: () => this.setState({ modal: "create-alert" }), - }; - const createAlertAfterSavingQuestionItem = { - title: t`Get alerts about this`, - icon: "alert", - action: () => this.setState({ modal: "save-question-before-alert" }), - }; - - const updateAlertItem = { - title: t`Alerts are on`, - icon: "alert", - content: (toggleMenu, setMenuFreeze) => ( - - ), - }; - - buttonSections.push([ -
- 0 - ? updateAlertItem - : isNew ? createAlertAfterSavingQuestionItem : createAlertItem, - ]} - /> -
, - ]); - } return ( { return ( adminEmail && ( - - {adminEmail} + + helpdesk.simprogroup.com ) @@ -44,7 +44,7 @@ class VisualizationError extends Component { } /> ); @@ -53,7 +53,7 @@ class VisualizationError extends Component { } /> ); diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx index a19cf356bdb3..74b924c4c2ec 100644 --- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx +++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx @@ -145,14 +145,6 @@ const TagEditorHelp = ({ setDatasetQuery, sampleDatasetId }) => { datasetQuery={EXAMPLES.multipleOptional} setDatasetQuery={setQueryWithSampleDatasetId} /> - -

- {t`Read the full documentation`} -

); }; diff --git a/frontend/src/metabase/questions/components/CollectionBadge.jsx b/frontend/src/metabase/questions/components/CollectionBadge.jsx index c8f84a6623bd..672d097a3300 100644 --- a/frontend/src/metabase/questions/components/CollectionBadge.jsx +++ b/frontend/src/metabase/questions/components/CollectionBadge.jsx @@ -25,9 +25,9 @@ class CollectionBadge extends React.Component { > -
+

{object.name} -

+
); diff --git a/frontend/src/metabase/reference/databases/NoDatabasesEmptyState.jsx b/frontend/src/metabase/reference/databases/NoDatabasesEmptyState.jsx index 7579339a7ccb..ef62754ce42f 100644 --- a/frontend/src/metabase/reference/databases/NoDatabasesEmptyState.jsx +++ b/frontend/src/metabase/reference/databases/NoDatabasesEmptyState.jsx @@ -5,7 +5,7 @@ import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState"; const NoDatabasesEmptyState = user => (

- {t`Help new Metabase users find their way around.`} + {t`Help new BI Reporting users find their way around.`}

{t`The Getting Started guide highlights the dashboard, metrics, segments, and tables that matter most, and informs your users of important things they should know before digging into the data.`} diff --git a/frontend/src/metabase/reference/segments/SegmentList.jsx b/frontend/src/metabase/reference/segments/SegmentList.jsx index f70667ef526a..02fb40653c53 100644 --- a/frontend/src/metabase/reference/segments/SegmentList.jsx +++ b/frontend/src/metabase/reference/segments/SegmentList.jsx @@ -26,7 +26,7 @@ const emptyStateData = { image: "app/assets/img/segments-list", adminAction: t`Learn how to create segments`, adminLink: - "http://www.metabase.com/docs/latest/administration-guide/07-segments-and-metrics.html", + "http://helpguide.simprogroup.com/Content/Service-and-Enterprise/Report-builder.htm", }; const mapStateToProps = (state, props) => ({ diff --git a/frontend/src/metabase/routes.jsx b/frontend/src/metabase/routes.jsx index 943d0c0db178..d3d70c6a5b25 100644 --- a/frontend/src/metabase/routes.jsx +++ b/frontend/src/metabase/routes.jsx @@ -151,7 +151,7 @@ const IsNotAuthenticated = MetabaseIsSetup( ); export const getRoutes = store => ( - + {/* SETUP */} )} diff --git a/frontend/src/metabase/tutorial/QueryBuilderTutorial.jsx b/frontend/src/metabase/tutorial/QueryBuilderTutorial.jsx index d89ddaea58ab..cedba7cae8a9 100644 --- a/frontend/src/metabase/tutorial/QueryBuilderTutorial.jsx +++ b/frontend/src/metabase/tutorial/QueryBuilderTutorial.jsx @@ -219,7 +219,7 @@ const QUERY_BUILDER_STEPS = [ {t`User's Guide`}. {t`Have fun exploring your data!`}

diff --git a/frontend/src/metabase/visualizations/components/LineAreaBarChart.css b/frontend/src/metabase/visualizations/components/LineAreaBarChart.css index 565ac9af0c68..3cb4a9f5b20f 100644 --- a/frontend/src/metabase/visualizations/components/LineAreaBarChart.css +++ b/frontend/src/metabase/visualizations/components/LineAreaBarChart.css @@ -17,7 +17,7 @@ .LineAreaBarChart .dc-chart .axis text { font-size: 12px; - font-family: "Lato", sans-serif; + font-family: "Roboto", sans-serif; font-weight: 900; } diff --git a/frontend/src/metabase/visualizations/components/TableInteractive.jsx b/frontend/src/metabase/visualizations/components/TableInteractive.jsx index 4b0aef0f2afd..053bc651e6e5 100644 --- a/frontend/src/metabase/visualizations/components/TableInteractive.jsx +++ b/frontend/src/metabase/visualizations/components/TableInteractive.jsx @@ -648,7 +648,7 @@ export default class TableInteractive extends Component { position: "absolute", overflow: "hidden", }} - className="TableInteractive-header scroll-hide-all" + className="TableInteractive-header scroll-hide-all overflow-hidden" width={width || 0} height={HEADER_HEIGHT} rowCount={1} diff --git a/resources/frontend_client/favicon.ico b/resources/frontend_client/favicon.ico index 4c9bf6b68804..23e254f7974c 100644 Binary files a/resources/frontend_client/favicon.ico and b/resources/frontend_client/favicon.ico differ diff --git a/resources/frontend_client/index_template.html b/resources/frontend_client/index_template.html index a84923167818..dc10fc16258d 100644 --- a/resources/frontend_client/index_template.html +++ b/resources/frontend_client/index_template.html @@ -9,10 +9,42 @@ {{{embed_code}}} - Metabase + BI Reporting + + + - - diff --git a/resources/frontend_client/init.html b/resources/frontend_client/init.html index 5526fb2fd2af..bdf39e7ba617 100644 --- a/resources/frontend_client/init.html +++ b/resources/frontend_client/init.html @@ -2,7 +2,7 @@ - Metabase + BI Reporting