From 22e02f9bc729a0e0953931c130bde60f66287e9a Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Fri, 28 Jun 2024 09:13:07 +0900 Subject: [PATCH] Fix style by Prettier Commands I used: yarn prettier . --write git restore .github And I modified below file myself to make it more readable: 'src/pages/kb/data-sources/axibase-time-series-database.md' --- src/components/ArticlesList.jsx | 7 +- src/components/QuickNav.jsx | 4 +- src/data/customers.yml | 56 +-- src/data/kb_sections.yml | 2 +- src/pages/case-studies/bubbleiq/index.jsx | 17 +- src/pages/customers/index.jsx | 5 +- src/pages/help/index.jsx | 4 +- src/pages/integrations/index.jsx | 6 +- .../kb/data-sources/amazon-cloudwatch.md | 28 +- .../axibase-time-series-database.md | 51 +- .../kb/data-sources/azure-sql-database.md | 1 - src/pages/kb/data-sources/bigquery.md | 30 +- src/pages/kb/data-sources/dynamodb.md | 3 +- src/pages/kb/data-sources/google-analytics.md | 1 - src/pages/kb/data-sources/google-sheets.md | 24 +- src/pages/kb/data-sources/jira.md | 31 +- src/pages/kb/data-sources/json-api.md | 38 +- .../kb/data-sources/supported-data-sources.md | 101 ++-- src/pages/kb/faq/general_category.md | 4 +- .../kb/open-source/admin-guide/usage-data.md | 24 +- .../kb/open-source/dev-guide/debugging.md | 7 +- .../kb/open-source/dev-guide/remote-server.md | 3 +- .../alerts/alert-multiple-columns.md | 13 +- .../alerts/creating-new-alert-destination.md | 24 +- .../setting-up-an-alert-V8-and-earlier.md | 80 ++-- .../dashboards/favorites-tagging.md | 8 +- .../kb/user-guide/integrations-and-api/api.md | 85 ++-- .../querying/download-query-results.md | 2 - .../user-guide/querying/favorites-tagging.md | 8 +- .../querying/query-results-data-source.md | 19 +- .../kb/user-guide/querying/query-snippets.md | 21 +- .../user-guide/querying/scheduling-a-query.md | 8 +- .../kb/user-guide/querying/writing-queries.md | 8 +- .../users/creating-editing-groups.md | 4 +- .../user-guide/visualizations/cohort-howto.md | 5 +- .../pivot-table-visualizations.md | 8 +- .../visualizations/table-visualizations.md | 13 +- src/pages/product/index.jsx | 6 +- src/scss/_components/_alert.scss | 4 +- src/scss/_components/_bootstrap-override.scss | 36 +- src/scss/_components/_buttons.scss | 35 +- src/scss/_components/_callouts.scss | 48 +- src/scss/_components/_card.scss | 11 +- src/scss/_components/_carousel.scss | 446 +++++++++--------- src/scss/_components/_forms.scss | 92 ++-- src/scss/_components/_from-to.scss | 3 +- src/scss/_components/_kb.scss | 5 +- src/scss/_components/_list.scss | 4 +- src/scss/_components/_mixins.scss | 106 +++-- src/scss/_components/_page-about.scss | 2 +- src/scss/_components/_page-casestudy.scss | 10 +- src/scss/_components/_page-community.scss | 7 +- src/scss/_components/_page-contact.scss | 2 +- src/scss/_components/_page-customers.scss | 4 +- src/scss/_components/_page-index.scss | 3 +- src/scss/_components/_page-price.scss | 16 +- src/scss/_components/_page-product.scss | 4 +- src/scss/_components/_panel.scss | 3 +- src/scss/_components/_popover.scss | 6 +- src/scss/_components/_reset.scss | 111 ++--- src/scss/_components/_search_results.scss | 19 +- src/scss/_components/_section.scss | 45 +- src/scss/_components/_topics.scss | 6 +- src/scss/_components/_typography.scss | 350 +++++++------- src/scss/_components/_variables.scss | 28 +- src/scss/main.scss | 4 +- src/templates/DataSourcePage.jsx | 8 +- src/templates/HelpArticle.jsx | 4 +- src/templates/NarrowTextPage.jsx | 2 +- src/templates/TextPage.jsx | 2 +- 70 files changed, 1105 insertions(+), 1080 deletions(-) diff --git a/src/components/ArticlesList.jsx b/src/components/ArticlesList.jsx index c3e529c02..2951c702c 100644 --- a/src/components/ArticlesList.jsx +++ b/src/components/ArticlesList.jsx @@ -39,14 +39,11 @@ ArticlesList.propTypes = { parent_category: PropTypes.string.isRequired, } -export default props => { +export default (props) => { const data = useStaticQuery(graphql` query { allMarkdownRemark( - sort: [ - {frontmatter: {order: ASC}}, - {frontmatter: {title: ASC}} - ] + sort: [{ frontmatter: { order: ASC } }, { frontmatter: { title: ASC } }] filter: { fileAbsolutePath: { regex: "/pages/kb/" } frontmatter: { layout: { ne: "kb-category" } } diff --git a/src/components/QuickNav.jsx b/src/components/QuickNav.jsx index 62755dc04..b9c6159b3 100644 --- a/src/components/QuickNav.jsx +++ b/src/components/QuickNav.jsx @@ -19,10 +19,10 @@ class QuickNav extends React.Component { baseLevel let min_heading = 6 - headings.forEach(heading => { + headings.forEach((heading) => { min_heading = Math.min(min_heading, parseInt(heading.tagName.substr(1))) }) - headings.forEach(heading => { + headings.forEach((heading) => { let newLine const title = heading.textContent const id = diff --git a/src/data/customers.yml b/src/data/customers.yml index e3d541bd4..096f4e039 100644 --- a/src/data/customers.yml +++ b/src/data/customers.yml @@ -1,98 +1,98 @@ - customer: Root url: https://www.joinroot.com/ - logo: "/assets/images/customers/root.png" + logo: '/assets/images/customers/root.png' person: Dan Manges role: CTO - profile-img: "/assets/images/customers/dan-manges.jpg" + profile-img: '/assets/images/customers/dan-manges.jpg' quote: Root is an extremely data-driven company. We make dozens of changes to our product every week, and we measure the impact of all of them. Redash allows us to easily analyze data and share results among our team. - customer: AuptiX url: https://www.auptix.com/ - logo: "/assets/images/customers/auptix.png" + logo: '/assets/images/customers/auptix.png' person: Lu Saenz role: VP Engineering & Product - profile-img: "/assets/images/customers/lu-saenz.jpg" + profile-img: '/assets/images/customers/lu-saenz.jpg' quote: Redash enabled us to surface visualizations and dashboards to everyone in the company -- remarkably easily and efficiently. The capabilities to share query results and combine many queries into publicly viewable dashboards work flawlessly and get the job done. - customer: MyBook url: https://mybook.ru/ - logo: "/assets/images/customers/mybook.png" + logo: '/assets/images/customers/mybook.png' person: Ilya Baryshev role: CTO - profile-img: "/assets/images/customers/ilya-baryshev.jpg" + profile-img: '/assets/images/customers/ilya-baryshev.jpg' quote: Redash greatly reduced the need to build custom analytics UI. Our Marketing team now heavily uses cohort dashboards, it is their daily tool now! Overall, Redash saves ton of time for the team. - customer: FindHotel url: https://www.findhotel.net/ - logo: "/assets/images/customers/findhotel.png" + logo: '/assets/images/customers/findhotel.png' person: German Gomez-Herrero role: CTO - profile-img: "/assets/images/customers/german-gomez-herrero.jpg" + profile-img: '/assets/images/customers/german-gomez-herrero.jpg' quote: At FindHotel every important decision is based on data, and Redash has quickly become one of the preferred tools to share a data story across the company. Redash dashboards combined with the large number of supported data sources have made our company data fully transparent for everyone. From technical metrics such as pipeline latencies and infrastructure costs, to high level business metrics. Everything can be easily accessed and visualised with Redash. - customer: DataMiner url: https://data-miner.io/ - logo: "/assets/images/customers/data-miner.png" + logo: '/assets/images/customers/data-miner.png' person: Ben Dehghan role: Co-Founder - profile-img: "/assets/images/customers/ben-dehghan.jpg" + profile-img: '/assets/images/customers/ben-dehghan.jpg' quote: Redash is as essential as email to my company. We love data but accessing the data is a pain without Redash. Any company I go to, I get them hooked on Redash. It's an easy sell :) - customer: VoxFeed url: https://voxfeed.com/ - logo: "/assets/images/customers/voxfeed.png" + logo: '/assets/images/customers/voxfeed.png' person: Manuel de la Torre role: CTO - profile-img: "/assets/images/customers/manuel-de-la-torre.png" + profile-img: '/assets/images/customers/manuel-de-la-torre.png' quote: Since we use Redash Dashboards our team is more involved in all areas of our business and we take always data-driven decisions. We passed from spending about an hour scripting to get a report, to just type a simple query and have the results ready-to-use immediately. - customer: SkyEng url: https://skyeng.ru/ - logo: "/assets/images/customers/skyeng.png" + logo: '/assets/images/customers/skyeng.png' person: Gleb Sologub role: Prouduct Analyst - profile-img: "" + profile-img: '' quote: I love Redash for the simplicity, price and a great number of usage patterns. My favourite features are parameters and filters as well as Redash API. - customer: Sheetsu url: http://sheetsu.com/ - logo: "/assets/images/customers/sheetsu.png" + logo: '/assets/images/customers/sheetsu.png' person: Michael Oblak role: Founder - profile-img: "/assets/images/customers/michael-oblak.jpg" + profile-img: '/assets/images/customers/michael-oblak.jpg' quote: It's easy for us to connect data from different sources and see the bigger picture and get more knowledge from all the data we are gathering in all different places. Redash helped us to see how our business is going. Before doing anything, we are setting the KPIs, which we are tracking on the dashboards. We have queries that help us answer some of the questions, why our users behave in such way or another. Very easy to set up. Perfect to collaborate with other team mates. - customer: Atomized url: https://www.atomized.com/ - logo: "/assets/images/customers/atomized.jpeg" + logo: '/assets/images/customers/atomized.jpeg' person: Jon Lee role: CTO - profile-img: "" + profile-img: '' quote: The ability to query multiple data sources from a single window in a read-only environment is a huge plus for our team on a day to day basis. Redash allowed our team to provide better customer service by giving us the information we need without requiring a developer to get involved. - customer: Redox url: https://www.redoxengine.com/ - logo: "/assets/images/customers/redox.png" + logo: '/assets/images/customers/redox.png' person: Tom Jessessky role: Data and Analytics Lead - profile-img: "/assets/images/customers/tom-jessessky.jpg" + profile-img: '/assets/images/customers/tom-jessessky.jpg' quote: Redash's ability to efficiently query Redshift has allowed it to fill in the gaps where our other (more expensive) dashboard tools fall short. - customer: SpareFoot url: https://www.sparefoot.com/ - logo: "/assets/images/customers/sparefoot.png" + logo: '/assets/images/customers/sparefoot.png' person: Debyani Ghosh role: Senior Data Architect - profile-img: "" + profile-img: '' quote: Redash makes it easy for our analysts and engineers to save queries and share across the business. We like the fact that the end users have the same UI experience whether they are connecting to Redshift, Mysql or Data Lake via Athena. - customer: Just Add Music url: https://www.justaddmusic.net/ - logo: "/assets/images/customers/justaddmusic.png" + logo: '/assets/images/customers/justaddmusic.png' person: Dirk Bosman role: Data Analyst - profile-img: "/assets/images/customers/dirk-bosman.jpg" + profile-img: '/assets/images/customers/dirk-bosman.jpg' quote: With Redash, we have managed to integrate various data source in one single view to make our company more data-driven. - customer: Farmster url: https://www.farmster.co/ - logo: "/assets/images/customers/farmster.png" + logo: '/assets/images/customers/farmster.png' person: Adam Abramson role: Founder - profile-img: "" + profile-img: '' quote: Redash is a huge plus for a startup seeking to display our progress to investors and partners in a simple and elegant way. - customer: Datree url: https://datree.io/ - logo: "/assets/images/customers/datree.png" + logo: '/assets/images/customers/datree.png' person: Eyar Zilberman role: CPO - profile-img: "/assets/images/customers/eyar-zilberman.jpg" + profile-img: '/assets/images/customers/eyar-zilberman.jpg' quote: Redash is the right tool to use when creating a new data-related MVP. With Redash, the feedback-loop from customers is faster and simple! diff --git a/src/data/kb_sections.yml b/src/data/kb_sections.yml index f18e36395..a862fb9c3 100644 --- a/src/data/kb_sections.yml +++ b/src/data/kb_sections.yml @@ -5,4 +5,4 @@ - name: FAQ slug: faq - name: Open Source & Self Hosted - slug: open-source \ No newline at end of file + slug: open-source diff --git a/src/pages/case-studies/bubbleiq/index.jsx b/src/pages/case-studies/bubbleiq/index.jsx index 546216295..84a50dabc 100644 --- a/src/pages/case-studies/bubbleiq/index.jsx +++ b/src/pages/case-studies/bubbleiq/index.jsx @@ -46,11 +46,7 @@ const BubbleIQPage = ({ location }) => ( Industry - - - BubbleIQ - - + BubbleIQ (

About BubbleIQ

- - BubbleIQ -{' '} - helps companies streamline their support workflow by connecting - helpdesk systems (Zendesk, Salesforce) to real-time chat tools - (Slack, Drift). This allows companies to provide better support - and a high-touch relationship with their customers. + BubbleIQ helps companies streamline their support workflow by + connecting helpdesk systems (Zendesk, Salesforce) to real-time + chat tools (Slack, Drift). This allows companies to provide better + support and a high-touch relationship with their customers.

Fletcher Richman serves as the CEO of BubbleIQ, which three diff --git a/src/pages/customers/index.jsx b/src/pages/customers/index.jsx index 2b210ee6f..9847c758c 100644 --- a/src/pages/customers/index.jsx +++ b/src/pages/customers/index.jsx @@ -166,7 +166,10 @@ const CustomersPage = ({

- +

diff --git a/src/pages/help/index.jsx b/src/pages/help/index.jsx index d8b0445b4..2a0614371 100644 --- a/src/pages/help/index.jsx +++ b/src/pages/help/index.jsx @@ -49,7 +49,7 @@ class HelpPage extends React.Component {

Knowledge Base

-
e.preventDefault()}> + e.preventDefault()}>
' | parse 'Opened tunnel for () with port *' as port | fields @timestamp, @logStream @@ -87,4 +83,4 @@ queryString: ### Helpful Links -* [Query Syntax](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.start_query). +- [Query Syntax](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.start_query). diff --git a/src/pages/kb/data-sources/axibase-time-series-database.md b/src/pages/kb/data-sources/axibase-time-series-database.md index bcfd66948..387d1aca2 100644 --- a/src/pages/kb/data-sources/axibase-time-series-database.md +++ b/src/pages/kb/data-sources/axibase-time-series-database.md @@ -6,48 +6,51 @@ title: Axibase Time Series Database slug: axibase-time-series-database toc: true --- + ### User Setup: ### Create User Group with READ-ONLY Permissions -1. Login into PTSD web interface at [https://atsd_host:8443](https://atsd_host:8443/). -2. Open Admin > User groups page, click Create. -3. Specify user group name and the optional description. -4. Grant the group 'Read' permission from 'All entities'. +1. Login into PTSD web interface at [https://atsd_host:8443](https://atsd_host:8443/). +2. Open Admin > User groups page, click Create. +3. Specify user group name and the optional description. +4. Grant the group 'Read' permission from 'All entities'. 5. Press the Save button. ![](/assets/images/docs/gitbook/atsd_user_group.png) ### Create User -1. Open Admin > Users page, click Create. -2. Specify username, password, and other fields if necessary. -3. Add the user to the previously created User Group as a member in the 'Entity Permissions' section. +1. Open Admin > Users page, click Create. +2. Specify username, password, and other fields if necessary. +3. Add the user to the previously created User Group as a member in the 'Entity Permissions' section. 4. Press the Save button. ![](/assets/images/docs/gitbook/atsd_user.png) ## Create Data Source -1. Login into Redash web interface. -2. Open the New Data Source page, select 'Axibase Time Series Database' as type. +1. Login into Redash web interface. +2. Open the New Data Source page, select 'Axibase Time Series Database' as type. 3. Complete the following fields on the configuration form: -| **Name** | **Default Value** | **Required** | **Description** | -|:---|:---|:---|:---| -| `Username` | --- | Yes | User name. | -| `Password` | --- | Yes | User password. | -| `Metric Limit` | 5000 | No | Maximum number of ATSD [metrics](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters) displayed as tables in Redash.| -| `Metric Filter` | --- | No | Include metrics that match an [expression filter](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters). | -| `Metric Minimum Insert Date` | --- | No | Include metrics with [last insert date](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters) equal to or greater than the specified date. ISO date format and endtime syntax is supported.| -| `Protocol` | http | Yes | Connection protocol. | -| `Trust SSL Certificate ` | False | No | Trust SSL certificate, if the cerificate is self-signed. | -| `Host` | localhost | No | ATSD hostname or IP address.| -| `Port` | 8088 | No | ATSD http (8088) or https (8443) port.| -| `Connection Timeout` | 600 | No | Connection timeout in seconds. | - - * Save the data source. - * Test the connection by clicking the 'Test' button. ++----------------------------+---------------+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Name | Default Value | Required | Description | ++----------------------------+---------------+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Username | --- | Yes | User name. | +| Password | --- | Yes | User password. | +| Metric Limit | 5000 | No | Maximum number of ATSD [metrics](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters) displayed as tables in Redash. | +| Metric Filter | --- | No | Include metrics that match an [expression filter](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters). | +| Metric Minimum Insert Date | --- | No | Include metrics with [last insert date](https://github.com/axibase/atsd-docs/blob/master/api/meta/metric/list.md#query-parameters) equal to or greater than the specified date. ISO date format and endtime syntax is supported. | +| Protocol | http | Yes | Connection protocol. | +| Trust SSL Certificate | False | No | Trust SSL certificate, if the certificate is self-signed. | +| Host | localhost | No | ATSD hostname or IP address. | +| Port | 8088 | No | ATSD http (8088) or https (8443) port. | +| Connection Timeout | 600 | No | Connection timeout in seconds. | ++----------------------------+---------------+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +- Save the data source. +- Test the connection by clicking the 'Test' button. ![](/assets/images/docs/gitbook/atsd_datasource.png) diff --git a/src/pages/kb/data-sources/azure-sql-database.md b/src/pages/kb/data-sources/azure-sql-database.md index d5832a47c..a78002537 100644 --- a/src/pages/kb/data-sources/azure-sql-database.md +++ b/src/pages/kb/data-sources/azure-sql-database.md @@ -11,7 +11,6 @@ Redash V9 introduced an ODBC connector for SQL Server that improves Azure compat {% endcallout %} - ![](/assets/images/docs/gitbook/mssql-ds-choice.png) When entering the username you need to make sure it's of the form: `user@server-name`. Where `server-name` is your server address without the `.database-windows.net` suffix. diff --git a/src/pages/kb/data-sources/bigquery.md b/src/pages/kb/data-sources/bigquery.md index a55ea920d..a7bc62686 100644 --- a/src/pages/kb/data-sources/bigquery.md +++ b/src/pages/kb/data-sources/bigquery.md @@ -8,23 +8,23 @@ toc: true ### Data Source Setup Screen -On the BigQuery Data Source setup screen, the **Project ID** and **JSON Key File** are always required. You can get a key file when you create a new service account with Google (details below). +On the BigQuery Data Source setup screen, the **Project ID** and **JSON Key File** are always required. You can get a key file when you create a new service account with Google (details below). ![](/assets/images/docs/gitbook/bigquery_mandatories.PNG) -+ If your database schema exceeds 5000 tokens, untick the **Load Schema** box to stop Redash from loading it to the Query Editor screen. Many browsers will slow down or crash if the schema is too big. +- If your database schema exceeds 5000 tokens, untick the **Load Schema** box to stop Redash from loading it to the Query Editor screen. Many browsers will slow down or crash if the schema is too big. -+ Since BigQuery 2.0, BigQuery supports its Legacy SQL syntax or [Standard SQL Syntax](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql). Redash supports both, but Standard SQL is the default. This preference applies at the Data Source-level by toggling the **Use Standard SQL** box. Your selection here is passed to BigQuery along with your query text. If some of your queries use Legacy SQL and others use Standard SQL, you can create two data sources. +- Since BigQuery 2.0, BigQuery supports its Legacy SQL syntax or [Standard SQL Syntax](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql). Redash supports both, but Standard SQL is the default. This preference applies at the Data Source-level by toggling the **Use Standard SQL** box. Your selection here is passed to BigQuery along with your query text. If some of your queries use Legacy SQL and others use Standard SQL, you can create two data sources. -+ You can read more about **Processing Location** [here](https://cloud.google.com/bigquery/docs/locations). If you receive a job not found error that looks like this: `Not found: Job :`, check that your Processing Location is correct. +- You can read more about **Processing Location** [here](https://cloud.google.com/bigquery/docs/locations). If you receive a job not found error that looks like this: `Not found: Job :`, check that your Processing Location is correct. -+ If you enter a **Scanned Data Limit**, Redash will perform a dry-run when you execute your query to check how much data will be processed. And if it is larger than the limit you specify, an error will appear. +- If you enter a **Scanned Data Limit**, Redash will perform a dry-run when you execute your query to check how much data will be processed. And if it is larger than the limit you specify, an error will appear. -+ The **Maximum Billing Tier** is an integer number that Redash can pass along to BigQuery via their API. See [their documentation](https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#jobconfigurationquery) for more info. +- The **Maximum Billing Tier** is an integer number that Redash can pass along to BigQuery via their API. See [their documentation](https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#jobconfigurationquery) for more info. ### How to create a Google Service Account? -1. Open the [API Credentials Page](https://console.cloud.google.com/apis/credentials). If prompted, select or create a project. +1. Open the [API Credentials Page](https://console.cloud.google.com/apis/credentials). If prompted, select or create a project. 2. Click the "Create credentials" button. On the dropdown that appears, chose "Service account key". 3. On the following page, use the dropdown to select the project you elected in step 1. For role select `BigQuery Admin` from the tree menu. 4. Under key type, select JSON and hit "Create" @@ -38,12 +38,12 @@ role since it's the only one that can create queries and list tables. Want to create your own role? The permissions you need to assign are: - * bigquery.jobs.create - * bigquery.jobs.get - * bigquery.jobs.update - * bigquery.datasets.get - * bigquery.tables.list - * bigquery.tables.get - * bigquery.tables.getData +- bigquery.jobs.create +- bigquery.jobs.get +- bigquery.jobs.update +- bigquery.datasets.get +- bigquery.tables.list +- bigquery.tables.get +- bigquery.tables.getData - ### +### diff --git a/src/pages/kb/data-sources/dynamodb.md b/src/pages/kb/data-sources/dynamodb.md index 0c7680274..03b3d30ee 100644 --- a/src/pages/kb/data-sources/dynamodb.md +++ b/src/pages/kb/data-sources/dynamodb.md @@ -12,8 +12,7 @@ documentation on [SELECT queries](https://dql.readthedocs.io/en/latest/topics/qu ### Troubleshooting > **Error message**: "No index found for query. Please use a SCAN query, or set -allow_select_scan=True opt allow_select_scan true" Error Message +> allow_select_scan=True opt allow_select_scan true" Error Message In case you receive the above error message, you need to replace `SELECT` in your query with `SCAN`. - diff --git a/src/pages/kb/data-sources/google-analytics.md b/src/pages/kb/data-sources/google-analytics.md index bf2b35894..aabe97661 100644 --- a/src/pages/kb/data-sources/google-analytics.md +++ b/src/pages/kb/data-sources/google-analytics.md @@ -58,4 +58,3 @@ Google Analytics uses JSON document-style queries. You can get an idea of possib "sort": "-ga:newUsers" } ``` - diff --git a/src/pages/kb/data-sources/google-sheets.md b/src/pages/kb/data-sources/google-sheets.md index 11be08f42..2fdeab49c 100644 --- a/src/pages/kb/data-sources/google-sheets.md +++ b/src/pages/kb/data-sources/google-sheets.md @@ -14,26 +14,26 @@ To add a Google Sheets data source to Redash you first need to create a [Service ### How to create a Google Service Account? -1. Open the [API Credentials Page](https://console.cloud.google.com/apis/credentials). If prompted, select or create a project. +1. Open the [API Credentials Page](https://console.cloud.google.com/apis/credentials). If prompted, select or create a project. 2. Click the "Create credentials" button. On the dropdown that appears, chose "Service account key". 3. On the following page, use the dropdown to select the project you elected in step 1. For role select `Project > Viewer` from the tree menu. 4. Under key type, select JSON and hit "Create" -A `.json` file will then download to your computer. In Redash under Settings, add a new data source for `GoogleSpreadsheet`. In the modal that appears, name this connection and upload the `.json` file you downloaded from the Google credentials console. +A `.json` file will then download to your computer. In Redash under Settings, add a new data source for `GoogleSpreadsheet`. In the modal that appears, name this connection and upload the `.json` file you downloaded from the Google credentials console. ## Querying -Once you have setup the data source, you can load spreadsheets into Redash. To do so, you need to share the spreadsheet with the Service Account's email address. This can be found in the [Google Sheets API credentials page](https://console.cloud.google.com/apis/api/sheets.googleapis.com/credentials) or in the JSON file under the `"client_email"` key. Sharing is done like you would share with any regular user. +Once you have setup the data source, you can load spreadsheets into Redash. To do so, you need to share the spreadsheet with the Service Account's email address. This can be found in the [Google Sheets API credentials page](https://console.cloud.google.com/apis/api/sheets.googleapis.com/credentials) or in the JSON file under the `"client_email"` key. Sharing is done like you would share with any regular user. After the spreadsheet is shared with your Service Account email address, create a new query in Redash and select your Google Sheets data source. In the query editor text box, type your desired Spreadsheet ID. You can optionally select a specific tab of your spreadsheet by adding its tab position as a zero-indexed number separated by a vertical bar or pipe symbol. For example: - 1DFuuOMFzNoFQ5EJ2JE2zB79-0uR5zVKvc0EikmvnDgk|0 + 1DFuuOMFzNoFQ5EJ2JE2zB79-0uR5zVKvc0EikmvnDgk|0 to load the first sheet or - 1DFuuOMFzNoFQ5EJ2JE2zB79-0uR5zVKvc0EikmvnDgk|1 + 1DFuuOMFzNoFQ5EJ2JE2zB79-0uR5zVKvc0EikmvnDgk|1 to load the second. That's the whole query. Leave out any SQL at this point. @@ -42,20 +42,18 @@ to load the second. That's the whole query. Leave out any SQL at this point. You can find your Spreadsheet ID in its URL. So if the spreadsheet URL is: - - https://docs.google.com/spreadsheets/d/ - b94d27b9934d3e08a52e52d7da7dabfac484efe37 - + https://docs.google.com/spreadsheets/d/ + b94d27b9934d3e08a52e52d7da7dabfac484efe37 Then the ID will be: - b94d27b9934d3e08a52e52d7da7dabfac484efe37 + b94d27b9934d3e08a52e52d7da7dabfac484efe37 {% endcallout %} {% callout warning %} -This procedure might fail if your organization has restrictions on sharing spreadsheets with external accounts. To improve outcomes, be sure to create the Service Account with a Google account from the same organization. +This procedure might fail if your organization has restrictions on sharing spreadsheets with external accounts. To improve outcomes, be sure to create the Service Account with a Google account from the same organization. {% endcallout %} @@ -63,8 +61,8 @@ This procedure might fail if your organization has restrictions on sharing sprea When you connect a Google Sheet with Redash, we load it in full. You can generate visualizations from the data and add it to your dashboards. If you want to filter some data or aggregate it beyond what a pivot table can accomplish, you can use one of the following methods: - * Use the [Query Results Data Source]({% link _kb/user-guide/querying/query-results-data-source.md %}) which allows you to query results from other queries. - * Use [Google BigQuery's integration with Google Drive](https://cloud.google.com/blog/big-data/2016/05/bigquery-integrates-with-google-drive) to create a Google BigQuery external table based on the Google Spreadsheet. +- Use the [Query Results Data Source]({% link _kb/user-guide/querying/query-results-data-source.md %}) which allows you to query results from other queries. +- Use [Google BigQuery's integration with Google Drive](https://cloud.google.com/blog/big-data/2016/05/bigquery-integrates-with-google-drive) to create a Google BigQuery external table based on the Google Spreadsheet. ## A Note About Dates diff --git a/src/pages/kb/data-sources/jira.md b/src/pages/kb/data-sources/jira.md index fe079444d..3e3d8e374 100644 --- a/src/pages/kb/data-sources/jira.md +++ b/src/pages/kb/data-sources/jira.md @@ -7,8 +7,7 @@ slug: jira-ds # Setup -You need a **Username** (the email address you use to login) and **[API Token](https://confluence.atlassian.com/cloud/api-tokens-938839638.html)** to connect to Jira. The token behaves like a password. - +You need a **Username** (the email address you use to login) and **[API Token](https://confluence.atlassian.com/cloud/api-tokens-938839638.html)** to connect to Jira. The token behaves like a password. {% callout warning %} @@ -21,48 +20,34 @@ Before Redash V8 the JIRA setup screen asked for a password. You still need an A # Querying For a simple query, one that returns issues with no filtering: - + ``` {} ``` Return only specific fields: - - { "fields": "summary,priority" } - - Return only specific fields and filter by priority: - - { "fields": "summary,priority", "jql": "priority=medium" } - - -Count number of issues with `priority=medium`: +Count number of issues with `priority=medium`: - - { "queryType": "count", "jql": "priority=medium" } - - You can also use the field mapping to rename a field for the result - this is useful when working with custom fields: - - { "fields": "summary,priority,customfield_10672", "jql": "priority=medium", @@ -70,15 +55,11 @@ useful when working with custom fields: "customfield_10672": "my_custom_field_name" } } - - Some fields returned by JIRA are JSON objects with multiple properties. You can define a field mapping to pick a specific member property you want to return (in this example 'id' member of the 'priority' field): - - { "fields": "summary,priority", "jql": "priority=medium", @@ -86,13 +67,9 @@ return (in this example 'id' member of the 'priority' field): "priority.id": "priority" } } - - Here's a more complex example combining the different filter options: - - { "fields": "summary,priority,customfield_10672,resolutiondate,fixVersions,watches,labels", "jql": "project = MYPROJ AND resolution = unresolved ORDER BY priority DESC, key ASC", @@ -104,7 +81,5 @@ Here's a more complex example combining the different filter options: "fixVersions.id": "my_fix_version_id" } } - - If a field contains a list of values all are returned concatenated with ",". diff --git a/src/pages/kb/data-sources/json-api.md b/src/pages/kb/data-sources/json-api.md index 65d3e0819..f89ac63a3 100644 --- a/src/pages/kb/data-sources/json-api.md +++ b/src/pages/kb/data-sources/json-api.md @@ -30,7 +30,6 @@ This will return the result of the above API call as is. ![](/assets/images/docs/gitbook/json_list_of_objects.png) - ### Return a single object ```yaml @@ -49,8 +48,8 @@ In case you want to pick only specific fields from the resulting object(s), you url: https://api.github.com/repos/getredash/redash/issues fields: [number, title] ``` -![](/assets/images/docs/gitbook/json_field_select.png) +![](/assets/images/docs/gitbook/json_field_select.png) ### Return an inner object @@ -68,7 +67,7 @@ The above query will use the `assignee` objects from the API result as the query You can either craft your own URLs, or you can pass the `params` option: ```yaml -url: "https://api.github.com/search/issues" +url: 'https://api.github.com/search/issues' params: q: is:open type:pr repo:getredash/redash sort: created @@ -78,19 +77,19 @@ params: The above is the same as: ```yaml -url: "https://api.github.com/search/issues?q=+is:open+type:pr+repo:getredash/redash&sort=created&order=desc" +url: 'https://api.github.com/search/issues?q=+is:open+type:pr+repo:getredash/redash&sort=created&order=desc' ``` ### Additional HTTP Options You can pass additional keys to modify various HTTP options: -* `method` - the HTTP method to use (default: `get`) -* `headers` - a dictionary of headers to send with the request -* `auth` - basic authentication username/password (should be passed as an array: `[username, password]`) -* `params` - a dictionary of query string parameters to add to the URL -* `data` - a dictionary of values to use as request body -* `json` - same as `data` except that it's being converted to JSON +- `method` - the HTTP method to use (default: `get`) +- `headers` - a dictionary of headers to send with the request +- `auth` - basic authentication username/password (should be passed as an array: `[username, password]`) +- `params` - a dictionary of query string parameters to add to the URL +- `data` - a dictionary of values to use as request body +- `json` - same as `data` except that it's being converted to JSON # URL Data Source Type @@ -114,22 +113,23 @@ To manipulate the data (filter, sort, aggregate etc.) you can use the [Query Res The returned object must expose two keys: `columns` and `rows`. -+ The `columns` key should expose an array of javascript objects describing the columns to be included in your data set. Each object will include three keys: +- The `columns` key should expose an array of javascript objects describing the columns to be included in your data set. Each object will include three keys: + - `name` - `type` - `friendly_name` -+ `rows` should return an array of javascript objects representing each row of data. The keys for each object should match the `name` keys described in your `columns` array. +- `rows` should return an array of javascript objects representing each row of data. The keys for each object should match the `name` keys described in your `columns` array. The following data types are supported for columns: -+ text -+ integer -+ float -+ boolean -+ string -+ datetime -+ date +- text +- integer +- float +- boolean +- string +- datetime +- date An example of returned data appears below: diff --git a/src/pages/kb/data-sources/supported-data-sources.md b/src/pages/kb/data-sources/supported-data-sources.md index 7bc05b832..806810f37 100644 --- a/src/pages/kb/data-sources/supported-data-sources.md +++ b/src/pages/kb/data-sources/supported-data-sources.md @@ -9,54 +9,53 @@ order: 1 Redash supports the following Data Sources: -| Data Source | Hosted Redash | Self-Hosted Redash | -| ------------------------------------------ | ------------- | ------------------ | -| Amazon Athena | ✓ | ✓ | -| Amazon CloudWatch | ✓ | ✓ | -| Amazon CloudWatch Logs Insights | ✓ | ✓ | -| Amazon DynamoDB | ✓ | ✓ | -| Amazon Redshift | ✓ | ✓ | -| Axibase Time Series Database | ✓ | ✓ | -| Cassandra | ✓ | ✓ | -| ClickHouse | ✓ | ✓ | -| CockroachDB | ✓ | ✓ | -| CSV | ✓ | | -| Databricks | ✓ | ✓ | -| DB2 by IBM | ✓ | ✓ | -| Druid | ✓ | ✓ | -| Elasticsearch | ✓ | ✓ | -| Google Analytics | ✓ | ✓ | -| Google BigQuery | ✓ | ✓ | -| Google Spreadsheets | ✓ | ✓ | -| Graphite | ✓ | ✓ | -| Greenplum | | ✓ | -| Hive | ✓ | ✓ | -| Impala | ✓ | ✓ | -| InfluxDB | ✓ | ✓ | -| JIRA | ✓ | ✓ | -| JSON | ✓ | ✓ | -| Apache Kylin | ✓ | ✓ | -| OmniSciDB (Formerly MapD) | | ✓ | -| MemSQL | ✓ | ✓ | -| Microsoft Azure Data Warehouse / Synapse | ✓ | ✓ | -| Microsoft Azure SQL Database | ✓ | ✓ | -| Microsoft SQL Server | ✓ | ✓ | -| MongoDB | ✓ | ✓ | -| MySQL | ✓ | ✓ | -| Oracle | ✓ | ✓ | -| PostgreSQL | ✓ | ✓ | -| Presto | ✓ | ✓ | -| Prometheus | ✓ | ✓ | -| Python | | ✓ | -| Qubole | ✓ | ✓ | -| Rockset | ✓ | ✓ | -| Salesforce | ✓ | ✓ | -| ScyllaDB | ✓ | ✓ | -| Shell Scripts | | ✓ | -| Snowflake | ✓ | ✓ | -| SQLite | | ✓ | -| TreasureData | ✓ | ✓ | -| Vertica | ✓ | ✓ | -| Yandex AppMetrrica | ✓ | ✓ | -| Yandex Metrica | ✓ | ✓ | - +| Data Source | Hosted Redash | Self-Hosted Redash | +| ---------------------------------------- | ------------- | ------------------ | +| Amazon Athena | ✓ | ✓ | +| Amazon CloudWatch | ✓ | ✓ | +| Amazon CloudWatch Logs Insights | ✓ | ✓ | +| Amazon DynamoDB | ✓ | ✓ | +| Amazon Redshift | ✓ | ✓ | +| Axibase Time Series Database | ✓ | ✓ | +| Cassandra | ✓ | ✓ | +| ClickHouse | ✓ | ✓ | +| CockroachDB | ✓ | ✓ | +| CSV | ✓ | | +| Databricks | ✓ | ✓ | +| DB2 by IBM | ✓ | ✓ | +| Druid | ✓ | ✓ | +| Elasticsearch | ✓ | ✓ | +| Google Analytics | ✓ | ✓ | +| Google BigQuery | ✓ | ✓ | +| Google Spreadsheets | ✓ | ✓ | +| Graphite | ✓ | ✓ | +| Greenplum | | ✓ | +| Hive | ✓ | ✓ | +| Impala | ✓ | ✓ | +| InfluxDB | ✓ | ✓ | +| JIRA | ✓ | ✓ | +| JSON | ✓ | ✓ | +| Apache Kylin | ✓ | ✓ | +| OmniSciDB (Formerly MapD) | | ✓ | +| MemSQL | ✓ | ✓ | +| Microsoft Azure Data Warehouse / Synapse | ✓ | ✓ | +| Microsoft Azure SQL Database | ✓ | ✓ | +| Microsoft SQL Server | ✓ | ✓ | +| MongoDB | ✓ | ✓ | +| MySQL | ✓ | ✓ | +| Oracle | ✓ | ✓ | +| PostgreSQL | ✓ | ✓ | +| Presto | ✓ | ✓ | +| Prometheus | ✓ | ✓ | +| Python | | ✓ | +| Qubole | ✓ | ✓ | +| Rockset | ✓ | ✓ | +| Salesforce | ✓ | ✓ | +| ScyllaDB | ✓ | ✓ | +| Shell Scripts | | ✓ | +| Snowflake | ✓ | ✓ | +| SQLite | | ✓ | +| TreasureData | ✓ | ✓ | +| Vertica | ✓ | ✓ | +| Yandex AppMetrrica | ✓ | ✓ | +| Yandex Metrica | ✓ | ✓ | diff --git a/src/pages/kb/faq/general_category.md b/src/pages/kb/faq/general_category.md index c9af0af5f..868f43da4 100644 --- a/src/pages/kb/faq/general_category.md +++ b/src/pages/kb/faq/general_category.md @@ -7,10 +7,11 @@ layout: kb-category order: 1 --- -## What's Redash? +## What's Redash? Redash is designed to enable anyone, regardless of the level of technical sophistication, to harness the power of data big and small. SQL users leverage Redash to explore, query, visualize, and share data from any data sources. Their work in turn enables anybody in their organization to use the data. Every day, millions of users at thousands of organizations around the world use Redash to develop insights and make data-driven decisions. Redash features: + 1. **Browser-based**: Everything in your browser, with a shareable URL. 2. **Ease-of-use**: Become immediately productive with data without the need to master complex software. 3. **Query editor**: Quickly compose SQL and NoSQL queries with a schema browser and auto-complete. @@ -33,4 +34,3 @@ Source/Self-Hosted version of Redash then for this, you'll need a Linux server We recommend using Chrome or Firefox. If you encounter any issues that are browser specific, please let us know. - diff --git a/src/pages/kb/open-source/admin-guide/usage-data.md b/src/pages/kb/open-source/admin-guide/usage-data.md index 686b075cd..2148be27c 100644 --- a/src/pages/kb/open-source/admin-guide/usage-data.md +++ b/src/pages/kb/open-source/admin-guide/usage-data.md @@ -11,8 +11,8 @@ helps us better direct future product efforts. The information we will be sending is: -* Number of users, queries, dashboards, alerts, widgets and visualizations. -* Types of data sources, alert destinations and visualizations. +- Number of users, queries, dashboards, alerts, widgets and visualizations. +- Types of data sources, alert destinations and visualizations. An example JSON payload that is being sent to us: @@ -21,23 +21,23 @@ An example JSON payload that is being sent to us: "current_version": "8-beta.2", "usage": { "users_count": 1, - "queries_count": 4, - "dashboards_count": 1, - "widgets_count": 1, - "textbox_count": 0, - "alerts_count": 0, + "queries_count": 4, + "dashboards_count": 1, + "widgets_count": 1, + "textbox_count": 0, + "alerts_count": 0, "data_sources": { - "pg": 1, + "pg": 1, "redshift": 1 - }, + }, "visualization_types": { - "TABLE": 4, + "TABLE": 4, "COUNTER": 5 - }, + }, "destination_types": { 'slack': 1, 'webhook': 2 } } } -``` \ No newline at end of file +``` diff --git a/src/pages/kb/open-source/dev-guide/debugging.md b/src/pages/kb/open-source/dev-guide/debugging.md index e29cdb5eb..38755fb9a 100644 --- a/src/pages/kb/open-source/dev-guide/debugging.md +++ b/src/pages/kb/open-source/dev-guide/debugging.md @@ -8,15 +8,18 @@ slug: debugging If you've followed [Docker Based Developer Installation Guide]({% link _kb/open-source/dev-guide/docker.md %}), your Redash server is running inside a Docker container and cannot be debugged directly. If you wish to debug server code, you will need to use remote debugging. ## Initial Setup + 1. Make sure you have the [Python Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python) installed. 2. Install ptvsd: `pip install ptvsd` ## Starting a Debugging Session + 1. In a terminal window, run `docker-compose stop server && docker-compose run --rm --service-ports server debug && docker-compose start server` 2. Switch over to Visual Studio Code and select "View -> Debug" 3. Select the "Python: Remote Attach" configuration 4. Start debugging (F5) ## Notes -* Once you hit Ctrl+C, the regular development server (with autoreload) will relaunch. -* Code reloading is not supported during a debugging session, so if you'd like to make changes, hit Ctrl+C in the terminal and restart from step 1. \ No newline at end of file + +- Once you hit Ctrl+C, the regular development server (with autoreload) will relaunch. +- Code reloading is not supported during a debugging session, so if you'd like to make changes, hit Ctrl+C in the terminal and restart from step 1. diff --git a/src/pages/kb/open-source/dev-guide/remote-server.md b/src/pages/kb/open-source/dev-guide/remote-server.md index c3a7f8ad2..68ee2ed7a 100644 --- a/src/pages/kb/open-source/dev-guide/remote-server.md +++ b/src/pages/kb/open-source/dev-guide/remote-server.md @@ -1,8 +1,7 @@ --- category: dev-guide parent_category: open-source -title: - Using a Remote Server and Installing Locally only the Frontend Dependencies +title: Using a Remote Server and Installing Locally only the Frontend Dependencies slug: remote-server --- diff --git a/src/pages/kb/user-guide/alerts/alert-multiple-columns.md b/src/pages/kb/user-guide/alerts/alert-multiple-columns.md index 4e8db3ae6..ac267e05e 100644 --- a/src/pages/kb/user-guide/alerts/alert-multiple-columns.md +++ b/src/pages/kb/user-guide/alerts/alert-multiple-columns.md @@ -3,27 +3,24 @@ category: alerts parent_category: user-guide helpscout_url: https://help.redash.io/article/70-alert-multiple-columns keywords: -- Multiple Columns -- Alert Multiple Columns -- Alert -- '' + - Multiple Columns + - Alert Multiple Columns + - Alert + - '' title: Multiple Column Alert slug: alert-multiple-columns --- + There's an indirect way to set an Alert based on multiple columns of a query: Your query can implement the alert logic and return a boolean value for the Alert to trigger on. Something like: - - SELECT CASE WHEN drafts_count > 10000 AND archived_count > 5000 THEN 1 ELSE 0 END FROM ( SELECT sum(CASE WHEN is_archived THEN 1 ELSE 0 END) AS archived_count, sum(CASE WHEN is_draft THEN 1 ELSE 0 END) AS drafts_count FROM queries) data - This query will return 1 when drafts_count > 10000 and archived_count > 5000\. Then you can configure the alert to trigger when the value is 1. - diff --git a/src/pages/kb/user-guide/alerts/creating-new-alert-destination.md b/src/pages/kb/user-guide/alerts/creating-new-alert-destination.md index a7251a4bd..8bcfc72d3 100644 --- a/src/pages/kb/user-guide/alerts/creating-new-alert-destination.md +++ b/src/pages/kb/user-guide/alerts/creating-new-alert-destination.md @@ -1,7 +1,7 @@ --- category: alerts parent_category: user-guide -helpscout_url: +helpscout_url: title: Adding New Alert Destinations slug: creating-new-alert-destination order: 3 @@ -10,9 +10,9 @@ toc: true # Intro -Whenever an Alert triggers, it sends a blob of related data (called the Alert Template) to its designated **Alert Destinations**. Destinations can use this blob of data to fire off emails, Slack messages, or custom web hooks. You can set up new Alert Destinations from the settings screen. +Whenever an Alert triggers, it sends a blob of related data (called the Alert Template) to its designated **Alert Destinations**. Destinations can use this blob of data to fire off emails, Slack messages, or custom web hooks. You can set up new Alert Destinations from the settings screen. -![](/assets/images/docs/gitbook/create-new-alert-destination.png) +![](/assets/images/docs/gitbook/create-new-alert-destination.png) {% callout warning %} @@ -24,14 +24,14 @@ Only Admins can add new alert destinations. Destinations are available to all us There are a few types of destinations to choose from: -* Email -* Slack -* PagerDuty -* Mattermost -* Google Hangouts Chat -* HipChat -* ChatWork -* Generic WebHook +- Email +- Slack +- PagerDuty +- Mattermost +- Google Hangouts Chat +- HipChat +- ChatWork +- Generic WebHook {% callout info %} @@ -47,7 +47,7 @@ To configure one, select it from **Create a New Alert Destination** dialogue and First you need to obtain the PagerDuty Integration Key from your PagerDuty console. -Services > Service Details > Integrations +Services > Service Details > Integrations ![](/assets/images/docs/alerts/pagerduty-key-location.png) diff --git a/src/pages/kb/user-guide/alerts/setting-up-an-alert-V8-and-earlier.md b/src/pages/kb/user-guide/alerts/setting-up-an-alert-V8-and-earlier.md index 88651e91f..7bfb6941a 100644 --- a/src/pages/kb/user-guide/alerts/setting-up-an-alert-V8-and-earlier.md +++ b/src/pages/kb/user-guide/alerts/setting-up-an-alert-V8-and-earlier.md @@ -3,13 +3,13 @@ category: alerts parent_category: user-guide toc: True keywords: -- Set up Alert -- setup alert -- setup an alert -- queries with parameters -- trigger alert -- alert destinations -- alert destination + - Set up Alert + - setup alert + - setup an alert + - queries with parameters + - trigger alert + - alert destinations + - alert destination title: Setting Up An Alert (V8 and Earlier) slug: setting-up-an-alert-v8 order: 500 @@ -53,10 +53,10 @@ Use the settings panel to configure your alert: ![](/assets/images/docs/gitbook/alerts_settings.png) -* **Value Column** is the column in your query result that you would like to watch. -* **Op** is short for "Operator". You can choose greater than, less than, or equal to. -* **Reference** is the absolute value that your _Value Column_ will be compared to. The most recent query result is shown as the **Value** -* **Rearm seconds** effects how frequently you will receive notifications when your query meets the Alert criteria and does not change. See further discussion below. +- **Value Column** is the column in your query result that you would like to watch. +- **Op** is short for "Operator". You can choose greater than, less than, or equal to. +- **Reference** is the absolute value that your _Value Column_ will be compared to. The most recent query result is shown as the **Value** +- **Rearm seconds** effects how frequently you will receive notifications when your query meets the Alert criteria and does not change. See further discussion below. Save your alert. After you do this, you can add an [alert destination]({% link _kb/user-guide/alerts/creating-new-alert-destination.md %}). If you skip this step you will not be notified when the alert is triggered. @@ -66,21 +66,21 @@ Save your alert. After you do this, you can add an [alert destination]({% link _ The status of your Alert criteria is checked every time the query is executed. Alerts have three possible statuses: -* `TRIGGERED` means that your query matched the criteria defined in your alert configuration. If you set your alert to trigger when the value of "cats" is greater than 1500 as long as it's above 1500 your alert is triggered. -* `OK` means that the most recent query execution did not match the criteria defined in your alert. This doesn't mean that the Alert has not been triggered previously. If your "cats" value is now 1470 your alert will show as OK. -* `UNKNOWN` means Redash does not have enough data to evaluate the alert criteria. You should see this status immediately after creating your Alert until the query has executed. The Alert will also show this status if there was no data in the query result or if the most recent query result doesn't have the configured _Value Column_. +- `TRIGGERED` means that your query matched the criteria defined in your alert configuration. If you set your alert to trigger when the value of "cats" is greater than 1500 as long as it's above 1500 your alert is triggered. +- `OK` means that the most recent query execution did not match the criteria defined in your alert. This doesn't mean that the Alert has not been triggered previously. If your "cats" value is now 1470 your alert will show as OK. +- `UNKNOWN` means Redash does not have enough data to evaluate the alert criteria. You should see this status immediately after creating your Alert until the query has executed. The Alert will also show this status if there was no data in the query result or if the most recent query result doesn't have the configured _Value Column_. Redash sends notifications to your chosen Alert Destinations whenever it detects that the Alert status has changed from `OK` to `TRIGGERED` or vice versa. Consider this example where an Alert is configured on a query that is scheduled to run once daily. The daily status of the Alert appears in the table below. Prior to Monday the alert status was `OK`. -| Day | Alert Status | -|-----------|--------------| -| Monday | OK | -| Tuesday | OK | -| Wednesday | TRIGGERED | -| Thursday | TRIGGERED | -| Friday | TRIGGERED | -| Saturday | TRIGGERED | -| Sunday | OK | +| Day | Alert Status | +| --------- | ------------ | +| Monday | OK | +| Tuesday | OK | +| Wednesday | TRIGGERED | +| Thursday | TRIGGERED | +| Friday | TRIGGERED | +| Saturday | TRIGGERED | +| Sunday | OK | By default, Redash would send a notification on Wednesday when the status changed from `OK` to `TRIGGERED` and again on Sunday when it switches back. It will not send alerts on Thursday, Friday, or Saturday unless you specifically configure it to do so because the Alert status did not change between executions on those days. @@ -108,25 +108,25 @@ For a query that executes every 24 hours, any _Rearm seconds_ value between 1 an Imagine you set an Alert on a query that executes every fifteen minutes. You have configured _Rearm seconds_ equal to `3600` (one hour). This guarantees that you will receive a status notification once an hour if the status is `TRIGGERED`. But you will also receive a notification if the status changes. The one hour rearm prevents Redash from sending you a notification every fifteen minutes while the Alert is triggered. So in the below time-line: -| Time | Alert Status | -|----------|--------------| -| 8:00 AM | OK | -| 8:15 AM | OK | -| 8:30 AM | TRIGGERED | -| 8:45 AM | TRIGGERED | -| 9:00 AM | TRIGGERED | -| 9:15 AM | TRIGGERED | -| 9:30 AM | TRIGGERED | -| 9:45 AM | OK | -| 10:00 AM | TRIGGERED | +| Time | Alert Status | +| -------- | ------------ | +| 8:00 AM | OK | +| 8:15 AM | OK | +| 8:30 AM | TRIGGERED | +| 8:45 AM | TRIGGERED | +| 9:00 AM | TRIGGERED | +| 9:15 AM | TRIGGERED | +| 9:30 AM | TRIGGERED | +| 9:45 AM | OK | +| 10:00 AM | TRIGGERED | You would receive the following notifications: -| Alert Time | Alert Message | Reason | -|------------|---------------------|-------------------| -| 8:30 AM | Status is TRIGGERED | Status changed | -| 9:30 AM | Status is TRIGGERED | Alert was rearmed | -| 9:45 AM | Status is OK | Status changed | -| 10:00 AM | Status is TRIGGERED | Status changed | +| Alert Time | Alert Message | Reason | +| ---------- | ------------------- | ----------------- | +| 8:30 AM | Status is TRIGGERED | Status changed | +| 9:30 AM | Status is TRIGGERED | Alert was rearmed | +| 9:45 AM | Status is OK | Status changed | +| 10:00 AM | Status is TRIGGERED | Status changed | Importantly, assuming the alert was not triggered at all during the nine o'clock hour, the next alert would not arrive until 9:55 AM, the next scheduled query execution after the _Rearm seconds_ was completed. diff --git a/src/pages/kb/user-guide/dashboards/favorites-tagging.md b/src/pages/kb/user-guide/dashboards/favorites-tagging.md index 4eb68a875..fad5e6d9f 100644 --- a/src/pages/kb/user-guide/dashboards/favorites-tagging.md +++ b/src/pages/kb/user-guide/dashboards/favorites-tagging.md @@ -3,13 +3,12 @@ category: dashboards parent_category: user-guide title: Favorites & Tagging slug: favorites-tagging - # ----------------------------- # *********** NOTE ************ # ----------------------------- # This page is duplicated from # the querying category. Jekyll -# has no convenient way to link +# has no convenient way to link # it twice in the user guide. # Changes to either file should # be pasted into the file that @@ -22,10 +21,11 @@ Redash users write a lot of queries and dashboards! Favorites and Tagging are he ## Favorites -You can favorite a dashboard or query by clicking the star to the left of its title anywhere in Redash. The star will turn yellow to indicate success. Your favorites are displayed at several places in Redash. They appear on the homepage, in the navbar dropdown menus and as filters in the query or dashboard list views. +You can favorite a dashboard or query by clicking the star to the left of its title anywhere in Redash. The star will turn yellow to indicate success. Your favorites are displayed at several places in Redash. They appear on the homepage, in the navbar dropdown menus and as filters in the query or dashboard list views. ## Tagging + You can tag queries and queries by subject matter, location, user or any parameter that is meaningful to your organization. Tags are added from the query editor or the dashboard editor. Hover your mouse on the query or dashboard title and an `+Add Tag` button will appear. In the modal that appears you can select as many tags as you need. The modal will suggest previously-used tags as you type. Hit `Save` when you're finished or `Esc` to abort tagging. {% callout info %} @@ -34,4 +34,4 @@ It's important to have predictable taxonomy for your tags. Consistency in this a -Your tags will appear on the Dashboard and Query list views on the righthand side. Click any tag to filter the list view instantly. Click a second time to remove the filter. `Shift + Click` to select multiple filters. \ No newline at end of file +Your tags will appear on the Dashboard and Query list views on the righthand side. Click any tag to filter the list view instantly. Click a second time to remove the filter. `Shift + Click` to select multiple filters. diff --git a/src/pages/kb/user-guide/integrations-and-api/api.md b/src/pages/kb/user-guide/integrations-and-api/api.md index 7a5a1f0e2..76943e066 100644 --- a/src/pages/kb/user-guide/integrations-and-api/api.md +++ b/src/pages/kb/user-guide/integrations-and-api/api.md @@ -11,8 +11,8 @@ slug: api All the API calls support authentication with an API key. Redash has two types of API keys: - * User API Key: has the same permissions as the user who owns it. Can be found on a user profile page. - * Query API Key: has access only to the query and its results. Can be found on the query page. +- User API Key: has the same permissions as the user who owns it. Can be found on a user profile page. +- Query API Key: has access only to the query and its results. Can be found on the query page. Whenever possible we recommend using a Query API key. @@ -20,10 +20,9 @@ Whenever possible we recommend using a Query API key. We provide a light wrapper around the Redash API called `redash-toolbelt`. It's a work-in-progress. The source code is hosted on [Github](https://github.com/getredash/redash-toolbelt). The `examples` folder in that repo includes useful demos, such as: -+ [Poll for Fresh Query Results (including parameters)](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/refresh_query.py) -+ [Refresh an entire Dashboard](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/refresh_dashboard.py) -+ [Export all your queries as files](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/query_export.py) - +- [Poll for Fresh Query Results (including parameters)](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/refresh_query.py) +- [Refresh an entire Dashboard](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/refresh_dashboard.py) +- [Export all your queries as files](https://github.com/getredash/redash-toolbelt/blob/master/redash_toolbelt/examples/query_export.py) ## Common Endpoints @@ -39,35 +38,31 @@ Each endpoint is appended to your Redash base URL. For example: ### Queries `/api/queries` -+ GET: Returns a paginated array of query objects. - - Includes the most recent `query_result_id` for non-parameterized queries. -+ POST: Create a new query object -`/api/queries/` -+ GET: Returns an individual query object -+ POST: Edit an existing query object. -+ DELETE: Archive this query. +- GET: Returns a paginated array of query objects. + - Includes the most recent `query_result_id` for non-parameterized queries. +- POST: Create a new query object +`/api/queries/` +- GET: Returns an individual query object +- POST: Edit an existing query object. +- DELETE: Archive this query. `/api/queries//results` - -+ GET: Get a cached result for this query ID. - - Only works for non parameterized queries. If you attempt to GET results -for a parameterized query you'll receive the error: `no cached result found +- GET: Get a cached result for this query ID. - Only works for non parameterized queries. If you attempt to GET results + for a parameterized query you'll receive the error: `no cached result found for this query`. See POST instructions for this endpoint to get results for -parameterized queries. - -+ POST: Initiates a new query execution or returns a cached result. - - The API prefers to return a cached result. If a cached result is not -available then a new execution job begins and the job object is returned. To -bypass a stale cache, include a `max_age` key which is an integer number of -seconds. If the cached result is older than `max_age`, the cache is ignored -and a new execution begins. If you set `max_age` to `0` this guarantees a new -execution. - - If passing parameters, they must be included in the JSON request body as -a `parameters` object. + parameterized queries. + +- POST: Initiates a new query execution or returns a cached result. - The API prefers to return a cached result. If a cached result is not + available then a new execution job begins and the job object is returned. To + bypass a stale cache, include a `max_age` key which is an integer number of + seconds. If the cached result is older than `max_age`, the cache is ignored + and a new execution begins. If you set `max_age` to `0` this guarantees a new + execution. - If passing parameters, they must be included in the JSON request body as + a `parameters` object. {% callout info %} @@ -92,31 +87,35 @@ Here's an example JSON object including different parameter types: ### Jobs `/api/jobs/` -+ GET: Returns a query task result (job) - + Possible statuses: - - 1 == PENDING (waiting to be executed) - - 2 == STARTED (executing) - - 3 == SUCCESS - - 4 == FAILURE - - 5 == CANCELLED - + When status is success, the job will include a `query_result_id` + +- GET: Returns a query task result (job) + - Possible statuses: + - 1 == PENDING (waiting to be executed) + - 2 == STARTED (executing) + - 3 == SUCCESS + - 4 == FAILURE + - 5 == CANCELLED + - When status is success, the job will include a `query_result_id` ### Query Results `/api/query_results/` -+ GET: Returns a query result - - Appending a filetype of `.csv` or `.json` to this request will return a downloadable file. If you append your `api_key` in the query string, this link will work for non-logged-in users. + +- GET: Returns a query result + - Appending a filetype of `.csv` or `.json` to this request will return a downloadable file. If you append your `api_key` in the query string, this link will work for non-logged-in users. ### Dashboards `/api/dashboards` -+ GET: Returns a paginated array of dashboard objects. -+ POST: Create a new dashboard object + +- GET: Returns a paginated array of dashboard objects. +- POST: Create a new dashboard object `/api/dashboards/` -+ GET: Returns an individual dashboard object. -+ DELETE: Archive this dashboard + +- GET: Returns an individual dashboard object. +- DELETE: Archive this dashboard `/api/dashboards/` -+ POST: Edit an existing dashboard object. +- POST: Edit an existing dashboard object. diff --git a/src/pages/kb/user-guide/querying/download-query-results.md b/src/pages/kb/user-guide/querying/download-query-results.md index 30e7ffbf4..f82711b5f 100644 --- a/src/pages/kb/user-guide/querying/download-query-results.md +++ b/src/pages/kb/user-guide/querying/download-query-results.md @@ -29,5 +29,3 @@ It's not shown in the interface, but you can also get the Excel format by changi The latest results API is not supported for queries that use parameters. {% endcallout %} - - diff --git a/src/pages/kb/user-guide/querying/favorites-tagging.md b/src/pages/kb/user-guide/querying/favorites-tagging.md index 5034103f8..76b32655d 100644 --- a/src/pages/kb/user-guide/querying/favorites-tagging.md +++ b/src/pages/kb/user-guide/querying/favorites-tagging.md @@ -3,13 +3,12 @@ category: querying parent_category: user-guide title: Favorites & Tagging slug: favorites-tagging - # ----------------------------- # *********** NOTE ************ # ----------------------------- # This page is duplicated in the # dashboards category. Jekyll -# has no convenient way to link +# has no convenient way to link # it twice in the user guide. # Changes to either file should # be pasted into the file that @@ -22,10 +21,11 @@ Redash users write a lot of queries and dashboards! Favorites and Tagging are he ## Favorites -You can favorite a dashboard or query by clicking the star to the left of its title anywhere in Redash. The star will turn yellow to indicate success. Your favorites are displayed at several places in Redash. They appear on the homepage, in the navbar dropdown menus and as filters in the query or dashboard list views. +You can favorite a dashboard or query by clicking the star to the left of its title anywhere in Redash. The star will turn yellow to indicate success. Your favorites are displayed at several places in Redash. They appear on the homepage, in the navbar dropdown menus and as filters in the query or dashboard list views. ## Tagging + You can tag queries and queries by subject matter, location, user or any parameter that is meaningful to your organization. Tags are added from the query editor or the dashboard editor. Hover your mouse on the query or dashboard title and an `+Add Tag` button will appear. In the modal that appears you can select as many tags as you need. The modal will suggest previously-used tags as you type. Hit `Save` when you're finished or `Esc` to abort tagging. {% callout info %} @@ -34,4 +34,4 @@ It's important to have predictable taxonomy for your tags. Consistency in this a -Your tags will appear on the Dashboard and Query list views on the righthand side. Click any tag to filter the list view instantly. Click a second time to remove the filter. `Shift + Click` to select multiple filters. \ No newline at end of file +Your tags will appear on the Dashboard and Query list views on the righthand side. Click any tag to filter the list view instantly. Click a second time to remove the filter. `Shift + Click` to select multiple filters. diff --git a/src/pages/kb/user-guide/querying/query-results-data-source.md b/src/pages/kb/user-guide/querying/query-results-data-source.md index d560d1743..aa16352fa 100644 --- a/src/pages/kb/user-guide/querying/query-results-data-source.md +++ b/src/pages/kb/user-guide/querying/query-results-data-source.md @@ -7,7 +7,7 @@ slug: query-results-data-source order: 2 --- -The **Query Results Data Source** (QRDS) lets you run queries against results from your other Data Sources. Use it to join data from multiple databases or perform post-processing. Redash uses an in-memory SQLite database to make this possible. As a result, queries against large result sets may fail if Redash runs out of memory. +The **Query Results Data Source** (QRDS) lets you run queries against results from your other Data Sources. Use it to join data from multiple databases or perform post-processing. Redash uses an in-memory SQLite database to make this possible. As a result, queries against large result sets may fail if Redash runs out of memory. {% callout warning %} @@ -16,7 +16,8 @@ The QRDS doesn't work with results from queries that use [parameters](/help/user {% endcallout %} ### Setup -You can enable **Query Results** under the `Data Source` tab of the settings menu. Setup is easy: just provide a name for the source. + +You can enable **Query Results** under the `Data Source` tab of the settings menu. Setup is easy: just provide a name for the source. ![](/assets/images/docs/gitbook/query-results-setup.png) @@ -29,15 +30,15 @@ This is the name that will appear in the source dropdown on the left of the quer Most organizations only require **one** Query Results data source. {% endcallout %} - ### Querying + The QRDS accepts [SQLite query syntax](https://sqlite.org/lang.html): ``` SELECT a.name, - b.count -FROM query_123 AS a + b.count +FROM query_123 AS a JOIN query_456 AS b ON a.id = b.id ``` @@ -49,18 +50,20 @@ The query alias like `query_49588` _must_ appear on the same line as its associa {% endcallout %} ### Cached Query Results + When you query the **Query Results Data Source**, Redash executes the underlying queries first. This guarantees recent results in case you [schedule a QRDS query](/help/user-guide/querying/scheduling-a-query). You can speed up QRDS queries by using `cached_query_` for your query aliases instead of `query_`. This tells Redash to use the cached results from the most recent execution of a given query. This improves performance by using older data. You can mix both syntaxes in the same query too: ``` SELECT a.name, - b.count -FROM cached_query_123 AS a + b.count +FROM cached_query_123 AS a JOIN query_456 AS b ON a.id = b.id ``` ### Query Results Permissions + Access to the **Query Results Data Source** is governed by the groups it's associated with [like any other Data Source](/help/user-guide/users/permissions-groups). But Redash will also check if a user has permission to execute queries on the Data Sources the original queries use. -As an example, a user with access to the QRDS cannot execute `SELECT * FROM query_123` if query `123` uses a data source to which that user does not have access. They will see the most recently cached QRDS query result from the query screen in Redash. But they will not be able to execute the query again. \ No newline at end of file +As an example, a user with access to the QRDS cannot execute `SELECT * FROM query_123` if query `123` uses a data source to which that user does not have access. They will see the most recently cached QRDS query result from the query screen in Redash. But they will not be able to execute the query again. diff --git a/src/pages/kb/user-guide/querying/query-snippets.md b/src/pages/kb/user-guide/querying/query-snippets.md index 652df4f12..81e4cabca 100644 --- a/src/pages/kb/user-guide/querying/query-snippets.md +++ b/src/pages/kb/user-guide/querying/query-snippets.md @@ -16,7 +16,7 @@ Here's an example for a simple snippet: ``` JOIN organizations org ON org.id = ${1:table}.org_id -``` +``` ## Insertion Points @@ -26,21 +26,22 @@ JOIN organizations org ON org.id = ${1:table}.org_id You can use the placeholder text as a desirable default value for the user to override at runtime. {% endcallout %} -You designate insertion points by wrapping an integer tab order with a single dollar sign and curly braces `${}`. A text placeholder preceded by a colon `:` is optional but useful for users unfamiliar with your snippet. +You designate insertion points by wrapping an integer tab order with a single dollar sign and curly braces `${}`. A text placeholder preceded by a colon `:` is optional but useful for users unfamiliar with your snippet. When Redash renders this snippet: - AND (invoices.complete IS NULL OR invoices.complete <> '${2}') - AND (invoices.canceled IS NULL OR invoices.canceled <> '${1}') - AND (invoices.modified IS NULL OR invoices.modified_date <> '${0: this_date}') + AND (invoices.complete IS NULL OR invoices.complete <> '${2}') + AND (invoices.canceled IS NULL OR invoices.canceled <> '${1}') + AND (invoices.modified IS NULL OR invoices.modified_date <> '${0: this_date}') -The text insertion carat will jump to the second line between the quote marks `''`. When the user presses `Tab` the carat will jump *backwards* onto the first line. When the user presses `Tab` again, the carat will jump to the third line and `this_date` will be highlighted to prompt the user for the desired value. +The text insertion carat will jump to the second line between the quote marks `''`. When the user presses `Tab` the carat will jump _backwards_ onto the first line. When the user presses `Tab` again, the carat will jump to the third line and `this_date` will be highlighted to prompt the user for the desired value. {% callout info %} -An insertion point of zero `${0}` is always the *last* point in the tab order. +An insertion point of zero `${0}` is always the _last_ point in the tab order. {% endcallout %} ## Insert A Query Snippet + If you have Live Auto Complete enabled, you can invoke your snippet from the Query Editor by typing the trigger word you defined in the Query Snippet editor. Auto Complete will suggest it like any other keyword in your database. {% callout warning %} @@ -49,6 +50,6 @@ If Live Auto Complete is disabled, you can still invoke Query Snippets by pressi Here are some other ideas for snippets: - * Frequent `JOIN` statements - * Complicated clauses like `WITH` or `CASE`. - * [Conditional Formatting](https://discuss.redash.io/t/conditional-formatting-general-text-formatting/1706/1) \ No newline at end of file +- Frequent `JOIN` statements +- Complicated clauses like `WITH` or `CASE`. +- [Conditional Formatting](https://discuss.redash.io/t/conditional-formatting-general-text-formatting/1706/1) diff --git a/src/pages/kb/user-guide/querying/scheduling-a-query.md b/src/pages/kb/user-guide/querying/scheduling-a-query.md index 312452943..0663f2f5f 100644 --- a/src/pages/kb/user-guide/querying/scheduling-a-query.md +++ b/src/pages/kb/user-guide/querying/scheduling-a-query.md @@ -20,7 +20,7 @@ Your query will run automatically once a schedule is set. {% callout info %} When you schedule queries to run -at a certain time-of-day, Redash converts your selection to UTC using your computer's local timezone. +at a certain time-of-day, Redash converts your selection to UTC using your computer's local timezone. That means if you want a query to run at a certain time in UTC, you need to adjust the picker by your local offset. For example, if you want a query to execute at `00:00` UTC each day but your current timezone is CDT (UTC-5), you should enter `19:00` into the scheduler. The UTC value is displayed to the right of your selection to help @@ -31,7 +31,7 @@ confirm your math. {% callout warning %} Scheduling queries that use parameters is not currently supported. You can use -the [Redash API]({% link _kb/user-guide/integrations-and-api/api.md %}) and a +the [Redash API]({% link _kb/user-guide/integrations-and-api/api.md %}) and a scheduling system like CRON instead. {% endcallout %} @@ -40,6 +40,6 @@ scheduling system like CRON instead. Redash V8 added the ability to email query owners once per hour if one or more queries failed. These emails continue until there are no more failures. Failure report emails run on an independent process from the actual query schedules. It may take up to an hour after a failed query execution before Redash sends the failure report. -You can toggle failure reports from your organizations settings. Under **Feature Flags** check **Email query owners when scheduled queries fail**. +You can toggle failure reports from your organizations settings. Under **Feature Flags** check **Email query owners when scheduled queries fail**. - \ No newline at end of file + diff --git a/src/pages/kb/user-guide/querying/writing-queries.md b/src/pages/kb/user-guide/querying/writing-queries.md index 6dc75e291..286f39a8b 100644 --- a/src/pages/kb/user-guide/querying/writing-queries.md +++ b/src/pages/kb/user-guide/querying/writing-queries.md @@ -49,7 +49,7 @@ Live Auto Complete is enabled by default unless your database schema exceeds fiv {% endcallout %} -Auto Complete looks for schema tokens, query syntax identifiers (like `SELECT` or `JOIN`) and the titles of [Query Snippets]({% link _kb/user-guide/querying/query-snippets %}) +Auto Complete looks for schema tokens, query syntax identifiers (like `SELECT` or `JOIN`) and the titles of [Query Snippets]({% link _kb/user-guide/querying/query-snippets %}) # Query Settings @@ -61,12 +61,11 @@ To publish a query, change its name or click the `Publish` button. You can toggl {% callout info %} -Publishing or un-publishing a query does not affect its visibility. -All queries in your organization are visible to all logged-in users. +Publishing or un-publishing a query does not affect its visibility. +All queries in your organization are visible to all logged-in users. {% endcallout %} - ## Archiving a Query You can't delete queries in Redash. But you can archive them. Archiving is like deleting, except **direct links to the query still work.** To archive a query, open the vertical ellipsis menu at the top-right of the query editor and click Archive. @@ -90,4 +89,3 @@ Now the Query Editor options menu includes a `Manage Permissions` option. Clicki ![](/assets/images/docs/gitbook/experimental-permissions-button.png) Please note that currently the users you add won't receive a notification, so you will need to notify them manually. - diff --git a/src/pages/kb/user-guide/users/creating-editing-groups.md b/src/pages/kb/user-guide/users/creating-editing-groups.md index 50eb0941a..15e3fa790 100644 --- a/src/pages/kb/user-guide/users/creating-editing-groups.md +++ b/src/pages/kb/user-guide/users/creating-editing-groups.md @@ -5,9 +5,11 @@ helpscout_url: https://help.redash.io/article/72-creating-editing-groups title: Group Management slug: creating-editing-groups --- + Users of Redash can be members of one or more groups. Each new user is added to the `Default` group automatically. Members of `Admin` can create new groups, add and remove members from groups, and disable users from accessing Redash entirely. Each group can be connected to specific data sources. Read more about group permissions [here]({% link _kb/user-guide/users/permissions-groups.md %}). ## Creating & Editing Groups + Only members of `Admin` can edit or create groups. Go to `Settings > Groups` and hit **New Group**. Type a name for your new group and the continue. ![](/assets/images/docs/gitbook/group_settings.png) @@ -36,4 +38,4 @@ Disabled users cannot login to Redash. You can re-enable a disabled user by find {% callout info %} The `Disabled` tab does not appear unless you have at least one disabled user. -{% endcallout %} \ No newline at end of file +{% endcallout %} diff --git a/src/pages/kb/user-guide/visualizations/cohort-howto.md b/src/pages/kb/user-guide/visualizations/cohort-howto.md index f04716346..c130b79fa 100644 --- a/src/pages/kb/user-guide/visualizations/cohort-howto.md +++ b/src/pages/kb/user-guide/visualizations/cohort-howto.md @@ -21,9 +21,8 @@ While there are many ways to define the stages of a Cohort analysis, Redash's su Redash expects your input samples to take the following format: -| Cohort Date | Period | Count Satisfying Target | Total Cohort Size | -|-------------|------------|----------------------------|-------------------| - +| Cohort Date | Period | Count Satisfying Target | Total Cohort Size | +| ----------- | ------ | ----------------------- | ----------------- | - **Cohort Date** is the date that uniquely identifies a cohort. Suppose you're visualizing monthly user activity by sign-up date, your cohort date for all users that signed-up in January 2018 would be January 1st, 2018. The cohort date for any user that signed-up in February would be February 1st, 2018. - **Period** is a count of how many periods transpired since the cohort date as of this sample. If you are grouping users by sign-up month, then your period will be the count of months since these users signed up. In the above example, a measurement of activity in July for users that signed up in January would yield a period value of 7 because seven periods have transpired between January and July. diff --git a/src/pages/kb/user-guide/visualizations/pivot-table-visualizations.md b/src/pages/kb/user-guide/visualizations/pivot-table-visualizations.md index a6eb6caae..6489dc1e1 100644 --- a/src/pages/kb/user-guide/visualizations/pivot-table-visualizations.md +++ b/src/pages/kb/user-guide/visualizations/pivot-table-visualizations.md @@ -7,8 +7,8 @@ slug: pivot-table-visualizations # IMG BASE URL /assets/images/docs/gitbook/ --- +# Intro -# Intro Redash's pivot table visualization can aggregate records from a query result into a new tabular display. It's similar to `PIVOT` or `GROUP BY` statements in SQL. But the visualization is configured with drag-and-drop fields instead of SQL code. # Step 1: Write a query @@ -25,7 +25,7 @@ Save the query. Click **New Visualization** and choose **Pivot Table** as the visualization type. The visualization preview on the right will update to show a pivot table. -All the field aliases from your query result become available at the top of the pivot control surface. You can drag these to the *row* side or the *column* side. You can also nest them. +All the field aliases from your query result become available at the top of the pivot control surface. You can drag these to the _row_ side or the _column_ side. You can also nest them. Here are some examples using the grade data above: @@ -33,6 +33,6 @@ Here are some examples using the grade data above: {% callout warning %} -Pivot table performance can degrade if your query result is too big. The exact size threshold will depend on the computer and browser from which you access Redash. But in general, performance is best below 50,000 *fields*. That could mean 10,000 records with 5 fields each. Or 1,000 records with 50 fields each. +Pivot table performance can degrade if your query result is too big. The exact size threshold will depend on the computer and browser from which you access Redash. But in general, performance is best below 50,000 _fields_. That could mean 10,000 records with 5 fields each. Or 1,000 records with 50 fields each. -{% endcallout %} \ No newline at end of file +{% endcallout %} diff --git a/src/pages/kb/user-guide/visualizations/table-visualizations.md b/src/pages/kb/user-guide/visualizations/table-visualizations.md index f2009d91e..3f358c8ea 100644 --- a/src/pages/kb/user-guide/visualizations/table-visualizations.md +++ b/src/pages/kb/user-guide/visualizations/table-visualizations.md @@ -20,7 +20,8 @@ To get started, click the `Edit Visualization` button under the table view. A se ![](/assets/images/docs/gitbook/table-viz-options.png) -You can: +You can: + - **Reorder Columns** by dragging them to the left or right as shown in the yellow highlight. - **Hide Columns** by toggling the check mark highlighted in green - **Format Columns** using the format settings highlighted red. Read more about column formatting below. @@ -52,16 +53,16 @@ Redash also supports data types outside the common database specifications. - **JSON Documents** - If you're underlying data returns JSON formatted text in a field, you can instruct Redash to display it as such. This lets you collapse and expand elements in a clean format. This is particularly useful when querying RESTful APIs with the [JSON Data Source]({% link _kb/data-sources/querying/urls %}) + If you're underlying data returns JSON formatted text in a field, you can instruct Redash to display it as such. This lets you collapse and expand elements in a clean format. This is particularly useful when querying RESTful APIs with the [JSON Data Source]({% link _kb/data-sources/querying/urls %}) - **Images** - If a field in your database contains links to an image, Redash can display that image inline with your table results. This is especially useful for dashboards. + If a field in your database contains links to an image, Redash can display that image inline with your table results. This is especially useful for dashboards. - ![](/assets/images/docs/gitbook/dashboard-with-images.png) + ![](/assets/images/docs/gitbook/dashboard-with-images.png) - In the above dashboard, the **Customer Image** field is a URL to a picture which Redash displays in-place. + In the above dashboard, the **Customer Image** field is a URL to a picture which Redash displays in-place. - **HTML Links** - Just like with images, HTML links from your DB can be made clickable in Redash. Just use the Link option in the column format selector. \ No newline at end of file + Just like with images, HTML links from your DB can be made clickable in Redash. Just use the Link option in the column format selector. diff --git a/src/pages/product/index.jsx b/src/pages/product/index.jsx index 4ef0d62fa..9fb12aca2 100644 --- a/src/pages/product/index.jsx +++ b/src/pages/product/index.jsx @@ -114,7 +114,11 @@ const ProductPage = ({ location }) => ( Pivot Table Funnel

-

See examples in the Redash Docs

+

+ + See examples in the Redash Docs + +

diff --git a/src/scss/_components/_alert.scss b/src/scss/_components/_alert.scss index 89819d9bf..5fa472db8 100644 --- a/src/scss/_components/_alert.scss +++ b/src/scss/_components/_alert.scss @@ -3,11 +3,11 @@ .alert { &.alert-danger { border-color: $danger; - background: rgba($danger, .25); + background: rgba($danger, 0.25); } &.alert-brand { border-color: $bridesmaid; - background: rgba($bridesmaid, .25); + background: rgba($bridesmaid, 0.25); color: darken($bridesmaid, 30%); } } diff --git a/src/scss/_components/_bootstrap-override.scss b/src/scss/_components/_bootstrap-override.scss index 051fcbe27..4ec95d81a 100755 --- a/src/scss/_components/_bootstrap-override.scss +++ b/src/scss/_components/_bootstrap-override.scss @@ -19,17 +19,17 @@ .row { @include respond-to(xs) { - >[class^="col-sm"] { + > [class^='col-sm'] { &:not(:last-child) { margin-bottom: 20px; } } - >[class^="col-md"] { + > [class^='col-md'] { &:not(:last-child) { margin-bottom: 20px; } } - >[class^="col-lg"] { + > [class^='col-lg'] { &:not(:last-child) { margin-bottom: 20px; } @@ -70,12 +70,13 @@ @include respond-to(xs-min) { display: flex; flex-wrap: wrap; - &:before, &:after { + &:before, + &:after { content: none; } } - >[class^="col"] { - >[class^="col-sm"] { + > [class^='col'] { + > [class^='col-sm'] { float: none; } } @@ -95,21 +96,23 @@ label { } .label-primary { - border: 1px solid #4080FE; - color: #4080FE; - background: rgba(255,255,255,0.75); + border: 1px solid #4080fe; + color: #4080fe; + background: rgba(255, 255, 255, 0.75); } // Navigation @media only screen and (min-width: 767px) { - .navbar-nav>li>a { + .navbar-nav > li > a { padding: 8px 15px; margin-top: 16px; } } -.nav .open>a, .nav .open>a:focus, .nav .open>a:hover { +.nav .open > a, +.nav .open > a:focus, +.nav .open > a:hover { border-radius: $border-radius; background-color: #f8fafa; } @@ -120,19 +123,20 @@ label { } } -.navbar-nav>li>a:focus, .navbar-nav>li>a:hover { +.navbar-nav > li > a:focus, +.navbar-nav > li > a:hover { background: #f8fafa; border-radius: $border-radius; } .dropdown-menu { - box-shadow: 0 4px 9px rgba(0,0,0,.05125); + box-shadow: 0 4px 9px rgba(0, 0, 0, 0.05125); border: 1px solid #eaeaea; - >li>a { + > li > a { color: #111; padding: 5px 15px; - + &:hover { background: #f8fafa !important; } @@ -150,4 +154,4 @@ label { .table-striped tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; -} \ No newline at end of file +} diff --git a/src/scss/_components/_buttons.scss b/src/scss/_components/_buttons.scss index 3e45155c0..23c0ab83d 100755 --- a/src/scss/_components/_buttons.scss +++ b/src/scss/_components/_buttons.scss @@ -9,7 +9,8 @@ &.btn-danger { background: $danger; border-color: $danger; - &:hover, &:focus { + &:hover, + &:focus { background-color: darken($danger, 7%); border-color: darken($danger, 10%); } @@ -18,7 +19,8 @@ background: $white; border-color: $danger; color: $danger; - &:hover, &:focus { + &:hover, + &:focus { background: $danger; border-color: $danger; color: $white; @@ -28,9 +30,10 @@ border-color: darken($bridesmaid, 30%); background: white; color: darken($bridesmaid, 30%); - &:hover, &:focus { + &:hover, + &:focus { border-color: darken($bridesmaid, 40%); - background: rgba($bridesmaid, .25); + background: rgba($bridesmaid, 0.25); color: darken($bridesmaid, 40%); } } @@ -38,7 +41,8 @@ background: transparent; border-color: $danger; color: $danger; - &:hover, &:focus { + &:hover, + &:focus { background-color: $danger; border-color: $danger; color: white; @@ -47,7 +51,8 @@ &.btn-primary { background: $primary; border-color: $primary; - &:hover, &:focus { + &:hover, + &:focus { background-color: lighten($primary, 10%); border-color: lighten($primary, 10%); } @@ -65,7 +70,7 @@ padding-top: 4px; padding-bottom: 4px; } - &+.btn { + & + .btn { margin-left: 10px; } &.btn-input-group { @@ -79,24 +84,24 @@ } .btn-secondary { - background: #FFFFFF; - border: 1px solid rgba(33,150,243,0.20); - box-shadow: 0 6px 13px -6px rgba(33,150,243,0.25); + background: #ffffff; + border: 1px solid rgba(33, 150, 243, 0.2); + box-shadow: 0 6px 13px -6px rgba(33, 150, 243, 0.25); border-radius: $border-radius; font-weight: 500; font-size: 13px; - color: #2196F3; + color: #2196f3; text-align: center; transition: all 0.3s ease; &:hover { - border: 1px solid rgba(33,150,243,0.40); - box-shadow: 0 6px 17px -3px rgba(33,150,243,0.20); - color: #2196F3; + border: 1px solid rgba(33, 150, 243, 0.4); + box-shadow: 0 6px 17px -3px rgba(33, 150, 243, 0.2); + color: #2196f3; } } .btn-lg { padding: 10px 18px; font-size: 105%; -} \ No newline at end of file +} diff --git a/src/scss/_components/_callouts.scss b/src/scss/_components/_callouts.scss index 58dea475c..1a2577236 100644 --- a/src/scss/_components/_callouts.scss +++ b/src/scss/_components/_callouts.scss @@ -1,56 +1,56 @@ .bs-callout { - padding: 20px; - margin: 20px 0; - border: 0px solid transparent; - border-left-width: 5px; - background: #f8fafa; + padding: 20px; + margin: 20px 0; + border: 0px solid transparent; + border-left-width: 5px; + background: #f8fafa; } .bs-callout h4 { - margin-top: 0; - margin-bottom: 5px; + margin-top: 0; + margin-bottom: 5px; } .bs-callout p:last-child { - margin-bottom: 0; + margin-bottom: 0; } .bs-callout code { - border-radius: $border-radius; + border-radius: $border-radius; } -.bs-callout+.bs-callout { - margin-top: -5px; +.bs-callout + .bs-callout { + margin-top: -5px; } .bs-callout-default { - border-left-color: #777; + border-left-color: #777; } .bs-callout-default h4 { - color: #777; + color: #777; } .bs-callout-primary { - border-left-color: $primary; + border-left-color: $primary; } .bs-callout-primary h4 { - color: #428bca; + color: #428bca; } .bs-callout-success { - border-left-color: #5cb85c; + border-left-color: #5cb85c; } .bs-callout-success h4 { - color: #5cb85c; + color: #5cb85c; } .bs-callout-danger { - border-left-color: #d9534f; + border-left-color: #d9534f; } .bs-callout-danger h4 { - color: #d9534f; + color: #d9534f; } .bs-callout-warning { - border-left-color: #f0ad4e; + border-left-color: #f0ad4e; } .bs-callout-warning h4 { - color: #f0ad4e; + color: #f0ad4e; } .bs-callout-info { - border-left-color: #5bc0de; + border-left-color: #5bc0de; } .bs-callout-info h4 { - color: #5bc0de; -} \ No newline at end of file + color: #5bc0de; +} diff --git a/src/scss/_components/_card.scss b/src/scss/_components/_card.scss index 2bd06fb64..30a7c4f57 100755 --- a/src/scss/_components/_card.scss +++ b/src/scss/_components/_card.scss @@ -12,7 +12,7 @@ $card-hover-color: $hoki; } .card--blue { - background: rgba(233,242,255,.6); + background: rgba(233, 242, 255, 0.6); } .card--yellow { @@ -35,7 +35,7 @@ $card-hover-color: $hoki; } .card--customer { - transition: all .25s ease; + transition: all 0.25s ease; margin-bottom: 30px; padding: 25px !important; transform: scale(0.95, 0.95); @@ -54,7 +54,7 @@ $card-hover-color: $hoki; border-radius: $border-radius; &:hover { - box-shadow: 0 2px 20px rgba(0,0,0,.05125); + box-shadow: 0 2px 20px rgba(0, 0, 0, 0.05125); transform: scale(0.96, 0.96); } } @@ -80,7 +80,8 @@ $card-hover-color: $hoki; flex-basis: 50%; margin-bottom: 20px; } - &:hover, &:focus { + &:hover, + &:focus { color: inherit; .card__item-brand { border: 1px solid $primary; @@ -96,7 +97,7 @@ $card-hover-color: $hoki; } .card__item-brand { @include transition(250ms); - box-shadow: 0 4px 9px rgba(0,0,0,.05125); + box-shadow: 0 4px 9px rgba(0, 0, 0, 0.05125); border: 1px solid #eaeaea; border-radius: $border-radius; padding: 30px; diff --git a/src/scss/_components/_carousel.scss b/src/scss/_components/_carousel.scss index 8c73dc67b..baa460ede 100755 --- a/src/scss/_components/_carousel.scss +++ b/src/scss/_components/_carousel.scss @@ -32,7 +32,10 @@ background-image: linear-gradient(180deg, #fff 0, #dadee0); border-radius: 5px 5px 0 0; position: relative; - box-shadow: inset 0 1px 0 rgba(52, 60, 69, .2), inset 1px 0 0 rgba(52, 60, 69, .2), inset -1px 0 0 rgba(52, 60, 69, .2); + box-shadow: + inset 0 1px 0 rgba(52, 60, 69, 0.2), + inset 1px 0 0 rgba(52, 60, 69, 0.2), + inset -1px 0 0 rgba(52, 60, 69, 0.2); } .browser-toolbar__btns { position: absolute; @@ -47,8 +50,9 @@ border-radius: 12px; margin: 0 18px; border: 1px solid #f8ac02; - &:before, &:after { - content: ""; + &:before, + &:after { + content: ''; display: block; width: 12px; height: 12px; @@ -60,7 +64,6 @@ background: #fc5959; left: 0; border: 1px solid #fb3131; - } &:after { background: #36cf40; @@ -69,8 +72,6 @@ } } - - .carousel__logo-holder { width: 72px; margin-bottom: 10px; @@ -96,103 +97,102 @@ /* Slider */ .slick-slider { - position: relative; - display: block; - box-sizing: border-box; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -ms-touch-action: pan-y; - touch-action: pan-y; - -webkit-tap-highlight-color: transparent; + position: relative; + display: block; + box-sizing: border-box; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; } .slick-list { - position: relative; - overflow: hidden; - display: block; - margin: 0; - padding: 0; + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; - &:focus { - outline: none; - } + &:focus { + outline: none; + } - &.dragging { - cursor: pointer; - cursor: hand; - } + &.dragging { + cursor: pointer; + cursor: hand; + } } .slick-slider .slick-track, .slick-slider .slick-list { - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } .slick-track { - position: relative; - left: 0; - top: 0; - display: block; + position: relative; + left: 0; + top: 0; + display: block; - &:before, - &:after { - content: ""; - display: table; - } + &:before, + &:after { + content: ''; + display: table; + } - &:after { - clear: both; - } + &:after { + clear: both; + } - .slick-loading & { - visibility: hidden; - } + .slick-loading & { + visibility: hidden; + } } .slick-slide { - float: left; - height: 100%; - min-height: 1px; - [dir="rtl"] & { - float: right; - } - img { - display: block; - } - &.slick-loading img { - display: none; - } - + float: left; + height: 100%; + min-height: 1px; + [dir='rtl'] & { + float: right; + } + img { + display: block; + } + &.slick-loading img { display: none; + } - &.dragging img { - pointer-events: none; - } + display: none; - .slick-initialized & { - display: block; - } + &.dragging img { + pointer-events: none; + } - .slick-loading & { - visibility: hidden; - } + .slick-initialized & { + display: block; + } - .slick-vertical & { - display: block; - height: auto; - border: 1px solid transparent; - } + .slick-loading & { + visibility: hidden; + } + + .slick-vertical & { + display: block; + height: auto; + border: 1px solid transparent; + } } .slick-arrow.slick-hidden { - display: none; + display: none; } - @charset "UTF-8"; // Default Variables @@ -202,193 +202,197 @@ // "\2192" outputs ascii character "→" // "\2022" outputs ascii character "•" -$slick-font-path: "./fonts/" !default; -$slick-font-family: "slick" !default; -$slick-loader-path: "./" !default; +$slick-font-path: './fonts/' !default; +$slick-font-family: 'slick' !default; +$slick-loader-path: './' !default; $slick-arrow-color: white !default; $slick-dot-color: black !default; $slick-dot-color-active: $slick-dot-color !default; -$slick-prev-character: "\2190" !default; -$slick-next-character: "\2192" !default; -$slick-dot-character: "\2022" !default; +$slick-prev-character: '\2190' !default; +$slick-next-character: '\2192' !default; +$slick-dot-character: '\2022' !default; $slick-dot-size: 6px !default; $slick-opacity-default: 0.75 !default; $slick-opacity-on-hover: 1 !default; $slick-opacity-not-active: 0.25 !default; @function slick-image-url($url) { - @if function-exists(image-url) { - @return image-url($url); - } - @else { - @return url($slick-loader-path + $url); - } + @if function-exists(image-url) { + @return image-url($url); + } @else { + @return url($slick-loader-path + $url); + } } @function slick-font-url($url) { - @if function-exists(font-url) { - @return font-url($url); - } - @else { - @return url($slick-font-path + $url); - } + @if function-exists(font-url) { + @return font-url($url); + } @else { + @return url($slick-font-path + $url); + } } /* Slider */ .slick-list { - .slick-loading & { - background: #fff slick-image-url("ajax-loader.gif") center center no-repeat; - } + .slick-loading & { + background: #fff slick-image-url('ajax-loader.gif') center center no-repeat; + } } /* Icons */ -@if $slick-font-family == "slick" { - @font-face { - font-family: "slick"; - src: slick-font-url("slick.eot"); - src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg"); - font-weight: normal; - font-style: normal; - } +@if $slick-font-family == 'slick' { + @font-face { + font-family: 'slick'; + src: slick-font-url('slick.eot'); + src: + slick-font-url('slick.eot?#iefix') format('embedded-opentype'), + slick-font-url('slick.woff') format('woff'), + slick-font-url('slick.ttf') format('truetype'), + slick-font-url('slick.svg#slick') format('svg'); + font-weight: normal; + font-style: normal; + } } /* Arrows */ .slick-prev, .slick-next { - position: absolute; - display: block; - height: 28px; - width: 28px; - line-height: 0px; - font-size: 0px; - cursor: pointer; - background: transparent; - color: transparent; - top: 50%; - -webkit-transform: translate(0, -50%); - -ms-transform: translate(0, -50%); - transform: translate(0, -50%); - padding: 0; - border: none; + position: absolute; + display: block; + height: 28px; + width: 28px; + line-height: 0px; + font-size: 0px; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; + background: #e8e8e8; + border-radius: 50%; + z-index: 100; + &:hover, + &:focus { outline: none; background: #e8e8e8; - border-radius: 50%; - z-index: 100; - &:hover, &:focus { - outline: none; - background: #e8e8e8; - color: transparent; - &:before { - opacity: 1; - } - } - &.slick-disabled:before { - opacity: $slick-opacity-not-active; - } + color: transparent; &:before { - font-size: 20px; - line-height: 1; - color: #565656; - opacity: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + opacity: 1; } + } + &.slick-disabled:before { + opacity: $slick-opacity-not-active; + } + &:before { + font-size: 20px; + line-height: 1; + color: #565656; + opacity: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } } .slick-prev { - left: -25px; - font-family: $font-icon; - @include respond-to(sm) { - left: 0; - } - @extend .fa, .fa-angle-left; - [dir="rtl"] & { - left: auto; - right: -25px; - } - &:before { - margin-left: -2px; - } + left: -25px; + font-family: $font-icon; + @include respond-to(sm) { + left: 0; + } + @extend .fa, .fa-angle-left; + [dir='rtl'] & { + left: auto; + right: -25px; + } + &:before { + margin-left: -2px; + } } .slick-next { - right: -25px; - @include respond-to(sm) { - right: 0; - } - @extend .fa, .fa-angle-right; - [dir="rtl"] & { - left: -25px; - right: auto; - } - &:before { - margin-right: -2px; - } + right: -25px; + @include respond-to(sm) { + right: 0; + } + @extend .fa, .fa-angle-right; + [dir='rtl'] & { + left: -25px; + right: auto; + } + &:before { + margin-right: -2px; + } } /* Dots */ .slick-dotted.slick-slider { - margin-bottom: 30px; + margin-bottom: 30px; } .slick-dots { - position: absolute; - bottom: -25px; - list-style: none; - display: block; - text-align: center; + position: absolute; + bottom: -25px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; + li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; padding: 0; - margin: 0; - width: 100%; - li { - position: relative; - display: inline-block; - height: 20px; - width: 20px; - margin: 0 5px; - padding: 0; - cursor: pointer; - button { - border: 0; - background: transparent; - display: block; - height: 20px; - width: 20px; - outline: none; - line-height: 0px; - font-size: 0px; - color: transparent; - padding: 5px; - cursor: pointer; - &:hover, &:focus { - outline: none; - &:before { - opacity: $slick-opacity-on-hover; - } - } - &:before { - position: absolute; - top: 0; - left: 0; - content: $slick-dot-character; - width: 20px; - height: 20px; - font-family: $slick-font-family; - font-size: $slick-dot-size; - line-height: 20px; - text-align: center; - color: $slick-dot-color; - opacity: $slick-opacity-not-active; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - } - &.slick-active button:before { - color: $slick-dot-color-active; - opacity: $slick-opacity-default; + cursor: pointer; + button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0px; + font-size: 0px; + color: transparent; + padding: 5px; + cursor: pointer; + &:hover, + &:focus { + outline: none; + &:before { + opacity: $slick-opacity-on-hover; } + } + &:before { + position: absolute; + top: 0; + left: 0; + content: $slick-dot-character; + width: 20px; + height: 20px; + font-family: $slick-font-family; + font-size: $slick-dot-size; + line-height: 20px; + text-align: center; + color: $slick-dot-color; + opacity: $slick-opacity-not-active; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } } + &.slick-active button:before { + color: $slick-dot-color-active; + opacity: $slick-opacity-default; + } + } } diff --git a/src/scss/_components/_forms.scss b/src/scss/_components/_forms.scss index 4561b766a..9756b1d55 100755 --- a/src/scss/_components/_forms.scss +++ b/src/scss/_components/_forms.scss @@ -1,66 +1,66 @@ /* FORMS */ $field-border: $legaloblolly; -$field-bg: rgba($legaloblolly, .5); +$field-bg: rgba($legaloblolly, 0.5); $field-color: $white; $field-fs: 16px; $placeholder-color: $white; $placeholder-opacity: 0; .form-control { - -webkit-appearance:none; - -moz-appearance:none; - border-radius: 0; - border: none; - border-bottom: 2px solid $field-border; - background: #fff; - color: $primary; - box-shadow: none; - font-size: 17px; - padding: 7px 5px; - font-weight: 500; - line-height: 1.5; - height: auto; - &:focus { - box-shadow: 0 0 0 2px #c8e5fd !important; - border-color: $primary; - @include custom-placeholder-opacity($opacity: $placeholder-opacity); - } + -webkit-appearance: none; + -moz-appearance: none; + border-radius: 0; + border: none; + border-bottom: 2px solid $field-border; + background: #fff; + color: $primary; + box-shadow: none; + font-size: 17px; + padding: 7px 5px; + font-weight: 500; + line-height: 1.5; + height: auto; + &:focus { + box-shadow: 0 0 0 2px #c8e5fd !important; + border-color: $primary; + @include custom-placeholder-opacity($opacity: $placeholder-opacity); + } } .form-control--white { - background: $white; - color: $primary; - @include custom-placeholder($color: $primary, $font-size: $field-fs); - &:focus { - border-color: $primary; - } + background: $white; + color: $primary; + @include custom-placeholder($color: $primary, $font-size: $field-fs); + &:focus { + border-color: $primary; + } } .form-group { - &:last-child { - margin-bottom: 0; - } + &:last-child { + margin-bottom: 0; + } } .input-lg { - height: 60px; - border-radius: 0 !important; + height: 60px; + border-radius: 0 !important; } .form-group--search { - &:before { - font-family: $font-icon; - @extend .fa, .fa-search; - position: absolute; - left: 35px; - transform: translateY(-50%); - top: 50%; - z-index: 2; - } - .search-box { - position: relative; - z-index: 1; // Fix for issue #230 - } - .form-control { - padding-left: 50px; - } + &:before { + font-family: $font-icon; + @extend .fa, .fa-search; + position: absolute; + left: 35px; + transform: translateY(-50%); + top: 50%; + z-index: 2; + } + .search-box { + position: relative; + z-index: 1; // Fix for issue #230 + } + .form-control { + padding-left: 50px; + } } diff --git a/src/scss/_components/_from-to.scss b/src/scss/_components/_from-to.scss index b96ec12ee..af633893d 100755 --- a/src/scss/_components/_from-to.scss +++ b/src/scss/_components/_from-to.scss @@ -8,7 +8,7 @@ display: inline-block; max-width: 175px; vertical-align: middle; - &+.from-to-holder__item { + & + .from-to-holder__item { margin-left: 220px; @include respond-to(xs) { margin-left: 100px; @@ -38,5 +38,4 @@ .from-to-holder__title { font-size: 18px; font-weight: 500; -; } diff --git a/src/scss/_components/_kb.scss b/src/scss/_components/_kb.scss index 761705508..71bd1ea8f 100644 --- a/src/scss/_components/_kb.scss +++ b/src/scss/_components/_kb.scss @@ -39,7 +39,10 @@ code { border: 1px solid #f5ecef; display: inline-block; line-height: 20px; - font-family: Source Code Pro, Menlo, monospace; + font-family: + Source Code Pro, + Menlo, + monospace; } pre { diff --git a/src/scss/_components/_list.scss b/src/scss/_components/_list.scss index 249fcb6ff..d016b7792 100755 --- a/src/scss/_components/_list.scss +++ b/src/scss/_components/_list.scss @@ -2,8 +2,8 @@ .list-bullet { @extend .list-unstyled; - >li { - position: relative;; + > li { + position: relative; padding-left: 15px; &:before { position: absolute; diff --git a/src/scss/_components/_mixins.scss b/src/scss/_components/_mixins.scss index b758bd142..76b1d810b 100755 --- a/src/scss/_components/_mixins.scss +++ b/src/scss/_components/_mixins.scss @@ -2,63 +2,77 @@ // Different devices resolutions @mixin respond-to($media) { @if $media == xs-phone { - @media only screen and (max-width: 550px) { @content; } + @media only screen and (max-width: 550px) { + @content; + } } @if $media == xs { - @media only screen and (max-width: $screen-xs-max) { @content; } + @media only screen and (max-width: $screen-xs-max) { + @content; + } } @if $media == xs-min { - @media only screen and (min-width: $screen-xs-max) { @content; } - } - @else if $media == sm { - @media only screen and (max-width: $screen-sm-max) { @content; } + @media only screen and (min-width: $screen-xs-max) { + @content; + } + } @else if $media == sm { + @media only screen and (max-width: $screen-sm-max) { + @content; + } + } @else if $media == sm-min { + @media only screen and (min-width: $screen-sm-max) { + @content; + } + } @else if $media == md { + @media only screen and (max-width: $screen-md-max) { + @content; + } + } @else if $media == md-min { + @media only screen and (min-width: $screen-md-max) { + @content; + } + } @else if $media == lg { + @media only screen and (min-width: $screen-lg-min) { + @content; + } } - @else if $media == sm-min { - @media only screen and (min-width: $screen-sm-max) { @content; } +} + +// Placeholder text +@mixin custom-placeholder( + $color: $placeholder-color, + $font-size: $placeholder-font-size +) { + &:-moz-placeholder { + color: $color; + font-size: $font-size; } - @else if $media == md { - @media only screen and (max-width: $screen-md-max) { @content; } + &::-moz-placeholder { + color: $color; + font-size: $font-size; } - @else if $media == md-min { - @media only screen and (min-width: $screen-md-max) { @content; } + &:-ms-input-placeholder { + color: $color; + font-size: $font-size; } - @else if $media == lg { - @media only screen and (min-width: $screen-lg-min) { @content; } + &::-webkit-input-placeholder { + color: $color; + font-size: $font-size; } } -// Placeholder text -@mixin custom-placeholder($color: $placeholder-color, $font-size: $placeholder-font-size) { - &:-moz-placeholder { - color: $color; - font-size: $font-size; - } - &::-moz-placeholder { - color: $color; - font-size: $font-size; - } - &:-ms-input-placeholder { - color: $color; - font-size: $font-size; - } - &::-webkit-input-placeholder { - color: $color; - font-size: $font-size; - } -} - //Placeholder opacity @mixin custom-placeholder-opacity($opacity: $placeholder-opacity) { - &:-moz-placeholder { - opacity: $opacity; - } - &::-moz-placeholder { - opacity: $opacity; - } - &:-ms-input-placeholder { - opacity: $opacity; - } - &::-webkit-input-placeholder { - opacity: $opacity; - } + &:-moz-placeholder { + opacity: $opacity; + } + &::-moz-placeholder { + opacity: $opacity; + } + &:-ms-input-placeholder { + opacity: $opacity; + } + &::-webkit-input-placeholder { + opacity: $opacity; + } } diff --git a/src/scss/_components/_page-about.scss b/src/scss/_components/_page-about.scss index 729cc1f11..44dd093f1 100644 --- a/src/scss/_components/_page-about.scss +++ b/src/scss/_components/_page-about.scss @@ -13,4 +13,4 @@ margin: 0 auto; } } -} \ No newline at end of file +} diff --git a/src/scss/_components/_page-casestudy.scss b/src/scss/_components/_page-casestudy.scss index 8754e1e4b..798843940 100644 --- a/src/scss/_components/_page-casestudy.scss +++ b/src/scss/_components/_page-casestudy.scss @@ -21,14 +21,15 @@ background: $mutted-soft; } - td, th { + td, + th { padding: 15px; } } .section-case-study { h4 { - margin-bottom: 10px; + margin-bottom: 10px; } .profile-image { @@ -43,12 +44,11 @@ font-style: italic; background-color: $mutted-soft; border-radius: $border-radius; - font-family: "Courier"; + font-family: 'Courier'; transition: all 0.13s ease-in-out; border-left: 5px solid $small-blue; &:hover { - } } -} \ No newline at end of file +} diff --git a/src/scss/_components/_page-community.scss b/src/scss/_components/_page-community.scss index 8370a6848..d2351f092 100644 --- a/src/scss/_components/_page-community.scss +++ b/src/scss/_components/_page-community.scss @@ -1,5 +1,4 @@ .section__os--hero { - h1 { margin-top: 150px; } @@ -33,13 +32,13 @@ .contributor-pics { margin: 5px; img { - border-radius: 50% + border-radius: 50%; } } .contributor-card { text-align: center; - box-shadow: 0 4px 9px rgba(0,0,0,.05125); + box-shadow: 0 4px 9px rgba(0, 0, 0, 0.05125); border: 1px solid #eaeaea; border-radius: $border-radius; margin: 15px; @@ -50,4 +49,4 @@ .section__os--contributor-list { overflow: hidden; -} \ No newline at end of file +} diff --git a/src/scss/_components/_page-contact.scss b/src/scss/_components/_page-contact.scss index c42ec3a70..87415c263 100644 --- a/src/scss/_components/_page-contact.scss +++ b/src/scss/_components/_page-contact.scss @@ -6,4 +6,4 @@ box-sizing: border-box; -webkit-box-sizing: border-box; } -} \ No newline at end of file +} diff --git a/src/scss/_components/_page-customers.scss b/src/scss/_components/_page-customers.scss index b55faaf59..1e907c09b 100644 --- a/src/scss/_components/_page-customers.scss +++ b/src/scss/_components/_page-customers.scss @@ -1,5 +1,5 @@ .featured-customer { - box-shadow: 0 4px 9px rgba(0,0,0,.05125); + box-shadow: 0 4px 9px rgba(0, 0, 0, 0.05125); border: 1px solid #eaeaea; border-radius: $border-radius; margin-bottom: 25px; @@ -13,7 +13,7 @@ margin-top: 0; small { - background: #4080FE; + background: #4080fe; color: #fff; font-weight: 600; font-size: 14px; diff --git a/src/scss/_components/_page-index.scss b/src/scss/_components/_page-index.scss index 541cbb2d9..0400f26d8 100644 --- a/src/scss/_components/_page-index.scss +++ b/src/scss/_components/_page-index.scss @@ -16,7 +16,6 @@ } } - section.subscribe { padding: 75px 0; @@ -42,4 +41,4 @@ section.subscribe { width: 100%; } } -} \ No newline at end of file +} diff --git a/src/scss/_components/_page-price.scss b/src/scss/_components/_page-price.scss index 32a7b7e82..ed702cbef 100755 --- a/src/scss/_components/_page-price.scss +++ b/src/scss/_components/_page-price.scss @@ -19,8 +19,10 @@ margin: 0; } - &:hover, &:active, &.active { - box-shadow: 0 6px 18px -5px rgba(175,175,175,.5); + &:hover, + &:active, + &.active { + box-shadow: 0 6px 18px -5px rgba(175, 175, 175, 0.5); } } @@ -104,17 +106,19 @@ font-weight: 500; padding: 0.3em 2em; text-transform: uppercase; - background: #2196F3; + background: #2196f3; border-radius: $border-radius; } } - &:hover, &:active, &.active { + &:hover, + &:active, + &.active { .pricing-charge { - color: darken(#2196F3, 5%); + color: darken(#2196f3, 5%); } - box-shadow: 0 6px 18px -5px rgba(175,175,175,.5); + box-shadow: 0 6px 18px -5px rgba(175, 175, 175, 0.5); } } diff --git a/src/scss/_components/_page-product.scss b/src/scss/_components/_page-product.scss index 6fd947fc1..58165309c 100644 --- a/src/scss/_components/_page-product.scss +++ b/src/scss/_components/_page-product.scss @@ -1,5 +1,5 @@ .browser-container { - box-shadow: 0 6px 18px -5px rgba(175,175,175,0.50); + box-shadow: 0 6px 18px -5px rgba(175, 175, 175, 0.5); width: 720px; img { @@ -9,4 +9,4 @@ .visualize-dashboards-illustrated { margin-top: 75px; -} \ No newline at end of file +} diff --git a/src/scss/_components/_panel.scss b/src/scss/_components/_panel.scss index ebf4380b0..fa421b5f4 100644 --- a/src/scss/_components/_panel.scss +++ b/src/scss/_components/_panel.scss @@ -6,7 +6,8 @@ color: $scorpion; display: block; padding: 5px; - &:hover, &:focus { + &:hover, + &:focus { color: $primary; background: $wild-sand; } diff --git a/src/scss/_components/_popover.scss b/src/scss/_components/_popover.scss index 6b6096b54..84d7c3522 100755 --- a/src/scss/_components/_popover.scss +++ b/src/scss/_components/_popover.scss @@ -1,11 +1,11 @@ .popover { border-radius: $border-radius; - background: rgba(255,255,255,0.95); + background: rgba(255, 255, 255, 0.95); text-align: center; border: none; - box-shadow: 0 3px 15px -2px rgba(175,175,175,.5); + box-shadow: 0 3px 15px -2px rgba(175, 175, 175, 0.5); .arrow { border: none; } -} \ No newline at end of file +} diff --git a/src/scss/_components/_reset.scss b/src/scss/_components/_reset.scss index 6cbe7578d..02bb988d0 100755 --- a/src/scss/_components/_reset.scss +++ b/src/scss/_components/_reset.scss @@ -1,96 +1,101 @@ /* RESET STYLES */ * { - &:hover, &:focus, &:active { - outline: none !important; - } + &:hover, + &:focus, + &:active { + outline: none !important; + } } -a:hover, a:focus, a:visited { - text-decoration: none; - outline: none; - outline-offset: 0; +a:hover, +a:focus, +a:visited { + text-decoration: none; + outline: none; + outline-offset: 0; } -ol, ul { - margin-bottom: 20px; - &:last-child { - margin-bottom: 0; - } +ol, +ul { + margin-bottom: 20px; + &:last-child { + margin-bottom: 0; + } } .relative { - position: relative; + position: relative; } .z-index { - position: relative; - z-index: 10; + position: relative; + z-index: 10; } .block { - display: block; + display: block; } .inline-block { - display: inline-block; + display: inline-block; } .full-width { - width: 100%; - display: block; + width: 100%; + display: block; } .overflow { - overflow: hidden; + overflow: hidden; } .push-xs-down { - @include respond-to(xs) { - margin-bottom: 20px; - } + @include respond-to(xs) { + margin-bottom: 20px; + } } .push-sm-down { - @include respond-to(sm) { - margin-bottom: 20px; - } + @include respond-to(sm) { + margin-bottom: 20px; + } } .img--has-shadow { - border: none; - box-shadow: 0 6px 18px -5px rgba(175,175,175,.5); + border: none; + box-shadow: 0 6px 18px -5px rgba(175, 175, 175, 0.5); } .img-content { - @extend .img-responsive, .center-block; - &:not(:last-child) { - margin-bottom: 25px; - } + @extend .img-responsive, .center-block; + &:not(:last-child) { + margin-bottom: 25px; + } } .content-item { - &:not(:last-child) { - margin-bottom: 50px; - @include respond-to(xs) { - margin-bottom: 25px; - } - } + &:not(:last-child) { + margin-bottom: 50px; + @include respond-to(xs) { + margin-bottom: 25px; + } + } } .content-item-sm { - margin-bottom: 25px; + margin-bottom: 25px; } .text-center-xs { - @include respond-to(xs) { - text-align: center; - } + @include respond-to(xs) { + text-align: center; + } } .box { - padding: 25px; - &:not(:first-child) { - margin-top: 25px; - } - &:not(:last-child) { - margin-bottom: 25px; - } - @include respond-to(xs) { - padding: 20px; - } + padding: 25px; + &:not(:first-child) { + margin-top: 25px; + } + &:not(:last-child) { + margin-bottom: 25px; + } + @include respond-to(xs) { + padding: 20px; + } } .box--mutted { - background: $mutted; + background: $mutted; } diff --git a/src/scss/_components/_search_results.scss b/src/scss/_components/_search_results.scss index 94b05b27b..a4910203a 100644 --- a/src/scss/_components/_search_results.scss +++ b/src/scss/_components/_search_results.scss @@ -1,15 +1,16 @@ .algolia__result-highlight { - background-color: #daeeff; + background-color: #daeeff; } .underline-link-holder { - a { - color: $primary; - //border-bottom: 1px solid $primary; - transition: all 0.25s cubic-bezier(0.2, 1, 0.4, 1); - &:hover, &:focus { - color: $primary; - background-color: #daeeff; - } + a { + color: $primary; + //border-bottom: 1px solid $primary; + transition: all 0.25s cubic-bezier(0.2, 1, 0.4, 1); + &:hover, + &:focus { + color: $primary; + background-color: #daeeff; } + } } diff --git a/src/scss/_components/_section.scss b/src/scss/_components/_section.scss index b4155fc6e..c8f15551e 100755 --- a/src/scss/_components/_section.scss +++ b/src/scss/_components/_section.scss @@ -71,7 +71,7 @@ .browser-image { margin-top: 25px; - box-shadow: 0 6px 18px -5px rgba(175,175,175,0.50); + box-shadow: 0 6px 18px -5px rgba(175, 175, 175, 0.5); } .section__open-source { @@ -121,9 +121,9 @@ .section__more-features { .feature-container { - background: rgba(255,255,255,0.20); - border: 1px solid rgba(102,136,153,0.18); - box-shadow: 0 5px 9px -1px #EBF2FF; + background: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(102, 136, 153, 0.18); + box-shadow: 0 5px 9px -1px #ebf2ff; border-radius: $border-radius; width: 30%; float: left; @@ -139,7 +139,6 @@ } } - .section__integrations { p { margin-bottom: 70px; @@ -151,7 +150,7 @@ .integrations-container { padding: 50px; - box-shadow: 0 8px 25px 0 rgba(155,155,155,0.15); + box-shadow: 0 8px 25px 0 rgba(155, 155, 155, 0.15); border-radius: $border-radius; h2 { @@ -167,7 +166,7 @@ .section__databricks { text-align: left; padding-top: 50px; - background-color: #F8FAFA; + background-color: #f8fafa; @media (min-width: 768px) { text-align: center; } @@ -180,20 +179,15 @@ @media (min-width: 768px) { img { width: 419px; - } + } } } - - - - - #customers-illustrated { width: 75%; } -#open-source-illustrated { +#open-source-illustrated { width: 100%; } @@ -201,7 +195,8 @@ width: 256px; } -#write-query-illustrated, #visualize-illustrated { +#write-query-illustrated, +#visualize-illustrated { width: 90%; } @@ -211,11 +206,6 @@ } } - - - - - // Optimization /* Large devices (large desktops, 1200px and down) */ @@ -306,7 +296,8 @@ } } - .highlight-p, .highlight-ul li { + .highlight-p, + .highlight-ul li { font-size: 16px; line-height: 1.5; } @@ -396,15 +387,17 @@ width: 100%; } - #visualize-illustrated, #write-query-illustrated { + #visualize-illustrated, + #write-query-illustrated { width: 75%; } - + .section--users { text-align: center; } - .highlight-p, .highlight-ul li { + .highlight-p, + .highlight-ul li { font-size: 14px; line-height: 1.5; } @@ -412,7 +405,7 @@ .section__integrations p { margin-bottom: 25px; } - + .footer__item--other { clear: both; } @@ -420,4 +413,4 @@ .contributor-card { min-width: 145px; } -} \ No newline at end of file +} diff --git a/src/scss/_components/_topics.scss b/src/scss/_components/_topics.scss index db14a4a01..12c65ee8c 100644 --- a/src/scss/_components/_topics.scss +++ b/src/scss/_components/_topics.scss @@ -31,7 +31,8 @@ $topic-color: $small-blue; @include respond-to(xs) { min-height: 120px; } - &:hover, &:focus { + &:hover, + &:focus { border-color: $topic-color; background: lighten($link-color, 38%); border-width: 2px; @@ -59,7 +60,8 @@ $topic-color: $small-blue; @include respond-to(xs) { padding: 20px 0; } - &:hover, &:focus { + &:hover, + &:focus { color: darken($link-color, 10%); } } diff --git a/src/scss/_components/_typography.scss b/src/scss/_components/_typography.scss index 02ce94223..4fcf08c81 100755 --- a/src/scss/_components/_typography.scss +++ b/src/scss/_components/_typography.scss @@ -1,26 +1,26 @@ - -html, body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-family: $body-font-family; - color: $body-main-color; - font-size: $body-font-size; - line-height: $body-line-height; - @include respond-to(xs) { - font-size: $body-font-size-xs; - } +html, +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: $body-font-family; + color: $body-main-color; + font-size: $body-font-size; + line-height: $body-line-height; + @include respond-to(xs) { + font-size: $body-font-size-xs; + } } html { - height: 100%; + height: 100%; } body { - min-height: 100%; + min-height: 100%; } main { - flex: 1; + flex: 1; } .wrapper { @@ -34,247 +34,269 @@ body.drawer .wrapper { } .serif { - font-family: "PT Serif", serif !important; + font-family: 'PT Serif', serif !important; } .em { - font-style: italic; + font-style: italic; } -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - //margin-top: 0; - margin-bottom: 20px; - line-height: 1.3; - font-weight: 500; - &:last-child { - margin-bottom: 0; - } +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + //margin-top: 0; + margin-bottom: 20px; + line-height: 1.3; + font-weight: 500; + &:last-child { + margin-bottom: 0; + } } +h1, +.h1 { + color: $black; + font-size: 36px; -h1, .h1 { - color: $black; - font-size: 36px; - - @include respond-to(sm) { - font-size: 32px; - } - @include respond-to(xs) { - font-size: 28px; - } -} -h2, .h2 { - color: $black; - font-size: 24px; - line-height: 40px; - @include respond-to(sm) { - font-size: 24px; - line-height: 38px; - } - @include respond-to(xs) { - font-size: 22px; - line-height: 36px; - } -} -h3, .h3 { - color: $black; - font-size: 24px; - @include respond-to(sm) { - font-size: 22px; - } - @include respond-to(xs) { - font-size: 20px; - } -} -h4, .h4 { - color: $black; - font-size: 21px; - font-weight: 400; - line-height: 1.6; - @include respond-to(xs) { - font-size: 18px; - } -} -h5, .h5 { - color: $black; - font-size: 17px; - @include respond-to(xs) { - font-size: 16px; - } + @include respond-to(sm) { + font-size: 32px; + } + @include respond-to(xs) { + font-size: 28px; + } +} +h2, +.h2 { + color: $black; + font-size: 24px; + line-height: 40px; + @include respond-to(sm) { + font-size: 24px; + line-height: 38px; + } + @include respond-to(xs) { + font-size: 22px; + line-height: 36px; + } +} +h3, +.h3 { + color: $black; + font-size: 24px; + @include respond-to(sm) { + font-size: 22px; + } + @include respond-to(xs) { + font-size: 20px; + } +} +h4, +.h4 { + color: $black; + font-size: 21px; + font-weight: 400; + line-height: 1.6; + @include respond-to(xs) { + font-size: 18px; + } +} +h5, +.h5 { + color: $black; + font-size: 17px; + @include respond-to(xs) { + font-size: 16px; + } } -ul, ol { - ul, ol { - padding-left: 30px; - } +ul, +ol { + ul, + ol { + padding-left: 30px; + } } a { - color: $link-color; - @include transition(250ms); - text-decoration: none; - &:hover, &:focus { - color: darken($link-color, 10%); - text-decoration: none; - } + color: $link-color; + @include transition(250ms); + text-decoration: none; + &:hover, + &:focus { + color: darken($link-color, 10%); + text-decoration: none; + } } -p a, li a, table a { - transition: all 0.25s cubic-bezier(0.2, 1, 0.4, 1); - &:hover, &:focus { - background-color: #daeeff; - } +p a, +li a, +table a { + transition: all 0.25s cubic-bezier(0.2, 1, 0.4, 1); + &:hover, + &:focus { + background-color: #daeeff; + } } button { - @include transition(250ms); + @include transition(250ms); } .underline { - text-decoration: underline; + text-decoration: underline; } p { - margin-bottom: 10px; - color: #111; - /* &:last-child { + margin-bottom: 10px; + color: #111; + /* &:last-child { margin-bottom: 0; } */ } -.small, small { - font-size: 14px; +.small, +small { + font-size: 14px; } .lead { - font-size: 20px; - @include respond-to(xs) { - font-size: 16px; - } + font-size: 20px; + @include respond-to(xs) { + font-size: 16px; + } } -b, strong { - font-weight: 600; +b, +strong { + font-weight: 600; } hr { - border-color: #ddd; + border-color: #ddd; } .hr--sm { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } .data-text { - &:before { - content: '<'; - } - &:after { - content: '>'; - } + &:before { + content: '<'; + } + &:after { + content: '>'; + } } .data-text__inner { - &:before { - content: attr(data-text); - } + &:before { + content: attr(data-text); + } } .highlight-p { - font-size: 18px; - color: #707070; - letter-spacing: 0; - line-height: 30px; + font-size: 18px; + color: #707070; + letter-spacing: 0; + line-height: 30px; } .highlight-ul { - list-style-image: url('/assets/images/elements/check.svg'); - padding-left: 25px; - line-height: 30px; + list-style-image: url('/assets/images/elements/check.svg'); + padding-left: 25px; + line-height: 30px; - li { - color: #333; - font-size: 18px; - } + li { + color: #333; + font-size: 18px; + } } /*Font classes*/ .font-light { - font-family: $font-light; + font-family: $font-light; } .font-regular { - font-family: $font-regular; + font-family: $font-regular; } .font-medium { - font-family: $font-medium; + font-family: $font-medium; } .font-bold { - font-family: $font-bold; + font-family: $font-bold; } - /*Color classes*/ .text-mutted { - color: $mutted; + color: $mutted; } .text-mutted-soft { - color: $mutted-soft; + color: $mutted-soft; } .text-gray { - color: $gray; + color: $gray; } .text-danger { - color: $danger; + color: $danger; } .text-primary { - color: $primary; + color: $primary; } .text-white { - color: $white; + color: $white; } /*Background classes*/ .bg-mutted { - background-color: $mutted; + background-color: $mutted; } .bg-mutted-soft { - background-color: $mutted-soft; + background-color: $mutted-soft; } .bg-gray { - background-color: $gray; + background-color: $gray; } .bg-danger { - background-color: $danger; + background-color: $danger; } .bg-blue-gray { - background: $blue-gray; + background: $blue-gray; } .bg-soft-blue { - background: $soft-blue; + background: $soft-blue; } /*Margin classess*/ .mb-lg { - margin-bottom: 60px; - @include respond-to(md) { - margin-bottom: 50px; - } - @include respond-to(sm) { - margin-bottom: 30px; - } + margin-bottom: 60px; + @include respond-to(md) { + margin-bottom: 50px; + } + @include respond-to(sm) { + margin-bottom: 30px; + } } .mb-md { - margin-bottom: 50px; - @include respond-to(md) { - margin-bottom: 40px; - } - @include respond-to(sm) { - margin-bottom: 25px; - } + margin-bottom: 50px; + @include respond-to(md) { + margin-bottom: 40px; + } + @include respond-to(sm) { + margin-bottom: 25px; + } } .mb-sm { - margin-bottom: 40px; - @include respond-to(md) { - margin-bottom: 30px; - } - @include respond-to(sm) { - margin-bottom: 25px; - } + margin-bottom: 40px; + @include respond-to(md) { + margin-bottom: 30px; + } + @include respond-to(sm) { + margin-bottom: 25px; + } } .mb-xs { - margin-bottom: 5px; + margin-bottom: 5px; } diff --git a/src/scss/_components/_variables.scss b/src/scss/_components/_variables.scss index 947193030..b5cd7ad8a 100755 --- a/src/scss/_components/_variables.scss +++ b/src/scss/_components/_variables.scss @@ -11,9 +11,9 @@ $white: #ffffff; /* Black group */ $black: #000000; /* Gray group */ -$legaloblolly: #BDC9D0; //Nav and footer links color +$legaloblolly: #bdc9d0; //Nav and footer links color $alabaster: #f7f7f7; //Mutted -$seachell: #F8FAFA; //Mutted soft +$seachell: #f8fafa; //Mutted soft $alto: #dcdcdc; //Gray $scorpion: #111; //Body text color $gallery: #f0f0f0; @@ -22,11 +22,11 @@ $hoki: #668899; //Navbar bg $wild-sand: #f5f5f5; $mine-shaft: #333333; /* Blue group */ -$small-blue: #2196F3; //Footer bg -$soft-blue: #E9F2FF; +$small-blue: #2196f3; //Footer bg +$soft-blue: #e9f2ff; /* Red group */ -$bittersweet: #FF7864; //Danger -$bridesmaid: #FEECE7; +$bittersweet: #ff7864; //Danger +$bridesmaid: #feece7; /************************* Global color variable *************************/ @@ -42,12 +42,17 @@ $blue-gray: $hoki; /************************* Fonts variable *************************/ -$font-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important; +$font-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, + Ubuntu, Cantarell, 'Helvetica Neue', sans-serif !important; -$font-light: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important; -$font-regular: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important; -$font-medium: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important; -$font-bold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important; +$font-light: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, + Ubuntu, Cantarell, 'Helvetica Neue', sans-serif !important; +$font-regular: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif !important; +$font-medium: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, + Ubuntu, Cantarell, 'Helvetica Neue', sans-serif !important; +$font-bold: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, + Ubuntu, Cantarell, 'Helvetica Neue', sans-serif !important; $font-icon: 'FontAwesome'; @@ -60,7 +65,6 @@ $body-font-size-xs: 15px; $body-line-height: 1.6; $body-main-color: $body-text-color; - /************************* Links color variable *************************/ diff --git a/src/scss/main.scss b/src/scss/main.scss index b9ac19463..77fd92640 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -1,6 +1,6 @@ $bootstrap-sass-asset-helper: false; -$fa-font-path: "~font-awesome/fonts/"; -$icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/"; +$fa-font-path: '~font-awesome/fonts/'; +$icon-font-path: 'bootstrap-sass/assets/fonts/bootstrap/'; @import '~bootstrap-sass/assets/stylesheets/bootstrap'; @import '~font-awesome/scss/font-awesome'; @import '_components/_mixins.scss'; diff --git a/src/templates/DataSourcePage.jsx b/src/templates/DataSourcePage.jsx index 9f33f55da..94b0f4ff8 100644 --- a/src/templates/DataSourcePage.jsx +++ b/src/templates/DataSourcePage.jsx @@ -128,9 +128,9 @@ export default function DataSourcePageTemplate({
  • - Share insights from {frontmatter.name} via link - or embed them wherever you need to make your - organization truly data driven. + Share insights from {frontmatter.name} via link or + embed them wherever you need to make your organization truly + data driven.
  • Integrate Redash with external services and{' '} @@ -214,7 +214,7 @@ export default function DataSourcePageTemplate({ } export const pageQuery = graphql` - query($path: String!) { + query ($path: String!) { markdownRemark(frontmatter: { path: { eq: $path } }) { html frontmatter { diff --git a/src/templates/HelpArticle.jsx b/src/templates/HelpArticle.jsx index 6033c3d38..a944d3e57 100644 --- a/src/templates/HelpArticle.jsx +++ b/src/templates/HelpArticle.jsx @@ -75,7 +75,7 @@ class HelpPageTemplate extends React.Component { const headings = document .getElementById('pageContent') .querySelectorAll('h1, h2, h3, h4, h5, h6') - headings.forEach(heading => { + headings.forEach((heading) => { heading.id = heading.id || heading.textContent.replace(/[\. ,:-]+/g, '-').replace(/-$/, '') @@ -235,7 +235,7 @@ class HelpPageTemplate extends React.Component { } export const pageQuery = graphql` - query($category: String!, $parent_category: String, $slug: String) { + query ($category: String!, $parent_category: String, $slug: String) { Article: markdownRemark( frontmatter: { parent_category: { eq: $parent_category } diff --git a/src/templates/NarrowTextPage.jsx b/src/templates/NarrowTextPage.jsx index 94ee1ed1c..e7e606b75 100644 --- a/src/templates/NarrowTextPage.jsx +++ b/src/templates/NarrowTextPage.jsx @@ -22,7 +22,7 @@ export default function NarrowTextPageTemplate({ } export const pageQuery = graphql` - query($path: String!) { + query ($path: String!) { markdownRemark(frontmatter: { path: { eq: $path } }) { html frontmatter { diff --git a/src/templates/TextPage.jsx b/src/templates/TextPage.jsx index c5df37fc4..6e88931c1 100644 --- a/src/templates/TextPage.jsx +++ b/src/templates/TextPage.jsx @@ -18,7 +18,7 @@ export default function TextPageTemplate({ } export const pageQuery = graphql` - query($path: String!) { + query ($path: String!) { markdownRemark(frontmatter: { path: { eq: $path } }) { html frontmatter {