diff --git a/_docs/master/configuring-metabase/images/AccountSetup.png b/_docs/master/configuring-metabase/images/AccountSetup.png
index e19016a0b9..d3bf7c1ba2 100644
Binary files a/_docs/master/configuring-metabase/images/AccountSetup.png and b/_docs/master/configuring-metabase/images/AccountSetup.png differ
diff --git a/_docs/master/configuring-metabase/images/table-view.png b/_docs/master/configuring-metabase/images/table-view.png
index b561a8dc44..7b253a5ff6 100644
Binary files a/_docs/master/configuring-metabase/images/table-view.png and b/_docs/master/configuring-metabase/images/table-view.png differ
diff --git a/_docs/master/dashboards/images/add-filter.png b/_docs/master/dashboards/images/add-filter.png
index 7206824958..23fae3c80c 100644
Binary files a/_docs/master/dashboards/images/add-filter.png and b/_docs/master/dashboards/images/add-filter.png differ
diff --git a/_docs/master/dashboards/images/add_series.png b/_docs/master/dashboards/images/add_series.png
index 23fae3c80c..fe91f2db8b 100644
Binary files a/_docs/master/dashboards/images/add_series.png and b/_docs/master/dashboards/images/add_series.png differ
diff --git a/_docs/master/dashboards/images/autorefresh.png b/_docs/master/dashboards/images/autorefresh.png
index a1c1f9a61a..94609cbf0d 100644
Binary files a/_docs/master/dashboards/images/autorefresh.png and b/_docs/master/dashboards/images/autorefresh.png differ
diff --git a/_docs/master/dashboards/images/button-form.png b/_docs/master/dashboards/images/button-form.png
index ee763c576e..3d205c8796 100644
Binary files a/_docs/master/dashboards/images/button-form.png and b/_docs/master/dashboards/images/button-form.png differ
diff --git a/_docs/master/dashboards/images/click-behavior-icon.png b/_docs/master/dashboards/images/click-behavior-icon.png
index 2a41076032..8f34234f01 100644
Binary files a/_docs/master/dashboards/images/click-behavior-icon.png and b/_docs/master/dashboards/images/click-behavior-icon.png differ
diff --git a/_docs/master/dashboards/images/dashboard-filter-action.png b/_docs/master/dashboards/images/dashboard-filter-action.png
index 3c1075bed2..3147da6c90 100644
Binary files a/_docs/master/dashboards/images/dashboard-filter-action.png and b/_docs/master/dashboards/images/dashboard-filter-action.png differ
diff --git a/_docs/master/dashboards/images/dashboard.png b/_docs/master/dashboards/images/dashboard.png
index 155d34f84e..1805c738fe 100644
Binary files a/_docs/master/dashboards/images/dashboard.png and b/_docs/master/dashboards/images/dashboard.png differ
diff --git a/_docs/master/dashboards/images/drill-through-menu.png b/_docs/master/dashboards/images/drill-through-menu.png
index cc2c707278..9d2e0c76a7 100644
Binary files a/_docs/master/dashboards/images/drill-through-menu.png and b/_docs/master/dashboards/images/drill-through-menu.png differ
diff --git a/_docs/master/dashboards/images/filters.png b/_docs/master/dashboards/images/filters.png
index c95f02b4aa..2a41076032 100644
Binary files a/_docs/master/dashboards/images/filters.png and b/_docs/master/dashboards/images/filters.png differ
diff --git a/_docs/master/dashboards/images/foreign-key-linked-filters.png b/_docs/master/dashboards/images/foreign-key-linked-filters.png
index b060334122..4a4a249b2b 100644
Binary files a/_docs/master/dashboards/images/foreign-key-linked-filters.png and b/_docs/master/dashboards/images/foreign-key-linked-filters.png differ
diff --git a/_docs/master/dashboards/images/linked-filter.png b/_docs/master/dashboards/images/linked-filter.png
index 4fcbddf7a4..c359f99030 100644
Binary files a/_docs/master/dashboards/images/linked-filter.png and b/_docs/master/dashboards/images/linked-filter.png differ
diff --git a/_docs/master/dashboards/images/markdown.png b/_docs/master/dashboards/images/markdown.png
index c9c10c5129..ba5b16adda 100644
Binary files a/_docs/master/dashboards/images/markdown.png and b/_docs/master/dashboards/images/markdown.png differ
diff --git a/_docs/master/dashboards/images/wiring-up-filter.png b/_docs/master/dashboards/images/wiring-up-filter.png
index a5066926cc..e9e9e50b5d 100644
Binary files a/_docs/master/dashboards/images/wiring-up-filter.png and b/_docs/master/dashboards/images/wiring-up-filter.png differ
diff --git a/_docs/master/data-modeling/images/formula.png b/_docs/master/data-modeling/images/formula.png
index 8e020111ca..0f02f4868c 100644
Binary files a/_docs/master/data-modeling/images/formula.png and b/_docs/master/data-modeling/images/formula.png differ
diff --git a/_docs/master/data-modeling/images/table-metadata.png b/_docs/master/data-modeling/images/table-metadata.png
index d16aabea01..73d3c7c159 100644
Binary files a/_docs/master/data-modeling/images/table-metadata.png and b/_docs/master/data-modeling/images/table-metadata.png differ
diff --git a/_docs/master/databases/connections/bigquery.md b/_docs/master/databases/connections/bigquery.md
index 6752184795..c99a544a50 100644
--- a/_docs/master/databases/connections/bigquery.md
+++ b/_docs/master/databases/connections/bigquery.md
@@ -168,6 +168,12 @@ If you're having trouble with your BigQuery connection, you can check out this [
There aren't (yet) any model features available for BigQuery.
+## Database routing
+
+Database routing for BigQuery works between BigQuery **projects** with identical schemas.
+
+See [Database routing](../../permissions/database-routing).
+
## Danger zone
See [Danger zone](../danger-zone).
diff --git a/_docs/master/databases/connections/mongodb.md b/_docs/master/databases/connections/mongodb.md
index 17ca9a8664..1948f77c8e 100644
--- a/_docs/master/databases/connections/mongodb.md
+++ b/_docs/master/databases/connections/mongodb.md
@@ -121,7 +121,7 @@ Learn more about [configuring SSL with MongoDB](http://mongodb.github.io/mongo-j
## How Metabase syncs data in MongoDB
-Because MongoDB contains unstructured data, Metabase takes a different approach to syncing your database's metadata. To get a sense of the schema, Metabase will query the first and last 500 documents (most of the calculation is done in MongoDB). This sampling helps Metabase do things like differentiate datetime fields from string fields, and provide people with pre-populated filters. The reason Metabase only scans a sample of the documents is because scanning every document in every collection on every sync would put too much strain on your database. And while the sampling does a pretty good job keeping Metabase up to date, it can also mean that new fields can sometimes fall through the cracks, leading to visualization issues, or even fields failing to appear in your results. For more info, check out our [troubleshooting guide](../../troubleshooting-guide/db-connection).
+Because MongoDB contains unstructured data, Metabase takes a different approach to syncing your database's metadata. To get a sense of the schema, Metabase will query the first and last 500 documents (most of the calculation is done in MongoDB). This sampling helps Metabase do things like differentiate datetime fields from string fields, and provide people with pre-populated filters. Metabase also syncs 1,000 leaf fields (fields at the deepest nesting level) per MongoDB collection. The reason Metabase only scans a sample of the documents is because scanning every document in every collection on every sync would put too much strain on your database. And while the sampling does a pretty good job keeping Metabase up to date, it can also mean that new fields can sometimes fall through the cracks, leading to visualization issues, or even fields failing to appear in your results. For more info, check out our [troubleshooting guide](../../troubleshooting-guide/db-connection).
## General connectivity concerns
diff --git a/_docs/master/databases/images/atlas-connect.png b/_docs/master/databases/images/atlas-connect.png
index cda55015c1..4377047e1f 100644
Binary files a/_docs/master/databases/images/atlas-connect.png and b/_docs/master/databases/images/atlas-connect.png differ
diff --git a/_docs/master/databases/images/connection-string.png b/_docs/master/databases/images/connection-string.png
index edba66aced..ab5411a6fb 100644
Binary files a/_docs/master/databases/images/connection-string.png and b/_docs/master/databases/images/connection-string.png differ
diff --git a/_docs/master/databases/images/snowflake-copy-account-url.png b/_docs/master/databases/images/snowflake-copy-account-url.png
index cf9a18f67a..82457d4e06 100644
Binary files a/_docs/master/databases/images/snowflake-copy-account-url.png and b/_docs/master/databases/images/snowflake-copy-account-url.png differ
diff --git a/_docs/master/developers-guide/community-drivers.md b/_docs/master/developers-guide/community-drivers.md
index 813138954b..2b13b29798 100644
--- a/_docs/master/developers-guide/community-drivers.md
+++ b/_docs/master/developers-guide/community-drivers.md
@@ -37,7 +37,7 @@ Anyone can build a community driver. These are the currently known third-party d
| ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| [CSV](https://github.com/Markenson/csv-metabase-driver) |  |  |
| [Databend](https://github.com/databendcloud/metabase-databend-driver) |  |  |
-| [DB2](https://github.com/damienchambe/metabase-db2-driver) |  |  |
+| [DB2](https://github.com/damienchambe/metabase-db2-driver) |  |  |
| [Dremio](https://github.com/Baoqi/metabase-dremio-driver) |  |  |
| [DuckDB](https://github.com/MotherDuck-Open-Source/metabase_duckdb_driver) |  |  |
| [Firebolt](https://github.com/firebolt-db/metabase-firebolt-driver) |  |  |
diff --git a/_docs/master/developers-guide/devenv.md b/_docs/master/developers-guide/devenv.md
index b5798dc53c..14d6002437 100644
--- a/_docs/master/developers-guide/devenv.md
+++ b/_docs/master/developers-guide/devenv.md
@@ -28,6 +28,8 @@ yarn dev
This runs both the [frontend](#frontend) and [backend](#backend). Alternatively, you can run them separately in two terminal sessions below.
+To use any other database beside the default ones please take a look at [Building Drivers](#building-drivers) further down in this document.
+
### Frontend
Metabase depends on third-party libraries to run, so you'll need to keep those up to date. The Clojure CLI will automatically fetch the dependencies when needed. With JavaScript dependencies, however, you'll need to kick off the installation process manually.
diff --git a/_docs/master/developers-guide/driver-changelog.md b/_docs/master/developers-guide/driver-changelog.md
index c33e2b3045..6d2e7f459a 100644
--- a/_docs/master/developers-guide/driver-changelog.md
+++ b/_docs/master/developers-guide/driver-changelog.md
@@ -27,6 +27,9 @@ layout: new-docs
replace existing keys like `:alias`, `:join-alias`, or `:name`; make sure you use `driver-api/qp.add.alias`,
`driver-api/qp.add.source-table`, and `driver-api/qp.add.source-alias` respectively.
+- Added the driver multi-method `driver/extra-info` for drivers to provide info such as db routing configuration details
+ from their `metabase-plugin.yaml` file.
+
- Extend `datetime()` to accept UTF-8 encoded binary and numbers (unix timestamps) in addition to strings.
- Added a feature `:expressions/today` for drivers that support generating a date for the current day.
@@ -58,7 +61,6 @@ layout: new-docs
`metabase.driver/upload-type->database-type` or `metabase.driver/allowed-promotions` -- make sure you use
`:metabase.upload/varchar-255` rather than something like `::upload/varchar-255`.
-- Added the multi-method `metabase.driver.sql.parameters.substitution/time-grouping->replacement-snippet-info`. This is effectively `->replacement-snippet-info` for the new native query time grouping feature, but is its own separate multimethod because it needs an extra parameter.
- The `metabase.models.secret` namespace has been replaced with `metabase.secrets.core`; if you were using it please
update your usages.
diff --git a/_docs/master/developers-guide/frontend.md b/_docs/master/developers-guide/frontend.md
index 1031ea7210..1e0630eef2 100644
--- a/_docs/master/developers-guide/frontend.md
+++ b/_docs/master/developers-guide/frontend.md
@@ -266,7 +266,7 @@ function getFoo(a, b, c) {
}
```
-- Be conservative with what comments you add to the codebase. Comments shouldn't be used as reminders or as todos--record those by creating a new issue in Github. Ideally, code should be written in such a way that it explains itself clearly. When it does not, you should first try rewriting the code. If for whatever reason you are unable to write something clearly, add a comment to explain the "why".
+- Be conservative with what comments you add to the codebase. Comments shouldn't be used as reminders or as todos--record those by creating a new issue in GitHub. Ideally, code should be written in such a way that it explains itself clearly. When it does not, you should first try rewriting the code. If for whatever reason you are unable to write something clearly, add a comment to explain the "why".
```javascript
diff --git a/_docs/master/developers-guide/security-token-scanner.md b/_docs/master/developers-guide/security-token-scanner.md
new file mode 100644
index 0000000000..806440e5f1
--- /dev/null
+++ b/_docs/master/developers-guide/security-token-scanner.md
@@ -0,0 +1,55 @@
+---
+version: master
+has_magic_breadcrumbs: true
+show_category_breadcrumb: true
+show_title_breadcrumb: true
+category: 'Developers Guide'
+title: 'Security Token Scanner'
+source_url: 'https://github.com/metabase/metabase/blob/master/docs/developers-guide/security-token-scanner.md'
+layout: new-docs
+---
+
+# Security Token Scanner
+
+Security token scanner detects potentially leaked API keys and secrets in the Metabase codebase. Runs automatically as a git precommit hook on staged files.
+
+## Usage
+
+```bash
+# Scan specific files
+./bin/mage -token-scan deps.edn bb.edn
+
+# Scan all files
+./bin/mage -token-scan -a
+
+# Verbose output
+./bin/mage -token-scan -v deps.edn
+```
+
+## Token Types Detected
+
+- Airgap tokens (`airgap_`)
+- Dev tokens (`mb_dev_`, 64-char hex)
+- OpenAI API keys (`sk-`)
+- JWT/JWE tokens
+- GitHub tokens (`gh[pousr]_`)
+- Slack bot tokens (`xoxb-`)
+- AWS access keys (`AKIA`)
+
+The scanner uses `.gitignore` to filter files and will block commits containing detected tokens.
+
+
+## False positives
+
+If the scanner flags a non-token string, you should **exclude the literal token string** by adding it to: `mage/resources/token_scanner/token_whitelist.txt`.
+
+```
+echo 'my-token-string' >> mage/resources/token_scanner/token_whitelist.txt && git add mage/resources/token_scanner/token_whitelist.txt
+```
+
+
+## Bypassing (not recommended)
+
+```bash
+git commit --no-verify -m "commit message"
+```
diff --git a/_docs/master/developers-guide/versioning.md b/_docs/master/developers-guide/versioning.md
index 655d42cd76..82e02cc6d8 100644
--- a/_docs/master/developers-guide/versioning.md
+++ b/_docs/master/developers-guide/versioning.md
@@ -68,5 +68,5 @@ E.g.,
## Further reading
-- [Metabase releases on Github](https://github.com/metabase/metabase/releases)
+- [Metabase releases on GitHub](https://github.com/metabase/metabase/releases)
- [Metabase release blog posts](/releases)
diff --git a/_docs/master/embedding/images/create-a-public-link.png b/_docs/master/embedding/images/create-a-public-link.png
index da4c9844b4..a37656aa28 100644
Binary files a/_docs/master/embedding/images/create-a-public-link.png and b/_docs/master/embedding/images/create-a-public-link.png differ
diff --git a/_docs/master/embedding/images/dashboard-sharing.png b/_docs/master/embedding/images/dashboard-sharing.png
index d4033342d1..58e904072b 100644
Binary files a/_docs/master/embedding/images/dashboard-sharing.png and b/_docs/master/embedding/images/dashboard-sharing.png differ
diff --git a/_docs/master/embedding/images/full-data-picker.png b/_docs/master/embedding/images/full-data-picker.png
index 31aa99c04c..012e37c3e9 100644
Binary files a/_docs/master/embedding/images/full-data-picker.png and b/_docs/master/embedding/images/full-data-picker.png differ
diff --git a/_docs/master/embedding/images/interactive-question-sample-app.png b/_docs/master/embedding/images/interactive-question-sample-app.png
index 82b59fed3a..306f2d33ca 100644
Binary files a/_docs/master/embedding/images/interactive-question-sample-app.png and b/_docs/master/embedding/images/interactive-question-sample-app.png differ
diff --git a/_docs/master/embedding/images/interactive-question.png b/_docs/master/embedding/images/interactive-question.png
index 2789fb4304..da4c9844b4 100644
Binary files a/_docs/master/embedding/images/interactive-question.png and b/_docs/master/embedding/images/interactive-question.png differ
diff --git a/_docs/master/embedding/images/jwt-setup.png b/_docs/master/embedding/images/jwt-setup.png
index 0c639d1032..005a76fc45 100644
Binary files a/_docs/master/embedding/images/jwt-setup.png and b/_docs/master/embedding/images/jwt-setup.png differ
diff --git a/_docs/master/embedding/images/powered-by-metabase.png b/_docs/master/embedding/images/powered-by-metabase.png
index 32282cca33..2daa70728b 100644
Binary files a/_docs/master/embedding/images/powered-by-metabase.png and b/_docs/master/embedding/images/powered-by-metabase.png differ
diff --git a/_docs/master/embedding/images/public-embed.png b/_docs/master/embedding/images/public-embed.png
index 31aa99c04c..1bad0d4e3c 100644
Binary files a/_docs/master/embedding/images/public-embed.png and b/_docs/master/embedding/images/public-embed.png differ
diff --git a/_docs/master/embedding/images/public-link-custom-destination.png b/_docs/master/embedding/images/public-link-custom-destination.png
index 7e4d253fc1..73f3cb9799 100644
Binary files a/_docs/master/embedding/images/public-link-custom-destination.png and b/_docs/master/embedding/images/public-link-custom-destination.png differ
diff --git a/_docs/master/embedding/images/see-shared-content.png b/_docs/master/embedding/images/see-shared-content.png
index 4039f66dd8..1b7630c428 100644
Binary files a/_docs/master/embedding/images/see-shared-content.png and b/_docs/master/embedding/images/see-shared-content.png differ
diff --git a/_docs/master/embedding/sdk/api/BaseInteractiveQuestionProps.html b/_docs/master/embedding/sdk/api/BaseInteractiveQuestionProps.html
index 7effd3582a..70e4b609e9 100644
--- a/_docs/master/embedding/sdk/api/BaseInteractiveQuestionProps.html
+++ b/_docs/master/embedding/sdk/api/BaseInteractiveQuestionProps.html
@@ -9,7 +9,7 @@
layout: docs-api
---
-
BaseInteractiveQuestionProps | Embedded analytics SDK API{% include docs/embedded-analytics-sdk-metadata.html %}
The ID of the question.
This is either:
diff --git a/_docs/master/embedding/sdk/api/CreateQuestion.html b/_docs/master/embedding/sdk/api/CreateQuestion.html
index 74327bd7e7..dd1d9a4f9b 100644
--- a/_docs/master/embedding/sdk/api/CreateQuestion.html
+++ b/_docs/master/embedding/sdk/api/CreateQuestion.html
@@ -14,7 +14,7 @@
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
A dashboard component with the features available in the InteractiveDashboard component, as well as the ability to add and update questions, layout, and content within your dashboard.
A dashboard component with the features available in the InteractiveDashboard component, as well as the ability to add and update questions, layout, and content within your dashboard.
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
@@ -75,4 +77,4 @@
OptionalwithCardTitle
withCardTitle?:boolean
Whether the dashboard cards should display a title.
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
@@ -75,4 +77,4 @@
OptionalwithCardTitle
withCardTitle?:boolean
Whether the dashboard cards should display a title.
The ID of the question.
This is either:
diff --git a/_docs/master/embedding/sdk/api/InteractiveQuestionProps.html b/_docs/master/embedding/sdk/api/InteractiveQuestionProps.html
index f95a95d61b..ab3d118292 100644
--- a/_docs/master/embedding/sdk/api/InteractiveQuestionProps.html
+++ b/_docs/master/embedding/sdk/api/InteractiveQuestionProps.html
@@ -9,7 +9,7 @@
layout: docs-api
---
-
InteractiveQuestionProps | Embedded analytics SDK API{% include docs/embedded-analytics-sdk-metadata.html %}
The ID of the question.
This is either:
diff --git a/_docs/master/embedding/sdk/api/StaticDashboard.html b/_docs/master/embedding/sdk/api/StaticDashboard.html
index b2934e2415..137b9f13ef 100644
--- a/_docs/master/embedding/sdk/api/StaticDashboard.html
+++ b/_docs/master/embedding/sdk/api/StaticDashboard.html
@@ -9,8 +9,8 @@
layout: docs-api
---
-
StaticDashboard | Embedded analytics SDK API{% include docs/embedded-analytics-sdk-metadata.html %}
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
@@ -75,4 +77,4 @@
OptionalwithCardTitle
withCardTitle?:boolean
Whether the dashboard cards should display a title.
diff --git a/_docs/master/embedding/sdk/api/assets/search.js b/_docs/master/embedding/sdk/api/assets/search.js
index 5649aeca11..a91212dd5e 100644
--- a/_docs/master/embedding/sdk/api/assets/search.js
+++ b/_docs/master/embedding/sdk/api/assets/search.js
@@ -1 +1 @@
-window.searchData = "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";
\ No newline at end of file
+window.searchData = "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";
\ No newline at end of file
diff --git a/_docs/master/embedding/sdk/api/snippets/BaseInteractiveQuestionProps.md b/_docs/master/embedding/sdk/api/snippets/BaseInteractiveQuestionProps.md
index d03dbf391e..c3205ce9c4 100644
--- a/_docs/master/embedding/sdk/api/snippets/BaseInteractiveQuestionProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/BaseInteractiveQuestionProps.md
@@ -23,7 +23,7 @@ layout: new-docs
| `isSaveEnabled?` | `boolean` | Whether to show the save button. |
| `onBeforeSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => [`Promise`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)\<`void`\> | A callback function that triggers before saving. Only relevant when `isSaveEnabled = true` |
| `onRun?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion)) => `void` | A callback function that triggers when a question is updated, including when a user clicks the `Visualize` button in the question editor |
-| `onSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
+| `onSave?` | (`question`: [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `dashboardTabId?`: `number`; `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | - |
| `questionId` | `null` \| [`SdkQuestionId`](./api/SdkQuestionId) | The ID of the question. This is either: - The numerical ID when accessing a question link, e.g., `http://localhost:3000/question/1-my-question` where the ID is `1` - The `entity_id` key of the question object. You can find a question's Entity ID in the info panel when viewing a question - `new` to show the notebook editor for creating new questions. `isSaveEnabled` must be `true` to allow saving the question |
| `targetCollection?` | [`SdkCollectionId`](./api/SdkCollectionId) | The collection to save the question to. This will hide the collection picker from the save modal. Only applicable to interactive questions. |
diff --git a/_docs/master/embedding/sdk/api/snippets/CreateQuestionProps.md b/_docs/master/embedding/sdk/api/snippets/CreateQuestionProps.md
index 8f7635b747..a5ea63f17b 100644
--- a/_docs/master/embedding/sdk/api/snippets/CreateQuestionProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/CreateQuestionProps.md
@@ -22,7 +22,7 @@ layout: new-docs
| `isSaveEnabled?` | `boolean` | Whether to show the save button. |
| `onBeforeSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => [`Promise`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)\<`void`\> | A callback function that triggers before saving. Only relevant when `isSaveEnabled = true` |
| `onRun?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion)) => `void` | A callback function that triggers when a question is updated, including when a user clicks the `Visualize` button in the question editor |
-| `onSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
+| `onSave?` | (`question`: [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `dashboardTabId?`: `number`; `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | - |
| `targetCollection?` | [`SdkCollectionId`](./api/SdkCollectionId) | The collection to save the question to. This will hide the collection picker from the save modal. Only applicable to interactive questions. |
| `withDownloads?` | `boolean` | Enables the ability to download results in the interactive question. |
diff --git a/_docs/master/embedding/sdk/api/snippets/DrillThroughQuestionProps.md b/_docs/master/embedding/sdk/api/snippets/DrillThroughQuestionProps.md
index 477f88f90c..722e953a73 100644
--- a/_docs/master/embedding/sdk/api/snippets/DrillThroughQuestionProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/DrillThroughQuestionProps.md
@@ -27,7 +27,7 @@ Props for the drill-through question
| `isSaveEnabled?` | `boolean` | Whether to show the save button. |
| `onBeforeSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => [`Promise`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)\<`void`\> | A callback function that triggers before saving. Only relevant when `isSaveEnabled = true` |
| `onRun?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion)) => `void` | A callback function that triggers when a question is updated, including when a user clicks the `Visualize` button in the question editor |
-| `onSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
+| `onSave?` | (`question`: [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `dashboardTabId?`: `number`; `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | - |
| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
| `targetCollection?` | [`SdkCollectionId`](./api/SdkCollectionId) | The collection to save the question to. This will hide the collection picker from the save modal. Only applicable to interactive questions. |
diff --git a/_docs/master/embedding/sdk/api/snippets/EditableDashboard.md b/_docs/master/embedding/sdk/api/snippets/EditableDashboard.md
index fc427dcb2a..ac04f5dd59 100644
--- a/_docs/master/embedding/sdk/api/snippets/EditableDashboard.md
+++ b/_docs/master/embedding/sdk/api/snippets/EditableDashboard.md
@@ -10,27 +10,7 @@ layout: new-docs
---
```ts
-function EditableDashboard(
- props: {
- drillThroughQuestionHeight?: Height;
- drillThroughQuestionProps?: DrillThroughQuestionProps;
- plugins?: MetabasePluginsConfig;
- renderDrillThroughQuestion?: () => ReactNode;
- } & {
- dashboardId: SdkDashboardId;
- hiddenParameters?: string[];
- initialParameters?: ParameterValues;
- withCardTitle?: boolean;
- withDownloads?: boolean;
- withTitle?: boolean;
- } & {
- className?: string;
- style?: CSSProperties;
- } & {
- onLoad?: (dashboard: null | MetabaseDashboard) => void;
- onLoadWithoutCards?: (dashboard: null | MetabaseDashboard) => void;
- } & {},
-): Element;
+function EditableDashboard(props: EditableDashboardProps): Element;
```
A dashboard component with the features available in the `InteractiveDashboard` component, as well as the ability to add and update questions, layout, and content within your dashboard.
@@ -39,9 +19,9 @@ A dashboard component with the features available in the `InteractiveDashboard`
-| Parameter | Type | Description |
-| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
-| `props` | \{ `drillThroughQuestionHeight?`: `Height`\<`string` \| `number`\>; `drillThroughQuestionProps?`: [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps); `plugins?`: [`MetabasePluginsConfig`](./api/MetabasePluginsConfig); `renderDrillThroughQuestion?`: () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478); \} & \{ `dashboardId`: [`SdkDashboardId`](./api/SdkDashboardId); `hiddenParameters?`: `string`[]; `initialParameters?`: [`ParameterValues`](./api/ParameterValues); `withCardTitle?`: `boolean`; `withDownloads?`: `boolean`; `withTitle?`: `boolean`; \} & \{ `className?`: `string`; `style?`: [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579); \} & \{ `onLoad?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; `onLoadWithoutCards?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; \} & \{ \} | |
+| Parameter | Type | Description |
+| :-------- | :---------------------------------------------------------- | :---------- |
+| `props` | [`EditableDashboardProps`](./api/EditableDashboardProps) | |
diff --git a/_docs/master/embedding/sdk/api/snippets/EditableDashboardProps.md b/_docs/master/embedding/sdk/api/snippets/EditableDashboardProps.md
index 70fad729f1..69186d18d2 100644
--- a/_docs/master/embedding/sdk/api/snippets/EditableDashboardProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/EditableDashboardProps.md
@@ -15,21 +15,22 @@ layout: new-docs
-| Property | Type | Description |
-| :-------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `className?` | `string` | A custom class name to be added to the root element. |
-| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
-| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
-| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
-| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
-| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
-| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
-| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
-| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
-| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
-| `withDownloads?` | `boolean` | Whether to hide the download button. |
-| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
+| Property | Type | Description |
+| :-------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `className?` | `string` | A custom class name to be added to the root element. |
+| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
+| `dataPickerProps?` | [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<[`InteractiveQuestionProps`](./api/InteractiveQuestionProps), `"entityTypes"`\> | Additional props to pass to the query builder rendered by `InteractiveQuestion` when creating a new dashboard question. |
+| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
+| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
+| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
+| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
+| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
+| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
+| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
+| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
+| `withDownloads?` | `boolean` | Whether to hide the download button. |
+| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
diff --git a/_docs/master/embedding/sdk/api/snippets/InteractiveDashboard.md b/_docs/master/embedding/sdk/api/snippets/InteractiveDashboard.md
index 80ee8b4c82..3f026cc008 100644
--- a/_docs/master/embedding/sdk/api/snippets/InteractiveDashboard.md
+++ b/_docs/master/embedding/sdk/api/snippets/InteractiveDashboard.md
@@ -29,6 +29,8 @@ function InteractiveDashboard(
} & {
onLoad?: (dashboard: null | MetabaseDashboard) => void;
onLoadWithoutCards?: (dashboard: null | MetabaseDashboard) => void;
+ } & {
+ dataPickerProps?: Pick;
} & {},
): Element;
```
@@ -39,9 +41,9 @@ A dashboard component with drill downs, click behaviors, and the ability to view
-| Parameter | Type | Description |
-| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
-| `props` | \{ `drillThroughQuestionHeight?`: `Height`\<`string` \| `number`\>; `drillThroughQuestionProps?`: [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps); `plugins?`: [`MetabasePluginsConfig`](./api/MetabasePluginsConfig); `renderDrillThroughQuestion?`: () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478); \} & \{ `dashboardId`: [`SdkDashboardId`](./api/SdkDashboardId); `hiddenParameters?`: `string`[]; `initialParameters?`: [`ParameterValues`](./api/ParameterValues); `withCardTitle?`: `boolean`; `withDownloads?`: `boolean`; `withTitle?`: `boolean`; \} & \{ `className?`: `string`; `style?`: [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579); \} & \{ `onLoad?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; `onLoadWithoutCards?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; \} & \{ \} | |
+| Parameter | Type | Description |
+| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
+| `props` | \{ `drillThroughQuestionHeight?`: `Height`\<`string` \| `number`\>; `drillThroughQuestionProps?`: [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps); `plugins?`: [`MetabasePluginsConfig`](./api/MetabasePluginsConfig); `renderDrillThroughQuestion?`: () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478); \} & \{ `dashboardId`: [`SdkDashboardId`](./api/SdkDashboardId); `hiddenParameters?`: `string`[]; `initialParameters?`: [`ParameterValues`](./api/ParameterValues); `withCardTitle?`: `boolean`; `withDownloads?`: `boolean`; `withTitle?`: `boolean`; \} & \{ `className?`: `string`; `style?`: [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579); \} & \{ `onLoad?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; `onLoadWithoutCards?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; \} & \{ `dataPickerProps?`: [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<[`InteractiveQuestionProps`](./api/InteractiveQuestionProps), `"entityTypes"`\>; \} & \{ \} | |
diff --git a/_docs/master/embedding/sdk/api/snippets/InteractiveDashboardProps.md b/_docs/master/embedding/sdk/api/snippets/InteractiveDashboardProps.md
index 5b34cbca34..f479613fcb 100644
--- a/_docs/master/embedding/sdk/api/snippets/InteractiveDashboardProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/InteractiveDashboardProps.md
@@ -15,21 +15,22 @@ layout: new-docs
-| Property | Type | Description |
-| :-------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `className?` | `string` | A custom class name to be added to the root element. |
-| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
-| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
-| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
-| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
-| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
-| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
-| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
-| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
-| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
-| `withDownloads?` | `boolean` | Whether to hide the download button. |
-| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
+| Property | Type | Description |
+| :-------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `className?` | `string` | A custom class name to be added to the root element. |
+| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
+| `dataPickerProps?` | [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<[`InteractiveQuestionProps`](./api/InteractiveQuestionProps), `"entityTypes"`\> | Additional props to pass to the query builder rendered by `InteractiveQuestion` when creating a new dashboard question. |
+| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
+| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
+| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
+| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
+| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
+| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
+| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
+| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
+| `withDownloads?` | `boolean` | Whether to hide the download button. |
+| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
diff --git a/_docs/master/embedding/sdk/api/snippets/InteractiveQuestionProps.md b/_docs/master/embedding/sdk/api/snippets/InteractiveQuestionProps.md
index 3c2c95efc9..58e17b122f 100644
--- a/_docs/master/embedding/sdk/api/snippets/InteractiveQuestionProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/InteractiveQuestionProps.md
@@ -25,7 +25,7 @@ layout: new-docs
| `isSaveEnabled?` | `boolean` | Whether to show the save button. |
| `onBeforeSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => [`Promise`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)\<`void`\> | A callback function that triggers before saving. Only relevant when `isSaveEnabled = true` |
| `onRun?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion)) => `void` | A callback function that triggers when a question is updated, including when a user clicks the `Visualize` button in the question editor |
-| `onSave?` | (`question`: `undefined` \| [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
+| `onSave?` | (`question`: [`MetabaseQuestion`](./api/MetabaseQuestion), `context`: \{ `dashboardTabId?`: `number`; `isNewQuestion`: `boolean`; \}) => `void` | A callback function that triggers when a user saves the question. Only relevant when `isSaveEnabled = true` |
| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | - |
| `questionId` | `null` \| [`SdkQuestionId`](./api/SdkQuestionId) | The ID of the question. This is either: - The numerical ID when accessing a question link, e.g., `http://localhost:3000/question/1-my-question` where the ID is `1` - The `entity_id` key of the question object. You can find a question's Entity ID in the info panel when viewing a question - `new` to show the notebook editor for creating new questions. `isSaveEnabled` must be `true` to allow saving the question |
| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
diff --git a/_docs/master/embedding/sdk/api/snippets/StaticDashboard.md b/_docs/master/embedding/sdk/api/snippets/StaticDashboard.md
index 69822c2f65..3136fb39f0 100644
--- a/_docs/master/embedding/sdk/api/snippets/StaticDashboard.md
+++ b/_docs/master/embedding/sdk/api/snippets/StaticDashboard.md
@@ -29,6 +29,8 @@ function StaticDashboard(
} & {
onLoad?: (dashboard: null | MetabaseDashboard) => void;
onLoadWithoutCards?: (dashboard: null | MetabaseDashboard) => void;
+ } & {
+ dataPickerProps?: Pick;
} & {},
): Element;
```
@@ -39,9 +41,9 @@ A lightweight dashboard component.
-| Parameter | Type | Description |
-| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
-| `props` | \{ `drillThroughQuestionHeight?`: `Height`\<`string` \| `number`\>; `drillThroughQuestionProps?`: [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps); `plugins?`: [`MetabasePluginsConfig`](./api/MetabasePluginsConfig); `renderDrillThroughQuestion?`: () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478); \} & \{ `dashboardId`: [`SdkDashboardId`](./api/SdkDashboardId); `hiddenParameters?`: `string`[]; `initialParameters?`: [`ParameterValues`](./api/ParameterValues); `withCardTitle?`: `boolean`; `withDownloads?`: `boolean`; `withTitle?`: `boolean`; \} & \{ `className?`: `string`; `style?`: [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579); \} & \{ `onLoad?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; `onLoadWithoutCards?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; \} & \{ \} | |
+| Parameter | Type | Description |
+| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
+| `props` | \{ `drillThroughQuestionHeight?`: `Height`\<`string` \| `number`\>; `drillThroughQuestionProps?`: [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps); `plugins?`: [`MetabasePluginsConfig`](./api/MetabasePluginsConfig); `renderDrillThroughQuestion?`: () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478); \} & \{ `dashboardId`: [`SdkDashboardId`](./api/SdkDashboardId); `hiddenParameters?`: `string`[]; `initialParameters?`: [`ParameterValues`](./api/ParameterValues); `withCardTitle?`: `boolean`; `withDownloads?`: `boolean`; `withTitle?`: `boolean`; \} & \{ `className?`: `string`; `style?`: [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579); \} & \{ `onLoad?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; `onLoadWithoutCards?`: (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void`; \} & \{ `dataPickerProps?`: [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<[`InteractiveQuestionProps`](./api/InteractiveQuestionProps), `"entityTypes"`\>; \} & \{ \} | |
diff --git a/_docs/master/embedding/sdk/api/snippets/StaticDashboardProps.md b/_docs/master/embedding/sdk/api/snippets/StaticDashboardProps.md
index 973d587f57..048fcb36ab 100644
--- a/_docs/master/embedding/sdk/api/snippets/StaticDashboardProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/StaticDashboardProps.md
@@ -15,21 +15,22 @@ layout: new-docs
-| Property | Type | Description |
-| :-------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `className?` | `string` | A custom class name to be added to the root element. |
-| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
-| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
-| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
-| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
-| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
-| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
-| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
-| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
-| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
-| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
-| `withDownloads?` | `boolean` | Whether to hide the download button. |
-| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
+| Property | Type | Description |
+| :-------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `className?` | `string` | A custom class name to be added to the root element. |
+| `dashboardId` | [`SdkDashboardId`](./api/SdkDashboardId) | The ID of the dashboard. This is either: - the numerical ID when accessing a dashboard link, i.e. `http://localhost:3000/dashboard/1-my-dashboard` where the ID is `1` - the string ID found in the `entity_id` key of the dashboard object when using the API directly or using the SDK Collection Browser to return data |
+| `dataPickerProps?` | [`Pick`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys)\<[`InteractiveQuestionProps`](./api/InteractiveQuestionProps), `"entityTypes"`\> | Additional props to pass to the query builder rendered by `InteractiveQuestion` when creating a new dashboard question. |
+| `drillThroughQuestionHeight?` | `Height`\<`string` \| `number`\> | Height of a question component when drilled from the dashboard to a question level. |
+| `drillThroughQuestionProps?` | [`DrillThroughQuestionProps`](./api/DrillThroughQuestionProps) | Props of a question component when drilled from the dashboard to a question level. |
+| `hiddenParameters?` | `string`[] | A list of [parameters to hide](/docs/master/embedding/public-links#appearance-parameters). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `initialParameters?` | [`ParameterValues`](./api/ParameterValues) | Query parameters for the dashboard. For a single option, use a `string` value, and use a list of strings for multiple options. - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to filter data on the frontend is a [security risk](/docs/master/embedding/sdk/authentication#security-warning-each-end-user-must-have-their-own-metabase-account). - Combining [initialParameters](./api/StaticDashboardProps#initialparameters) and [hiddenParameters](./api/StaticDashboardProps#hiddenparameters) to declutter the user interface is fine. |
+| `onLoad?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded. |
+| `onLoadWithoutCards?` | (`dashboard`: `null` \| [`MetabaseDashboard`](./api/MetabaseDashboard)) => `void` | Callback that is called when the dashboard is loaded without cards. |
+| `plugins?` | [`MetabasePluginsConfig`](./api/MetabasePluginsConfig) | Additional mapper function to override or add drill-down menu. See the implementing custom actions section for more details. |
+| `renderDrillThroughQuestion?` | () => [`ReactNode`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L478) | A custom React component to render the question layout. Use namespaced InteractiveQuestion components to build the layout. |
+| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
+| `withCardTitle?` | `boolean` | Whether the dashboard cards should display a title. |
+| `withDownloads?` | `boolean` | Whether to hide the download button. |
+| `withTitle?` | `boolean` | Whether the dashboard should display a title. |
diff --git a/_docs/master/embedding/sdk/api/snippets/StaticQuestionProps.md b/_docs/master/embedding/sdk/api/snippets/StaticQuestionProps.md
index 6ddcd0fcd0..b652cbc226 100644
--- a/_docs/master/embedding/sdk/api/snippets/StaticQuestionProps.md
+++ b/_docs/master/embedding/sdk/api/snippets/StaticQuestionProps.md
@@ -24,5 +24,6 @@ layout: new-docs
| `style?` | [`CSSProperties`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0b728411cd1dfb4bd26992bb35a73cf8edaa22e7/types/react/index.d.ts#L2579) | A custom style object to be added to the root element. |
| `width?` | `Width`\<`string` \| `number`\> | A number or string specifying a CSS size value that specifies the width of the component |
| `withChartTypeSelector?` | `boolean` | - |
+| `withDownloads?` | `boolean` | Enables the ability to download results in the interactive question. |
diff --git a/_docs/master/embedding/sdk/introduction.md b/_docs/master/embedding/sdk/introduction.md
index ebc1382933..ea4912cfde 100644
--- a/_docs/master/embedding/sdk/introduction.md
+++ b/_docs/master/embedding/sdk/introduction.md
@@ -114,7 +114,7 @@ View the SDK's changelog:
## Embedded analytics SDK on NPM
-Check out the Metabase Embedded analytics SDK on NPM: [metaba.se/sdk](https://metaba.se/sdk).
+Check out the Metabase Embedded analytics SDK on NPM: [metaba.se/sdk-npm](https://metaba.se/sdk-npm).
## SDK limitations
@@ -125,7 +125,11 @@ The SDK doesn't support:
- Subscriptions
- Alerts
- Server-side rendering (SSR)
+
+Other limitations:
+
- Multiple _interactive_ dashboards on the same application page. If you need to embed multiple dashboards on the same application page, you can embed static dashboards.
+- If you have Leaflet 1.x as a dependency in your app, you may run into compatibility issues. You can try using Leaflet 2.x instead.
## Issues, feature requests and support
diff --git a/_docs/master/exploration-and-organization/images/DataReference.png b/_docs/master/exploration-and-organization/images/DataReference.png
index 1b91e84ebc..5b8967a7b2 100644
Binary files a/_docs/master/exploration-and-organization/images/DataReference.png and b/_docs/master/exploration-and-organization/images/DataReference.png differ
diff --git a/_docs/master/exploration-and-organization/images/browse-data.png b/_docs/master/exploration-and-organization/images/browse-data.png
index 9429442b26..f857430ff8 100644
Binary files a/_docs/master/exploration-and-organization/images/browse-data.png and b/_docs/master/exploration-and-organization/images/browse-data.png differ
diff --git a/_docs/master/exploration-and-organization/images/event-on-a-time-series.png b/_docs/master/exploration-and-organization/images/event-on-a-time-series.png
index 66168ce82a..acc04a435b 100644
Binary files a/_docs/master/exploration-and-organization/images/event-on-a-time-series.png and b/_docs/master/exploration-and-organization/images/event-on-a-time-series.png differ
diff --git a/_docs/master/exploration-and-organization/images/pinned-show-viz.png b/_docs/master/exploration-and-organization/images/pinned-show-viz.png
index 6c58b5e734..41ac861ee0 100644
Binary files a/_docs/master/exploration-and-organization/images/pinned-show-viz.png and b/_docs/master/exploration-and-organization/images/pinned-show-viz.png differ
diff --git a/_docs/master/exploration-and-organization/images/question-checkbox.png b/_docs/master/exploration-and-organization/images/question-checkbox.png
index 4887db0e22..d9ba8c5014 100644
Binary files a/_docs/master/exploration-and-organization/images/question-checkbox.png and b/_docs/master/exploration-and-organization/images/question-checkbox.png differ
diff --git a/_docs/master/exploration-and-organization/images/search-results.png b/_docs/master/exploration-and-organization/images/search-results.png
index 177b5b507a..1b91e84ebc 100644
Binary files a/_docs/master/exploration-and-organization/images/search-results.png and b/_docs/master/exploration-and-organization/images/search-results.png differ
diff --git a/_docs/master/installation-and-operation/images/AZPrivateLink.png b/_docs/master/installation-and-operation/images/AZPrivateLink.png
index c520b55bdd..1834491eb7 100644
Binary files a/_docs/master/installation-and-operation/images/AZPrivateLink.png and b/_docs/master/installation-and-operation/images/AZPrivateLink.png differ
diff --git a/_docs/master/installation-and-operation/images/AZVNETintegration.png b/_docs/master/installation-and-operation/images/AZVNETintegration.png
index f69b404401..7bb1d7a4f0 100644
Binary files a/_docs/master/installation-and-operation/images/AZVNETintegration.png and b/_docs/master/installation-and-operation/images/AZVNETintegration.png differ
diff --git a/_docs/master/installation-and-operation/images/AddRemoteHost.png b/_docs/master/installation-and-operation/images/AddRemoteHost.png
index a3bdb2b9c8..ab8def0988 100644
Binary files a/_docs/master/installation-and-operation/images/AddRemoteHost.png and b/_docs/master/installation-and-operation/images/AddRemoteHost.png differ
diff --git a/_docs/master/installation-and-operation/images/LocalProcessVisualVM.png b/_docs/master/installation-and-operation/images/LocalProcessVisualVM.png
index d71e3e03d6..f07a2758c5 100644
Binary files a/_docs/master/installation-and-operation/images/LocalProcessVisualVM.png and b/_docs/master/installation-and-operation/images/LocalProcessVisualVM.png differ
diff --git a/_docs/master/installation-and-operation/images/Metabase-AWS-SI.png b/_docs/master/installation-and-operation/images/Metabase-AWS-SI.png
index 6a49e9a6dc..d60c5504d6 100644
Binary files a/_docs/master/installation-and-operation/images/Metabase-AWS-SI.png and b/_docs/master/installation-and-operation/images/Metabase-AWS-SI.png differ
diff --git a/_docs/master/installation-and-operation/images/OpenRemoteInstance.png b/_docs/master/installation-and-operation/images/OpenRemoteInstance.png
index fa97c0e30a..454be8a831 100644
Binary files a/_docs/master/installation-and-operation/images/OpenRemoteInstance.png and b/_docs/master/installation-and-operation/images/OpenRemoteInstance.png differ
diff --git a/_docs/master/installation-and-operation/running-metabase-on-azure.md b/_docs/master/installation-and-operation/running-metabase-on-azure.md
index 12d8db0a81..f400b9791d 100644
--- a/_docs/master/installation-and-operation/running-metabase-on-azure.md
+++ b/_docs/master/installation-and-operation/running-metabase-on-azure.md
@@ -111,7 +111,7 @@ Now go to the next step where you will select:
- **Options**: Single container.
- **Image source**: DockerHub.
- **Access Type**: Public.
-- **Image and tag**: metabase/metabase:latest (or choose any other docker image tag of your preference, like our Enterprise Edition). To find the latest version, check our [Community Edition Dockerhub repository](https://hub.docker.com/r/metabase/metabase/tags?page=1&ordering=last_updated) and also our [Enterprise Edition Dockerhub Repository](https://hub.docker.com/r/metabase/metabase-enterprise/tags?page=1&ordering=last_updated).
+- **Image and tag**: metabase/metabase:latest (or choose any other docker image tag of your preference, like our Enterprise Edition). To find the latest version, check our [Community Edition Docker Hub repository](https://hub.docker.com/r/metabase/metabase/tags?page=1&ordering=last_updated) and also our [Enterprise Edition Docker Hub Repository](https://hub.docker.com/r/metabase/metabase-enterprise/tags?page=1&ordering=last_updated).
- **Startup command**: Leave this field empty.
Click **Next** until you get to the last section, then click **Create**, and wait while your application initializes.
diff --git a/_docs/master/installation-and-operation/running-metabase-on-docker.md b/_docs/master/installation-and-operation/running-metabase-on-docker.md
index 282a5d9daa..b96b5f1a90 100644
--- a/_docs/master/installation-and-operation/running-metabase-on-docker.md
+++ b/_docs/master/installation-and-operation/running-metabase-on-docker.md
@@ -15,7 +15,7 @@ redirect_from:
> To get fast, reliable, and secure deployment with none of the work or hidden costs that come with self-hosting, check out [Metabase Cloud](/cloud/).
-Metabase provides an official Docker image via Dockerhub that can be used for deployments on any system that is running Docker.
+Metabase provides an official Docker image via Docker Hub that can be used for deployments on any system that is running Docker.
If you're trying to upgrade your Metabase version on Docker, check out these [upgrading instructions](upgrading-metabase).
diff --git a/_docs/master/people-and-groups/images/JWT-auth-form.png b/_docs/master/people-and-groups/images/JWT-auth-form.png
index ce5b0e7415..ed91fea29b 100644
Binary files a/_docs/master/people-and-groups/images/JWT-auth-form.png and b/_docs/master/people-and-groups/images/JWT-auth-form.png differ
diff --git a/_docs/master/people-and-groups/images/auth0callbackurl.png b/_docs/master/people-and-groups/images/auth0callbackurl.png
index dda21e391d..8371279d7d 100644
Binary files a/_docs/master/people-and-groups/images/auth0callbackurl.png and b/_docs/master/people-and-groups/images/auth0callbackurl.png differ
diff --git a/_docs/master/people-and-groups/images/auth0createapp.png b/_docs/master/people-and-groups/images/auth0createapp.png
index 6fbdab7fcf..2fb7bd3907 100644
Binary files a/_docs/master/people-and-groups/images/auth0createapp.png and b/_docs/master/people-and-groups/images/auth0createapp.png differ
diff --git a/_docs/master/people-and-groups/images/auth0regularapp.png b/_docs/master/people-and-groups/images/auth0regularapp.png
index 6fbdab7fcf..7d23c598f1 100644
Binary files a/_docs/master/people-and-groups/images/auth0regularapp.png and b/_docs/master/people-and-groups/images/auth0regularapp.png differ
diff --git a/_docs/master/people-and-groups/images/auth0saml2addon.png b/_docs/master/people-and-groups/images/auth0saml2addon.png
index 8926f599ba..6fbdab7fcf 100644
Binary files a/_docs/master/people-and-groups/images/auth0saml2addon.png and b/_docs/master/people-and-groups/images/auth0saml2addon.png differ
diff --git a/_docs/master/people-and-groups/images/auth0samlmappings.png b/_docs/master/people-and-groups/images/auth0samlmappings.png
index 6fbdab7fcf..a673bc98ba 100644
Binary files a/_docs/master/people-and-groups/images/auth0samlmappings.png and b/_docs/master/people-and-groups/images/auth0samlmappings.png differ
diff --git a/_docs/master/people-and-groups/images/auth0samlusage.png b/_docs/master/people-and-groups/images/auth0samlusage.png
index 6fbdab7fcf..7dbf8c7523 100644
Binary files a/_docs/master/people-and-groups/images/auth0samlusage.png and b/_docs/master/people-and-groups/images/auth0samlusage.png differ
diff --git a/_docs/master/people-and-groups/images/groups.png b/_docs/master/people-and-groups/images/groups.png
index 8926f599ba..759a222b61 100644
Binary files a/_docs/master/people-and-groups/images/groups.png and b/_docs/master/people-and-groups/images/groups.png differ
diff --git a/_docs/master/people-and-groups/images/okta-group-attribute.png b/_docs/master/people-and-groups/images/okta-group-attribute.png
index a48ae1a137..baf8cdc518 100644
Binary files a/_docs/master/people-and-groups/images/okta-group-attribute.png and b/_docs/master/people-and-groups/images/okta-group-attribute.png differ
diff --git a/_docs/master/people-and-groups/images/saml-azure-step-1.png b/_docs/master/people-and-groups/images/saml-azure-step-1.png
index e8ae330628..4becab567e 100644
Binary files a/_docs/master/people-and-groups/images/saml-azure-step-1.png and b/_docs/master/people-and-groups/images/saml-azure-step-1.png differ
diff --git a/_docs/master/people-and-groups/images/saml-okta-groups.png b/_docs/master/people-and-groups/images/saml-okta-groups.png
index 98a4a6fc63..9df2d9fb1d 100644
Binary files a/_docs/master/people-and-groups/images/saml-okta-groups.png and b/_docs/master/people-and-groups/images/saml-okta-groups.png differ
diff --git a/_docs/master/people-and-groups/saml-google.md b/_docs/master/people-and-groups/saml-google.md
index 4fdf6641da..872da68569 100644
--- a/_docs/master/people-and-groups/saml-google.md
+++ b/_docs/master/people-and-groups/saml-google.md
@@ -68,7 +68,9 @@ For example, to add the attribute "First name":
## Setting up synchronize group membership
-1. In Google Admin, setup a multi-value [custom user attribute](https://support.google.com/a/answer/6208725?hl=en#zippy=%2Cadd-a-new-custom-attribute) for your users (recommended if you manage multiple SAML app permissions in Google or do not have existing Google Groups that align with your desired Metabase groups) OR [map to existing Google Groups](https://support.google.com/a/answer/11143403?hl=en).
+1. In Google Admin, you can EITHER:
+ - Set up a multi-value [custom user attribute](https://support.google.com/a/answer/6208725?hl=en#zippy=%2Cadd-a-new-custom-attribute) for your users. Recommended if you manage multiple SAML app permissions in Google or if you lack existing Google Groups that align with your desired Metabase groups.
+ - [Map to existing Google Groups](https://support.google.com/a/answer/11143403?hl=en).
2. Follow the instructions for [Configuring the group schema](./authenticating-with-saml#configuring-the-group-schema-in-metabase) using the `App attribute` that you used in Google as the Group attribute name in Metabase.
## Troubleshooting SAML issues
diff --git a/_docs/master/permissions/database-routing.md b/_docs/master/permissions/database-routing.md
index 38fc239ea4..35f902f2b7 100644
--- a/_docs/master/permissions/database-routing.md
+++ b/_docs/master/permissions/database-routing.md
@@ -25,6 +25,7 @@ Database routing is useful for:
## Databases that support database routing
+- [BigQuery](../databases/connections/bigquery)
- [Druid](../databases/connections/druid)
- [MongoDB](../databases/connections/mongodb)
- [MariaDB](../databases/connections/mariadb)
diff --git a/_docs/master/permissions/images/admin-panel-collections.png b/_docs/master/permissions/images/admin-panel-collections.png
index cc2c707278..155d34f84e 100644
Binary files a/_docs/master/permissions/images/admin-panel-collections.png and b/_docs/master/permissions/images/admin-panel-collections.png differ
diff --git a/_docs/master/permissions/images/advanced-example-1-sandbox-modal.png b/_docs/master/permissions/images/advanced-example-1-sandbox-modal.png
index f0997404d5..e84c8f1aef 100644
Binary files a/_docs/master/permissions/images/advanced-example-1-sandbox-modal.png and b/_docs/master/permissions/images/advanced-example-1-sandbox-modal.png differ
diff --git a/_docs/master/permissions/images/dashboard-no-permissions.png b/_docs/master/permissions/images/dashboard-no-permissions.png
index c9c10c5129..3c02e69fc9 100644
Binary files a/_docs/master/permissions/images/dashboard-no-permissions.png and b/_docs/master/permissions/images/dashboard-no-permissions.png differ
diff --git a/_docs/master/permissions/images/pinned-items.png b/_docs/master/permissions/images/pinned-items.png
index 76c2b7c0aa..960bcb87f1 100644
Binary files a/_docs/master/permissions/images/pinned-items.png and b/_docs/master/permissions/images/pinned-items.png differ
diff --git a/_docs/master/permissions/images/select-impersonated.png b/_docs/master/permissions/images/select-impersonated.png
new file mode 100644
index 0000000000..db48b29a27
Binary files /dev/null and b/_docs/master/permissions/images/select-impersonated.png differ
diff --git a/_docs/master/permissions/images/select-user-attribute.png b/_docs/master/permissions/images/select-user-attribute.png
index 5fb459752f..6fe341045c 100644
Binary files a/_docs/master/permissions/images/select-user-attribute.png and b/_docs/master/permissions/images/select-user-attribute.png differ
diff --git a/_docs/master/permissions/images/user-attribute-impersonation.png b/_docs/master/permissions/images/user-attribute-impersonation.png
new file mode 100644
index 0000000000..24031d7e6c
Binary files /dev/null and b/_docs/master/permissions/images/user-attribute-impersonation.png differ
diff --git a/_docs/master/permissions/impersonation.md b/_docs/master/permissions/impersonation.md
index 911ad9532c..0303d10667 100644
--- a/_docs/master/permissions/impersonation.md
+++ b/_docs/master/permissions/impersonation.md
@@ -13,7 +13,7 @@ layout: new-docs
{% include plans-blockquote.html feature="Impersonation access" %}
-> For now, impersonation access is only available for MySQL, PostgreSQL, Redshift, Snowflake, and SQL Server. If you want to switch database _connections_ based on who is logged in, check out [Database routing](./database-routing).
+> For now, impersonation access is only available for ClickHouse, MySQL, PostgreSQL, Redshift, Snowflake, and SQL Server. If you want to switch database _connections_ based on who is logged in, check out [Database routing](./database-routing).
> If you're using views in PostgresSQL, the row-level security policies on views will only work on Postgres versions 15 and higher.
@@ -21,34 +21,126 @@ This page covers the [View data](./data#view-data-permissions) permission level
**Impersonation access** allows admins to "outsource" View data permissions to roles in your database. Admins can associate user attributes with database-defined roles and their privileges. If someone is in a group with their View data permission set to Impersonation, the person will be able to view and query data based on the privileges granted to the role specified by their user attribute.
-## Setting up connection impersonation
+## Impersonation vs sandboxing
-> \*\*For impersonation to work for Redshift databases, the user account Metabase uses to [connect to your Redshift database](../databases/connections/redshift) must be a superuser, as Metabase will need to be able to run the [SET SESSION AUTHORIZATION](https://docs.aws.amazon.com/redshift/latest/dg/r_SET_SESSION_AUTHORIZATION) command, which can only be run by a database superuser.
+### Impersonation sets permissions for questions written in both the SQL editor and the query builder
+
+Impersonation operates at the database level. In a database engine, setting the role before the query runs can alter the results of the query, as the role defines the permissions that your database should use when it executes the statements.
+
+### Sandboxing only sets permissions for query builder questions
+
+Sandboxing operates at the Metabase level. Since Metabase can't parse SQL queries to find out what data people are allowed to view, sandboxing only applies to questions composed in the query builder (where Metabase can interpret the queries).
+
+## Example use case for impersonation
+
+Let's say we have a People table that includes rows of accounts from all 50 states of the United States. Let's say you want your Vermont sales team to:
+
+- Be able to ask questions using both the query builder and the native SQL editor.
+- Only be able to view customer accounts in the People table who live in Vermont.
+
+First, you'll set up permissions in your database by creating a role with a policy. Then in Metabase, you'll set data access to that database to Impersonation, so when people run queries on that database, Metabase will use that role to limit what data they can see.
+
+## Set up connection impersonation
For impersonation access to work, you'll first need to set up roles in your database for Metabase to impersonate, then configure Metabase to impersonate those roles when people view or query data.
+### Set up Metabase database connection for impersonation
+
+Impersonation uses database roles to run queries on your database, but there still needs to be a default role that that will be used to run operations like [sync, scans, and fingerprinting](../databases/sync-scan). So the user account that Metabase uses to [connect to your database](../databases/connecting) should have access to everything in that database that any Metabase group may need access to, as that database user account is what Metabase uses to sync table information.
+
+You can then create roles in the database that have more restrictive access to the database (like row-level or table-level security). When the role is passed to the database using impersonation, the engine will return a subset of the data, or restrict the query altogether.
+
+> For **Redshift** databases, the user account Metabase uses to [connect to your Redshift database](../databases/connections/redshift) must be a superuser, as Metabase will need to be able to run the [SET SESSION AUTHORIZATION](https://docs.aws.amazon.com/redshift/latest/dg/r_SET_SESSION_AUTHORIZATION) command, which can only be run by a database superuser.
+
### In your database, set up roles
-1. Create a new role (in Redshift, this would be a new user).
-2. Grant that role privileges.
+In your database (not in Metabase):
+
+1. Create a new database role (in Redshift, this would be a new user).
+2. Grant that role privileges that you'd like impersonated users to have..
For exactly how to create a new role in your database and grant that role privileges, you'll need to consult your database's documentation. We also have some docs on [users, roles, and privileges](../databases/users-roles-privileges) that can help you get started.
-### In your Metabase, set up impersonation and specify a user attribute
+For example, if you're using PostgreSQL, the SQL below will create a role called `vermont_sales_team` and only allow that role to select rows in the `people` table where the value in the `state` column is `VT` (the abbreviation for Vermont):
+
+```sql
+CREATE ROLE vermont_sales_team;
+
+GRANT
+SELECT ON ALL TABLES IN SCHEMA PUBLIC TO vermont_sales_team;
+
+
+CREATE POLICY vermont ON people
+FOR
+SELECT TO vermont_sales_team USING (state = 'VT');
+
+
+ALTER TABLE people ENABLE ROW LEVEL SECURITY;
+```
+
+### Set up a Metabase group
+
+Permissions in Metabase, including impersonation, are managed by groups, so you'll need to:
+
+1. [Create a new group](../people-and-groups/managing#groups) (or select an existing one).
+2. [Add people to the group](../people-and-groups/managing#adding-people-to-groups).
+
+You might want to create a test user and add them to the group to verify later that impersonation is working correctly.
-1. **Create a [new group](../people-and-groups/managing#groups)**, or select an existing group.
+### Assign a user attribute to people in the group
-2. **Assign a [user attribute](../people-and-groups/managing#adding-a-user-attribute) to people in that group.** You'll use this user attribute to associate people in that group with a role that you created in your database. For example, if you created a role named `sales` in your database with access to a subset of tables relevant to the sales team, you would add a user attribute called `db_role` (or whatever you want to call the attribute) and assign the value `sales` to the person's `db_role`. The value of the attribute (`sales` in this case) should match the name of the role in your database. Only some databases enforce case sensitivity, so you might want to make sure the attribute's value and the database's role match exactly.
+To associate people in the group with a role that you created in your database, you'll use a user attribute.
-3. **Apply the impersonation access to that group.**. Hit Cmd/Ctrl + K to bring up the command palette. Search for **Permissions**. Or go to **Admin settings** > **Permissions** > **Data**.
+Assign a [user attribute](../people-and-groups/managing#adding-a-user-attribute) to people in your group:
-4. Select the database you want to set permissions on.
+- The **key** of the attribute can be anything.
+- The **value** of the attribute must match the desired database role for every person.
-5. Find the group that you want to associate with the database role you created. Under **View data** setting for that group, select **Impersonation**.
+
-6. From the dropdown, select the user attribute that you added that maps to the role you want the group to use when querying the database.
+For example, if you created a role named `vermont_sales_team` in your database with access to a subset of data relevant to the Vermont sales team (like [in the example above](#in-your-database-set-up-roles)), you could add a user attribute called `db_role` (or whatever you want to call the attribute) and assign the value `vermont_sales_team` to the person's `db_role` attribute.
-7. Save your changes.
+Some databases enforce case sensitivity, so you might want to make sure the attribute's value and the database's role match exactly.
+
+People in one group can have different attribute values, but must have the same attribute key. See [People in a group with impersonation access to data do not necessarily share the same privileges](#people-in-a-group-with-impersonation-access-to-data-do-not-necessarily-share-the-same-privileges).
+
+### Set up impersonation
+
+1. In Metabase, hit Cmd/Ctrl + K to bring up the command palette and search for **Permissions**, or go directly to **Admin settings** > **Permissions** > **Data**.
+
+2. Select the group that you want to to associate with the database role you created.
+
+3. Select the database to configure access to.
+
+4. Under **View data** setting for that database, select **Impersonation**. This option will only be visible if you already [created a user attribute](#assign-a-user-attribute-to-people-in-the-group).
+
+ 
+
+ If your All Users group has more permissive access to this database (for example, "Can view"), you will see a warning, because [Metabase gives people the most permissive access to data across all of their groups](#metabase-gives-people-the-most-permissive-access-to-data-across-all-of-their-groups). You'll need to [block database access for the All Users group](./data#revoke-access-even-though-all-users-has-greater-access) before setting up impersonation.
+
+5. From the user attribute dropdown, select the user attribute that you added that maps to the role you want the group to use when querying the database.
+
+6. Save your changes.
+
+Remember to also set up ["Create queries"](./data#create-queries-permissions) permissions for your group and database. For example, if you'd like people to be able to write SQL while using impersonated database roles, you'll need to set "Create queries" permissions to "Query builder and native".
+
+### Verify that impersonated permissions are working
+
+Admins will not be able to verify that impersonation is are working from their own account, so you should create a test user, add them to the group and set up their user attributes.
+
+To verify that the impersonated permissions are working:
+
+- If the test user has "Create queries" permissions set to "Create queries and native", create a SQL question and verify that the test user can only see the right data.
+
+For example, for the `vermont_sales_team` role from the [example above](#in-your-database-set-up-roles), you can run:
+
+```
+SELECT * FROM people;
+```
+
+to verify that the test user only sees data from Vermont.
+
+- If the test user has "Create queries" permissions set to "Query builder only", go to **Browse data** in the left sidebar and verify that the user can only see the tables they have access to, and only the data in those tables that
## People in a group with impersonation access to data do not necessarily share the same privileges
@@ -56,13 +148,11 @@ Metabase will use whatever role you specify in the user attribute for each perso
## Use impersonation to set up row-level SQL access
-You can use impersonation to give people access to the native/SQL editor, while restricting their access to data based on a specific database role. And not just table-level access, but row-level access---or however you define access for that role in your database. Effectively, you can use impersonation to set up data sandbox-like access to your data, while letting people use the SQL editor to query that data. The difference is that, _instead of setting up a data sandbox in Metabase, you need to set up that row-level security via the privileges granted to a role in your database._
+You can use impersonation to give people access to the SQL editor, while restricting their access to data based on a specific database role. And not just table-level access, but row-level access---or however you define access for that role in your database. Effectively, you can use impersonation to set up data sandbox-like access to your data, while letting people use the SQL editor to query that data. The difference is that, _instead of setting up a data sandbox in Metabase, you need to set up that row-level security via the privileges granted to a role in your database._
If instead you want to give a group SQL access to some, but not all, of the schemas or tables in that database, you can create an additional role in your database that only includes a subset of those tables---or even specific row-level access---and then use Metabase's impersonation feature to associate a user attribute with that role. Essentially what Metabase will do is take the user attribute and pass that attribute as a string into a `SET ROLE` or `USE ROLE` command for the database _before_ Metabase executes the query.
-Connection impersonation doesn't apply to people in the Metabase admins group, as their more permissive privileges take precedence.
-
-For more about how to set this up, check out [Use Impersonation to get row-level permissions with both GUI and SQL queries](/learn/metabase-basics/administration/permissions/impersonation).
+Connection impersonation doesn't apply to people in the Metabase Admins group, as their more permissive privileges take precedence.
## Metabase gives people the most permissive access to data across all of their groups
@@ -73,6 +163,10 @@ So if a person is in two groups with different permissions for the same database
Blue group's more permissive access would override the impersonated access.
-## Further reading
+## Admins won't see the effects of impersonation
+
+Admins won't ever see the effects of impersonation effects, because their privileges will override those of any other group they're a member of.
+
+Metabase's default Administrators group has "Can view" access to all databases, and Metabase uses the most permissive access for any person in multple groups, so any admin will have "Can view" - not "Impersonated" - access to the database.
-- [Use Impersonation to get row-level permissions with both GUI and SQL queries](/learn/metabase-basics/administration/permissions/impersonation)
+To test impersonation, create a test user, assign them a user attribute with the database role, and add them to the impersonated group. Then, log in as the test user and verify the data access.
diff --git a/_docs/master/questions/images/SQL-filter-widget.png b/_docs/master/questions/images/SQL-filter-widget.png
index 22f38f2e92..318c459779 100644
Binary files a/_docs/master/questions/images/SQL-filter-widget.png and b/_docs/master/questions/images/SQL-filter-widget.png differ
diff --git a/_docs/master/questions/images/add-comparison.png b/_docs/master/questions/images/add-comparison.png
index 416c5e974f..d193fa0481 100644
Binary files a/_docs/master/questions/images/add-comparison.png and b/_docs/master/questions/images/add-comparison.png differ
diff --git a/_docs/master/questions/images/area.png b/_docs/master/questions/images/area.png
index 676d7840a3..8008354d87 100644
Binary files a/_docs/master/questions/images/area.png and b/_docs/master/questions/images/area.png differ
diff --git a/_docs/master/questions/images/bin-by-latlong.png b/_docs/master/questions/images/bin-by-latlong.png
index 60cbdafba4..ac8e7481e4 100644
Binary files a/_docs/master/questions/images/bin-by-latlong.png and b/_docs/master/questions/images/bin-by-latlong.png differ
diff --git a/_docs/master/questions/images/chart-formatting-options.png b/_docs/master/questions/images/chart-formatting-options.png
index 14d64cca39..5e1fe30691 100644
Binary files a/_docs/master/questions/images/chart-formatting-options.png and b/_docs/master/questions/images/chart-formatting-options.png differ
diff --git a/_docs/master/questions/images/diff-and-percentage.png b/_docs/master/questions/images/diff-and-percentage.png
index 181ab4e47c..eaeaf64500 100644
Binary files a/_docs/master/questions/images/diff-and-percentage.png and b/_docs/master/questions/images/diff-and-percentage.png differ
diff --git a/_docs/master/questions/images/function-browser.png b/_docs/master/questions/images/function-browser.png
index eaeaf64500..71c4f4a9fa 100644
Binary files a/_docs/master/questions/images/function-browser.png and b/_docs/master/questions/images/function-browser.png differ
diff --git a/_docs/master/questions/images/histogram.png b/_docs/master/questions/images/histogram.png
index efbaebb582..77a47cdb2d 100644
Binary files a/_docs/master/questions/images/histogram.png and b/_docs/master/questions/images/histogram.png differ
diff --git a/_docs/master/questions/images/legend.png b/_docs/master/questions/images/legend.png
index 1cfd092a11..159ee2b139 100644
Binary files a/_docs/master/questions/images/legend.png and b/_docs/master/questions/images/legend.png differ
diff --git a/_docs/master/questions/images/number.png b/_docs/master/questions/images/number.png
index 6a503dc977..b650a3cb61 100644
Binary files a/_docs/master/questions/images/number.png and b/_docs/master/questions/images/number.png differ
diff --git a/_docs/master/questions/images/pie-other-slice.png b/_docs/master/questions/images/pie-other-slice.png
index dcbd6a8bdf..6e08d9e9a0 100644
Binary files a/_docs/master/questions/images/pie-other-slice.png and b/_docs/master/questions/images/pie-other-slice.png differ
diff --git a/_docs/master/questions/images/pin-data-shape.png b/_docs/master/questions/images/pin-data-shape.png
index fab199632b..b9079a1c01 100644
Binary files a/_docs/master/questions/images/pin-data-shape.png and b/_docs/master/questions/images/pin-data-shape.png differ
diff --git a/_docs/master/questions/images/pivot-table-options.png b/_docs/master/questions/images/pivot-table-options.png
index a912dce7f6..e3d9ba981c 100644
Binary files a/_docs/master/questions/images/pivot-table-options.png and b/_docs/master/questions/images/pivot-table-options.png differ
diff --git a/_docs/master/questions/images/raw-table.png b/_docs/master/questions/images/raw-table.png
index 2bd6a50036..5c753beebe 100644
Binary files a/_docs/master/questions/images/raw-table.png and b/_docs/master/questions/images/raw-table.png differ
diff --git a/_docs/master/questions/images/region-maps.png b/_docs/master/questions/images/region-maps.png
index 91ae89db11..8dec0e9d90 100644
Binary files a/_docs/master/questions/images/region-maps.png and b/_docs/master/questions/images/region-maps.png differ
diff --git a/_docs/master/questions/images/rolling-average.png b/_docs/master/questions/images/rolling-average.png
index 17463efde4..233e8508dd 100644
Binary files a/_docs/master/questions/images/rolling-average.png and b/_docs/master/questions/images/rolling-average.png differ
diff --git a/_docs/master/questions/images/sum-of-totals-for-previous-period.png b/_docs/master/questions/images/sum-of-totals-for-previous-period.png
index c2c2978f4f..3e95ecd43d 100644
Binary files a/_docs/master/questions/images/sum-of-totals-for-previous-period.png and b/_docs/master/questions/images/sum-of-totals-for-previous-period.png differ
diff --git a/_docs/master/questions/images/switch-to-editor.png b/_docs/master/questions/images/switch-to-editor.png
index 3c8a32cc82..0945f38fa4 100644
Binary files a/_docs/master/questions/images/switch-to-editor.png and b/_docs/master/questions/images/switch-to-editor.png differ
diff --git a/_docs/master/questions/images/table.png b/_docs/master/questions/images/table.png
index 4ce9fda455..63af470596 100644
Binary files a/_docs/master/questions/images/table.png and b/_docs/master/questions/images/table.png differ
diff --git a/_docs/master/questions/images/unpivoted-results.png b/_docs/master/questions/images/unpivoted-results.png
index e3d9ba981c..14d64cca39 100644
Binary files a/_docs/master/questions/images/unpivoted-results.png and b/_docs/master/questions/images/unpivoted-results.png differ
diff --git a/_docs/master/questions/images/viz-options.png b/_docs/master/questions/images/viz-options.png
index 49a0bf0703..08e8dc6af0 100644
Binary files a/_docs/master/questions/images/viz-options.png and b/_docs/master/questions/images/viz-options.png differ
diff --git a/_docs/master/questions/images/week-iso.png b/_docs/master/questions/images/week-iso.png
index 5ebb209705..d75254a7bf 100644
Binary files a/_docs/master/questions/images/week-iso.png and b/_docs/master/questions/images/week-iso.png differ
diff --git a/_docs/master/questions/native-editor/sql-parameters.md b/_docs/master/questions/native-editor/sql-parameters.md
index a6d6a59cc0..e3413f60f7 100644
--- a/_docs/master/questions/native-editor/sql-parameters.md
+++ b/_docs/master/questions/native-editor/sql-parameters.md
@@ -155,7 +155,7 @@ Make sure your SQL dialect matches the database you've selected. Common issues i
| Database | Dialect quirk | Example |
| -------- | --------------------------------------------------- | -------------------------- |
| BigQuery | Schemas and tables must be quoted with backticks. | `` FROM `dataset.table` `` |
-| Oracle | Schemas and tables must be quoted in double quotes. | `FROM schema.table` |
+| Oracle | Schemas and tables must be quoted in double quotes. | `FROM "schema.table"` |
For more help, see [Troubleshooting SQL error messages](../../troubleshooting-guide/error-message#sql-editor).
diff --git a/_docs/master/questions/visualizations/country-codes.md b/_docs/master/questions/visualizations/country-codes.md
new file mode 100644
index 0000000000..ae4a15f291
--- /dev/null
+++ b/_docs/master/questions/visualizations/country-codes.md
@@ -0,0 +1,269 @@
+---
+version: master
+has_magic_breadcrumbs: true
+show_category_breadcrumb: true
+show_title_breadcrumb: true
+category: Questions
+title: 'Country codes'
+source_url: 'https://github.com/metabase/metabase/blob/master/docs/questions/visualizations/country-codes.md'
+layout: new-docs
+---
+
+# Country codes
+
+This reference lists all country codes and their corresponding country names used in Metabase's default world map visualizations. The data comes from the GeoJSON world map file and includes 250 countries, territories, and administrative regions.
+
+Use these ISO 3166-1 alpha-2 country codes and country names when working with geographic data in Metabase.
+
+| Country code | Country name |
+| ------------ | ------------------------------------ |
+| AD | Andorra |
+| AE | United Arab Emirates |
+| AF | Afghanistan |
+| AG | Antigua and Barbuda |
+| AI | Anguilla |
+| AL | Albania |
+| AM | Armenia |
+| AO | Angola |
+| AQ | Antarctica |
+| AR | Argentina |
+| AS | American Samoa |
+| AT | Austria |
+| AU | Australia |
+| AW | Aruba |
+| AX | Åland |
+| AZ | Azerbaijan |
+| BA | Bosnia and Herzegovina |
+| BB | Barbados |
+| BD | Bangladesh |
+| BE | Belgium |
+| BF | Burkina Faso |
+| BG | Bulgaria |
+| BH | Bahrain |
+| BI | Burundi |
+| BJ | Benin |
+| BL | St-Barthélemy |
+| BM | Bermuda |
+| BN | Brunei |
+| BO | Bolivia |
+| BQ | Caribbean Netherlands |
+| BR | Brazil |
+| BS | Bahamas |
+| BT | Bhutan |
+| BV | Bouvet I. |
+| BW | Botswana |
+| BY | Belarus |
+| BZ | Belize |
+| CA | Canada |
+| CC | Cocos Is. |
+| CD | Dem. Rep. Congo |
+| CF | Central African Rep. |
+| CG | Congo |
+| CH | Switzerland |
+| CI | Côte d'Ivoire |
+| CK | Cook Is. |
+| CL | Chile |
+| CM | Cameroon |
+| CN | China |
+| CO | Colombia |
+| CR | Costa Rica |
+| CU | Cuba |
+| CV | Cabo Verde |
+| CW | Curaçao |
+| CX | Christmas I. |
+| CY | Cyprus |
+| CZ | Czechia |
+| DE | Germany |
+| DJ | Djibouti |
+| DK | Denmark |
+| DM | Dominica |
+| DO | Dominican Rep. |
+| DZ | Algeria |
+| EC | Ecuador |
+| EE | Estonia |
+| EG | Egypt |
+| EH | W. Sahara |
+| ER | Eritrea |
+| ES | Spain |
+| ET | Ethiopia |
+| FI | Finland |
+| FJ | Fiji |
+| FK | Falkland Is. |
+| FM | Micronesia |
+| FO | Faeroe Is. |
+| FR | France |
+| GA | Gabon |
+| GB | United Kingdom |
+| GD | Grenada |
+| GE | Georgia |
+| GF | French Guiana |
+| GG | Guernsey |
+| GH | Ghana |
+| GI | Gibraltar |
+| GL | Greenland |
+| GM | Gambia |
+| GN | Guinea |
+| GP | Guadeloupe |
+| GQ | Eq. Guinea |
+| GR | Greece |
+| GS | S. Geo. and the Is. |
+| GT | Guatemala |
+| GU | Guam |
+| GW | Guinea-Bissau |
+| GY | Guyana |
+| HK | Hong Kong |
+| HM | Heard I. and McDonald Is. |
+| HN | Honduras |
+| HR | Croatia |
+| HT | Haiti |
+| HU | Hungary |
+| ID | Indonesia |
+| IE | Ireland |
+| IL | Israel |
+| IM | Isle of Man |
+| IN | India |
+| IO | Br. Indian Ocean Ter. |
+| IQ | Iraq |
+| IR | Iran |
+| IS | Iceland |
+| IT | Italy |
+| JE | Jersey |
+| JM | Jamaica |
+| JO | Jordan |
+| JP | Japan |
+| KE | Kenya |
+| KG | Kyrgyzstan |
+| KH | Cambodia |
+| KI | Kiribati |
+| KM | Comoros |
+| KN | St. Kitts and Nevis |
+| KP | North Korea |
+| KR | South Korea |
+| KW | Kuwait |
+| KY | Cayman Is. |
+| KZ | Kazakhstan |
+| LA | Laos |
+| LB | Lebanon |
+| LC | Saint Lucia |
+| LI | Liechtenstein |
+| LK | Sri Lanka |
+| LR | Liberia |
+| LS | Lesotho |
+| LT | Lithuania |
+| LU | Luxembourg |
+| LV | Latvia |
+| LY | Libya |
+| MA | Morocco |
+| MC | Monaco |
+| MD | Moldova |
+| ME | Montenegro |
+| MF | St-Martin |
+| MG | Madagascar |
+| MH | Marshall Is. |
+| MK | Macedonia |
+| ML | Mali |
+| MM | Myanmar |
+| MN | Mongolia |
+| MO | Macao |
+| MP | N. Mariana Is. |
+| MQ | Martinique |
+| MR | Mauritania |
+| MS | Montserrat |
+| MT | Malta |
+| MU | Mauritius |
+| MV | Maldives |
+| MW | Malawi |
+| MX | Mexico |
+| MY | Malaysia |
+| MZ | Mozambique |
+| NA | Namibia |
+| NC | New Caledonia |
+| NE | Niger |
+| NF | Norfolk Island |
+| NG | Nigeria |
+| NI | Nicaragua |
+| NL | Netherlands |
+| NO | Norway |
+| NP | Nepal |
+| NR | Nauru |
+| NU | Niue |
+| NZ | New Zealand |
+| OM | Oman |
+| PA | Panama |
+| PE | Peru |
+| PF | Fr. Polynesia |
+| PG | Papua New Guinea |
+| PH | Philippines |
+| PK | Pakistan |
+| PL | Poland |
+| PM | St. Pierre and Miquelon |
+| PN | Pitcairn Is. |
+| PR | Puerto Rico |
+| PS | Palestine |
+| PT | Portugal |
+| PW | Palau |
+| PY | Paraguay |
+| QA | Qatar |
+| RE | Réunion |
+| RO | Romania |
+| RS | Serbia |
+| RU | Russia |
+| RW | Rwanda |
+| SA | Saudi Arabia |
+| SB | Solomon Is. |
+| SC | Seychelles |
+| SD | Sudan |
+| SE | Sweden |
+| SG | Singapore |
+| SH | Saint Helena |
+| SI | Slovenia |
+| SJ | Svalbard and Jan Mayen |
+| SK | Slovakia |
+| SL | Sierra Leone |
+| SM | San Marino |
+| SN | Senegal |
+| SO | Somalia |
+| SR | Suriname |
+| SS | S. Sudan |
+| ST | São Tomé and Principe |
+| SV | El Salvador |
+| SX | Sint Maarten |
+| SY | Syria |
+| SZ | eSwatini |
+| TC | Turks and Caicos Is. |
+| TD | Chad |
+| TF | Fr. S. Antarctic Lands |
+| TG | Togo |
+| TH | Thailand |
+| TJ | Tajikistan |
+| TK | Tokelau |
+| TL | Timor-Leste |
+| TM | Turkmenistan |
+| TN | Tunisia |
+| TO | Tonga |
+| TR | Turkey |
+| TT | Trinidad and Tobago |
+| TV | Tuvalu |
+| TW | Taiwan |
+| TZ | Tanzania |
+| UA | Ukraine |
+| UG | Uganda |
+| UM | United States Minor Outlying Islands |
+| US | United States of America |
+| UY | Uruguay |
+| UZ | Uzbekistan |
+| VA | Vatican |
+| VC | St. Vin. and Gren. |
+| VE | Venezuela |
+| VG | British Virgin Is. |
+| VI | U.S. Virgin Is. |
+| VN | Vietnam |
+| VU | Vanuatu |
+| WF | Wallis and Futuna Is. |
+| WS | Samoa |
+| XK | Kosovo |
+| YE | Yemen |
+| YT | Mayotte |
+| ZA | South Africa |
+| ZM | Zambia |
+| ZW | Zimbabwe |
diff --git a/_docs/master/questions/visualizations/map.md b/_docs/master/questions/visualizations/map.md
index 85a4a6d535..1f80030c8f 100644
--- a/_docs/master/questions/visualizations/map.md
+++ b/_docs/master/questions/visualizations/map.md
@@ -118,7 +118,7 @@ You can change the base color used for the region map, but you can't currently u
### World Map
-To visualize your results in the format of a map of the world broken out by country, your result must contain a column with [two-letter ISO country codes](/glossary/country-code), like "US" or "BR", for example:
+To visualize your results in the format of a map of the world broken out by country, your result must contain a column with [two-letter ISO country codes](./country-codes), like "US" or "BR", or country names like "United States of America" or "Brazil". For example:
| Country code | Metric |
| ------------ | ------ |
diff --git a/_docs/master/troubleshooting-guide/bugs.md b/_docs/master/troubleshooting-guide/bugs.md
index 6dc76f07ae..7ec6b908d5 100644
--- a/_docs/master/troubleshooting-guide/bugs.md
+++ b/_docs/master/troubleshooting-guide/bugs.md
@@ -11,7 +11,7 @@ layout: new-docs
# Reporting a bug
-If you come across something that looks like a bug, please start by searching our [Github issues][metabase-issues] to see if it has already been reported. If it has, please let us know you're experiencing the same issue by reacting with a thumbs up emoji or adding a comment to provide additional information.
+If you come across something that looks like a bug, please start by searching our [GitHub issues][metabase-issues] to see if it has already been reported. If it has, please let us know you're experiencing the same issue by reacting with a thumbs up emoji or adding a comment to provide additional information.
If the bug has not yet been reported, go ahead and [open a bug report][metabase-file-bug]. The following information will help us reproduce your issue:
diff --git a/_docs/master/troubleshooting-guide/known-issues.md b/_docs/master/troubleshooting-guide/known-issues.md
index 5ae4b67ed7..29a783865a 100644
--- a/_docs/master/troubleshooting-guide/known-issues.md
+++ b/_docs/master/troubleshooting-guide/known-issues.md
@@ -17,7 +17,7 @@ If you can't find or solve your problem using the [troubleshooting guides](./ind
If your work in Metabase is crashing, missing, or not being saved, you might have found a bug.
-1. Go to the [Metabase Github issues page](https://github.com/metabase/metabase/issues).
+1. Go to the [Metabase GitHub issues page](https://github.com/metabase/metabase/issues).
2. Click on the **Label** dropdown and select `Type: Bug`.
@@ -37,7 +37,7 @@ If your work in Metabase is crashing, missing, or not being saved, you might hav
If the functionality you're looking for simply doesn't exist (i.e., it hasn't suddenly gone missing), you might be running into a product limitation.
-1. Go to the [Metabase Github issues page](https://github.com/metabase/metabase/issues).
+1. Go to the [Metabase GitHub issues page](https://github.com/metabase/metabase/issues).
2. Click on the **Label** dropdown and select `Type: New Feature`.
diff --git a/_docs/master/usage-and-performance-tools/images/audit-dashboards.png b/_docs/master/usage-and-performance-tools/images/audit-dashboards.png
index aa3faabac3..fb1801bc32 100644
Binary files a/_docs/master/usage-and-performance-tools/images/audit-dashboards.png and b/_docs/master/usage-and-performance-tools/images/audit-dashboards.png differ
diff --git a/_docs/master/usage-and-performance-tools/images/audit-teammember.png b/_docs/master/usage-and-performance-tools/images/audit-teammember.png
index 8c9b5bcbb9..73fa55a29d 100644
Binary files a/_docs/master/usage-and-performance-tools/images/audit-teammember.png and b/_docs/master/usage-and-performance-tools/images/audit-teammember.png differ
diff --git a/_site/docs/master/CONTRIBUTING.html b/_site/docs/master/CONTRIBUTING.html
index 561c219984..22ddaace09 100644
--- a/_site/docs/master/CONTRIBUTING.html
+++ b/_site/docs/master/CONTRIBUTING.html
@@ -5046,7 +5046,7 @@
Because MongoDB contains unstructured data, Metabase takes a different approach to syncing your database’s metadata. To get a sense of the schema, Metabase will query the first and last 500 documents (most of the calculation is done in MongoDB). This sampling helps Metabase do things like differentiate datetime fields from string fields, and provide people with pre-populated filters. Metabase also syncs 1,000 leaf fields (fields at the deepest nesting level) per MongoDB collection. The reason Metabase only scans a sample of the documents is because scanning every document in every collection on every sync would put too much strain on your database. And while the sampling does a pretty good job keeping Metabase up to date, it can also mean that new fields can sometimes fall through the cracks, leading to visualization issues, or even fields failing to appear in your results. For more info, check out our troubleshooting guide.
To use any other database beside the default ones please take a look at Building Drivers further down in this document.
+
Frontend
Metabase depends on third-party libraries to run, so you’ll need to keep those up to date. The Clojure CLI will automatically fetch the dependencies when needed. With JavaScript dependencies, however, you’ll need to kick off the installation process manually.
Be conservative with what comments you add to the codebase. Comments shouldn’t be used as reminders or as todos–record those by creating a new issue in Github. Ideally, code should be written in such a way that it explains itself clearly. When it does not, you should first try rewriting the code. If for whatever reason you are unable to write something clearly, add a comment to explain the “why”.
+
Be conservative with what comments you add to the codebase. Comments shouldn’t be used as reminders or as todos–record those by creating a new issue in GitHub. Ideally, code should be written in such a way that it explains itself clearly. When it does not, you should first try rewriting the code. If for whatever reason you are unable to write something clearly, add a comment to explain the “why”.
+ These are the docs for the Metabase master branch. Some features documented here may not yet be available in the latest release.
+ Check out the docs for the latest version, Metabase v0.55.
+
+
+
+
+
+
+
Security Token Scanner
+
+
Security token scanner detects potentially leaked API keys and secrets in the Metabase codebase. Runs automatically as a git precommit hook on staged files.
The scanner uses .gitignore to filter files and will block commits containing detected tokens.
+
+
False positives
+
+
If the scanner flags a non-token string, you should exclude the literal token string by adding it to: mage/resources/token_scanner/token_whitelist.txt.
The ID of the question.
This is either:
diff --git a/_site/docs/master/embedding/sdk/api/CreateQuestion.html b/_site/docs/master/embedding/sdk/api/CreateQuestion.html
index a35f55a8d1..6fb7f49748 100644
--- a/_site/docs/master/embedding/sdk/api/CreateQuestion.html
+++ b/_site/docs/master/embedding/sdk/api/CreateQuestion.html
@@ -28,7 +28,7 @@
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
A dashboard component with the features available in the InteractiveDashboard component, as well as the ability to add and update questions, layout, and content within your dashboard.
A dashboard component with the features available in the InteractiveDashboard component, as well as the ability to add and update questions, layout, and content within your dashboard.
\ No newline at end of file
diff --git a/_site/docs/master/embedding/sdk/api/EditableDashboardProps.html b/_site/docs/master/embedding/sdk/api/EditableDashboardProps.html
index 84f46b6ace..277bc8a0f7 100644
--- a/_site/docs/master/embedding/sdk/api/EditableDashboardProps.html
+++ b/_site/docs/master/embedding/sdk/api/EditableDashboardProps.html
@@ -23,8 +23,9 @@
-
Determines whether the question title is displayed, and allows a custom title to be displayed instead of the default question title. Shown by default. Only applicable to interactive questions when using the default layout.
@@ -89,6 +91,6 @@
OptionalwithCardTitle
withCardTitle?:boolean
Whether the dashboard cards should display a title.
\ No newline at end of file
diff --git a/_site/docs/master/embedding/sdk/api/InteractiveDashboard.html b/_site/docs/master/embedding/sdk/api/InteractiveDashboard.html
index e8fb2103ed..f902519d01 100644
--- a/_site/docs/master/embedding/sdk/api/InteractiveDashboard.html
+++ b/_site/docs/master/embedding/sdk/api/InteractiveDashboard.html
@@ -23,8 +23,8 @@
-
\ No newline at end of file
diff --git a/_site/docs/master/embedding/sdk/api/InteractiveDashboardProps.html b/_site/docs/master/embedding/sdk/api/InteractiveDashboardProps.html
index 01f4a19492..bfda664be1 100644
--- a/_site/docs/master/embedding/sdk/api/InteractiveDashboardProps.html
+++ b/_site/docs/master/embedding/sdk/api/InteractiveDashboardProps.html
@@ -23,8 +23,9 @@
-
Whether to show the save button.