Compare commits

..

1969 Commits

Author SHA1 Message Date
Gabriel Dutra
19343a0520 Clear QueryBasedParameterInput 2020-11-23 19:18:35 -03:00
Gabriel Dutra
c1ed8848f0 Merge branch 'master' into query-based-dropdown--parameters 2020-11-23 16:42:06 -03:00
Gabriel Dutra
b40070d7f5 Use LabeledValues for parameterized queries 2020-11-23 16:40:18 -03:00
Rafael Wendel
fa2b57a209 Remove unwanted props from Select component (#5277)
* Explicitly selected props so as to avoid errors from non-wanted props

* Simplified approach

* Ran prettier 😬

* Fixed minor issues
2020-11-22 13:07:56 -03:00
Jiajie Zhong
132fed64b3 Correct cleanup_query_results comment (#5276)
Correct comment from QUERY_RESULTS_MAX_AGE
to QUERY_RESULTS_CLEANUP_MAX_AGE
2020-11-20 23:11:13 +02:00
Gabriel Dutra
bd9ce68f68 Don't filter out values when param has search 2020-11-20 15:14:17 -03:00
Gabriel Dutra
0c0b62ae1a Remove searchTerm from structure 2020-11-20 15:13:47 -03:00
Gabriel Dutra
08bcdf77d0 Mock query instead of query_has_parameters 2020-11-12 09:11:54 -03:00
Gabriel Dutra
aa2064b1ab Fix other dropdown_values usages to use query obj 2020-11-11 13:58:01 -03:00
Gabriel Dutra
d0a787cab1 Make NoResultFound invalid parameters 2020-11-10 22:10:47 -03:00
Gabriel Dutra
a741341938 Oops 2020-11-10 20:46:51 -03:00
Gabriel Dutra
53385fa24b Merge branch 'master' into query-based-dropdown--parameters 2020-11-10 15:19:43 -03:00
Gabriel Dutra
fa7ecca485 Frontend updates from internal fork (#5259)
* DynamicComponent for QuerySourceAlerts

* General Settings updates

* Dynamic Date[Range] updates

* EmptyState updates

* Query and SchemaBrowser updates

* Adjust page headers and add disablePublish

* Policy updates

* Separate Home FavoritesList component

* Update FormatQuery

* Autolimit frontend fixes

* Misc updates

* Keep registering of QuerySourceDropdown

* Undo changes in DynamicComponent

* Change sql-formatter package.json syntax

* Allow opening help trigger in new tab

* Don't run npm commands as root in Dockerfile

* Cypress: Remove extra execute query
2020-11-10 14:59:15 +02:00
deecay
8f484706b1 Enable Boxplot to be horizontal (#5262) 2020-11-08 23:17:08 +02:00
Josh Bohde
e2e8714155 Enable graceful shutdown of rq workers (#5214)
* Enable graceful shutdown of rq workers

* Use `exec` in the `worker` command of the entrypoint to propagate
  the `TERM` signal
* Allow rq processes managed by supervisor to exit without restart on
  expected status codes
* Allow supervisorctl to contact the running supervisor
* Add a `shutdown_worker` command that will send `TERM` to all running
  worker processes and then sleep. This allows orchestration systems
  to initiate a graceful shutdown before sending `SIGTERM` to
  supervisord

* Use Heroku worker as the BaseWorker

This implements a graceful shutdown on SIGTERM, which simplifies
external shutdown procedures.

* Fix imports based upon review

* Remove supervisorctl config
2020-11-05 11:49:45 +02:00
Jerry
c6bf8a1c55 bugfix: fix #5254 (#5255)
Co-authored-by: Jerry <jerry.yuan@webweye.com>
2020-11-04 20:56:41 +02:00
Rafael Wendel
12f71925c2 Multiselect dropdown slowness (fix) (#5221)
* created util to estimate reasonable width for dropdown

* removed unused import

* improved calculation of item percentile

* added getItemOfPercentileLength to relevant spots

* added getItemOfPercentileLength to relevant spots

* Added missing import

* created custom select element

* added check for property path

* removed uses of percentile util

* gave up on getting element reference

* finished testing Select component

* removed unused imports

* removed older uses of Option component

* added canvas calculation

* removed minWidth from Select

* improved calculation

* added fallbacks

* added estimated offset

* removed leftovers 😅

* replaced to percentiles to max value

* switched to memo and renamed component

* proper useMemo syntax

* Update client/app/components/Select.tsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* created custom restrictive types

* added quick const

* fixed style

* fixed generics

* added pos absolute to fix percy

* removed custom select from ParameterMappingInput

* applied prettier

* Revert "added pos absolute to fix percy"

This reverts commit 4daf1d4bef.

* Pin Percy version to 0.24.3

* Update client/app/components/ParameterMappingInput.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* renamed Select.jsx to SelectWithVirtualScroll

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-11-03 21:50:39 +02:00
Omer Lachish
cae088f35b extend the refresh_queries timeout from 3 minutes to 10 minutes (#5253) 2020-11-02 22:36:57 +02:00
Rafael Wendel
a3c79f26b9 Fix for the typo button in ParameterMappingInput (#5244) 2020-10-29 17:24:13 -03:00
Jonathan Hult
c7c92a3192 Fix annotation bug causing queries not to run - ORA-00933 (#5179) 2020-10-28 10:03:26 +02:00
Rafael Wendel
55cf17aa47 added required to Form.Item and Input for better UI (#5231)
* added required to Form.Item and Input for better UI

* removed required from input

* Revert "removed required from input"

This reverts commit b56cd76fa1.

* Redo "removed required from input"

* removed typo

Co-authored-by: rafawendel2010@gmail.com <rafawendel>
2020-10-28 09:37:16 +02:00
Levko Kravets
8dd76a00c5 Fix dashboard background grid (#5238) 2020-10-26 21:46:38 +02:00
Christopher Grant
e242ac2b10 Static SAML configuration and assertion encryption (#5175)
* Change front-end and data model for SAML2 auth - static configuration

* Add changes to use inline metadata.

* add switch for static and dynamic SAML configurations

* Fixed config of backend static/dynamic to match UI

* add ability to encrypt/decrypt SAML assertions with pem and crt files. Upgraded to pysaml2 6.1.0 to mitigate signature mismatch during decryption

* remove print debug statement

* Use utility to find xmlsec binary for encryption, formatting saml_auth module

* format SAML Javascript, revert want_signed_response to pre-PR value

* pysaml2's entityid should point to the sp, not the idp

* add logging for entityid for validation

* use mustache_render instead of string formatting. put all static logic into static branch

* move mustache template for inline saml metadata to the global level

* Incorporate SAML type with Enabled setting

* Update client/app/pages/settings/components/AuthSettings/SAMLSettings.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Chad Chen <chad.chen@databricks.com>
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-10-25 12:06:45 -03:00
Gabriel Dutra
66463aedd4 Fix Home EmptyState help link (#5217) 2020-10-16 11:53:21 -03:00
Rafael Wendel
8a6524c1ba Add horizontal bar chart (#5154)
* added bar chart boilerplate

* added x/y manipulation

* replaced x/y management to inner series preparer

* added tests

* moved axis inversion to all charts series

* removed line and area

* inverted labels ui

* removed normalizer check, simplified inverted axes check

* finished working hbar

* minor review

* added conditional title to YAxis

* generalized horizontal chart for line charts, resetted state on globalSeriesType change

* fixed updates

* fixed updates to layout

* fixed minor issues

* removed right Y axis when axes inverted

* ran prettier

* fixed updater function conflict and misuse of getOptions

* renamed inverted to swapped

* created mappingtypes for swapped columns

* removed unused import

* minor polishing

* improved series behaviour in h-bar

* minor fix

* added basic filter to ChartTypeSelect

* final setup of filtered chart types

* Update viz-lib/src/components/visualizations/editor/createTabbedEditor.jsx

* added proptypes and renamed ChartTypeSelect props

* Add missing import

* fixed import, moved result array to global scope

* merged import

* clearer naming in ChartTypeSelect

* better lodash map syntax

* fixed global modification

* moved result inside useMemo

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Levko Kravets <levko.ne@gmail.com>
2020-10-15 21:34:38 +03:00
Gabriel Dutra
9097feb100 Frontend updates from internal fork (#5209) 2020-10-15 14:25:22 -03:00
Gabriel Dutra
db4e97fa6f Remove build args from Cypress start script (#5203) 2020-10-09 12:23:14 -03:00
Levko Kravets
0d4615a482 Extra actions on Queries and Dashboards pages (#5201)
* Extra actions for Query View and Query Source pages

* Convert Queries List page to functional component

* Convert Dashboards List page to functional component

* Extra actions for Query List page

* Extra actions for Dashboard List page

* Extra actions for Dashboard page

* Pass some extra data to Dashboard.HeaderExtra component

* CR1
2020-10-09 12:12:56 +03:00
Alexander Rusanov
ff008a076b Updated Cypress to v5.3 and fixed e2e tests (#5199)
* Upgraded Cypress to v5.3 and fixed e2e tests

* Updated cypress image

* Fixed failing tests

* Updated NODE_VERSION in netlify

* Update client/cypress/integration/visualizations/choropleth_spec.js

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* fixed test in choropleth

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-10-06 16:06:47 -03:00
Gabriel Dutra
8d548ecbac Share Embed Spec: Make sure query is executed (#5191) 2020-10-04 16:01:30 +03:00
Gabriel Dutra
2992c382d1 ScheduleDialog: Filter empty interval groups (#5196) 2020-10-03 05:54:05 +03:00
Gabriel Dutra
f4dcb2918a Move Cypress to dev dependencies (#3991)
* Test Cypress on package list

* Skip Puppeteer Chromium as well

* Put back missing npm install on netlify.toml

* Netlify: move env vars to build.environment

* Remove cypress:install script

* Update Cypress dockerfile

* Copy package-lock.json to Cypress dockerfile
2020-09-29 09:51:28 +03:00
Gabriel Dutra
c821cab4cb Generate Code Coverage report for Cypress (#5137) 2020-09-28 21:43:04 -03:00
Levko Kravets
4fb77867b0 Align Y axes at zero (#5053)
* Align Y axes as zero

* Fix typo (with @deecay)

* Add alignYAxesAtZero function

* Avoid 0 division

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-09-28 13:12:40 +03:00
Levko Kravets
a473611cb0 Some Choropleth improvements/refactoring (#5186)
* Directly map query results column to GeoJSON property

* Use cache for geoJson requests

* Don't handle bounds changes while loading geoJson data

* Choropleth: fix map "jumping" on load; don't save bounds if user didn't edit them; refine code a bit

* Improve cache

* Optimize Japan Perfectures map (remove irrelevant GeoJson properties)

* Improve getOptions for Choropleth; remove unused code

* Fix test

* Add US states map

* Convert USA map to Albers projection

* Allow to specify user-friendly field names for maps
2020-09-24 14:39:09 +03:00
Levko Kravets
210008c714 Ask user to log in when session expires (#5178)
* Ask user to log in when session expires

* Update implementation

* Update implementation

* Minor fix

* Update modal

* Do not intercept calls to api/session as Auth.requireSession() relies on it

* Refine code; adjust popup size and position
2020-09-23 16:30:08 +03:00
Omer Lachish
aa5d4f5f4e add 'cancelled' meta directive to all cancelled jobs (#5187) 2020-09-23 12:54:48 +03:00
Omer Lachish
6b811c5245 Refresh CSRF tokens (#5177)
* expire CSRF tokens after 6 hours

* use axios' built-in cookie to header copy mechanism

* add axios-auth-refresh

* retry CSRF-related 400 errors by refreshing the cookie

* export the auth refresh interceptor to support ejecting it if neccessary

* reject the original request if it's unrelated to CSRF
2020-09-21 23:21:14 +03:00
Levko Kravets
83726da48a Keep additional URL params when forking a query (#5184) 2020-09-21 12:54:55 +03:00
Levko Kravets
72dc157bbe Allow to clear selected tags on list pages (#5142)
* Convert TagsList to functional component

* Convert TagsList to typescript

* Allow to unselect all tags

* Add title to Tags block and explicit "clear filter" button

* Some tweaks
2020-09-17 14:01:15 +03:00
Lingkai Kong
1b8ff8e810 Add default limit (1000) to SQL queries (#5088)
* add default limit 1000

* Add frontend changes and connect to backend

* Fix query hash because of default limit

* fix CircleCI test

* adjust for comment
2020-09-14 14:18:31 +03:00
Omer Lachish
31ddd0fb79 prevent assigning queries to view_only data sources (#5152) 2020-09-10 15:43:25 +03:00
Levko Kravets
5cabf7a724 Keep selected filters when switching visualizations (#5146)
* getredash/redash#4944 Query pages: keep selected filters when switching visualizations

* Pass current filters to expanded widget modal
2020-09-10 13:42:53 +03:00
max-voronov
59b135ace7 Move CardsList to typescript (#5136)
* Refactor CardsList - pass a suffix for list item

Adding :id to an item to be used as a key suffix is redundant and the same
can be accomplished by using :index from the map function.

* Move CardsList to typescript

* Convert CardsList component to functional component

* CR1

* CR2
2020-09-05 20:08:01 +03:00
Gabriel Dutra
32b41e4112 Misc frontend changes from internal fork (#5143) 2020-09-04 08:00:30 -03:00
Gabriel Dutra
2e31b91054 Antd v4: Fix CreateUserDialog (#5139)
* Antd v4: Update CreateUserDialog

* Add Cypress test for user creation
2020-09-04 07:57:43 -03:00
Gabriel Dutra
205915e6db Add toggle to disable public URLs (#5140)
* Add toggle to disable public URLs

* Add Cypress tests
2020-09-01 08:49:30 -03:00
Levko Kravets
b7c245f925 Support multiple queries in a single query box (#5058)
* Support multiple queries in a single query box

* Implement statement splitting function and add tests for it

* Add a test for databricks-specific syntax

* Split statements before running query
2020-08-30 15:54:16 +03:00
Levko Kravets
681b2f1abd Introduce Link component (#5122)
* Introduce Link component

* Use Link component for external links as well

* Remove unused file (I hope it's really not needed)

* Use Link component in visualizations library

* Simplify Link component implementation

* CR1

* Trigger build

* CR2
2020-08-30 15:33:38 +03:00
Gabriel Dutra
a31196aef8 Upgrade Ant Design to v4 (#5068) 2020-08-25 14:24:15 -03:00
Arik Fraimovich
596e5bee3a Misc changes to codebase back ported from internal fork - part 2 (#5130)
* Auth: make login url configurable.

* More portable image url.

* durationHumanize: support for milliseconds.

* Sorter: support for custom sort.
2020-08-25 15:08:07 +03:00
Arik Fraimovich
84d516bfd1 Misc changes to codebase back ported from internal fork (#5129)
* Set corejs version in .babelrc so Jest doesn't complain.

* Rewrite services/routes in TypeScript.

* Add TypeScript definitions for DialogComponent.

* Make image paths more portable

* Add current route context and hook.

* Make EmptyState more flexible by being able to pass in getSteps function.

* Rewrite ItemsList in TypeScript.

* Introduce the possibility to add custom sorters for a column.

* Rearrange props to be friendly to TypeScript.

* Type definitions for NotificationApi.

* Use Databricks query editor components for databricks_internal type of query runner.

* URL Escape password in Alembic configuration.

* Compare types in migrations.
2020-08-25 14:11:38 +03:00
Gabriel Dutra
2cc3bd3d54 Add DynamicComponent to PermissionsControl flag (#5116) 2020-08-21 17:14:19 -03:00
Gabriel Dutra
ac652c20bf Fix create link on data sources page (#5121)
* Fix create link on data sources page

* Cypress: Add test that the source dialog opens
2020-08-21 16:47:42 -03:00
Gabriel Dutra
1bc6cd8f41 Keep widget loading when fetch request is replaced (#5118) 2020-08-20 19:00:57 -03:00
Levko Kravets
4c70b5ce8e Remove content width limit on all pages (#5091)
* Remove content width limit on all pages

* Update client/app/assets/less/inc/base.less

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Remove content limit; limit sidebar width

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-08-20 15:04:53 +03:00
Omer Lachish
de052ff02b Cypress touch-ups (#5109)
* allow non-sequential IDs for DataSources in Cypress tests

* refactor redash-api to a set of Cypress commands

* support mounting Redash endpoints in Cypress routes

* fix some parameter specs by waiting for schema to load

* extract baseUrl from cypress.json

* Restyled by prettier (#5110)

Co-authored-by: Restyled.io <commits@restyled.io>

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
2020-08-19 21:00:06 +03:00
Gabriel Dutra
a596d6558c Use Skeleton as ItemsList loading state (#5079) 2020-08-19 09:36:11 -03:00
Gabriel Dutra
fc71acdc09 Make DataSourceListComponent a dynamic component (#5113) 2020-08-19 08:59:53 -03:00
Gabriel Dutra
b326d36ae8 Update Organization Settings (#5114)
* Update Organization Settings

* Cypress: Update tab naming
2020-08-19 13:09:28 +03:00
Omer Lachish
378cc57d42 CSRF Exempts (#5108)
* if present, always convert CSRF cookies to headers

* exempt auth blueprints from CSRF protection

* respect CSRF exempts
2020-08-17 22:39:46 +03:00
peterlee
83c6a6bcd2 Make table visualization header fixed (#5103)
* add lock table header

* Move styling to a new class

* Update renderer.less

* Move class to table and fix top border

* Update renderer.less

* Update viz-lib/src/visualizations/table/renderer.less

Thanks, this change is good to me.

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-08-17 09:26:34 -03:00
Omer Lachish
5afd0554d0 Add support for CSRF tokens (#5055)
* add flask-wtf

* add CSRF tokens to all static forms

* add CSRF tokens to all axios requests

* disable CSRF validation in unit tests

* support CSRF-protected requests in *most* cypress tests

* don't enfroce CSRF checks by default

* avoid CSRF enforcement in unit tests

* remove redundant spread

* some camel casing hiccups

* always yield the CSRF cookie, but avoid enforcing it if CSRF toggle is off

* Restyled by prettier (#5056)

Co-authored-by: Restyled.io <commits@restyled.io>

* set a CSRF header only if cookie is present

* enforce CSRF in CI

* install lodash directly for Cypress

* install request-cookies directly for Cypress. We should probably start loading package.json deps

* enable CSRF support when logout and login happen within the same spec

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
2020-08-09 15:47:00 +03:00
Levko Kravets
eb603f63f0 Bar chart with second y axis overlaps data series (#4150) 2020-08-05 20:28:03 +03:00
Arik Fraimovich
6c00f7c4e3 Add: periodic job to remove ghost locks. (#5087) 2020-08-05 17:48:19 +03:00
koooge
f56f4c4899 fix: Compose version due to --build-arg (#5083)
Signed-off-by: koooge <koooooge@gmail.com>
2020-08-05 12:41:25 +03:00
Tobias Macey
d3b639a68a Exposing setting for overriding template directory (#4324)
When using some of the customized login flows such as `REMOTE_USER` the deployed site breaks due to not finding template files. This change updated the app default to use the existing Flask templates directory rather than the compiled static assets directory which only contains an index.html file.
2020-08-04 12:05:43 +03:00
Gabriel Dutra
3332b656ac Make sure Policy is loaded for user session (#5081) 2020-07-31 01:39:30 -03:00
Gabriel Dutra
24c95379ca Introduce caching to the Databricks Schema Browser (#5038)
* Add refresh button in the bottom

* Add caching

* Drop allSettled

* Simplify refresh button

* Update error to return 500

* Load tables before loading columns

* Don't mutate schema

* Reset db name and schemas when changing data source

* Load both tables and columns

* Return error with code 200

* Code review updates

* Add expiration time to the cache Keys

* Back with RQ
2020-07-30 15:16:14 +03:00
Levko Kravets
93b4be672f Queries list: move "My Queries" above "Archived" (#5072) 2020-07-28 19:53:22 +03:00
Gabriel Dutra
f3a47a9658 Move page size select to the Paginator component (#5064) 2020-07-27 16:52:09 -03:00
Omer Lachish
7804dfd68e loosen up some proptypes and backend casting to allow different primary key types (#5066) 2020-07-27 17:01:59 +03:00
Ben Amor
2dacd08bea Add override mechanism for webpack config (#5057) 2020-07-27 14:52:02 +03:00
Gabriel Dutra
fd76a2ecfb Add Column Type to Databricks schema browser (#5052)
* Add Column Type to Databricks schema browser

* Map schema columns to be an object

* Format pg with Black

* Add data_type for Postgres
2020-07-23 12:52:09 +03:00
Omer Lachish
7f98d7b694 Load extensions on db init (#5062)
* Only try to create tables and stamp DB if not tables exist already.

* load extensions when creating the database
2020-07-23 11:05:20 +03:00
Levko Kravets
a1255b4144 Fix wrong Y-axis range for stacked bar chart (#5029)
* getredash/redash#5026 Fix wrong Y-axis range for stacked bar chart

* Update tests

* Use Plotly's built-in algorinthm to compute Y-axis range

* Update tests

* Revert previous solution (yRange-related code)

* Revert other unrelated changes

* Revert other unrelated changes

* Move chart rendering to own file and ensure that rendering steps will occur in necessary order

* Reduce amount of plot updates by mergin separate updates into a sigle cumulative update

* Give better names for several functions
2020-07-17 11:28:15 +03:00
dependabot[bot]
6c349ea70a Bump lodash from 4.17.15 to 4.17.19 in /viz-lib (#5051)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-16 22:41:16 -03:00
Omer Lachish
95c28c47ad Eager load outdated queries (#5049)
* eager load outdated queries

* explicitly use .all() instead of list()
2020-07-16 23:29:47 +03:00
simonschneider-db
48924de700 Add TypeScript support (#5027)
* TASK Add typescript dependencies to package.json

* TASK Add typescript to build process and npm scripts and TASK Move example components to typescript and add an example definition file.

* TASK Move back to ts-loader instead of babel typescript preset

* FIX Remove unnecessary changes

* FIX Explicitly mention tsconfig file in webpack.config.js to avoid `error while parsing tsconfig.json, The 'files' list in config file 'tsconfig.json' is empty`
See (https://github.com/TypeStrong/ts-loader/issues/405#issuecomment-330108362)

* FIX Move tsconfig to client subdirectory to make it accessible in docker container (only webpack.config.js is copied over from root folder in Dockerfile)

* TASK Move from ts-loader to babel to reduce compatibility issues between ES6/7 and typescript compilation.

* TASK Add types for classnames, hoist-non-react-statics and lodash. Fix default export of DashboardList and run prettier on eslintrc

* Run npm install

* Trigger tests

* Run npm install 2

* Trigger tests
2020-07-16 23:05:44 +03:00
Jannis Leidel
41a691328a Fix bundle-extensions script to work on recent importlib-resources. (#5050)
Also adds a test case for running the script.
2020-07-16 23:05:22 +03:00
Omer Lachish
cb97364771 Dashboard URL does not show new name when dashboard name is updated (#1009)
* on dashboard api calls - take the id from the beginning of the slug, unless there is no number in it - in that case, take the entire slug as id

* add dashboard id when showing links to dashboards

* change path to include new name when renaming dashboards

* move slug generation to backend

* redirect to new name after changing (this time with a proper promise)

* oh right, we already have a slug function

* add spec that makes sure that renamed dashboards are redirected to the
url which contains their new name

* use id-slug in all Cypress specs

* move dashboards from /dashboard/:slug to /dashboards/:id-:name_as_slug

* Update dashboard url as its name changes

* Update separator to be "/"

* Update missing dashboard urls

* Update api not to depend on int id

* Use '-' instead of '/' as separator and update Dashboard.get calls

* slug -> name_as_slug

* Keep slug urls on cypress

* Update route path

* Use legacy attr for GET

* Use getter for urlForDashboard

* Update dashboard url when loaded by slug

* Update Dashboard routes to use id instead of slug

* Update Dashboard handler tests

* Update Cypress tests

* Fix create new dashboard spec

* Use axios { params }

* Drop Ternary operator

* Send updated slug directly in 'slug' attr

* Update multiple urls Dashboard test name

* Update route names

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Levko Kravets <levko.ne@gmail.com>
2020-07-16 23:03:59 +03:00
Gabriel Dutra
d12691dc2a Databricks Schema Browser: Allow eventlet worker instead of RQ (#5045)
* Add loading button in UI

* Handle databricks schema requests without RQ

* Don't use gevent worker

* Revert "Don't use gevent worker"

This reverts commit 9704c70a94.

* Use eventlet

* Use first column instead of 'namespace' one

* Revert "Add loading button in UI"

This reverts commit c0e4dfb966.

* Remove databricks tasks

* Update eventlet

* Add libevent

* Display logs on failure

* Revert "Add libevent"

This reverts commit a00d067cb7.

* Test updating gunicorn

* Don't set eventlet as the default for Redash

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Remove fetchDataFromJob usage

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-07-15 17:35:59 +03:00
Levko Kravets
6f9e79c641 getredash/redash#5031 Counter is too large on Query View/Source pages (#5044) 2020-07-14 21:56:01 +03:00
Gabriel Dutra
461f98bbfc Update Ace Editor version (#5041) 2020-07-14 10:02:33 -03:00
Levko Kravets
81e7c72d48 Allow to change order of legend items (#5021)
* Allow to change order of legend items

* Update tests
2020-07-13 19:08:51 +03:00
Gabriel Dutra
328f0f3f0c Visualizations Library: Enhance docs (#4946) 2020-07-12 12:36:03 -03:00
Omer Lachish
ecb9adf903 purge_failed_jobs can take up to several minutes, so better have a proper timeout (#5033) 2020-07-12 10:18:38 +03:00
Gabriel Dutra
87e09f676e Dynamic Form: Make default extra fields state a prop (#5039) 2020-07-09 12:39:25 -03:00
Gabriel Dutra
6fc5c803e0 Fix schema browser items height (#5024) 2020-07-08 11:55:10 -03:00
Gabriel Dutra
6c57aa448e Query Source: Add Shift+Enter shortcut for query execution (#5037) 2020-07-08 10:36:16 -03:00
Lei Ni
878b297601 Fix: sorting queries by schedule was resulting in a wrong order (#4954)
* fix schedule sorting issue

* style change

* Update to meet code style.

* move the schedule sort to backend

* mod comment

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-07-07 21:29:12 +03:00
Levko Kravets
9c0450c84e Explicitly sort routes to reduce a chance of conflicts (#5020)
* Explicitly sort routes to reduce (avoid at all?) a chance of conflicts

* Sort routes by params count
2020-07-03 21:11:39 +03:00
Levko Kravets
74f206614f Refactor: extract commonly used pattern into hook (#5022) 2020-07-03 10:44:51 +03:00
Gabriel Dutra
2f26cf791c Fix Databricks Schema Browser scrollbar (#5023) 2020-07-02 17:20:22 -03:00
Levko Kravets
c6be5758ad Y-axis autoscale fails when min or max is set (#4904)
* getredash/redash#4784 Y-axis autoscale fails when min or max is set

* Update tests

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-07-02 20:33:20 +03:00
Alex Kovar
8341592b05 Add plus between tags to clarify how they are used #4628 (#5017)
Co-authored-by: Levko Kravets <kravets-levko@users.noreply.github.com>

Co-authored-by: Levko Kravets <kravets-levko@users.noreply.github.com>
2020-07-02 18:44:38 +03:00
Gabriel Dutra
a7edbf1e8d Handle React exception when a function is provided (#5016) 2020-07-01 22:53:42 -03:00
Gabriel Dutra
217f41b586 Allow GET from non-admins on data source resource (#4992) 2020-07-01 10:10:24 -03:00
Gabriel Dutra
a8bd07e293 Databricks custom Schema Browser (#5010) 2020-07-01 10:09:18 -03:00
Omer Lachish
332c16b130 add a couple of missed custom key types hooks (#5014) 2020-07-01 12:39:46 +03:00
Vladislav Denisov
7940d36616 Python query runner fix (#4966)
* fixed print method

* fixed `.items()` error

* added extra builtins

* added guarded_unpack_sequence
2020-07-01 10:53:27 +03:00
Daniel Lang
68b70ed63b Fixed broken custom JS visualization settings (#5013) 2020-07-01 01:22:07 -03:00
Gabriel Dutra
e0297835df Add "Last 12 months" option to dynamic date ranges (#5004) 2020-06-30 09:56:00 -03:00
Omer Lachish
004bc7a2ac Custom primary/foreign key types (#5008)
* allow overriding the type of key used for primary/foreign keys of the different models

* rename key_types to singular key_type

* add some documentation for `database_key_definitions`
2020-06-30 15:08:28 +03:00
Gabriel Dutra
efcf22079f Allow private addresses when enforcing is disabled (#4983) 2020-06-30 10:54:49 +03:00
Levko Kravets
a83cb18cc5 Textbox: confirm close if text was changed (#5009)
* Textbox: confirm close if text was changed

* Update texting (with @gabrieldutra)

* Update texting

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-06-29 19:29:56 +03:00
Levko Kravets
1ecdf7b853 Too large visualization cause filters block to collapse (#5007) 2020-06-29 15:20:08 +03:00
Omer Lachish
90024ebc92 Delete locks for cancelled queries (#5006)
* delete locks for cancelled queries

* test that query cancellations do not prevent reenqueues
2020-06-29 13:09:01 +03:00
Gabriel Dutra
a37b7babbf Remove pace-progress (#4990) 2020-06-28 15:27:48 -03:00
Mike Nason
8f4ac958b1 Fix org option in users create_root cli command (#5003)
Thanks @nason 👍
2020-06-25 22:02:46 +03:00
Omer Lachish
637d9837f4 Avoid purging operational queues (#4973)
* avoid purging operational queues

* schema queues actually run queries, so they should be purged
2020-06-25 15:35:50 +03:00
Levko Kravets
bdd3c3e735 Dynamically register frontend routes (#4998)
* Allow to override frontend routes

* Configure app before initializing ApplicationArea

* Refine code
2020-06-25 13:38:23 +03:00
Levko Kravets
6fc35510d3 Allow unregistering settings tabs (#5000) 2020-06-25 12:54:46 +03:00
Levko Kravets
6f842ef94a Refactor User Profile page and add extension points to it (#4996)
* Move components specific to UserProfile page to corresponding folder

* Split UserProfile page into components

* Rename components, refine code a bit

* Add some extension points

* Fix margin
2020-06-25 12:03:19 +03:00
Levko Kravets
a563900f0a Refactor Organization Settings and add extension points to it (#4995)
* Split OrganizationSettings page into components

* Update change handling: use objects instead of string keys, move some logic to more appropriate place

* Convert OrganizationSettings page to functional component and refine code a bit

* Add some extension points

* Improve onChange handler

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-06-24 12:36:45 +03:00
Gabriel Dutra
ee3930c64d Catch QueryResultError on widget load (#4991) 2020-06-23 19:48:14 -03:00
Levko Kravets
10bff8b3b1 Some permissions fixes (#4994)
* Don't show New ... buttons on list pages if user doesn't have corresponding permissions

* Hide Create menu item if no create actions available
2020-06-23 22:56:24 +03:00
Jim Sparkman
a8510d1ad5 Fix CLI command for "status" (#4989)
* Fix CLI command for "status"

CLI command "status" can fail due to incorrect connection information to RQ.

This change matches the behavior from line 65 and solves the connection error.

* Move connection up to CLI entrypoint
2020-06-23 14:40:36 +03:00
Levko Kravets
3a543a4ab2 ErrorMessage is not centered (#4981)
* ErrorMessage is not centered

* Adjust ErrorMessage size on large screens

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-06-18 15:35:51 +03:00
Levko Kravets
2b1ba1ee33 Add New Dashboard/Query/Alert buttons to corresponding list pages (#4976) 2020-06-18 15:23:48 +03:00
Levko Kravets
4a54ad9d06 Add/Edit Tags dialog does not set focus on tags input (#4979)
* Refactor: convert EditTagsDialog to functional component; properly cleanup on destruction

* Pass focus to select when EditTagsDialog opens
2020-06-18 15:05:07 +03:00
Levko Kravets
676f560830 Navbar: show correct settings link for non-admin users (#4978)
* Non-admin users have an access to some settings, so need to show correct menu item in navbar

* Refine settings test

* Add some tests
2020-06-18 14:49:08 +03:00
Levko Kravets
98a5154345 Fix headless mode (didn't work with vertical navbar) (#4977)
* Fix headless mode (didn't work with vertical navbar)

* Fix header margins on public dashboard page

* Fix test
2020-06-17 11:10:12 +03:00
Gabriel Dutra
4c324ddc80 Custom Query components per Data Source type (#4948) 2020-06-15 16:13:10 -03:00
Gabriel Dutra
05c2233782 Don't reuse getErrorMessage (#4968) 2020-06-15 07:45:02 -03:00
Levko Kravets
0ac24e38a1 Vertical navbar (#4859)
* Vertical navbar

* Update vertical menu look and add create menu.

* Make query editor work with vertical nav.

* Dark mode

* Fix create menu & make sidebar fixed.

* Update Alert pages layout

* Update System status pages

* Update Queries and Dashboards list pages

* Update Query Source and Query View pages

* Use dark theme for mobile navbar

* Update Dashboard page: fix Add widget/textbox panel positioning

* Dashboard page: fix layout issues when container changes its size (fixes known issues: navbar expand/collapse, scrollbar appears/hides)

* Fix dashboard page sticky header (there was a 15px space above it)

* Fix embeds

* Extract desktop navbar component; move mobile navbar and its styles to ApplicationLayout folder

* Remove old app header

* Fix tests

* Restore version info block

* Make Percy capture entire page

* Make vertical navbar expand/collapse animation smoother (as it's currently impossible to disable it :-( )

* Fix misc UI issues (show Create label on expanded menu; fix some CSS; don't select items on click)

* Allow to override navbars with DynamicComponent

* Fix misc UI issues: expand/collapse button animation, menu items styles, menu expand/collapse animation

* Hide submenu arrow; show username when menu is expanded

* Refine CSS and make it more isolated; adjust colors

* Update tests

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-06-15 10:01:49 +03:00
Arik Fraimovich
d036df0ca1 V9 changelog (in master) (#4967)
* V9 Changelog: Initial Draft from Jesse

* V9 Changelog: Add later updates

* Adjust title spacing

* Apply Jesse's suggestions

Co-authored-by: Jesse <jesse@whitehouse.dev>

* provide an explanation on how to switch from Celery to RQ when upgrading to v9

* Update CHANGELOG.md

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Add contributor names

* Update version.

* Update CHANGELOG

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Jesse <jesse@whitehouse.dev>
Co-authored-by: Omer Lachish <omer@rauchy.net>
2020-06-11 12:33:36 +03:00
Gabriel Dutra
56df870f39 Plotly Charts: use .legend to determine legends size (#4935)
* Plotly Charts: use .bg to determine legends size

* Test: remove hack for legend below plotly

* Revert "Test: remove hack for legend below plotly"

This reverts commit d8efb0c032.

* Use .legend to calculate bounds

* Also update plots without legend
2020-06-11 12:30:55 +03:00
Arik Fraimovich
05540164e1 Small updates to Dockerfile (#4964) 2020-06-11 12:28:59 +03:00
Gabriel Dutra
bdb62365b1 Fix Sankey issue to render 1 and 5 stages (#4965)
* Sankey: Make sure last stage has "Exit"

* Sankey: Use 2 as min stage width size to render

* Use null instead of "Exit"

* Add comment about corresponding exit node

* Add multiple stages on Cypress test
2020-06-11 12:28:45 +03:00
Gabriel Dutra
6a12168f40 Make sure page updates when 'routes' changes (#4962) 2020-06-09 15:43:23 -03:00
Gabriel Dutra
ac0b494953 Fix Destination not returning custom error message (#4959) 2020-06-09 11:14:29 -03:00
Gabriel Dutra
77e8d70a64 Make sure queries have options and parameters (#4952) 2020-06-09 11:13:42 -03:00
Rob Hudson
8597b727a7 Update requirements_bundles versions and comment (#4939) 2020-06-09 13:38:29 +02:00
Omer Lachish
e233611840 Fix wrong Sentry exception messages on invalid parameters (#4945)
* don't join underlying exception message with commas when invalid parameter errors happen

* Revert "don't join underlying exception message with commas when invalid parameter errors happen"

This reverts commit 71a21b7ce6.

* when a problem occurs during refresh_queries, report it as a RefreshQueriesError
2020-06-07 13:05:31 +03:00
Gabriel Dutra
dd6098d405 MongoDB: Only set readPreference when it has one (#4947)
* MongoDB: Only set readPreference when it has one

* Use .get for readPreference
2020-06-07 12:39:43 +03:00
Omer Lachish
d38d3b6b4d support comma-separated queue lists for backward compatability (spaces are still supported) (#4937) 2020-06-03 15:13:52 +03:00
Gabriel Dutra
100c7be5e0 Return cached data source schema when available (#4934) 2020-06-02 11:26:53 +03:00
chulucninh09
733bc1c109 fix strftime format notation for second and millisecond (#4922) 2020-05-31 22:23:42 +03:00
Saravanan Selvamohan
19cc7f1be8 Added correct usage of the article (#4911)
Add an article - the level
Correct article usage - a schema browser
Consider adding hyphen - ready-made
Removed comma - environment
2020-05-31 22:22:01 +03:00
Arik Fraimovich
43e5c2aa11 Fix: auto hide Plotly Modebar (#4930)
* Only set value for displayModeBar if we want to hide it

* Update viz-lib/src/visualizations/chart/Renderer/PlotlyChart.jsx
2020-05-31 21:18:52 +03:00
Gabriel Dutra
376b317e2e Update requests usages not to allow redirects (#4924)
* Update requests usages not to allow redirects

* Remove type from super()

Co-authored-by: Jannis Leidel <jannis@leidel.info>

Co-authored-by: Jannis Leidel <jannis@leidel.info>
2020-05-31 12:49:39 +03:00
Levko Kravets
d550427485 Fork button disabled on View Query page for non-admin users (#4927) 2020-05-29 11:41:07 +03:00
Ievgen Aleinikov
d1044c1963 Athena: set query cost (#4077) 2020-05-27 13:16:46 +03:00
Gabriel Dutra
46e18b0c6f Use memoized query result data (#4920) 2020-05-26 11:30:31 -03:00
Levko Kravets
38dd3ff248 Fix flaky Map (Markers) tests (#4915)
* Fix flaky Map (Markers) tests

* Fix flaky Choropleth tests
2020-05-26 10:57:08 +03:00
Gabriel Dutra
6bac19c1e4 Use Antd Descriptions on Details visualization (#4914)
* Use Antd Descriptions for Details visualization

* Update styling

* Add some spacing to pagination
2020-05-26 09:52:03 +03:00
Gabriel Dutra
ce6bc2d64a Update antd to v3.26.17 (#4913)
* Update antd to v3.26.17

* Remove custom bg color for danger button

* Update ScheduleDialog snapshot
2020-05-24 22:28:39 +03:00
Gabriel Dutra
27c4992003 Use lambda on options for destinations factory (#4912) 2020-05-24 22:22:01 +03:00
Gabriel Dutra
13e454de86 Update Query Page shortcuts for MacOS (#4910)
* Add Ctrl+Enter to run queries (for Mac)

* Check altKey and show as "Option" key when for Mac
2020-05-24 11:19:50 +03:00
Levko Kravets
f4c9d7db1a getredash/redash#4692 When resizing chart to a certain size it errors out (#4907) 2020-05-24 11:17:25 +03:00
Gabriel Dutra
0d11d7bec2 Change visualizations build to be on postinstall instead of preinstall (#4909) 2020-05-22 11:07:52 -03:00
Arik Fraimovich
ec68e8bba3 Fix: table viz crashing when search is enabled (#4899)
* Fix: table viz crashing when search is enabled

* Replace that weird hack with more controlled code

* Don't clear search input, apply search when data changes

Co-authored-by: Levko Kravets <levko.ne@gmail.com>
2020-05-21 11:13:36 +03:00
chulucninh09
831512e52d Fix: front-end error when parse python float nan (#4903)
* float nan or inf will be serialized as null instead of NaN

* Re-implement float nan serialization fix for consistency
2020-05-21 11:12:19 +03:00
Patrick Yang
dfc873fb8b Add additional statsd metrics for worker/scheduler (#4884)
* Add additional statsd metrics for worker/scheduler
2020-05-20 14:35:55 -07:00
koooge
b117485571 chore: Skip dev install in frontend testing (#4897)
Signed-off-by: koooge <koooooge@gmail.com>
2020-05-20 13:14:28 +03:00
Gianni Moschini
3661d6cbc5 Remove heroku bin/pre_compile file (#4900) 2020-05-20 13:02:39 +03:00
Jannis Leidel
a2217cc4ec Set the schema item title attribute correctly. (#4892)
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-05-15 15:04:00 -03:00
Gabriel Dutra
a7ea94f69a Pin @percy/agent version and update Cypress (#4896) 2020-05-15 14:22:43 -03:00
Gabriel Dutra
8010781f0d Add private address check to BaseHTTPQueryRunner (#4885)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-14 09:56:22 +03:00
Gabriel Dutra
7c8874b8ee Fix HelpTrigger in header not working (#4887) 2020-05-12 12:56:04 -03:00
Arik Fraimovich
8907a86e33 Make frontend build in Docker image optional (#4879)
* Add build arg to Dockerfile to control if we should build frontend assets

* Move more env settings into the shared one.

* Use build arg in docker-compose to skip frontend build.

* CirlceCI: Skip building frontend assets in backend tests

* Create dummy template files

* Expand file names manually.

* Add build arg to skip dev dependencies.

* Update Dockerfile

* Reverse logic of skip_dev_deps to what it should be.
2020-05-12 16:46:53 +03:00
Gabriel Dutra
22f0030864 Add release to html webpack config (#4883)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-12 10:55:48 +03:00
Gabriel Dutra
baf16d2501 Oracle: Encoding fix (#4882)
* Oracle: Encoding fix

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Update redash/query_runner/oracle.py

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-12 10:54:32 +03:00
Gabriel Dutra
0446080d3f Yandex Metrica: rename .host to .url. (#4880)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-12 10:42:07 +03:00
Arik Fraimovich
a8a2964cb0 Make the Databricks driver URL and environment variable (#4878)
* Make the Databricks driver URL and environment variable

* Replace ENV with ARG
2020-05-11 13:24:11 +03:00
Omer Lachish
9562718a6a Run queries through ad-hoc SSH tunnels (#4797)
* run queries through adhoc SSH tunnels

* reduce indent by losing try/else clause

* document host/port getters and setters

* handle forceful schema refreshes in RQ and poll for their results using the /jobs endpoint

* set schema refresh timeout to 5 minutes

* Restyled by prettier (#4847)

Co-authored-by: Restyled.io <commits@restyled.io>

* send schema refresh errors as part of API response

* Use correct get_schema call.

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-11 13:22:40 +03:00
Takuya Arita
e470347d7f Refactor docker-compose.yml for development (#4544)
* Update description for the new setup repository

* Refactor docker-compose.yml for development

* Use Docker Compose file v2
2020-05-11 13:01:32 +03:00
Gabriel Dutra
76aeab02eb Postgres: Add support for uploading SSL certs (#4871)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-08 09:42:00 +03:00
Gabriel Dutra
9568c74fd0 Sentry's Performance tracing (#4872)
* Upgrade sentry-sdk

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Move traces sample rate to configuration

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-08 09:40:20 +03:00
Gabriel Dutra
57287b2c0b Fix: there is no host field. (#4873)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-05-08 09:39:22 +03:00
Gabriel Dutra
6d857588a1 Log data source id on errors (#4874)
Co-authored-by: Omer Lachish <omer@rauchy.net>

Co-authored-by: Omer Lachish <omer@rauchy.net>
2020-05-08 08:59:06 +03:00
Levko Kravets
dc49585320 Add option to explicitly set chart legend position (#4865)
* Add option to explicitly set chart legend position

* Revert some chanes in order to fix tests

* Leave only "auto" and "below the plot" legend placement options

* Move Show legend checkbox to select; fix spelling
2020-05-07 17:21:31 +03:00
Gabriel Dutra
fc246aafc4 Separate visualizations into their own package (#4837)
* Add visualizations project settings

* Move visualizations to redash-visualizations

* Delete shared components

* Remove antd from deps

* Remove p-r-5 from table utils

* Remove visualization deps from package.json

* Rename package and change its version

* Test preinstall script

* Update Dockerfile build for frontend

* Test adding dockerignore

* Update jest tests

* Add step for jest tests

* Include viz-lib on dev commands

* User prettier v1 for now

* Delete unused libs on the app

* Add readme draft (to be finished)

* Add getOptions to Editor

* Add required libraries and finish basic example

* Bump version
2020-05-06 10:49:15 +03:00
Gabriel Dutra
4f8d2caed4 Cypress: Add tests for Filters (#4757) 2020-05-05 01:12:01 -03:00
Levko Kravets
27eab28405 Search in navbar works only for first search term (#4857)
* Queries list page: react on search term change (from navbar)

* Items List components: update search input value when changed "outside"

* Code style
2020-05-04 15:05:49 +03:00
Reynold Xin
8a9a2e7199 Minor tweak to README (#4862) 2020-05-04 10:23:02 +03:00
Reynold Xin
8d29e80013 A new intro paragraph to explain what Redash is (#4861)
* A new intro paragraph to explain what Redash is

We have been using Redash at Databricks and really love it. I took the time to work with Arik to create a better, more up-to-date description of the project.

* Add data sources
2020-05-03 23:43:11 +03:00
Gabriel Dutra
0e3d25c40c Fix visualizations with filters not showing selected values (#4854) 2020-05-03 12:37:23 -03:00
Arik Fraimovich
fdc4205774 Add blob: to allowed img-src rules in CSP (#4860)
This is needed for Plotly download PNG feature to work.
2020-05-03 12:32:17 +03:00
Arik Fraimovich
873c87b4b3 Fix: showing current settings tab broken in MULTI_ORG. (#4855)
* Fix: showing current settings tab broken in MULTI_ORG.

* Revert "Fix: showing current settings tab broken in MULTI_ORG."

This reverts commit a88defd0b5.

* Add test for SettingsMenu#isActive

* Use stripBase to remove slug from url
2020-05-02 14:45:54 +03:00
Gabriel Dutra
ae9bbe25e5 Cypress: Assert results keep up on widget refresh (#4846) 2020-04-30 12:20:04 +03:00
koooge
e3fff396cb chore: Update node8 to 12 (#4845)
Signed-off-by: koooge <koooooge@gmail.com>
2020-04-30 12:19:06 +03:00
Gabriel Dutra
f37e3d5a10 Fix dashboard not showing results while refreshing (#4840) 2020-04-29 21:09:35 +03:00
Gabriel Dutra
45e1478be3 Specify restylers versions for restyled (#4842)
* Specify restylers versions for restyled

* Trigger file change for testing

* Revert "Trigger file change for testing"

This reverts commit d203e37700.
2020-04-29 15:44:57 +03:00
Jannis Leidel
2c90d920b3 Add ability to ship periodic RQ jobs as part of extensions again. (#4822)
This was dropped in aa17681af2.
2020-04-28 18:39:30 +02:00
Gabriel Dutra
bb767f3747 Remove Helper Classes from visualizations (#4788) 2020-04-25 15:51:21 -03:00
Gabriel Dutra
60bc1f8e35 Visualizations customizable settings (#4793) 2020-04-25 12:33:42 -03:00
koooge
de6d665c6e fix: Make sure boto installed (#4835)
Signed-off-by: koooge <koooooge@gmail.com>
2020-04-25 12:34:45 +03:00
Arik Fraimovich
60f92a2efc Add column description to table viz (#4831)
* Add column description to table viz

* Fix: misplaced super long titles tooltip.
2020-04-24 18:50:45 +03:00
Arik Fraimovich
ea8a075a2d ODBC Based Databricks Connector (#4814)
* ODBC Based Databricks connector.

* Install Databricks' ODBC driver in Docker image

* Add useragent string.

* Add Types enum to redash.query_runner to replace the seprate constants.

* Databricks connector:

1. Parse types.
2. Send additional connection options.
3. Correctly parse errors.

* Switch to TYPE constants to use code with Python 2.

* Add note about the Databricks driver terms and conditions.

* Show message about Databricks driver terms and conditions.

* Handle cases when the query doesn't return any results.

* Update redash/query_runner/databricks.py

Co-Authored-By: Jesse <jesse@whitehouse.dev>

* Use new Databricks logo

* Fix connection string options

Co-authored-by: Jesse <jesse@whitehouse.dev>
2020-04-24 18:04:44 +03:00
Arik Fraimovich
6ee9b43ef9 Show explicit user name instead of avatar in lists. (#4828) 2020-04-24 17:32:45 +03:00
Arik Fraimovich
cfc82156c2 Reduce number of queries used to load the dashboards list (#4816)
* Reduce number of queries used to load the dashboards list.

* Use DashboardSerializer everywhere.

* Call serialize
2020-04-21 10:07:48 +03:00
Omer Lachish
ab6dc51540 reset is_invitation_pending if someone tries to login through a reset passwrod link for the first time (#4817) 2020-04-20 20:39:08 +03:00
James T. Boylan
70186ab835 Dashboard Search bug fix (#4804)
* Move Dashboard off `subqueryload()` loader in all() method due to inconsistent results bug in SQLAlchemy when leveraging distinct within a subqueryload call through paginate.

* Added source reference to Presto Query Runner connection through the pyhive client to announce to presto that the query is coming from `redash` instead of `pyhive`.

* Removing source line from presto query runner to refactor based on feedback.
2020-04-19 21:46:25 +03:00
Matt N
e99c37a36a Don't immediately remove notifications from notification trays (#4773)
Let the notifications go into browser/OS notification trays so users can click on them from there if they miss the initial notification. Modern browsers generally use OS notifications so the user is in control of the notification at the OS level.
2020-04-14 14:27:03 +03:00
Cemre Mengu
de40f1a07b Fix comparison error when scale is None (#4638)
* Fix comparison error when scale is None

Prevents `'>' not supported between instances of 'NoneType' and 'int'` error when scale is `None`

* Update oracle.py

* Fix scale logic.

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-04-14 13:36:12 +03:00
Arik Fraimovich
2c1eb5c10d Disable Percy snapshot for Choropleth test (#4799)
* Disable Percy snapshot for Choropleth test

* Increase wait.

* Diasble Percy snapshot.

* Reduce wait time to original value.

* Restyled by prettier (#4800)

Co-authored-by: Restyled.io <commits@restyled.io>

* Update choropleth_spec.js

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
2020-04-14 13:34:35 +03:00
Daniel Lang
02cf895983 Added setting to hide Plotly mode bar (#4644) 2020-04-14 13:08:17 +03:00
Stefan Mees
940bd564d7 Datasource Exasol: support encryption setting (#4712)
* add pyexasol datasource, ensure that integer dont overflow in javascript

* support setting encryption for Exasol connections

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-04-14 12:38:01 +03:00
Jesse
9ba57a9491 Adds option to show 500 rows in the table visualization. Previous max (#4770)
was 250.
2020-04-14 12:36:27 +03:00
Omer Lachish
b80abd11fb use total_seconds to find stale jobs (#4777) 2020-04-14 11:49:17 +03:00
Levko Kravets
1d4ca5cf2e Pie Chart: set contrast colors for text in sectors (#4783) 2020-04-14 11:48:54 +03:00
Weng Kham
f7df6e0cdc Fix test connection on mongodb datasource (#4785)
Co-authored-by: Weng Kham Kan <wengkham.kan@icarasia.com>
2020-04-14 11:47:14 +03:00
Gabriel Dutra
3df1a86d66 Fix param added with empty query ignores options (#4736) 2020-04-14 11:41:52 +03:00
Gabriel Dutra
bad1294402 Dashboard Performance: Memoize widgets (#4734) 2020-04-14 11:04:39 +03:00
Gabriel Dutra
3d26afef16 Move the dropdown to the side in Edit Mode (#4758) 2020-04-14 10:37:06 +03:00
Logan Price
2d29240195 feature: add ability to make the restriction of api calls to private addresses optional (#4790)
* feature: add ability to make the restriction of api calls to private addresses optional

* chore: fix typo

* Update redash/settings/__init__.py

Co-authored-by: lprice92 <lprice92@iastate.edu>
Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-04-14 10:34:13 +03:00
Gabriel Dutra
c698359cb8 Remove "context" prop from visualizations (#4789) 2020-04-13 10:17:33 -03:00
Gabriel Dutra
2b3d9053e9 Fix Multi-Filters: "select all" makes table view unscrollable (#4782)
* Limit filters to 40% of query fixed layout space

* Add check for height to determine fixed layout

* Add maxTagCount of 5 to Filters

* Update maxTagCount settings to be similar to Parameters
2020-04-13 15:13:28 +03:00
Atharva Inamdar
45ea5171cb 4791 redshift schema bugfix (#4792)
* #4791 exclude pg_ tables from redshift table schema inspection

* restrictict only pg_temp
2020-04-12 13:56:06 +03:00
Omer Lachish
6a5445b726 sent stack trace to Sentry when refresh_queries fails to enqueue a certain query (#4780) 2020-04-08 16:34:36 +03:00
Levko Kravets
51b573230f Upgrade Plotly (#4752)
* Upgrade Plotly

* Fixes to Plotly wrapper

* Decrease plot margins

* Adjust plot margins
2020-04-06 13:35:39 +03:00
Levko Kravets
54b04eaff7 Pie chart ignores series labels (#4775) 2020-04-06 13:31:58 +03:00
Georgi Staykov
1e96faed3b Add db thread pool option to keep idle connections alive (#4741)
* Add db thread pool option to keep idle connections alive

* Add SQLALCHEMY_ENABLE_POOL_PRE_PING setting

* Change SQLALCHEMY_ENABLE_POOL_PRE_PING default value to false.

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-04-05 14:13:20 +03:00
Arik Fraimovich
90bfba57d4 Fix: extendedEnum breaks JSONSchema parsing (#4774)
(probably due to Python 3 migration)
2020-04-03 12:07:25 +03:00
lihan
7f2a0af841 Removing the PIP cache from the built image (#4766) 2020-04-03 12:06:55 +03:00
Arihant Surana
f9e3ac7534 feat: Add ssl options for Cassandra data source (#4665)
* feat: provide ssl options for Cassandra data source

* remove Log and prints

* Refactor to create module methods and unit tests

* Switch to using Enumerator and temp file

* Fix temporary file lifecycle for cert

* Align with changes on master

* Fix non certificate but ssl enabled usecase
2020-04-03 11:03:47 +03:00
Gabriel Dutra
4d266176d0 Fix parameter spec flaky test (#4771) 2020-04-02 16:01:22 -03:00
Levko Kravets
3373cfc1eb Sankey diagram should occupy all available area (not just the left part) (#4765)
* Code style

* Remove dead and duplcated code

* getredash/redash#4763 Sankey diagram should occupy full available area (not just the left part)
2020-03-31 23:10:27 +03:00
Gabriel Dutra
e3745f8ba3 Fix there's no publish button on mobile query page (#4760) 2020-03-30 18:16:36 -03:00
Arik Fraimovich
3f6699032f Add apt update step in build docker image job. 2020-03-24 16:11:49 +02:00
Gabriel Dutra
adf8b2e42b Cypress: Add/Edit query and dashboard tags spec (#4744) 2020-03-24 16:03:22 +02:00
Gabriel Dutra
8db1612689 Fix query based param with no results crashing page (#4707)
* Fix query based param with no results crashing page

* Add message for empty dropdown parameters

* Handle 500 no results case with empty result set

* Cypress: Make sure it shows the message

* Use .ant-select-selection to open dropdown
2020-03-24 14:48:14 +02:00
Gabriel Dutra
fabaf73b7b Move data source/destination deprecated handling to frontend (#4753)
* Move DS deprecated handling to frontend

* Add Cypress assertion for deprecated types
2020-03-24 10:09:03 +02:00
Ezekiel Templin
45914f941f Set POSTGRES_HOST_AUTH_METHOD environment variable (#4740)
Redash's docker-compose file will no longer bring up an environment from
a cold start due to recent upstream changes to the postgres image that
force the user to either set a password for the default superuser or
opt-in to allowing all connections without a password via environment
variable.

Upstream PR: https://github.com/docker-library/postgres/pull/658
Related Discussion: https://github.com/docker-library/postgres/issues/681
2020-03-18 14:52:23 +02:00
Gabriel Dutra
1e9b8f1126 Fix no button to add query tags (#4737) 2020-03-17 22:11:33 +02:00
Levko Kravets
52911b7be3 Cohort appearance settings (#4597)
* Cohort: add settings for tooltips, value formats and placeholder

* Cohort: add settings for colors

* Cohort: change all settings tabs to use horizontal inputs

* Cohort: show color labels in editor
2020-03-17 13:42:45 +02:00
Levko Kravets
a10a3f1731 getredash/redash#4728 DOMPurify by default removes 'target' attribute (#4729) 2020-03-17 13:30:55 +02:00
Gabriel Dutra
33131c1354 Trigger CI lint failure on warnings and fix failing frontend unit tests (#4735)
* Trigger lint error on warnings on CI

* Test removing pip3 command from frontend unit

* Test eslint warning

* Revert "Test eslint warning"

This reverts commit 89d407345a.

* Revert "Test removing pip3 command from frontend unit"

This reverts commit 424c900200.

* Run apt update before installing pip3
2020-03-16 13:27:21 +02:00
Gabriel Dutra
f6750428cf Dashboard Performance: HtmlContent improvements (#4726)
* Dashboard Performance: Memoize HtmlContent

* Only render HtmlContent if there is a description
2020-03-15 15:12:50 +02:00
Gabriel Dutra
f4b69d4495 Cypress: Separate start command and update to v4.1.0 (#4690) 2020-03-11 16:14:33 -03:00
Levko Kravets
db71ff399c Refactor dialog wrapper component (#4594)
* Dialog wrapper: stop using promises to handle results - replace with callbacks

* Dialog wrapper: handle async operation on close
2020-03-10 22:22:42 +02:00
Levko Kravets
e552effd96 Remove route.resolve feature (#4607)
* Stop using route.resolve feature (pages should load all the data themselves)

* Remove route.resolve feature

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-03-10 13:09:26 +02:00
Satyam Krishna
75cc6b3f53 Fix : Alembic migration for scheduled query from older to newer version (#4709) 2020-03-08 17:41:21 +02:00
Gabriel Dutra
bf3095c794 Update Dashboard and Alert headers with the Query one (#4710) 2020-03-06 14:26:37 -03:00
Omer Lachish
ee6dcab362 Cancel BigQuery Queries (#4701)
* cancel BigQuery queries when user requests cancellation or when the job times out

* create a new bigquery client to flush exising requests
2020-03-04 22:45:20 +02:00
Gabriel Dutra
e0312fb717 Mobile experience improvements (#4694)
* Allow touch action on dashboard grid

* Deactivate touch when resizing widgets

* Disable touch interactions on Plotly

* Update Plotly and use dragmode: false

* Remove autoFocus from ItemsList search

* Fix spacing for queries and dashboard favorites

* Make sure admin pages don't go over 100% width
2020-03-04 12:55:51 +02:00
Omer Lachish
791a0b3ec7 allow comparison with strings containing numbers as alert values (#4705) 2020-03-04 12:40:23 +02:00
Anton Yuzhaninov
e03e58c5c7 Fix: show size of actually used Redash database (#4706)
'postgres' is a default database name in the Docker image, but if an
external database server is used, than Redash database can have
a different name (specified in REDASH_DATABASE_URL).
2020-03-03 21:21:56 +02:00
Arik Fraimovich
78201c6108 Dynamic Form: boolean fields related fixes (#4586)
* Fix: when default value is false make sure it's still stringified.

* Fix: when extra field is of type boolean make sure it's different from default value to decide if it's open.

* Use isNil to check the default value

* Restyled by prettier (#4704)

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
2020-03-03 12:55:54 +02:00
Arik Fraimovich
d687befa59 Query page: update empty state text (#4699) 2020-03-03 10:53:45 +02:00
Gabriel Dutra
9635d00476 Fix error for query snippets with empty description (#4693) 2020-03-01 15:05:44 -03:00
Jesse
418590003e Solves redashlabs/product#47 (#4669) 2020-03-01 14:19:00 +02:00
Levko Kravets
3650f0c45b Table visualization: Show which columns are being used for search (#4680)
* Table visualization: Show which columns are being used for search

* Fix accidental bug
2020-03-01 14:15:49 +02:00
erels
668403c126 Fixed Clickhouse column name encoding problem (#4682) 2020-03-01 14:11:49 +02:00
Arik Fraimovich
4b94a5c88f Snowflake: use different method of showing columns if no schema specified in db name (#4696)
* Snowflake: use different method of showing columns if no schema specified in db name

* Update redash/query_runner/snowflake.py

Co-Authored-By: Omer Lachish <omer@rauchy.net>

* Update redash/query_runner/snowflake.py

Co-authored-by: Omer Lachish <omer@rauchy.net>
2020-03-01 13:55:28 +02:00
Omer Lachish
a9cb87d4b3 refresh_queries shouldn't break because of a single query having a bad schedule object (#4163)
* move filtering of invalid schedules to the query

* simplify retrieved_at assignment and wrap in a try/except block to avoid one query blowing up the rest

* refactor refresh_queries to use simpler functions with a single responsibility and add try/except blocks to avoid one query blowing up the rest

* avoid blowing up when job locks point to expired Job objects. Enqueue them again instead

* there's no need to check for the existence of interval - all schedules have intervals

* disable faulty schedules

* reduce FP style in refresh_queries

* report refresh_queries errors to Sentry (if it is configured)

* avoid using exists+fetch and use exceptions instead
2020-03-01 11:02:46 +02:00
Omer Lachish
b0f1cdd194 remove rq_healthcheck entrypoint and deprecate celery_healthcheck (#4574) 2020-02-27 17:55:04 +02:00
juanvasquezreyes
5d533a3277 Oracle: update DSN construction to support special characters in user/password. (#4659)
* Update oracle.py

The reason I propose this change is to fix an issue when oracle password has an @
example of connection string: user/p@ssword@host

* Update oracle.py

Fixing init after comments

* Remove empty constructor.

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-02-27 17:50:46 +02:00
Gabriel Dutra
5fa5cd958b Change visualization editor scroll to internal divs (#4689) 2020-02-26 23:09:53 +02:00
Levko Kravets
c5f14e5538 Use main react-grid-layout package instead of fork (#4687) 2020-02-26 21:20:30 +02:00
Levko Kravets
7043951f00 Use npm ci instead of npm install in CI scripts (#4688) 2020-02-26 19:23:32 +02:00
Omer Lachish
9790b0731d Perform cleanup on job timeouts (#4681)
* move repeated query cancellation error messages to the job serializer

* oerform cleanup on JobTimeoutException and DRY query cancellation exception blocks

* import JobTimeoutException directly from rq

* fix syntax error introduced by mistake

* add missing import
2020-02-26 13:24:57 +02:00
Levko Kravets
3102e2df94 Fix: Chart with a horizontal legend sometimes doesn't render properly (#4683) 2020-02-25 13:07:17 +02:00
Gabriel Dutra
f396c96457 Merge branch 'master' into query-based-dropdown--parameters 2020-02-25 07:49:36 -03:00
Omer Lachish
35250d64b9 Job timeout doesn't kill the mysql query (#4629)
* forward timeout SIGALRMs to MySQL threads in order to kill any running proccesses

* no need to attach to SIGALRM as RQ already does that
2020-02-25 00:16:19 +02:00
Gabriel Dutra
cdfa102125 Query View page design adjustments (#4670)
* Realign Data Source and Refresh Schedule

* Adjust execution status height

* Rewrite Query Page Header flexibility

* Remove margin from QuerySource parameters

* Cypress: Visit visualization instead of click in tab

* Fix wrong css class name in dashboard-grid
2020-02-24 21:05:58 +02:00
Gabriel Dutra
8bfcbf21e3 Remove redundant import 2020-02-24 11:44:28 -03:00
Gabriel Dutra
8a1640c4e7 Separate InputPopover component 2020-02-24 11:44:18 -03:00
Gabriel Dutra
209ee16261 Fix verification email url on home page (#4647) 2020-02-24 10:15:35 -03:00
Arik Fraimovich
f1a2f8cb88 Enable ODBC and MS SQL ODBC support (#4676)
Closes #4356.
2020-02-23 11:57:39 +02:00
Arik Fraimovich
dd8e23040a Remove core-js and polyfill include as we don't use Phantom anymore (#4583) 2020-02-23 11:15:53 +02:00
Gabriel Dutra
a37e7f93dc Add is_safe test for queries with params 2020-02-22 15:47:29 -03:00
Gabriel Dutra
cc34e781d3 Small updates
- Change searchTerm separator
- Add cy.wait
2020-02-22 15:23:43 -03:00
Gabriel Dutra
6aa0ea715e Invert tooltip messages order 2020-02-22 14:08:19 -03:00
Gabriel Dutra
6c27619671 Make Parameter Mapping required in UI 2020-02-21 23:00:26 -03:00
Gabriel Dutra
6eeb3b3eb2 Separate UI components 2020-02-21 15:49:23 -03:00
Gabriel Dutra
d40edb81c2 Fix backend tests 2020-02-21 14:18:59 -03:00
Gabriel Dutra
f128b4b85f Only allow search for Text Parameters 2020-02-21 13:36:06 -03:00
Gabriel Dutra
264fb5798d Merge branch 'master' into query-based-dropdown--parameters 2020-02-21 13:31:49 -03:00
Gabriel Dutra
90023ac435 Make sure Table updates correctly 2020-02-21 11:03:37 -03:00
Gabriel Dutra
df755fbc17 Add try except for NoResultFound 2020-02-21 09:40:52 -03:00
Gabriel Dutra
e555642844 Add is_safe check for parameterized query based 2020-02-21 09:27:12 -03:00
Gabriel Dutra
bdd7b146ae Change stored mapping attributes 2020-02-20 21:59:19 -03:00
Gabriel Dutra
b7478defec Don't validade query params with params 2020-02-20 19:29:43 -03:00
Gabriel Dutra
bb0d7830c9 Fixes + temp remove validation for Query param 2020-02-20 18:49:29 -03:00
Gabriel Dutra
d2cc2d20b6 Query Editor: Remove overflow visible from visualization (#4668) 2020-02-20 18:16:26 -03:00
Levko Kravets
7f8b103aea getredash/redash#4666 The download button on the dashboard will redirect users to an invalid page (#4667) 2020-02-20 21:16:16 +02:00
Gabriel Dutra
9eaa44da4a Query View redesign (#4536)
Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-02-19 17:47:34 -03:00
Gabriel Dutra
2833bb539f Fix Add Widget always shows recent queries list (#4658) 2020-02-18 18:01:26 -03:00
Gabriel Dutra
137aa22dd4 Parameter Mapping UI (2/2) 2020-02-18 17:55:27 -03:00
Levko Kravets
7ff5af1bf5 getredash/redash#4655 Closing the Help Drawer redirects you the homepage (#4657) 2020-02-18 21:23:23 +02:00
Omer Lachish
7124bc91d7 Avoid timing out when no timeout is set (#4653)
* soft limits should not exceed if they are set to run infinitely

* use a variable to explain magic number
2020-02-18 15:29:33 +02:00
Gabriel Dutra
9cf396599a Parameter Mapping UI (1/2) 2020-02-17 23:32:10 -03:00
Gabriel Dutra
b70f0fa921 Iterate over backend verification 2020-02-16 13:39:05 -03:00
Omer Lachish
abbfd598d7 support relative time in cloudwatch queries (#4649) 2020-02-16 12:23:25 +02:00
Gabriel Dutra
5e3613d6cb Start experiements with a 'search' parameter 2020-02-13 16:29:50 -03:00
Gabriel Dutra
545da898ee Fix dashboard editing permissions not working (#4613)
* Use dashboard.can_edit instead of checking owner

* Add owner or admin check to Manage Permissions

* Remove unnecessary useMemo
2020-02-13 11:50:45 +02:00
Omer Lachish
ddb0ef15c1 Set default query execution time limit to unlimited (#4626)
* default query execution time limit to 1 hour

* use -1 (run infinitely)  as a default limit
2020-02-11 11:23:02 +02:00
Jannis Leidel
9646156965 Handle stale jobs more carefully before purging them. (#4615) 2020-02-11 11:14:26 +02:00
Jannis Leidel
5c7cb1af3d Update cassandra-driver to 3.21.0. (#4636)
This provides binary wheel files and reduces Docker build times drastically.
2020-02-10 21:48:43 +02:00
Arik Fraimovich
2bd8771188 Fix: no need to encode strings anymore (#4627)
* It's 2020, we got Python 3, no need to encode strings anymore

* Remove encode calls from other places

* use alert.name directly
2020-02-10 20:34:42 +02:00
Arik Fraimovich
86f8f32ab4 Snowflake: switch to simpler query for fetching columns (#4634)
Because we already call USE DATABASE before running SHOW COLUMNS adding IN DATABASE is redundant, but causes an error if the user specifies a schema along with database name.
2020-02-10 20:34:23 +02:00
Gabriel Dutra
fdccaabbe9 Check for LDAP Login in Organization Settings (#4359)
* Check for LDAP Login in Organization Settings

* Restyled by prettier (#4570)

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
2020-02-10 20:13:56 +02:00
Levko Kravets
2f5920d5e4 getredash/redash#4601 Chart editor: enable search in columns selects (#4602) 2020-02-09 17:38:48 +02:00
Omer Lachish
e97510b2ee Clickhouse: control whether to verify SSL certificate (#4631) 2020-02-09 16:03:43 +02:00
Omer Lachish
80cfa3c557 set correct values for ProxyFix (#4630) 2020-02-09 15:20:16 +02:00
mickeey2525
9b71b569e2 Fix treasuredata endpoint (#4582)
* fix treasuredata endpoint

* make endpoint as a required

* fix unneccessart required parameter
2020-02-09 13:52:44 +02:00
Arik Fraimovich
f2159472da Fix: encode/decode bytestring for base64. (#4624)
* Fix: encode/decode bytestring for base64.

* Apply b64encode fix to HiveHttp
2020-02-09 13:41:41 +02:00
Omer Lachish
c961c33e49 If the error message happens to be empty, it will break serailization. (#4622) 2020-02-09 13:17:43 +02:00
Omer Lachish
5afc94c562 sync_user_details doens't really need a custom ttl (#4625) 2020-02-09 12:57:16 +02:00
Jesse
cee1a07320 Sort schema columns alphabetically (#4595)
* Adds logic to sort column names returned by the query runner. If `sorted`
raises an Exception it returns the column names unaltered from the query
runner.

* Moves table name sorting from model code into schema handler.

* Moves token sorting into the model code.

* Replaces single-quotes with double-quotes for consistency.

* Applies black formatting to changes.

* Moves schema sort into separate method. Adds test.

* Fixes output schema variable name. Without this the sorted cache is never returned!

   ____  ____  ____  _____
  / __ \/ __ \/ __ \/ ___/
 / /_/ / /_/ / /_/ (__  )
 \____/\____/ .___/____/
           /_/

* Adds test case guaranteeing that the model actually _uses_ the schema sorter.

Related to a31f90178c
2020-02-09 12:40:47 +02:00
Eduardo Garcia
42b1eadeb2 Update copyright year to 2020 in LICENSE (#4616) 2020-02-09 12:39:22 +02:00
Omer Lachish
7edac9ca89 keep adhoc job results longer (determined by settings.JOB_EXPIRY_TIME) (#4559) 2020-02-09 12:28:58 +02:00
David Hernández
69893f0304 Force specific version of Werkzeug to prevent the breaking changes of the new release. (#4618) 2020-02-09 09:23:48 +02:00
Jannis Leidel
b089f5f0ef Use correct logger when enqueuing a query execution. (#4614) 2020-02-06 15:16:21 +01:00
Omer Lachish
7a34a76817 RQ: Missing currently executing queries view (#4558)
* add meta information to executing queries

* add a table for running queries

* add pagination to queues table

* sort the queues table

* add pagination to all tables
2020-02-03 23:51:20 +02:00
Levko Kravets
2de3895986 Query editor: fix shortcuts (#4598) 2020-01-29 21:26:05 +02:00
Levko Kravets
713fd2d0fb Change visualizations import to be static (#4592)
* getredash/redash#4565 Change visualizations import to be static

* Move visualizations-related components to own folder
2020-01-28 12:48:38 +02:00
Levko Kravets
19c6d331b6 Refine routes definitions (#4579)
* Refine routes definitions

* Replace HoC wrappers with functions to create route definition

* Some updates for code consistency

* ItemsList component: remove currentRoute dependency

* Prepare route parametes in wrapper functions
2020-01-26 14:53:40 +02:00
Omer Lachish
a36b10173c Fix empty values sent in dynamic form (#3886)
* remove legacy session identifier support

* remove redundant test

* redirect to login to support any invalid session identifiers

* be more specific with caught errors

* reject empty values in DynamicForm

* don't submit form values if they are empty (unless they are
intentionally set to empty string)

* set empty values to null to clear out data source option in the model

* check explicitly for null
2020-01-23 21:21:49 +02:00
Eran Sandler
7d11fae9ea Added support for running MongoDB queries on secondary in replicaset mode (#1424)
* - Added support to specify read preference when query a replicaset database (for example, secondaryPreferred - to try and read data from secondary before primary).
- Removed old code that used MongoClientReplicaSet as it is now just a reference to MongoClient
- Fixed a documentation type :-)

* Moving to PyMongo 3.3.1 which also supports MongoDB 3.2

* Changed the readPreference config to use an enum

* Pass readPreference to MongoClient

* primaryPreferred is now the default
2020-01-23 21:14:37 +02:00
Levko Kravets
35e41385dc Fixes several bugs on dashboard page (see description) (#4571)
* Move each hook to own file; move hooks and components to own folders

* Update URL and timer only when refresh rate changes

* Skip dashboard refresh if previous refresh is still running

* Fix test
2020-01-23 17:03:37 +02:00
Levko Kravets
cdefa847c0 Restore query execute notifications (missed during React migration) (#4577) 2020-01-23 16:21:51 +02:00
Levko Kravets
a90b8c7443 getredash/redash#173 Don't allow to fork query while previous fork is still in progress (#4578) 2020-01-23 16:08:59 +02:00
Levko Kravets
1ba3a23457 Bug: when using global dashboard filters, widgets continuously update their local filters (#4575) 2020-01-23 16:07:28 +02:00
Levko Kravets
8a5e0ea3f4 Refine Timer and TimeAgo components (get rid of force update) (#4580) 2020-01-23 16:06:38 +02:00
Levko Kravets
cbc56264ea React migration cleanup (#4572)
* Revisit ANGULAR_REMOVE_ME things

* Remove styles related to 3rd-party Angular and jQuery libraries

* Remove some more unused styles

* Revisit error handling (app-wide)

* Remove unused file

* CR1
2020-01-22 17:15:25 +02:00
Levko Kravets
c92bb63f8b Fix Map visualization: L.layerGroup cannot compute its bounds (#4573) 2020-01-22 10:11:29 +02:00
Levko Kravets
ff0dbd5f01 Save new query before adding new visualization (#4569) 2020-01-21 13:06:26 +02:00
Leo Palmer Sunmo
80bfd405fd Force saml auth scheme (#3614)
* Add SAML scheme override env var

* Make it pretty, please the linter

* Import settings properly
2020-01-21 11:45:21 +02:00
taminif
945f53fea3 delete variable (#3813)
* delete variable

* delete duplicate code

* add empty line

* delete empty line
2020-01-21 11:29:56 +02:00
Steve Buckingham
56b51be64a Add redshift role use option (#4532)
* Add redshift role use option

* Update requirements for SSL socket wrap issue fixes

* Split Redshift class into User and IAM logins

* Update incorrect register

* Change type names

* Correct class name to inherit

* Render IAM redshift image and field order correct

* Update redash/query_runner/pg.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* Update redash/query_runner/pg.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* Remove need for specified urllib - specify pyopenssl is enough

* Pyopenssl back down to 19.0.0

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-01-21 11:18:33 +02:00
Levko Kravets
a682265e13 Migrate router and <app-view> to React (#4525)
* Migrate router and <app-view> to React: skeleton

* Update layout on route change

* Start moving page routes from angular to react

* Move page routes to react except of public dashboard and visualization embed)

* Move public dashboard and visualization embed routes to React

* Replace $route/$routeParams usages

* Some cleanup

* Replace AngularJS $location service with implementation based on history library

* Minor fix to how ApplicationView handles route change

* Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component

* Error handling

* Remove AngularJS and related dependencies

* Move Parameter factory method to a separate file

* Fix CSS (replace custom components with classes)

* Fix: keep other url parts when updating location partially; refine code

* Fix tests

* Make router work in multi-org mode (respect <base> tag)

* Optimzation: don't resolve route if path didn't change

* Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors)

* Fix page keys; fix navigateTo calls (third parameter not available)

* Use relative links

* Router: ignore location REPLACE events, resolve only on PUSH/POP

* Fix tests

* Remove unused jQuery reference

* Show error from backend when creating Destination

* Remove route.resolve where not necessary (used constant values)

* New Query page: keep state on saving, reload when creating another new query

* Use currentRoute.key instead of hard-coded keys for page components

* Tidy up Router

* Tidy up location service

* Fix tests

* Don't add parameters changes to browser's history

* Fix test (improved fix)

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
2020-01-20 20:56:37 +02:00
Arik Fraimovich
a891160b4d Upgrade snowflake-connector-python (#4567)
* Upgrade snowflake-connector-python

* Downgrade requests
2020-01-20 19:50:57 +02:00
Gabriel Dutra
086798bbb7 Fix Cypress issues after React version of Query Pages (#4545)
* Update Pivot rows assertion

* Allow replacing Query results with Apply Changes
2020-01-20 14:26:22 +02:00
Levko Kravets
ebcec85c0c Tags filter doesn't work because of wrong query params format (#4563)
* getredash/redash#4557 Tags filter doesn't work because of wrong query params format

* Fix tests
2020-01-20 12:49:17 +02:00
Gabriel Dutra
2b5bfad054 Add padding to QueryExecutionStatus text (#4553) 2020-01-16 21:18:06 +02:00
Gabriel Dutra
479b277b91 Add loading state to Query save button (#4551)
* Add loading state to Query save button

* Hide dirty indication and icon when saving
2020-01-16 14:21:38 +02:00
Arik Fraimovich
94ac11c787 webpack: remove children from output (#4540) 2020-01-14 14:05:37 +02:00
Jannis Leidel
a7ef3ad72a Get rid of six and fix str/unicode types regression that became active on Python 3. (#4533)
This was introduced in d38ca803c5.
2020-01-14 12:51:36 +02:00
Ari Ekmekji
afe8c95f4d Load collections in all workspaces (#4541) 2020-01-14 12:48:04 +02:00
Omer Lachish
fe06f7f63e Google Analytics runner - iterate over keys the Python 3 way (#4538)
* iterate over key names instead of dict_keys values

* use dict comprehension instead of manipulating existing dict
2020-01-13 14:41:30 +02:00
Omer Lachish
5e01211852 adjust imports to match influxdb 5.2.3 (#4531) 2020-01-13 10:43:29 +02:00
Gabriel Dutra
375ffd3250 Migrate services and replace $http with axios (#4497) 2020-01-12 22:25:26 -03:00
Omer Lachish
674f057c59 fix typo in azure kusto runner (#4537) 2020-01-12 22:45:32 +02:00
Omer Lachish
aa17681af2 Nuke Celery (#4521)
* enforce hard limits on non-responsive work horses by workers

* move differences from Worker to helper methods to help make the specialization clearer

* move HardLimitingWorker to redash/tasks

* move schedule.py to /tasks

* explain the motivation for HardLimitingWorker

* pleasing CodeClimate

* pleasing CodeClimate

* port query execution to RQ

* get rid of argsrepr

* avoid star imports

* allow queries to be cancelled in RQ

* return QueryExecutionErrors as job results

* fix TestTaskEnqueue and QueryExecutorTests

* remove Celery monitoring

* get rid of QueryTask and use RQ jobs directly (with a job serializer)

* Revert "remove Celery monitoring"

This reverts commit 37a74ea403.

* reduce occurences of the word 'task'

* use Worker, Queue and Job instead of spreading names that share behavior details

* remove locks for failed jobs as well

* did I not commit that colon? oh my

* push the redis connection to RQ's stack on every request to avoid verbose connection setting

* use a connection context for tests

* remove Celery monitoring

* 👋 Celery

* remove Celery from Cypress

* black it up

* some more black

* return all started/queued job ids (for future monitoring

* Restyled by prettier (#4522)

* remove celery.py

* remove some frontend residuals that reappeared after a merge

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
2020-01-12 22:36:48 +02:00
Takuya Arita
13c3531956 Update description for the new setup repository (#4535) 2020-01-12 15:22:10 +02:00
Gabriel Dutra
350716c525 Add maildev missing settings (#4527) 2020-01-10 09:29:33 +02:00
Gabriel Dutra
fe11b8cc35 Cypress: Add test for Settings Tabs (#4530) 2020-01-09 12:40:40 -03:00
Gabriel Dutra
465dbc03b7 Hide unavailable page links to non-admin users in settings and header (#4524)
* Filter unavailable menu items in SettingsWrapper

* Don't show Alert Destination in header to users
2020-01-08 10:59:59 +02:00
Gabriel Dutra
76f0dcb085 Replace angular-sanitize with DOMPurify (#4502)
* Switch angular-sanitize package with dompurify

* Replace $sanitize with DOMPurify.sanitize

Co-authored-by: Arik Fraimovich <arik@arikfr.com>
2020-01-08 10:56:11 +02:00
Gabriel Dutra
99c276fc9a Migrate Query pages to React (#4429)
* Migrate Query Source View page to React: skeleton

* Sync QueryView and QuerySource (#4430)

* Migrate schema browser to react (#4432)

* Restyle code with Prettier

* Migrate Query page to React: Save changes (#4452)

* Migrate query source to React: Set of updates (#4457)

* Migrate Query page to React: Visualization Tabs (#4453)

Co-Authored-By: Levko Kravets <levko.ne@gmail.com>

* Migrate Query Source page to React: Visualizations area (#4463)

* Migrate Query page to React: Delete visualization button (#4461)

* Migrate Query Source page to React: Visualization actions (#4467)

* Migrate Query pages to React: Execute query hook (#4470)

* Migrate Query Source page to React: Editor area (#4468)

* Migrate Query Source page to React: metadata, schedule and description blocks (#4476)

* Migrate Query page to React: Cancel query execution (#4496)

* Migrate Query Source page to React: refine code (#4499)

* Migrate Query Source page to React: alerts (#4504)

* Migrate Query Source page to React: unsaved changes alert (#4505)

* Migrate Query Source to React: resizable areas (v2) (#4503)

* Migrate Query page to React: Query View (#4455)

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Switch React and Angular versions of pages (until Angular version removed)

* Migrate Query pages to React: fix permissions (#4506)

* Migrate Query Source page to React: don't reload when saving new query (#4507)

* Migrate Query pages to React: fix tests (#4509)

* Use skipParametersDirtyFlag in executeQuery

* Fix: cannot fork query from Query View page

* Optimize query editor: handle query text changes faster

* Revert "Optimize query editor: handle query text changes faster"

This reverts commit 2934e53be6.

* Reduce debounced time to 100

* Migrate Query pages to React: cleanup (#4512)

* Migrate Query pages to React: cleanup

* Further cleanup

* Remove unused dependencies

* Fix embed pages

* Attempt to fix flaky test

* Cleanup: explicitly register the last Angular component

* Move contents of /filters folder to /lib

* Remove unnecessary import

* Remove cy.wait from Parameters spec

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Levko Kravets <levko.ne@gmail.com>
2020-01-06 20:51:45 +02:00
Levko Kravets
fc9e8fe2aa Add error boundary to catch errors in visualizations (#4518)
* Add error boundary to catch errors in visualizations

* Fix: Funnel crash when step column is date/time

* CR1

* CR2
2020-01-06 10:22:20 +02:00
Omer Lachish
260bfca767 Multiprocess RQ workers (using supervisor) (#4371)
* launch and monitor multiple workers using supervisor

* run supervisord in non-daemon mode

* redirect all output to stdout/stderr

* no need to log supervisord's output because it is redirected to stdout anyway

* updated and less brittle healthcheck

* add supervisor healthchecks

* remove redundant supervisor installation as it is installed by pip

* add a 5 minute check gate
2020-01-01 15:32:29 +02:00
Arik Fraimovich
f85490cf50 Fix: don't try to access message property of an exception (#4516)
(not supported in Python 3)
2019-12-31 12:45:29 +02:00
Gabriel Dutra
29582e3212 Run prettier on cypress folder (#4510)
* Run prettier on cypress folder

* Test Restyled

* Revert "Test Restyled"

This reverts commit 13d43968fe.
2019-12-30 19:40:56 +02:00
Omer Lachish
329e85987c Execute Queries in RQ (#4413)
* enforce hard limits on non-responsive work horses by workers

* move differences from Worker to helper methods to help make the specialization clearer

* move HardLimitingWorker to redash/tasks

* move schedule.py to /tasks

* explain the motivation for HardLimitingWorker

* pleasing CodeClimate

* pleasing CodeClimate

* port query execution to RQ

* get rid of argsrepr

* avoid star imports

* allow queries to be cancelled in RQ

* return QueryExecutionErrors as job results

* fix TestTaskEnqueue and QueryExecutorTests

* remove Celery monitoring

* get rid of QueryTask and use RQ jobs directly (with a job serializer)

* Revert "remove Celery monitoring"

This reverts commit 37a74ea403.

* reduce occurences of the word 'task'

* use Worker, Queue and Job instead of spreading names that share behavior details

* remove locks for failed jobs as well

* did I not commit that colon? oh my

* push the redis connection to RQ's stack on every request to avoid verbose connection setting

* use a connection context for tests

* black it up

* run RQ on all queues when running in Cypress
2019-12-30 14:11:01 +02:00
Arik Fraimovich
ff34dedf46 Fix: properly encode UTF-8 filenames in query results request (#4498)
* Fix: properly encode UTF-8 filenames in query results request

Ended up copying the implementation from Flask's send_file helper function, because send_file doesn't really fit our use case.

* Update tests/handlers/test_query_results.py

Co-Authored-By: Omer Lachish <omer@rauchy.net>

Co-authored-by: Omer Lachish <omer@rauchy.net>
2019-12-30 11:52:18 +02:00
Arik Fraimovich
d0fb377ed6 Viz Embed: Add option to hide timestamp (#4491) 2019-12-30 11:45:22 +02:00
Arik Fraimovich
30bc1e2ff6 Refine permissions usage in Redash to allow for guest users (#4492)
* Allow executing query with either view_query or execute_query permissions.

* Render AuthHeader according to permissions.

* Don't return dashboards where you only have access to textbox widget.

Closes #4099.
2019-12-30 10:07:20 +02:00
Gabriel Dutra
fd46194580 Update EditInPlace to use Antd components (#4493) 2019-12-26 12:53:33 -03:00
deecay
f5900a1929 Chart: Bubble size control by coefficient and sizemode (#3928) 2019-12-26 16:19:45 +02:00
Tsuyoshi Yoshizawa
c2b39db03e Support download as TSV File (#4445) 2019-12-26 16:16:48 +02:00
Omer Lachish
f420e02cee adjust imports to match simple-salesforce 0.74.3 (#4490) 2019-12-25 16:26:58 +02:00
Arik Fraimovich
0aa176e2e5 Don't update query's updated_at when updating schedule_failures counter (#4488) 2019-12-25 16:25:16 +02:00
Arik Fraimovich
97d523e348 Retain tags when forking a query (#4489) 2019-12-25 16:25:02 +02:00
Arik Fraimovich
88d21e9461 Add explicit handling of 404 errors in query result requests. (#4487) 2019-12-25 15:46:13 +02:00
Arik Fraimovich
40c1ef0f59 Fix: query results query runner fails to load cached results. (#4486) 2019-12-25 15:21:43 +02:00
Arik Fraimovich
10ba2ddbaa Snowflake: add missing date types (#4484)
Without those the values might be miscategorized in the UI.
2019-12-25 14:58:45 +02:00
Omer Lachish
e7eedd0556 fix all occurances of B306: BaseException.message has been deprecated as of Python 2.6 and is removed in Python 3. Use str(e) to access the user-readable message. Use e.args to access arguments passed to the exception. (#4482) 2019-12-25 10:13:39 +02:00
Omer Lachish
c3299ff0ad totalRows are returned as a string and should be a number (#4481) 2019-12-24 22:20:17 +02:00
Randy Zwitch
6b2f23f357 Update pymapd to 0.19.0 (#4424) 2019-12-24 15:34:42 +02:00
Arik Fraimovich
0819f80e72 Hive/Databricks: mark date types as TYPE_DATE. (#4419) 2019-12-24 10:39:56 +02:00
Gabriel Dutra
7223f60ddf Migrate VisualizationEmbed to React (#4364)
* Migrate VisualizationEmbed to React

* Angular cleanup

* Remove onClick event from TimeAgo

* Check Table exists before taking snapshot

* Apply Prettier
2019-12-24 10:21:48 +02:00
Gabriel Dutra
38b6b47594 Migrate Dashboard and Public Dashboard to React (#4228)
* Initial React Rendering with useDashboard

* Make sure widgets refresh + useCallback

* Rename collectFilters and add refreshRate

* Fix error updates not being rendered

* Only render widget bottom when queryResults exists

* Cleanup

* Add useCallback to refreshDashboard

* Make sure Promise.all have all promises done

* Start migrating Dashoard to React
- initial rendering
- some actions
- temporary updated less file

* Fullscreen handler added

* Separate refreshRateHandler hook

* Add a few tooltips

* Separate DashboardControl and normalize btn width

* Share Button

* Fix serach params not updating

* Enumerate More Options

* Toggle Publish options

* Archive Dashboard

* Parameters + Filters

* Prepare Manage Permissions

* Start to create edit mode

* Add Edit Mode functionalities

* Use previous state when updating dashboard

* Mobile adjustments

* PermissionsEditorDialog + Dashboard page title

* Update Dashboard spec

* Fix other specs

* Break dashboard.less

* Hide publish button on mobile

* Angular Cleaning

* Keep edit state when changing resolution

* Bug fix: Dashboard Level Filters not updating

* Remove prepareWidgetsForDashboard

* Revert "Remove prepareWidgetsForDashboard"

This reverts commit b434f03da1.

* Avoid saving layout changes out of editing mode

* Apply policy for enabled refresh rates

* Disable loadDashboard deps

* Restyled by prettier (#4459)

* Update title when dashboard name updates

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
2019-12-24 10:20:40 +02:00
Levko Kravets
49dcb7f689 Refactor QueryEditor component (#4464) 2019-12-20 15:35:43 +02:00
deecay
425e79fdd2 Fix prettier commandline option to be recursive (#4458) 2019-12-17 14:52:45 +02:00
Levko Kravets
bc52b78889 Third column not selectable for Bubble and Heatmap charts (#4449) 2019-12-16 13:00:17 +02:00
deecay
944adb95ba Map: add tooltip and popup templating (#4443) 2019-12-14 20:07:09 +02:00
Daniel Dubovski
8cb49158bf Adding application to Azure Kusto query runner (#4441)
This is to allow for better metrics collection and tracking on the service side.
More info can be found [here](https://docs.microsoft.com/en-us/azure/kusto/api/netfx/request-properties#the-application-x-ms-app-named-property)
2019-12-13 21:47:11 +02:00
Gabriel Dutra
ca098172e9 Fix Restyled config (#4438) 2019-12-11 23:06:17 -03:00
Omer Lachish
a3beac0b78 allow setting of custom sentry environments (#4437) 2019-12-11 23:00:06 +02:00
Arik Fraimovich
56d3be2248 Prettier all the Javascript code & GitHub Action (#4433)
* Prettier all the JS files

* Add GitHub Action to autoformat code pushed to master

* Fix eslint violation due to formatting.

* Remove GitHub actions for styling

* Add restyled.io config
2019-12-11 17:05:38 +02:00
Arik Fraimovich
81b14a58ef Remove Husky (#4435) 2019-12-11 14:49:57 +02:00
Arik Fraimovich
2dff8b9a00 Black support for the Python codebase (#4297)
* Apply black formatting

* Add auto formatting when committing to master

* Update CONTRIBUTING.md re. Black & Prettier
2019-12-11 13:54:29 +02:00
Arik Fraimovich
37a964c8d9 Remove codeclimate config (#4434) 2019-12-11 13:44:52 +02:00
Arik Fraimovich
1b9b3032ca Change eslint configuration and fix resulting issues (#4423)
* Remove app/service/query-string (unused) and its dependency.

* Fix usage of mixed operators.

* eslint --fix fixes for missing dependencies for react hooks

* Fix: useCallback dependency passed to $http's .catch.

* Satisfy react/no-direct-mutation-state.

* Fix no-mixed-operators violations.

* Move the decision of whether to render Custom chart one level up to make sure hooks are called in the same order.

* Fix: name was undefined. It wasn't detected before because there is such global.

* Simplify eslint config and switch to creat-react-app's eslint base.

* Add prettier config.

* Make sure eslint doesn't conflict with prettier

* A few updates post eslint (#4425)

* Prettier command in package.json
2019-12-11 12:00:46 +02:00
David Mudro
0385b6fb64 Fix counter vizualization (#4385)
* crude unit tests for counter visualisation utils

* improve type safety with default param values for getCounterData()

* fix count rows never shows zero

* remove default values for getCounterData() params
2019-12-10 13:38:22 +02:00
Arik Fraimovich
7c05a730dc Remove --max-old-space-size=4096 from npm build command (#4381)
* Remove --max-old-space-size=4096 from build

Looks like it's no longer needed.

* Update to node v12.

* Add build:old-node-version for those who have Node < 12.
2019-12-05 22:41:57 +02:00
Kenji Ichihashi
263305214e Update rds-combined-ca-bundle.pem(#4290) (#4304)
Can use rds-ca-2019 and etc
`$ curl https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem \
> redash/query_runner/files/rds-combined-ca-bundle.pem`
2019-12-05 11:29:42 +02:00
Jakdaw
3494e21cf4 Add user/pass authentication support for Druid (#4315)
* Add support for configuring a Username/Password for the connection to Druid

* Bump pydruid version for username/password support

* Deal with missing/empty configuration parameters
2019-12-05 09:27:59 +02:00
Gabriel Dutra
15e8b88996 Cypress: Make sure params are saved before reload (#4420) 2019-12-04 13:37:31 -03:00
Levko Kravets
ba36b4e671 Migrate AddToDashboard dialog to React (#4408) 2019-12-04 17:50:50 +02:00
Levko Kravets
94bd03dc42 Set of improvements and refinements to visualizations after React migration (#4382) 2019-12-04 16:23:29 +02:00
Levko Kravets
041d05d18b Chart series switch places when picking Y axis or color (#4412) 2019-12-04 16:00:01 +02:00
Gabriel Dutra
c14e7ab4ca Fix dragged parameter wrapping in some cases (#4415) 2019-12-03 12:48:11 -03:00
Monica Gangwar
4d6c30ef13 refreshing snowflake schema w/o waking cluster (#4285)
* refreshing snowflake schema w/o waking cluster

Have also added a new internal method to not select a
warehouse while executing query
Using 'show columns' to fetch database schema instead of
executing a select query in information schema
show columns does not require a warehouse to run

* modularising snowflake code to avoid repetitions

fixing internal function syntax and avoiding
code repetition

* removing user object in snowflake schema query
2019-12-02 10:48:30 +02:00
Arik Fraimovich
36ab8eae89 Update Snowflake connector version to address compatibility issue with Azure dependencies (#4407) 2019-11-27 18:44:08 +02:00
Stefan Mees
e82373ac1d add pyexasol datasource, ensure that integer dont overflow in javascript (#4378) 2019-11-27 18:43:58 +02:00
Arik Fraimovich
d3feba69b2 Downgrade Kombu version to 4.6.3 (#4406)
It was accidentally upgraded as part of the dependencies upgrade we did recently, but 4.6.5 has a bug...
2019-11-27 18:08:47 +02:00
Omer Lachish
80f3ec1c99 avoid logging job parameters (#4311) 2019-11-27 09:33:20 +02:00
Arik Fraimovich
c612bba19c Amazon CloudWatch query runners (#4372)
* CloudWatch Metrics query runner

* Add: query runner for CloudWatch Logs Insights

* Add logos

* Update Insights type

* Basic test connection

* Format files
2019-11-27 09:14:28 +02:00
Nicolas Le Manchet
f5a40827aa Remove builtins invalid in Python 3 from Python runner (#4375)
These few builtins were available in Python 2.7 but not anymore
in Python 3, making the runner fail to start.
2019-11-27 09:12:36 +02:00
Gabriel Dutra
5de291a98d Fix Map spec and Alert Page snapshot flakyness (#4403) 2019-11-26 19:08:18 -03:00
Levko Kravets
c70a48db9c Table visualization with column named "children" renders +/- buttons (#4394) 2019-11-26 15:47:19 +02:00
Omer Lachish
be56035bd6 don't try to purge jobs which have already been deleted (#4396) 2019-11-25 11:04:00 +02:00
Gabriel Dutra
7c97d8eafa Add autoscroll to ng-view (#4337) 2019-11-24 14:01:35 -03:00
Gabriel Dutra
0563ecf648 Migrate Home to React (#4379) 2019-11-24 13:59:56 -03:00
Levko Kravets
e72d7a8cca Table visualization: accept timestamp for date/time columns (#4389) 2019-11-24 11:50:52 +02:00
Levko Kravets
a7a933946b Hide deprecated visualizations from query editor (#4388)
* Hide deprecated visualizations from query editor

* Fix Map tests
2019-11-24 11:05:01 +02:00
uncletimmy3
7cfd362a7a fix typo at unsupportedRedirect.js (#4387) 2019-11-24 10:46:16 +02:00
Arik Fraimovich
4d1b359713 Remove unused npm dependencies (#4380)
* Remove ui-ace.

* Remove ui-sortable.

* Remove angular-base64-upload.

* Remove angular-messages.

* Remove jquery-ui.

* Update package-lock.json.
2019-11-21 12:18:33 +02:00
Levko Kravets
818649bbec Migrate Chart visualization to React Part 2: Editor (#4139) 2019-11-20 21:57:12 +02:00
Levko Kravets
c6a2725f0a Migrate Map visualization to React (#4278) 2019-11-20 17:36:59 +02:00
Gabriel Dutra
5cd6913e40 Fix Cypress and Percy flakyness issues (#4365) 2019-11-18 10:37:01 -03:00
Gabriel Dutra
0aebb37317 Remove Chrome Logger and update Cypress and Percy (#4354) 2019-11-14 15:23:00 -03:00
Levko Kravets
aa06b32e17 Add some tests for Choropleth visualization (#4358) 2019-11-14 19:08:51 +02:00
Levko Kravets
b44fa51829 Migrate Funnel visualization to React (#4267)
* Migrate Funnel visualization to React: Editor

* Migrate Funnel visualization to React: Renderer

* Replace Auto sort options with Sort Column + Reverse Order

* Add option for items limit (instead of hard-coded value)

* Add number formatting options

* Replace d3.max with lodash.maxBy; fix bug in prepareData

* Add options for min/max percent values

* Debounce inputs

* Tests

* Refine Renderer: split components, use Ant Table for rendering, fix data handling

* Extract utility function to own file

* Fix tests

* Fix: sometimes after updating options, funnel shows "ghost" rows from previous dataset

* Sort by value column by default
2019-11-14 15:47:17 +02:00
Levko Kravets
1a95904ffd Migrate Choropleth visualization to React (#4313)
* Migrate Choropleth to React: skeleton

* Migrate Choropleth to React: Editor - skeleton

* Choropleth Editor: Bounds tab

* Choropleth Editor: Colors tab

* Choropleth Editor: Format tab

* Choropleth Editor: General tab

* Some refinements

* Migrate Choropleth to React: Renderer

* Refine code

* CR1
2019-11-14 15:42:15 +02:00
Omer Lachish
ef56e4e920 use to set the hash instead of directly manipulating it (#4351)
* use  to set the hash instead of directly manipulating it

* Update Jobs.jsx
2019-11-13 15:36:04 +02:00
shinsuke-nara
d5a3f0de57 CLI command to reencrypt data source options (#4190)
* Script to reencrypt data source options.

* Implement reencrypt sub command under database command.
2019-11-13 15:27:20 +02:00
Arik Fraimovich
cf274d96c8 Fix: number based alerts evaluation isn't working (#4295)
* Fix: correctly evaluate numeric thresholds

* Missing import

* More missing imports

* Alert evaluation: support for booleans
2019-11-13 15:11:21 +02:00
Levko Kravets
c00410768c Migrate Cohort visualization to React (#4270)
* Migrate Cohort to React: Editor

* Extract prepareData and getOptions to own files

* Refine CohortRenderer Angular component (js, less, prepareData) for easier migration

* Migrate Cohort to React: Renderer

* Migrate Cornelius to React: styles

* Migrate Cohort to React: Cornelius library

* Cornelius: add licence info; remove unused style

* Cornelius: use numeral to format numbers; revisit styles

* Cornelius: use moment to format date labels

* Cornelius: use chroma for cell backgrounds; update options; update proptypes; minor fixes

* Tidy up

* Tests
2019-11-13 14:39:08 +02:00
Jakdaw
dda5a9d58f Fix the DB migration so that the correct key is used for encrypting DS credentials. (#4344)
Without this upgrades from at least v5 (and earlier) won't work.
2019-11-11 21:49:05 +02:00
Omer Lachish
a0a32be3dd Admin status page's current tab does not preserve (#4299)
* handle a console warning about passing in string page options

* preserve selected tab in the location hash
2019-11-11 12:04:32 +02:00
Omer Lachish
e0e94d79ac Restarting rq-scheduler reschedules all periodics (#4302)
* add some logging to scheduler

* schedule jobs only if they are not already scheduled

* jobs scheduled with an interval over 24 hours were not repeated

* schedule version_check using standard scheduling

* clean up old jobs that are not part of the definition anymore

* add some tests

* add one more test to verify that reschedules are not done when not neccesary

* no need to check for func existence - all jobs have a func to run
2019-11-11 09:54:41 +02:00
Omer Lachish
f19d24287e auto-refresh data RQ jobs admin page (#4298) 2019-11-11 09:42:05 +02:00
Gabriel Dutra
80878abf7b Migrate Settings Screen to React (#4323)
* Migrate settings-screen to React

* Use black instead of blue color for active item

* Revert "Use black instead of blue color for active item"

This reverts commit 0e4ececa6a.

* Add selectable=false to the Menu
2019-11-10 09:07:40 +02:00
Gabriel Dutra
6716bb390c Update TagsList and Sidebar to use Ant components (#4338) 2019-11-07 13:41:15 -03:00
Omer Lachish
a33d11de3a RQ: periodically clear failed jobs (#4306)
* add some logging to scheduler

* clean failed RQ job data from Redis

* move stale job purging to tasks/general.py

* provide better documentation on why we don't reject keys in FailedJobRegistry at the moment

* pleasing the CodeClimate overlords

* simplified clenaup by deleting both job data and registry entry

* use FailedJobRegistry as source of truth for purging

* remove redundant key deletion

* Update redash/settings/__init__.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>
2019-11-07 17:00:53 +02:00
Omer Lachish
6f791a092b Adjust RQ job priorities (#4301)
* prioritize periodic jobs

* declare default queues in inside worker()

* separate send_email to its own queue
2019-11-06 13:36:27 +02:00
Kyle Krueger
cce6546a62 Feature/last x days parameter (#4333)
* Add last 14, 30, 60, and 90 days to DRP.js

Date Range Parameter (DRP)

* Add last 14, 30, 60, and 60 day params to DRP.jsx

DateRangeParameters (DRP)
2019-11-05 16:15:11 +02:00
Ran Byron
5fd78fdb23 New feature - Alert muting (#4276)
* New feature - Alert muting

* pep8 fix

* Fixed backend api update

* whoops semicolon

* Implemented mute
2019-11-02 14:54:26 +02:00
Gabriel Dutra
74dbb8acf3 Skip favorites dropdown loading state on init (#4318) 2019-10-31 13:28:28 -03:00
Omer Lachish
36638be1dd optimize work horse initialization by configuration mappers on the worker process (#4314) 2019-10-30 09:53:06 +02:00
Gabriel Dutra
82f488d231 Migrate PermissionsEditor to React (#4266)
Co-Authored-By: Arik Fraimovich <arik@arikfr.com>
2019-10-29 12:42:31 -03:00
Arik Fraimovich
7b3943052e Move the setup scripts to their own home (#4310) 2019-10-28 21:11:21 +02:00
Arik Fraimovich
96a95b7090 Add V8 to the CHANGELOG. 2019-10-28 13:27:34 +02:00
Omer Lachish
accf0f7ac5 show more workers per page. also allow page size selection (#4300) 2019-10-28 09:51:57 +02:00
Arik Fraimovich
88ae639ee4 CircleCI workflow improvements (#4296)
* CircleCI workflow improvements

- Don't automatically build the Docker image.
- Make the Python lint step requirement for the follow up steps. When it fails it usually means there is a code error which will prevent the next steps anyway.

* Fix YAML syntax error.

* Add separate build Docker image step for master branch
2019-10-27 22:27:34 +02:00
Omer Lachish
ba413c210e use rq_redis_connection instead of redis_connection (#4288) 2019-10-25 14:23:24 +03:00
Levko Kravets
7157244eec Migrate Table visualization to React Part 2: Editor (#4175)
* Migrate table editor to React: skeleton, Grid tab

* Columns tab

* Cleanup

* Columns tab: DnD column sorting

* Columns types should be JSX

* New Columns tab UI/X

* Use Sortable component on Columns tab

* Tests: Grid Settings

* Tests: Columns Settings

* Tests: Editors for Text, Number, Boolean and Date/Time columns

* Tests: Editors for Image and Link columns

* Minor UI fix

* Trigger build

* Debounce inputs
2019-10-24 12:46:46 +03:00
Gabriel Dutra
9f7844640a Introduce inheritance to the Parameter structure (#4049)
* Start draft for new Parameter structure

* Add the rest of the methods

* EnumParameter

* QueryBasedDropdownParameter

* DateParameter

* DateRangeParameter

* Update Parameter usage on code

* Merge dynamicValue into normalizedValue

* Add updateLocals and omit unwanted props

* Allow null NumberParameter and omit parentQueryId

* Rename parameter getValue to getExecutionValue

* Update $$value to normalizedValue + omit on save

* Add a few comments

* Remove ngModel property from Parameter

* Use value directly in DateRangeParameter

* Use simpler separator for DateRange url param

* Add backward compatibility

* Use normalizeValue null value for isEmpty

* Start creating jest tests

* Add more tests

* Normalize null value for multi mode in Enum

* Use saved value for param isEmpty
2019-10-24 12:42:30 +03:00
Nicolas Le Manchet
246eca1121 Migrate the application to Python 3 (#4251)
* Make core app compatible with Python 3

No backward compatibility with Python 2.7 is kept.
This commit mostly contains changes made with 2to3 and manual
tweaking when necessary.

* Use Python 3.7 as base docker image

Since it is not possible to change redash/base:debian to Python 3
without breaking future relases, its Dockerfile is temporarly
copied here.

* Upgrade some requirements to newest versions

Some of the older versions were not compatible with Python 3.

* Migrate tests to Python 3

* Build frontend on Python 3

* Make the HMAC sign function compatible with Python 3

In Python 3, HMAC only works with bytes so the strings and the
float used in the sign function need to be encoded.
Hopefully this is still backward compatible with already generated
signatures.

* Use assertCountEqual instead of assertItemsEqual

The latter is not available in Python 3.
See https://bugs.python.org/issue17866

* Remove redundant encoding header for Python 3 modules

* Remove redundant string encoding in CLI

* Rename list() functions in CLI

These functions shadow the builtin list function which is
problematic since 2to3 adds a fair amount of calls to the builtin
list when it finds dict.keys() and dict.values().

Only the Python function is renamed, from the perspective of the
CLI nothing changes.

* Replace usage of Exception.message in CLI

`message` is not available anymore, instead use the string
representation of the exception.

* Adapt test handlers to Python 3

* Fix test that relied on dict ordering

* Make sure test results are always uploaded (#4215)

* Support encoding memoryview to JSON

psycopg2 returns `buffer` objects in Python 2.7 and `memoryview`
in Python 3. See #3156

* Fix test relying on object address ordering

* Decode bytes returned from Redis

* Stop using e.message for most exceptions

Exception.message is not available in Python 3 anymore, except
for some exceptions defined by third-party libraries.

* Fix writing XLSX files in Python 3

The buffer for the file should be made of bytes and the actual
content written to it strings.

Note: I do not know why the diff is so large as it's only a two
lines change. Probably a white space or file encoding issue.

* Fix test by comparing strings to strings

* Fix another exception message unavailable in Python 3

* Fix export to CSV in Python 3

The UnicodeWriter is not used anymore. In Python 3, the interface
provided by the CSV module only deals with strings, in and out.
The encoding of the output is left to the user, in our case
it is given to Flask via `make_response`.

* (Python 3) Use Redis' decode_responses=True option (#4232)

* Fix test_outdated_queries_works_scheduled_queries_tracker (use utcnow)

* Make sure Redis connection uses decoded_responses option

* Remove unused imports.

* Use Redis' decode_responses option

* Remove cases of explicit Redis decoding

* Rename helper function and make sure it doesn't apply twice.

* Don't add decode_responses to Celery Redis connection URL

* Fix displaying error while connecting to SQLite

The exception message is always a string in Python 3, so no
need to try to decode things.

* Fix another missing exception message

* Handle JSON encoding for datasources returning bytes

SimpleJSON assumes the bytes it receives contain text data, so it
tries to UTF-8 encode them. It is sometimes not true, for instance
the SQLite datasource returns bytes for BLOB types, which typically
do not contain text but truly binary data.

This commit disables SimpleJSON auto encoding of bytes to str and
instead uses the same method as for memoryviews: generating a
hex representation of the data.

* Fix Python 3 compatibility with RQ

* Revert some changes 2to3 tends to do (#4261)

- Revert some changes 2to3 tends to do when it errs on the side of caution regarding dict view objects.

- Also fixed some naming issues with one character variables in list comprehensions.

- Fix Flask warning.

* Upgrade dependencies

* Remove useless `iter` added by 2to3

* Fix get_next_path tests (#4280)

* Removed setting SERVER_NAME in tests setup to avoid a warning.

* Change get_next_path to not return empty string in case of a domain only value.

* Fix redirect tests:

Since version 0.15 of Werkzeug it uses full path for fixing the location header instead of the root path.

* Remove explicit dependency for Werkzeug

* Switched pytz and certifi to unbinded versions.

* Switch to new library for getting country from IP

`python-geoip-geolite2` is not compatible with Python 3, instead
use `maxminddb-geolite2` which is very similar as it includes
the geolite2 database in the package .

* Python 3 RQ modifications (#4281)

* show current worker job (alongside with minor cosmetic column tweaks)

* avoid loading entire job data for queued jobs

* track general RQ queues (default, periodic and schemas)

* get all active RQ queues

* call get_celery_queues in another place

* merge dicts the Python 3 way

* extend the result_ttl of refresh_queries to 600 seconds to allow it to continue running periodically even after longer executions

* Remove legacy Python flake8 tests
2019-10-24 12:42:13 +03:00
Arik Fraimovich
7ffb97232e Pin Cypress version (#4284) 2019-10-24 12:22:56 +03:00
Omer Lachish
8b9fa53efe extend the result_ttl of refresh_queries to 600 seconds to allow it to continue running periodically even after longer executions (#4283) 2019-10-24 11:56:07 +03:00
Omer Lachish
43b35b6fb4 Monitor general RQ queues (default, periodic and schemas) (#4256)
* track general RQ queues (default, periodic and schemas)

* get all active RQ queues

* call get_celery_queues in another place
2019-10-23 12:31:32 +03:00
Omer Lachish
f0f85ece42 avoid loading entire job data for queued jobs (#4257) 2019-10-23 11:43:31 +03:00
Omer Lachish
612833404b show current worker job (alongside with minor cosmetic column tweaks) (#4262) 2019-10-23 11:20:15 +03:00
Ran Byron
5d58503623 Minor alert bug fixes (#4274) 2019-10-22 16:58:20 +03:00
Ran Byron
3dfad87266 Extracted alert menu button (#4273) 2019-10-22 13:00:16 +03:00
Levko Kravets
0659ef1079 Add "use-debounce" dependency (#4268) 2019-10-19 22:28:57 +03:00
Ran Byron
a2e21dd1c3 App Header React migration (#4245) 2019-10-19 14:25:58 +03:00
Levko Kravets
f165cad9ff Migrate Sunburst Renderer to React (#4259) 2019-10-17 19:16:05 +03:00
Levko Kravets
e0a2705c1a Restore <body> bottom padding (#4252) 2019-10-17 13:22:09 +03:00
Levko Kravets
0aca649cb5 Migrate Sankey renderer to React (#4255) 2019-10-17 13:19:29 +03:00
Stefan Maric
79b37e8843 Fix double-scrollbar when in fullscreen (#4243) 2019-10-16 23:46:44 +03:00
Ran Byron
72bb5d29a0 Fix: Alert page breaks when target query returns null result (#4250)
* Fix: Alert page breaks when target query returns null result

* Better handling of topValue value
2019-10-16 11:27:37 +03:00
Omer Lachish
5a5fdecdde Replace Celery with RQ (except for execute_query tasks) (#4093)
* add rq and an rq_worker service

* add rq_scheduler and an rq_scheduler service

* move beat schedule to periodic_jobs queue

* move version checks to RQ

* move query result cleanup to RQ

* use timedelta and DRY up a bit

* move custom tasks to RQ

* do actual schema refreshes in rq

* rename 'period_jobs' to 'periodic', as it obviously holds jobs

* move send_email to rq

* DRY up enqueues

* ditch  and use a partially applied  decorator

* move subscribe to rq

* move check_alerts_for_query to rq

* move record_event to rq

* make tests play nicely with rq

* 👋 beat

* rename rq_scheduler to plain scheduler, now that there's no Celery scheduler entrypoint

* add some color to rq-worker's output

* add logging context to rq jobs (while keeping execute_query context via get_task_logger for now)

* move schedule to its own module

* cancel previously scheduled periodic jobs. not sure this is a good idea.

* rename redash.scheduler to redash.schedule

* allow custom dynamic jobs to be added decleratively

* add basic monitoring to rq queues

* add worker monitoring

* pleasing the CodeClimate overlords

* adjust cypress docker-compose.yml to include rq changes

* DRY up Cypress docker-compose

* add rq dependencies to cypress docker-compose service

* an odd attempt at watching docker-compose logs when running with Cypress

* Revert "an odd attempt at watching docker-compose logs when running with Cypress"

This reverts commit 016bd1a93e.

* show docker-compose logs at Cypress shutdown

* Revert "DRY up Cypress docker-compose"

This reverts commit 43abac7084.

* minimal version for binding is 3.2

* remove unneccesary code reloads on cypress

* add a  command which errors if any of the workers running inside the current machine haven't been active in the last minute

* SCHEMAS_REFRESH_QUEUE is no longer a required setting

* split tasks/queries.py to execution.py and maintenance.py

* fix tests after query execution split

* pleasing the CodeClimate overlords

* rename worker to celery_worker and rq_worker to worker

* use /rq_status instead of /jobs

* show started jobs' time ago according to UTC

* replace all spaces in column names

* fix query tests after execution split

* exit with an int

* general lint

* add an entrypoint for rq_healthcheck

* fix indentation

* delete all existing periodic jobs before scheduling them

* remove some unrequired requires

* move schedule example to redash.schedule

* add RQ integration to Sentry's setup

* pleasing the CodeClimate overlords

* remove replication settings from docker-compose - a proper way to scale using docker-compose would be the --scale CLI option, which will be described in the knowledge based

* revert to calling a function in dynamic settings to allow periodic jobs to be scheduled after app has been loaded

* don't need to depend on context when templating failure reports

* set the timeout_ttl to double the interval to avoid job results from expiring and having periodic jobs not reschedule

* whoops, bad merge

* describe custom jobs and don't actually schedule them

* fix merge
2019-10-15 23:59:22 +03:00
Omer Lachish
f6e1470a7c Avoid depending on app context when templating failure reports (#4231)
* don't need to depend on context when templating failure reports

* extract a render_template function with some docs

* CodeClimate has really outdone itself this time. Removed a whitespace character in order to fix 2 CodeClimate errors

* apparently whitespace doesn't count as a character
2019-10-15 23:08:28 +03:00
Arik Fraimovich
27cd76797e Make sure query results are consistent (#4246) 2019-10-15 21:48:44 +03:00
Amol Grover
29b113005c pagerduty.py: Change default summary text (#4239)
* pagerduty.py: Change default summary text

Change is made to use alert name in PagerDuty's alert
destination default summary text instead of
query id and name

* Update default description text & field description
2019-10-15 11:34:34 +03:00
Ran Byron
53d971bf87 Implemented new condition comparison options (#4240)
* Implemented new condition comparison options

* Fixed test

* Move backward compatibility code to service
2019-10-15 08:41:23 +03:00
Gabriel Dutra
a102e93e50 Fix dashboard parameter mapping issues (#4211) 2019-10-14 17:21:44 -03:00
Ran Byron
74beed80d2 Fixed hangouts chat icon (#4236) 2019-10-11 13:11:15 +03:00
Ran Byron
39f038f992 Fixed alert destination hrefs (#4235)
* Fixed alert destination hrefs

* Added query url
2019-10-11 13:10:47 +03:00
Gabriel Dutra
da2ed56281 Extend bolder markdown fix to widget description (#4229) 2019-10-10 09:53:58 -03:00
Arik Fraimovich
9d8812a598 Postgres: make sure table from the public schema doesn't get merged with table from other schemas (#4224)
* Postgres: make sure table from the public schema doesn't get merged with a table from another schema.

* PEP8 updates
2019-10-10 13:02:22 +03:00
Arik Fraimovich
204447a9f5 Add interface to abstract query result persistence (#4147)
* Add interface to implement custom persistence for QueryResult data

Co-authored-by: Omer Lachish <omer@rauchy.net>

* Deserialize query results data in the model

* Change order of mixins.

* Make DBPersistence.data setter in sycn with getter + tests
2019-10-10 10:39:55 +03:00
Arik Fraimovich
3b7efb8c1f Make sure that the default settings signal that no email server is configured (#4226)
* The sender email address has to be None for the test of "is email server
configured" to be correct. Moved the dev setting into docker-compose.yml.

* Move the REDASH_MAIL_SERVER setting into docker-compose.yml to revert the default value to its original value in case anyone was using it.

* Make worker dependant on email as it's the one that actually using it.
2019-10-07 22:23:22 +03:00
Ran Byron
69dc761c60 Alert page - migrate to React and redesign (#4153) 2019-10-07 19:15:06 +03:00
Ran Byron
2f42b8154c Fix: Misleading warning when trying to download results of unsaved query #4218 (#4219) 2019-10-06 16:00:24 +03:00
Arik Fraimovich
3f9d49dbd1 Remove debug code (#4216) 2019-10-06 11:57:05 +03:00
Justin Clift
0a5dca5d72 Adjust botocore dependency, so we don't need to update it as often (#4154) 2019-10-06 11:47:16 +03:00
Gabriel Dutra
8ea285dda9 Split setup in advanced and regular for data sources and destinations (#4160)
* DynamicForm support for advanced options

* Randomly select a few options to be advanced

* Merge conditions with the same logic

* Address some comments

* Update styling for the button

* Some style adjustments (#4162)

* Don't set default value to additional settings

* Rename advanced -> extra

* Show extra fields by default when they are filled

* Update hasFilledExtraField logic

* Add example field from destination as extra
2019-10-06 11:46:50 +03:00
Gabriel Dutra
569c325aa0 Support for dropdown of predefined options in data sources setup (#4161)
* Support for predefined options in data sources

* DynamicForm Select: title -> name

* Make it work with "enum" prop

* Make it work for "extendedEnum" prop

* Not JS

* Deep copy the configuration schema
2019-10-06 11:44:56 +03:00
Gabriel Dutra
d8a0af1a95 Fix query based dropdown not adding quote marks correctly (#4186)
* Handle non-array in multi-value QueryBasedParameter

* Use state value in QueryBasedParameterInput

* Normalize array in parameter structure

* Add Multi-selection test

* Remove unnecessary not null check
2019-10-06 11:35:47 +03:00
Ran Byron
648847df0b Fix: Multi-value Dropdown not available in Static Value edit dialog (#4213) 2019-10-05 17:52:50 +03:00
Arik Fraimovich
3f31bf3fc0 Fix: use correct variable name (#4210) 2019-10-03 13:00:21 +03:00
Rui Z
f6ad3d9d24 Vertica: prevent overwriting row data when duplicated column names exist (#4201)
* Vertica: prevent overwriting row data when duplicated column names exist

* remove enumeration
2019-10-02 12:20:51 +03:00
bennywij
e8ccdc23c7 Correct typo in log stmt. Add comment re PR 4201 (#4205) 2019-10-02 11:37:57 +03:00
Levko Kravets
a8af968d70 Sortable component (#4199) 2019-09-30 19:12:27 +03:00
Jesse
cb14459881 Fixes #3766. (#4189) 2019-09-27 11:00:50 +02:00
Gabriel Dutra
780fbceba5 Fix Pivot Visualization should not be saving data (#4174) 2019-09-25 11:36:39 -03:00
Omer Lachish
2c77c219c6 Add maildev to the dev stack (#4173)
* add maildev to the dev stack

* Update redash/settings/__init__.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>
2019-09-25 10:50:34 +03:00
Gabriel Dutra
874e0d1ce3 Fix Execute Selected not working for dirty queries (#4176) 2019-09-24 10:59:40 -03:00
Gabriel Dutra
401d164622 Remove Widget dev console errors (#4177) 2019-09-24 07:39:03 -03:00
Arik Fraimovich
ff041b77cf Update Sentry-SDK (#4169) 2019-09-23 09:54:10 +03:00
Arik Fraimovich
b2d1636f8e Downgrade mysqlclient to 1.3.14 (#4165)
Closes #4164.
2019-09-22 14:56:09 +03:00
Arik Fraimovich
a3e8477410 List enabled Query Runner types during build (#4166)
* Add CLI command to list enabled query runner types
2019-09-22 14:55:21 +03:00
Omer Lachish
ed22b63f22 remove the annoying quoted title from EmptyState (#4168) 2019-09-22 14:33:19 +03:00
Arik Fraimovich
d636b29ba9 Update version (#4167) 2019-09-22 13:23:56 +03:00
Ran Byron
6173a2a619 Handle Create Dashboard with middle click (#4158) 2019-09-22 10:57:28 +03:00
Gabriel Dutra
fd435d2182 Migrate Pivot Table visualization to React (#4133)
* npm install react-pivottable

* Initiate Pivot Table Migration

* Update renderer with editor options

* Clean up

* Remove old pivottable from package.json

* Test Percy Snapshot with Pivot Table in a Dashboard

* Tmp: use cy.wait to make sure dashboard is loaded

* Clean up Percy snapshot test

* Small improvements
- cy.all with multiple args
- add controls to pivot valid options

* Watch for options in the Renderer
2019-09-22 10:46:03 +03:00
Gabriel Dutra
cb654b3f21 Migrate Widget component to React (#4020)
* Improve sizing for Number inputs

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Migrate WidgetDialog

* Start migrating Widget

* Update textbox to use HtmlContent

* QueryLink migration and some updates

* Add visualization rendering

* Render widget

* Add delete button

* Update AutoHeight

* Add widget bottom

* Add Drodpown button

* Split Widget component

* Update with #4056 and trigger netlify

* In progress: use composition

* Add header and footer

* Update widget actions positioning

* Re-render when refreshing from widget

* Add workaround to force DashboardGrid re-render

* VisualizationWidgetFooter component

* VisualizationWidget menu

* Separate RestrictedWidget

* Update tests

* Update margin for Parameters

* Remove widget files

* Revert "Improve sizing for Number inputs"

This reverts commit a02ce8f0aa.

* Some cleanup

* Move refresh logic to the Dashboard

* Add loadingWidgets logic to the public dashboard

* Add onLoadWidget

* Remove parameter from URL when empty

* Recreate widget array instead of loadingWidgets

* Add comment about re-rendering + whitespace missing

* CR changes

* Use plain html instead of string syntax

Co-Authored-By: Ran Byron <ranbena@gmail.com>
2019-09-20 22:08:42 +03:00
Arik Fraimovich
e8d40bbdac CHANGELOG for v8.0.0-beta.2 (#4145)
* Stop building tarballs.

* Update version reference.

* CHANGELOG for 8.0.0-beta.2
2019-09-18 11:23:32 +03:00
Levko Kravets
e5d52055d9 Widget filters overlapped by visualization (#4137)
* Fix: widget filters overlapped by visualization

* Fix tests

* Fix tests
2019-09-18 11:22:26 +03:00
Levko Kravets
c5e414e6ba Color picker component (#4136) 2019-09-16 13:01:48 +03:00
Gabriel Dutra
b9a40d1808 Query Snippets: Use onClick instead of link for 'Click here' option (#4144)
* Snippets: Don't change url when not needed

* Revert "Snippets: Don't change url when not needed"

This reverts commit 2f346f3bb4.

* Query Snippets: use onClick instead of link
2019-09-16 10:00:23 +03:00
Ran Byron
033dd0d15e Bug fix: Query view doesn't sync parameters when selecting and deleting (#4146) 2019-09-16 07:15:38 +03:00
Arik Fraimovich
95795d93c7 CHANGELOG for V8-beta. (#4057)
* CHANGELOG for V8-beta.

* Update CHANGELOG.md

* Update CHANGELOG.md

* Update CHANGELOG.md
2019-09-15 15:48:59 +03:00
Arik Fraimovich
75e48b0bd6 Allow users to share aggregated usage information with us (#4108)
* Initial commit of BeaconConsent component

* Add comment about being able to change setting

* Use <Text> correctly

* Final version of consent screen

* Show beacon consent message on homepage only if it wasn't enabled already.

* Add consent setting to organization settings screen.

* Add support for custom message in OrgSetting.save.

* Implmenet consent saving.

* If consent given, send extra data

* Add HelpTrigger

* Make CodeClimate happy

* Wrap everything with DynamicComponent
2019-09-15 15:18:48 +03:00
Levko Kravets
75883a1a02 Counter Editor: move components to own files (#4138) 2019-09-13 22:35:19 +03:00
Gabriel Dutra
75a5546741 Add jsconfig settings with '@' webpack alias (#4135) 2019-09-12 18:25:40 -03:00
Levko Kravets
54071e4b87 Migrate Chart visualization to React Part 1: Renderer (#4130)
* Migrate Chart visualization: Renderer

* Refine PlotlyChart component; move stylesheets to visualization's folder

* Migrate Custom JS Chart to React

* Cleanup
2019-09-12 10:23:43 +03:00
Arik Fraimovich
6458a1eb62 Remove duplicate messages method (#4131) 2019-09-11 11:56:40 +03:00
Levko Kravets
ecf160c9bc Alerts: Add more condition comparison options (#4134)
* getredash/redash#4132 Add more condition comparison options

* Add arguments to fallback lambda
2019-09-11 11:18:59 +03:00
Levko Kravets
2c98f0425d Allow the user to decide how to handle null values in charts (#4071)
* getredash/redash#2629 Refactor Chart visualization, add option for handling NULL values (keep/convert to 0.0)

* Handle null values in line/area stacking code; some cleanup

* Handle edge case: line/area stacking when last value of one of series is missing

* Mjnor update to line/area stacking code

* Fix line/area normalize to percents feature

* Unit tests

* Refine tests; add tests for prepareLayout function

* Tests for prepareData (heatmap) function

* Tests for prepareData (pie) function

* Tests for prepareData (bar, line, area) function

* Tests for prepareData (scatter, bubble) function

* Tests for prepareData (box) function

* Remove unused file
2019-09-09 13:00:26 +03:00
Ran Byron
8f01988c8c Decrease size of widget pagination (#4120)
* Added tests

* Perhaps this would trigger percy

* Decrease size of widget pagination

* Removed unused attr

* Updated tests
2019-09-09 10:57:26 +03:00
Arik Fraimovich
b8741f6cff Sync botocor eversions across requirements files. (#4128) 2019-09-09 10:44:05 +03:00
Levko Kravets
424751d9e9 Migrate Counter visualization to React (#4106)
* Migrate Counter to React: Renderer

* Migrate Counter to React: Editor

* Cleanup

* Review and fix rows indexing algorithm

* Counter not properly scaled in editor

* Fix wrong label for/input id pair

* Tests

* Tests

* Fix vendor prefixes

* Remove unnecessary useEffect dependencies

* Update tests

* Fix Percy snapshot names
2019-09-09 10:10:10 +03:00
Arik Fraimovich
e048a69392 Upgrade Sentry-SDK and enable additional integratoins (#4127)
* Update sentry-sdk version

* Add additional Sentry integrations
2019-09-09 10:00:09 +03:00
Ran Byron
2c1e846837 Widget table scroll-x visible (#4101)
* Table viz horizontal scroll made visible

* Added tests

* Fixed snapshot pre-condition

* Perhaps this would trigger percy
2019-09-09 09:50:03 +03:00
Justin Clift
4b9e26de5a Update botocore, to get pass pip warning (#4122) 2019-09-04 09:12:22 +03:00
sphenlee
17f50192e7 hive_ds: show a user friendly error message when possible (#4121) 2019-09-04 08:10:56 +03:00
Gabriel Dutra
dcdec0abb5 Use ng-src for data source icons (#4123) 2019-09-03 20:42:19 +03:00
Ran Byron
302c6dd02e Fix number param value normlization (#4116) 2019-09-02 16:29:56 +03:00
Arik Fraimovich
4c56900248 Move annotation logic into Query Runner (#4113)
* Code formatting

* Move annotation logic into query runner, so it can be overriden in the query runner.

* Add mixin to __all__

* Switch to flag instead of mixin

* Feature (Redshift): option to set query group for adhoc/scheduled queries  (#4114)

* Add scheduled status to query job metadata.

* Add: option to set query group for adhoc/scheduled Redshift queries

* Scheduled might not be set for already enqueued queries.
2019-09-02 16:01:05 +03:00
swfz
1f1f853297 Display data source icon in query editor (#4119) 2019-09-02 14:42:41 +03:00
Arik Fraimovich
43f63b1b57 Add ability to use Ant's Table loading property when using ItemsTable (#4117) 2019-09-02 14:38:28 +03:00
Gabriel Dutra
5ae80835b1 Fix Dropdown parameter options appearing behind Dialog (#4109) 2019-09-01 21:55:37 -03:00
Arik Fraimovich
df3da82afd Fix: allow users with view only acces to use the queries in Query Results (#4112)
* Fix: allow users with view only acces to access the queries

* Add tests

* Update error message

* Update error message. Take 2
2019-09-01 22:17:53 +03:00
Ran Byron
98e33b7780 Fix widget bottom element alignment (#4110) 2019-09-01 16:59:11 +03:00
Omer Lachish
8a3f6f90eb Update badge in README.md to link to CircleCI (#4104)
* Update README.md

* Update README.md

* Update README.md

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Update README.md
2019-09-01 10:50:14 +03:00
shinsuke-nara
cab011def9 Migrate with SQL statements. (#4105) 2019-08-30 14:08:22 +03:00
Omer Lachish
31c888ea8e Dashboard: when updating parameters, run only relevant queries (#3804)
* refresh only affected queries in dashboard when parameters are changed

* rename pendingParameters to updatedParameters

* select which widgets to update according to their mapping as a dashboard-level parameter

* use lodash's include
2019-08-30 07:03:51 +03:00
Sandeep Belagavi
443054428f [Qubole] - Adding support to process Quantum query types. (#4066)
* [Qubole] - Adding support to process Quantum query types.

Quantum is a serverless interactive service that offers
direct SQL access to user's data lake. Changes are made
to accept `quantum` query type from user which makes
`Cluster Label` as optional.

* -Making quantum as defult query.
-Dictionary safe access to connection parmeters

* keeping pep8 standards

* Maintainig pep8 std

* Use latest version of qds-sdk

* Use qds-sdk v1.13.0

* Use qds-sdk v1.12.0

* Use qds-sdk v1.13.0

* Updating SDK with verified version

* hive as default query type

* qds-sdk : Locking most recent release version

* qds-sdk : Locking recent release version

* falling back to original version of qds-sdk
2019-08-29 19:22:52 +03:00
Gleb Lesnikov
ef9a4d5eed [Data Sources] Add: Azure Data Explorer (Kusto) query runner (#4091)
* [Data Sources] Add: Azure Data Explorer (Kusto) query runner

* CodeClimate fixes

* Remove TODO

* Fixed configuration properties names for Azure Kusto

* Azure Kusto: get_schema in one query

* azure-kusto-data update to 0.0.32

* Add Kusto to the default query runners list
2019-08-26 10:17:49 +03:00
Arik Fraimovich
a2b68a3569 Make sure we always pass a list to _get_column_lists (#4095)
(some data sources might return None as the columns list)
2019-08-25 17:39:15 +03:00
Ran Byron
e7b707eb25 Removed redash-newstyle.less (#4017) 2019-08-22 08:06:54 +03:00
Arik Fraimovich
1786273344 Fix: MySQL connections without SSL are failing (#4090)
* Move connection logic into a single method & make sure not to pass ssl value if not used.

* Remove wildcard import and format file.
2019-08-21 14:31:17 +03:00
Christian Clauss
d38ca803c5 Add more flake8 tests and fail build if any test fails (#4055)
* Add more flake8 tests and fail build if any test fails

Run all flake8 E9xx + F63x + F7xx + F82x tests.

* long = long in Python 2
2019-08-18 11:27:44 +03:00
Gabriel Dutra
a1f11cb8d9 Migrate Parameters component to React (#4006)
* Start Parameters Migration

* Add dirtyCount

* Use workaround with setState

* Apply Changes

* Add EditSettingsDialog

* Add Cmd/Ctrl + Enter behavior

* Remove isApplying

* Delete Angular version of parameters

* Update tests

* Remove angular stuff

* Update jest

* Drag placeholder

* Update events

* Use old button styling and move css

* Reviewing code

* Add parameter rearrange test

* Add Parameter Settings title change test

* Update Parameter Settings button styling

* Move parameter url logic back to Parameters

* Disable url update when query is new

* Styling changes (#4019)

* Ran's title width styling

* Update drag test

* Improve sizing for Number inputs

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Fix issue with dragged parameter wrapping

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Don't reevaluate dirtyParamCount

* Allow multiple values :)

* Fix parameter alignments

* Fix Select width on search

* Update client/app/components/Parameters.less

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Humanize param.name

* Make sure angular updates Execute disabled status
2019-08-18 11:27:20 +03:00
Vladimir Ponarevsky
b426e4fdc4 Fix clickhouse password leak (#4078)
* Fix clickhouse password leak

* Fix after review
2019-08-18 11:05:41 +03:00
Arik Fraimovich
e5e926bac5 Pin kombu version (#4075)
kombu is a dependency of Celery and usually we let them declare the version, but their version is pinned and the most recent release (4.6.4) has a severe regression where workers stop responding to inspect commands.
2019-08-16 19:27:24 +03:00
Arik Fraimovich
24d68008fa Format target value as a number with reasonable default (#4073) 2019-08-15 15:54:32 +03:00
Arik Fraimovich
0e90b89acc ParameterizedQuery: handle the case where a value is null (#4072) 2019-08-15 15:18:40 +03:00
Jannis Leidel
2c2f241671 Require a more up-to-date version of importlib-metadata. (#4069) 2019-08-15 11:50:27 +03:00
Jakdaw
d49514abe9 When we fork a query, make sure we create the new visualizations in the same order as per the source query (#4067) 2019-08-14 11:08:56 +03:00
Arik Fraimovich
934a145ced Switch to mysqlclient from Python-MySQL (#4061) 2019-08-14 10:11:53 +03:00
Omer Lachish
f7c70c2b91 Add parameter dialog doesn't work when query has selected text (#4032)
* debounce updateQuery to prevent pasting parameters over selected texts failing parseQuery (see #4032)

* drop defer
2019-08-14 07:47:34 +03:00
The Alchemist
69ba165565 [Data Sources] Initial commit for adding Dgraph support (#3987)
* Initial commit for adding Dgraph support

* Made suggestions from https://codeclimate.com/github/getredash/redash/pull/3964

* feedback from @arikfr

* added logo for Dgraph from Twitter

* Better conversion of Dgraph JSON to Redash's internal JSON

* made recommendations from @arikfr

* removed unused function
2019-08-13 13:14:37 +03:00
Jannis Leidel
7b5696dc75 Fix loading of periodic tasks and clean up extension loading. (#4064)
* Fix loading of periodic tasks and clean up extension loading.

This does a few things:

- add tests for extension loading
- refactor the extension and periodic task loading
- better handle assertions raised by extensions (e.g. when an extension tries to override an already registered view)
- attach exception traceback to error log during loading for improved debugging

* Use site.addsitedir instead of calling pip.

* Use sys.path instead of site.addsitedir and also the setup.py egg_info command.
2019-08-13 13:11:59 +03:00
Gabriel Dutra
4698408a08 Cypress: Fix cy.clock not freezing time (#4060) 2019-08-13 07:08:59 -03:00
Ievgen Aleinikov
be142d60df Add assume role as a credential source for AWS Athena Query runner (#4028)
* allowing to specify a custom work group for AWS Athena queries

* Fixing title + adding correct position in the UI

* Adding assume role configuration to Athena query runner.

* removing extra blank lines

* fixes based on comments to the PR
2019-08-12 16:45:56 +03:00
Arik Fraimovich
aceea6516f Change the required Docker Compose version to 3.2 (#4059)
With the default Docker installed from sources on Ubuntu 19.04 it failed starting the project when asking for Compose version 3.7, but everything worked fine with 3.2.
2019-08-12 13:26:29 +03:00
Arik Fraimovich
685b53672e Prevent CSP violations by not having script URLs (#4062)
* Fix: remove inline script to avoid CSP violation

Closes #4039.

* Restore eslint rule that prevents javascript href attributes.

* Remove all inline script links.
2019-08-12 13:25:07 +03:00
Arik Fraimovich
7dd62ef948 Add option to control whether to format target value. (#4063) 2019-08-12 13:24:11 +03:00
Evghenii Goncearov
7c2acc34c9 Dont send password reset link to disabled users (#2631)
* Dont send password reset link to disabled users

* Update email subject

* Update blocked email text.

* Update blocked email text (plain text version).

* Remove debug print.
2019-08-11 17:29:26 +03:00
Arik Fraimovich
c5a90876f3 Add Cassandra to the list of default enabled query runners (#4058) 2019-08-11 17:17:57 +03:00
Takuya Arita
8abaf89394 Add tag management commands (#3168) 2019-08-11 16:30:48 +03:00
PengYuan Lai
aa2bd0042e check float if scale > 0 in snowflake query result (#3876) 2019-08-11 16:21:57 +03:00
Yoshiken
a7b14bfb9a Fix according to pycodestyle format (#4011)
* Fix W292 no newline at end of file

* Fix extra whitespace

* Fix E305 expected 2 blank lines after class or function definition

* Fix W391 blank line at end of file

* Fix E231 missing whitespace after

* Fix E303 too many blank lines

* Fix E302 expected 2 blank lines

* Fix E128 continuation line under-indented for visual indent
2019-08-11 16:09:04 +03:00
Oluwafemi Sule
4e5f55a4b7 Align content vertically in restricted widget type (#4056) 2019-08-11 15:28:46 +03:00
Omer Lachish
76fbe858ba refresh_queries requires Request Context (#4045)
* avoid using 'abort' in parameterized query - raise an exception instead

* when facing invalid parameters or detached dropdown queries - continue to refresh the rest of the outdated queries

* test that dropdown queries detached from data source raise an exception when fetch values is attempted

* test that queries with invalid parameters arent refreshed

* test that queries with dropdown query parameters which are detached from the data source are skipped

* fix stale test double name

* newlines. newlines everywhere.

* pass org into dropdown_values

* pass in org in every ParameterizedQuery usage

* Update redash/tasks/queries.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* reduce refresh_queries log noise

* track failure count for queries that failed to apply parameters, and also notify the failures

* Update redash/tasks/queries.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* newlines. newlines everywhere.
2019-08-09 15:26:31 +03:00
Omer Lachish
cf7aef1e16 Make sure there is an event for any query execution (#4051)
* move event recording for query executions inside run_query

* include indication of cache hit or miss inside execute_query events
2019-08-09 15:24:17 +03:00
Jannis Leidel
77625b2a13 Remove duplicate base_url function. (#4043) 2019-08-08 10:44:44 +03:00
Omer Lachish
c4dcf01b3c avoid variable shadowing (#4050) 2019-08-07 22:43:04 +03:00
Ran Byron
a167c590b6 Added arrow to multi-select component (#4044) 2019-08-06 16:46:53 +03:00
Gabriel Dutra
8e23f93433 Allow dynamic values dropdown to scroll with the page (#4040) 2019-08-06 08:55:25 -03:00
Levko Kravets
e41d40bbe0 getredash/redash#4036 Visualisation editor crashes out when changing datetype to non-HTML text (#4037) 2019-08-05 12:37:21 +03:00
Gabriel Dutra
6fc4d5b551 Focus DatePicker after selecting dynamic values (#4033) 2019-08-04 22:24:33 -03:00
Gabriel Dutra
f0576a3623 Support multi-select in parameters (#3952)
* Allow multiple values for enum parameter

* Allow multi-select for Query dropdown parameters

* CR + make sure list values are allowed

* Add prefix, suffix and separator

* Rename multipleValues and cast options as strings

* Replicate serialization logic on frontend

* Add Quote Option Select

* Make sure it's enum or query before join

* Add a couple of tests

* Add help to quote option

* Add min-width and normalize empty array

* Improve behavior when changing parameter settings
- Set parameter value again to pass through checks
- Add setValue check for multi values

* Validate enum values on setValue + CodeClimate

* Ran wording suggestions

* Updates after Apply Changes

* Fix failing Cypress tests

* Make sure enumOptions exists before split

* Improve propTypes for QueyBasedParameterInput

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* CR

* Cypress: Test for multi-select Enum

* Fix multi-selection Cypress spec

* Update Refresh Schedule
2019-08-04 15:47:30 +03:00
Levko Kravets
9eabf89771 getredash/redash#4031 Counter visualization: formatting not applied to target value (#4035) 2019-08-04 15:22:53 +03:00
Arik Fraimovich
11cc274c1c Update Snowflake connector version to latest (#4029) 2019-08-04 08:55:02 +03:00
Ran Byron
8ad08a566a Revert "Revoked widget refresh button spinners" (#4027)
This reverts commit ab5494a8fd.
2019-08-01 08:23:17 +03:00
Levko Kravets
ef31d0d768 Fix: don't update dashboard's version when adding a widget (#4026) 2019-07-31 22:28:12 +03:00
Levko Kravets
4640c33387 Bug fix: error when trying to collect dashboard-level filters for a textbox widget (#4024) 2019-07-31 18:03:40 +03:00
Levko Kravets
9b290913a6 Migrate Table visualization to React Part 1: Renderer (#3963) 2019-07-31 17:33:33 +03:00
Ran Byron
db89c4f7bc Turned off max asset size warning (#4023) 2019-07-31 11:34:52 +03:00
Gabriel Dutra
eae1fb7d73 Force readonly inputs click (#4016) 2019-07-30 11:16:34 +03:00
Arik Fraimovich
4f742aeaac Fix: support for unicode in DynamoDB queries (#4015) 2019-07-30 11:14:57 +03:00
Ran Byron
5ddad862be Updated timeago strings (#4012)
* Updated timeago strings

* Moved moment config to app/config
2019-07-29 18:03:59 +03:00
Ran Byron
6f811f163a Added widget header refresh indicator (#3970) 2019-07-29 16:43:44 +03:00
Omer Lachish
7fb33e3ebb Failed Scheduled Queries Report (#3798)
* initial work on e-mail report for failed queries

* send failure report only for scheduled queries and not for adhoc queries

* add setting to determine if to send failure reports

* add setting to determine interval of aggregated e-mail report

* html templating of scheduled query failure report

* break line

* support timeouts for failure reports

* aggregate errors within message and warn if approaching threshold

* handle errors in QueryExecutor.run instead of on_failure

* move failure report to its own module

* indicate that failure count is since last report

* copy changes

* format with <code>

* styling, copy and add a link to the query instead of the query text

* separate reports with <hr>

* switch to UTC

* move <h2> to actual e-mail subject

* add explicit message for SoftTimeLimitExceeded

* fix test to use soft time limits

* default query failure threshold to 100

* use base_url from utils

* newlines. newlines everywhere.

* remove redundant import

* apply new design for failure report

* use jinja to format the failure report

* don't show comment block if no comment is provided

* don't send emails if, for some reason, there are no available errors

* subtract 1 from failure count, because the first one is represented by 'Last failed'

* don't show '+X more failures' if there's only one

* extract subject to variable

* format as text, while we're at it

* allow scrolling for long exception messages

* test that e-mails are scheduled only  when beneath limit

* test for indicating when approaching report limits + refactor

* test that failures are aggregated

* test that report counts per query and reason

* test that the latest failure occurence is reported

* force sending reports for testing purposes

* Update redash/templates/emails/failures.html

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Update redash/templates/emails/failures.html

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Update redash/tasks/failure_report.py

* add org setting for email reports

* remove logo from failure report email

* correctly use the organization setting for sending failure reports

* use user id as key for failure reports data structure

* Update redash/tasks/failure_report.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* build comments while creating context for e-mail templates

* figure out the base url when creating the e-mail

* no need to expire pending failure report keys as they are deleted anyway when sent

* a couple of CodeClimate changes

* refactor key creationg to a single location

* refactor tests to send e-mail from a single function

* use beat to schedule a periodic send_aggregated_errors task instead of using countdown per email

* remove pending key as it is no longer required when a periodic task picks up the reports to send

* a really important blank line. REALLY important.

* Revert "a really important blank line. REALLY important."

This reverts commit c7d8ed8972.

* a really important blank line. REALLY important. It is the best blank line.

* don't send failure emails to disabled users
2019-07-28 12:40:54 +03:00
Omer Lachish
f165168860 recycle gunicorn workers (#4013) 2019-07-28 11:39:14 +03:00
Gabriel Dutra
86b0608fde Fix Apply Changes is lost when query is edited (#4010)
Co-Authored-By: Ran Byron <ranbena@gmail.com>
2019-07-27 19:05:49 -03:00
Gabriel Dutra
cd4daf8823 Add Dynamic Values to Date and Date Range Parameters (#3904)
* Draft for Date Dynamic values

* Use value with prefix instead of specific attr

* Fix not possible to select static value

* Update antd version

* Cleanup and DateRangeParameter

* Dynamic DateTimeRange

* Add Dynamic options to Date Parameters

* UI refinements

* Add getDynamicValue function

* Add 'This' options and prevent text clipping

* Make allowClear available

* Update ScheduleDialog snapshot

* Add some protections and separate Date/DateRange

* Accept null values on date or daterange parameters

* Handle undefined values on Moment propType

* Move export to end of files

* Remove Today/Now option

* Update with Apply Changes

* Show name instead of value for dynamic values

* Add comment about supporting useCurrentDateTime

* Cypress Tests: Date Parameters

* Cypress Tests: Date Range Parameters

* Don't put null params in the url

* Add workaround comments to Cypress tests

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Fix Dynamic Value as default for global parameters

* Update Back to Static Value

* Add isValid to value on Date and DateRange inputs

* CR suggestions

* Fix Back to Static Value for Dates

* Update Dynamic Value Styling

* Fix failing Date tests

* Fix selectedDynamicValue

* Parameter spec: Remove date range clickThrough

* Add transition

* Fix failing Cypress tests

* Back with 'width: auto'

* Check value is valid on Back to Static value

* CR

* Update Date Range width
2019-07-26 22:40:13 +03:00
Gabriel Dutra
78cae474e0 Cypress: Specify widgets position on sharing spec (#4009) 2019-07-26 13:15:39 -03:00
Naoyuki Kataoka
c518c7a4bc Modified PagerDuty destination to avoid an error for multi-byte characters (#4008) 2019-07-24 09:06:25 +03:00
Gabriel Dutra
8c2f51d09d Percy: Fix shared dashboard inconsistent snapshots (#4002) 2019-07-23 11:55:24 -03:00
Gabriel Dutra
6f6c68bd79 Cypress: Separate dashboard spec (#4003) 2019-07-22 11:09:08 -03:00
Ran Byron
64f274f58e Disable execute when params are dirty (#4001)
* Disable execute when params dirty

* Removed special apply handling for query page

* Updated tests
2019-07-22 12:13:34 +03:00
Omer Lachish
dd89bd885f Add "deprecated" flag to query runners (and alert destinations) (#3972)
* add a deprecated flag to query runners and show only non-deprecated query runners when adding a new data source

* add a deprecated flag to alert destinations and show only non-deprecated alert destinations when adding a new alert destination

* add a deprecated() decorator for a more succint way to deprecate

* deprecate URL query runner and HipChat alert destination

* use class properties instead of class methods for deprecation

* I <3 newlines
2019-07-22 10:36:31 +03:00
Ran Byron
b2295197cf Added publish notification to query rename (#3998) 2019-07-21 15:01:08 +03:00
Omer Lachish
ea0e411053 Return unsafe sharing error from backend (#3990)
* return message explaining unsafe sharing

* use backend-generated message for public dashboards

* use backend-generated message for embeds

* Update redash/handlers/query_results.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* refactor simple (non-interpolated) query result handler error messages to a single location

* use error_messages to test out unsafe error messages (along with a couple of others)

* Update redash/handlers/query_results.py

Co-Authored-By: Ran Byron <ranbena@gmail.com>

* Update redash/handlers/query_results.py

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>
2019-07-21 09:21:45 +03:00
Arik Fraimovich
9bdb3412a5 Move query runners/destinations import from redash.app to redash. (#3993)
* Move query runners/destinations import from redash.app to redash.

* Add missing argument
2019-07-21 09:05:29 +03:00
Fumiya Karasawa
ad4a760545 Search dropdown parameters (#3796) 2019-07-20 16:07:03 +03:00
Omer Lachish
c1f4147807 Avoid committing it.only (#3995)
* remove it.only, left by mistake

* use no-only-tests

* 'off' should be used instead of 'none'

* Dedup jest/only rule

* always error for .only
2019-07-19 18:30:38 +03:00
Ran Byron
c054ae8be0 Fixed filter style issue (#3996) 2019-07-18 13:49:37 +03:00
Omer Lachish
d1edd3d068 Query Result API response shouldn't include query information for non authenticated users (#3985)
* avoid catching errors on text widgets' load(), as they don't have a visualization and therefore do not return any promise

* throw error when failing to load widgets on public dashboards - in case something needs to be done with it at a later time, and it's the right thing to do anyway

* use Promise.resolve instead of checking for undefined

* call serialize_query_result instead of directly calling to_dict

* filter unneeded query result fields for unauthenticated users

* test for serialization filtering

* lint

* use project instead of list comprehension
2019-07-18 12:12:49 +03:00
Arik Fraimovich
4989bfae60 Remove custom Redis connection code in favor of redis.from_url (#3992) 2019-07-18 12:03:52 +03:00
Gabriel Dutra
f20a020003 Use AceEditor for Query Snippets (#3973)
Co-Authored-By: Ran Byron <ranbena@gmail.com>
2019-07-17 13:47:31 -03:00
Ran Byron
01da8c158a Parameter “Apply Changes” button (#3907) 2019-07-17 17:17:39 +03:00
Omer Lachish
c83e40b047 Celery doesn't auto reload in development (#3898)
* pick up *.py file changes and restart scheduler

* only watch /redash in order to avoid reloading on other file changes (e.g. tests)

* add dev_scheduler entrypoint

* use exec

* Update bin/docker-entrypoint

* rename dev_scheduler to dev_worker

* use same defaults as worker
2019-07-17 10:38:56 +03:00
Ran Byron
c3cc65a21d Viz embed logo alignment (#3956) 2019-07-16 11:37:31 +03:00
Omer Lachish
5929139ab8 A couple of parameters-on-public-dashboards loose ends (#3988)
* avoid catching errors on text widgets' load(), as they don't have a visualization and therefore do not return any promise

* throw error when failing to load widgets on public dashboards - in case something needs to be done with it at a later time, and it's the right thing to do anyway

* use Promise.resolve instead of checking for undefined
2019-07-16 10:48:37 +03:00
Ran Byron
66794acd1f Added loading indicator to public dashboard (#3984) 2019-07-16 10:31:19 +03:00
Arik Fraimovich
bce0832e48 Show error in case of failing to load a dashboard (#3983) 2019-07-15 22:13:46 +03:00
Yuri Grishaev
9f006997a0 mattermost needs whitespace to use h4 heading (#3981)
#### Even Smaller Heading - good
####Even Smaller Heading - bad
2019-07-15 21:13:17 +03:00
Omer Lachish
51d8131db5 Allow Parameters on Public Dashboards (#3659)
* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* use the textless endpoint (/api/queries/:id/results) for pristine
queriest

* Revert "use the textless endpoint (/api/queries/:id/results) for pristine"

This reverts commit cd2cee7738.

* go to textless /api/queries/:id/results by default

* change `run_query`'s signature to accept a ParameterizedQuery instead of
constructing it inside

* raise HTTP 400 when receiving invalid parameter values. Fixes #3394

* enqueue jobs for ApiUsers

* rename `id` to `user_id`

* support executing queries using Query api_keys by instantiating an ApiUser that would be able to execute the specific query

* show deprecation messages for ALLOW_PARAMETERS_IN_EMBEDS. Also, move
other message (email not verified) to use the same mechanism

* add link to forum message regarding embed deprecation

* change API to /api/queries/:id/dropdowns/:dropdown_id

* split to 2 different dropdown endpoints and implement the second

* add test cases for /api/queries/:id/dropdowns/:id

* use new /dropdowns endpoint in frontend

* first e2e test for sharing embeds

* Pleasing the CodeClimate overlords

* All glory to CodeClimate

* remove residues from bad rebase

* add query id and data source id to serialized public dashboards

* add global parameters directive to public dashboards page

* allow access to a query by the api_key of the dashboard which includes
it

* rename `object` to `obj`

* simplify permission tests once `has_access` accepts groups

* support global parameters for public dashboards

* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* rename `object` to `obj`

* simplify permission tests once `has_access` accepts groups

* no need to log `is_api_key`

* send parameters to public dashboard page

* allow access to a query by the api_key of the dashboard which includes it

* disable sharing if dashboard is associated with unsafe queries

* remove cypress test added in the wrong place due to a faulty rebase

* add support for clicking buttons in cy.clickThrough

* Cypress test which verifies that dashboards with safe queries can be shared

* Cypress test which verifies that dashboards with unsafe queries can't be shared

* remove duplicate tests

* use this.enabled and negate when needed

* remove stale comment

* add another Cypress test to verify that unauthenticated users have access to public dashboards with parameters

* obviously, I commit 'only' the first time I use it

* search for query access by query id and not api_key

* no need to fetch latest query data as it is loaded by frontend from the textless endpoint

* test that queries associated with dashboards are accessible when supplying the dashboard api_key

* propagate `isDirty` down to `QueryBasedParameterInput`

* go to /api/:id/dropdown while editing a query, since dropdown queries might still not be associated with the parent. see #3711

* show helpful error message if dropdown values cannot be fetched

* use backticks instead of line concatenation

* remove requirement to have direct access to dropdown query in order validate it. parent query association checks are sufficient

* remove isDirty-based implementation and allow dropdown queries through nested ACL even if they aren't associated yet (given that the user has _direct_ access to the dropdown query)

* fix tests to cover all cases for /api/queries/:id/dropdowns/:id

* fix indentation

* require access to the query, not the data source

* resolve dashboard user by query id

* apply new copy to Cypress tests

* if only something would have prevented me from commiting an 'only' call 🤔

* very important handling of whitespace

* respond to parameter's Apply button

* text widgets are safe for sharing

* remove redundant event

* add a safety check that object has dashboard_api_keys before calling it

* supply a parameter value for text parameters to have it show up

* add parameter values for date and datetime

* use the current year and month to avoid pagination

* use Cypress.moment() instead of preinstalled moment()

* explicitly create parameters

* refresh query data if a  querystring parameter is provided

* avoid sending a data_source_id - it's only relevant to unsaved queries, since a saved query's data_source is available in the backend

* remove empty query text workaround

* provide default value to parameter

* add a few more dashboard sharing specs

* lint

* wait for DynamicTable to appear to reveal that actual results are displaying

* override error message for unsafely shared widgets
2019-07-15 15:09:30 +03:00
Arik Fraimovich
c793b5dd11 Remove explicit kombu dependency (#3978)
We used an explicit kombu dependency to target the correct Redis version, but current version of Celery supposed to use it by default.
2019-07-14 08:47:15 +03:00
Levko Kravets
4e9da3f116 [Bug fix] Plotly legend overlaps plot on small screens (when legend clicked) (#3976) 2019-07-13 18:27:53 +03:00
Arik Fraimovich
15a8eecdde JSON Data Source (#3805)
* WIP: JSON Data Source

* Add JSON data source to default list
2019-07-11 14:23:38 +03:00
k-tomoyasu
a8ff2500be Build custom alert message (#3137)
* build custom alert message

* fit button color tone

* pass existing test

* fix typos

* follow code style

* add webhook alert description and avoid key error

* refactor: create alert template module

* follow code style

* use es6 class, fix template display

* use alerts.options, use mustache

* fix email description

* alert custom subject

* add alert state to template context, sanitized preview

* remove console.log 🙇

* chatwork custom_subject

* add alert custom message. pagerduty, mattermost, hangoutschat

* Pass custom subject in webhook destination

* Add log message when checking alert.

* Add feature flag for extra alert options.
2019-07-11 13:23:06 +03:00
Ran Byron
7bf84e856c Workaround fixes for datepicker display bug in Cypress tests (#3967) 2019-07-10 17:47:46 +03:00
Levko Kravets
5149bf67ca [Bug fix] Archiving a dashboard cause widgets to show reload spinner forever (#3968) 2019-07-10 13:35:15 +03:00
Arik Fraimovich
93449db325 Improvements to Query Result serialization code (#3960)
* Fix: allow serializing empty or bad dates

* Improve date serialization performance

* Remove duplicate assertion.
2019-07-10 10:51:34 +03:00
Arik Fraimovich
df57d22e81 Add explicit route for dashboards to allow embedding in iframes. (#3957)
* Add explicit route for dashboards to allow embedding in iframes.

* Add missing blank lines
2019-07-10 10:25:08 +03:00
Gabriel Dutra
de0a44ee85 Migrate Query Snippets to React (#3627) 2019-07-09 09:27:39 -03:00
Tomoki Sekiyama
261062d491 Support multi-byte search for query names and descriptions (#3908)
* Support multi-byte search for query names and descriptions

* add multi_byte_support_enabled option to organization settings

* add `ilike %...%` to query search conditions when the option is enabled

* Improve description for multi_byte_search_enabled option

Co-Authored-By: Arik Fraimovich <arik@arikfr.com>

* Remove tsvector from search when multi_byte_search_enabled

* Add a multi-byte search test case
2019-07-08 10:01:47 +03:00
Arik Fraimovich
1878e8bf90 Add additional Celery config options (#3961) 2019-07-08 08:32:18 +03:00
Arik Fraimovich
47fc8a942a Add options to hide different parts of embed UI (parameters, title, link to query) (#3955)
* Move closing tag to correct location

* Add options to hide elements in query embed UI

* Fix for headless top padding (#3959)
2019-07-07 14:34:00 +03:00
Arik Fraimovich
addecbdd8f Allow calling query results endpoint without parameters. (#3958)
* Allow calling query results endpoint without parameters.

* Fix: allow serializing empty or bad dates

* Revert "Fix: allow serializing empty or bad dates"

This reverts commit cc49319d9e.
2019-07-07 14:22:08 +03:00
Gabriel Dutra
baec5d56f5 Remove time from Date column in filters (#3953) 2019-07-05 18:13:12 -03:00
Levko Kravets
1f4325ba8d Migrate Box Plot visualization to React (#3948) 2019-07-04 22:25:09 +03:00
Arik Fraimovich
5e5b56ed6a Fix: render date/time values as strings and not epoch time (#3951) 2019-07-04 20:49:59 +03:00
Arik Fraimovich
45a3b72730 Update fsevents to v1.2.9 (#3950) 2019-07-04 15:43:43 +03:00
Levko Kravets
cc48de0d8f Migrate Word Cloud visualization to React (#3930) 2019-07-03 13:29:05 +03:00
Arik Fraimovich
300f3f6780 Fix: waiting tasks are not shown in admin view (#3942)
* Fix: waiting tasks are not shown properly

* Added a comment.
2019-07-03 11:09:42 +03:00
Omer Lachish
2e4a69cba4 Parameter spec fixes (#3932)
* supply a parameter value for text parameters to have it show up

* add parameter values for date and datetime

* use the current year and month to avoid pagination

* use Cypress.moment() instead of preinstalled moment()

* capture time before clicking on Now

* use now from input

* use now from input for another test
2019-07-01 09:56:55 +03:00
Arik Fraimovich
6748e9a15d Add option to hide Pivot Table totals (#3943)
* Add option to hide Pivot Table totals

* Simplify implementation using DEFAULT_OPTIONS.

* Flip hide pivot controls to show pivot controls

* Update client/app/visualizations/pivot/Editor.jsx

Co-Authored-By: Ran Byron <ranbena@gmail.com>
2019-06-30 15:43:18 +03:00
Arik Fraimovich
7ceb68a468 Visualization: details view (#3778)
* Details visualization

* Add PropTypes and guard against no rows
2019-06-30 15:34:02 +03:00
Levko Kravets
3c1d1e3d4e Explicitly mark default visualization (#3944) 2019-06-30 14:09:00 +03:00
Levko Kravets
92391e3cbc [Bug fix] Toggling Use Dashboard Level Filter cause widgets to show reload spinner forever (#3939) 2019-06-28 15:02:07 +03:00
Levko Kravets
17438002d7 [Bug fix] Adding widget from query page is broken (#3921) 2019-06-25 20:06:36 +03:00
Jianchao Yang
a00c5a8857 Dockerfile front end stage copies client side files only (#3924)
So that changing other files will not trigger the
very expensive rebuild process.
2019-06-23 11:33:52 +03:00
John Karahalis
a696fa55f3 Set unique class name for Query Control Dropdown (#3922)
This will help me target the Query Control Drodpwon in my extension.
2019-06-23 10:01:46 +03:00
Arik Fraimovich
27259b5abe Add support for int/float values in guess_type (#3913) 2019-06-20 08:55:31 +03:00
Ran Byron
9ee393ec75 Fix schedule dialog needless confirm saves (#3919) 2019-06-20 08:54:53 +03:00
Ran Byron
cfafa97218 Fixed boolean filter (#3915) 2019-06-19 14:54:27 +03:00
deecay
be580b24a5 Expose celery job timeout setting to env var (#3912)
* Expose celery job timeout to env

* Change variable name
2019-06-19 14:41:12 +03:00
Arik Fraimovich
a6960c5f19 Fix: time format option was wrong (#3916) 2019-06-19 14:37:02 +03:00
Arik Fraimovich
6dd321beeb Rockset: handle query errors (#3910) 2019-06-18 14:10:25 +03:00
Arik Fraimovich
27c64b42ac Add keyboard shortcut for format query (Ctrl/Cmd+Shift+F) (#3911)
* Add keyboard shortcut for format query

* Added to button tooltip
2019-06-18 14:10:05 +03:00
deecay
99bf6d122c Custom Map Markers (#3840) 2019-06-18 09:50:09 +03:00
Ran Byron
d617f57f7d Increase celery job timeout (#3903) 2019-06-17 08:35:02 +03:00
Guy Cohen
21a27ee0b1 Fix OverflowError on celery worker (#3899) 2019-06-16 11:34:29 +03:00
YOSHIDA Katsuhiko
ac293c7f92 Add alert deletion confirmation dialog (#3902) 2019-06-15 14:28:55 +03:00
YOSHIDA Katsuhiko
8e38dcd244 Support regenerating Query API Key (#3764)
* Add regenerate function of query's API Key

* Add regenerate API Key button

* Add regenerate Query API Key tests

* Fix too long line

* Replace  with this

* Return a simple version query

* Update only API Key

* Update API Key via query
2019-06-12 13:09:21 +03:00
Aidarbek Suleimenov
2bab144107 Celery task to clear schedule was added (#3801)
* Celery task to clear schedule was added

* fix formating

* empty_schedules task was put in separate task

* worker interval changed, new tests added

* past artifact deleted

* test queries moved to right class, lambda was used to filter data

* unnecessary changes eliminated

* more unnecessary files deleted

* line shortened

* Line shortened more

* codeclimate changes

* Unused test deleted, logs added
2019-06-12 13:07:15 +03:00
Mike Nason
4e0a251034 Add support ssl connections to redis (#3848)
* Add support ssl connections to redis

* Fix line length

* Update redash/__init__.py w suggestion

Co-Authored-By: Omer Lachish <omer@rauchy.net>

* Cleanup init after suggestion

* Move redis SSL config to settings

* Do not pass celery SSL config unless necessary

* Fix typo
2019-06-12 13:04:34 +03:00
Levko Kravets
7a9f4b07e0 Force a Choose account step for Google OAuth (#3884) 2019-06-12 11:48:25 +03:00
Arik Fraimovich
1630cbb904 Google Sheets: friendlier error message in case of an API error and more reliable test connection (#3883)
* Google Sheets: friendlier error message in case of an APIError and more reliable test connection.

* Pleasing the pep8 gods
2019-06-12 11:46:59 +03:00
Levko Kravets
f8d05dda9f getredash/redash#3879 Plotly legent overlaps plot on small screens (FF only) (#3882) 2019-06-12 11:46:34 +03:00
Omer Lachish
2af8b39d21 Authorize according to API key (if given) over cookies (#3877)
* remove legacy session identifier support

* remove redundant test

* redirect to login to support any invalid session identifiers

* be more specific with caught errors

* use authorization according to api_key (if provided) over session
2019-06-12 11:45:28 +03:00
dependabot[bot]
3faed0fdfe Bump pyopenssl from 16.2.0 to 17.5.0 (#3872)
Bumps [pyopenssl](https://github.com/pyca/pyopenssl) from 16.2.0 to 17.5.0.
- [Release notes](https://github.com/pyca/pyopenssl/releases)
- [Changelog](https://github.com/pyca/pyopenssl/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pyca/pyopenssl/compare/16.2.0...17.5.0)
2019-06-12 11:38:47 +03:00
dependabot[bot]
e45f49b86e Bump cryptography from 2.0.2 to 2.3 (#3870)
Bumps [cryptography](https://github.com/pyca/cryptography) from 2.0.2 to 2.3.
- [Release notes](https://github.com/pyca/cryptography/releases)
- [Changelog](https://github.com/pyca/cryptography/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/2.0.2...2.3)
2019-06-12 11:38:38 +03:00
Omer Lachish
e33ad3b164 Query Results: querying a column with a dictionary or array fails (#3887)
* flatten lists and dicts to json to be used with SQLite's json_extract functions

* add test that verifies that lists and dicts are saved

* add test that verifies that lists and dicts are saved
2019-06-11 17:41:15 +03:00
Omer Lachish
6605f62f3a add api_key to embed download urls (#3896) 2019-06-11 14:02:02 +03:00
Omer Lachish
ed2ac407ab Remove schema after deleting data source (#3894)
* remove schema from redis after deleting data sources

* switch to _pause_key to property
2019-06-10 22:39:26 +03:00
Ran Byron
dda75cce24 Drawer menu with recreated close button (#3889)
* Drawer menu with recreated close button

* Added “Open in new window” drawer menu button (#3890)
2019-06-09 12:21:53 +03:00
Omer Lachish
5b780ac460 Refresh Public Dashboards (#3881)
* remove legacy session identifier support

* remove redundant test

* redirect to login to support any invalid session identifiers

* be more specific with caught errors

* fix refresh for public dashboards
2019-06-06 11:07:12 +03:00
koooge
c0e8ef3000 Upgrade gspread 3.1.0 for supporting team drive (#3838)
* Upgrade gspread 3.1.0 for supporting team drive

Signed-off-by: koooge <koooooge@gmail.com>

* Revert "Upgrade gspread 3.1.0 for supporting team drive"

This reverts commit e53e8cb75b.

* Upgrade gspread 3.1.0 for supporting team drive

Signed-off-by: koooge <koooooge@gmail.com>

* Update Sheets query runner name
2019-06-06 11:02:08 +03:00
Gabriel Dutra
a82fd0cabc Cypress: Fix date parameters false positive (#3873) 2019-06-04 12:19:55 -03:00
Ran Byron
0e3e2eaf38 Restrict dynamic-table internal scroll only when pagination appears (#3875) 2019-06-04 09:11:19 -06:00
Omer Lachish
05f6ef0fb6 Remove legacy session identifier support (#3866)
* remove legacy session identifier support

* remove redundant test

* redirect to login to support any invalid session identifiers

* be more specific with caught errors
2019-06-03 22:18:24 +03:00
dependabot[bot]
e433efebc4 Bump flask from 0.11.1 to 0.12.3 (#3871)
* Bump flask from 0.11.1 to 0.12.3

Bumps [flask](https://github.com/pallets/flask) from 0.11.1 to 0.12.3.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/master/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/0.11.1...0.12.3)

* Bump to Flask 0.12.4 to fix an issue
2019-06-03 18:04:43 +03:00
Arik Fraimovich
a9588eac79 Update version to 8.0.0-beta. (#3869) 2019-06-02 14:37:16 +03:00
Arik Fraimovich
090b570a71 Rearrange README badges. 2019-06-02 14:01:09 +03:00
Arik Fraimovich
60b12e3121 Update PromiseRejectionError to show error message from API response (#3868)
* Update PromiseRejectionError to show error message from API response

* Update version to 8.0.0-beta.

* Revert "Update version to 8.0.0-beta."

This reverts commit c8fa74967f.
2019-06-02 11:47:26 +03:00
Arik Fraimovich
3f8c7333be Use the debian flavor of the redash/base image (#3240) 2019-06-02 11:42:19 +03:00
Arik Fraimovich
be8dec5f04 Add Collapse component (#3867) 2019-06-02 11:12:37 +03:00
Levko Kravets
10b3b50f3d getredash/redash#3862 Widget menu should not be available on public dashboards (#3863) 2019-06-02 11:00:10 +03:00
Levko Kravets
6f290ddfa1 Use more specific CSS for public dashboard page to avoid conflicts with other components (#3864) 2019-05-31 23:41:43 +03:00
Ran Byron
10b62ebe02 Beautify autoheight code a bit (#3865) 2019-05-31 14:09:29 -06:00
Ran Byron
04453409da Fix widget autoHeight related exception (#3858) 2019-05-31 05:57:26 -06:00
Gabriel Dutra
b27df216f4 Cypress tests for query parameters (#3810) 2019-05-30 10:01:44 -03:00
Levko Kravets
a0c76d777b getredash/redash#3851 Disable filter which does not have values (#3852) 2019-05-30 15:53:28 +03:00
Levko Kravets
2e96e2fb98 getredash/redash#3849 Fix initialization of dashboard-level parameters (#3853) 2019-05-30 15:51:58 +03:00
Gabriel Dutra
c2e31f040d Fix table isn't displayed with date filter (#3842) 2019-05-29 09:40:25 -03:00
Arik Fraimovich
816f4d912f Capitalize "elsewhere" (#3844) 2019-05-29 14:47:17 +03:00
Arik Fraimovich
9292ae8d3f CSV: correctly serialize booleans and dates. (#3841)
* CSV: correctly serialize booleans and dates.

Closes #3736, closes #2751.

* pep8 fixes

* Move column iteration to a helper function.

* Use elif, as types are mutually exclusive.

* Refactor parsing implementation.

* Move the csv generation fucntion
2019-05-29 10:45:29 +03:00
Levko Kravets
9480d89e4c [Feature] Migrate CreateDashboardDialog to React (#3826) 2019-05-27 23:12:52 +03:00
Ran Byron
5dff5b929c Unsupported browser redirect script outputted to file (#3832) 2019-05-27 13:18:04 -06:00
Gabriel Dutra
28e9740e2f Update Data Source Lifecycle Events (#3828) 2019-05-27 19:28:16 +03:00
Ran Byron
7679df63ba Fix for Mac browser’s scrollbar obscuring content (#3830) 2019-05-27 18:31:02 +03:00
Jannis Leidel
07c9530984 Decouple extensions from Flask app. (#3569)
* Decouple extensions from Flask app.

This separates the extension registry from the Flask app and also introduces a separate registry for preriodic tasks.

Fix #3466.

* Address review feedback.

* Update redash/extensions.py

Co-Authored-By: jezdez <jannis@leidel.info>

* Minor comment in requirements.

* Refactoring after getting feedback.

* Uncoupled bin/bundle-extensions from Flas app instance.

* Load bundles in bundle script and don’t rely on Flask.

* Upgraded to importlib-metadata 0.9.

* Add missing requirement.

* Fix TypeError.

* Added requirements for bundle_extension script.

* Install bundles requirement file correctly.

* Decouple bundle loading code from Redash.

* Install bundle requirements from requirements.txt.

* Use circleci/node for build-docker-image step, too.
2019-05-26 14:56:02 +03:00
Rueian
aecd0bf37a include bigquery_gce.png in db-logos (#3825) 2019-05-26 13:27:29 +03:00
Omer Lachish
4143bd3f20 when authenticated, the query shouldn't be sent over to the /jobs endpoint (#3831) 2019-05-26 12:19:32 +03:00
Arik Fraimovich
020dc35faf Create SECURITY.md (#3823)
* Create SECURITY.md

* Update SECURITY.md

Co-Authored-By: Gabriel Dutra <nesk.frz@gmail.com>
2019-05-26 09:32:41 +03:00
Gabriel Dutra
d7b03bac02 Add CircleCI env vars to Cypress docker (#3827) 2019-05-23 22:33:23 +03:00
Omer Lachish
29875e66d4 Plug custom Celery tasks via dynamic settings (#3819)
* plug custom celery tasks via dynamic settings

* an extra blank line
2019-05-22 11:37:18 +03:00
taminif
d97ce15837 refactor format semi-colon (#3812) 2019-05-22 11:10:16 +03:00
Gabriel Dutra
b263bb7077 [Bug fix] Fix "Now" in DateTime parameter not working (#3808) 2019-05-16 18:42:48 +03:00
Ran Byron
606cf12e74 Dashboard grid React migration #1 (#3722)
* Dashboard grid React migration

* Updated tests

* Fixes comments

* One col layout

* Tests unskipped

* Test fixes

* Test fix

* AutoHeight feature

* Kebab-cased

* Get rid of lazyInjector

* Replace react-grid-layout with patched fork to fix performance issues

* Fix issue with initial layout when page has a scrollbar

* Decrease polling interval (500ms is too slow)

* Rename file to match it's contents

* Added some notes and very minor fixes

* Fix Remove widget button (should be visible only in editing mode); fix widget actions menu

* Fixed missing grid markings

* Enhanced resize handle

* Updated placeholder color

* Render DashboardGrid only when dashboard is loaded
2019-05-16 15:43:46 +03:00
Levko Kravets
4508975749 [Bug fix] Plotly modebar appears above modals (#3799) 2019-05-15 10:43:34 +03:00
Gabriel Dutra
c76955be28 Refresh query when parameters update (#3737)
* Add touch state to parameters and autoupdate query

* Use values change event instead of $watch

* Remove getQueryResultDebounced

* Add Apply button

* Remove Input Number spinners for Parameters

* Make Apply Button optional

* Update share_embed_spec

* Change debounce to the Parameters component

* Remove unnecessary click on Execute query

* Add apply button to the remaining places

* Update dashboard_spec

* Use onKeyUp for InputNumber

* Simplify onParametersValuesChanged

* Update DateTime onChange function

* Don't apply when modifier key is pressed

* Remove refresh Button from Parameters

* Update apply button styling

* Update apply right distance

* Remove debounce for testing

* Use data-dirty instead of classNames for styling

* Make sure $apply runs before calling onChange
2019-05-15 08:57:06 +03:00
Gabriel Dutra
4f402379e8 Migrate Embed Query Dialog to React (#3783)
* Update Antd

* Migrate Embed Query Dialog to React

* Update jest ScheduleDialog snapshot

* Add Alert for unsafe queries

* Add CodeBlock

* Add inputs to change iframe size

* Undo ant update

* Update share embed spec

* Update styling

* Change border-radius to 2px

* Update margin between Public URL and IFrame Embed
2019-05-15 08:38:40 +03:00
Ran Byron
733b60102d Fixed visual-card alignment (#3795) 2019-05-14 14:10:35 -06:00
Levko Kravets
b9b30a39d2 [Bug fix] Edit parameter mapping: error when trying to change mapping type to Static; cannot change static value (#3800)
* Edit parameter mapping: error when trying to change mapping type to Static

* Parameter mapping editor: cannot change static value
2019-05-14 19:10:02 +03:00
Levko Kravets
c74d469181 resize-event: take into account transformations and transitions (#3794) 2019-05-13 22:51:05 +03:00
Ran Byron
95f11e6686 Loading indicator till app inits (#3788) 2019-05-13 12:11:22 -06:00
Jakdaw
ad6f7109de Fix support for calling MySQL Stored Procedures and allow queries to be cancelled (#3003)
* If MySQL returns multiple resultSets (eg when executing multiple statements, or calling stored procedures) then use the last resultSet that has columns

* Make cancellation of a MySQL query work (the same way the C client does it)

* Address code climate moans
2019-05-13 18:51:51 +03:00
taminif
b09ae46a9f filtered tag remove empty name at edit query (#3784)
* filtered tag remove empty name at edit query

* use filter
2019-05-13 17:57:45 +03:00
Arik Fraimovich
0cda0369f0 [BigQuery] Fix: in some queries there is no mode field (#3786)
Happened with INSERT/UPDATE queries.
2019-05-13 17:08:18 +03:00
Arik Fraimovich
50f11069ce Presto: ignore blank passwords (#3791)
PyHive expects only None as no password.
2019-05-13 12:36:07 +03:00
Arik Fraimovich
6bf764be07 Update query to bring only name to make sure screenshots are consistent. (#3790) 2019-05-12 20:43:32 +03:00
Ran Byron
3159410694 Restrict markdown image dimensions (#3789) 2019-05-12 20:23:10 +03:00
Gabriel Dutra
76bd2e3c50 Migrate Organization Settings to React (#3728)
* Migrate Organization Settings to React

* Fix failing spec and replace default values from inputs

* Add HelpTrigger and handleChange to SAML options

* Undo changes to ant-variables.less

* Add time format to OrganizationSettings
2019-05-12 14:23:22 +03:00
Omer Lachish
50a6f723b1 Fix Ability to Add Query-based Parameters to Existing Queries (#3716)
* propagate `isDirty` down to `QueryBasedParameterInput`

* go to /api/:id/dropdown while editing a query, since dropdown queries might still not be associated with the parent. see #3711

* show helpful error message if dropdown values cannot be fetched

* use backticks instead of line concatenation

* remove requirement to have direct access to dropdown query in order validate it. parent query association checks are sufficient

* remove isDirty-based implementation and allow dropdown queries through nested ACL even if they aren't associated yet (given that the user has _direct_ access to the dropdown query)

* fix tests to cover all cases for /api/queries/:id/dropdowns/:id

* fix indentation

* require access to the query, not the data source

* use require_access instead of has_access
2019-05-12 12:48:01 +03:00
Omer Lachish
0ee20797c8 Fix embeds without parameters (#3775)
* provide queryId when fetching query results in order to allow query-based api-key authentication to work properly

* cypress test to verify that embeds without parameters are shared succesfully

* rename Percy snapshot
2019-05-12 12:28:31 +03:00
taminif
d7515562a4 Fix: Filter empty tags (#3780) 2019-05-10 09:55:53 -06:00
Osmo Salomaa
feafbbe318 Avoid error with duplicate log lines (#3777)
https://docs.angularjs.org/error/ngRepeat/dupes
2019-05-07 22:07:39 +03:00
deecay
b7b345dacd [Feature] Choropleth customize (added new map: Japanese Prefectures) (#3154) 2019-05-07 12:04:17 +03:00
Arik Fraimovich
0b22aa55a1 DynamoDB: safe implementation of schema loading (#3774)
* Safe implementation of describe_all.

* autopep8.
2019-05-06 20:13:45 +03:00
Arik Fraimovich
3eddea6e88 Show non relative timestamp when printing an embed. (#3773)
(Also used for the Slack snapshots)
2019-05-06 20:12:57 +03:00
yoavbls
c85e097f8a [Bug fix] Fix dashboard filters to collect options too (#3759) 2019-05-06 11:40:21 +03:00
YOSHIDA Katsuhiko
81bc4ef58b [Feature] Add direction option in Pie Chart (#3762) 2019-05-06 11:30:48 +03:00
Omer Lachish
9fec3ca9ea Poll for results in parameterized embeds (#3752)
* add an endpoint for fetching job using a query's api_key

* when unauthenticated, use api_key to get job, and fetch the latest query
result (as opposed to fetching the query result by ID)

* add 'refresh dataset' button to parameters directive

* fix scope error introduced by earlier commit

* show timer when refreshing results

* Show input for missing parameters in embedded visualizations (#3741)

* Redirect to default parameter values when parameters are missing in
embedded visualizations

* Revert "Redirect to default parameter values when parameters are missing in"

This reverts commit 43c65500b7.

* load all data after page is loaded

* return no data only when parameters are missing

* data binding no longer required

* show an error on embeds that fail to load

* data binding no longer required

* present full-page error when dealing with unsafe queries

* don't render the execute button for each parameter

* show 'missing parameter value' error

* Don't reload the whole page when parameter value changes.

* Set API key and load config before rendering.

* Add Query#hasParameters method.

* Don't show download controls for parameterized queries (they won't work).

* Use getUrl to construct a correct query link.

* WIP: have a single way to load results

1. This preloads the query before rendering the page, so we can benefit from using default parameters & make the logic in component simpler.
2. Use a single way to load results, to make sure we do polling when try to load the query results for the first time.

* Show persistent errors and finish loading logic.

* Check if query is safe and show message otherwise.

* Fix test for unsafe parameters embed.

* wait for query results to return before taking snapshot
2019-05-06 09:14:56 +03:00
Arik Fraimovich
ee29cf9efc Fix: pie chart not rendering when series doesn't exist in options. (#3756) 2019-05-05 09:04:52 +03:00
Arik Fraimovich
17aba39636 Fix: default value for Presto password should be None (#3757) 2019-05-05 09:04:42 +03:00
Yusuke Goto
2cd1b07a41 Add: organization setting for time format (#3754)
* Support for time format

* Add selects test

* Rename into date_time_format_config
2019-05-05 09:03:27 +03:00
taminif
72d00314a4 [Code style] Add semi-colons (#3755) 2019-05-02 22:30:05 +03:00
Aidarbek Suleimenov
5b077ab083 Support for Presto password (#3619) 2019-05-01 17:25:59 +03:00
Takuya Arita
da2d6bc3a8 Move is_url_key method to function for testability. (#3750) 2019-05-01 13:52:41 +03:00
Takuya Arita
33930a5b9c Remove unused import statements (#3751) 2019-05-01 13:51:56 +03:00
John Karahalis
fbff4f9219 Convert query control dropdown button to React (#3698) 2019-05-01 07:20:54 +03:00
Jannis Leidel
30f725f1e1 Add missing parameter to new BigQuery query runner method. (#3747) 2019-04-30 21:16:58 +02:00
Gabriel Dutra
47cd05b48e Cypress: Fix Stuck E2E test - create_query_spec (#3748) 2019-04-30 14:21:26 -03:00
Levko Kravets
9a4433bf68 Migrate visualizations registry/renderer/editor to React (#3493) 2019-04-30 16:34:00 +03:00
Ran Byron
d0b2151b4d Fix query page height (#3744) 2019-04-29 23:29:17 +03:00
Omer Lachish
21e22a2d0d add get_by_id to Organization (#3712) 2019-04-29 21:58:29 +03:00
Gabriel Dutra
f3a653c57f Fix query based parameter has value null when created (#3707)
* Fix query based parameter value null when created

* Use toString to avoid having 'null' string
2019-04-29 21:50:04 +03:00
guwenqing
c9bf412240 Update npm run to fix hpe_header_overflow (#3732)
Nodejs has set max header size to 8k in http_parser,
need to provide a larger header size to make the proxy work.
2019-04-29 21:23:06 +03:00
Osmo Salomaa
48955b5fa1 Use monospace font in query output log (#3743)
Closes #3739
2019-04-29 21:21:51 +03:00
Ran Byron
24a5748528 Dashboard grid markings (#3656) 2019-04-29 15:49:09 +03:00
Arik Fraimovich
8758279b14 Use REDASH_BASE_PATH everywhere instead of hardcoded path (#3740)
Closes #3727
2019-04-29 14:28:16 +03:00
Jannis Leidel
99bb24d899 Make creating the BigQuery job data pluggable. (#3742)
This would for example allow adding custom job labels (https://cloud.google.com/bigquery/docs/adding-using-labels#job-label) for easier accounting.
2019-04-29 14:18:36 +03:00
Omer Lachish
c93a905c1d Fix Ability to save with Multiple Dropdown Parameters (#3717)
* support multiple associations of the same query-based dropdown parameter

* include several query-based parameters in association tests
2019-04-28 14:25:26 +03:00
AntonZ
a1e75d2f0b feature: add couchbase query runner (#3658)
* feature: add couchbase query runner

* fix style

* fix style

* fix style

* fix naming due to convention

* extracting protocol as parameter
2019-04-24 20:13:59 +03:00
Ran Byron
fb48bc374a Refactored dashboard drag/resize testing (#3726) 2019-04-22 10:07:22 +03:00
Ran Byron
10a6ccbbcd Dashboard save fail indication (#3715) 2019-04-19 21:41:35 +03:00
Gabriel Dutra
fea082ec77 Update Percy network idle timeout (#3724) 2019-04-19 10:58:37 -03:00
Jannis Leidel
aa9d2466cd Split redash/__init__.py to prevent import time side-effects. (#3601)
## What type of PR is this? (check all applicable)
<!-- Please leave only what's applicable -->

- [x] Refactor
- [x] Bug Fix

## Description

This basically makes sure that when import the redash package we don't accidentally trigger import-time side-effects such as requiring Redis.

Refs #3569 and #3466.
2019-04-18 18:39:38 +02:00
Arik Fraimovich
97492d7aa0 Fix: update default CSP policy to allow KB iframe. (#3714)
## What type of PR is this? (check all applicable)

- [x] Bug Fix

## Description

Without this change the Help Drawer couldn't load content anymore.

## Related Tickets & Documents

#3404
2019-04-17 10:13:45 +02:00
Ran Byron
18761cf07b Dashboard auto-saving (#3653) 2019-04-17 10:07:48 +03:00
Arik Fraimovich
9b3dd82ec0 Sync PyAthena/botocore versions with requirements_all_ds.txt. (#3713) 2019-04-17 09:43:33 +03:00
Arik Fraimovich
e485c964c5 Add rate limits to user creation/update (#3709)
* Add rate limits for user resources.

* Disable rate limiting in tests (except for tests that need it).

* Update strings to unicode to avoid SQLA warnings
2019-04-15 13:58:30 +03:00
Omer Lachish
5b30d081d7 Dynamic query time limits (#3702)
* extract time limit decisions to a dynamic settings function

* introduce environment variable for scheduled query time limits

* pass in org_id to query_time_limit

* add an interaction test that verifies that time limits are applied to
jobs

* really important newlines according to CodeClimate
2019-04-15 12:06:37 +03:00
Omer Lachish
b96094b878 add a test to make sure reset password form are displayed correctly (#3678) 2019-04-14 14:59:21 +03:00
Gabriel Dutra
1f43537304 Update CardsList to use visual-card styling (#3679)
* Update CardsList to use old markup

* CR
2019-04-14 13:10:40 +03:00
Aidarbek Suleimenov
01e64db0dc Fix Decimal128 error (#3684) 2019-04-14 13:07:12 +03:00
Arik Fraimovich
3ab46bb39a BigQuery: support for NaN values. (#3701) 2019-04-14 11:23:14 +03:00
Jakdaw
af168c69b9 Fix search ordered by best match (#3706)
* Don't force an order by created date - any usecases that want
this already request it explicitly and it breaks the search
function that wants to order by best match.

* Fix the logic so that we fall back to a default search order when there's
no search term, rather than when there is one and we should use the
best-match ordering.

* Remove accidentially added blank line
2019-04-14 10:44:28 +03:00
Jakdaw
63e052c3a3 Support LDAP servers where one doesn't first have to bind to the LDAP server with a username/password (#3002)
* Support LDAP servers where one doesn't first have to bind to the LDAP server with a username/password

* Address code climate things
2019-04-14 10:36:41 +03:00
Ran Byron
563e34a816 Fixed public dashboard footer (#3703) 2019-04-14 10:19:12 +03:00
Gabriel Dutra
1524d06149 Percy: Introduce hide-in-percy and hide diff problematic elements (#3689) 2019-04-11 11:49:39 -03:00
Ran Byron
e9711a0b9c Bye footer (#3697) 2019-04-10 11:42:36 +03:00
Omer Lachish
9fcf510ffd add package.json after including qs (#3695) 2019-04-10 11:25:56 +03:00
Ran Byron
70227f2e43 Changed viz embed download menu to drop up (#3696) 2019-04-10 11:02:03 +03:00
Ran Byron
1babd01f38 Bolder markdown in textbox (#3686) 2019-04-09 10:25:03 +03:00
Ran Byron
768bfb3525 Cypress Dashboard Service (#3683) 2019-04-09 08:49:10 +03:00
Ran Byron
fc5a624efb Dashboard one column mode test (#3621) 2019-04-08 07:51:18 +03:00
Omer Lachish
47bf91e150 Fix: support date ranges for parameterized embeds (#3681)
* support date ranges for parameterized embeds

* add qs

* remove hideous implementation and use qs

* get rid of apiKey querystring parameter and introduce query-string
module
2019-04-07 20:34:14 +03:00
Ran Byron
8f4288583e Updated Cypress default timeout values (#3685) 2019-04-07 16:40:06 +03:00
Omer Lachish
595af3bce8 avoid erroring when creating embed links for queries that don't have any parameters (#3680) 2019-04-06 13:49:40 +03:00
HirokiTanaka
dba7efe030 refs https://github.com/getredash/redash/issues/3675 (#3676) 2019-04-04 09:27:07 +03:00
Omer Lachish
1b142b33f1 reduce volatility in embed percy snapshots (#3672) 2019-04-02 13:40:28 +03:00
Gabriel Dutra
13814c752d Add max-width to Notification (#3667) 2019-04-02 11:53:44 +03:00
Omer Lachish
dd477d49ec Sharing embeds with safe parameters (#3495)
* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* use the textless endpoint (/api/queries/:id/results) for pristine
queriest

* Revert "use the textless endpoint (/api/queries/:id/results) for pristine"

This reverts commit cd2cee7738.

* go to textless /api/queries/:id/results by default

* change `run_query`'s signature to accept a ParameterizedQuery instead of
constructing it inside

* raise HTTP 400 when receiving invalid parameter values. Fixes #3394

* support querystring params

* extract coercing of numbers to function, along with a friendlier
implementation

* wire embeds to textless endpoint

* allow users with view_only permissions to execute queries on the
textless endpoint, as it only allows safe queries to run

* enqueue jobs for ApiUsers

* add parameters component for embeds

* include existing parameters in embed code

* fetch correct values for json requests

* remove previous embed parameter code

* rename `id` to `user_id`

* support executing queries using Query api_keys by instantiating an ApiUser that would be able to execute the specific query

* bring back ALLOW_PARAMETERS_IN_EMBEDS (with link on deprecation coming up)

* show deprecation messages for ALLOW_PARAMETERS_IN_EMBEDS. Also, move
other message (email not verified) to use the same mechanism

* add link to forum message on setting deprecation

* rephrase deprecation message

* add link to forum message regarding embed deprecation

* change API to /api/queries/:id/dropdowns/:dropdown_id

* split to 2 different dropdown endpoints and implement the second

* add test cases for /api/queries/:id/dropdowns/:id

* use new /dropdowns endpoint in frontend

* first e2e test for sharing embeds

* Pleasing the CodeClimate overlords

* All glory to CodeClimate

* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* split has_access between normal users and ApiKey users

* remove residues from bad rebase

* allow access to safe queries via api keys

* rename `object` to `obj`

* support both objects and group dicts in `has_access` and `require_access`

* simplify permission tests once `has_access` accepts groups

* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* rename `object` to `obj`

* support both objects and group dicts in `has_access` and `require_access`

* simplify permission tests once `has_access` accepts groups

* fix bad rebase

* send embed parameters through POST data

* no need to log `is_api_key`

* move query fetching by api_key to within the Query model

* fetch user by adding a get_by_id function on the User model

* pass parameters as POST data (fixes test failure introduced by switching
from query string parameters to POST data)

* test the right thing - queries with safe parameters should be embeddable

* introduce cy.clickThrough

* add another Cypress test to make sure unsafe queries cannot be embedded

* serialize Parameters into query string

* set is_api_key as the last parameter to (hopefully) avoid
backward-dependency problems

* Update redash/models/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* attempt to fix empty percy snapshots

* snap percies after DOM is fully loaded
2019-04-02 11:45:38 +03:00
Ran Byron
5decd2624a Fixed wrong width assertion (#3665) 2019-04-01 13:49:24 +03:00
Justin Clift
6f9aee42a7 Update to modern Redis for the docker images (#3640) 2019-04-01 11:21:06 +03:00
Omer Lachish
1333aae7fb Handle dropdown queries which are detached from data source (#3453)
* handle an edge case where dropdown queries are connected to data sources
that no longer exist

* Rethinking it, an empty result set makes no sense and it's better to
throw an error

* remove redundant import
2019-04-01 11:19:52 +03:00
Omer Lachish
33ad89a381 in case of a parameter type mismatch, show the actual message to the user (#3664) 2019-04-01 11:19:18 +03:00
Ran Byron
02a5852072 Widget size and position test (#3628) 2019-03-29 21:47:26 +03:00
Gabriel Dutra
12782e4daf Fix Percy diff due to Api Key secret (#3654) 2019-03-29 07:50:30 -03:00
Levko Kravets
704b78a003 [Feature, Bug fix] Migrate Timer component to React; update TimeAgo component (#3648) 2019-03-28 20:33:05 +02:00
Omer Lachish
ec4f77c8b7 Change has_access and require_access signatures (#3611)
* change has_access and require_access signatures to work with the objects that require access, instead of their groups

* rename `object` to `obj`

* support both objects and group dicts in `has_access` and `require_access`

* simplify permission tests once `has_access` accepts groups
2019-03-28 15:01:06 +02:00
Ran Byron
1871287a1f Fixed notification alignment (#3645) 2019-03-28 10:08:13 +02:00
Gabriel Dutra
f9cc230227 Migrate Data Sources and Alert Destinations pages to React (#3470)
* Migrate TypePicker to React

* Migrate DataSources and Destinations List

* Fixes to DestinationsList

* Add CreateDataSource (testing with Steps)

* Render the form after type selection

* Add HELP_LINKS to CreateDataSource

* Add Done behavior

* Add scrollToTop to CreateDataSource

* TypePicker styling adjusts

* Add CreateDestination

* Update resouce gets to componentDidMount

* Create EditForm components

* Migrate Edit pages

* Remove angular logic from DynamicForm

* Add actions to EditPages

* TypePicker title style adjustments

* Add Empty and Loading state

* UX improvements

* Review changes

* Styling updates on TypePicker, forms background fix

* Add blank line removed by mistaken

* Reorganize TypePicker

* Hide Search on List Pages

* Fix spacing in Forms

* Update Create Data Source and Destination to be a Dialog

* Remove max-height from the form

* Fix DynamicForm import in CreateUserDialog

* Route /new to open CreateSourceDialog

* Add HelpTrigger + refine styling and Edit Pages

* Remove help links from data source resource

* Update Cypress specs

* TypePicker -> CardsList

* Remove old TypePicker styling and change CardsList styling to less

* Test if Percy shows Dialogs

* Personal review cleanup

* CR

* Remove unnecessary query on dialog success

* Handle resource errors in Edit Pages

* Add CreateDestination policy

* Add placeholder and separator to the Name field

* Use cy.click instead of cy.wait

* Revert "Use cy.click instead of cy.wait" (Didn't work)

This reverts commit 77285d9fa3.

* Align help trigger on the right and rename Steps

* Refine behavior for long names

* Update toastr calls to use notification instead

* Redirect to target after creation

* Remove autoFocus on DynamicForm for Edit Pages

* Add eslint-disable for cy.wait
2019-03-28 10:06:46 +02:00
Ran Byron
fe4a7b65e7 Widget resize tests (#3620) 2019-03-28 05:55:03 +02:00
Allen Short
b3819de878 Treat repeated BigQuery fields as arrays (#3480)
* Treat repeated BigQuery fields as arrays

* handle untransformed field types and None
2019-03-27 22:00:09 +02:00
Gabriel Dutra
2699d24441 Manage user groups in UserEdit (#3450) 2019-03-27 16:29:48 -03:00
Jannis Leidel
1933dee8ca Fix Celery worker --max-tasks-per-child for Celery 4.x. (#3625)
* Fix Celery worker CLI parameter name that was changed in Celery 4.x.

* Set Celery worker --max-memory-per-child to 1/4th of total system memory.

* Review fixes.

* Review fixes.
2019-03-27 21:08:20 +02:00
Gabriel Dutra
375e61f263 Add error message when destination name already exists (#3597)
* Return 400 when destination name already exists

* Remove whitespace

* Unicode 1

Co-Authored-By: gabrieldutra <nesk.frz@gmail.com>

* Unicode 2

Co-Authored-By: gabrieldutra <nesk.frz@gmail.com>
2019-03-27 18:09:56 +02:00
shinsuke-nara
872d0ca5e6 Show accessible tables only in New Query view for PostgreSQL (#3599)
* Show accessible tables only.

* Get table information from information_schema.columns.

* Union old query.
2019-03-27 18:08:38 +02:00
Justin Clift
973ad565cd Update PostgreSQL version to always use latest in the 9.5 series (#3639) 2019-03-27 18:06:40 +02:00
ialeinikov
7a7fdf9c99 allowing to specify a custom work group for AWS Athena queries (#3592)
* allowing to specify a custom work group for AWS Athena queries

* Fixing title + adding correct position in the UI
2019-03-27 17:58:48 +02:00
Omer Lachish
49ffaae3ec Fix email shows as unverified when no email server is configured (#3613)
* check that e-mail server is configured before marking the email address
as not verified and sending out a verification e-mail

* use helper method in `invite_user`

* move email_server_configured helper to settings

* add test to verify that email addresses arent marked as unverified if
there's no e-mail server to verify them

* simplify a couple of tests with patch

* combine conditions into single variable

* Booleans, gotta love 'em
2019-03-27 17:57:51 +02:00
Allen Short
d5494cff08 Fail query task properly even if error message is empty (#3499) 2019-03-27 17:50:39 +02:00
Byunghwa Yun
71afc99ec3 Add phoenix query runner. (#3153)
* Add phoenix query runner.

* Improved error handling.
2019-03-27 17:48:49 +02:00
Ran Byron
b5d97e25b7 Browser support config (#3609)
* Browser support config

* Removed some offending code

* Added unsupported html page and redirect for IE

* Typo in regex

* Made html page static

* Added redirect script to multi_org

* Moved static html page to client/app
2019-03-27 17:47:12 +02:00
Jannis Leidel
6c26aa7a99 Render LDAP and remote auth login links correctly when multi org mode is enabled. (#3530)
* Make LDAP auth handler org scoped.

* Render LDAP and remote auth login links correctly when multi org mode is enabled.
2019-03-27 17:26:00 +02:00
Jannis Leidel
712fc63f93 Use flask-talisman for handling backend response headers (#3404)
* Normalize Flask initialization API use.

* Use Flask-Talisman.

* Enable HSTS when HTTPS is enforced.

* More details about how CSP is formatted and write CSP directives as a string.

* Use CSP frame-ancestors directive and not X-Frame-Options for embedable endpoints.

* Add link to flask-talisman docs.

* set remember_token cookie to be HTTP-Only and Secure

* Reorganize secret key configuration to be forward thinking and backward compatible.
2019-03-27 17:24:15 +02:00
Jannis Leidel
77c53130a4 Fix a few more inconsistencies when loading and dumping JSON. (#3626)
* Fix a few more inconsistencies when loading and dumping JSON.

Refs #2807. Original work in: #2817

These change have been added since c2429e92d2.

* Review fixes.
2019-03-27 17:14:32 +02:00
Levko Kravets
73c8e3096d [Feature] Migrate Admin pages to React (#3568) 2019-03-27 09:48:50 +02:00
Ran Byron
8230098f50 Migrated Textbox edit dialog to React (#3632) 2019-03-26 19:23:00 +02:00
Arik Fraimovich
fd42091f87 Add Lint step to CircleCI (#3642) 2019-03-26 16:40:26 +02:00
Ran Byron
ec4b36b178 Cypress eslint fixes and config (#3636) 2019-03-25 22:14:51 +02:00
Ran Byron
0995dfbf43 Widget drag tests (#3598) 2019-03-25 19:16:41 +02:00
Gabriel Dutra
70d4c724c2 Add env var to skip Flask rate limits (#3622) 2019-03-25 13:15:20 -03:00
Justin Clift
1d7378f84b Update docker compose with the stable Redash v7 tag (#3638) 2019-03-25 14:50:40 +02:00
Gabriel Dutra
b4a4ee212e Replace toastr with Ant Notification (#3610) 2019-03-24 19:08:35 -03:00
Gabriel Dutra
25910e7655 Move cypress to client folder (#3566) 2019-03-24 11:24:59 -03:00
Jannis Leidel
8e5ba804f6 Fix a DeprecationWarning about the Flask.static_path parameter. (#3624)
Code: d1d82ca8ce/flask/app.py (L347-L351)
2019-03-24 15:57:35 +02:00
Arik Fraimovich
173f9ba7e8 Fix: triggers not created for queries.search_vector (#3631) 2019-03-24 15:35:59 +02:00
Arik Fraimovich
e712c19bbe E2E test for query search (#3633)
* Apply prettier to app-header.html.
* Add: E2E test for query search
2019-03-24 15:20:08 +02:00
Ran Byron
aea3c9dbaa Fix for time based mongodb test (#3630) 2019-03-24 11:29:44 +02:00
Ran Byron
2f8aade697 Added a skipped test for issue #3202 (#3616) 2019-03-23 22:02:39 +02:00
Ran Byron
a7b930a422 Widget tests - add, remove, auto height (#3590) 2019-03-23 14:27:43 +02:00
Levko Kravets
4e69b73b0f [Bug fix] Query Results fails to use query which has double quotes in column names (#3618) 2019-03-21 19:39:22 +02:00
Omer Lachish
c47dd05095 Nest query ACL to dropdowns (#3544)
* change API to /api/queries/:id/dropdowns/:dropdown_id

* extract  property

* split to 2 different dropdown endpoints and implement the second

* make access control optional for dropdowns (assuming it is verified at a
different level)

* add test cases for /api/queries/:id/dropdowns/:id

* use new /dropdowns endpoint in frontend

* require access to dropdown queries when creating or updating parent
queries

* rename Query resource dropdown endpoints

* check access to dropdown query associations in one fugly query

* move ParameterizedQuery to models folder

* add dropdown association tests to query creation

* move group by query ids query into models.Query

* use bound parameters for groups query

* format groups query

* use new associatedDropdowns endpoint in dashboards

* pass down parameter and let it return dropdown options. Go Levko!

* change API to /api/queries/:id/dropdowns/:dropdown_id

* split to 2 different dropdown endpoints and implement the second

* use new /dropdowns endpoint in frontend

* pass down parameter and let it return dropdown options. Go Levko!

* fix bad rebase

* add comment to clarify the purpose of checking the queryId
2019-03-20 09:16:10 +02:00
Arik Fraimovich
15c815fb5e Remove node_modules before creating tarball (#3603)
* Update pack

* Remove node_modules before packing
2019-03-18 12:16:31 +02:00
Arik Fraimovich
9de676acee Fix: make sure that only the top level node_modules directory is excluded (#3600)
* Fix: make sure that only the top level node_modules directory is excluded

* Remove old unused packing script
2019-03-18 11:13:42 +02:00
Arik Fraimovich
ff0967f0d8 Update v7 CHANGELOG and version (#3595) 2019-03-17 22:05:55 +02:00
Ran Byron
e5d082b9b3 Textbox testing - add, remove, edit (#3589) 2019-03-17 18:26:01 +02:00
Arik Fraimovich
93aa6b5b80 Fix: accept integer values in dropdowns. (#3596) 2019-03-17 15:56:23 +02:00
Gabriel Dutra
1f74c0bad5 [Bug fix] Update user list when an user is created (#3594) 2019-03-15 20:56:10 +02:00
Feng
a8cb70910e [Codebase improvement] Reuse handlers base require_fields (#3577) 2019-03-15 13:21:48 +02:00
Bernhard Mäser
852636f07c update to latest stable version (#3588) 2019-03-14 18:13:18 +02:00
Arik Fraimovich
cf5c2c5ba2 Revert "Add SAML scheme override env var (#2947)" (#3587)
This reverts commit 4768fd081e.
2019-03-14 13:54:14 +02:00
Levko Kravets
10f4b99cd3 Widget title link not updated when parameter value changes (#3586) 2019-03-14 11:20:28 +02:00
Jannis Leidel
8456bbf762 Revert "Schema Viewer Drawer (#3291)" (#3585)
This reverts commit cb4d81d6ad.
2019-03-14 10:51:30 +02:00
Ran Byron
ab39242cc4 Cypress test - dashboard create/archive (#3565) 2019-03-14 08:08:56 +02:00
Ran Byron
b799ab6f0b Added alt+enter key binding (#3479) 2019-03-14 08:06:39 +02:00
Marina Samuel
cb4d81d6ad Schema Viewer Drawer (#3291)
* Process extra column metadata for a few sql-based data sources.

* Add Table and Column metadata tables.

* Periodically update table and column schema tables in a celery task.

* Fetching schema returns data from table and column metadata tables.

* Add tests for backend changes.

* Front-end shows extra table metadata and uses new schema response.

* Delete datasource schema data when deleting a data source.

* Process and store data source schema when a data source is first created or after a migration.

* Tables should have a unique name per datasource.

* Addressing review comments.

* Update migration file for mixins.

* Appease PEP8

* Upgrade migration file for rebase.

* Cascade delete.

* Adding org_id

* Remove redundant column and table prefixes.

* Non-existing tables and columns should be filtered out on the server side not client side.

* Fetching table samples should be optional and should happen in a separate task per table.

* Allow users to force a schema refresh.

* Use updated_at to help prune old schema metadata periodically.

* Using settings.SCHEMAS_REFRESH_QUEUE
2019-03-13 18:08:00 +01:00
Ran Byron
adf935b1df Fix for parameter mapping bug #3581 (#3582)
* Fix for parameter mapping bug #3581

* Must run original snapshot with original dashboard params
2019-03-13 16:41:03 +02:00
Arik Fraimovich
f1cb0101b9 👋 goodbye, similar-code false positives. (#3578) 2019-03-13 11:04:02 +01:00
Leo Palmer Sunmo
4768fd081e Add SAML scheme override env var (#2947)
* Add SAML scheme override env var

* Make it pretty, please the linter
2019-03-13 11:39:02 +02:00
Levko Kravets
4a8d9a7fb0 Fork query does not fork tables but instead adds default table (#3580)
* getredash/redash#3572 Fork query does not fork tables but instead adds default table

* Fix code style

* CR1
2019-03-13 11:29:54 +02:00
Arik Fraimovich
ba62b46a45 Append "UTC" to timestamp on embeds (in print view) (#3574)
To communicate what timezone the timestamp is.
2019-03-13 08:26:12 +02:00
Levko Kravets
fbf4dae001 Fix webpack config to work with symlinks (#3573) 2019-03-12 21:24:21 +02:00
Omer Lachish
5943bf04d5 change the order of configuration of the Elasticsearch data source to (#3571)
make sense
2019-03-12 09:42:17 +02:00
Ran Byron
93ec19b93f Prevent blank edit-in-place value (#3557) 2019-03-11 23:24:38 +02:00
Omer Lachish
63d3f22c93 Convert all dropdown values to strings to support parameter lookup (#3563)
* convert all dropdown values to strings to support parameter lookup.
solves #3562

* unicode all the way down

* show correct default values in QueryBasedParameterInput by converting
them to strings
2019-03-11 17:54:56 +02:00
Gabriel Dutra
685c7713e4 Update Amazon Elasticsearch Service image (#3567) 2019-03-11 06:43:03 +02:00
Levko Kravets
4cfa26a55e [Bug fix] Handle errors on Group members, Group datasources and User profile pages (#3564) 2019-03-10 19:34:54 +02:00
Ran Byron
5dc74e1ef7 npm audit fixes (#3561) 2019-03-10 13:35:27 +02:00
Arik Fraimovich
b703f7a3c4 Create weekly-digest.yml 2019-03-10 11:39:13 +02:00
Arik Fraimovich
26f0ce0749 New Celery/Queries Execution Status API (#3057)
* Remove QueryTaskTracker

* Remove scheudling of cleanup_tasks

* Add Celery introspection tools

* First iteration of updating the admin API.

* Show more details

* Add option to skip building npm in Dockerfile

* Show started_at

* update the refresh schedule, as it's too fast

* Update Celery monitor to report on all active tasks.

* Update task parsing for new format

* WIP: improved celery status screen

* Fix property name.

* Update counters

* Update tab name

* Update counters names

* Move component to its own file and fix lint issues

* Add migratin to remove Redis keys

* Improve columns layout

* Remove skip_npm_build arg as it's not used anymore.

* Convert query from SQL to Python

* Simplify column definition.

* Show alert on error.
2019-03-10 11:19:31 +02:00
Levko Kravets
12d2a04946 Download Query Result links: use query name for downloaded filename (#3559)
* getredash/redash#3554 Download Query Result links: use query name for downloaded filename

* CR1
2019-03-10 10:32:08 +02:00
koooge
5501f3e61c Upgrade jest & babel (#3405) 2019-03-10 09:29:44 +02:00
Arik Fraimovich
61f143dfd3 Snowflake: add support for regions and enable by default (#3550)
* Bring back Snowflake from its exile.

* Snowflake: add support for regions.
2019-03-07 23:40:24 +02:00
Arik Fraimovich
8737e8032e Add: Docker entrypoint to do Celery healthchecks. (#3548) 2019-03-07 22:32:27 +02:00
Arik Fraimovich
dfa48caf63 Fix: order dashboard favorites (#3552)
## What type of PR is this? (check all applicable)

- [x] Refactor
- [x] Bug Fix

## Description

Move favorites list handlers to their relevant modules (`redash.handlers.queries` and `redash.handlers.dashboards`) and applied `order_results` to dashboards.
2019-03-07 15:30:11 +01:00
Arik Fraimovich
e4c933af55 Update PULL_REQUEST_TEMPLATE.md (#3549) 2019-03-07 14:35:27 +02:00
Levko Kravets
be1bd2863f [Bug fix] Wrong behavior when clicking table rows on list pages (#3540) 2019-03-07 13:59:39 +02:00
Ran Byron
507ea61151 Fix long tag labels breaking table layout (#3545) 2019-03-07 11:53:28 +02:00
Arik Fraimovich
4f79c86c0e Pin pymapd version to 0.7.1 (#3543)
Newer versions dropped support for Python 2. Closes #3542.
2019-03-07 09:02:40 +02:00
Ran Byron
160c3c1048 Param fix (#3528)
* Name help text for date range only

* Autofocus on name input

* Form acts on enter key

* Fixed range check

* Fixed startsWith
2019-03-06 10:31:33 +02:00
Jannis Leidel
8eb751f0c3 Remove docker-compose.production.yml in favor of setup/docker-compose.yml. (#3533)
Fix #3251.
2019-03-06 08:49:35 +02:00
Paul Graff
75bc469708 Remove duplicate column information for late-binding views (#3537)
Since the svv_columns system view supports them now https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_COLUMNS.html
2019-03-06 08:41:48 +02:00
Jannis Leidel
21082fbe0e Make the "celery" queue the default instead of "schema" to stay backward-compatible. (#3534)
Fix #3325.
2019-03-06 08:37:54 +02:00
Jannis Leidel
4e7d16b642 Remove Flask-Admin. (#3532) 2019-03-06 08:36:46 +02:00
pieter-venter
b68051d3c5 Add Hangouts Chat as alert destination (#3525)
* Add support for Google Hangouts Chat as alert destination

* Remove redundant imports

* Remove code used for debugging

* Fix pep8 warnings

* Update redash/destinations/hangoutschat.py

Add friendly name by separating type and description

Co-Authored-By: pieter-venter <pieterventer@geotab.com>

* Fix pep8 warnings. Rename image to match desitnation type.

* Show message for unknown alert state in default color
2019-03-05 22:06:25 +02:00
Levko Kravets
bc22797009 [Refactor] Refine New user modal (#3529) 2019-03-05 14:17:59 +02:00
Ran Byron
7a4fe5055d Added UTC display to scheduler dialog (#3517) 2019-03-05 11:54:33 +02:00
Gabriel Dutra
6a75ac4a57 Migrate User Pages to React (#3506)
* Create React version for the EmailSettingsWarning

* Migrate the Create User Page

* Migrate UserProfile to React

* Add /users/me to the routes (Percy ftw)

* Fix UserShow test spec

* Remove Error Messages component

* Show invitation link if email server not setup (#3519)

* return invite link to client if e-mail server is not set up

* add a couple of tests to make sure invite links are only returned when neccessary

* show invite link when e-mail is not configured

* remove "an e-mail has been sent" when there's no e-mail configured

* return invite_url in re-invites as well. Also refactor to reuse the code.

* Use CreateUserDialog instead of Page

* Render invite link on Resend Invitation click

* Add email validation to DynamicForm

* Fix EmailWarning position + update user list with user creation success

* Fix console error on UserProfile

* Redirect from /users/new  + rename createUser -> showCreateUserDialog

* Use alert instead of toastr for user creation errors

* Remove logic from CreateUserDialog

* CR

* Use Promise.reject instead of throw to avoid console error
2019-03-04 18:26:51 -03:00
Ran Byron
34da15fd6a Migrated AddTextboxDialog to AntD (#3524) 2019-03-04 21:51:48 +02:00
Ran Byron
dd0fab7275 Moved widget and dashboard save logic out of dialog (#3522) 2019-03-04 16:31:31 +02:00
Gabriel Dutra
ade3cc72a7 Fix eslint error on AlertsList (#3518) 2019-03-03 00:28:17 +02:00
Omer Lachish
02e82a7658 Fix verification_email endpoint when in MULTI_ORG mode (#3502)
* append slug to /verification_email endpoint when in MULTI_ORG mode

* Revert "append slug to /verification_email endpoint when in MULTI_ORG mode"

This reverts commit 817fb034c4.

* fix for /email_verification in MULTI_ORG setups
2019-03-02 14:12:41 +02:00
Ran Byron
6e3b9c2977 Fixed navbar responsiveness (#3510)
* Fixed navbar responsiveness

* Adjustments so that logo should never hide
2019-02-28 16:53:42 +02:00
Ran Byron
34e03b01bb Migrated query edit/add param dialog to React/AntD/Hooks (#3488) 2019-02-28 16:31:34 +02:00
Ran Byron
dab35acd2c QuerySelector in Alert page (#3501) 2019-02-28 15:56:12 +02:00
Arik Fraimovich
a93741e64b CircleCI build improvements (#3511)
* Make sure master builds tarball/docker image only when backend and frontend tests pass.

* Build a redash/preview image alongside redash/redash image.

* Fix version variable
2019-02-28 15:23:47 +02:00
Ran Byron
549f878c98 Added <QuerySelector /> component (#3494)
* Updated npm to support react hooks

* Added <QuerySelector />

* Changed selectQuery to also clear, completed 2->3 dots in msg, avoiding setSearching on stale rejection.

* Removed unused highlight lib
2019-02-28 15:07:57 +02:00
Gabriel Dutra
194f45263b [Feature] Migrate Alerts List Page to React (#3505) 2019-02-28 12:33:03 +02:00
G. Tsirkas
83668a6840 LDAP Authentication. Create two envars REDASH_LDAP_USE_SSL and REDASH_LDAP_AUTH_BIND (#2776)
* Add two new envars. REDASH_LDAP_USE_SSL which determines if the connection will use ssl and LDAP_AUTH_BIND which determines if the binding is SIMPLE or ANONYMOUS

* Add use_ssl paremeter

* Rename LDAP_AUTH_BIND to LDAP_AUTH_METHOD and modify LDAP_SSL using parse_boolean

* Fix typo

* import ANONYMOUS constant from ldap3

* Add NTLM authentication

* Add comment to authentication method envar
2019-02-28 10:05:41 +02:00
Toshimitsu Takahashi
c9a4f07a7a Support AWS IAM profile for Amazon Elasticsearch (#3005) 2019-02-28 09:57:33 +02:00
Omer Lachish
e9c88ea176 Verify address when users change their e-mail (#3504)
* re-verify e-mail address on change

* send verification e-mail to the new address
2019-02-27 12:17:20 +02:00
ialeinikov
fbaded4548 adding gevent worker in requirements.txt, adding some gunicorn config… (#3333)
* adding gevent worker in requirements.txt, adding some gunicorn configurable parameters with defaults

* reverting the change as it's going to be set via env variable(s)
2019-02-27 11:15:31 +02:00
Omer Lachish
570e8d9f23 set invitation as not-pending in render_token_login_page only when (#3500)
handling invites (as opposed to password reset links)
2019-02-27 09:06:41 +02:00
Omer Lachish
0d76c036cb Be more permissive when parameters are safe (#3383)
* use the textless endpoint (/api/queries/:id/results) for pristine
queriest

* reverse conditional. not not is making me the headaches.

* add ParameterizedQuery#is_safe with an inital naive implementation which
treats any query with a text parameter as not safe. This will be
remedied later when DB drivers will handle these parameters.

* allow getting new query results even if user has only view permissions
to the data source (given that the query is safe)

* fix lint error - getDerivedStateFromProps should be placed after state

* Revert "use the textless endpoint (/api/queries/:id/results) for pristine"

This reverts commit cd2cee7738.

* move execution preparation to a different function, which will be soon
reused

* go to textless /api/queries/:id/results by default

* let the query view decide if text or textless endpoint is needed

* allow safe queries to be executed in the UI even if the user has no
permission to execute and create new query results

* change `run_query`'s signature to accept a ParameterizedQuery instead of
constructing it inside

* use dict#get instead of a None guard

* use ParameterizedQuery in queries handler as well

* test that /queries/:id/results allows execution of safe queries even if
user has view_only permissions

* lint

* raise HTTP 400 when receiving invalid parameter values. Fixes #3394

* remove unused methods

* avoid cyclic imports by importing only when needed

* verify that a ParameterizedQuery without any parameters is considered
safe

* introduce query.parameter_schema

* encapsulate ParameterizedQuery creation inside Query
2019-02-26 20:55:01 +02:00
Gabriel Dutra
138c55cf54 Fix DynamicForm ignoring default value for checkboxes (#3487) 2019-02-26 15:10:14 +02:00
Gabriel Dutra
60cd8812a9 Update Percy token (#3492) 2019-02-25 21:22:46 +02:00
Arik Fraimovich
5c5bfbdbbe Make sure Flask app created in Celery's worker process (#3465)
* Make sure Flask app created in worker process

* Add reference to GitHub issue
2019-02-25 19:11:03 +02:00
Sergei Beregov
75c34bf18d Add custom JSON encoder for PostgreSQL (#3442)
To handle columns with [range types][1] and display them as a
string custom JSON encoder for PostgreSQL was added.

Merging this PR will fix issue #1764

[1]:https://www.postgresql.org/docs/9.3/rangetypes.html
2019-02-25 17:52:45 +02:00
Arik Fraimovich
b56cc1cd16 Pin SQLAlchemy-Utils version (#3490)
Pin the version of SQLAlchemy-Utils following the discussion in #2970.
2019-02-25 11:22:48 +01:00
Wei
1a357df9b3 Fix prometheus query runner: get_schema and query range (#3471) 2019-02-25 11:40:35 +02:00
Yoshiken
d36e5acaea Fix update logo (#3489) 2019-02-25 10:12:02 +02:00
Arik Fraimovich
f4f34d02fb Create PULL_REQUEST_TEMPLATE.md (#3485) 2019-02-25 10:11:21 +02:00
Allen Short
3fdd3080c1 Use series name as pie chart label (#3484)
It was unconditionally using the column name; this uses the series name instead
if specified in the chart editor.
2019-02-25 10:10:27 +02:00
taminif
5d525b80b6 fix broken link in CONTRIBUTING.md (#3483) 2019-02-22 14:28:13 -03:00
Levko Kravets
5e5b0d69d8 [Feature, Tech debt] Improve list pages layout (#3482) 2019-02-22 17:26:29 +02:00
Levko Kravets
33b8bd27eb [Feature] Migrate Group List and Details pages to React (#3411) 2019-02-22 14:47:48 +02:00
Subhi Al Hasan
8679b8756e Cleaner approach for _is_collection_a_view (#3113)
* Fix collection fields retreival bug when Views are present in MongoDB

* fixing _is_collection_a_view function

* Update redash/query_runner/mongodb.py

Co-Authored-By: jodevsa <jodevsa@gmail.com>

* using options() instead of try/except on collstats  to detect if a collection  is a view
2019-02-21 23:39:36 +02:00
Omer Lachish
2a37cb31d9 Fix max-age issues on textless endpoint (#3477)
* max_age should default to -1

* pass maxAge along to `execute`
2019-02-21 16:02:06 +02:00
Ran Byron
4ad303b358 Fix some flex layout issue (#3476) 2019-02-21 14:21:54 +02:00
MURAOKA Taro
8fe1d33068 monitor "schemas" queue to run refresh_schema (#3459)
* monitor "schemas" queue to run refresh_schema

`refresh_schema` tasks won't run because "schemas" queue isn't consumed
with default settings.
and it cause leaking redis storage, a "schemas" list is growing with time.

this PR fix it, adds "schemas" queue to monitor by celery.

* use scheduled_worker for "schemas" queue

instead of "adhoc_worker"
2019-02-21 12:06:25 +02:00
Arik Fraimovich
4999ab5de7 Provide default value for .pop to avoid KeyError exception (#3474) 2019-02-21 11:17:07 +02:00
Ran Byron
8b19f16430 Help trigger dynamic component (#3472) 2019-02-20 17:55:35 +02:00
Omer Lachish
a17eb14cdf support e-mail verification for multi org setups (#3468) 2019-02-20 13:45:09 +02:00
Omer Lachish
1ad0fa6a9b avoid Flask debug error message about strict slashes (#3469) 2019-02-20 13:19:06 +02:00
Arik Fraimovich
77dcc80522 Fix: ParameterizedQuery: support for upper cases column names. (#3461)
* Fix: ParameterizedQuery: support for upper cases column names.

* Fix test name
2019-02-20 12:08:38 +02:00
Arik Fraimovich
fe10b06928 Fix: JS Map needs a set call rather than assignment (#3464) 2019-02-20 12:07:46 +02:00
Arik Fraimovich
e35f2b8f51 Fix: when max_age is None the handler fails (#3462) 2019-02-19 20:47:29 +02:00
Omer Lachish
0bca2d8920 when working with a schema, fail in the case that there are parameters (#3452)
which are not part of the schema
2019-02-19 20:46:30 +02:00
Arik Fraimovich
f421119f9d Remove options NullPool does not support (#3460) 2019-02-19 16:04:00 +02:00
Arik Fraimovich
ebef0efe06 Fix: timedelta values were not JSON serialized properly (#3463)
.
2019-02-19 14:27:37 +01:00
Ran Byron
8fc2ecf55c [Bug fix] Widget oblivious to updated parameter values (#3445) 2019-02-18 22:55:46 +02:00
Ran Byron
3147a0bd98 Version data - footer -> header menu (#3458) 2019-02-18 22:15:51 +02:00
Gabriel Dutra
2c705712fc Fixes to Percy (#3440)
* Add check for repository url

* Use CIRCLE_REPOSITORY_URL directly

* Change percy waiting to be with resources instead of time

* Add data sources types resource to Edit Data Source + eslint fixes

* Separate Page Screenshots in different spec files
2019-02-18 16:30:48 -03:00
Levko Kravets
d483785098 [Codebase improvement] Refine ItemsList base component (previously LiveItemsList) (#3415) 2019-02-18 20:48:26 +02:00
Ran Byron
298fe6a779 HelpTrigger in header (#3457)
* Moved component from services->components

* Added help trigger to header

* Reverted tooltip-anchor swap

* Moved trigger location in html (to mirror saas)

* Removed white space

* Changed tooltip text to “Help”
2019-02-18 19:52:10 +02:00
Arik Fraimovich
f07e613631 Fix: ScheduleDialog won't render for "30 days" interval with no time value (#3447) 2019-02-17 15:12:07 +02:00
Arik Fraimovich
60472e2fe0 Add support for Amazon ES service with IAM authentication (#3446)
* Add support for Amazon ES service with IAM authentication

* Add required dependency.
2019-02-17 15:11:40 +02:00
Ran Byron
81c950407d HelpTrigger to open in drawer (#3436)
* HelpTrigger to open in drawer

* Fixed “typo”

* Simplified version - removed postMessage

* Changed some wording
2019-02-17 15:11:16 +02:00
Arik Fraimovich
a34269cc7d Change: encrypt data source options. 🔓 (#2970)
* Change: encrypt data source options
* Implement migration
2019-02-17 13:54:19 +02:00
Omer Lachish
a8f74a1078 remove the word "type" from error message, as enum out-of-range errors (#3449)
have nothing to do with types.
2019-02-17 13:42:44 +02:00
Arik Fraimovich
58a53e3470 Fix: remove widgets when deleting a visualization. (#3423)
Closes #3257.
2019-02-17 10:30:23 +02:00
Ran Byron
fba2a35cef [Feature] Sharing disabled if dashboard has query params (#3439) 2019-02-16 17:06:09 +02:00
Gabriel Dutra
b9644b7456 React version of UserEdit (#3354)
* Update DynamicForm export

* Move UserShow to users folder

* Migrate User profile header and create DynamicForm for basic data

* Update UserShow to use UserProfile prop

* Add API Key input

* Add handler to regenerate API Key button

* Handle user profile save

* Add readOnly prop to DynamicForm and begin disabled user behavior

* Add Change Password Modal

* Remove action buttons for disabled users

* Add send password reset behavior

* Add minLength and password comparison to Password Modal

* Resend Invitation button

* Add Convert User Info

* Fix UserShow test

* Some code updates

* Add enable/disable user button

* Add UserPolicy as an idea

* Remove UserPolicy

* Create Edit Profile spec

* Move User profile screenshot to Edit Profile Spec

* Add tests for saving user and changing password errors

* CC is back :) - Fix trailing spaces

* Add test for succesful password update

* A few improvements from code review

* Remove Toggle User button when seeing your own profile

* Create InputWithCopy

* Fix possible errors when network is off and improve Email not sent alert

* Add default response object for $http possible errors

* Changes in UserEdit
- removed onClick from methods name
- regenerate API Key now uses InputWithCopy
- Password title added

* Update UserEdit render behavior and styling
- Password title changed to h5
- change rendering rules for actions
- Password modal is now closed when password is changed
- change DynamicForm readOnly to the fields and add hideSubmitButton

* Create ChangePasswordDialog and update UserEdit

* Fix possible console error

* Remove password match assertion from spec

* Fix typo
2019-02-14 14:08:30 -02:00
swfz
afaedb9062 [Feature] Table visualization: Raise the upper limit of MAX_JSON_SIZE (#3310)
* move constant value to clientConfig
* change name maxJsonSize to tableCellMaxJSONSize
* value from environment. default is 50000
2019-02-13 11:42:40 +02:00
Ran Byron
f2df7170d2 HelpTrigger (#3431)
* Moved to HelpTrigger

* Moved share dialog “Learn more” to HelpTrigger
2019-02-13 10:38:25 +02:00
Arik Fraimovich
d6827e3601 Version update time (#3429)
* Version update time 

* Need more 
2019-02-13 09:51:07 +02:00
Omer Lachish
c028e49bfd send ip and user id to sentry (#3430) 2019-02-13 09:41:41 +02:00
Ran Byron
9b1f277530 [Widget Params] Updated help url and tooltip (#3428) 2019-02-13 09:00:48 +02:00
Ran Byron
901f28a79f Pre-commit hook to run on modified files only (#3410)
* Pre-commit hook to run on  modified files only

* Removed git add, fixed script dup

* Removed pre-push, testing related files only in pre-commit
2019-02-13 08:21:42 +02:00
Levko Kravets
3fed697c37 [Bug fix] Query Parameters: don't save urlPrefix (#3427) 2019-02-12 21:10:53 +02:00
Levko Kravets
d567765a3c [Bug fix] Notifications randomly shown with visible page or not shown with inactive page (#3426) 2019-02-12 20:07:36 +02:00
Ran Byron
4dbc17572a Converted Share modal to Ant (#3424) 2019-02-12 16:11:08 +02:00
Omer Lachish
330c5a85f1 Enable remote debugging with ptvsd (#3419)
* open port 3000 for remote debugging

* add ptvsd

* use port 5678 to avoid changes in VSCode's default config

* attach to ptvsd

* no need to wait for attach

* actually, --debugger seems to be working

* create a new docker entry point for remote debugging

* alternative method to switch to debugging
2019-02-12 09:10:18 +02:00
Levko Kravets
2c1400d323 [Feature] Alternative implementation of dashboard param title editing (#3417) 2019-02-11 17:17:05 +02:00
Arik Fraimovich
cb22764d68 Bug fix] Saving a new query removes reference to last query result (#3421)
* Correctly test if the current query result is for the current query.
* Serialize a new query with its visualizations.
2019-02-11 14:13:01 +02:00
Arik Fraimovich
eee77a1c9b [Bug fix] Show query result footer only when there is a query result. (#3422) 2019-02-11 13:46:18 +02:00
Omer Lachish
71fb1442f1 Upgrade Sentry SDK (#3418)
* replace raven with sentry-sdk

* use sentry-sdk in celery

* use sentry-sdk with flask

* unify Flask and Celery initializations for Sentry

* extract sentry stuff to own module

* it's time for Sentry 0.7.2
2019-02-10 21:56:16 +02:00
Jannis Leidel
23908edc28 Handle InterruptException in Athena query runnner like in the Presto query runner. (#3403) 2019-02-10 13:41:16 +02:00
Ran Byron
df4ca86d35 Added short modal specific styling (#3366) 2019-02-10 13:39:55 +02:00
Omer Lachish
03f040da0e Unify query based dropdown population (#3337)
* stop testing `collect_query_parameters`, it's an implementation detail

* add tests for `missing_query_params`

* rename SQLQuery -> ParameterizedSqlQuery

* rename sql_query.py to parameterized_query.py

* split to parameterized queries and parameterized SQL queries, where
parameterized queries only do templating and parameterized SQL queries
add tree validation on top of it

* move missing parameter detection to ParameterizedQuery

* get rid of some old code

* fix tests

* set syntax to `custom`

* revert the max-age-related refactoring

* 👋 tree validations 😢

* BaseQueryRunner is no longer a factory for ParameterizedQuery, for now

* add an endpoint for running a query by its id and (optional) parameters
without having to provide the query text

* adds parameter schema to ParameterizedQuery

* adds parameter schema validation (currently for strings)

* validate number parameters

* validate date parameters

* validate parameters on POST /api/queries/<id>/results

* validate enum parameters

* validate date range parameters

* validate query-based dropdowns by preprocessing them at the handler
level and converting them to a populated enum

* change _is_date_range to be a tad more succinct

* a single assignment with a `map` is sufficiently explanatory

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/handlers/query_results.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* build error message inside the error

* support all types of numbers as number parameters

* check for permissions when populating query-based dropdowns

* check for access to query before running it

* check for empty rows when populating query-based enums

* don't bother loading query results if user doesn't have access

* 💥 on unexpected parameter types

* parameter schema default is a list, not a dictionary

* fix a totally unrelated typo

* remove redundant null guards

* introduce /dropdown.json endpoint with dummy data

* wire frontend to /dropdown.json

* always return name/value combos from /dropdown.json

* load actual data into /dropdown.json

* pluck correct values for `name` and `value`

* reuse dropdwon plucking logic in QueryResultResource

* simplify _get_dropdown_values

* when doing parameter validation, we only care about the value and not
the display name

* rename dropdown to dropdownOptions

* move dropdown_values to utils/parameterized_query.py

* stop converting queries to enums and encapsulate the work inside
ParameterizedQuery (almost - /dropdown.json would still access the
dropdown_values method)

* re-order arguments by importance

* test query parameter validation

* tests for dropdown_values logic

* remove `.json` suffix to the dropdown endpoint

* allow `BaseResource` to handle JSON stuff

* move _pluck_name_and_value outside its containing method

* case-insensitive lookup when plucking name and value

* separate concerns and simplify test isolation for `dropdown_values`

* pick the default column according to the order specified in the query
result columns attribute

* use `current_org` instead of passing `org`

* test that user has access to the query when calling the /dropdown
endpoint
2019-02-10 13:10:39 +02:00
Levko Kravets
e21bbcc6fe [UI/UX Improvement] Use Ant's Button component on users list page (#3416) 2019-02-08 17:48:48 +02:00
Levko Kravets
23f5dde488 [Codebase Improvement] Refine dialog wrapper and use it for all existing dialogs (#3407) 2019-02-08 10:00:22 +02:00
Ran Byron
29326f3610 [Widget Params] Title edit fixes (#3413) 2019-02-08 08:45:46 +02:00
Ran Byron
593ebde211 Fix: “Add TextBox” dialog not opening (#3414) 2019-02-08 01:01:50 +02:00
Levko Kravets
11507c5e5e Show active and pending users separately (for admins) (#3400) 2019-02-07 20:30:55 +02:00
Jannis Leidel
c49dccf254 Work around a resizing issue. (#3412)
* Work around a resizing issue.

Fix #3353.

* Add comment to remove this when we delete Angular.

Co-Authored-By: jezdez <jannis@leidel.info>
2019-02-07 16:05:39 +02:00
Marina Samuel
029bee18fb Coerce to moment when 'datetime' selected by user. (#3150) 2019-02-07 14:42:30 +01:00
Levko Kravets
ec475e4b7b [Bug fix] Few small bugs on Queries list page (#3402)
* Link to query page
* Sidebar menu item title: `Archive` -> `Archived`
* Whitespaces in empty state block
2019-02-06 00:19:31 +02:00
Levko Kravets
045c171bb4 Refactor TagsControl; fix TagsEditorModal animation (#3399)
* Refactor TagsControl; fix TagsEditorModal animation

* Update tooltip text

Co-Authored-By: kravets-levko <levko.ne@gmail.com>

* Update tooltip text

Co-Authored-By: kravets-levko <levko.ne@gmail.com>

* CR1
2019-02-05 23:29:09 +02:00
Arik Fraimovich
21341132f6 Fix: cohorts get stuck when passing strings instead of numbers. (#3397)
* Fix: cohorts get stuck when passing strings instead of numbers.

Parse the value to get a number.

* Use parseInt for stage

* Remove redundant parseInt
2019-02-05 21:20:17 +02:00
Levko Kravets
ac68fe1a6d Migrate Dashboards/Queries/Users list pages to React (#3381)
* Refine existing implementation of dashboards/queries/users lists and a common base controller

* Migrate common list page controller to React and refactor it's logic

* Migrate Dashboard list page to React

* Migrate Queries list page to React

* Migrate Users list page to React

* Remove react-timeago dependency

* Use composition instead of inheritance

* Refine implementation

* Merge sidebar into single component

* Refine column definitions

* Use simple controller instead of React context

* Refine implementation

* Restore changes from getredash/redash#2888

* Tweak Users list page

* Ability to render dynamically defined components

* Tweak users list page

* User list page for non-admins

* Fix: ItemsTable ignores isAvailable field

* Refine implementation

* Refine implementation

* Implement LiveItemsList as higher order component

* Some fixes

* Move some definitions to a better place

* Some fixes

* Refine components

* Refine UsersList page

* More comments for a god of comments

* Fix wrong tables size on smaller screens

* Tweak tables
2019-02-05 21:13:32 +02:00
Arik Fraimovich
13855934f9 Add YAML support in QueryEditor (#3395) 2019-02-05 20:37:54 +02:00
Ran Byron
5b62883c1c [Widget Params] Switched parameter list to table style (all parts) (#3332)
* [Widget Params] Split title and mapping editing

* [Widget Params] Restyled source editing

* [Widget Params] Switched parameter list to table style

* Displaying different labels and help phrases when changing type
Added link to knowledge base
Fixed issue with existing param default select value
2019-02-05 20:36:15 +02:00
Ran Byron
c9681d55bf Added pre-push hook (#3390) 2019-02-05 16:16:49 +02:00
Arik Fraimovich
7cfea8a6a0 Fix: only login user when it's the current user. (#3396)
Otherwise it would login the admin as the user...
2019-02-05 15:53:51 +02:00
Ran Byron
2011864fdb Fix: Selected item in dropdown unreadable (#3398) 2019-02-05 15:50:31 +02:00
Omer Lachish
8f0cffe424 Use textless endpoint for pristine queries (#3367)
* use the textless endpoint (/api/queries/:id/results) for pristine
queriest

* Revert "use the textless endpoint (/api/queries/:id/results) for pristine"

This reverts commit cd2cee7738.

* move execution preparation to a different function, which will be soon
reused

* go to textless /api/queries/:id/results by default

* let the query view decide if text or textless endpoint is needed

* lint
2019-02-05 12:08:12 +02:00
Ran Byron
3df372434f [Widget Params] Migrated edit params + new widget dialog to Ant Modal (#3387) 2019-02-04 21:00:59 +02:00
Arik Fraimovich
933dd753a8 Make the logic around schedule['until'] easier to read (#3376) 2019-02-03 21:13:27 +02:00
koooge
3992bcda9b Ignore to copy some files onto docker container (#3388)
* Ignore to copy some files onto docker container

Signed-off-by: koooge <koooooge@gmail.com>

* Dockerignore venv/

Signed-off-by: koooge <koooooge@gmail.com>
2019-02-03 20:30:08 +02:00
Jannis Leidel
69e34f048a Add archived queries section to queries list. (#2888)
* Add archived queries section to queries list.

* Refactor route building for list based controllers.

This also fixes the dashboard empty state page.
2019-02-03 14:35:25 +02:00
Omer Lachish
b0a11983fa fix lint error - getDerivedStateFromProps should be placed after state (#3391) 2019-02-03 11:13:04 +02:00
Levko Kravets
807e6aaaa6 Migrate "time ago" components to React (#3385)
* Replace <am-time-ago> (angular-moment) and <rd-timer> with React component

* PropTypes: Moment validation

* Increase polling interval

* Refine component implementation

* Add tooltip with formatted date/time

* Refine component implementation
2019-02-02 18:46:48 +02:00
Levko Kravets
324a1f55cc Merge pull request #3384 from getredash/step-component
EmptyState alternative implementation with a Step component
2019-02-02 18:29:21 +02:00
Levko Kravets
abccff03f7 Fix Add datasource step; EmptyState.icon is optional 2019-02-02 18:12:27 +02:00
Levko Kravets
aa619c453f Merge branch 'master' into step-component 2019-02-02 17:56:11 +02:00
Levko Kravets
10b5c03248 Merge pull request #3389 from getredash/cypress
Fix Cypress E2E failing in CI
2019-02-02 17:14:21 +02:00
Gabriel Dutra
fde52f5d84 Fix Cypress E2E failing in CI 2019-02-02 12:44:33 -02:00
Arik Fraimovich
78df7e7cc9 Last refinements:
* Update Step implementation to be easier to read.
* Set some props to required to remove default value.
2019-02-01 10:16:17 +02:00
Levko Kravets
e314715335 Refine implementation, fix 'shouldShow' condition, fix eslint warnings 2019-02-01 08:37:09 +02:00
Arik Fraimovich
a1cf065ec6 No need to export Step 2019-02-01 00:04:03 +02:00
Arik Fraimovich
f9570556c5 Bring back data sources step for non admins 2019-02-01 00:00:19 +02:00
Arik Fraimovich
9859610e80 Alternative implementation: Step component 2019-01-31 23:55:40 +02:00
Marina Samuel
feab2a040b BigQuery should correctly handle tmp tables that do not have a schema field. (#3382) 2019-01-31 23:20:13 +02:00
Marina Samuel
35c390a2f9 Show disabled unpublished queries for alert and dashboard modals. (#3347) 2019-01-31 19:58:47 +02:00
Ran Byron
ebb96d7ad7 Widget param url prefix p to p_w (#3380) 2019-01-31 17:03:13 +02:00
Levko Kravets
3d58860f6f Merge pull request #3374 from kravets-levko/fix-eslint-errors
Fix eslint errors
2019-01-31 14:33:28 +02:00
Levko Kravets
c223566302 Merge branch 'master' into fix-eslint-errors 2019-01-31 14:04:05 +02:00
Levko Kravets
1439714fa6 Migrate EmptyState component to React (#3373)
* Migrate EmptyState component to React

* CR1

* CR2
2019-01-31 14:02:45 +02:00
Levko Kravets
9c06e9a0bd CR1 2019-01-31 13:50:05 +02:00
Levko Kravets
f98cf7812b Merge branch 'master' into fix-eslint-errors 2019-01-31 11:25:41 +02:00
Levko Kravets
ee0e81e795 Fix eslint errors 2019-01-31 11:21:45 +02:00
Jannis Leidel
bd559b6eeb Fix some incompatible dependencies (#3348)
* Pin requests-oauthlib to work around incompatible deptree.

* Update boto3/botocore to fix incompatible deptree.
2019-01-31 09:50:47 +02:00
Arik Fraimovich
c51191aaf0 Tune CodeClimate's config to make it less annoying (#3370) 2019-01-31 07:34:31 +02:00
Levko Kravets
4a2645d4c6 Merge pull request #3368 from kravets-levko/feature/react-favorites-and-tags-list
React migration: FavoritesControl and TagsList components
2019-01-30 21:09:05 +02:00
Levko Kravets
3ad1709a0a Merge branch 'master' into feature/react-favorites-and-tags-list 2019-01-30 20:29:07 +02:00
Ran Byron
cc135398e2 Fix: static param text value is [object Object] (#3371) 2019-01-30 20:27:59 +02:00
Levko Kravets
067472643d CR3 2019-01-30 20:21:22 +02:00
Levko Kravets
225c98c52a Merge branch 'master' into feature/react-favorites-and-tags-list 2019-01-30 19:23:03 +02:00
Ran Byron
00e991ecfc Fix: Static param value not editable for Text/Number (#3369) 2019-01-30 19:18:57 +02:00
Levko Kravets
a362e97dfe CR2 2019-01-30 18:54:53 +02:00
Levko Kravets
1ea532fe26 CR1 2019-01-30 18:45:06 +02:00
Levko Kravets
9a1c8290e4 Migrate TagsList component to React 2019-01-30 17:40:42 +02:00
Levko Kravets
0d959116d8 Migrate FavoritesControl component to React 2019-01-30 17:22:54 +02:00
Aidarbek Suleimenov
0b9f575dab Fix: make ClickHouse password and username truly optional (#3362)
* clickhouse optional password

* clickhouse URL and user made optional
2019-01-30 11:17:43 +02:00
koooge
13bc910d7c Update CodeClimate configuration format to Version 2 (#3286)
* codeclimate: Update format v2
* codeclimate: Ignore generated files
2019-01-30 10:51:32 +02:00
Ran Byron
9e2f8e2461 Fix: Escape button in tag edit modal (#3363) 2019-01-30 10:43:38 +02:00
Aidarbek Suleimenov
61e7cdaa81 Filename set when /results called directly (#3359)
* filename set when /results called directly

* /results filename changed from query name to id

* Long line shortened
2019-01-29 19:47:42 +02:00
Vladislav Denisov
53aecdc607 yandex_metrica: changed auth from params to headers (#3360) 2019-01-29 18:17:13 +02:00
koooge
2da511021e Frontend lint update (#3253)
* client: Add lint command

Signed-off-by: koooge <koooooge@gmail.com>

* client: Override eslint rule object-curly-newline to keep current style

Signed-off-by: koooge <koooooge@gmail.com>

* client: Override eslint rule no-else-return to keep current style

Signed-off-by: koooge <koooooge@gmail.com>

* client: Fix eslint import/named

Signed-off-by: koooge <koooooge@gmail.com>

* client: eslint-5

Signed-off-by: koooge <koooooge@gmail.com>

* codeclimate: Delete the old setting

Signed-off-by: koooge <koooooge@gmail.com>

* client: Downgrade eslint 5 to 4 in codeclimate

Signed-off-by: koooge <koooooge@gmail.com>

* client: npx install-peerdeps --dev eslint-config-airbnb

Signed-off-by: koooge <koooooge@gmail.com>

* client: Enbale .jsx lint

Signed-off-by: koooge <koooooge@gmail.com>

* client: Set warn

Signed-off-by: koooge <koooooge@gmail.com>

* client: Fix lint indent, implicit-arrow-linebreak, lines-between-class-members

Signed-off-by: koooge <koooooge@gmail.com>

* client: Disable eslint operator-linebreak

Signed-off-by: koooge <koooooge@gmail.com>

* Revert "client: Downgrade eslint 5 to 4 in codeclimate"

This reverts commit f0fb0f0059.

* client: Fix react/button-has-type

Signed-off-by: koooge <koooooge@gmail.com>

* client: Disable an eslint rule react/jsx-one-expression-per-line

Signed-off-by: koooge <koooooge@gmail.com>

* codeclimate: Disable no-multiple-empty-lines

Signed-off-by: koooge <koooooge@gmail.com>

* client: Disable eslint react/destructuring-assignment

Signed-off-by: koooge <koooooge@gmail.com>
2019-01-29 17:25:58 +02:00
Omer Lachish
371b319e92 Server-side parameter validation (#3315)
* stop testing `collect_query_parameters`, it's an implementation detail

* add tests for `missing_query_params`

* rename SQLQuery -> ParameterizedSqlQuery

* rename sql_query.py to parameterized_query.py

* split to parameterized queries and parameterized SQL queries, where
parameterized queries only do templating and parameterized SQL queries
add tree validation on top of it

* move missing parameter detection to ParameterizedQuery

* get rid of some old code

* fix tests

* set syntax to `custom`

* revert the max-age-related refactoring

* 👋 tree validations 😢

* BaseQueryRunner is no longer a factory for ParameterizedQuery, for now

* add an endpoint for running a query by its id and (optional) parameters
without having to provide the query text

* adds parameter schema to ParameterizedQuery

* adds parameter schema validation (currently for strings)

* validate number parameters

* validate date parameters

* validate parameters on POST /api/queries/<id>/results

* validate enum parameters

* validate date range parameters

* validate query-based dropdowns by preprocessing them at the handler
level and converting them to a populated enum

* change _is_date_range to be a tad more succinct

* a single assignment with a `map` is sufficiently explanatory

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/handlers/query_results.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/utils/parameterized_query.py

Co-Authored-By: rauchy <omer@rauchy.net>

* build error message inside the error

* support all types of numbers as number parameters

* check for permissions when populating query-based dropdowns

* check for access to query before running it

* check for empty rows when populating query-based enums

* don't bother loading query results if user doesn't have access

* 💥 on unexpected parameter types

* parameter schema default is a list, not a dictionary

* remove redundant null guards
2019-01-29 09:18:07 +02:00
Arik Fraimovich
ff42ec2cc6 Cypress tests: preset the admin API key to a static value (#3358) 2019-01-28 17:54:24 +02:00
Levko Kravets
7278d4b1fc Refactor Policy and OrganizationStatus services (#3345)
* Refactor Policy and OrganizationStatus services
2019-01-28 16:46:26 +02:00
Levko Kravets
6930106380 getredash/redash#3355 Widget params: Date/Date range value empty in static param input (#3357) 2019-01-28 15:59:49 +02:00
Zsolt Kocsmárszky
c0859642fd WIP: Add dashboard details section for dashboard owner and more (#2934)
Show dashboard creator on dashboard page
2019-01-28 14:20:55 +02:00
Gabriel Dutra
37821ee008 Add Percy Page Screenshots (#3338)
* Add Percy Page Screenshots

* Add missing space
2019-01-28 10:21:42 +02:00
Arik Fraimovich
c31cb01065 Move BigQueryGCE to its own file (#3356)
* Move BigQueryGCE to its own file

* Add missing import
2019-01-28 09:37:47 +02:00
Levko Kravets
1fa58674f3 Refine SettingsMenu service and <settings-screen> component (#3339)
* Refine SettingsMenu service and <settings-screen> component

* Rename services/settingsMenu file to match default export name

* CR1
2019-01-25 17:29:35 +02:00
Jannis Leidel
d204c158a2 Allow query owners to hard-overwrite query content in case of overlap with other user (#2370)
* Hard overwrite on conflict for query owners (re #283)

* Use AlertDialog instead of custom global function.
2019-01-25 11:28:09 +01:00
Levko Kravets
b0b4d5e26a Convert Angular services to CommonJS-style and use them in React components instead of injecting (#3331)
* Refine Auth service: remove dead code and fix race condition
* Export services in CommonJS style
* Refine Users, Events and OfflineListener services
* Refactor Notifications service - rewrite to CommonJS
* Replace Angular service injection with imports in React components
* Fix Footer tests
* Events service -> recordEvent function
* CR1
2019-01-24 16:24:58 +02:00
Levko Kravets
c2c722e12e Migrate PageHeader component to React (#3324)
* Migrate PageHeader component to React

* CR1
2019-01-23 20:10:52 +02:00
Vibhor Kumar
1a61ee3ec0 Add: Uptycs query runner (#3319)
* adding uptycs query_runner in redash

* as per comment from Arik comment fixed the code

* fixed function_name

* fixed some indentation issues

* fixed the indentation issue and taken out customer_id from secret

* fixed the dependency of urllib3

* fixed the indententaton issue

* remved the urllib3 from requirements

* fixed the indentation issues

* added the new square image for Uptycs. Removed unnecessary variable and made ssl as an option

* fixed indentation issue

* Renamed SSL to verify_ssl and also added verify_ssl validate in verify in missing places
2019-01-23 20:07:40 +02:00
Ran Byron
d5afa1815e Filtering out incompatible dashboard params (#3330) 2019-01-23 16:27:49 +02:00
Arik Fraimovich
87667676e6 Remove link to roadmap (#3329)
It's no longer maintained 😢
2019-01-23 13:48:11 +02:00
Arik Fraimovich
bfeb015d71 Add configuration for the Support probot. (#3327) 2019-01-23 13:38:08 +02:00
Omer Lachish
a9c514aaf7 Textless query result endpoint (#3311)
* add an endpoint for running a query by its id and (optional) parameters
without having to provide the query text

* check for access to query before running it
2019-01-23 11:10:04 +02:00
Levko Kravets
7fa6665445 Use Ant's Paginator component; migrate SortIcon to React (#3317) 2019-01-22 17:26:11 +02:00
Miles Maddox
ff6b20b69c support for fetching all JQL results by way of pagination (#3304) 2019-01-22 15:52:13 +02:00
YOSHIDA Katsuhiko
c4bf44677a Fix an error of exporting dict value as Excel (#3323) 2019-01-22 14:43:52 +02:00
Gabriel Dutra
8bdcfb06c5 add wait time before percy data source page snapshot (#3320) 2019-01-22 08:52:23 +02:00
YOSHIDA Katsuhiko
b3643ffbb7 Add regenerate function of user's API key (#3224)
* Add regenerate function of user's API Key

* Update client/app/pages/users/show.js

Co-Authored-By: kyoshidajp <claddvd@gmail.com>

* Remove unused error message

* Refactoring: Inline temp

* Update client/app/pages/users/show.js

Co-Authored-By: kyoshidajp <claddvd@gmail.com>

* Change action event of regenerate user API key
2019-01-20 13:38:20 +02:00
Eric Chang
b91d4bdcaf override default integer/float formatting with environment variables (#3307) 2019-01-20 10:10:36 +02:00
Eric Chang
8bc8e2dadf Allow execution of highlighted subquery (#3288)
* allow execution of selected subquery
* fix query save while highlighted
* don't modify queryText and update UI when running selected
* code style and transition
* Fix query selection execution background color
* make naming consistent
2019-01-20 10:06:17 +02:00
Gabriel Dutra
84d5becf2a Update form text colors (#3296)
* Create ant variables and update form colors

* Remove less extension from imports in ant.less

* Update font-weight for labels

* Add percy snapshot for create data source page

* Remove bold in labels only for checkboxes and radio buttons
2019-01-20 09:41:52 +02:00
Arik Fraimovich
e8120c5f79 Use None as "not scheduled" default value of a query (#3277)
* Use null as the default scheduled value.

* Don't serialize None to json, so we can use SQL is not null predicate.

* Fix warning about unicode in tests

* Handling empty query.schedule in UI (#3283)

* Add migration to convert empty schedules to null and drop the not null contraint.
2019-01-18 11:30:45 +02:00
Levko Kravets
40c6a2621c Merge pull request #3299 from kravets-levko/fix/multifilter-dropdown
Multifilter's dropdown cropped when visualization container is too small
2019-01-17 15:37:26 +02:00
Levko Kravets
06887f6ff1 Multifilter's dropdown cropped when visualization container is too small 2019-01-17 15:14:46 +02:00
Omer Lachish
7847cf7d63 Fix invitation pending for older invitations (#3298)
* explicitly look for a False under details['is_invitation_pending'] and
not any falsey result, to avoid locking out invitations which were
created before the Pending Invitation feature was introduced. Solves https://github.com/getredash/redash/issues/3297

* test that old invites (that do not have any is_invitation_pending flag set in their details object) are still acceptable
2019-01-17 11:56:16 +02:00
Omer Lachish
121a44ef15 Remove tree validations and introduce ParameterizedQuery (#3230) 2019-01-17 10:26:00 +02:00
Gabriel Dutra
823e4ccdd6 Migrate DynamicForm to React (#3209)
* create DynamicForm React component

* Render fields based on target in DynamicForm

* Add missing title property to fields

* Fix style properties in DynamicForm

* Render File fields in DynamicForm

* Use React for middle component instead of Angular

* Functional save button

* Update label style

* Render functional actions

* Handle file inputs

* Update render methods to fix code climate issues

* Fix ant input number showing duplicate arrows

* Update DynamicForm style to be vertical

* Separate imports from antd in DynamicForm

* Add Feedback Icons to DynamicForm

* Change Action props on DynamicForm
- use type and pullRight instead of class prop
- update data sources and destinations pages accordingly

* Remove setDefaults method from DynamicForm fields

* Update antd version

* Remove unnecessary class selectors

* Remove another unnecessary class selector
2019-01-15 14:23:33 +02:00
Levko Kravets
0c45d69662 Dashboard Parameters (#2756)
* getredash/redash#2641 Step 1: split Add Widget/Add Textbox buttons

* Convert Add widget/textbox dialogs to React components

* getredash/redash#2641 Step 2: Implement new dashboard parameters logic

* Resolve conflicts and fix build errors

* getredash/redash#2641 Refactoring and improve code quality

* Add Edit parameter mappings dialog to the widget

* getredash/redash#2641 Changes after code review

* Use Ant's Select component instead on <select> tags

* Fix Antd imports

* Fix Antd imports

* Fix Cannot read property 'getParametersDefs' of undefined

* Fix widgets static params bugs (don't show input, don't init from URL)

* Minor UI/UX fixes
2019-01-15 13:14:54 +02:00
Gabriel Dutra
df23842c57 Separate Bootstrap/Ant styling (#3279)
* Separate Ant less dependency tree

* Change order between variables and ant imports

* Remove inc/variables from ant.less

* Update input-height-base for antd

* Set same input-color for Ant and Bootstrap
2019-01-15 11:40:38 +02:00
Arik Fraimovich
d68a4dce5f Pin version of pyparsing (#3282) 2019-01-14 17:17:23 +02:00
Levko Kravets
db86e394cf Update Antd to latest version + fix tests (#3281) 2019-01-14 16:25:57 +02:00
koooge
4c9326a9da handlers: Fix post users (#3273) 2019-01-13 15:52:56 +02:00
Ran Byron
200fea952a Pleasant alert-warning colors (#3276)
* Pleasant alert-warning colors

* Fix for json viewer primitive color
2019-01-13 15:27:26 +02:00
Ran Byron
90a0a7d39b Scheduler tests (jest/enzyme) (#3269)
* Setup enzyme and initial ScheduleDialog test

* Added tests for each schedule setting

* Added refreshOptions tests

* Added count out-of-range tests

* Added modal confirm/cancel tests

* Fixed tests failing due to server timezone difference

* Rebased to master
2019-01-13 15:26:44 +02:00
Omer Lachish
26252be75a Verify admin email address (#3267)
* add an  bit

* prompt on homepage when user's email hasn't been verified

* set e-mail as verified for new setups and invited users

* 👋 copy & paste invite links, it's time for verified e-mails!

* default `is_invitation_pending` to false and actively set it to true
when inviting users, so that existing users won't show "Invitation
Pending"

* fix tests that broke due to default is_invitation_pending value

* treat admin's e-mail address as verified

* add verification endpoint

* send verification e-mail

* Update client/app/components/empty-state/empty-state.html

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/authentication/account.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/handlers/authentication.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/templates/emails/verify.html

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/authentication/account.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/templates/verify.html

Co-Authored-By: rauchy <omer@rauchy.net>

* Update redash/templates/emails/verify.txt

Co-Authored-By: rauchy <omer@rauchy.net>

* add link in case redirects are disabled

* POSTing to /email_verification makes more sense than GETting /send_verification

* avoid sending invitations when no_invite is passed along

* Update client/app/pages/users/new.html

Co-Authored-By: rauchy <omer@rauchy.net>

* move e-mail verification prompt to home-page

* get rid of redundant $scope

* return JSON

* flip is_email_verified's default value so that existing users do not
show as not-verified

* e-mail verification propmt isn't dangerous, it just wants to warn you
2019-01-13 13:57:12 +02:00
Ran Byron
6c6366e6f0 Fix: Refresh schedule durations not pluralized sufficiently (#3268)
* Fix: Refresh schedule durations not pluralized sufficiently

* Allows omitting single value number in durationHumanize (#3274)
2019-01-13 13:31:41 +02:00
Ran Byron
de04a403d7 Fix: Refresh schedule interval count doesn't adhere to permission rules (#3265)
* Fix: Refresh schedule interval count doesn't adhere to permission rules

* Fix “4.28 weeks” to “30 days”

* Merge interval type and count into one <Select>
2019-01-13 11:39:57 +02:00
Ilya Ruzakov
0b6f1fc21b [Data Sources] Implement Apache Drill (#3188)
* Added support for Apache Drill datasource

* Improvements in `Drill` query runner and minor refactoring

1. Drill query runner now inherits from `BaseHTTPQueryRunner`, because they both have a lot of common code.
2. `BaseHTTPQueryRunner.get_response` method now accepts `http_method` argument (original implementation was only capable of sending `GET` HTTP requests).
3. Added `order` to `BaseHTTPRequestRunner` configuration schema to fix order of UI elements based on the schema.
4. Eliminated duplicate method `_guess_type` in `GoogleSpreadsheet`, `Results` and `Drill` query runners, moved `guess_type` to `redash.query_runner`.
5. Removed tests for `_guess_type` in `GoogleSpreadsheet`, `Results` and `Drill` query runners, merged them into single test case and moved to `tests.query_runner.test_utils`.
6. Various minor changes (code style, imports, etc).
2019-01-10 09:12:35 +02:00
Omer Lachish
445f8e5c36 Fix invitation pending for existing users (#3261)
* default `is_invitation_pending` to false and actively set it to true
when inviting users, so that existing users won't show "Invitation
Pending"

* fix tests that broke due to default is_invitation_pending value

* update Flask-OAuthLib
2019-01-09 13:48:47 +02:00
Omer Lachish
a29136037c update Flask-OAuthLib (#3262) 2019-01-09 13:48:21 +02:00
Arik Fraimovich
08953cc919 Redis based implementation of user active_at timestamp update (#3256)
* Switch to simpler implementation
* Fix active_at update code
* Fix sync test
2019-01-08 14:03:49 +02:00
koooge
22f835d3cb client: Remove estraverse (#3254)
Signed-off-by: koooge <koooooge@gmail.com>
2019-01-08 12:29:24 +02:00
Omer Lachish
823f172a9f Invitation Pending changes (#3229)
* determine invitation_pending according to empty password. This commit will be reverted, I'm just deferring the implementation

* show '(Invitation Pending)' to users who haven't accepted their invitation yet

* allow resending invitations

* allow deletion of pending users from user list

* set invitation as not pending when following invite link

* prevent deleting activated users

* test that users who follow invitation links are set as non-pending invitations

* prevent re-using invitations

* invitees who use SSO will now also be marked as "non-pending"

* lint
2019-01-08 08:52:48 +02:00
Jannis Leidel
44dff83046 Add "Active at" column to user list. (#3026)
* add last_active_at to users page

* Use our JSON encoder as the SQLAlchemy JSON serializer.

* Fixed some inconsistencies in the user query class methods.

* Minor cosmetic fixes.

* Add some make tasks for easier development.

* Add user detail sync system based on Redis backend.

There is a periodic Celery task that updates a new “details” JSONB column in the “user” table with the data from Redis.

Currently this is only used for tracking the date of last activity of a user but can be extended with other user information later.

Updates a few dependencies.

* Normalize a few Flask extension API names.

* Reduce implementation complexity of JSONEncoder.

* Use request_started signal to make sure we have a request context.

Otherwise loading the user based on the request won’t work.

* Fix test that checks if disabled users can login.

This correctly uses a URL path that includes the current organization and checks for the error message.

The previous test seems to have been a red herring.

* Minor cosmetic fixes.

* Remove needs_sync in favor of just deleting things.

* Misc review fixes.

* Ignore line length.

* Split redash.models import several modules.

* Move walrus UTC DateTimeField into redash.models.types.

* Restore distinctly loading dashboards.

* Simplify default values for user details.

* Define __repr__ methods generically.

* Consistently have underscore methods at the top of model methods.

* Fix tests.

* Split redash.models import several modules.

* Update to latest walrus and redis-py.

* Update kombu to 4.2.2 for redis-py 3.x compatibility.

* Remove redis-cli container after running Make task.

* Move buffer condition after datetime/time conditions.

* Update walrus to 0.7.1.

* Refactor some query APIs.

This uses the flask-sqlalchemy helpers consistently and makes more use of mixins.

* Post rebase fixes.

* Use correct kombu version

* Fix migration down revision
2019-01-07 10:30:42 +02:00
Ran Byron
569430e5cd Fix: Refresh schedule phrase overlaps title (#3250) 2019-01-06 12:46:55 +02:00
Ran Byron
07a1c23df5 Fix: Able to set out-of-range refresh interval 2019-01-06 12:27:50 +02:00
Ran Byron
b97b8477ad Feature: Refresh schedule - styling (#3247) 2019-01-06 12:14:00 +02:00
Ran Byron
9b72dfe076 Feature: Refresh schedule - save/cancel actions 2019-01-06 11:33:35 +02:00
Ran Byron
3ee83a4c4a Feature: Refresh schedule - code optimizations 2019-01-06 11:17:43 +02:00
Marina Samuel
cdd2259d08 Closes #2396: Add finer-grained scheduling. (#2426)
* Closes #187: Add finer-grained scheduling - backend.

* Closes #2396 - Add finer-grained scheduling - frontend.

* Fix linting issues

* Rename ScheduleDialgo to .jsx
2019-01-06 10:59:50 +02:00
Vincentoo
fc368ee425 Support overriding the default Celery schedule database file via SCHEDULE_DB environment variable. (#3056)
By default Celery will use a file celerybeat-schedule in the current directory.
This is an issue in a Kubernetes/Openshift environment as the file may be lost or even impossible to write.
2019-01-03 20:51:18 +02:00
YOSHIDA Katsuhiko
7a2e08c3eb Upgrade requests package (#3245) 2019-01-03 18:59:58 +02:00
Levko Kravets
ba0d069283 getredash/redash#3213 Scatter charts can have category Y axis (similar to Bubble) (#3243) 2019-01-03 17:15:51 +02:00
Omer Lachish
670d86eb5f Simple user view (#3244)
* show a simple user details page when viewing a user who isn't you (or you arent the admin)

* add a snapshot test

* lint
2019-01-03 15:23:40 +02:00
Ran Byron
63f38b7acd Fix: Query editor duplicates keystrokes [#2972] (#3239) 2019-01-01 17:40:48 +02:00
Arik Fraimovich
8b5ffc6f84 Handle the case when a QueryTracker is None and change order. (#3238) 2019-01-01 15:57:58 +02:00
Arik Fraimovich
cce2052e79 request.view_args might be None and add org_id to ApiUser (#3237) 2019-01-01 15:44:34 +02:00
Arik Fraimovich
8ea6283430 Send argsrepr value with execute_query task (#3235) 2019-01-01 15:32:02 +02:00
Arik Fraimovich
08b86c1c6d Fix: forked query wasn't opening in MULTI_ORG env (#3236) 2019-01-01 15:31:41 +02:00
koooge
0449a3ff31 Delete an unused global (#3231)
Signed-off-by: koooge <koooooge@gmail.com>
2019-01-01 08:58:31 +02:00
Arik Fraimovich
4ea46f197e It's 2019 now ! 🎉 2019-01-01 08:40:51 +02:00
Omer Lachish
d7edaa3ba2 Tests for find_missing_params (#3225)
* stop testing `collect_query_parameters`, it's an implementation detail

* add tests for `missing_query_params`
2018-12-31 12:34:57 +02:00
YOSHIDA Katsuhiko
632fc5aace Merge pull request #3232 from koooge/fix_warn_tapable
Update webpack-build-notifier to dismiss warn
2018-12-31 10:09:23 +09:00
koooge
b9abb36799 Update webpack-build-notifier to dismiss warn
Signed-off-by: koooge <koooooge@gmail.com>
2018-12-30 17:37:42 +00:00
Levko Kravets
d7e7b99a76 Merge pull request #3228 from kyoshidajp/fix_trailing_spaces_error
Fix front-end compile error
2018-12-28 20:43:10 +02:00
Katsuhiko YOSHIDA
db87c8740e Fix front-end compile error 2018-12-29 01:36:16 +09:00
Arik Fraimovich
5f2b54a320 Root folder cleanup (#3220)
* Remove old_migrations folder

* Move Dockerfile.cypress into .circleci
2018-12-26 18:09:41 +02:00
Arik Fraimovich
f62d0e1300 Use lower cased names for groups: (#3221)
Otherwise sorting depends on the Postgres collation and causes tests
to fail on different envoirnments.
2018-12-26 17:16:13 +02:00
Omer Lachish
9e156c1c30 Fix: missing param fails for object values (like date range) (#3218)
* fix: range params not recognized

* Handle parameters with unicode

* Remove debug prints

* DRY up missing_params
2018-12-26 17:06:30 +02:00
Gabriel Dutra
26965b4948 Add dot behavior to autocomplete (#3092)
* Add dot behavior to autocomplete
* Transform the Keyword Builder in an external js
* Remove methods from QueryEditor constructor
2018-12-26 17:04:11 +02:00
Omer Lachish
7a03928f48 we've noticed users with integer legacy session identifiers, so it doesn't hurt to convert to string anyway (#3219) 2018-12-26 16:24:59 +02:00
Omer Lachish
8f14efdaff Avoid exploding sql parse (#3216)
* fail silently when sql_parse explodes

* Update upstream/redash/handlers/query_results.py

Co-Authored-By: rauchy <omer@rauchy.net>

* Update upstream/redash/handlers/query_results.py

Co-Authored-By: rauchy <omer@rauchy.net>
2018-12-26 10:43:00 +02:00
deecay
03a7e24204 Show Sort Y only when type is Heatmap (#3206) 2018-12-24 17:10:16 +02:00
ialeinikov
2f7cb1bc8a [Athena] Fix: missing databases (apply pagination) (#2503)
* adding paginator on databases in glue

* reduce number of nested loops

* fixing indentation

* double for-loop instead of generator

* removing unused generator
2018-12-24 14:02:08 +02:00
koooge
64783b7f06 Switch to MULTI FROM Dockerfile and use Node 10 for builds (#3199) 2018-12-23 15:17:54 +02:00
Takuya Arita
8ed872756c Add test case for redash.utils.generate_token (#3211) 2018-12-23 15:13:00 +02:00
Arik Fraimovich
83ea472d37 Merge pull request #3093 from getredash/backend-parameter-templating
Remove Mustache templating from frontend
2018-12-20 22:24:11 +02:00
Arik Fraimovich
0505163ff9 Merge pull request #3174 from getredash/invalidate-sessions-after-email-or-password-change
Invalidate sessions after email or password change
2018-12-19 15:49:54 +02:00
Arik Fraimovich
3d38bb478f Merge pull request #3205 from kravets-levko/bug/wrong-query-link-in-widget
Widget: fix url parameters in query link
2018-12-19 15:47:30 +02:00
Levko Kravets
654e906f6b getredash/redash#3203 Widget: fix url parameters in query link 2018-12-19 15:13:58 +02:00
Omer Lachish
54da6c69ab Merge branch 'invalidate-sessions-after-email-or-password-change' of github.com:getredash/redash into invalidate-sessions-after-email-or-password-change 2018-12-19 14:36:08 +02:00
Omer Lachish
8284e829fb explain why we call on identity changes 2018-12-19 14:35:42 +02:00
Omer Lachish
bcfff469de Merge branch 'master' into invalidate-sessions-after-email-or-password-change 2018-12-19 14:23:35 +02:00
Omer Lachish
b5ceb268ef Merge branch 'master' into invalidate-sessions-after-email-or-password-change 2018-12-17 12:52:17 +02:00
Arik Fraimovich
8583eaa8ad Merge pull request #3173 from kyoshidajp/golineup
Make it possible to move up one line by Ctrl+P on macOS
2018-12-17 12:08:04 +02:00
Arik Fraimovich
ef66da7d94 V6 release (#3195)
* V6 release

* Remove "-beta"

* Update package.json

* Update package-lock.json

* Update CHANGELOG.md
2018-12-16 16:01:20 +02:00
Omer Lachish
1b4e0f5de7 rename safely_apply_parameters to apply_parameters 2018-12-16 10:58:20 +02:00
Omer Lachish
479247b60c Merge branch 'master' into backend-parameter-templating 2018-12-16 10:22:29 +02:00
Arik Fraimovich
57c8fbe14e README updates
1. Remove link to Slack channel.
2. Update number of data sources.
2018-12-16 09:55:34 +02:00
Arik Fraimovich
938a20e7c0 Use multiple issue templates instead of a single one (#3194)
* Switch to issue templates

* Apply a label to non bugs
2018-12-16 09:42:32 +02:00
Katsuhiko YOSHIDA
dc842e9201 Fix can't open new parameter dialog by Ctrl+P on Windows and Linux 2018-12-14 18:58:33 +09:00
Arik Fraimovich
f5dbdf245a Safely create_app in Celery code (try to fetch current_app first). (#3187)
Closes #3181.
2018-12-13 15:10:31 +02:00
Omer Lachish
35357afb90 transform legacy session identifiers into new session identifiers 2018-12-13 13:02:11 +02:00
Omer Lachish
419877b364 explain the motivation behind support for legacy session identifiers 2018-12-13 13:02:03 +02:00
Omer Lachish
143d515bfc use login_user instead of manually updating user_id in the session 2018-12-13 12:30:21 +02:00
Gabriel Dutra
8481dacff4 Fix eslint issues on user.js (#3186) 2018-12-12 23:32:12 +02:00
Omer Lachish
94905a287a tests for legacy session user identifiers 2018-12-12 13:03:50 +02:00
Katsuhiko YOSHIDA
34af780264 Golineup only macOS 2018-12-12 19:00:13 +09:00
Omer Lachish
3c8a3caa1d backward compatibility so users who have the old session identifier don't get logged out 2018-12-12 10:10:13 +02:00
Omer Lachish
9d566ef302 Merge branch 'master' into invalidate-sessions-after-email-or-password-change 2018-12-12 09:49:11 +02:00
Omer Lachish
e23a07af03 Remove missing coverage from pytest terminal output (#3180)
* Remove missing coverage from pytest terminal output

* move coverage reporting to CI
2018-12-12 08:30:46 +02:00
Omer Lachish
2312db46f2 test that other sessions are invalidated when changing an e-mail. I had
to resort to comments in code in order to explain this. I'm a failure
today. 😭
2018-12-11 15:14:43 +02:00
Arik Fraimovich
52434a837f Make refresh_queries less noisey in logs (#3183) 2018-12-11 15:03:29 +02:00
Arik Fraimovich
230ad33f02 [Redshift] Fix: support for schema names with dots. (#3182) 2018-12-11 14:57:42 +02:00
Omer Lachish
b3495b8c00 test that user does not get logged out when changing email or password 2018-12-11 12:25:51 +02:00
Omer Lachish
dec790a9f3 Merge branch 'master' into invalidate-sessions-after-email-or-password-change 2018-12-11 10:41:27 +02:00
Gabriel Dutra
cfe12c5a5d Add DB Seed to Cypress and setup Percy (#3155)
* Update Cypress element selectors

* Add seed data function to Cypress

* Change Cypress setup to be part of db-seed

* Add DatabaseSource selector to Create Data Source spec

* Add getElement command to Cypress

* Fix eslint issues

* Change Cypress getElement to getByTestId

* Add Percy and test it with the CI

* Change Percy dependency for CI to Cypress' Dockerfile

* Change Percy's execution to the docker container
- add --no-save to avoid errors on Dockerfile.cypress
 - pass PERCY_TOKEN from the CI to docker container

* Fix missed char on CircleCI config file

* Move Percy execution back to host on the CI

* Test adding PERCY_TOKEN to frontend-e2e-tests on CI config

* Undo add PERCY_TOKEN to config.yml

* Add Percy token and .git folder to Cypress

* Remove Percy install from config.yml

* Ignore .git folder again and use Percy env vars instead

* Update PERCY_PULL_REQUEST to be CIRCLE_PR_NUMBER

* Update cypress-server.js to handle other cypress commands
- cypress-server.js -> cypress.js
- new commands added to cypress.js
- CircleCI config updated accordingly
- added a Homepage screenshot

* Remove trailing spaces

* Add Create Query spec

* Disable Cypress videos

* Update run browser to Chrome

* Add missing --browser chrome
2018-12-10 22:29:36 +02:00
Omer Lachish
944bee6101 update identity only after succesfully updating user information 2018-12-10 14:25:04 +02:00
Omer Lachish
38ed046c9f Fix disable error message (#3175)
* display correct error message when attempting to disable yourself
* 403 (Forbidden) feels like a better status code than 400 (Bad Request)
* fix broken test
* remove redundant error title
2018-12-10 14:02:50 +02:00
Takuya Arita
1acf063755 FIX: Reject empty query name (#3171) 2018-12-10 12:35:25 +02:00
Omer Lachish
c426c826f7 fix tests that rely on sessions 2018-12-10 12:27:39 +02:00
Omer Lachish
4b1275ae56 don't sign out the current session when changing email or password 2018-12-09 11:07:42 +02:00
Katsuhiko YOSHIDA
b3c3134a86 Make it possible to move up one line by Ctrl+P 2018-12-09 15:26:01 +09:00
Omer Lachish
c311c12bcf invalidate session when email or password changes - currently not
backwards compatible
2018-12-05 23:49:55 +02:00
Omer Lachish
76321937d7 Remove API permissions for users who have been disabled (#3162) 2018-12-05 12:21:18 +02:00
Arik Fraimovich
c9ca2b99f6 Fix: Alert.evaluate failing when the column is missing. (#3167) 2018-12-05 11:28:05 +02:00
Arik Fraimovich
d42f0b2d40 Directly using record_event task requires timestamp (#3166)
Using the helper instead.
2018-12-05 10:11:08 +02:00
Vladislav Denisov
e530c23d4c clickhouse: fixed int() conversion error (#3161) 2018-12-05 09:29:47 +02:00
Omer Lachish
0973ee8abb Include correct version in production builds (#3163)
* take the first 8 characters for frontend version, not backend version

* run `npm run build` after version has been updated in CI

* `pack` should run last
2018-12-04 22:14:32 +02:00
Arik Fraimovich
3ee7537a6c WIP: Update CHANGELOG (#3159) 2018-12-03 22:07:20 +02:00
Omer Lachish
d769afab6f Merge branch 'master' into backend-parameter-templating 2018-12-03 13:22:44 +02:00
Omer Lachish
cf86509a0b remove leftovers of SQLQuery from utils 2018-12-03 13:17:40 +02:00
Omer Lachish
54894c3a26 track sql injections using an event to detect false positives 2018-12-03 13:12:34 +02:00
Arik Fraimovich
9c12b04578 json_dumps: add support for serializing buffer objects. (#3156) 2018-12-03 10:57:36 +02:00
Omer Lachish
1519849219 use SQLQuery's text property instead of method 2018-12-03 10:03:45 +02:00
Omer Lachish
202b93d8be use SQLQuery in run_query 2018-12-03 09:53:17 +02:00
Omer Lachish
0a62bee3a1 Merge branch 'master' into backend-parameter-templating 2018-12-03 09:44:52 +02:00
Omer Lachish
9579f12a83 Protect against SQL injections by using tree comparisons (#3109)
* add SQLQuery class with tests for safe queries and non-safe tautology attacks

* add test for union query injections

* split .apply calls to newline

* add tests for comment attacks

* remove double underscore

* extract complex children check to variable

* inherit from object because I'm not a lamer

Co-Authored-By: rauchy <omer@rauchy.net>

* simplify cognitive complexity

* check that additional columns are not injected

* detect appended queries

* inline .apply calls

* move SQLQuery to it's own module

* move SQLQuery tests to their own module

* serialize SQLQuery instances

* raise an exception when attempting to serialize an unsafe query

* queries without parameters are safe

* remove redundant parentheses

* use cached properties

* rename SQLInjectionException to SQLInjectionError

* support multiple word params and param negations

* refactor out methods that don't involve any state

* don't cache text()

* reduce cognitive complexity
2018-12-02 21:51:06 +02:00
Zsolt Kocsmárszky
463d4ce518 Fix label positioning on no found screen (#3148)
* Fix label positioning on no found screen

* Use TagsControl component on not found screen
2018-12-02 10:42:30 +02:00
Zsolt Kocsmárszky
2e4d196452 Add and improve recent db logos that didn't fit in size properly (#3147)
* Add and improve recent db logos that didn't fit in size properly

* Update mongodb logo

* Remove Athena Direct as requested
2018-12-02 10:27:01 +02:00
Zsolt Kocsmárszky
4078af2996 Update, replace and fix new alert destination logos so it fits better (#3146) 2018-11-29 21:04:35 +02:00
Zsolt Kocsmárszky
73825ea266 Improve tag link colors and fix group tags on Users page (#3149) 2018-11-29 21:02:54 +02:00
Zsolt Kocsmárszky
b2a0d61844 Better manage permissions modal (#3139)
* Improved design for manage permissions

* Show Owner on Permission modal, remove owner from dropdown options

* Pass owner to Permissions modal
2018-11-29 15:40:44 +02:00
Omer Lachish
1774edabc0 take the first 8 characters for frontend version, not backend version (#3145) 2018-11-29 15:20:30 +02:00
Omer Lachish
54b8e7c136 Merge pull request #3144 from getredash/display-frontend-version
Display only the first 8 characters of frontend version
2018-11-29 15:17:14 +02:00
Omer Lachish
54f09f73db take the first 8 characters for frontend version 2018-11-29 15:03:37 +02:00
Omer Lachish
35aca1d4cf Merge branch 'master' into display-frontend-version 2018-11-29 15:03:11 +02:00
Levko Kravets
757333c2d6 When editing a dashboard title results in the visualizations being replaced by the loading markers (#3142)
* getredash/redash#3015 When editing a dashboard title results in the visualizations being replaced by the loading markers

* CR1

Co-Authored-By: kravets-levko <levko.ne@gmail.com>
2018-11-29 14:48:21 +02:00
Omer Lachish
92728de04c Display frontend version (#3105)
* add git-revision-webpack-plugin

* configure git-revision-webpack-plugin

* add commit to footer

* rename version and commit to backendVersion and frontendVersion

* rename version and commit to backendVersion and frontendVersion

* disable lint error due to use of globals

* fix snapshot test

* read frontend version from VERSION file instead latest git revision

* directly require from version.json file instead of going through WebPack's DefinePlugin

* run snapshots
2018-11-29 14:24:23 +02:00
Omer Lachish
407f14ffca run snapshots 2018-11-29 13:07:04 +02:00
Arik Fraimovich
ecb8a5c244 Hive/Databricks related improvements (#3143)
* Hive: fix issues in building options.

* Hive: add missing import.

* Split Hive into two query runners: one for http and a regular one.

* Upgrade pyhive to support http.

* Specific implementation for databricks:

* Different schema loader, because column names are different (or Hive's schema loader is broken).
* Simpler configuration.

* Simplify Databricks setup even more by removing username.
2018-11-29 13:01:23 +02:00
Omer Lachish
0e8fab4872 directly require from version.json file instead of going through WebPack's DefinePlugin 2018-11-29 13:00:13 +02:00
Omer Lachish
c15fa0c592 read frontend version from VERSION file instead latest git revision 2018-11-29 11:57:53 +02:00
Levko Kravets
09ab00e360 Migrate all tags components to React (#3138) 2018-11-29 11:35:17 +02:00
Truong Hoang Phuoc, Robert
1728f924cf Fix schema refresh to work on MySQL 8 (#3141) 2018-11-29 09:19:36 +02:00
Omer Lachish
8dc10fbd9a Merge branch 'master' into display-frontend-version 2018-11-29 09:13:41 +02:00
Jannis Leidel
a16170e701 Fix tag counts for dashboards and queries. (#3120)
* Fix tag counts for dashboards to be distinct.

This also makes use of the Dashboard.all base query.

Fix #3108.

* Use Query.all_queries as the base query for Query.all_tags.

* Add test case for Dashboard.all_tags.
2018-11-28 14:06:15 +02:00
Arik Fraimovich
07c0bba568 Delete now.json (#3134) 2018-11-28 10:36:33 +02:00
Arik Fraimovich
d36d18f85b Support unicode in Postgres/Redshift schema (#3124) 2018-11-27 09:06:44 +02:00
Arik Fraimovich
bd20ce12ac Don't allow updating user's email to blacklisted domain. (#3127) 2018-11-26 21:22:14 +02:00
Arik Fraimovich
1cdfcfaa3c Vertica: update driver & add support for connection timeout (#3125)
* Update Vertica driver version

* Vertica: add support for connection timeout
2018-11-26 21:21:49 +02:00
Arik Fraimovich
2fdace518a Use lower timeout for the first 5 seconds when polling for results. (#3128) 2018-11-26 21:21:07 +02:00
Igor Canadi
3516e4ef45 Add Rockset query runner (#3068)
* Add Rockset query runner

Per REST API documented here: https://docs.rockset.com/rest/

* Update rockset.py

* Add Rockset logo

* Refactor Rockset qury runner:

* More idomatic names for configuration.
* Move API code to separate class to make it easier removing it when we
  switch to official library.
* Make Test Connection work.

* apply autopep8 to rockset.py
2018-11-26 21:20:37 +02:00
Arik Fraimovich
d842968142 MongoDB: add support for sorting columns. (#3126) 2018-11-26 16:08:04 +02:00
Arik Fraimovich
600741620a Remove (Beta) from Query Results query runner name (#3123) 2018-11-26 15:31:39 +02:00
YOSHIDA Katsuhiko
45f4277eb4 Fix forked query is opened in the same tab (#3121) 2018-11-26 14:23:55 +02:00
Jannis Leidel
bcf3041c91 Show menu divider only if query is archived. (#3122)
Fix #3117.
2018-11-26 14:02:52 +02:00
Zsolt Kocsmárszky
da423340ec Fix mobile padding issues on Query results (#3111) 2018-11-26 13:41:07 +02:00
Arik Fraimovich
4003d4f1aa Add event tracking to autocomplete toggle & trackEvent helper function (#3114)
* Add non Angular version of Events.

* Add event tracking for autocomplete toggle

* Fix lint error in QueryEditor
2018-11-26 09:58:39 +02:00
YOSHIDA Katsuhiko
a6b782e0ce Add get_current_user() into Python Data Source (#3088) 2018-11-25 14:11:27 +02:00
YOSHIDA Katsuhiko
5648de9ba8 Open new tab when forking a query (#3089)
* Open new tab when forking a query

* Delete old fork menu item and add icon
2018-11-25 14:09:52 +02:00
Jannis Leidel
13eb365f7b Update changelog for v6.0.0-beta. (#3112)
* Add v6.0.0-beta changelog entry.

* Update CHANGELOG.md
2018-11-25 14:08:25 +02:00
Udomomo
8257d9d037 Add permissions to the result of "manage.py groups list" command (#3007)
* Add permissions to the result of "groups list" command

* added permissions to test case

* removed setting for debug
2018-11-25 13:47:25 +02:00
Allen Short
babbeb79f0 keep query text in local state for now (#3107) (#3110)
* keep query text in local state for now (#3107)

This will be unnecessary once the queryText prop isn't managed by Angular.

* Fix: make formatQuery work
2018-11-23 15:28:30 +02:00
Omer Lachish
8028397f27 Merge branch 'master' into display-frontend-version 2018-11-22 12:52:43 +02:00
Subhi Al Hasan
e05c8e6060 Fix collection fields retreival bug when Views are present in MONGO DB (#3097)
* Fix collection fields retreival bug when Views are present in MongoDB

* fixing _is_collection_a_view function

* Update redash/query_runner/mongodb.py

Co-Authored-By: jodevsa <jodevsa@gmail.com>
2018-11-21 17:13:12 +02:00
Omer Lachish
ef8839aafa add tests for comment attacks 2018-11-21 13:52:08 +02:00
Omer Lachish
14860f6a8b split .apply calls to newline 2018-11-21 13:51:19 +02:00
Omer Lachish
a52c783857 add test for union query injections 2018-11-21 13:45:52 +02:00
Omer Lachish
5e7c785891 add SQLQuery class with tests for safe queries and non-safe tautology attacks 2018-11-21 13:45:29 +02:00
Omer Lachish
b242cefaa0 Merge branch 'master' into backend-parameter-templating 2018-11-21 10:51:44 +02:00
Omer Lachish
fae2b70866 Merge branch 'display-frontend-version' of github.com:getredash/redash into display-frontend-version 2018-11-21 10:49:29 +02:00
Omer Lachish
1119fce44c Merge branch 'master' into display-frontend-version 2018-11-21 10:48:03 +02:00
Omer Lachish
bfb7edc0eb fix snapshot test 2018-11-21 10:47:54 +02:00
Omer Lachish
a39a739473 disable lint error due to use of globals 2018-11-21 10:44:34 +02:00
Omer Lachish
c9dfac5b1d rename version and commit to backendVersion and frontendVersion 2018-11-21 10:44:18 +02:00
Omer Lachish
1b66fff3be rename version and commit to backendVersion and frontendVersion 2018-11-20 23:34:39 +02:00
Arik Fraimovich
0fe1b5f9d4 Fix: registerAll fails after minification (#3106) 2018-11-20 23:34:37 +02:00
Levko Kravets
143db90a50 Fix query page header (#3046)
* getredash/redash#3017 Improve query page header

* getredash/redash#3017 Resolve conflicts

* getredash/redash#3017 CR1 (fix margins/paddings)
2018-11-20 18:48:41 +02:00
Arik Fraimovich
bac90db3ee Autocomplete toggle improvements (#3091)
* Autocomplete toggle improvements:

* Refactor to its own component.
* Show state in tooltip (enabled/disabled).
* Disable the toggle if autocomplete is not possible (no schema/too many tokens).

* Remove unsued code.

* Custom icons font (currently has only two icons).

Generated with Icomoon. If we extend its use, we should probably automate this and move to its own package.

* Don't disable live autocomplete for data sources without schema.

It can still be useful to autocomplete from local keywords.

* Differentiate between autocomplete toggle states with an icon.

Also added explicit message for the disabled state.

* Remember thes state of autocomplete.

* Only auto register init functions.
2018-11-20 18:45:33 +02:00
Omer Lachish
649d46de89 add commit to footer 2018-11-20 15:25:07 +02:00
Omer Lachish
0163e85eda configure git-revision-webpack-plugin 2018-11-20 15:24:55 +02:00
Omer Lachish
f25beb3fb7 add git-revision-webpack-plugin 2018-11-20 15:24:41 +02:00
Omer Lachish
c66f63d7a5 Prevent Query's updated_at from changing when it is linked to new query results (#3082)
* avoid Query's updated_at from changing when it is linked to new query results

* move comment to previous line

* move QueryResult tests to their own module

* add test which verifies that updated_at is not changed on query data
updates

* tests were false positives - they compared HH:MM:SS, but that never
changed because the original time was 1 week behind.

* remove redundant constructor

* remove hack and use a proper event to prevent updated_at from changing

* use self.assertEqual instead of assert
2018-11-20 12:22:15 +02:00
Levko Kravets
16ae0aa3d8 getredash/redash#2901 Fix docs links (#3102) 2018-11-20 11:06:09 +02:00
Arik Fraimovich
68ada7b590 UI for the feature flag of the share edit permissions feature (#3077)
* Remove unused settings.

* Add: UI feature flag for sharing permissions

* Revise feature flag message
2018-11-20 10:04:42 +02:00
San
9e745ef648 Delete redundant regex segment (#3100) 2018-11-20 09:48:24 +02:00
Allen Short
ee0d7f5ec9 force angular to update query editor properly (re #3098) (#3099) 2018-11-20 08:06:32 +02:00
Omer Lachish
1b3bbb6c3b swap parameters so their order makes more sense 2018-11-19 22:56:51 +02:00
Omer Lachish
7bee07c9da include parameters (and query_id) in the recorded event 2018-11-19 22:54:22 +02:00
Omer Lachish
74ab7a5a42 Merge branch 'master' into backend-parameter-templating 2018-11-19 21:59:14 +02:00
Levko Kravets
e36853ca84 Tags autocomplete: some tags not shown on search (#3094)
* getredash/redash#3052 Tags autocomplete: some tags not shown on search

* getredash/redash#3052 CR1
2018-11-19 12:33:05 +02:00
Omer Lachish
bc65b62776 remove Mustache templating from frontend and send all parameters to the
API (in the POST body)
2018-11-19 10:50:00 +02:00
YOSHIDA Katsuhiko
d43b35ba6f Change Standard SQL as the default (#3085) 2018-11-18 11:21:00 +02:00
Topher Cyll
6e4f0ccee8 Bubble chart marker size override was clobbering seriesColor. (#3063)
Colors can now be set for bubble charts in UI.
2018-11-18 11:05:18 +02:00
Vladislav Denisov
0ce7772aa3 clickhouse: added WITH TOTALS option support (#3083) 2018-11-15 22:11:43 +02:00
San
f6ef38479c support tel, sms, mailto links in the query result (#3084) 2018-11-15 22:08:02 +02:00
Arik Fraimovich
bf85ddaaff Always use basic autocomplete. (#3079) 2018-11-15 08:58:30 +02:00
Arik Fraimovich
8bb96c8c91 Fix: URL data source shouldn't require URL. (#3078)
Closes #2919.
2018-11-14 15:43:34 +02:00
Filipe Veloso
42b05cee00 Update docker-compose.yml (#2905)
* Update docker-compose.yml

jut updating docker-compose dev to version 3, any special reason to keep redis on 3? and pg on 9.5? I could also add a volume to pg, any reason not to do so?

* rollback to redis 3 and pg 9.5 due to consistency in project defaults

* Configure volume directly in worker service.
2018-11-14 14:27:19 +02:00
Anton Burnashev
d0fd02123a Add white-space padding to separators in the footer (#3076) (#3076)
Closes #3075
2018-11-14 10:44:38 +02:00
Takuya Arita
e34203dac3 Remove only Redash containers (#3073) 2018-11-13 16:45:40 +02:00
koooge
c2bd8518a6 Makefile: Add make targets for test (#3032) 2018-11-12 09:06:25 +01:00
Levko Kravets
46363ccc70 Table visualization horizontal scrollbar should not be always visible (#3061) 2018-11-12 07:50:44 +01:00
Levko Kravets
5e1512e777 Mustache: don't html-escape query parameters values (#3058) 2018-11-08 21:54:08 +01:00
Arik Fraimovich
188c045fdb Add Kylin logo (#3054) 2018-11-08 11:20:05 +01:00
Omer Lachish
57d921dc2b Druid query runner (#3047)
* add Druid query runner skeleton

* enable Druid only if package is available

* add Druid

* remove redundant  override

* correct configuration schema

* implements run_query

* implement get_schema

* remove username and password

* fix small lint issues

* proper indentation

* add correct type mapping
2018-11-08 10:48:45 +01:00
Xin Bai
df0804c8fd Add Kylin plugin for SQL query (#2936) 2018-11-08 10:24:05 +01:00
Alexander Leibzon
c289dde806 Google analytics fix fixes #2965 (#3008)
* add PagerDuty as an Alert Destination

* remove comments

* add unknown state handling

* fixes

* revert setup.sh

* Remove test method.

* resolves #2965

* more elegant, as per Arik's suggestion

* Add missing whitespace.
2018-11-08 10:18:33 +01:00
Levko Kravets
b7cadca3b7 Edit-in-place component ignored isEditable flag and didn't work on Groups page (#3049) 2018-11-08 10:17:18 +01:00
Sami Jaktholm
43f8200707 feat(redshift): hide tables the configured user cannot access (#2866)
The SVV_COLUMNS table used to determine the tables of a
Redshift database includes all tables, even those the
current user cannot access, by default. These tables clutter
the schema browser and make it harder for users to determine
which tables they should have access to.

These changes modify the Redshift query runner so that
tables the configured user cannot access are filtered
out from the database schema. The checks are two-fold:

* First, the query uses HAS_SCHEMA_PRIVILEGE to check if the
  current user has USAGE rights on a schema the given table
  belongs to. This privilege is required to access any of
  the tables in a schema.

* Second, the query tries to determine if the current user
  has SELECT access to the given table. Two cases need to
  be considered here:

  * First, we need to check if the table is part of an
    external schema. Access to tables in external schema
    is controlled at schema level - you cannot grant or
    revoke access to specific external tables. Additionally,
    the HAS_TABLE_PRIVILEGE returns an error if it is asked
    to give a verdict for an external table.

    Hence, the query checks if the schema a specific table
    belongs to is an external schema and if it is, the table
    is included in the list (if we got here the user already
    had USAGE on the given schema). This check short-circuits
    the table-level access check for external tables which
    means they are never passed to HAS_TABLE_PRIVILEGE().

  * Then, if the table was not part of an external schema,
    the HAS_TABLE_PRIVILEGE() function is used to determine
    if the user has SELECT access to the given table. The
    table is included in the schema if this check passes.

Together this condition ensures that tables the user definitely
cannot access are not included in the schema browser.

These changes have been tested to work in an environment that
includes normal and external schemas, normal and late-binding
views, and normal and external tables.
2018-11-08 09:53:04 +01:00
Arik Fraimovich
a1b580bba6 Fix Docker Compose version number in Cypress config (#3051)
* Update Docker compose version

* Experiment with Docker-Composeless CI build

* Switch back to Docker compose based tests
2018-11-07 17:21:31 +01:00
Zsolt Kocsmárszky
19d0313ea2 Fixing tag issues (#3006)
* Add title="" for tags

* Fix lines

* Fix long tag and overlaying tag issues on queries
2018-11-07 16:58:15 +01:00
Arik Fraimovich
667fe43e23 Revert "address tag display on query list page" (#3050)
* Revert "remove pytest_watch (#3048)"

This reverts commit 096eba3876.

* Revert "address tag display on query list page (#2803)"

This reverts commit 99115a12e6.
2018-11-07 16:57:37 +01:00
Omer Lachish
096eba3876 remove pytest_watch (#3048) 2018-11-07 16:49:41 +01:00
Alison
99115a12e6 address tag display on query list page (#2803)
* address tag display on query list page

* character limit tags in css

* updates to tags on levko's feedback
2018-11-07 16:12:31 +01:00
Gabriel Dutra
7d601cbbc9 Cypress based E2E tests (#3019) 2018-11-07 14:37:08 +01:00
GitSumito
bf6a09c5aa CLI sort (#3041) 2018-11-06 16:45:39 +01:00
Yossi-a
99967e720f Sort columns with undefined values (#2745)
* sort should treat undefine value as the minimal value

* explicit undefined check
2018-11-05 04:47:42 +02:00
Arik Fraimovich
27f489de20 Build docker image on master branch. (#3039) 2018-11-04 12:12:13 +02:00
yoavbls
46941d3aa1 Update Flask-Admin to 1.5.2 (#3036)
I don't know if someone uses flask-admin but I upgraded it because of this bug:
https://github.com/flask-admin/flask-admin/issues/1588
In 1.4.2 you cant add and edit records/
2018-11-01 15:58:50 +02:00
Levko Kravets
60c230add7 getredash/redash#3034 Postgres query runner: handle NaN/Infinity values (#3035) 2018-11-01 15:57:39 +02:00
Takuya Arita
0784a0c6f5 Add some tests for Query Results (#3031) 2018-10-31 11:05:17 +02:00
Zsolt Kocsmárszky
9288d89248 Fix query result section (#2980) 2018-10-29 22:09:49 +02:00
Levko Kravets
391fbe130b getredash/redash#2998 Charts lose responsive features after refreshing the dashboard (#3024) 2018-10-29 22:08:35 +02:00
Levko Kravets
e25c8c4145 getredash/redash#3022 Toolbox covers part of the chart (#3023) 2018-10-29 11:38:29 +02:00
Arik Fraimovich
57353d1b40 Add -beta to version 2018-10-28 15:58:20 +02:00
Arik Fraimovich
7f4e08154f Bump version 2018-10-28 15:56:32 +02:00
Arik Fraimovich
500c82815b Add netlify config (#2999) 2018-10-28 15:31:27 +02:00
Arik Fraimovich
4a846f04e9 Add settings to import 2018-10-28 11:11:11 +02:00
Takuya Arita
b1e9d87e2a Apply query format options from settings (#2342)
* Apply query format options from settings

* Apply sqlparse format options via env-vars
2018-10-28 10:40:07 +02:00
Arik Fraimovich
ab6ed7da34 Fix: setup.sh fails when run as root. (#2996)
Closes #2979
2018-10-23 09:49:24 +03:00
GitSumito
2e6883c527 Add "Users" users are belong to into groups list (#2991) 2018-10-21 11:40:07 +03:00
YOSHIDA Katsuhiko
4c44999b2c Fix an invalid prop type warning (#2992) 2018-10-21 11:39:37 +03:00
deecay
34c118cf83 Add: Heatmap chart visualization by Plotly (#2080) 2018-10-21 11:39:06 +03:00
Arik Fraimovich
38a89b9783 Table visualization: change default size to 25 and add more size options. (#2982) 2018-10-21 11:38:47 +03:00
YOSHIDA Katsuhiko
6e836795b2 Fix url scheme (#2994) 2018-10-21 11:38:11 +03:00
YOSHIDA Katsuhiko
719fc41dd1 Add page size settings (#2993)
Add page size settings.

| name | default | description |
| :---- | :------ | :---------- |
| `REDASH_PAGE_SIZE` | 20 | How many items are displayed in one page as default. |
| `REDASH_PAGE_SIZE_OPTIONS` | 5,10,20,50,100 | How many steps as page_size. |

This feature has requested at the meetup in Japan.

https://redash-meetup.connpass.com/event/101420/
2018-10-20 14:33:31 +02:00
Arik Fraimovich
467ec201da Add Jest based tests to our stack (#2985)
* Add Jest packages
* Add first test
* Install eslint rules for jest & move deps to dev
* Configure cirlce to run jest
* package.json: Remove dev command
* package.json: clean command
* Don't autoload test files.
* Fix: webpack-dev-server was recompiling all the files on every change
* Update CircleCI step names
2018-10-19 19:04:02 +03:00
koooge
5ab143de41 Rearrange make target (#2989) 2018-10-19 11:25:24 +02:00
Arik Fraimovich
284e497483 Databricks updates: logo, name and enable by default (#2983)
* Add Databricsk logo.
* Enable it by default.
* Rename to Databricks.
2018-10-19 10:00:33 +02:00
dmonego
c5613dddf1 Chnage: switch to Webpack 4 (#2933) 2018-10-18 21:21:47 +03:00
Arik Fraimovich
34fb3ac79f Change: add timeout to destination requests. (#2960) 2018-10-18 17:33:58 +03:00
Arik Fraimovich
5f58c328f1 MongoDB: skip system collections when loading schema. (#2961) 2018-10-18 17:33:24 +03:00
Arik Fraimovich
7d1dbb87db Change: update MongoDB requirements to support srv. (#2962) 2018-10-18 17:32:43 +03:00
GitSumito
45f4d46245 Add "Groups" users are belong to into users list (#2967) 2018-10-18 17:32:21 +03:00
Arik Fraimovich
44d05c35ac Presto query runner improvements (#2968)
* Presto: support for setting protocol (http/https).

* Presto: safe loading error message.
2018-10-18 17:31:48 +03:00
Arik Fraimovich
edd2cb85f7 Update CHANGELOG.md 2018-10-18 14:59:00 +03:00
Hiroka Zaitsu
6c364369bb Fix: TreasureData data source - deduplicate column names (#2867)
* Fix: TreasureData data source - deduplicate column names

* Maping types
2018-10-18 09:43:28 +03:00
YOSHIDA Katsuhiko
869841b2ac Preventing open redirection (#2906)
* Prevent open redirection attack

* Add redirection url after logging in test

* Sanitize url just before redirecting it

* Consider when next parameter is None
2018-10-17 21:55:58 +03:00
Arik Fraimovich
c71f722552 Query Results query runner improvements: (#2969)
- Show meaningful error when failing to create table.
- Quote column names to allow more characters types.
2018-10-16 15:23:00 +03:00
Jannis Leidel
af3a1e00c6 Fix #2757 - Use full text search ranking when searching in list views. (#2798)
This applies to the queries, dashboard and users views.
2018-10-16 10:38:37 +02:00
Gabriel Dutra
5b2ec81e65 Fix no tags shown when having empty set (#2964) 2018-10-15 23:08:18 +03:00
Vladislav Denisov
0008e5803b clickhouse: move timeout to params (#2956)
* clickhouse: timeout moved to params

* clickhouse: use get() method for timeout
2018-10-15 20:06:16 +03:00
Arik Fraimovich
e1c1f67abb Add: option to auto reload widget data in shared dashboards. (#2959) 2018-10-15 20:05:40 +03:00
Marina Samuel
30283235a4 Fix tarball build failure. (#2963) 2018-10-15 20:05:07 +03:00
Levko Kravets
845e33b396 Query page layout improvements for small screens (#2922)
* getredash/redash#2796 Make entire page scrollable on small screens; improve metadata block

* getredash/redash#2796 Improve query page header layout; fix small bugs (margins, etc.)
2018-10-15 19:59:05 +03:00
Arik Fraimovich
17baa66188 Show "Add description" only after saving the query. (#2958)
Closes #2897
2018-10-15 17:45:22 +03:00
Arik Fraimovich
5df7bd12c9 Fix: apply missing CSS classes to EditInPlace component. (#2957) 2018-10-15 17:38:22 +03:00
Nicolas Ferrandini
e14c8b61a0 Add DB2 as a data source using ibm-db python package (#2848)
* Add DB2 as a data source using ibm-db python package

* fix some codeclimate issue

* fix long line and missing white space

* Manage case of bad import

* Add DB2 query_runner as default query runner

* Fixed minor PEP8 rules
2018-10-15 17:13:39 +03:00
Arik Fraimovich
a8a3ec66fd Bring back fix to Box plot hover. (#2941) 2018-10-15 16:01:38 +03:00
GitSumito
a4b9c2da12 fixed https://github.com/getredash/redash/issues/2950 (#2951)
* fixed https://github.com/getredash/redash/issues/2950

* fixed test code

* Effective -> Active. thank you @kravets-levko
2018-10-15 15:57:51 +03:00
Vladislav Denisov
e6146dae0f Clickhouse fixes (#2953)
* clickhouse: avoid last line with comment in query

* clickhouse: add request timeout
2018-10-15 15:03:02 +03:00
Levko Kravets
bd3fe880a4 Add missing default "extensions" directory (webpack fails to build without it) (#2952) 2018-10-15 13:51:13 +02:00
Marina Samuel
02e919c39b Closes #2565: Add frontend extension capability. (#2799) 2018-10-14 15:53:39 +03:00
Arik Fraimovich
99c73aef2d Update snowflake_connector_python version (#2946) 2018-10-14 14:39:52 +03:00
Ralphilius
be377b5f59 Add Counter label (#2900)
* Add Counter label

* Update index.js

* Added visualization name as placeholder

* Backward-compatible for visualization name as label
2018-10-14 11:23:20 +03:00
Zsolt Kocsmárszky
6b11ae4312 Design refinements (#2927)
* Fix search size on smaller tablet size

* Less prominent tag counter

* Fix hiding logo

* Add missing space between icon and button text

* Different embed icon

* Revert embed icon to its original

* Better edit source icon + markup cleanup
2018-10-14 11:00:27 +03:00
YOSHIDA Katsuhiko
9021977a54 Fix admin api recording (#2937) 2018-10-14 10:49:11 +03:00
Sami Jaktholm
9c8d06578a feat: add support for expanding dashboard visualizations (#2824)
* feat: add support for expanding dashboard visualizations

These changes implement support for expanding a dashboard visualization
into a larger modal dialog.

This is useful if you have a dashboard with lots of small widgets and
want to inspect one of the widgets more closely. In the past, this
would've required you to navigate to the query page to see a larger
version of the visualization. With these changes, visualizations can
be expanded right from the dashboard.

The implementation is simple as it just renders the visualization into
a modal dialog. Other parts of the widget (e.g. parameters) are not
included in this dialog.

* chore(widget-dialog): use query-link widget to render title

This reduces code duplication a bit. The link is made read-only
as navigation doesn't close the modal dialog.

* fix: make ui-select dropdown z-index > modal dialog z-index in dashboard page

Otherwise the dropdown renders behind the modal dialog if filter value
is changed from the modal view of a widget.
2018-10-14 10:42:31 +03:00
YOSHIDA Katsuhiko
114beb2480 Auto focus tag input (#2938) 2018-10-14 10:39:08 +03:00
Alexander Leibzon
e97a5cbb29 add PagerDuty as an Alert Destination (#2903) 2018-10-14 10:35:39 +03:00
Alexander Leibzon
e87efc8bc3 fixes #2924 (#2931)
Google Spreadsheets: support for open by url
2018-10-11 21:07:20 +03:00
Arik Fraimovich
be7f601d21 Speed up builds by skipping installing requirements_all_ds.txt in CI unit tests (#2928)
* Speed up builds by skipping requirements_all_ds.txt

* Update docker compose file version

* Start services before running commands

* Add boto and Athena dependencies to requirements_dev.txt
2018-10-11 14:12:28 +03:00
Levko Kravets
9b59d10677 Use Plotly's function to clean y-values (x may be category or date/time) (#2872) 2018-10-11 12:27:28 +03:00
Levko Kravets
a40669e07f getredash/redash#2875 Update plotly.js; some cleanup; fix chart legend issue in horizontal mode (#2902) 2018-10-11 11:23:40 +03:00
Levko Kravets
0bcf5d4be7 Merge pull request #2929 from combineads/fix-date-filter
Fix: date value in a filter is duplicated.
2018-10-11 09:08:31 +03:00
combineads
8bc96764a6 Fix: date value in a filter is duplicated. 2018-10-11 14:56:57 +09:00
Niko Eckerskorn
6ea03e58b4 Address edgecase when retrieving Glue schemas for Athena query runner. (#2868)
Fixes getredash/redash#2858
2018-10-10 19:13:48 +03:00
Gabriel Dutra
94801665ab Fix output file name not changing after rename query (#2917) 2018-10-10 15:07:11 +03:00
Gabriel Dutra
aa12151e19 Fix export query results output file name (#2916)
- regexp `/ /g` will seek for all space ocurrences, not only the first
2018-10-10 14:56:31 +03:00
Jannis Leidel
c2429e92d2 Consistently use simplejson to loading and dumping JSON. (#2817)
* Consistently use simplejson to loading and dumping JSON.

This introduces the new functions redash.utils.json_dumps and redash.utils.json_loads and simplifies the custom encoder setup.

UUIDs are now handled by the default encoder, too.

Fixes #2807.

Use string comparison in parse_boolean instead of the (simple)json module.
2018-10-09 15:38:06 +02:00
Jannis Leidel
5ffc85c066 Extend menu item text a bit for visual consistency. 2018-10-08 20:08:07 +02:00
Jannis Leidel
fad757c878 Don’t show “Add to dashboard” in dropdown to unsaved queries. 2018-10-08 20:08:07 +02:00
Jannis Leidel
3351a281ee Fix webpack build error about BigMessage. (#2910) 2018-10-08 12:03:54 +02:00
Arik Fraimovich
1f0053f531 MySQL: hide sys tables (#2909) 2018-10-08 10:05:16 +03:00
Arik Fraimovich
935dc38360 Update setup files: (#2908)
* Remove use of newgrp
* Updated packer configuration
2018-10-08 09:41:15 +03:00
Arik Fraimovich
bfef7fae93 Remove unused dependencies. (#2907)
Closes #2782
2018-10-08 09:39:57 +03:00
cclauss
da6d456f6f CircleCI: Flake8 tests passing on Legacy Python and Python 3 (#2881) 2018-10-05 13:48:01 +03:00
Arik Fraimovich
c19199c2fb Add margin between format and autocomplete buttons (#2899) 2018-10-04 12:34:03 +03:00
Arik Fraimovich
1e78861f85 Move Ant styles into a central location. (#2898)
This is to ensure that we include our override after loading Ant's styles.
2018-10-04 12:27:36 +03:00
Arik Fraimovich
10bc5a0bf6 Remove misplaced bracket. (#2894) 2018-10-04 12:01:38 +03:00
Marina Samuel
313af904df Add ability for extensions to add periodic tasks. (#2740) 2018-10-04 09:07:58 +03:00
Allen Short
8c478087a9 Rewrite query editor to React (#2636) 2018-10-03 22:25:19 +03:00
Arik Fraimovich
ccac41c6d4 Fix: JS build breaks because registerAll tries to run EditInPlace component (#2886) 2018-10-02 16:22:47 +03:00
Jannis Leidel
69635f2c40 Rename Yandex Metrika to Metrica. (#2884)
Fix #2874.
2018-10-02 16:11:01 +03:00
yoavbls
1867ea50bb Add option to query cached results (#2855) 2018-10-02 16:05:41 +03:00
Jannis Leidel
c64d5ef6c0 Fix #2876 - Remove accidental query-result-link component from 'Add to dashboard link.' (#2883) 2018-10-01 22:29:20 +03:00
Alison
e3a63899d3 Add ability to search table column names in schema browser (#2681) 2018-10-01 11:11:32 +02:00
Jannis Leidel
4685887fe5 Fix name of edit-in-place React component. 2018-09-29 10:14:48 +02:00
Arik Fraimovich
f103357e60 Fix: wrong reference (EditInPlaceText -> EditInPlace) 2018-09-28 21:51:36 +02:00
Jannis Leidel
11738f73ac Removed redundant exception handling since execute_query task handles that. 2018-09-28 21:31:49 +02:00
Allen Short
d07c4f969b Support authentication for the URL query runner.
Adds a new BaseHTTPQueryRunner class and tests.
2018-09-28 21:31:49 +02:00
Allen Short
505aafbce3 Convert edit-in-place component to React (#2637) 2018-09-28 22:30:10 +03:00
Marina Samuel
b765693879 Upgrade Celery to 4.2.1. (#2773) 2018-09-28 21:28:30 +02:00
Jannis Leidel
4620fed0cf Use server side sort order for tag list and show count of tagged items. (#2833)
* Use tag list ordering from backend.

This basically stops resorting the tag list on the client side and use the already existing (and correct) descending sort order bu tag usage count from the backend.

* Show count of tagged items in tag list.
2018-09-28 17:24:13 +03:00
Arik Fraimovich
48ad1d2dce Add v5.0.1 to the CHANGELOG. 2018-09-28 17:18:41 +03:00
Arik Fraimovich
f2c323a089 Disable integration tests
The integration tests are currently not failing and providing false positives when running them. I'm disabling this until the test suite is more stable.

@jrbenny35 @jezdez
2018-09-28 11:52:14 +03:00
Levko Kravets
ec17cc7eab getredash/redash#2854 Widget titles wrong rendering on public dashboards (#2870) 2018-09-28 11:26:37 +03:00
Arik Fraimovich
6c7bbe9041 Merge branch 'master' of github.com:getredash/redash 2018-09-27 21:47:56 +03:00
Arik Fraimovich
551b0222c4 Cleanup packer configuration 2018-09-27 21:47:45 +03:00
Jannis Leidel
2b0e6e9e79 Refactor list based controllers. (#2790)
This reduces the code duplication between the dashboard, user and queries list pages and normalizes many of the APIs between them.

This also:
- allows sorting query favorites
- adds a pagination size select to the dashboard list
- fixes a bunch of UI inconsistencies between the queries and dashboards list (e.g. margins)

The new ListCtrl class is subclassed in the various specific page controllers and extended as needed. New list pages can make use of the same pattern in the future.

This also adds some missing event recordings from 34e39eda4a.
2018-09-27 17:06:26 +02:00
Levko Kravets
4727c19253 getredash/redash#2796 Improve counter text scaling (#2840) 2018-09-27 13:27:10 +03:00
Arik Fraimovich
2ff4d07e83 Change placement (right/bottom) of chart legend depending on chart width (#2852)
Closes getredash/redash#2796.
2018-09-27 12:34:28 +03:00
Arik Fraimovich
1997f53f40 Fix CircleCI setup for release branches. (#2859) 2018-09-27 10:36:48 +03:00
Jannis Leidel
c03b5d51b7 Simplified data source resource. Refs #2856. 2018-09-27 09:20:07 +02:00
yoavbls
197665bb6a Fix bug in DataSourceResource load (#2857) 2018-09-27 09:15:36 +02:00
Levko Kravets
28fbc2ae62 getredash/redash#2796 Change placement (right/bottom) of chart legend depending on chart width 2018-09-27 10:14:58 +03:00
Alexey Korobkov
ea1c4ca85c Add auth via JWT providers (#2768)
* authentication via JWT providers
* add support for IAP JWT auth
* remove jwt_auth Blueprint and /headers endpoint
* fix pep8: imports
2018-09-26 21:17:48 +03:00
Alison
588e0cce43 Add autocomplete toggle (#2780) 2018-09-26 17:32:38 +02:00
Alison
8a50351520 Add ability to add viz to dashboard from query edit page (#2767) 2018-09-26 17:29:38 +02:00
Alison
34e39eda4a Port moving events serverside (#2766) 2018-09-26 17:17:46 +02:00
Alison
28a8525ce3 Add databricks query runner (#2747)
Fixes #2685.
2018-09-26 17:07:03 +02:00
Arik Fraimovich
5e70f9c04a Update README.md 2018-09-25 21:08:46 +03:00
Arik Fraimovich
a05b5ba68d Docker based setup scripts (#2850) 2018-09-25 21:08:24 +03:00
Dan VerWeire
40ba66c58e Fix invalid reference to alert.to_dict() in webhook (#2849) 2018-09-25 19:12:04 +03:00
Arik Fraimovich
3e4adaba9a Update CircleCI config to use release branches 2018-09-24 11:52:38 +03:00
Arik Fraimovich
865b799dfd Merge branch 'master' of github.com:getredash/redash 2018-09-21 17:06:46 +03:00
Arik Fraimovich
eed26c789e Update CHANGELOG & version to V5 2018-09-21 17:06:26 +03:00
Arik Fraimovich
8c9d2af6fe Fix: BigQuery default location is null and not US (#2841)
If no location is specified BigQuery uses US or EU. If we pass US
it breaks querying for EU users.
2018-09-21 16:49:30 +03:00
Arik Fraimovich
03cac7e515 Fix: backport security fix from v4.0.2 - don't expose Google OAuth client secret. (#2839) 2018-09-20 12:32:38 +03:00
Arik Fraimovich
defb3b9750 Fix: favorite button on homepage is not yellow. (#2838) 2018-09-20 10:39:36 +03:00
Arik Fraimovich
ec39bb0779 Fix: query embeds are broken. (#2837) 2018-09-20 10:36:15 +03:00
ariarijp
1661553da7 Fix typo 2018-09-18 08:56:01 +02:00
Arik Fraimovich
a4d5782ea1 Update ISSUE_TEMPLATE.md 2018-09-17 22:08:49 +03:00
Arik Fraimovich
d491eddd7d Add security section to README. 2018-09-17 22:07:31 +03:00
Zsolt Kocsmárszky
47068a6d91 Improved mobile design (#2800)
* Improve mobile views

* Better fontsize for dashboard headers

* Add hidden-xs classes instead

* Move dashboard related styling to dashboards.less
2018-09-16 10:46:30 +03:00
Alison
d8ced1401f add test for using saved parameters in scheduled queries (#2802) 2018-09-16 10:45:25 +03:00
Jannis Leidel
59a5540823 Use QuerySerializer in outdated queries list. (#2821)
This is a regression from aa756b2be6.
2018-09-16 09:49:22 +03:00
Jannis Leidel
b1f5d60460 Minor code smell cleanup. (#2820)
* Remove unused parse_db_url function.

* Fix tests to not show command line warnings anymore.

* Minor code smell cleanup.

Removing unneeded imports fixing PEP8 issues.
2018-09-16 09:43:44 +03:00
Tim Smith
5c9852b9d9 Fix QueryResultListResource docstring
Change the docstring to reflect the behavior of the function
2018-09-14 22:23:06 +02:00
Levko Kravets
8c360d5c8d Fix: sometimes widgets are getting zero height (#2813) 2018-09-14 16:33:24 +03:00
Levko Kravets
eb6f9d5ab8 Merge pull request #2816 from getredash/simplejson-parent-method
Use parent default method of simplejson encoder.
2018-09-14 12:05:45 +03:00
Jannis Leidel
4ab160a14c Use parent default method of simplejson encoder. 2018-09-14 10:29:38 +02:00
Arik Fraimovich
93b34bcbce UI Fixes for favorites and empty state (#2808)
* Better empty state for favorites on homepage
* Fix: show empty state when no dashboards available
* More explicit message in app header
2018-09-12 11:35:34 +03:00
Benjamin Forehand Jr
5113f4ff33 Add npm install for integration test job. (#2795)
* Add npm install.

* Fix typo.
2018-09-07 09:16:58 +02:00
Benjamin Forehand Jr
151683f9f9 Add npm build step to integration tests. (#2794) 2018-09-06 19:55:08 +02:00
Levko Kravets
53abc16780 Athena: Switch to simple_json to serialize NaN/Infinity values as nulls.
Fixes #2544.
2018-09-04 13:03:21 +03:00
Arik Fraimovich
d529a1dfb3 Fix: queries with parameters with no value breaking the scheduler. (#2786) 2018-09-04 11:32:37 +03:00
Arik Fraimovich
7cb7f3a99d Fix: MongoDB query results parser didn't support unicode keys. (#2785) 2018-09-04 11:30:40 +03:00
Arik Fraimovich
c27528fb7e Fix: Google Analytics schema wasn't loading (#2784)
Some Google Analytics properties don't have defaultProfileId, which was preventing the schema from loading.
2018-09-04 11:29:19 +03:00
Arik Fraimovich
841642b9fc Fix: build Docker image only in tagged versions 2018-08-31 08:42:50 +03:00
Arik Fraimovich
04c97067ac Forgot to enable Docker 🤦 2018-08-30 21:35:31 +03:00
Arik Fraimovich
41113404c0 Remove deprecated argument from docker login command 2018-08-30 20:46:08 +03:00
Arik Fraimovich
bcaa54edf1 Merge branch 'master' of github.com:getredash/redash 2018-08-30 20:45:47 +03:00
Arik Fraimovich
a6d501a394 More improvements to CircleCI configuration (#2777)
* Moved configuration to `.circleci/config.yml` as the documentation for V2 suggests.
* Created a dedicated Docker Compose configuration (in `.circleci/docker-compose.yml`) to remove volumes configuration as this is not supported with CircleCI's Docker executer.
* Fix the Docker image build and tarball packing jobs to work and use correct version.
2018-08-30 20:19:52 +03:00
Arik Fraimovich
e4305e05ad Updates to CircleCI 2 configuration (#2774)
* Remove references to Gitter
* Move integration tests to their own workflow and run only on master branch
* Fix error in integration tests configuration
* Update names of stages
2018-08-29 19:34:47 +03:00
Arik Fraimovich
84f1218849 Remove references to Gitter 2018-08-29 12:04:43 +03:00
Benjamin Forehand Jr
99dd4ddca2 Initial update to circleci v2 config. (#2672) 2018-08-29 11:19:25 +03:00
Arik Fraimovich
6f26b9638b Merge pull request #2769 from kravets-levko/bug/dashboard-parameters-not-updated
Date/time params not working as global param
2018-08-29 09:50:11 +03:00
Zsolt Kocsmárszky
72632be04d Remove unnecessary X at the end of the query search (#2736) 2018-08-28 21:56:12 +02:00
Jannis Leidel
bfd128413c Add server-side sorting to dashboard list. (#2760)
Fix #2771. Refs #2731.
2018-08-28 20:45:26 +02:00
Jannis Leidel
bc15c0b6d1 Sort queries in descending order. (#2759)
Refs #2731.
2018-08-28 20:27:35 +02:00
Levko Kravets
636276c9c4 getredash/redash#2730 2018-08-28 14:11:56 +03:00
Arik Fraimovich
57e4496ea5 Merge pull request #2754 from kravets-levko/bug/dashboard-widgets-crumble
Widgets crumble when trying to move / resize a widget
2018-08-27 21:18:31 +03:00
Arik Fraimovich
bd7ce3a2ce Merge pull request #2734 from Yossi-a/master
handling rows with "length" field with forOwn method
2018-08-27 18:42:29 +03:00
Arik Fraimovich
8ef89177ff Merge pull request #2761 from getredash/init_cleanup
Remove unnecessary init methods.
2018-08-24 00:05:47 +03:00
Alison
82af372583 Throw error when non-owner tries to add a user to dashboard permissions (#2650)
Add error message when non owner tries to add a user to a dashboard

Fixes #2592

REDASH_FEATURE_SHOW_PERMISSIONS_CONTROL has to be true for this to be applicable.

Operation threw a 403 Forbidden error before this change but it is in the console not shown to the user.
2018-08-23 20:51:08 +02:00
Alison
341a68c7d4 Propagate query execution errors from Celery tasks properly (#2713)
Refs https://github.com/mozilla/redash/issues/458
2018-08-23 20:33:43 +02:00
Jannis Leidel
8fa2a6649a Remove unnecessary init methods. 2018-08-23 20:29:40 +02:00
Levko Kravets
c6cb6061e3 getredash/redash#2494 Widgets crumble when trying to move / resize a widget 2018-08-20 12:27:36 +03:00
Jannis Leidel
4d2df72f1f Merge pull request #2750 from getredash/search-route-reload
Reload the route when using the app header search input.
2018-08-16 18:35:05 +02:00
Jannis Leidel
038966a39a Merge pull request #2741 from sjakthol/fix-alerts
fix broken query selection in alert page
2018-08-16 18:09:41 +02:00
Jannis Leidel
9044de6142 Merge pull request #2742 from nasmithan/embed-parameters-query-test-fix
Fix query_results for Embedded Parameters (removed deprecated to_dict function)
2018-08-16 17:57:35 +02:00
Jannis Leidel
b746c433ea Reload the route when using the app header search input. 2018-08-16 17:49:25 +02:00
Jannis Leidel
a0e8c3d2e5 Merge pull request #2729 from combineads/master
Fix: support unicode in dashboard search
2018-08-15 19:24:12 +02:00
Jannis Leidel
6ef6a2f484 Merge pull request #2735 from kocsmy/fix/remove-unnecessary-space
Remove space between text and :
2018-08-13 19:11:13 +02:00
Nathan Smith
5581e48474 Change from deprecated to_dict to query.query_text 2018-08-10 14:11:57 -06:00
Sami Jaktholm
a251d8fab0 fix broken query selection in alert page
The following error occurs when a query is selected in the
alert page:

> TypeError: "item.getQueryResultPromise is not a function"

This is because .onQueryHandler() is given a plain object instead of a
Query when a query is selected from the dropdown.

These changes fix the issue by wrapping the plain object into a Query
object before calling .getQueryResultPromise() on it.
2018-08-10 22:31:59 +03:00
Zsolt Kocsmarszky
6ecb215896 Remove space between text and : 2018-08-10 16:58:17 +02:00
Yossi Ayun
df4b34c179 handling rows with "length" field with forOwn method 2018-08-09 22:31:48 +03:00
Byunghwa Yun
e3f20abf16 Fix: support unicode in dashboard search 2018-08-09 12:00:16 +09:00
Arik Fraimovich
1cafcc1eac Merge pull request #2724 from getredash/users-unicode
Fix: support unicode in users search
2018-08-07 18:02:20 +03:00
Arik Fraimovich
f6aab04a4b Fix: support unicode in users search 2018-08-07 17:51:46 +03:00
Arik Fraimovich
674a689400 Update v5-beta release date. 2018-08-06 21:51:33 +03:00
Arik Fraimovich
7e0e498d33 Update CHANGELOG for v5beta 2018-08-06 18:31:57 +03:00
Arik Fraimovich
a1c566fea7 Merge branch 'master' of github.com:getredash/redash 2018-08-06 16:18:06 +03:00
Arik Fraimovich
4f7cb89e91 Update CHANGELOG for v5-beta. #2700 2018-08-06 16:17:28 +03:00
Arik Fraimovich
035b26b631 Merge pull request #2722 from getredash/es-fix
Fix: don't send source_content_type
2018-08-06 16:13:01 +03:00
Arik Fraimovich
a3e0990143 Fix: don't send source_content_type - instead use GET body with content type header 2018-08-06 16:03:48 +03:00
Arik Fraimovich
0772b12f19 Merge pull request #2720 from getredash/users
Fix #2718: query search is broken.
2018-08-05 18:20:46 +03:00
Arik Fraimovich
f3fed27383 Merge branch 'master' into users 2018-08-05 18:20:21 +03:00
Arik Fraimovich
573865f1cc Fix #2718: query search is broken. 2018-08-05 18:19:07 +03:00
Arik Fraimovich
1e6d6bbeb3 Merge pull request #2715 from getredash/users
Improve users list page
2018-08-05 18:10:15 +03:00
Arik Fraimovich
b89bb392ce Fix: enable/disable wasn't working on users list. 2018-08-05 18:09:14 +03:00
Arik Fraimovich
e4dba1ca8e Switch more strings to unicode. 2018-08-05 17:58:29 +03:00
Arik Fraimovich
2e08d8deb4 Reset to page 1 when updating search string. 2018-08-05 17:58:09 +03:00
Arik Fraimovich
1676d34af6 Fix: make sure paginator component reflects current page number. 2018-08-05 17:57:55 +03:00
Arik Fraimovich
f96a0f338d Use unicode strings. 2018-08-05 16:34:43 +03:00
Arik Fraimovich
226dd65d53 Update users handlers tests. 2018-08-05 16:14:24 +03:00
Arik Fraimovich
188467ec64 Switch to sqlalchemy_utils.EmailType 2018-08-05 16:14:12 +03:00
Arik Fraimovich
2d4983a224 Show correct empty state when no users found. 2018-08-05 14:56:41 +03:00
Arik Fraimovich
629f61772f Use new users search API. 2018-08-05 14:51:39 +03:00
Arik Fraimovich
deaa891eb2 Merge pull request #2712 from kravets-levko/feature/date-range-params
Date/Time Range parameter type
2018-08-05 14:03:30 +03:00
Arik Fraimovich
351e0f8fdb Merge pull request #2719 from maxv/closing-input-tag
Remove closing input tags
2018-08-05 13:59:02 +03:00
maxv
3ecec4ba8b Remove closing input tags 2018-08-04 11:02:44 +03:00
Levko Kravets
a2ca793ddd getredash/redash#2643 Date/Time Range parameter type 2018-08-03 12:24:23 +03:00
Arik Fraimovich
5eb280ef01 Update users list to be paginated and sortable. 2018-08-01 23:28:57 +03:00
Arik Fraimovich
d7946dafd6 Link to user page from group users list. 2018-08-01 23:28:02 +03:00
Arik Fraimovich
bdff248dd7 Fix: dashboards list page wasn't updated to new paginator API. 2018-08-01 23:27:27 +03:00
Arik Fraimovich
c6b129d726 Move order_results helper to redash.handlers.base. 2018-08-01 23:27:12 +03:00
Arik Fraimovich
1468d6e257 Change CaseInsensitiveComparator to support all operations. 2018-08-01 23:26:52 +03:00
Arik Fraimovich
a014df36d8 Merge pull request #2686 from jezdez/serverside
Implement server side pagination and sorting for queries lists
2018-08-01 16:55:40 +03:00
Arik Fraimovich
06ad89f75b Merge pull request #2710 from kocsmy/design/ant-to-redash
Update Ant variables to fit Redash's style
2018-08-01 12:23:40 +03:00
Zsolt Kocsmarszky
692e7f9547 Use more variables 2018-08-01 10:58:14 +02:00
Zsolt Kocsmarszky
03262867fe Merge branch 'master' into design/ant-to-redash 2018-08-01 10:39:39 +02:00
Zsolt Kocsmarszky
8eb9ae604e Working version of overwrite (not in component level) 2018-07-31 16:23:43 +02:00
Zsolt Kocsmarszky
9bb8ec2f66 Adjust input colors to match 2018-07-31 14:32:38 +02:00
Zsolt Kocsmarszky
340184a796 Adjust input color 2018-07-31 14:18:12 +02:00
Zsolt Kocsmarszky
f0502ba088 Refine input design 2018-07-31 14:14:29 +02:00
Arik Fraimovich
44014d7eab Merge pull request #2482 from matsumo/add_chatwork_destination
add support ChatWork Alert Destination.
2018-07-31 15:13:29 +03:00
Arik Fraimovich
6b671817a2 Merge pull request #2649 from getredash/js-style-guides
Add references to Airbnb's style guides in contribution guide.
2018-07-31 15:11:27 +03:00
Arik Fraimovich
5da481e2c3 Merge pull request #2709 from getredash/format-button
Move format button next Add New Param button.
2018-07-31 15:10:16 +03:00
Arik Fraimovich
40c8cef821 Move format button next add new param button. 2018-07-31 15:09:23 +03:00
Zsolt Kocsmarszky
13d891bac3 Move styling import to main.less and add var overwrites 2018-07-31 14:07:01 +02:00
Arik Fraimovich
73f7476434 Merge pull request #2678 from kravets-levko/feature/add-parameter-dialog
Explicit "Add Parameter" Button in Query Editor
2018-07-31 14:26:42 +03:00
Arik Fraimovich
8017893c00 Merge. 2018-07-31 14:23:58 +03:00
Levko Kravets
d1ddc4631d getredash/redash#2644 CR1 2018-07-31 14:12:02 +03:00
Arik Fraimovich
a94f2efc80 Fix keyboard shortcut and update the tooltip. 2018-07-31 14:11:10 +03:00
Arik Fraimovich
0127799ec7 Merge with master. 2018-07-31 14:10:47 +03:00
Levko Kravets
e2313e67b6 getredash/redash#2644 Explicit "Add Parameter" Button in Query Editor 2018-07-31 14:06:31 +03:00
Arik Fraimovich
50c37c0469 Use unicode for default message template. 2018-07-31 13:38:23 +03:00
Arik Fraimovich
c6f75ddbb2 Merge pull request #2513 from kyoshidajp/support_location_in_bq_dataset
Add location property to BigQuery data source settings
2018-07-31 13:03:22 +03:00
Arik Fraimovich
85230e3cc3 Merge pull request #2616 from kravets-levko/feature/pie-colors
Pie chart: sectors colors
2018-07-31 13:00:11 +03:00
Arik Fraimovich
ccaf849328 Add schedule & created_at to allowed order_by values for queries. 2018-07-31 11:39:35 +03:00
Arik Fraimovich
494f43b997 Show null duration as '-'. 2018-07-31 11:39:19 +03:00
Arik Fraimovich
f9e2895f16 Merge pull request #2664 from kravets-levko/bug/dashboard-indefinite-spinner
Dashboard shows a spinner when query failed to load
2018-07-30 22:49:36 +03:00
Arik Fraimovich
92bdac0ee2 Merge pull request #2697 from kravets-levko/feature/datetime-current-time
Date/Time parameters: dynamic default value (current date/time)
2018-07-30 14:59:48 +03:00
Levko Kravets
b19dec08d0 getredash/redash#2602 CR1 2018-07-30 11:56:02 +03:00
Levko Kravets
9926359c45 getredash/redash#2602 Dashboard shows a spinner when query failed to load 2018-07-30 11:41:47 +03:00
Levko Kravets
b0f0b49d1c getredash/redash#2642 Date/Time parameters: dynamic default value (current date/time) 2018-07-30 11:18:08 +03:00
Arik Fraimovich
016166c193 Merge pull request #2626 from kravets-levko/feature/query-page-messages
Show real status when loading cached query result
2018-07-29 15:49:38 +03:00
Arik Fraimovich
dd2f24f976 Merge pull request #2458 from kyoshidajp/get_all_tables_in_bq
Get all tables in the BigQuery
2018-07-29 15:11:46 +03:00
Arik Fraimovich
f89d64e467 Merge pull request #2663 from ariarijp/improve-spreadsheets
Set column name implicitly when column name is blank
2018-07-29 14:50:12 +03:00
Arik Fraimovich
02e6edf111 Bump version 2018-07-26 17:42:08 +03:00
Arik Fraimovich
18768885f2 Fix status page layout 2018-07-26 17:33:09 +03:00
Katsuhiko YOSHIDA
5ca59a5002 Change the way to get the default location 2018-07-26 08:09:57 +09:00
Arik Fraimovich
25ae7b4a88 Merge pull request #2698 from getredash/small-07-2018
Make sure we return distinct data source values
2018-07-25 20:26:58 +03:00
Arik Fraimovich
1f01fe2f39 Make sure we return distinct data source values 2018-07-25 19:38:15 +03:00
Arik Fraimovich
d70bcfd615 Merge pull request #2695 from kravets-levko/feature/better-datetime-inputs
Improve Date/DateTime type parameters
2018-07-25 16:27:32 +03:00
Levko Kravets
94da0d90b9 getredash/redash#2642 CR1 2018-07-25 16:15:49 +03:00
Levko Kravets
487dd6b88d getredash/redash#2642 Improve Date/DateTime type parameters 2018-07-25 15:00:09 +03:00
Arik Fraimovich
01b3d428c3 Merge pull request #2315 from yuua/fix_hive_type_match
Fix: pyHive type matches
2018-07-25 13:38:13 +03:00
Arik Fraimovich
d30dd63656 Merge pull request #2694 from getredash/small-07-2018
Block users with disposable email addresses
2018-07-25 13:28:54 +03:00
Arik Fraimovich
3c7dd064ef Block users with temporary domains 2018-07-25 13:06:26 +03:00
Arik Fraimovich
058a7ca368 Merge pull request #2693 from getredash/small-07-2018
Enable search function in Query Editor.
2018-07-25 13:00:16 +03:00
Arik Fraimovich
10ddb73385 Enable search function in Query Editor. 2018-07-25 12:59:41 +03:00
Arik Fraimovich
27dfa3d8ae Merge pull request #2692 from getredash/small-07-2018
Fix: Query.search method was missing
2018-07-25 12:57:40 +03:00
Arik Fraimovich
2390343c67 Fix: Query.search method was missing 2018-07-25 12:57:10 +03:00
Arik Fraimovich
2c3067bdfd Merge pull request #2691 from getredash/small-07-2018
Fix the recent queries API endpoint.
2018-07-25 12:55:20 +03:00
Arik Fraimovich
2e9ef66cbc Fix: Google Spreadsheets tests 2018-07-25 12:42:36 +03:00
Arik Fraimovich
a05c4b3b20 Merge pull request #2687 from denisov-vlad/safe-yaml
YAML: changed load to safe_load
2018-07-25 12:38:35 +03:00
Arik Fraimovich
895786d129 Fix the recent queries API endpoint. 2018-07-24 12:01:41 +03:00
Arik Fraimovich
011142fabb Add fsevents to optional dependencies 2018-07-24 12:01:03 +03:00
Vladislav Denisov
e4af1e6534 yandex_metrika: changed load to safe_load 2018-07-19 17:43:51 +03:00
Arik Fraimovich
25de0b9dab Merge pull request #2514 from atharvai/gsheets_parse_fix_2504
Update value parsing for google spreadsheets source
2018-07-19 12:02:36 +03:00
Jannis Leidel
b86715c7fa Implement frontend for server side pagination and sorting.
Also:

- Adds page size select tag list.
- Adds clear button to search input.
- Shows search also on “my” page.
2018-07-18 22:55:25 +02:00
Jannis Leidel
2af926703a Implement server side sorting and new search.
- Redirect the old search API handler.
- Sort by specific database columns or relationships.
- Allow showing “my” queries per tag as well.
2018-07-18 22:55:19 +02:00
Jannis Leidel
2f09497797 Let the search class methods use the main all_queries base query. 2018-07-18 21:45:43 +02:00
Jannis Leidel
16ea4be157 Add optional property to query class with the lowercase name for easier sorting. 2018-07-18 21:45:42 +02:00
Jannis Leidel
823a681131 Add outerjoins to be able to sort queries by related columns. 2018-07-18 21:45:42 +02:00
Jannis Leidel
08b59c4485 Extend live paginator to handle ordering as well. 2018-07-18 21:44:55 +02:00
Jannis Leidel
486a6068ac Update SQLAlchemy. 2018-07-18 21:44:55 +02:00
Levko Kravets
d651fdc2b7 getredash/redash#2644 CR1 2018-07-18 13:01:41 +03:00
Levko Kravets
2c0ff53894 getredash/redash#2644 Explicit "Add Parameter" Button in Query Editor 2018-07-18 12:27:51 +03:00
Levko Kravets
10ff9ec86e getredash/redash#2601 Show real status when loading cached query result 2018-07-18 12:11:13 +03:00
Arik Fraimovich
35bb558f44 Merge pull request #2573 from getredash/discovery
Tagging and favorites for Queries and Dashboards
2018-07-17 15:49:39 +03:00
Arik Fraimovich
3d39e5cb29 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-07-17 15:41:13 +03:00
Arik Fraimovich
24404b3b86 Fix queries list URLs. 2018-07-17 15:40:50 +03:00
Arik Fraimovich
a9cb08d0d6 Merge branch 'master' into discovery 2018-07-17 15:33:58 +03:00
Arik Fraimovich
12436430cc Styling update. 2018-07-17 15:32:24 +03:00
Arik Fraimovich
9ed7b3d3d4 Queries List empty state. 2018-07-17 15:29:25 +03:00
Arik Fraimovich
9f467f7a2b Support .jsx files. 2018-07-17 13:47:43 +03:00
Arik Fraimovich
052a60512b Implement dashboard list empty states. 2018-07-17 13:47:35 +03:00
Arik Fraimovich
2ff3d8985c Merge pull request #2570 from StantonVentures/2569_fix_query_pagination_alignment
fixes query pagination alignment
2018-07-16 17:59:52 +03:00
Arik Fraimovich
b1139d4891 Merge pull request #2584 from StantonVentures/alison_2581_only
keep query result pagination out of scroll
2018-07-16 17:56:12 +03:00
Arik Fraimovich
197e7d5882 Merge pull request #2640 from kravets-levko/feature/query-editor-shortcuts
Keyboard shortcut to collapse query editor/schema browser
2018-07-16 17:36:34 +03:00
Arik Fraimovich
f771b514e6 Merge pull request #2682 from getredash/now
Add Zeit's now support to have preview builds for every PR
2018-07-15 15:45:19 +03:00
Arik Fraimovich
27128d73fe Trigger new Now deploy. 2018-07-15 15:00:17 +03:00
Arik Fraimovich
fa1b71bc27 Add Zeit now support 2018-07-15 13:39:57 +03:00
Arik Fraimovich
f78ab06369 Merge pull request #2647 from ariarijp/improve-script
Improve Script Query Runner
2018-07-12 23:37:23 +03:00
Arik Fraimovich
64f6c9319d Fix: favorite/unfavorite in dashboards list wasn't working. 2018-07-12 23:34:47 +03:00
Arik Fraimovich
d76a9cd22f Fix loading of favorites in header and home. 2018-07-12 22:55:39 +03:00
Arik Fraimovich
d6f8d7af5a Eagerly load dashboard user to avoid N+1 queries. 2018-07-12 22:48:42 +03:00
Arik Fraimovich
00c413c2d8 Merge pull request #2674 from getredash/chromelogger
Add support for the Chrome Logger extension
2018-07-12 13:41:18 +03:00
Arik Fraimovich
6be54defb4 Styling improvements. 2018-07-12 13:16:42 +03:00
Arik Fraimovich
20261d0632 Add support for ChromeLogger extension 2018-07-12 11:37:35 +03:00
Arik Fraimovich
522c08a7a4 package-lock.json update 2018-07-11 18:26:01 +03:00
Arik Fraimovich
3fa2db4085 Fix linting errors 2018-07-11 18:25:43 +03:00
Arik Fraimovich
8343f2c8b2 Remove usage of underscopre. 2018-07-11 18:03:27 +03:00
Arik Fraimovich
df25bbfa90 Merge with latest master 2018-07-11 17:53:53 +03:00
Arik Fraimovich
5e35156d22 Handle duplicate favorite calls. 2018-07-11 16:35:48 +03:00
Arik Fraimovich
34c2292a98 Merge pull request #2653 from StantonVentures/alison_1411
Add redash db size to status page
2018-07-11 16:02:36 +03:00
Arik Fraimovich
2438475ba2 Merge pull request #2583 from kocsmy/design/query-header-improvements
Query header improvements on widgets
2018-07-11 16:01:28 +03:00
Arik Fraimovich
b91a2d14fd Merge pull request #2668 from ariarijp/upgrade-bootstrap-script
Upgrade bootstrap script to Redash 4.0.1
2018-07-11 15:52:25 +03:00
Arik Fraimovich
d7310f5be9 Merge pull request #2671 from kocsmy/design/save-some-space
Save some space
2018-07-11 15:52:07 +03:00
Zsolt Kocsmarszky
873f51c5f6 Save some space (10px) when we have parameters section present on the query results 2018-07-09 16:10:24 +02:00
Arik Fraimovich
ac1fc6bdd8 Merge pull request #2669 from tdawber/feature/athena_query_id
Store Athena query id with result metadata
2018-07-09 15:40:28 +03:00
tdawber
28f7c048bb Store Athena query id with result metadata 2018-07-09 16:40:49 +10:00
tdawber
8d80077aa8 Store Athena query id with result metadata 2018-07-09 16:39:22 +10:00
tdawber
101c09fcae Store Athena query id with result metadata 2018-07-09 16:37:05 +10:00
tdawber
9141850304 Store Athena query id with result metadata 2018-07-09 16:18:33 +10:00
Alison
e7d8491f0b update to .execute() from .query() 2018-07-08 09:53:12 -05:00
ariarijp
0568d40b27 Upgrade to Redash 4.0.1 2018-07-08 17:22:29 +09:00
Zsolt Kocsmarszky
77831d1c91 Adjust query header colors 2018-07-06 14:37:40 +02:00
Levko Kravets
3772612a97 Pie chart: sectors colors 2018-07-06 14:53:57 +03:00
Zsolt Kocsmarszky
58e21c9807 Merge https://github.com/getredash/redash into design/query-header-improvements 2018-07-06 13:48:27 +02:00
Alison
abcf5b729a pep8 fixes 2018-07-04 17:00:17 -05:00
Alison
7b40d01f51 refactor based on codeclimate review of PR 2018-07-04 16:57:10 -05:00
Alison
f597c04214 change where prettySize happens 2018-07-04 02:04:55 -05:00
ariarijp
53c20e2250 Set column name implicitly when column name is blank 2018-07-03 16:02:41 +09:00
ariarijp
c5f27253b0 Change message for empty output 2018-07-02 21:36:15 +09:00
Arik Fraimovich
140d0ae14f Merge pull request #2638 from kravets-levko/bug/dashboard-not-rendering-empty-query
Dashboard stops rendering when adding widget with empty query
2018-07-02 12:07:42 +03:00
Arik Fraimovich
383d5d3725 Merge pull request #2658 from StantonVentures/alison_2657
delaying schema filtering to improve responsiveness
2018-07-02 12:04:21 +03:00
Arik Fraimovich
e0ce7f8d7d Merge pull request #2648 from Pablohn26/master
Update datasource documentation links
2018-07-01 23:51:00 +03:00
Arik Fraimovich
4b0a2c04df Merge pull request #2639 from ariarijp/add-tests-for-spreadsheets
Add tests for SpreadSheets
2018-07-01 12:35:57 +03:00
Arik Fraimovich
6ce522a863 Update CONTRIBUTING.md 2018-07-01 12:32:46 +03:00
Alison
84302e3d86 delaying schema filtering to improve responsiveness
fixes #2657
2018-06-30 18:57:47 -05:00
Alison
cf29fa09f3 add the size of Redash DB to the status page
fixes #1411
2018-06-30 14:18:02 -05:00
Arik Fraimovich
50b9e99f90 Add references to Airbnb's styleguides in contribution guide. 2018-06-29 21:39:58 +03:00
Pablo Hinojosa
01678beebf Fix URL 2018-06-29 17:53:47 +02:00
Pablo Hinojosa
0a6a807964 Fix URL 2018-06-29 17:52:55 +02:00
Pablo Hinojosa
964eff017c Fix URL 2018-06-29 17:51:37 +02:00
Pablo Hinojosa
7f4e7a947e Update dashboard-list.html 2018-06-29 17:50:32 +02:00
Pablo Hinojosa
ca04732d3f Update datasource documentation links 2018-06-29 17:45:38 +02:00
ariarijp
389c6cb3c5 Improve Script Query Runner 2018-06-29 00:03:17 +09:00
Arik Fraimovich
75df88a8ff Merge pull request #2632 from mozilla/react-eslint
react rules for eslint
2018-06-28 16:32:57 +03:00
Levko Kravets
0c95b47de4 getredash/redash#2402 Keyboard shortcut to collapse query editor/schema browser 2018-06-28 15:10:53 +03:00
ariarijp
bad7e92cce Add tests for SpreadSheets 2018-06-28 18:57:41 +09:00
Levko Kravets
ead1e07e99 getredash/redash#2534 Dashboard stops rendering when adding widget with empty query 2018-06-28 11:50:35 +03:00
Allen Short
b712253276 react rules for eslint 2018-06-28 01:56:57 -05:00
Arik Fraimovich
71531c9910 Merge pull request #2635 from ariarijp/add-tests-for-query-results
Add tests for Query Results
2018-06-28 09:55:25 +03:00
ariarijp
8a4eab1c93 Add tests for Query Results 2018-06-28 15:37:11 +09:00
Alison
5846a5733c Merge pull request #2 from getredash/master
pulling from upstream to SV fork
2018-06-27 10:28:02 -05:00
Zsolt Kocsmarszky
d1d72b30c6 Make visualization name as dark as query name 2018-06-27 16:37:50 +02:00
Zsolt Kocsmarszky
ba980d6b87 Merge branch 'master' into design/query-header-improvements 2018-06-27 16:29:12 +02:00
Arik Fraimovich
258d506215 Add missing comma 2018-06-27 16:04:33 +03:00
Arik Fraimovich
b759536146 Add events to favorites 2018-06-27 15:58:13 +03:00
Arik Fraimovich
91ff4aee63 Move imports to correct location. 2018-06-27 15:52:11 +03:00
Arik Fraimovich
fa6e2cc264 Merge pull request #2546 from washort/upstream-react
Configuration for incorporating React components
2018-06-27 15:20:00 +03:00
Arik Fraimovich
c719d336a9 Reset search term when it's empty. 2018-06-27 11:54:34 +03:00
Arik Fraimovich
720da3310f Merge pull request #2610 from gabrieldutra/master
Fix export query results output file name
2018-06-26 21:53:27 +03:00
Arik Fraimovich
ed8b022e78 Merge pull request #2613 from ariarijp/improve-script
Improve Script Query Runner
2018-06-26 21:52:33 +03:00
Arik Fraimovich
2eefdc1da3 Updated queries screen (& unified API). 2018-06-26 21:50:16 +03:00
Arik Fraimovich
5e4cf5ba30 Add filtering by tags/search to favorites. 2018-06-26 21:48:50 +03:00
Arik Fraimovich
18f51890d2 Only show tags/search on all queries list. 2018-06-25 23:25:10 +03:00
Arik Fraimovich
b0de1be815 Better dashboards GET api (pagination, filter by tags, search by name) 2018-06-25 23:22:28 +03:00
Arik Fraimovich
f39b6b7073 Tags service. 2018-06-25 23:20:30 +03:00
Allen Short
e2a5bb0a06 eslint fix 2018-06-25 12:14:30 -05:00
Arik Fraimovich
bfeeb23443 Update package-lock.json file 2018-06-25 12:13:26 -05:00
Arik Fraimovich
9eb51da7ce Remove underscore usage from new files 2018-06-25 12:13:25 -05:00
Allen Short
d6011ede0c switch underscore usages to lodash
There's still one usage of `numberFormat` from `underscore.string`.
2018-06-25 12:13:25 -05:00
Allen Short
c47ad93eb2 humble beginnings with React components 2018-06-25 12:13:25 -05:00
Arik Fraimovich
4384959760 Merge pull request #2619 from StantonVentures/2567_order_datasources_alpha
data source sort case insensitive
2018-06-22 19:49:09 +03:00
Alison
fccba45e36 data source sort case insensitive
#2567
2018-06-22 07:03:51 -05:00
ariarijp
9d2a3133f0 Improve Script Query Runner 2018-06-21 14:45:12 +09:00
Gabriel Dutra
744ccd163a Fix export query results output file name
- regexp `/ /g` will seek for all space ocurrences, not only the first
2018-06-20 20:23:49 -03:00
Arik Fraimovich
4a833a7401 use tags-list component for mobile view as well 2018-06-20 18:52:56 +03:00
Arik Fraimovich
ece80eb1f7 Refactor: create tags list component to be shared between dashboard and queries list page. 2018-06-20 18:45:44 +03:00
Arik Fraimovich
695c342a69 Filter queries by tags. 2018-06-20 18:17:56 +03:00
Arik Fraimovich
97d4df2532 Merge pull request #2606 from denisov-vlad/pyyaml
requirements: added pyyaml
2018-06-20 14:55:18 +03:00
Vladislav Denisov
8cd8650119 requirements: added pyyaml 2018-06-20 12:03:46 +03:00
Arik Fraimovich
6fb7c310be Merge pull request #2574 from mtrbean/patch-1
commit query result to db before evaluating alerts
2018-06-20 10:52:44 +03:00
Arik Fraimovich
d533a05d54 Merge pull request #2604 from ariarijp/improve-spreadsheets
Improve Google Spreadsheets Query Runner
2018-06-20 10:38:33 +03:00
Arik Fraimovich
783ccfd4c0 Merge pull request #2533 from denisov-vlad/metrika
New datasource: Yandex Metrika&AppMetrika
2018-06-20 10:28:11 +03:00
ariarijp
5757b24ea3 Improve Google Spreadsheets Query Runner 2018-06-19 22:29:46 +09:00
Arik Fraimovich
5c1d2c8877 Merge pull request #2542 from emtwo/emtwo/xaxis
Closes #2541: x-axis improvements.
2018-06-19 12:44:56 +03:00
Arik Fraimovich
ff750b0db1 Merge pull request #2590 from ariarijp/remove-redundant-vars
Remove redundant variables
2018-06-18 15:02:45 +03:00
Alison
f4b32249e9 Merge pull request #1 from getredash/master
pull upstream to my fork
2018-06-17 16:26:19 -05:00
ariarijp
f8245f6e3f Remove redundant variables 2018-06-17 23:41:33 +09:00
Arik Fraimovich
c28702a5be Merge pull request #2580 from StantonVentures/master
add break-word wrap to add/edit text box on dashboard
2018-06-17 11:51:38 +03:00
Arik Fraimovich
d101866c91 Merge pull request #2585 from kravets-levko/fix/query-page-tabs
Show data only mode: allow to add and delete visualizations
2018-06-17 11:43:34 +03:00
Arik Fraimovich
6c11326a5d Merge pull request #2578 from ariarijp/fix-create-tables
Fix connection error when you run "create_tables"
2018-06-17 11:38:35 +03:00
Levko Kravets
17a677b6d0 Dashboard: make etire widget header clickable 2018-06-13 21:23:09 +03:00
Zsolt Kocsmarszky
1678155490 Make + New Visualization a button and add nicer icons 2018-06-13 16:57:20 +02:00
Zsolt Kocsmarszky
7be6164684 Hide - if no visualization name 2018-06-13 15:17:36 +02:00
Levko Kravets
418ac1bb68 Show data only mode: allow to add and delete visualizations 2018-06-12 20:03:21 +03:00
Alison
78421f590b keep query result pagination out of scroll 2018-06-11 23:55:24 -05:00
Zsolt Kocsmarszky
bdbeebdf86 Improve the header of the query by moving the visualization name to the first place 2018-06-11 17:19:45 +02:00
Levko Kravets
b521e65800 Discovery: show tags for both published and draft queries 2018-06-11 12:51:21 +03:00
Levko Kravets
a8a0312b72 Discovery: query & dashboard list: fix default browser behavior on click with modifier keys 2018-06-11 12:44:26 +03:00
Levko Kravets
840a7482c8 Discovery: filter queries by tags 2018-06-11 12:16:47 +03:00
Alison
d11638164e add break-word wrap to add/edit text box on dashboard 2018-06-10 09:33:19 -05:00
ariarijp
1efdb6034f Fix connection error when you run "create_tables" 2018-06-10 20:17:53 +09:00
Eric Wong
d0c6e41c9c commit query result to db before evaluating alerts
`check_alerts_for_query` runs on a separate celery queue and needs to see the latest result
2018-06-06 11:22:34 -07:00
Arik Fraimovich
e79dbe8b95 Merge branch 'master' into discovery 2018-06-06 15:35:45 +03:00
Arik Fraimovich
93dffa0c8a Merge with upstream 2018-06-06 15:28:15 +03:00
Arik Fraimovich
deceaa8888 Fix migrations order 2018-06-06 14:59:04 +03:00
Levko Kravets
11f25d8ba4 Tags: edit (query and dashboard page); show tags in a sidebar (dashboard list page) 2018-06-06 14:45:53 +03:00
Arik Fraimovich
69d5eb9020 tag listing APIs implemented 2018-06-06 14:45:05 +03:00
Zsolt Kocsmarszky
7ac90fe81e Fix tag layouts on headers 2018-06-06 14:45:05 +03:00
Levko Kravets
23deab7b7c Tags: display on all pages 2018-06-06 14:45:05 +03:00
Zsolt Kocsmarszky
f0342c3c45 tags for queries and dashboards 2018-06-06 14:44:32 +03:00
Arik Fraimovich
3835a8286c Simpler data model for tags. 2018-06-06 14:43:23 +03:00
Arik Fraimovich
a4f61df3fb Fixed add dashboard tags migration 2018-06-06 14:43:23 +03:00
Arik Fraimovich
0d764caafe Proper tags models 2018-06-06 14:43:23 +03:00
Levko Kravets
5081e9d245 Show spinner when loading dashboards and queries on list pages 2018-06-06 14:43:23 +03:00
Zsolt Kocsmarszky
312a73dd8d Style tags for queries and dashboards 2018-06-06 14:43:23 +03:00
Arik Fraimovich
d3240cd71b Fix queries search API 2018-06-06 14:43:23 +03:00
Zsolt Kocsmarszky
2b9dd6b5c0 Adding tags markup for query and dashboard 2018-06-06 14:43:23 +03:00
Levko Kravets
3ac52a2af5 Favorites: restore queries search 2018-06-06 14:43:23 +03:00
Levko Kravets
15baef531c Favorites: restore queries search 2018-06-06 14:43:23 +03:00
Zsolt Kocsmarszky
135cb53909 make entire dashboard and query list row clickable 2018-06-06 14:43:06 +03:00
Arik Fraimovich
f29afe9306 Hide my dashboards/queries when you don't have permission to create them 2018-06-06 14:43:06 +03:00
Arik Fraimovich
9feb7773ce add org_id to favorites 2018-06-06 14:43:06 +03:00
Arik Fraimovich
bcf49a700b Make sure user has access to favorite objects. 2018-06-06 14:43:06 +03:00
Zsolt Kocsmarszky
a782d67a8e add empty states for my queries/dashboard and fav queries/dashboards 2018-06-06 14:43:06 +03:00
Zsolt Kocsmarszky
3fbf518061 add empty condition for dashboard and query dropdown 2018-06-06 14:43:06 +03:00
Levko Kravets
0479aa40b3 Favorites: empty states on dashboards and queries list pages 2018-06-06 14:43:06 +03:00
Zsolt Kocsmarszky
b9db9f0b20 Right aligned control area 2018-06-06 14:41:13 +03:00
Arik Fraimovich
aa756b2be6 Almost complete implementation of favorties backend 2018-06-06 14:41:13 +03:00
Zsolt Kocsmarszky
af40375a78 Nicer styling for lists 2018-06-06 14:40:42 +03:00
Levko Kravets
d385b43915 Favorites: remove unnecessary code 2018-06-06 14:40:42 +03:00
Levko Kravets
54d667e59e Favorites: page for favorite dashboards and queries 2018-06-06 14:40:42 +03:00
Zsolt Kocsmarszky
983e3ba350 Further refine styling for tags 2018-06-06 14:40:42 +03:00
Zsolt Kocsmarszky
875e756236 Massive styling improvements for dashboards, queries and alerts lists 2018-06-06 14:40:42 +03:00
Levko Kravets
56b1e3c7aa Favorites: show favorite dashboards and queries in app header 2018-06-06 14:40:42 +03:00
Zsolt Kocsmarszky
7785538d59 add and fix classes 2018-06-06 14:39:52 +03:00
Zsolt Kocsmarszky
82829d5687 Better queries page... 2018-06-06 14:39:52 +03:00
Levko Kravets
34aaf55463 Favorites: show favorites on homepage instead of recent items 2018-06-06 14:39:52 +03:00
Zsolt Kocsmarszky
e6745683fe Add more details for favourites 2018-06-06 14:39:14 +03:00
Levko Kravets
8c7e62f7ff Favorites: models, control on query list, query page, dashboard list, dashboard pages. 2018-06-06 14:37:52 +03:00
Arik Fraimovich
02628d76f1 API stub for query object. 2018-06-06 14:37:52 +03:00
Arik Fraimovich
64f70cfbe8 Query favorites: API stub. 2018-06-06 14:37:52 +03:00
Zsolt Kocsmarszky
5f1c4e9dce Add base stuff for favourites 2018-06-06 14:37:52 +03:00
Arik Fraimovich
672c86efaa Merge pull request #2549 from coreyhuinker/patch-1
Allow get_tables to see views and v10-style partitioned tables
2018-06-06 11:40:01 +03:00
Arik Fraimovich
8bffc6f45d Merge pull request #2568 from StantonVentures/2567_order_datasources_alpha
sort datasources alphabetically
2018-06-06 11:02:25 +03:00
Arik Fraimovich
52b9333b8d Merge pull request #2572 from StantonVentures/2571_archived_query_menu_line
remove extra menu line if query is archived
2018-06-06 10:59:09 +03:00
Alison
2982d77ff2 remove extra menu line if query is archived
fixes #2571

Sames as https://github.com/mozilla/redash/issues/319 fixed in https://github.com/mozilla/redash/pull/414/
2018-06-05 23:11:19 -05:00
Alison
dda024a8d2 fixes query pagination alignment
fixes #2569

Same as https://github.com/mozilla/redash/pull/413/ which fixes https://github.com/mozilla/redash/issues/320
2018-06-05 22:56:15 -05:00
Alison
ea8951711f sort datasources alphabetically
fixes https://github.com/getredash/redash/issues/2567

Same as https://github.com/mozilla/redash/issues/367
2018-06-05 22:50:35 -05:00
Levko Kravets
204e36730e After saving tags in a dashboard, widgets go into refresh mode 2018-06-05 17:11:52 +03:00
Arik Fraimovich
c86423aea9 Merge pull request #2444 from sjakthol/saml-handle-parse-errors
feat: show error if saml response cannot be parsed
2018-06-03 11:41:50 +03:00
Sami Jaktholm
c7cf3653b8 feat: show error if saml response cannot be parsed
Previously, exceptions from pysaml2 would've caused
a 500 Internal Server Error response to be sent back
to the user. Now, the user is redirected back to login
page which includes an user friendly error message.
2018-06-03 09:42:53 +03:00
Marina Samuel
804603014d Closes #2541: x-axis improvements. 2018-05-31 16:29:39 -04:00
Arik Fraimovich
90d642fbe2 Update the tab name. 2018-05-31 21:25:51 +03:00
Arik Fraimovich
ca1b8f2047 Update chart editor labels 2018-05-31 21:07:12 +03:00
Arik Fraimovich
0a0b53b7e9 Merge pull request #2536 from kravets-levko/feature/chart-formats-and-tooltips-2
Chart: formats for values, labels and tooltips
2018-05-31 19:05:51 +03:00
Arik Fraimovich
131811179b Merge pull request #2564 from getredash/policy
Fix: typo fixes in Policy related code.
2018-05-31 18:42:22 +03:00
Levko Kravets
80295ca1e7 Chart tooltips: use date/time format from config 2018-05-31 18:40:18 +03:00
Arik Fraimovich
d71cdf5dbc Fix: typo fixes in Policy related code. 2018-05-31 18:39:20 +03:00
Arik Fraimovich
65881a0f79 Merge pull request #2562 from getredash/policy
Set currentUser value in users list page & use ng-src when needed
2018-05-31 17:27:29 +03:00
Arik Fraimovich
cc3145f895 Fix: set currentUser value in users list page. 2018-05-31 17:26:03 +03:00
Arik Fraimovich
c6b16b62ab Fix: use ng-src in empty-state. 2018-05-31 17:25:52 +03:00
Arik Fraimovich
f2b49ae7ff Merge pull request #2561 from getredash/policy
Add OrganizationStatus service (and some more)
2018-05-31 15:31:57 +03:00
Arik Fraimovich
3113c9b79e Don't count disabled users in users count 2018-05-31 15:30:41 +03:00
Arik Fraimovich
6a89d5ea1c Add extension point to home page 2018-05-31 15:30:27 +03:00
Arik Fraimovich
b7f221542b Load OrganizationStatus on page load 2018-05-31 15:30:09 +03:00
Arik Fraimovich
cfc3912723 Add OrganizationStatus service and use it in empty state. 2018-05-31 15:28:47 +03:00
Arik Fraimovich
c7614997d9 Merge pull request #2560 from getredash/policy
Introduce Policy object
2018-05-31 11:05:51 +03:00
Arik Fraimovich
b323747aaf Remove unused code. 2018-05-31 10:58:04 +03:00
Arik Fraimovich
64c9e5c963 Add Policy object. 2018-05-31 10:54:40 +03:00
Arik Fraimovich
68e5aec861 Save new dashboard on enter key press. 2018-05-31 10:49:02 +03:00
Arik Fraimovich
617df8e4f6 Merge pull request #2380 from kravets-levko/feature/disable-users
Admin should be able to disable a user
2018-05-31 10:24:12 +03:00
Levko Kravets
75f8b8ae7b getredash/redash#728 Use date/time and number formats only for tooltips 2018-05-30 17:25:30 +03:00
Levko Kravets
3fe8272ce4 getredash/redash#2375 Better error message when trying to disable self user; set disabled user avattar URL on backend and remove profileImage filter 2018-05-28 17:05:39 +03:00
Levko Kravets
ac6d6fc68a getredash/redash#2375 More tests + fix bug 2018-05-28 14:04:08 +03:00
Levko Kravets
2c84a383f3 getredash/redash#2375 Tests 2018-05-28 14:04:08 +03:00
Levko Kravets
6fb5548106 getredash/redash#2375 CR1
- only admin should see disabled users;
- add Disable button to user page;
- escape user name in toastr notifications;
- code cleanup.
2018-05-28 14:04:08 +03:00
Levko Kravets
84fb683bf3 getredash/redash#2375 Disabled users should not be able to login 2018-05-28 14:04:08 +03:00
Levko Kravets
40aee8465b getredash/redash#2375 Show gray icon for disabled users 2018-05-28 14:04:08 +03:00
Levko Kravets
d40aa09bcf getredash/redash#2375 Admin should be able to disable a user 2018-05-28 14:04:08 +03:00
Arik Fraimovich
6d1a67fee3 Merge pull request #2554 from kyoshidajp/show_deleting_target_item_name
Display name to be delete
2018-05-28 07:15:17 +03:00
Katsuhiko YOSHIDA
621718c3a0 Change the deleting message format 2018-05-28 06:35:32 +09:00
Katsuhiko YOSHIDA
a7e1b2bf68 Display name to be delete 2018-05-28 05:49:39 +09:00
Arik Fraimovich
7f3db4d7b6 Merge pull request #2510 from kyoshidajp/confirm_delete
Display confirmation dialog when deleting a item
2018-05-27 08:41:40 +03:00
Vladislav Denisov
8101077371 yandex_metrika: new appmetrika logo 2018-05-25 17:29:53 +03:00
Vladislav Denisov
8422a3657a metrika: added yaml support 2018-05-25 16:56:27 +03:00
Corey Huinker
76e86817c8 remove blank line 2018-05-21 15:37:00 -04:00
Corey Huinker
95593481a5 Update pg.py 2018-05-21 15:26:46 -04:00
Corey Huinker
fcd984aca6 Allow get_tables to see views and v10-style partitioned tables
And it does so with just one query.
2018-05-21 15:18:59 -04:00
Zsolt Kocsmarszky
07519596b8 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-21 17:53:16 +02:00
Zsolt Kocsmarszky
3b2bfb9177 fix queries and dashboard list for smaller screens 2018-05-21 17:53:00 +02:00
Arik Fraimovich
a6bc7c02bf Merge pull request #2509 from kyoshidajp/show_custom_date_format
Show custom date format on settings page
2018-05-19 17:49:05 +03:00
Arik Fraimovich
387ca14973 Merge pull request #2526 from deecay/fix-pivot
Fix pivot hide control in dashboards
2018-05-18 18:43:38 +03:00
Arik Fraimovich
ead7635a3d Merge pull request #2511 from kocsmy/fixes/styling-adjustments
Fixing signed_out.html template
2018-05-18 18:40:10 +03:00
Arik Fraimovich
7ebcce5370 Merge pull request #2518 from kocsmy/design/styling-improvements
Design improvements
2018-05-17 19:08:09 +03:00
Zsolt Kocsmarszky
00a2dfd728 Add readme about illustration license 2018-05-17 14:32:16 +02:00
Zsolt Kocsmarszky
6ed03247ca Merge https://github.com/getredash/redash into design/styling-improvements 2018-05-17 14:25:43 +02:00
Vladislav Denisov
fcafc40be3 yandex_metrika: codeclimate fixes #2 2018-05-17 10:58:32 +03:00
Arik Fraimovich
23df796740 Merge pull request #2537 from sieben/remove_trailing_semicolon
Remove trailing semicolon
2018-05-15 15:55:01 +03:00
Rémy Léone
309a8bd958 Remove trailing semicolon 2018-05-15 14:21:14 +02:00
Levko Kravets
2ed67005b9 Remove unused option 2018-05-15 12:47:13 +03:00
Arik Fraimovich
deb523ebd5 Merge pull request #2523 from innovia/hotfix/boolean-nullable-formator
Frontend: fix boolean field with null value display as null.
2018-05-15 11:32:18 +03:00
Arik Fraimovich
acc27f0579 Change migration to be safe to run along with other migrations 2018-05-14 22:02:10 +03:00
Vladislav Denisov
ef3c837a97 metrika: codeclimate fixes 2018-05-14 17:43:53 +03:00
Vladislav Denisov
4a62ab7ce4 Yandex Metrika query runner added 2018-05-14 17:21:58 +03:00
Arik Fraimovich
7553eef024 Remove dashboards recents tests 2018-05-14 11:02:25 +03:00
Arik Fraimovich
2279d32b3b Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-10 22:10:46 +03:00
Levko Kravets
d3e7393bad Tags: edit (query and dashboard page); show tags in a sidebar (dashboard list page) 2018-05-10 21:51:39 +03:00
Arik Fraimovich
6cd9fe0b52 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-10 21:34:37 +03:00
Arik Fraimovich
42657ed95f tag listing APIs implemented 2018-05-10 20:59:19 +03:00
Zsolt Kocsmarszky
bd6fac074c Fix tag layouts on headers 2018-05-10 19:34:25 +03:00
Levko Kravets
c0294cdd0a Tags: display on all pages 2018-05-10 19:25:37 +03:00
Zsolt Kocsmarszky
b0f6a78ebb Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 19:04:16 +03:00
Zsolt Kocsmarszky
3b4bd648fe tags for queries and dashboards 2018-05-10 19:04:10 +03:00
Arik Fraimovich
0060c8a54f Simpler data model for tags. 2018-05-10 18:58:58 +03:00
Arik Fraimovich
b1ffcbad79 Fixed add dashboard tags migration 2018-05-10 18:07:40 +03:00
Arik Fraimovich
52bda8d117 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-10 18:00:59 +03:00
Arik Fraimovich
08611c009c Proper tags models 2018-05-10 18:00:54 +03:00
Zsolt Kocsmarszky
8081ea83bc Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 17:50:51 +03:00
Levko Kravets
6c0afc9c6f Show spinner when loading dashboards and queries on list pages 2018-05-10 17:25:59 +03:00
Zsolt Kocsmarszky
3e16df9092 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 16:54:25 +03:00
Zsolt Kocsmarszky
8c4381a44d Style tags for queries and dashboards 2018-05-10 16:54:15 +03:00
Arik Fraimovich
59f2cb94ab Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-10 14:15:19 +03:00
Arik Fraimovich
5b0a192784 Fix queries search API 2018-05-10 14:15:06 +03:00
Zsolt Kocsmarszky
1aa3dd15b3 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 14:05:55 +03:00
Zsolt Kocsmarszky
629117d2f0 Adding tags markup for query and dashboard 2018-05-10 14:05:46 +03:00
Levko Kravets
078f24ad6b Favorites: restore queries search 2018-05-10 14:05:18 +03:00
Levko Kravets
f4a36410c0 Favorites: restore queries search 2018-05-10 14:01:42 +03:00
Zsolt Kocsmarszky
4dc2c44c01 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 13:17:30 +03:00
Zsolt Kocsmarszky
1186f31337 make entire dashboard and query list row clickable 2018-05-10 13:17:15 +03:00
Arik Fraimovich
5cc7b88235 Hide my dashboards/queries when you don't have permission to create them 2018-05-10 13:11:59 +03:00
Arik Fraimovich
6bbf6809cf Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-10 12:51:54 +03:00
Arik Fraimovich
28a08526e3 add org_id to favorites 2018-05-10 12:51:11 +03:00
Arik Fraimovich
7fe90675bd Make sure user has access to favorite objects. 2018-05-10 12:41:58 +03:00
Zsolt Kocsmarszky
0958f591d1 add empty states for my queries/dashboard and fav queries/dashboards 2018-05-10 12:32:36 +03:00
Zsolt Kocsmarszky
33314abde7 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-10 12:00:56 +03:00
Zsolt Kocsmarszky
3a59f6cd0f add empty condition for dashboard and query dropdown 2018-05-10 12:00:45 +03:00
Levko Kravets
eb71a655e8 Favorites: empty states on dashboards and queries list pages 2018-05-10 11:58:26 +03:00
Zsolt Kocsmarszky
4bb785eab4 Right aligned control area 2018-05-10 11:30:22 +03:00
deecay
19bfae3741 Fix pivot hide control in dashboards 2018-05-10 03:26:36 -04:00
Arik Fraimovich
afd3dd9860 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-09 21:43:00 +03:00
Arik Fraimovich
66737f0dc0 Almost complete implementation of favorties backend 2018-05-09 21:42:50 +03:00
Zsolt Kocsmarszky
f374661ad9 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-09 20:19:28 +03:00
Zsolt Kocsmarszky
ea6dbf643a Nicer styling for lists 2018-05-09 20:19:15 +03:00
Levko Kravets
24fe52753e Favorites: remove unnecessary code 2018-05-09 20:15:34 +03:00
Arik Fraimovich
8665747111 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-09 20:10:30 +03:00
Levko Kravets
fcc75cbd16 Favorites: page for favorite dashboards and queries 2018-05-09 20:07:58 +03:00
Zsolt Kocsmarszky
3974adeacd Further refine styling for tags 2018-05-09 18:43:26 +03:00
Zsolt Kocsmarszky
7dc5d53934 Massive styling improvements for dashboards, queries and alerts lists 2018-05-09 18:27:40 +03:00
Arik Fraimovich
96a90722f1 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-09 16:55:47 +03:00
Levko Kravets
a4e52bcc96 Favorites: show favorite dashboards and queries in app header 2018-05-09 16:53:12 +03:00
Zsolt Kocsmarszky
3abeb6cf96 add and fix classes 2018-05-09 14:35:08 +03:00
Zsolt Kocsmarszky
057894aaf4 Merge branch 'discovery' of https://github.com/getredash/redash into discovery 2018-05-09 14:20:48 +03:00
Zsolt Kocsmarszky
c9ae48f466 Better queries page... 2018-05-09 14:20:12 +03:00
Levko Kravets
78092e525f Favorites: show favorites on homepage instead of recent items 2018-05-09 14:19:28 +03:00
Arik Fraimovich
189b7889a3 Merge branch 'discovery' of github.com:getredash/redash into discovery 2018-05-09 14:08:18 +03:00
Zsolt Kocsmarszky
32e9b4c71c Merge branch 'discovery' of https://github.com/getredash/redash into discovery
# Conflicts:
#	client/app/pages/queries/query.html
2018-05-09 13:42:18 +03:00
Zsolt Kocsmarszky
6c30f821f7 Add more details for favourites 2018-05-09 13:40:09 +03:00
Levko Kravets
8d99b7380c Favorites: models, control on query list, query page, dashboard list, dashboard pages. 2018-05-09 13:39:47 +03:00
Arik Fraimovich
20f7405f0e API stub for query object. 2018-05-09 12:58:53 +03:00
Arik Fraimovich
e32da8dbe3 Query favorites: API stub. 2018-05-09 12:57:30 +03:00
Zsolt Kocsmarszky
dbc2d984b3 Add base stuff for favourites 2018-05-09 12:56:00 +03:00
Ami Mahloof
ad0a9813e4 Frontend: fix boolean field with null value display as null. 2018-05-09 11:22:16 +03:00
Levko Kravets
e12d539234 getredash/redash#728 Chart: formats for values, labels and tooltips 2018-05-07 22:18:26 +03:00
Zsolt Kocsmarszky
87000ee4d6 Refine spacing and image size 2018-05-07 14:29:55 +03:00
Arik Fraimovich
414fabadf6 Merge pull request #2520 from kyoshidajp/filter_datasources
Filter data sources in a data source input area
2018-05-05 22:00:26 +03:00
Katsuhiko YOSHIDA
d6bebe1dcf Filter data sources 2018-05-05 21:18:51 +09:00
Zsolt Kocsmarszky
66fd9531cc Remove fullstop 2018-05-05 00:26:54 +02:00
Zsolt Kocsmarszky
045230d189 Add Illustration to empty states 2018-05-05 00:25:07 +02:00
Zsolt Kocsmarszky
7bd79124b7 Adjust spacing around Group header 2018-05-04 22:50:51 +02:00
Zsolt Kocsmarszky
11d52949a7 Overwrite toast notification colors to better match our color scheme 2018-05-04 22:48:28 +02:00
Zsolt Kocsmarszky
10fc89fc39 Increase query editor height 2018-05-04 22:26:51 +02:00
Zsolt Kocsmarszky
2e414db0b1 Fix query header on smaller screens 2018-05-04 22:16:23 +02:00
atharva.inamdar
48acc4c7a7 fix code climate lint issue with whitespace 2018-05-04 11:47:36 +01:00
atharva.inamdar
a0d039066d fix tests for google spreadsheets 2018-05-04 11:21:55 +01:00
Katsuhiko YOSHIDA
bd1c5fa9e1 Add location property to BigQuery data source settings 2018-05-04 16:05:54 +09:00
atharva.inamdar
61106dec14 getredash/redash#2504 Update value parsing for google spreadsheets source 2018-05-03 16:35:24 +01:00
Katsuhiko YOSHIDA
26238ccfc1 Confirm delete a data source 2018-05-03 21:23:01 +09:00
Katsuhiko YOSHIDA
3e371d3ffd Confirm delete a destination 2018-05-03 20:48:53 +09:00
Zsolt Kocsmarszky
038933f1f1 signed_out template fixes 2018-05-03 13:15:13 +02:00
Katsuhiko YOSHIDA
8243b6caed Confirm delete a query snippet 2018-05-03 19:11:00 +09:00
Katsuhiko YOSHIDA
813a5db958 Refactoring: extract method about date format config 2018-05-03 18:17:02 +09:00
Katsuhiko YOSHIDA
971e501561 Show custom date format on settings page 2018-05-03 18:03:05 +09:00
Arik Fraimovich
a287fbf128 Remove old style files 2018-05-03 09:38:13 +03:00
Arik Fraimovich
d43bfa9d10 Version bump to 4.0.1 2018-05-02 17:18:00 +03:00
Arik Fraimovich
b4d7a25c74 Update CHANGELOG.md 2018-05-02 17:13:46 +03:00
Katsuhiko YOSHIDA
3021c7c0a9 Refactor to fix Code Climate error 2018-05-02 22:50:24 +09:00
Katsuhiko YOSHIDA
4ffcd6390b Fix pep8 error 2018-05-02 22:02:04 +09:00
Arik Fraimovich
c8a3985f16 Merge pull request #2506 from kocsmy/fixes/overflowing-data-source-box
A nicer way of hiding overflowing text
2018-05-02 14:27:59 +03:00
Zsolt Kocsmarszky
3274a5d670 Add data source name to box title 2018-05-02 13:27:26 +02:00
Arik Fraimovich
8037c21a61 Merge pull request #2496 from akiray03/sorted-redshift-schema-info
Fixes the order of columns in the schema browser when Redshift is used as a DataSource.
2018-05-02 14:14:38 +03:00
Arik Fraimovich
ee8f6c1c71 Merge pull request #2472 from tonyjiangh/fix/disable_view_only_fork
Disable fork button for view_only user
2018-05-02 14:11:55 +03:00
Arik Fraimovich
bce0e8e547 Merge pull request #2507 from getredash/resolution
Log user's screen resolution
2018-05-02 14:09:52 +03:00
Arik Fraimovich
cddf398df4 Log user's screen resolution 2018-05-02 14:05:57 +03:00
Arik Fraimovich
bdb8682646 Merge pull request #2501 from getredash/fix-dashboard-filters
Improve dashboard refresh UX: show previous data while refreshing.
2018-05-02 14:02:59 +03:00
Arik Fraimovich
54bef2c05f Remove console.log call 2018-05-02 14:02:43 +03:00
Zsolt Kocsmarszky
d326f2b46c A nicer way of hiding overflowing text 2018-05-02 12:33:21 +02:00
Arik Fraimovich
06a7a7e65b Merge pull request #2505 from kocsmy/fixes/overflowing-data-source-box
Hide overflowing content
2018-05-02 13:26:31 +03:00
Zsolt Kocsmarszky
fc0a074a07 Hide overflowing content 2018-05-02 12:18:36 +02:00
Arik Fraimovich
44a330a4e6 Merge pull request #2499 from kocsmy/design/design-improvements
Design improvements
2018-05-02 10:36:02 +03:00
Zsolt Kocsmarszky
ab284efac1 Fix contianer width 2018-04-30 16:00:57 +02:00
Arik Fraimovich
9d4fd75ea8 Fix: update tests. 2018-04-30 11:16:27 +03:00
Arik Fraimovich
4a9b93a131 Improve dashboard refresh UX: show previous data while refreshing.
Also refactored the Widget (client side) model to accomodate the necessary changes.
2018-04-30 11:01:36 +03:00
Zsolt Kocsmarszky
31a48cfe2b Subtle background change 2018-04-29 14:59:27 +02:00
Zsolt Kocsmarszky
9df98b1c29 Fix login screen on smaller viewport 2018-04-29 14:59:11 +02:00
Akira Yumiyama
d1bc2fb649 Fixes the order of columns in the schema browser when Redshift is used as a DataSource. 2018-04-27 17:56:04 +09:00
Arik Fraimovich
df774b0304 Merge pull request #2492 from kravets-levko/bug/cohort-js-error
Cohort bug: JS error (value not wrapped with moment instance)
2018-04-26 15:04:44 +03:00
Levko Kravets
7ac0ba52dd Cohort bug: JS error (value not wrapped with moment instance) 2018-04-26 14:00:56 +03:00
Arik Fraimovich
b2decc895f Merge pull request #2487 from getredash/fix-dashboard-filters
Fix: dashboard filters setting wasn't persisting.
2018-04-25 11:46:45 +03:00
Arik Fraimovich
b12f3fb133 Merge pull request #2469 from PublicI/fix/null-number-format
Display nulls and empty values as blank in table numeric fields
2018-04-24 22:53:57 +03:00
Arik Fraimovich
fc30f141ec Merge pull request #2489 from dbravender/2488-alert-date-column
Fixes #2488
2018-04-24 22:33:42 +03:00
Dan Bravender
277eb35aea Fixes #2488 2018-04-24 13:50:44 -04:00
Arik Fraimovich
10bc9402b7 Fix: dashboard filters setting wasn't persisting. 2018-04-24 15:50:33 +03:00
Arik Fraimovich
16a07e19cc Merge pull request #2485 from kocsmy/fixes/new-readme-gif
Update readme gif + some smaller content improvements
2018-04-24 15:12:17 +03:00
Zsolt Kocsmarszky
479b34faed Make gif bigger 2018-04-24 14:04:31 +02:00
Zsolt Kocsmarszky
19eed1580e Refine content 2018-04-24 14:03:42 +02:00
Zsolt Kocsmarszky
d312dffe2c Update readme 2018-04-24 13:58:58 +02:00
matsumo
c426ef323d add support ChatWork Alert Destination. 2018-04-23 17:14:01 +09:00
Arik Fraimovich
90677b2b51 Merge pull request #2475 from ariarijp/fix-pip-version
To avoid "cannot import name main" error
2018-04-22 13:44:28 +03:00
ariarijp
df9bd38c08 To avoid "cannot import name main" error 2018-04-20 11:39:36 +09:00
Hao Jiang
be86d659ed Add $scope.canForkQuery() to data only view 2018-04-20 10:01:04 +09:00
Hao Jiang
66a4315ce2 Move dropdown disabled a tag color change code to disable class 2018-04-20 10:00:46 +09:00
Hao Jiang
b896dd461d Disable fork for view_only user 2018-04-19 10:44:52 +09:00
Chris Zubak-Skees
615aea7678 Merge remote-tracking branch 'upstream/master' into fix-null-number-format 2018-04-17 12:35:07 -04:00
Chris Zubak-Skees
10a9978b04 Fix style in PR branch 2018-04-17 12:34:20 -04:00
Arik Fraimovich
3f3a86eac3 Update CHANGELOG.md 2018-04-16 11:50:46 +03:00
Arik Fraimovich
43a66fae82 Merge branch 'master' of github.com:getredash/redash 2018-04-16 11:21:24 +03:00
Arik Fraimovich
ed739e1292 Update version 2018-04-16 11:21:14 +03:00
Katsuhiko YOSHIDA
ffa70185be Get all tables in the BigQuery 2018-04-15 22:59:37 +09:00
Arik Fraimovich
212c7eed46 Merge pull request #2457 from kyoshidajp/fix_td_syntax_error
Fix syntax error
2018-04-15 10:45:46 +03:00
Katsuhiko YOSHIDA
ce50042407 Fix syntax error 2018-04-14 09:46:05 +09:00
Arik Fraimovich
e17e36f9e4 Update CHANGELOG.md 2018-04-12 15:40:32 +03:00
Arik Fraimovich
0bc570d741 Merge pull request #2407 from alon710/master
adds mattermost destination
2018-04-12 15:17:58 +03:00
Arik Fraimovich
7465c74392 Merge pull request #2428 from toru-takahashi/master
Improve a query failure message for Treasure Data Runner
2018-04-12 15:14:24 +03:00
Arik Fraimovich
a8a91109ee Merge pull request #2452 from kravets-levko/bug/firefox-widget-height-continuously-increases
Firefox: widget height continuously increases
2018-04-11 22:29:54 +03:00
Arik Fraimovich
add60c2552 Merge pull request #2451 from kravets-levko/bug/page-layout-lost
Wrong page layout if route change was cancelled
2018-04-11 22:29:26 +03:00
Chris Zubak-Skees
f055e6750a Displays nulls and blanks in numeric fields as empty strings 2018-04-10 19:03:57 -04:00
Levko Kravets
4dc8826beb Firefox, dashboard, auto-height feature: in some cases (loader shown and widget has params, but possibly other cases) widget start continuously growing 2018-04-10 21:08:27 +03:00
Levko Kravets
d35bbdb257 getredash/redash#2401 Wrong page layout if route change cancelled 2018-04-10 15:42:05 +03:00
Arik Fraimovich
8636c3310d Merge pull request #2449 from getredash/botocore-update
Update botocore version.
2018-04-09 23:02:13 +03:00
Arik Fraimovich
eddd9419a4 Merge pull request #2450 from getredash/map-names
Update map visualizations names.
2018-04-09 22:57:40 +03:00
Arik Fraimovich
2d08314982 Update Choropleth visualization name. 2018-04-09 22:57:22 +03:00
Arik Fraimovich
28d69b0c60 Update map visualizations names. 2018-04-09 22:56:10 +03:00
Arik Fraimovich
7f76400550 Update botocore version.
Fixes #2400.
2018-04-09 22:55:20 +03:00
Arik Fraimovich
f551b348a7 Merge pull request #2447 from getredash/patches
Fixes to new dashboard layout engine
2018-04-09 09:47:43 +03:00
Toru Takahashi
b1567f4d8d Add safe guarding with .get() 2018-04-09 01:29:18 +09:00
Arik Fraimovich
d18c94a587 Merge pull request #2420 from fmy/patch-1
use MongoClient for ReplicaSet
2018-04-08 15:43:56 +03:00
Arik Fraimovich
f75c142981 Merge pull request #2434 from tonyjiangh/fix/funnel_typo
Fix funnel setting page typo
2018-04-08 15:39:09 +03:00
Arik Fraimovich
0959281a01 Merge pull request #2443 from deecay/choropleth-fullscreen
Choropleth: Add fullscreen control
2018-04-08 15:38:07 +03:00
Arik Fraimovich
96a0a512f3 Merge pull request #2446 from getredash/patches
Update pymongo version to support newer MongoDB versions
2018-04-08 15:33:06 +03:00
Levko Kravets
9899abfe6a Fix: some legacy dashboards got their widgets misplaced when using auto height. 2018-04-08 15:32:24 +03:00
Arik Fraimovich
d02386488c Fix: dashboard refresh was broken due to introduction of track by to ng-repeat. 2018-04-08 15:32:14 +03:00
Arik Fraimovich
5f25bc480c Update pymongo version to support newer MongoDB versions 2018-04-08 15:26:35 +03:00
deecay
07b5003c6f Map: Add fullscreen control 2018-04-07 14:37:44 +09:00
Arik Fraimovich
8aba5db862 Merge pull request #2441 from tnetennba3/pronoun-fix
Changed "his" to "their"
2018-04-06 21:22:44 +03:00
deecay
b3ee25079e Choropleth: Add fullscreen control 2018-04-06 13:08:28 -04:00
tnetennba3
85179fd07b Changed "his" to "their" 2018-04-05 16:27:20 +01:00
Hao Jiang
390360cc4e Fix funnel setting page typo 2018-04-03 08:11:53 +09:00
Toru Takahashi
7edd5b9731 Improve a query failure message for Treasure Data Runner 2018-04-01 15:45:28 +09:00
Fumiya Karasawa
c681a50b19 use MongoClient for ReplicaSet
MongoReplicaSetClient is deprecated and will be removed in future.

See http://api.mongodb.com/python/current/api/pymongo/mongo_replica_set_client.html
```
MongoReplicaSetClient will be removed in a future version of PyMongo.

Changed in version 3.0: MongoClient is now the one and only client class for a standalone server, mongos, or replica set. It includes the functionality that had been split into MongoReplicaSetClient: it can connect to a replica set, discover all its members, and monitor the set for stepdowns, elections, and reconfigs.
```
2018-03-29 17:46:27 +09:00
Arik Fraimovich
8df2391a77 Merge pull request #2376 from valentin2105/master
Fix docker-entrypoint broke for other name than "postgres"
2018-03-27 09:16:14 +03:00
Valentin Ouvrard
0982e56ed0 fix entrypoint create_table() func. 2018-03-26 10:01:58 +11:00
Arik Fraimovich
0cb995bb35 Merge pull request #2413 from getredash/fix-bq
Fix: (BigQuery) UDF URI was used even if empty
2018-03-25 14:39:30 +03:00
Arik Fraimovich
d34d58bf33 Merge pull request #2374 from kravets-levko/feature/choropleth
Choropleth visualization
2018-03-25 14:34:45 +03:00
Arik Fraimovich
c19ff41392 Merge pull request #2406 from kravets-levko/feature/dashboard-gridstack
Replace dashboard engine with gridstack
2018-03-25 14:27:36 +03:00
Arik Fraimovich
abb6e56570 Fix: UDF URI was used even if empty 2018-03-25 14:22:36 +03:00
Arik Fraimovich
a7bba81969 Merge pull request #2412 from deecay/box-hover-fix
Fix: Box plot hover
2018-03-24 21:39:05 +03:00
deecay
6356a75478 Fix: Box plot hover 2018-03-24 20:57:04 +09:00
Levko Kravets
61ef5f9a02 gridstack: add comments, exclude lodash and moment locales from bundle 2018-03-23 19:50:55 +02:00
Levko Kravets
2fbf8926c4 gridstack: optimizations and bugfixes 2018-03-23 19:50:55 +02:00
Levko Kravets
ce9e3fcb35 Replace dashboard engine with gridstack 2018-03-23 19:50:28 +02:00
Arik Fraimovich
ffab6d5ec9 Merge pull request #2411 from getredash/patches
Multiple V4 regression fixes
2018-03-23 19:34:07 +03:00
Levko Kravets
be9bcaeb3d Multiple fixes:
* Fix: line chart with category x-axis: when some values missing, wrong hints displayed on hover
* Fix: second Y-axis not displayed when stacking enabled
* Set of dashboard improvements and bug fixes
    - set minimal height of widgets to 1 (was 4)
    - bug: for some widgets auto-height wasn't calculated properly (sometimess too small, sometimes too large)
    - bug: for small widgets, top-right menu was cut to widgets bounds
    - bug: with opened top-right menu widgets with auto-height started "dancing"
    - bug: at some point auto-height feature was disabling by itself (in fact - it depends on `angular-grindter`s internal processes)
    - fix: widget with empty contents had extra 40px of white space (paddings of container)
* Add scrollbars to pivot table widgets
* Fix: 100% CPU loading caused page lags
2018-03-23 19:25:21 +03:00
Arik Fraimovich
d140e0418f Fix: dashboard was reloading when clicking on refresh. 2018-03-23 19:22:23 +03:00
Arik Fraimovich
6685cb9e21 Load dashboard refresh rate from URL. 2018-03-23 19:22:06 +03:00
Arik Fraimovich
2f24cff33c Plotly: increase Y value accuracy. 2018-03-23 19:20:28 +03:00
Arik Fraimovich
193a6cce3f Fix: only try merging query object if it exists. 2018-03-23 19:18:28 +03:00
Arik Fraimovich
17951504f0 Change: apply time limit to alert status checking task. 2018-03-23 19:17:57 +03:00
Arik Fraimovich
ccffe70359 MSSQL Fix: UUID fields were detected as booleans. 2018-03-23 19:17:13 +03:00
Arik Fraimovich
503d6cecd0 DynamoDB fix: always return counter as a number rather than string. 2018-03-23 19:16:54 +03:00
Arik Fraimovich
6fbe06d262 Report Celery queue size. 2018-03-23 19:16:24 +03:00
Arik Fraimovich
2394f3fbe5 Add events property to Organization model. 2018-03-23 19:16:14 +03:00
Arik Fraimovich
cb815f3c8e Render safe HTML by default in tables to remain backward compatible. 2018-03-23 19:15:47 +03:00
Arik Fraimovich
e6f6c02f90 Fix: saving widget was sending too much data to the server, sometimes making saving fail. 2018-03-23 19:13:40 +03:00
Arik Fraimovich
565e66715f Fix: Fork button was shown in data only view, but wasn't working. 2018-03-23 19:13:15 +03:00
Arik Fraimovich
549de1355a Change: show friendly names in dynamic forms labels. 2018-03-23 19:10:26 +03:00
Arik Fraimovich
d892ed48cc Merge pull request #2387 from idalin/fix_ldap_login
fix no login form in ldap login page #2386
2018-03-22 14:04:30 +02:00
alon710
b96204654b adds mattermost dest 2018-03-22 00:29:49 +02:00
Arik Fraimovich
3c75c2bb60 Update CONTRIBUTING.md 2018-03-21 16:41:02 +02:00
Arik Fraimovich
db020576ed Merge pull request #2385 from kocsmy/fixex/cassandra-scylla-images
Add missing Cassandra and ScyllaDB images
2018-03-19 22:13:48 +02:00
idalin
5a93da3177 fix no login form in ldap login page #2386 2018-03-14 13:59:50 +08:00
Zsolt Kocsmarszky
d16285d239 Add missing images 2018-03-12 20:45:45 +01:00
Arik Fraimovich
0410d834d1 Merge pull request #2382 from deecay/webpack-ignore
Webpack: ignore vim swap files
2018-03-11 15:02:44 +02:00
deecay
b79abf52fd Webpack: ignore vim swap files 2018-03-10 17:48:11 +09:00
Levko Kravets
6a61057813 getredash/redash#2317 CR1
- cache GeoJSON to avoid multiple HTTP requests;
- allow to edit map bounds;
- optimize update map calls (do not re-render it every time);
- UI/X imporvements.
2018-03-08 14:46:09 +02:00
Arik Fraimovich
1a75d49041 Merge pull request #2379 from getredash/fix_empty_states
Change: close metadata database connection early in the execute query Celery task
2018-03-08 11:17:30 +02:00
Arik Fraimovich
c054731794 Change: close metadata database connection early in the execute query
Celery task. This to prevent the task holding an idle connection for
a long period of time, while waiting for the query to finish.
2018-03-08 11:06:15 +02:00
Arik Fraimovich
a824bd5da3 Merge pull request #2378 from getredash/fix_empty_states
Empty state screen fix: show connect data source link only to admins
2018-03-08 09:53:29 +02:00
Arik Fraimovich
e1ff31718e fix circle.yml 2018-03-08 09:46:45 +02:00
Arik Fraimovich
797b5582ac Fix: show connect data source link only to admins 2018-03-08 09:43:30 +02:00
Valentin Ouvrard
452904398f Fix docker-entrypoint broke for Other name than "postgres" 2018-03-08 10:04:29 +11:00
Levko Kravets
517f95fa01 Better resize handling 2018-03-07 09:14:24 +02:00
Levko Kravets
d5ee9cd007 Use data from current record for tooltip and popup contents 2018-03-06 21:40:27 +02:00
Levko Kravets
5918253022 Add option to align legend text
Remove Leaflet attribution
2018-03-06 21:24:39 +02:00
Levko Kravets
2f30dbf645 getredash/redash#2317 Choropleth visualization 2018-03-06 20:42:48 +02:00
Arik Fraimovich
88deb5fc47 Merge pull request #2372 from kravets-levko/fix/dancing-widgets
Fix: dashboard "dancing" widgets (when auto-height enabled)
2018-03-06 15:07:14 +02:00
Levko Kravets
27c7e86297 Fix: dashboard "dancing" widgets (when auto-height enabled) 2018-03-06 14:42:15 +02:00
Arik Fraimovich
051f12c712 Fix tags regex in circle.yml 2018-03-05 12:37:31 +02:00
Arik Fraimovich
f9ab83ed80 Merge pull request #2369 from getredash/query-refresh
Add: configuration for query refresh intervals.
2018-03-05 11:28:40 +02:00
Arik Fraimovich
c24bfe82e0 Update changelog. 2018-03-05 11:22:49 +02:00
Arik Fraimovich
4f27de3252 Add: configuration for query refresh intervals. 2018-03-05 11:22:08 +02:00
Arik Fraimovich
bf86d17d56 Stop spamming Docker Hub 2018-03-04 15:36:14 +02:00
Arik Fraimovich
54e23a7c84 Update CHANGELOG and update version. 2018-03-04 15:11:54 +02:00
Arik Fraimovich
6049e2df17 Merge pull request #2356 from kravets-levko/fix/dashboard-auto-height
Dashboard fixes and improvements
2018-03-04 14:50:48 +02:00
Arik Fraimovich
025af41616 Merge pull request #2260 from Top20Talent/master
Extend the Prometheus query runner to support the range query
2018-03-04 10:57:30 +02:00
Arik Fraimovich
d80f93a59d Merge pull request #2355 from jezdez/glue-table-paginator-upstream
Use a paginator when iterating over glue tables
2018-03-04 10:56:56 +02:00
Arik Fraimovich
5aa4b28d53 Merge pull request #2354 from jezdez/redash-extensions
Add a Redash extension system based on Python entrypoints.
2018-03-04 10:56:08 +02:00
Arik Fraimovich
6a072dd33a Merge pull request #2363 from kravets-levko/bug/query-page-unscrollable
Query page long visualization is unscrollable
2018-03-04 10:53:33 +02:00
Levko Kravets
67995085c6 getredash/redash#2361 2018-03-02 13:12:45 +02:00
Levko Kravets
9295a9d8fb Dashboard: save only changed widgets 2018-03-01 16:28:34 +02:00
Levko Kravets
43cd24927f gridsterAutoHeight: disable auto-height when widget resized by user 2018-03-01 14:46:53 +02:00
Jannis Leidel
6b41644557 Add a Redash extension system based on Python entrypoints.
This is along the lines of what Flask does for CLI plugins:

  http://flask.pocoo.org/docs/0.12/cli/#cli-plugins

The API allows specifying Python callbacks that receive the
Redash Flask app as the only argument and allow extending
the Redash process with the usual Flask API as needed. This
does not cover front-end specific extensions (yet).
2018-02-28 23:37:03 +01:00
Blake Imsland
dceb58cd79 Use a paginator when iterating over glue tables
Without this you only get the first 100 tables in the glue database
2018-02-28 22:10:54 +01:00
Arik Fraimovich
570187fc1f Merge pull request #2353 from kocsmy/fixes/filter-spacing-on-dashboards
Fix small spacing glitch on dashboard widgets
2018-02-28 18:16:09 +02:00
Zsolt Kocsmarszky
ca4663e3a4 fix small spacing glitch on dashboard widgets 2018-02-28 17:08:55 +01:00
Arik Fraimovich
6e097d5cec Merge pull request #2352 from kravets-levko/bug/query-result-column-names
Cast column names to string
2018-02-28 17:08:28 +02:00
Arik Fraimovich
2c95231fd7 Merge pull request #2334 from tonyjiangh/feat/funnel_visualization
Add funnel visualization
2018-02-28 17:06:37 +02:00
Hao Jiang
0d80156eec Rename visualization options for review 2018-02-28 23:44:42 +09:00
Levko Kravets
08c709c2ec getredash/redash#1960 Cast column names to string; code style fixes 2018-02-28 13:28:15 +02:00
Arik Fraimovich
bb28b2f0fb Merge pull request #2350 from getredash/auth
Authentication related settings improvements
2018-02-28 12:16:11 +02:00
Arik Fraimovich
0e4313de52 Merge pull request #2349 from kravets-levko/fix/dashboard-issues
Fix/dashboard issues
2018-02-27 23:22:59 +02:00
Arik Fraimovich
e76e29df24 Merge pull request #2348 from kocsmy/fixes/prometheus-logo
Add missing prometheus and snowflake logos
2018-02-27 23:21:09 +02:00
Arik Fraimovich
d1062ce0c4 Properly generate login URLs. 2018-02-27 23:14:57 +02:00
Arik Fraimovich
9ddf3745b8 Configuration for Google Apps. 2018-02-27 23:10:10 +02:00
Arik Fraimovich
0eefc7b592 join array filter. 2018-02-27 23:09:21 +02:00
Arik Fraimovich
bea035025e Callout sections css. 2018-02-27 23:09:12 +02:00
Arik Fraimovich
33aa7b72b7 Enable debug mode for Flask. 2018-02-27 23:09:00 +02:00
Arik Fraimovich
ca54d23f92 Remove unused LESS code. 2018-02-27 23:08:43 +02:00
Levko Kravets
7d6244a322 Revisit default options; set auto-height for Table viz by default 2018-02-27 18:25:57 +02:00
Levko Kravets
f61a74bbee Fix: 'Cannot read property of null' JS error when going away from dashboard page 2018-02-27 18:25:21 +02:00
Levko Kravets
7d258908c6 getredash/redash#2108 Fix: length limit increased 2018-02-27 18:24:26 +02:00
Zsolt Kocsmarszky
0e53356589 add missing prometheus and snowflake logos 2018-02-27 16:52:33 +01:00
Hao Jiang
aa43dcdb2b Add hover text for full step name 2018-02-27 23:22:41 +09:00
Arik Fraimovich
093c48505a Merge pull request #2347 from kravets-levko/fix/download-dataset-dropup
Fix: download dataset dropup is being cut off
2018-02-27 15:30:57 +02:00
Levko Kravets
c19ef632aa Fix: download dataset dropup is being cut off 2018-02-27 15:24:37 +02:00
Arik Fraimovich
bb1455ec71 Merge pull request #2346 from getredash/auth
Authentication fixes (SAML and login page)
2018-02-26 21:11:52 +02:00
Arik Fraimovich
09af43c4a7 remove unnecessary test. 2018-02-26 20:57:21 +02:00
Arik Fraimovich
35594ecb00 Always show login page and generate URLs with url_for.
Close #1259, #2235.
2018-02-26 20:46:27 +02:00
Arik Fraimovich
3044c77309 Make SAML work in MULTI_ORG mode. 2018-02-26 20:40:28 +02:00
Hao Jiang
0632044573 Handle corner cases 2018-02-26 22:21:05 +09:00
jubel
e6551e9774 remove the type 2018-02-26 14:58:30 +08:00
Arik Fraimovich
11d09b2f09 Fix empty-state logic for MULTI_ORG mode 2018-02-25 11:49:07 +02:00
Arik Fraimovich
8676b846c2 Add support for symlinks in webpack config 2018-02-25 11:13:54 +02:00
Arik Fraimovich
d4f98aa7f7 Merge pull request #2337 from ariarijp/upgrade-sqlparse
Upgrade sqlparse to 0.2.4
2018-02-24 21:29:08 +02:00
Arik Fraimovich
35458e846c Merge pull request #2338 from kravets-levko/fix/table-columns-nowrap
Custom CSS based on column type
2018-02-24 21:28:10 +02:00
jubel
49e9133fed style adjustment 2018-02-24 16:35:10 +08:00
Levko Kravets
5dd76674ff getredash/redash#2215 Custom CSS based on column type 2018-02-23 11:19:07 +02:00
Hao Jiang
8bdd5ff662 Fix sort order 2018-02-23 09:25:04 +09:00
Hao Jiang
9e68b36de6 Add support for selecting column to sort 2018-02-23 09:18:37 +09:00
Hao Jiang
e78bfb2e9a Add support for column mapping 2018-02-23 09:15:56 +09:00
ariarijp
f5d4ca85d8 Upgrade sqlparse to 0.2.4
Add test case for /api/queries/format
2018-02-23 01:24:34 +09:00
Arik Fraimovich
c65b637bc4 Merge pull request #2336 from kravets-levko/fix/settings-tabs-order
Explicitly set order of tabs on Settings page
2018-02-22 15:31:52 +02:00
Levko Kravets
062efe349f Explicitly set order of tabs on Settings page 2018-02-22 15:16:09 +02:00
Arik Fraimovich
696f46d64b Merge pull request #2252 from kocsmy/design/empty-states
Empty states for Home, Dashboards, Queries and Alerts
2018-02-22 11:26:13 +02:00
Arik Fraimovich
42b88d9a32 Ignore archived objects. 2018-02-22 11:04:13 +02:00
Arik Fraimovich
3a840fcc5d Implement empty states logic. 2018-02-22 11:02:12 +02:00
Hao Jiang
a333abcaa5 Use ColorPalette instead 2018-02-22 08:44:39 +09:00
Hao Jiang
d583f6f273 Add funnel visualization 2018-02-21 22:41:31 +09:00
Arik Fraimovich
a1aeb1d614 Merge pull request #2330 from getredash/arikfr-patch-1
Sort widgets by col/row to make sure they are placed correctly
2018-02-21 14:49:10 +02:00
Arik Fraimovich
bd13b78e21 Merge pull request #2320 from kravets-levko/bug/few-bugfixes
Few bugfixes
2018-02-20 22:41:05 +02:00
Arik Fraimovich
4d44be76ac Create <empty-state> component. 2018-02-20 22:29:07 +02:00
Levko Kravets
8cd758cfb6 Update 'absoluteUrl' function 2018-02-20 22:13:48 +02:00
Arik Fraimovich
9a1077d192 Merge branch 'master' into design/empty-states 2018-02-20 21:09:43 +02:00
Arik Fraimovich
bc4f174e22 Sort widgets by col/row to make sure they are placed correctly 2018-02-20 20:45:32 +02:00
Levko Kravets
046595825c Rename: fullUrl -> absoluteUrl 2018-02-19 23:19:03 +02:00
Arik Fraimovich
e0c5eabdd5 Merge pull request #2324 from kravets-levko/bug/type-of-first-table
User shouldn't be able to change the type of the first table
2018-02-19 23:07:26 +02:00
Arik Fraimovich
06e9d192ef Merge pull request #2325 from benmanns/patch-1
Reduce restart to unless-stopped for Redis and Postgres
2018-02-19 22:33:43 +02:00
Arik Fraimovich
906c8fc767 Merge pull request #2282 from kocsmy/design/improve-default-visualisation-colors
Improve visualisation colors
2018-02-19 22:32:37 +02:00
Benjamin Manns
6149e00c2f Reduce restart to unless-stopped for Redis and Postgres
`restart: always` will cause containers to restart when the machine is rebooted or the docker process restarts. Setting this to `unless-stopped` will mean the container will restart only if the docker process/computer was rebooted without stopping the container first. Otherwise, running `docker-compose stop` and rebooting will cause the docker containers all to start again (and goodbye laptop battery!)

We might also consider `restart: on-failures` which would mean that rebooting would _not_ cause containers to start again unless requested via `docker-compose up`.
2018-02-19 11:07:02 -05:00
Zsolt Kocsmarszky
b053770998 less vivid colors fo charts 2018-02-18 19:55:00 +01:00
Zsolt Kocsmarszky
45b380ca00 Merge branch 'master' into design/improve-default-visualisation-colors 2018-02-18 18:05:56 +01:00
Arik Fraimovich
631dad11d6 Merge pull request #2319 from kravets-levko/feature/server-pages-redesign
Redesign of all pages that are rendered by backend code
2018-02-18 14:53:49 +02:00
Levko Kravets
9647c37285 getredash/redash#2312 2018-02-18 14:08:44 +02:00
Zsolt Kocsmarszky
9e5f749556 Change default visualization colors 2018-02-17 18:21:11 +01:00
Zsolt Kocsmarszky
c69795c0cd Merge branch 'master' into design/improve-default-visualisation-colors 2018-02-17 17:47:02 +01:00
Levko Kravets
339f5537c6 Remove code related to hidden text widgets + UI improvements 2018-02-16 21:25:29 +02:00
Levko Kravets
d2c5be5bd5 Replace with window.location 2018-02-16 21:04:45 +02:00
Levko Kravets
21b753f9b5 Bug fixed: empty page when trying to open public dashboard 2018-02-16 20:59:53 +02:00
Levko Kravets
a28a6ea127 Bug: Invite user / Reset password links should be full (include shema and host) 2018-02-16 20:39:18 +02:00
Levko Kravets
38da3e9fef Add SSO login buttons to invite user page; UI fixes 2018-02-16 13:32:40 +02:00
Levko Kravets
f1aad2545e redesign of all pages that are rendered by backend code 2018-02-15 21:49:11 +02:00
yuua
edd709838d Fix: pyHive type matches 2018-02-14 11:52:17 +09:00
Zsolt Kocsmarszky
2ed446be80 less neon green 2018-02-02 22:41:47 +01:00
Zsolt Kocsmarszky
caf0070d14 Merge branch 'master' into design/improve-default-visualisation-colors 2018-02-01 22:35:01 +01:00
Zsolt Kocsmarszky
c9b28785fb Improve visualisation colors 2018-02-01 22:32:30 +01:00
jubel
135af39fd4 support the range query of until now 2018-01-26 14:22:27 +08:00
jubel
8a2676701b extend the prometheus query runner to support the range query 2018-01-26 13:16:28 +08:00
Zsolt Kocsmarszky
e97fd7da5b add spacing between empty state window and content 2018-01-23 15:28:43 +01:00
Zsolt Kocsmarszky
3477a5540a add icons and fix smaller screen layout 2018-01-23 15:27:24 +01:00
Zsolt Kocsmarszky
490c8f38d8 Make section full width, remove double titles and minor styling improvements 2018-01-22 22:24:30 +01:00
Zsolt Kocsmarszky
5c5c08ae39 Add empty states for home, dashboards, queries and alerts 2018-01-22 22:03:06 +01:00
1351 changed files with 124633 additions and 47837 deletions

View File

@@ -0,0 +1,12 @@
FROM cypress/browsers:node14.0.0-chrome84
ENV APP /usr/src/app
WORKDIR $APP
COPY package.json package-lock.json $APP/
COPY viz-lib $APP/viz-lib
RUN npm ci > /dev/null
COPY . $APP
RUN ./node_modules/.bin/cypress verify

177
.circleci/config.yml Normal file
View File

@@ -0,0 +1,177 @@
version: 2.0
build-docker-image-job: &build-docker-image-job
docker:
- image: circleci/node:12
steps:
- setup_remote_docker
- checkout
- run: sudo apt update
- run: sudo apt install python3-pip
- run: sudo pip3 install -r requirements_bundles.txt
- run: .circleci/update_version
- run: npm run bundle
- run: .circleci/docker_build
jobs:
backend-lint:
docker:
- image: circleci/python:3.7.0
steps:
- checkout
- run: sudo pip install flake8
- run: ./bin/flake8_tests.sh
backend-unit-tests:
environment:
COMPOSE_FILE: .circleci/docker-compose.circle.yml
COMPOSE_PROJECT_NAME: redash
docker:
- image: circleci/buildpack-deps:xenial
steps:
- setup_remote_docker
- checkout
- run:
name: Build Docker Images
command: |
set -x
docker-compose build --build-arg skip_ds_deps=true --build-arg skip_frontend_build=true
docker-compose up -d
sleep 10
- run:
name: Create Test Database
command: docker-compose run --rm postgres psql -h postgres -U postgres -c "create database tests;"
- run:
name: List Enabled Query Runners
command: docker-compose run --rm redash manage ds list_types
- run:
name: Run Tests
command: docker-compose run --name tests redash tests --junitxml=junit.xml --cov-report xml --cov=redash --cov-config .coveragerc tests/
- run:
name: Copy Test Results
command: |
mkdir -p /tmp/test-results/unit-tests
docker cp tests:/app/coverage.xml ./coverage.xml
docker cp tests:/app/junit.xml /tmp/test-results/unit-tests/results.xml
when: always
- store_test_results:
path: /tmp/test-results
- store_artifacts:
path: coverage.xml
frontend-lint:
environment:
CYPRESS_INSTALL_BINARY: 0
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: 1
docker:
- image: circleci/node:12
steps:
- checkout
- run: mkdir -p /tmp/test-results/eslint
- run: npm ci
- run: npm run lint:ci
- store_test_results:
path: /tmp/test-results
frontend-unit-tests:
environment:
CYPRESS_INSTALL_BINARY: 0
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: 1
docker:
- image: circleci/node:12
steps:
- checkout
- run: sudo apt update
- run: sudo apt install python3-pip
- run: sudo pip3 install -r requirements_bundles.txt
- run: npm ci
- run: npm run bundle
- run:
name: Run App Tests
command: npm test
- run:
name: Run Visualizations Tests
command: (cd viz-lib && npm test)
- run: npm run lint
frontend-e2e-tests:
environment:
COMPOSE_FILE: .circleci/docker-compose.cypress.yml
COMPOSE_PROJECT_NAME: cypress
PERCY_TOKEN_ENCODED: ZGRiY2ZmZDQ0OTdjMzM5ZWE0ZGQzNTZiOWNkMDRjOTk4Zjg0ZjMxMWRmMDZiM2RjOTYxNDZhOGExMjI4ZDE3MA==
CYPRESS_PROJECT_ID_ENCODED: OTI0Y2th
CYPRESS_RECORD_KEY_ENCODED: YzA1OTIxMTUtYTA1Yy00NzQ2LWEyMDMtZmZjMDgwZGI2ODgx
CYPRESS_INSTALL_BINARY: 0
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: 1
docker:
- image: circleci/node:12
steps:
- setup_remote_docker
- checkout
- run:
name: Enable Code Coverage report for master branch
command: |
if [ "$CIRCLE_BRANCH" = "master" ]; then
echo 'export CODE_COVERAGE=true' >> $BASH_ENV
source $BASH_ENV
fi
- run:
name: Install npm dependencies
command: |
npm ci
- run:
name: Setup Redash server
command: |
npm run cypress build
npm run cypress start -- --skip-db-seed
docker-compose run cypress npm run cypress db-seed
- run:
name: Execute Cypress tests
command: npm run cypress run-ci
- run:
name: "Failure: output container logs to console"
command: |
docker-compose logs
when: on_fail
- run:
name: Copy Code Coverage results
command: |
docker cp cypress:/usr/src/app/coverage ./coverage || true
when: always
- store_artifacts:
path: coverage
build-docker-image: *build-docker-image-job
build-preview-docker-image: *build-docker-image-job
workflows:
version: 2
build:
jobs:
- backend-lint
- backend-unit-tests:
requires:
- backend-lint
- frontend-lint
- frontend-unit-tests:
requires:
- backend-lint
- frontend-lint
- frontend-e2e-tests:
requires:
- frontend-lint
- build-preview-docker-image:
requires:
- backend-unit-tests
- frontend-unit-tests
- frontend-e2e-tests
filters:
branches:
only:
- master
- hold:
type: approval
requires:
- backend-unit-tests
- frontend-unit-tests
- frontend-e2e-tests
filters:
branches:
only:
- /release\/.*/
- build-docker-image:
requires:
- hold

View File

@@ -0,0 +1,22 @@
version: '2.2'
services:
redash:
build: ../
command: manage version
depends_on:
- postgres
- redis
ports:
- "5000:5000"
environment:
PYTHONUNBUFFERED: 0
REDASH_LOG_LEVEL: "INFO"
REDASH_REDIS_URL: "redis://redis:6379/0"
REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
redis:
image: redis:3.0-alpine
restart: unless-stopped
postgres:
image: postgres:9.5.6-alpine
command: "postgres -c fsync=off -c full_page_writes=off -c synchronous_commit=OFF"
restart: unless-stopped

View File

@@ -0,0 +1,71 @@
version: "2.2"
x-redash-service: &redash-service
build:
context: ../
args:
skip_dev_deps: "true"
skip_ds_deps: "true"
code_coverage: ${CODE_COVERAGE}
x-redash-environment: &redash-environment
REDASH_LOG_LEVEL: "INFO"
REDASH_REDIS_URL: "redis://redis:6379/0"
REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
REDASH_RATELIMIT_ENABLED: "false"
REDASH_ENFORCE_CSRF: "true"
services:
server:
<<: *redash-service
command: server
depends_on:
- postgres
- redis
ports:
- "5000:5000"
environment:
<<: *redash-environment
PYTHONUNBUFFERED: 0
scheduler:
<<: *redash-service
command: scheduler
depends_on:
- server
environment:
<<: *redash-environment
worker:
<<: *redash-service
command: worker
depends_on:
- server
environment:
<<: *redash-environment
PYTHONUNBUFFERED: 0
cypress:
ipc: host
build:
context: ../
dockerfile: .circleci/Dockerfile.cypress
depends_on:
- server
- worker
- scheduler
environment:
CYPRESS_baseUrl: "http://server:5000"
CYPRESS_coverage: ${CODE_COVERAGE}
PERCY_TOKEN: ${PERCY_TOKEN}
PERCY_BRANCH: ${CIRCLE_BRANCH}
PERCY_COMMIT: ${CIRCLE_SHA1}
PERCY_PULL_REQUEST: ${CIRCLE_PR_NUMBER}
COMMIT_INFO_BRANCH: ${CIRCLE_BRANCH}
COMMIT_INFO_MESSAGE: ${COMMIT_INFO_MESSAGE}
COMMIT_INFO_AUTHOR: ${CIRCLE_USERNAME}
COMMIT_INFO_SHA: ${CIRCLE_SHA1}
COMMIT_INFO_REMOTE: ${CIRCLE_REPOSITORY_URL}
CYPRESS_PROJECT_ID: ${CYPRESS_PROJECT_ID}
CYPRESS_RECORD_KEY: ${CYPRESS_RECORD_KEY}
redis:
image: redis:3.0-alpine
restart: unless-stopped
postgres:
image: postgres:9.5.6-alpine
command: "postgres -c fsync=off -c full_page_writes=off -c synchronous_commit=OFF"
restart: unless-stopped

17
.circleci/docker_build Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
VERSION=$(jq -r .version package.json)
VERSION_TAG=$VERSION.b$CIRCLE_BUILD_NUM
docker login -u $DOCKER_USER -p $DOCKER_PASS
if [ $CIRCLE_BRANCH = master ] || [ $CIRCLE_BRANCH = preview-image ]
then
docker build --build-arg skip_dev_deps=true -t redash/redash:preview -t redash/preview:$VERSION_TAG .
docker push redash/redash:preview
docker push redash/preview:$VERSION_TAG
else
docker build --build-arg skip_dev_deps=true -t redash/redash:$VERSION_TAG .
docker push redash/redash:$VERSION_TAG
fi
echo "Built: $VERSION_TAG"

9
.circleci/pack Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
NAME=redash
VERSION=$(jq -r .version package.json)
FULL_VERSION=$VERSION+b$CIRCLE_BUILD_NUM
FILENAME=$NAME.$FULL_VERSION.tar.gz
mkdir -p /tmp/artifacts/
tar -zcv -f /tmp/artifacts/$FILENAME --exclude=".git" --exclude="optipng*" --exclude="cypress" --exclude="*.pyc" --exclude="*.pyo" --exclude="venv" *

6
.circleci/update_version Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
VERSION=$(jq -r .version package.json)
FULL_VERSION=$VERSION+b$CIRCLE_BUILD_NUM
sed -ri "s/^__version__ = '([A-Za-z0-9.-]*)'/__version__ = '$FULL_VERSION'/" redash/__init__.py
sed -i "s/dev/$CIRCLE_SHA1/" client/app/version.json

View File

@@ -1,22 +0,0 @@
engines:
pep8:
enabled: true
eslint:
enabled: true
channel: "eslint-3"
config:
config: client/.eslintrc.js
checks:
import/no-unresolved:
enabled: false
ratings:
paths:
- "redash/**/*.py"
- "client/**/*.js"
exclude_paths:
- tests/**/*.py
- migrations/**/*.py
- old_migrations/**/*.py
- setup/**/*
- bin/**/*

View File

@@ -1,4 +1,15 @@
client/.tmp/ client/.tmp/
client/dist/
node_modules/ node_modules/
viz-lib/node_modules/
.tmp/ .tmp/
.venv/
venv/
.git/ .git/
/.codeclimate.yml
/.coverage
/coverage.xml
/.circleci/
/.github/
/netlify.toml
/setup/

View File

@@ -9,6 +9,6 @@ trim_trailing_whitespace = true
indent_style = space indent_style = space
indent_size = 4 indent_size = 4
[*.{js,css,html}] [*.{js,jsx,css,less,html}]
indent_style = space indent_style = space
indent_size = 2 indent_size = 2

View File

@@ -1,31 +0,0 @@
<!--
#####################################################################
#
# Need support? USE THE FORUM! https://discuss.redash.io/c/support.
#
# Don't have steps to reproduce and actually not sure it's a bug?
# Use the forum! https://discuss.redash.io/c/support.
#
#####################################################################
**Got an idea for a new feature?** Check if it isn't on the roadmap already: http://bit.ly/redash-roadmap and start a new discussion in the features category: https://discuss.redash.io/c/feature-requests 🌟.
Found a bug? Please fill out the sections below... thank you 👍
-->
### Issue Summary
A summary of the issue and the browser/OS environment in which it occurs.
### Steps to Reproduce
1. This is the first step
2. This is the second step, etc.
Any other info e.g. Why do you consider this to be a bug? What did you expect to happen instead?
### Technical details:
* Redash Version:
* Browser/OS:
* How did you install Redash:

34
.github/ISSUE_TEMPLATE/---bug_report.md vendored Normal file
View File

@@ -0,0 +1,34 @@
---
name: "\U0001F41B Bug report"
about: Report reproducible software issues so we can improve
---
<!--
We use GitHub only for bug reports 🐛
Anything else should be posted to https://discuss.redash.io 👫
🚨For support, help & questions use https://discuss.redash.io/c/support
💡For feature requests & ideas use https://discuss.redash.io/c/feature-requests
**Found a security vulnerability?** Please email security@redash.io to report any security vulnerabilities. We will acknowledge receipt of your vulnerability and strive to send you regular updates about our progress. If you're curious about the status of your disclosure please feel free to email us again. If you want to encrypt your disclosure email, you can use this PGP key.
-->
### Issue Summary
A summary of the issue and the browser/OS environment in which it occurs.
### Steps to Reproduce
1. This is the first step
2. This is the second step, etc.
Any other info e.g. Why do you consider this to be a bug? What did you expect to happen instead?
### Technical details:
* Redash Version:
* Browser/OS:
* How did you install Redash:

View File

@@ -0,0 +1,17 @@
---
name: "\U0001F4A1Anything else"
about: "For help, support, features & ideas - please use https://discuss.redash.io \U0001F46B "
labels: "Support Question"
---
We use GitHub only for bug reports 🐛
Anything else should be posted to https://discuss.redash.io 👫
🚨For support, help & questions use https://discuss.redash.io/c/support
💡For feature requests & ideas use https://discuss.redash.io/c/feature-requests
Alternatively, check out these resources below. Thanks! 😁.
- [Forum](https://disucss.redash.io)
- [Knowledge Base](https://redash.io/help)

15
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,15 @@
## What type of PR is this? (check all applicable)
<!-- Please leave only what's applicable -->
- [ ] Refactor
- [ ] Feature
- [ ] Bug Fix
- [ ] New Query Runner (Data Source)
- [ ] New Alert Destination
- [ ] Other
## Description
## Related Tickets & Documents
## Mobile & Desktop Screenshots/Recordings (if there are UI changes)

5
.github/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
# https://github.com/behaviorbot/request-info?installation_id=189571
requestInfoLabelToAdd: needs-more-info
requestInfoReplyComment: >
We would appreciate it if you could provide us with more info about this issue/pr!

23
.github/support.yml vendored Normal file
View File

@@ -0,0 +1,23 @@
# Configuration for Support Requests - https://github.com/dessant/support-requests
# Label used to mark issues as support requests
supportLabel: Support Question
# Comment to post on issues marked as support requests, `{issue-author}` is an
# optional placeholder. Set to `false` to disable
supportComment: >
:wave: @{issue-author}, we use the issue tracker exclusively for bug reports
and planned work. However, this issue appears to be a support request.
Please use [our forum](https://discuss.redash.io) to get help.
# Close issues marked as support requests
close: true
# Lock issues marked as support requests
lock: false
# Assign `off-topic` as the reason for locking. Set to `false` to disable
setLockReason: true
# Repository to extend settings from
# _extends: repo

7
.github/weekly-digest.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
# Configuration for weekly-digest - https://github.com/apps/weekly-digest
publishDay: mon
canPublishIssues: true
canPublishPullRequests: true
canPublishContributors: true
canPublishStargazers: true
canPublishCommits: true

7
.gitignore vendored
View File

@@ -1,14 +1,16 @@
.venv .venv
venv/
.cache .cache
.coverage.* .coverage.*
.coveralls.yml .coveralls.yml
.idea .idea
*.pyc *.pyc
.nyc_output
coverage
.coverage .coverage
coverage.xml coverage.xml
client/dist client/dist
.DS_Store .DS_Store
celerybeat-schedule*
.#* .#*
\#*# \#*#
*~ *~
@@ -22,3 +24,6 @@ node_modules
.tmp .tmp
.sass-cache .sass-cache
npm-debug.log npm-debug.log
client/cypress/screenshots
client/cypress/videos

63
.restyled.yaml Normal file
View File

@@ -0,0 +1,63 @@
enabled: true
auto: false
# Open Restyle PRs?
pull_requests: true
# Leave comments on the original PR linking to the Restyle PR?
comments: true
# Set commit statuses on the original PR?
statuses:
# Red status in the case of differences found
differences: true
# Green status in the case of no differences found
no_differences: true
# Red status if we encounter errors restyling
error: true
# Request review on the Restyle PR?
#
# Possible values:
#
# author: From the author of the original PR
# owner: From the owner of the repository
# none: Don't
#
# One value will apply to both origin and forked PRs, but you can also specify
# separate values.
#
# request_review:
# origin: author
# forked: owner
#
request_review: author
# Add labels to any created Restyle PRs
#
# These can be used to tell other automation to avoid our PRs.
#
labels: ["Skip CI"]
# Labels to ignore
#
# PRs with any of these labels will be ignored by Restyled.
#
# ignore_labels:
# - restyled-ignore
# Restylers to run, and how
restylers:
- name: black
image: restyled/restyler-black:v19.10b0
include:
- redash
- tests
- migrations/versions
- name: prettier
image: restyled/restyler-prettier:v1.19.1-2
include:
- client/app/**/*.js
- client/app/**/*.jsx
- client/cypress/**/*.js

View File

@@ -1,5 +1,828 @@
# Change Log # Change Log
## v9.0.0-beta - 2020-06-11
This release was long time in the making and has several major changes:
- Our backend code was updated to support Python 3 and we no longer support Python 2. If you're using our Docker images, this should be a transparent change for you.
- We replaced Celery with RQ for background jobs processing. This will require some setup updates -- see instructions below.
- The frontend code is now 100% React and we removed all the Angular dependencies.
This release was made possible by contributions from over 50 people: @ari-e, @ariarijp, @arihantsurana, @arikfr, @atharvai, @cemremengu, @chulucninh09, @citrin, @daniellangnet, @DavidHernandez, @deecay, @dmudro, @erans, @erels, @ezkl, @gabrieldutra, @gstaykov, @ialeinikov, @ikenji, @Jakdaw, @jezdez, @juanvasquezreyes, @koooge, @kravets-levko, @kykrueger, @leibowitz, @leosunmo, @lihan, @loganprice, @mickeey2525, @mnoorenberghe, @monicagangwar, @NicolasLM, @p-yang, @Ralnoc, @ranbena, @randyzwitch, @rauchy, @rxin, @saravananselvamohan, @satyamkrishna, @shinsuke-nara, @stefan-mees, @stevebuckingham, @susodapop, @taminif, @thewarpaint, @tsuyoshizawa, @uncletimmy3, @wengkham.
### Upgrading
Typically, if you are running your own instance of Redash and wish to upgrade, you would simply modify the Docker tag in your `docker-compose.yml` file. Since RQ has replaced Celery in this version, there are a couple extra modifications that need to be done in your `docker-compose.yml`:
1. Under `services/scheduler/environment`, omit `QUEUES` and `WORKERS_COUNT` (and omit `environment` altogether if it is empty).
2. Under `services`, add a new service for general RQ jobs:
```yaml
worker:
<<: *redash-service
command: worker
environment:
QUEUES: "periodic emails default"
WORKERS_COUNT: 1
```
Following that, force a recreation of your containers with `docker-compose up --force-recreate --build` and you should be good to go.
### UX
- Redesigned Query Results page:
- Completely new layout is easier to read for non-technical Redash users.
- Empty query results are clearly displayed. User is now prompted to edit or execute the query.
- Mobile Experience Improvements:
- UI element spacing has been redesigned for clarity
- Admin pages now honor max-width. Tables scroll independent of the top menu.
- Large legends no longer shrink the visualization on small screens.
- Fix: it was sometimes impossible to scroll pages with dashboards because the visualizations captured every touch event.
- Fix: Visualizations on small screens would not always show horizontal scroll bars.
- Dashboards can now be un-archived using the API.
- Dashboard UI performance was improved.
- List pages were changed to show a user's name instead of avatar.
- Search-enabled tables now show a prompt for which columns will be searched.
- In the visualization editor, the settings pane now scrolls independent of the visualization preview.
- Tokens in the schema viewer now sort alphabetically.
- Links to settings panes that require Admin privileges are now hidden from non-Admins.
- The Admin page now remembers which tab you were viewing after a page reload.
### Visualizations
- Feature: Allow bubble size control with either coefficient or sizemode.
- Feature: Table visualization now treats Unix timestamps in query results as timestamps.
- Feature: It's now possible to provide a description to each Table column, appearing in UI as a tooltip.
- Feature: Added tooltip and popover templating to the map with markers visualization.
- Feature: Added an organization setting to hide the Plotly mode bar on all visualizations.
- Feature: Cohort visualization now has appearance settings.
- Feature: Add option to explicitly set Chart legend position.
- Change: Deprecated visualizations are now hidden.
- Change: Table settings editor now extends vertically instead of horizontally.
- Change: The maximum table pagination is now 500.
- Change: Pie chart labels maintain contrast against lighter slices.
- Fix: Chart series switched places when picking Y axis.
- Fix: Third column was not selectable for Bubble and Heatmap charts.
- Fix: On the counter visualizations, the “count rows” option showed an empty string instead of 0.
- Fix: Table visualization with column named "children" rendered +/- buttons.
- Fix: Sankey visualization now correctly occupies all available area even with fewer stages.
- Fix: Pie chart ignores series labels.
### Data Sources
- New Data Sources: Amazon Cloudwatch, Amazon CloudWatch Logs Insights, Azure Kusto, Exasol.
- Athena:
- Added the option to specify a base cost in settings, displaying a price for each query when executed.
- BigQuery:
- Fix: large jobs continued running after the user clicked “Cancel” query execution.
- Cassandra:
- Updated driver to 3.21.0 which dramatically reduces Docker build times.
- SSL options are now available.
- Clickhouse:
- You can now choose whether to verify the SSL certificate.
- Databricks:
- Databricks now use an ODBC-based connector.
- Fix: Date column was coerced to DateTime in the front-end.
- Druid:
- Added username and password authentication option.
- Microsoft SQL Server
- Added support for ODBC connections via pyodbc. There are now two MSSQL data source types. One using TDS. The other is using ODBC.
- MongoDB:
- Added support for running queries on secondary in replicaset mode.
- Fix: Connection test always succeeded.
- Oracle:
- Fix: Connection would fail if username or password contained special characters.
- Fix: Comparisons would fail if scale was None.
- RDS:
- Updated rds-combined-ca-bundle.pem to the latest CA.
- Redshift:
- Added the ability to use IAM Roles and Users.
- Fix: Redshift was unable to have its schema refreshed.
- Rockset:
- Fix: Allow Redash to load collections in all workspaces.
- Snowflake:
- You can now refresh the snowflake schema without waking the cluster.
- Added support for all of Snowflakes datetime types. Otherwise certain timestamps would only appear as strings in the front-end.
- TreasureData:
- Fix: API calls would fail when setting a non-default region.
### Alerts
- Feature: Added ability to mute alerts without deleting them.
- Fix: numerical comparisons failed if value from query was a string.
### Parameters
- Added Last x Days options for date range parameters.
- Fix: Parameters added in empty queries were always added as text parameters
### Bug Fixes
- Fix: Alembic migration schema was preventing v4 users from upgrading. In v5 we started encrypting data source credentials in the database.
- Fix: System admin dashboard would not show correct database size if non-default name was used.
- Fix: refresh_queries job would break if any query had a bad schedule object.
- Fix: Orgs with LDAP enabled couldnt disable password login.
- Fix: SSL mode was sometimes sent as an empty string to the database instead of omitted entirely.
- Fix: When creating new Map visualization with clustering disabled, map would crash on save.
- Fix: It was possible on the New Query page to click “Save” multiple times, causing multiple new query records to be created.
- Fix: Visualization render errors on a dashboard would crash the entire page.
- Fix: A scheduled execution failure would modify the querys “updated_at” timestamp.
- Fix: Parameter UI would wrap awkwardly during some drag operations.
- Fix: In dashboard edit mode, users couldnt modify widgets.
- Fix: Frontend error when parsing a NaN float.
### Other
- Added TSV as a download format (in addition to CSV and Excel).
- Added maildev settings (helps with automated settings).
- Refine permissions usage in Redash to allow for guest users
- The query results API now explicitly handles 404 errors.
- Forked queries now retain the tags of the original query.
- We now allow setting custom Sentry environments.
- Started using Black linter for our Python source code
- Added CLI command to re-encrypt data source details with new secret key.
- Favorites list is now loaded on menu click instead of on page load.
- Administrators can now allow connections to private IP addresses.
## v8.0.0 - 2019-10-27
There were no changes in this release since `v8.0.0-beta.2`. This is just to mark a stable release.
## v8.0.0-beta.2 - 2019-09-16
This is an update to the previous beta release, which includes:
- Add options for users to share anonymous usage information with us (see [docs](https://redash.io/help/open-source/admin-guide/usage-data) for details).
- Visualizations:
- Allow the user to decide how to handle null values in charts.
- Upgrade Sentry-SDK to latest version.
- Make horizontal table scroll visible in dashboard widgets without scrolling.
- Data Sources:
- Add support for Azure Data Explorer (Kusto).
- MySQL: fix connections without SSL configuration failing.
- Amazon Redshift: option to set query group for adhoc/scheduled queries.
- Hive: make error message more friendly.
- Qubole: add support to run Quantum queries.
- Display data source icon in query editor.
- Fix: allow users with view only acces to use the queries in Query Results
- Dashboard: when updating parameters refersh only widgets that use those parameters.
This release had contributions from 12 people: @arikfr, @cclauss, @gabrieldutra, @justinclift, @kravets-levko, @ranbena, @rauchy, @sandeepV2, @shinsuke-nara, @spacentropy, @sphenlee, @swfz.
## v8.0.0-beta - 2019-08-18
After months of being heads down with hard work, it's finally time to wrap up the V8 release 🤩 This release includes many long awaited improvements to parameters, UX improvements, further React migration and other changes, fixes and improvements.
While this version is already running on the hosted platform to make sure it's stable, we're excited to put this in the hands of our Open Source users.
Starting from this release we will no longer build a tarball distribution of the codebase and recommend everyone to switch over to using our Docker images. We're planning on dropping Python 2 support towards its EOL this year and switching over to the Docker image will make this transition much simpler.
This release was made possible by contributions from over 40 people: @aidarbek, @AntonZarutsky, @ariarijp, @arikfr, @combineads, @deecay, @fmy, @gabrieldutra, @guwenqing, @guyco33, @ialeinikov, @Jakdaw, @jezdez, @justinclift, @k-tomoyasu, @katty0324, @koooge, @kravets-levko, @ktmud, @KumanoTanaka, @kyoshidajp, @nason, @oldPadavan, @openjck, @osule, @otsaloma, @ranbena, @rauchy, @rueian, @sekiyama58, @shinsuke-nara, @taminif, @The-Alchemist, @vv-p, @washort, @wudi-ayuan, @ygrishaev, @yoavbls, @yoshiken, @yusukegoto and the support of over 500 organizations who subscribed to our hosted version and by that sponsor the team's work.
### Parameters
- Parameter UI improvements:
- Support for multi-select in dropdown (and query dropdown) parameters.
- Support for dynamic values in date and date-range parameters.
- Search dropdown parameter values.
- New UX for applying parameter changes in queries and dashboards.
- Allow using Safe Parameters in visualization embeds and public dashboards. Safe Parameters are any parameter type except for the a text parameter (dropdowns are safe).
### Data Sources
- New Data Sources: Couchbase, Phoenix and Dgraph.
- New JSON data source (and deprecated old URL data source).
- Snowflake: update connector to latest version.
- PostgreSQL: show only accessible tables in schema.
- BigQuery:
- Correctly handle NaN values.
- Treat repeated fields as rrays.
- [BigQuery] Fix: in some queries there is no mode field
- DynamoDB:
- Support for Unicode in queries.
- Safe loading of schema.
- Rockset: better handling of query errors.
- Google Sheets:
- Support for Team Drive.
- Friendlier error message in case of an API error and more reliable test connection.
- MySQL:
- Support for calling Stored Procedures and better handling of query cancellation.
- Switch to using `mysqlclient` (a maintained fork of `Python-MySQL`).
- MongoDB: Support serializing Decimal128 values.
- Presto: support for passwords in connection settings.
- Amazon Athena: allow to specify custom work group.
- Query Results: querying a column with a dictionary or array fails
- Clickhouse: make sure we don't show password in error messages.
- Enable Cassandra support by default.
### Visualizations
- Charts:
- Fix: legend overlapping chart on small screens.
- Fix: Pie chart not rendering when series doesn't exist in options.
- Pie Chart: add option to set direction of slices.
- WordCloud: rewritten to support new options (provide frequency in query, limits), scale when resizing, handle long words and more.
- Pivot Table: support hiding totals.
- Counters: apply formatting to target value.
- Maps:
- Ability to customize marker icon and color.
- Customization options for Choropleth maps.
- New Visualization: Details View.
### **UX**
- Replace blank screen with a loading indicator when the application is doing its first load.
- Multiple improvements to dashboards editing: auto-save, grid markings and better refresh indicator.
- Admin can now edit user's groups from the user page.
- Add keyboard shortcut (Ctrl/Cmd+Shift+F) to trigger query formatting.
### API
- Query Result API response minimized to only required fields when called with a non user API key.
- Prefer API key over cookies in authentication.
- User can now regenerate Query API Key.
### Other Changes
- Sends CSP headers to prevent various kinds of security attacks via the browser. Might break unusual usages and embeds of Redash.
- New Failed Scheduled Queries email report (can be enabled from organization settings screen).
- Deprecated HipChat Alert Destination.
- Add options to hide different parts of a Visualization embed UI (parameters, title, link to query).
- Support multi-byte search for query names and descriptions (needs to be enabled in Organization settings screen).
- CSV query results download: correctly serialize booleans and date values.
- Dashboard filters now collect values from all widgets with the same filter.
- Support for custom message and description in alert notifications (currently disabled behind a feature flag until we improve the alert UX).
### Bug Fixes
- Fix: adding widget to dashboard from a query page is broken.
- Fix: default time format option was wrong.
- Fix: when too many errors of a scheduled queries occur it causes an OverflowError.
- Fix: when forking a query maintain the same visualizations order.
## v7.0.0 - 2019-03-17
We're trying a new format for the CHANGELOG in this release. Focusing on the bigger changes, but for whoever interested, you can see all the changes [here](https://github.com/getredash/redash/compare/v6.0.0...master).
Besides all the features, bug fixes and improvements listed below we managed to convert a large portion of Redash's frontend code from Angular.js to React. You can see status in [#3071](https://github.com/getredash/redash/issues/3071).
This release was made possible with the help of 34 contributors. 🙇‍♂️
### Data Sources
- **All data source options are now encrypted in the database.** By default the encryption uses the `REDASH_COOKIE_SECRET` value (`redash.settings.COOKIE_SECRET`), but you can specify a different value by setting the `REDASH_SECRET_KEY` environment variable value. Note that you need to set this _before_ doing the upgrade.
- New Data Sources: Uptycs and Apache Drill.
- Snowplow: is now enabled by default & supports region setting.
- Elasticsearch: add support for Amazon Elasticsearch IAM authentication (with IAM profile or key/secret pair).
- PostgreSQL: add support for serializing range values.
- Redshift: remove duplicate column information for late-binding views.
- Athena: load all databases (using pagination).
- BigQuery: correctly handle temp tables with no schema field.
- Jira (JQL): support for fetching all records with pagination.
- Prometheus: fix schema loading and add support for query range.
### In-app Help
You can now open the [Knowledge Base](https://redash.io/help) inside the application. We also added a few "help triggers" in the app, that will open the Knowledge Base in context of what you're currently doing.
### Parameters
- **Dashboard Parameters**: We improved the flow of adding queries with parameters to dashboards and now give you full control over how parameters are mapped. You no longer have to make sure all parameters have the same name or use the `Global` checkbox. We also added new options, like keeping the parameter local to the widget or setting a static value. [Read more in our Knowledge Base →](https://redash.io/help/user-guide/querying/query-parameters#Parameter-Mapping-on-Dashboards)
- We added server side validation of parameter values for all parameter types, except for parameters of `text` type. All validated parameter types are considered safe. When a query is using safe parameters (or no parameters at all), View Only users can refresh it.
- Refreshing safe queries is done using the new results API endpoint, which takes only a query ID (and optionally parameter values) and does not need the query text.
### Query Editor Improvements
- Run only the highlighted query text: hit Execute after highlighting a portion of your query and only the selected portion will be sent to the database. This is useful for testing sub-SELECT statements and CTE's.
- Improved auto complete: add a dot . after a table name in the query editor and auto complete will only suggest columns on that table.
- Autosave parameter configuration changes.
- YAML syntax support (for data sources like Yandex Metrica).
### Improved Query Scheduler
The Query Scheduler got a face lift and some new options: you can pick a day for a weekly schedule to run on and also set an end date after which the query will no longer execute on schedule.
### Data Sources
We added Apache Drill, Uptycs and a new JSON data source. Also fixed a few bugs in Athena's query runner and others.
### User Management
The users page got revamped with a new look and feel and few new features:
- An indication when a user was last active.
- Show if an invited user hasn't finished the setup process yet (Pending Invitations section).
- You can now generate a new API key for users, if there's a concern it was compromised.
### Admin
- New Celery queues status screens, replacing the old Queries Status and better reflecting the status of running queries.
- Make the queue name for schema refresh job configurable. The default used to be hard coded `schemas`, which is not available on all setups. Now it's `celery`.
- The `gevent` library is installed by default, and you can now setup gunicorn to use `gevent` based workers.
- New Docker entrypoint command to do a health check for a worker process.
- Flask-Admin is no longer setup or supported.
### Other Changes
- New Alert destination: Google Hangouts Chat.
- When downloading results from the results API it will set a user friendly filename for the downloaded file.
- Archived Queries section added to the queries list.
### Bug Fixes
- Fixed: fork query does not fork tables but instead adds default table.
- Fixed: when deleting a visualization, any widget using it was left empty on the dashboard.
- Fixed: issues with Query Editor resizing on new versions of Chrome.
- Fixed: issues with exporting dictionaries to Excel.
- Fixed: Cohort visualization gets stuck when passing string values.
- Fixed: use series name for Pie chart label.
- Make sure Flask app created in Celery's worker process (could cause some query runners to get stuck while running queries).
## v6.0.0 - 2018-12-16
v6.0.0 release version. Mainly includes fixes for regressions from the beta version.
This release had contributions from 5 people: @rauchy, @denisov-vlad, @arikfr, @ariarijp, and @gabrieldutra. Thank you, everyone 🙏
### Changed
- #3183 Make refresh_queries less noisey in logs. @arikfr
### Fixed
- #3163 Include correct version in production builds. @rauchy
- #3161 Clickhouse: fix int() conversion error. @denisov-vlad
- #3166 Directly using record_event task requires timestamp. @arikfr
- #3167 Alert.evaluate failing when the column is missing. @arikfr
- ##3162 Remove API permissions for users who have been disabled. @rauchy
- #3171 Reject empty query name. @ariarijp
- #3175, #3186 Fix disable error message. @rauchy, @gabrieldutra
- #3182 [Redshift] support for schema names with dots. @arikfr
- #3187 Safely create_app in Celery code (try to fetch current_app first). @arikfr
### Other
- #3155 Add DB Seed to Cypress and setup Percy. @gabrieldutra
- #3180 Remove coverage from pytest terminal output. @rauchy
## v6.0.0-beta - 2018-12-03
This release was 2 months in the making and it is full with good stuff!
- We have 5 new data sources: Databricks, IBM DB2, Kylin, Druid and Rockset. ⌗
- There are fixes and improvements to 11 existing data sources (MySQL, Redshift, Postgres, MongoDB, Google BigQuery, Vertica, TreasureData, Presto, ClickHouse, Google Sheets and Google Analytics).
- The Query Results data source can now load cached results, just use the `cached_query_` prefix instead of `query_`.
- On the visualizations front we added a Heatmap visualization and did updated the table and counter visualizations.
- Alerts got some fixes and a new destination: PagerDuty.
- If the live autocomplete in the code editor annoys you, you can disable it now (although we're working to make it better, see #3092).
- Fast queries will now load faster. 🏃‍♂️
- We improved the layout of visualizations and content on smaller screen sizes. 📱
- For those of you who like sharing, you can now enable the ability to share ownership of queries and dashboards and let others to edit them. Check the Settings page to enable this feature.
There were also important changes to the code and infrastructure:
- More components moved to React.
- We switched to Webpack 4 with the help of @dmonego.
- We upgraded to Celery 4 with the help of @emtwo, @jezdez, @mashrikt and @atharvai.
- We started moving towards Python 3 for our backend. The first step was to make sure our code pass basic sanity tests with Flake 8, which was implemented by @cclauss.
- We improved our testing on the frontend by adding setup for Jest tests and E2E testing using Cypress (@gabrieldutra).
- Each pull request now gets a deploy preview using Netlify to easily test frontend changes.
This is just a summary, you're welcome to review the full list below. ⬇
This release had contributions from 38 people: @arikfr, @kravets-levko, @jezdez, @kyoshidajp, @kocsmy, @alison985, @gabrieldutra, @washort, @GitSumito, @emtwo, @rauchy, @alexanderlz, @denisov-vlad, @ariarijp, @yoavbls, @zhujunsan, @sjakthol, @koooge, @SakuradaJun, @dmonego, @Udomomo, @cclauss, @combineads, @zaimy, @Trigl, @ralphilius, @jodevsa, @deecay, @igorcanadi, @pashaxp, @hoangphuoc25, @toph, @burnash, @wankdanker, @Yossi-a, @Rovel, @kadrach, and @nicof38. Thank you, everyone 🙏
### Added
- #2747, #3143 Add a new Databricks query runner. @alison985, @jezdez, @arikfr
- #2767 Add ability to add viz to dashboard from query edit page. @alison985, @jezdez
- #2780 Add a query autocomplete toggle. @alison985, @jezdez, @arikfr
- #2768 Add authentication via JWT providers. @SakuradaJun
- #2790 Add the ability to sort favorited queries, paginate the dashboard list and improve UI inconsistencies. @jezdez
- #2681 Add ability to search table column names in schema browser. @alison985
- #2855 Add option to query cached results. @yoavbls
- #2740 Add ability for extensions to add periodic tasks. @emtwo
- #2924 Google Spreadsheets: Add support for opening by URL. @alexanderlz
- #2903 Add PagerDuty as an Alert Destination. @alexanderlz
- #2824 Add support for expanding dashboard visualizations. @sjakthol
- #2900 Add ability to specify a counter label. @ralphilius
- #2565 Add frontend extension capabilities. @emtwo
- #2848 Add IBM Db2 as a data source using the ibm-db Python package. @nicof38
- #2959 Add option to auto reload widget data in shared dashboards. @arikfr
- #2993 Add page size settings. @kyoshidajp
- #2080 New Heatmap chart visualization with Plotly. @deecay
- #2991 Show users in CLI group list. @GitSumito
- #2342 New SQLPARSE_FORMAT_OPTIONS setting to configure query formatter. @ariarijp
- #3031 Add some tests for Query Results. @ariarijp
- #2936 Add Kylin data source. @Trigl
- #3047 Add Druid data source. @rauchy
- #3077 New user interface for the feature flag of the share edit permissions feature. @arikfr
- #3007 Add permissions to the result of "manage.py groups list" command. @Udomomo
- #3088 Add get_current_user() fuction for the Python query runner. @kyoshidajp
- #3114 Add event tracking to autocomplete toggle. @arikfr
- #3068 Add Rockset query runner. @igorcanadi, @arikfr
- #3105 Display frontend version. @rauchy
### Changed
- #2636 Rewrite query editor with React. @washort, @arikfr
- #2637 Convert edit-in-place component to React. @washort, @arikfr
- #2766 Suitable events are now being recorded server side instead of in the frontend. @alison985, @jezdez
- #2796 Change placement (right/bottom) of chart legend depending on chart width. @kravets-levko
- #2833 Uses server side sort order for tag list and show count of tagged items. @jezdez
- #2318 Support authentication for the URL data source. @jezdez
- #2884 Rename Yandex Metrika to Metrica. @jezdez
- #2909 MySQL: hide sys tables. @arikfr
- #2817 Consistently use simplejson for loading and dumping JSON. @jezdez
- #2872 Use Plotly's function to clean y-values (x may be category or date/time). @kravets-levko
- #2938 Auto focus tag input. @kyoshidajp
- #2927 Design refinements for queries pages. @kocsmy
- #2950 Show activity status in CLI user list. @GitSumito
- #2968 Presto data source: setting protocol (http/https), safe loading of error messages. @arikfr
- #2967 Show groups in CLI user list. @GitSumito
- #2603 MongoDB: Update requirements to support srv. @arikfr
- #2961 MongoDB: Skip system collections when loading schema. @arikfr
- #2960 Add timeout to various HTTP requests. @arikfr
- #2983 Databricks: New logo, updated name and enabled by default. @arikfr
- #2982 Table visualization: change default size to 25 and add more size options. @arikfr
- #2866 Redshift: Hide tables the configured user cannot access. @sjakthol
- #3058 Mustache: don't html-escape query parameters values. @kravets-levko
- #3079 Always use basic autocomplete, as well as the live autocomplete. @arikfr
- #3084 Support tel://, sms://, mailto:// links in query results. @zhujunsan
- #3083 Clickhouse: Add WITH TOTALS option support. @denisov-vlad
- #3063 Allow setting colors for bubble charts. @toph
- #3085 BigQuery: Switch to Standard SQL as the default. @kyoshidajp
- #3094 Tags autocomplete: Show note when creating a new label. @kravets-levko
- #2984 Autocomplete toggle improvements. @arikfr
- #3089 Open new tab when forking a query. @kyoshidajp
- #3126 MongoDB: add support for sorting columns. @arikfr
- #3128 Improve backoff algorithm of query results polling to speed it up. @arikfr
- #3125 Vertica: update driver & add support for connection timeout. @arikfr
- #3124 Support unicode in Postgres/Redshift schema. @arikfr
- #3138 Migrate all tags components to React. @kravets-levko
- #3139 Better manage permissions modal. @kocsmy
- #3149 Improve tag link colors and fix group tags on Users page. @kocsmy
- #3146 Update, replace and fix new alert destination logos so it fits better. @kocsmy
- #3147 Add and improve recent db logos that didn't fit in size properly. @kocsmy
- #3148 Fix label positioning on no found screen. @kocsmy
- #3156 json_dumps: add support for serializing buffer objects. @arikfr
### Fixed
- #2849 Fix invalid reference to alert.to_dict() in webhook. @wankdanker
- #2840 Improve counter visualization text scaling. @kravets-levko
- #2854 Widget titles are no longer rendered wrong on public dashboards. @kravets-levko
- #2318 Removed redundant exception handling in data sources since that's handled in the query backend. @jezdez
- #2886 Fix Javascript build that broke because registerAll tried to run EditInPlace component. @arikfr
- #2911 Dont show “Add to dashboard” in dropdown to unsaved queries. @jezdez
- #2916 Fix export query results output file name. @gabrieldutra
- #2917 Fix output file name not changing after rename query. @gabrieldutra
- #2868 Address edge case when retrieving Glue schemas for Athena data source. @kadrach
- #2929 Fix: date value in a filter is duplicated. @combineads
- #2875 Unbreak charts with long legend break in horizontal mode. Update plotly.js. @kravets-levko
- #2937 Fix event recording in admin API backend. @kyoshidajp
- #2953 Minor fixes for the Clickhouse data source. @denisov-vlad
- #2941 Bring back fix to Box plot hover. @arikfr
- #2957 Apply missing CSS classes to EditInPlace component. @arikfr
- #2897 Show "Add description" only after saving the query. @arikfr
- #2922 Query page layout improvements for small screens. @kravets-levko
- #2956 Clickhouse: move timeout to params. @denisov-vlad
- #2964 Fix no tags shown when having empty set. @gabrieldutra
- #2757 Use full text search ranking when searching in list views. @jezdez
- #2969 Query Results data source: improved errors, quoted column names. @arikfr
- #2906 Preventing open redirection in loging process. @kyoshidajp
- #2867 TreasureData: Deduplicate column names. @zaimy
- #2994 Fix scheme of various URLs from http to https. @kyoshidajp
- #2992 Fix an invalid prop type warning in new version notifier. @kyoshidajp
- #3022 Fix Toolbox covering part of a chart. @kravets-levko
- #2998 Fix charts losing responsive features after refreshing the dashboard. @kravets-levko
- #3034 Postgres: handle NaN/Infinity values. @kravets-levko
- #2745 Sort columns with undefined values. @Yossi-a
- #3041 Sort CLI output of lists. @GitSumito
- #2803, #3006 Address various tag display issues on query list page. @kocsmy, @alison985
- #3049 Fix edit-in-place component which ignored isEditable flag and didn't work on Groups page. @kravets-levko
- #2965 Google Analytics: Fix crash when no results are returned. @alexanderlz
- #3061 Fix table visualization so that the horizontal scrollbar is not be always visible. @kravets-levko
- #3076 Add white-space padding to separators in the footer. @burnash
- #2919 Fix URL data source to not require a URL. @arikfr
- #3098 Force AngularJS to update query editor properly. @washort
- #3100 Delete redundant regex segment in query result frontend. @zhujunsan
- #2978 Prevent the query update timestamp from changing when it is linked to new query results. @rauchy
- #3046 Fix query page header. @kravets-levko
- #3097 Mongo: Fix collection fields retreival bug when Views are present. @jodevsa
- #3107 Keep query text in local state for now. @washort
- #3111 Fix mobile padding issues on Query results. @kocsmy
- #3122 Show menu divider only if query is archived. @jezdez
- #3120 Fix tag counts for dashboards and queries. @jezdez
- #3141 Fix schema refresh to work on MySQL 8. @hoangphuoc25
- #3142 Fix: editing dashboard title results in the visualizations being replaced by the loading markers. @kravets-levko
### Other
- #2850 The setup scripts are now based on Ubuntu 18.04 LTS and Docker. @pashaxp, @arikfr
- #2985 Add Jest based tests to our stack. @arikfr
- #2999 Add netlify configuration. @arikfr
- #3000 Initial Cypress based E2E test infrastructure. @gabrieldutra
- #2898 Move Ant styles into a central location. @arikfr
- #2910 Fix webpack build error about BigMessage. @jezdez
- #2928 Speed up builds by skipping installing requirements_all_ds.txt in CI unit tests. @arikfr
- #2963 Fix tarball build failure. @emtwo
- #2996 Fix setup.sh failures when run as root. @arikfr
- #2989 Rearrange make targets. @koooge
- #3036 Update Flask-Admin to 1.5.2. @yoavbls
- #2901 Fix documentation links. @kravets-levko
- #3073 Remove only Redash containers in clean Make task. @ariarijp
- #3048 Remove pytest-watch dependency to workaround an issue with watchdog. @rauchy
- #2905 Update development docker-compose.yml file to use latest Redis and Postgres servers and specify working volume explictly. @Rovel
- #3032 Makefile: Add make targets for test. @koooge
- #2933 Switch to Webpack 4. @dmonego
- #2908 Update setup files. @arikfr
- #2946 Update snowflake_connector_python version. @arikfr
- #2773 Upgrade to Celery 4.2.1. @emtwo, @jezdez
- #2881 CircleCI: Make flake8 tests pass on Legacy Python and Python 3. @cclauss
- #2907 Remove unused dependencies (honcho, wsgiref). @arikfr
- #3039 Build docker image on master branch. @arikfr
- #3106 Fix registerAll failures after minification. @arikfr
## v5.0.2 - 2018-10-18
### Security
- Fix: prevent Open Redirect vulnerability.
## v5.0.1 - 2018-09-27
### Added
- Added support for JWT authentication (for services like Cloudflare Access or Google IAP).
### Changed
- Upgraded Celery version to 3.1.26 to make upgrade to Celery 4 easier.
## v5.0.0 - 2018-09-21
Final release for V5. Most of the changes were already in the beta release of V5, but this includes several fixes along
with UI improvements.
🙏 Thanks to @arikfr, @jezdez, @kravets-levko, @alison985, @kocsmy, @yossi-a, @tdsmith, @nasmithan, @jrbenny35, @sjakthol, @ariarijp and @combineads who contributed to this release.
### Security
- Fix: don't expose Google OAuth client secret. @arikfr
### Changed
- Improve mobile rendering of dashboards and queries. @kocsmy
- UI improvements for favorites and empty state. @arikfr
- Remove unnecessary X at the end of the query search. @kocsmy
- Add server-side sorting to dashboard list. @jezdez
- Sort queries in descending order. @jezdez
- Throw error when non-owner tries to add a user to dashboard permissions. @alison985
- Propagate query execution errors from Celery tasks properly. @alison985
- Reload the route when using the app header search input. @jezdez
### Fixed
- Fix: BigQuery default location is null and not US. @arikfr
- Fix: query embeds are broken. @arikfr
- Fix: typo in Celery log foramt. @ariarijp
- Use QuerySerializer in outdated queries list. @jezdez
- Fix: sometimes widgets are getting zero height. @kravets-levko
- Athena: Switch to simple_json to serialize NaN/Infinity values as nulls. @kravets-levko, @jezdez
- Fix: queries with parameters with no value breaking the scheduler. @arikfr
- Fix: MongoDB query results parser didn't support unicode keys. @arikfr
- Fix: Google Analytics schema wasn't loading in some cases. @arikfr
- Fix: date/time parameters not working as global param @kravets-levko.
- Fix: Widgets crumble when trying to move / resize a widget. @kravets-levko
- Fix: handling rows with "length" field with forOwn method. @yossi-a
- Fix: query selection not working on alert page. @sjakthol
- Fix: query_results for Embedded Parameters (removed deprecated to_dict function). @nasmithan
- Fix: unicode not supported in dashboard search. @combineads
- Fix: unicode not supported in users search. @arikfr
### Other
- Add test for using saved parameters in scheduled queries. @alison985
- Minor code smell cleanup. @jezdez
- Update QueryResultListResource docstring. @tdsmith
- Switch to CirlceCI 2.0 @jrbenny35, @arikfr
- Remove unnecessary init methods. @jezdez
## v5.0.0-Beta - 2018-08-06
This is the first beta of the V5 release (and hopefully the last one). This version includes a lot of exciting new additions along with bug fixes and other changes.
Some notable changes:
- Extensive work on parameters UI:
- New Date Range parameter type.
- UI for creating new parameters.
- Support for Now/Today as default value of date/time parameter.
- Tagging and favorites ⭐️ support for queries and dashboards.
- Users list page was improved (search, additional information) and you can now disable users.
- Query editor improvements: additional keyboard shortcuts and support for searching in query text.
- Visualizations improvements: option to select colors of pie chart sectors, X Axis type auto detect and option to format values, labels and tooltips.
- Data Sources:
- Support for Yandex Metrika and AppMetrika.
- BigQuery: location property support and schema will load all tables now.
- Elasticsearch: stop sending source_content_type parameter which wasn't supported in older versions.
- Started migrating the frontend codebase to React.
And much more!
🙏 Thanks to @kravets-levko, @arikfr, @ariarijp, @alison985, @kyoshidajp, @kocsmy, @denisov-vlad, @deecay, @yuua, @emtwo, @Pablohn26, @sieben, @atharvai, @matsumo, @tdawber, @innovia, @gabrieldutra, @coreyhuinker, @maxv, @sjakthol, @mtrbean and @washort who contributed to this release!
### Added
- #2712: Date/Time Range parameter type (@kravets-levko)
- #2482: Add support for ChatWork Alert Destination. (@matsumo)
- #2678: Explicit "Add Parameter" Button in Query Editor. (@kravets-levko)
- #2513: Add location property to BigQuery data source settings. (@kyoshidajp)
- #2616: Pie chart: support setting pie chart sector colors. (@kravets-levko)
- #2697: Date/Time parameters: support for "Now" as default value. (@kravets-levko)
- #2693: Enable search function in Query Editor. (@arikfr)
- #2573: Tagging and favorites for Queries and Dashboards (@arikfr)
- #2640: Keyboard shortcut to collapse query editor/schema browser (@kravets-levko)
- #2674: Add support for the Chrome Logger extension (@arikfr)
- #2653: Add redash db size to status page (@alison985)
- #2669: Store Athena query id with result metadata (@tdawber)
- #2546: Configuration for incorporating React components (@washort)
- #2533: New datasource: Yandex Metrika & AppMetrika (@denisov-vlad)
- #2536: Chart: formats for values, labels and tooltips (@kravets-levko)
- #2560: Introduce Policy object (@arikfr)
- #2380: Admin should be able to disable a user (@kravets-levko)
- #2509: Show custom date format on settings page (@kyoshidajp)
### Changed
- #2715: Improve users list page (@arikfr)
- #2710: Update Ant variables to fit Redash's style (@kocsmy)
- #2709: Move format button next Add New Param button. (@arikfr)
- #2664: Dashboard shows a spinner when query failed to load (@kravets-levko)
- #2626: Show real status when loading cached query result (@kravets-levko)
- #2663: Set column name implicitly when column name is blank (@ariarijp)
- #2695: Improve Date/DateTime type parameters (@kravets-levko)
- #2694: Block users with disposable email addresses (@arikfr)
- #2687: YAML: changed load to safe_load (@denisov-vlad)
- #2514: Update value parsing for google spreadsheets source (@atharvai)
- #2570: fixes query pagination alignment (@alison985)
- #2584: keep query result pagination out of scroll (@alison985)
- #2647: Improve Script Query Runner (@ariarijp)
- #2583: Query header improvements on widgets (@kocsmy)
- #2671: Save some space (@kocsmy)
- #2658: delaying schema filtering to improve responsiveness (@alison985)
- #2648: Update datasource documentation links (@Pablohn26)
- #2613: Improve Script Query Runner (@ariarijp)
- #2619: data source sort case insensitive (@alison985)
- #2604: Improve Google Spreadsheets Query Runner (@ariarijp)
- #2542: Closes #2541: x-axis improvements. (@emtwo)
- #2590: Remove redundant variables (@ariarijp)
- #2585: Show data only mode: allow to add and delete visualizations (@kravets-levko)
- #2549: Allow get_tables to see views and v10-style partitioned tables (@coreyhuinker)
- #2568: sort datasources alphabetically (@alison985)
- #2444: feat: show error if saml response cannot be parsed (@sjakthol)
- #2554: Display name to be delete (@kyoshidajp)
- #2510: Display confirmation dialog when deleting a item (@kyoshidajp)
- #2518: Design improvements (@kocsmy)
- #2520: Filter data sources in a data source input area (@kyoshidajp)
### Fixed
- #2722: Elasticsearch: Don't send source_content_type parameter. (@arikfr)
- #2719: Remove closing input tags (@maxv)
- #2458: Get all tables in the BigQuery (@kyoshidajp)
- #2698: Make sure we return distinct data source values (@arikfr)
- #2315: Fix: pyHive type matches (@yuua)
- #2638: Dashboard stops rendering when adding widget with empty query (@kravets-levko)
- #2610: Fix export query results output file name (@gabrieldutra)
- #2574: commit query result to db before evaluating alerts (@mtrbean)
- #2580: add break-word wrap to add/edit text box on dashboard (@alison985)
- #2578: Fix connection error when you run "create_tables" (@ariarijp)
- #2572: remove extra menu line if query is archived (@alison985)
- #2526: Fix pivot hide control in dashboards (@deecay)
- #2511: Fixing signed_out.html template (@kocsmy)
- #2523: Frontend: fix boolean field with null value display as null. (@innovia)
### Other
- #2682: Add Zeit's now support to have preview builds for every PR (@arikfr)
- #2668: Upgrade bootstrap script to Redash 4.0.1 (@ariarijp)
- #2639: Add tests for SpreadSheets (@ariarijp)
- #2635: Add tests for Query Results (@ariarijp)
- #2537: Remove trailing semicolon (@sieben)
## v4.0.1 - 2018-05-02
### Added
- Log user's screen resolution. @arikfr
### Changed
- [Redshift] fix the order of columns in the schema browser. @akiray03
- Improve dashboard refresh UX: show previous data while refreshing. @arikfr
### Fixed
- Disable fork button to view_only users. @tonyjiangh
- Hide overflowing data source and alert destination names. @kocsmy
- Login pages were broken on mobile. @kocsmy
- Cohort visualization wasn't rendering if value wasn't properly detected as date. @kravets-levko
- Dashboard filters setting wasn't persisting. @arikfr
- Display nulls and empty values as blank in table numeric fields. @chriszs
- Date column on alerts page is labeled "Created By". @dbravender
- Bootstrap script was breaking due to incompatability with pip 10. @ariarijp
### Other
- Updated README. @kocsmy
## v4.0.0 - 2018-04-16
### Added
- MatterMost alert destination. @alon710
- Full screen view on map visualizations. @deecay
- Choropleth map visualization 🗺. @kravets-levko
- Report Celery queue size. @arikfr
- Load dashboard refresh rate from URL. @arikfr
- Configuration for query refresh intervals. @arikfr
### Changed
- TreasureData: improve query failure message. @toru-takahashi
- Update botocore version (fixes an issue with loading Athena tables). @arikfr
- Changed Map visualization name to "Map (Markers)" to distinguish from the Choropleth one. @arikfr
- Use MongoClient for ReplicaSet connections. @fmy
- Update pymongo version to support newer MongoDB versions. @arikfr
- Changed "his" to "their" in user creation form success message. @tnetennba3
- Show friendly names in dynamic forms labels. @arikfr
- Render safe HTML by default in tables to remain backward compatible. @arikfr
- Apply time limit to alert status checking task. @arikfr
- Plotly: increase Y value accuracy. @arikfr
- close metadata database connection early in the execute query Celery task. @arikfr
### Fixed
- Query page layout gets messed up when clicking on "cancel" in "Do you want to leave this page?" dialog. @kravets-levko
- docker-entrypoint broke for other database names than "postgres". @valentin2105
- (BigQuery) UDF URI was used even if empty. @arikfr
- Show correct Box Plot chart hover data. @deeccay
- Fork button shows in data only view, but not working. @arikfr
- Saving widget sends too much data to the server, sometimes making dashboard save fail. @arikfr
- DynamoDB: always return counter as a number rather than string. @arikfr
- MSSQL: UUID fields were detected as booleans. @arikfr
- The whole dashboard page reloads when clicking on refresh. @arikfr
- Line chart with category x-axis: when some values missing, wrong hints displayed on hover. @kravets-levko
- Second Y-axis not displayed when stacking enabled. @kravets-levko
- Widget with empty contents had extra 40px of white space (paddings of container). @kravets-levko
- Add scrollbars to pivot table widgets. @kravets-levko
- Multiple performance, usability and auto-height related fixes to the dashboard rendering engine (also switched to GridStack). @kravets-levko
- Login form missing on LDAP logging page. @idalin
- Empty state: show connect data source link only to admins. @arikfr
- Dashboard "dancing" widgets (when auto-height enabled). @kravets-levko
### Other
- Webpack: ignore vim swap files. @deecay
## v4.0.0-rc.1 - 2018-03-05
### Added
- Configuration for query refresh intervals.
- [Prometheus] Support for range queries. @jubel-han
- Extensions system based on Python entrypoints. @jezdez
- Funnel visualization. @tonyjiangh
- UI to edit allowed Google OAuth domains. @arikfr
- Empty state for homepage, alerts, queries and dashboards pages. @kocsmy, @arikfr
### Changed
- Maintain widget's auto-height state until it's been resized by the user. @kravets-levko
- Change default table viz width from 4 to 3 columns. @kravets-levko
- When saving dashboard adding or removing widgets, save only modified widgets (with changed size and/or position). @kravets-levko
- Don't allow disabling Password based login if no SSO is enabled. @arikfr
- Always show login page, even if password based login disabled. @arikfr
- Upgrade `sqlparse` to 0.2.4. @ariarijp
- Make sure datetime/number columns in table visualization don't wrap. @kravets-levko
- Explicitly set order of tabs in settings page. @kravets-levko
- User can no longer change the type of a saved visualization. @kravets-levko
- Update docker-compose.yml to restart postgres/redis containers `unless-stopped`. @benmanns
- New default colors for chart visualizations. @kocsmy
- Updated design of all the authentication pages (login, forgot password, etc). @kravets-levko
### Fixed
- Glue schemas with more than 100 tables were showing only first 100 tables. @jezdez
- Long visualizations dind't render scrollbars on some browsers. @kravets-levko
- When the dataset was returning some columns name as non strings, table couldn't be rendered. @kravets-levko
- Missing logos for Prometheus and Snowflake. @kocsmy
- Render correct link to LDAP login on login page. @arikfr
- Sort widgets by column/row to make sure they are placed correctly. @arikfr
- Public dashboards were not rendered due to Javascript error. @kravets-levko
## v4.0.0-beta - 2018-02-14 ## v4.0.0-beta - 2018-02-14
### Added ### Added
@@ -79,7 +902,6 @@
- Handling whitespace characters in Query Results data source. @ariarijp - Handling whitespace characters in Query Results data source. @ariarijp
- [MySQL] Close cursor when cancellig the query. @jasonsmithj - [MySQL] Close cursor when cancellig the query. @jasonsmithj
## v3.0.0 - 2017-11-13 ## v3.0.0 - 2017-11-13
### Added ### Added
@@ -112,11 +934,11 @@
- Reduce boilerplate in frontend code. - Reduce boilerplate in frontend code.
- Set auto focus in first input items. @kyoshidajp - Set auto focus in first input items. @kyoshidajp
- Update gunicorn to latest version. - Update gunicorn to latest version.
- Make log format configurable. - Make log format configurable.
- Sort series by name. - Sort series by name.
- Allow setting test file with Docker test run. @meinac - Allow setting test file with Docker test run. @meinac
- Use outdated queries count stored already in Redis. - Use outdated queries count stored already in Redis.
- Show links based on permissions the user have. - Show links based on permissions the user have.
- Cassandra: update driver version. @yershalom - Cassandra: update driver version. @yershalom
- Docker-Compose: update configuration to always restart services. @muddydixon - Docker-Compose: update configuration to always restart services. @muddydixon
- Modernize Python 2 code to get ready for Python 3. @cclauss - Modernize Python 2 code to get ready for Python 3. @cclauss
@@ -125,7 +947,7 @@
- Salesforce: improve error messages we receive from the API. @akiray03 - Salesforce: improve error messages we receive from the API. @akiray03
- Custom JS code visualization improvements. @deecay - Custom JS code visualization improvements. @deecay
- DQL: Update version to 0.5.24. @aterreno - DQL: Update version to 0.5.24. @aterreno
- Cassandra: get_schema support for both C* 2.x and 3.x, support for SortedSet type serialization. (@mfouilleul) - Cassandra: get_schema support for both C\* 2.x and 3.x, support for SortedSet type serialization. (@mfouilleul))
- Replace deprecated ng-annotate with babel plugin. @44px - Replace deprecated ng-annotate with babel plugin. @44px
- Update Python dependencies to recent versions. @alison985 - Update Python dependencies to recent versions. @alison985
- Bootstrap script: create /opt/redash directory only if it doesn't exist. @isomura - Bootstrap script: create /opt/redash directory only if it doesn't exist. @isomura
@@ -145,7 +967,7 @@
- Use series color for Boxplot. @deecay - Use series color for Boxplot. @deecay
- Revoke permission should respect to given grantee and access type. @meinac - Revoke permission should respect to given grantee and access type. @meinac
- Fixed eslint "Cannot read property 'length' of undefined" error. @kravets-levko - Fixed eslint "Cannot read property 'length' of undefined" error. @kravets-levko
- Don't crash query editor when there are unclosed curly brackets. - Don't crash query editor when there are unclosed curly brackets.
- Error value in charts wasn't displayed if it was 0. - Error value in charts wasn't displayed if it was 0.
- Prevent line breaks in EditInPlace description when using Firefox. @alexmuller - Prevent line breaks in EditInPlace description when using Firefox. @alexmuller
- Queries#all_queries was sometimes returning wrong number of queries. - Queries#all_queries was sometimes returning wrong number of queries.
@@ -161,7 +983,6 @@
This is a patch release, that adds support for Redshift ACM certificates (see #2044 for details). This is a patch release, that adds support for Redshift ACM certificates (see #2044 for details).
## v2.0.0 - 2017-08-08 ## v2.0.0 - 2017-08-08
### Added ### Added
@@ -171,7 +992,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
- Add the propertyOrder field to specify order of data source settings. @rmakulov - Add the propertyOrder field to specify order of data source settings. @rmakulov
- Add Plotly based Boxplot visualization. @deecay - Add Plotly based Boxplot visualization. @deecay
- [Presto] Add: query cancellation support. @fbertsch - [Presto] Add: query cancellation support. @fbertsch
- [MongoDB] add $oids JSON extension. - [MongoDB] add \$oids JSON extension.
- [PostgreSQL] support for loading materialized views in schema. - [PostgreSQL] support for loading materialized views in schema.
- [MySQL] Add option to hide SSL settings. - [MySQL] Add option to hide SSL settings.
- [MySQL] support for RDS MySQL and SSL. - [MySQL] support for RDS MySQL and SSL.
@@ -241,7 +1062,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
- [Google Spreadsheets] handle distant future dates. - [Google Spreadsheets] handle distant future dates.
- [SQLite] better handle utf-8 error messages. - [SQLite] better handle utf-8 error messages.
- Fix: don't remove locks for queries with task status of PENDING. - Fix: don't remove locks for queries with task status of PENDING.
- Only split columns with __/:: that end with filter/MultiFilter. - Only split columns with \_\_/:: that end with filter/MultiFilter.
- Alert notifications fail (sometime) with a SQLAlchemy error. - Alert notifications fail (sometime) with a SQLAlchemy error.
- Safeguard against empty query results when checking alert status. @danielerapati - Safeguard against empty query results when checking alert status. @danielerapati
- Delete data source doesn't work when query results referenced by queries. - Delete data source doesn't work when query results referenced by queries.
@@ -260,7 +1081,6 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
- PostgreSQL passwords with spaces were not supported. (#1056) - PostgreSQL passwords with spaces were not supported. (#1056)
- PivotTable wasn't updating after first save. - PivotTable wasn't updating after first save.
## v1.0.3 - 2017-04-18 ## v1.0.3 - 2017-04-18
### Fixed ### Fixed
@@ -307,7 +1127,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
- Fix: query embed dialog close button wasn't working @r0fls - Fix: query embed dialog close button wasn't working @r0fls
- Fix: make errors from Presto runner JSON-serializable @washort - Fix: make errors from Presto runner JSON-serializable @washort
- Fix: race condition in query task status reporting @washort - Fix: race condition in query task status reporting @washort
- Fix: remove $$hashKey from Pivot table - Fix: remove \$\$hashKey from Pivot table
- Fix: map visualization had severe performance issue. - Fix: map visualization had severe performance issue.
- Fix: pemrission dialog wasn't rendering. - Fix: pemrission dialog wasn't rendering.
- Fix: word cloud visualization didn't show column names. - Fix: word cloud visualization didn't show column names.
@@ -324,7 +1144,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
### Changed ### Changed
- [#1563](https://github.com/getredash/redash/pull/1563) Send events to webhook as JSON with a schema. - [#1563](https://github.com/getredash/redash/pull/1563) Send events to webhook as JSON with a schema.
- [#1601] [Presto] friendlier error messages. (@aslotnick) - [#1601][presto] friendlier error messages. (@aslotnick)
- Move the query runner unavailable log message to be DEBUG level instead of WARNING, as it was mainly confusing people. - Move the query runner unavailable log message to be DEBUG level instead of WARNING, as it was mainly confusing people.
- Remove "Send to Cloud" button from Plotly based visualizations. - Remove "Send to Cloud" button from Plotly based visualizations.
- Change Plotly's default hover mode to "Compare". - Change Plotly's default hover mode to "Compare".
@@ -333,7 +1153,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
### Fixed ### Fixed
- [#1564] Fix: map visualization column picker wasn't populated. (@janusd) - [#1564] Fix: map visualization column picker wasn't populated. (@janusd)
- [#1597] [SQL Server] Fix: schema wasn't loading on case sensitive servers. (@deecay) - [#1597][sql server] Fix: schema wasn't loading on case sensitive servers. (@deecay)
- Fix: dashbonard owner couldn't edit his dashboard. - Fix: dashbonard owner couldn't edit his dashboard.
- Fix: toggle_publish event wasn't logged properly. - Fix: toggle_publish event wasn't logged properly.
- Fix: events with API keys were not logged. - Fix: events with API keys were not logged.
@@ -348,7 +1168,7 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
- Fix: extra whitespace created by the filters component. - Fix: extra whitespace created by the filters component.
- Fix: query results cleanup task was trying to delete query objects. - Fix: query results cleanup task was trying to delete query objects.
- Fix: alert subscriptions were not triggered. - Fix: alert subscriptions were not triggered.
- [DynamoDB] Fix: count(*) queries were broken. (@kopanitsa) - [DynamoDB] Fix: count(\*) queries were broken. (@kopanitsa))
- Fix: Redash is using too many database connections. - Fix: Redash is using too many database connections.
- Fix: download links were not working in dashboards. - Fix: download links were not working in dashboards.
- Fix: the first selection in multi filters was broken in dashboards. - Fix: the first selection in multi filters was broken in dashboards.
@@ -365,9 +1185,9 @@ This is a patch release, that adds support for Redshift ACM certificates (see #2
This version has two big changes behind the scenes: This version has two big changes behind the scenes:
* Refactor the frontend to use latest (at the time) Angular version (1.5) along with better frontend pipeline based on - Refactor the frontend to use latest (at the time) Angular version (1.5) along with better frontend pipeline based on)
WebPack. WebPack.
* Refactor the backend code to use SQLAlchemy and Alembic, for easier migrations/upgrades. - Refactor the backend code to use SQLAlchemy and Alembic, for easier migrations/upgrades.)
Along with that we have many fixes, additions, new data sources (Google Analytics, ClickHouse, Amazon Athena, Snowflake) Along with that we have many fixes, additions, new data sources (Google Analytics, ClickHouse, Amazon Athena, Snowflake)
and fixes to the existing ones (mainly ElasticSearch and Cassandra). and fixes to the existing ones (mainly ElasticSearch and Cassandra).
@@ -450,7 +1270,7 @@ We're releasing a new upgrade script -- see [here](https://redash.io/help-onprem
### Added ### Added
- 61fe16e #1374: Add: allow '*' in REDASH_CORS_ACCESS_CONTROL_ALLOW_ORIGIN (Allen Short) - 61fe16e #1374: Add: allow '\*' in REDASH_CORS_ACCESS_CONTROL_ALLOW_ORIGIN (Allen Short)
- 2f09043 #1113: Add: share modify/access permissions for queries and dashboard (whummer) - 2f09043 #1113: Add: share modify/access permissions for queries and dashboard (whummer)
- 3db0eea #1341: Add: support for specifying SAML nameid-format (zoetrope) - 3db0eea #1341: Add: support for specifying SAML nameid-format (zoetrope)
- b0ecd0e #1343: Add: support for local SAML metadata file (zoetrope) - b0ecd0e #1343: Add: support for local SAML metadata file (zoetrope)
@@ -514,7 +1334,6 @@ We're releasing a new upgrade script -- see [here](https://redash.io/help-onprem
- 5d43cbe #1198: Change: add support for Standard SQL in BigQuery query runner (mystelynx) - 5d43cbe #1198: Change: add support for Standard SQL in BigQuery query runner (mystelynx)
- 84d0c22 #1193: Change: modify the argument order of moment.add function call (Kenya Yamaguchi) - 84d0c22 #1193: Change: modify the argument order of moment.add function call (Kenya Yamaguchi)
### Fixed ### Fixed
- d6febb0 #1375: Fix: Download Dataset does not work when not logged in (Joshua Dechant) - d6febb0 #1375: Fix: Download Dataset does not work when not logged in (Joshua Dechant)
@@ -568,7 +1387,7 @@ The main features of this release are:
Also, this release includes numerous smaller features, improvements, and bug fixes. Also, this release includes numerous smaller features, improvements, and bug fixes.
A big thank you goes to all who contributed code and documentation in this release: @AntoineAugusti, @James226, @adamlwgriffiths, @alexdebrie, @anthony-coble, @ariarijp, @dheerajrav, @edwardsharp, @machira, @nabilblk, @ninneko, @ordd, @tomerben, @toru-takahashi, @vishesh92, @vorakumar and @whummer. A big thank you goes to all who contributed code and documentation in this release: @AntoineAugusti, @James226, @adamlwgriffiths, @alexdebrie, @anthony-coble, @ariarijp, @dheerajrav, @edwardsharp, @machira, @nabilblk, @ninneko, @ordd, @tomerben, @toru-takahashi, @vishesh92, @vorakumar and @whummer.
### Added ### Added
@@ -583,7 +1402,7 @@ A big thank you goes to all who contributed code and documentation in this relea
- f64622d #1089: Add support for serialising UUID type within MSSQL #961 (@James226) - f64622d #1089: Add support for serialising UUID type within MSSQL #961 (@James226)
- 857caab #1085: Feature: API to pause a data source (@arikfr) - 857caab #1085: Feature: API to pause a data source (@arikfr)
- 214aa3b #1060: Feature: support configuring user's groups with SAML (@vorakumar) - 214aa3b #1060: Feature: support configuring user's groups with SAML (@vorakumar)
- e20a005 #1007: Issue#1006: Make bottom margin editable for Chart visualization (@vorakumar) - e20a005 #1007: Issue#1006: Make bottom margin editable for Chart visualization (@vorakumar)
- 6e0dd2b #1063: Add support for date/time Y axis (@tomerben) - 6e0dd2b #1063: Add support for date/time Y axis (@tomerben)
- b5a4a6b #979: Feature: Add CLI to edit group permissions (@ninneko) - b5a4a6b #979: Feature: Add CLI to edit group permissions (@ninneko)
- 6d495d2 #1014: Add server-side parameter handling for embeds (@whummer) - 6d495d2 #1014: Add server-side parameter handling for embeds (@whummer)
@@ -629,7 +1448,7 @@ A big thank you goes to all who contributed code and documentation in this relea
- e10ecd2 #1058: Bring back filters if dashboard filters are enabled (@AntoineAugusti) - e10ecd2 #1058: Bring back filters if dashboard filters are enabled (@AntoineAugusti)
- 701035f #1059: Fix: DynamoDB having issues when setting host (@arikfr) - 701035f #1059: Fix: DynamoDB having issues when setting host (@arikfr)
- 2924d4f #1040: Small fixes to visualizations view (@arikfr) - 2924d4f #1040: Small fixes to visualizations view (@arikfr)
- fec0d5f #1037: Fix: multi filter wasn't working with __ syntax (@dheerajrav) - fec0d5f #1037: Fix: multi filter wasn't working with \_\_ syntax (@dheerajrav)
- b066ce4 #1033: Fix: only ask for notification permissions if wasn't denied (@arikfr) - b066ce4 #1033: Fix: only ask for notification permissions if wasn't denied (@arikfr)
- 960c416 #1032: Fix: make sure we return dashboards only for current org only (@arikfr) - 960c416 #1032: Fix: make sure we return dashboards only for current org only (@arikfr)
- b3844d3 #1029: Hive: close connection only if it exists (@arikfr) - b3844d3 #1029: Hive: close connection only if it exists (@arikfr)

View File

@@ -6,11 +6,9 @@ The following is a set of guidelines for contributing to Redash. These are guide
## Quick Links: ## Quick Links:
- [Feature Roadmap](https://trello.com/b/b2LUHU7A/redash-roadmap)
- [Feature Requests](https://discuss.redash.io/c/feature-requests) - [Feature Requests](https://discuss.redash.io/c/feature-requests)
- [Gitter Chat](https://gitter.im/getredash/redash) or [Slack](https://slack.redash.io)
- [Documentation](https://redash.io/help/) - [Documentation](https://redash.io/help/)
- [Blog](http://blog.redash.io/) - [Blog](https://blog.redash.io/)
- [Twitter](https://twitter.com/getredash) - [Twitter](https://twitter.com/getredash)
--- ---
@@ -48,30 +46,32 @@ When creating a new bug report, please make sure to:
If you would like to suggest an enhancement or ask for a new feature: If you would like to suggest an enhancement or ask for a new feature:
- Please check [the roadmap](https://trello.com/b/b2LUHU7A/redash-roadmap) for existing Trello card for what you want to suggest/ask. If there is, feel free to upvote it to signal interest or add your comments. - Please check [the forum](https://discuss.redash.io/c/feature-requests/5) for existing threads about what you want to suggest/ask. If there is, feel free to upvote it to signal interest or add your comments.
- If there is no existing card, open a thread in [the forum](https://discuss.redash.io/c/feature-requests) to start a discussion about what you want to suggest. Try to provide as much details and context as possible and include information about *the problem you want to solve* rather only *your proposed solution*. - If there is no open thread, you're welcome to start one to have a discussion about what you want to suggest. Try to provide as much details and context as possible and include information about *the problem you want to solve* rather only *your proposed solution*.
### Pull Requests ### Pull Requests
- **Code contributions are welcomed**. For big changes or significant features, it's usually better to reach out first and discuss what you want to implement and how (we recommend reading: [Pull Request First](https://medium.com/practical-blend/pull-request-first-f6bb667a9b6#.ozlqxvj36)). This to make sure that what you want to implement is aligned with our goals for the project and that no one else is already working on it. - **Code contributions are welcomed**. For big changes or significant features, it's usually better to reach out first and discuss what you want to implement and how (we recommend reading: [Pull Request First](https://medium.com/practical-blend/pull-request-first-f6bb667a9b6#.ozlqxvj36)). This to make sure that what you want to implement is aligned with our goals for the project and that no one else is already working on it.
- Include screenshots and animated GIFs in your pull request whenever possible. - Include screenshots and animated GIFs in your pull request whenever possible.
- Please add [documentation](#documentation) for new features or changes in functionality along with the code. - Please add [documentation](#documentation) for new features or changes in functionality along with the code.
- Please follow existing code style. We use PEP8 for Python and sensible style for JavaScript. - Please follow existing code style:
- Python: we use [Black](https://github.com/psf/black) to auto format the code.
- Javascript: we use [Prettier](https://github.com/prettier/prettier) to auto-format the code.
### Documentation ### Documentation
The project's documentation can be found at [https://redash.io/help/](https://redash.io/help/). The [documentation sources](https://github.com/getredash/website/tree/master/user-guide) are hosted on GitHub. To contribute edits / new pages, you can use GitHub's interface. Click the "Edit on GitHub" link on the documentation page to quickly open the edit interface. The project's documentation can be found at [https://redash.io/help/](https://redash.io/help/). The [documentation sources](https://github.com/getredash/website/tree/master/src/pages/kb) are hosted on GitHub. To contribute edits / new pages, you can use GitHub's interface. Click the "Edit on GitHub" link on the documentation page to quickly open the edit interface.
## Additional Notes ## Additional Notes
### Release Method ### Release Method
We publish a stable release every ~2 months, although the goal is to get to a stable release every month. You can see the change log on [GitHub releases page](http://github.com/getredash/redash/releases). We publish a stable release every ~3-4 months, although the goal is to get to a stable release every month.
Every build of the master branch updates the latest *RC release*. These releases are usually stable, but might contain regressions and therefore recommended for "advanced users" only. Every build of the master branch updates the *redash/redash:preview* Docker Image. These releases are usually stable, but might contain regressions and therefore recommended for "advanced users" only.
When we release a new stable release, we also update the *latest* Docker image tag, the EC2 AMIs and GCE images. When we release a new stable release, we also update the *latest* Docker image tag, the EC2 AMIs and GCE images.
## Code of Conduct ## Code of Conduct
This project adheres to the Contributor Covenant [code of conduct](http://redash.io/community/code_of_conduct). By participating, you are expected to uphold this code. Please report unacceptable behavior to team@redash.io. This project adheres to the Contributor Covenant [code of conduct](https://redash.io/community/code_of_conduct). By participating, you are expected to uphold this code. Please report unacceptable behavior to team@redash.io.

View File

@@ -1,13 +1,94 @@
FROM redash/base:latest FROM node:12 as frontend-builder
# Controls whether to build the frontend assets
ARG skip_frontend_build
ENV CYPRESS_INSTALL_BINARY=0
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
RUN useradd -m -d /frontend redash
USER redash
WORKDIR /frontend
COPY --chown=redash package.json package-lock.json /frontend/
COPY --chown=redash viz-lib /frontend/viz-lib
# Controls whether to instrument code for coverage information
ARG code_coverage
ENV BABEL_ENV=${code_coverage:+test}
RUN if [ "x$skip_frontend_build" = "x" ] ; then npm ci --unsafe-perm; fi
COPY --chown=redash client /frontend/client
COPY --chown=redash webpack.config.js /frontend/
RUN if [ "x$skip_frontend_build" = "x" ] ; then npm run build; else mkdir -p /frontend/client/dist && touch /frontend/client/dist/multi_org.html && touch /frontend/client/dist/index.html; fi
FROM python:3.7-slim
EXPOSE 5000
# Controls whether to install extra dependencies needed for all data sources.
ARG skip_ds_deps
# Controls whether to install dev dependencies.
ARG skip_dev_deps
RUN useradd --create-home redash
# Ubuntu packages
RUN apt-get update && \
apt-get install -y \
curl \
gnupg \
build-essential \
pwgen \
libffi-dev \
sudo \
git-core \
wget \
# Postgres client
libpq-dev \
# ODBC support:
g++ unixodbc-dev \
# for SAML
xmlsec1 \
# Additional packages required for data sources:
libssl-dev \
default-libmysqlclient-dev \
freetds-dev \
libsasl2-dev \
unzip \
libsasl2-modules-gssapi-mit && \
# MSSQL ODBC Driver:
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
apt-get update && \
ACCEPT_EULA=Y apt-get install -y msodbcsql17 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ARG databricks_odbc_driver_url=https://databricks.com/wp-content/uploads/2.6.10.1010-2/SimbaSparkODBC-2.6.10.1010-2-Debian-64bit.zip
ADD $databricks_odbc_driver_url /tmp/simba_odbc.zip
RUN unzip /tmp/simba_odbc.zip -d /tmp/ \
&& dpkg -i /tmp/SimbaSparkODBC-*/*.deb \
&& echo "[Simba]\nDriver = /opt/simba/spark/lib/64/libsparkodbc_sb64.so" >> /etc/odbcinst.ini \
&& rm /tmp/simba_odbc.zip \
&& rm -rf /tmp/SimbaSparkODBC*
WORKDIR /app
# Disalbe PIP Cache and Version Check
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
ENV PIP_NO_CACHE_DIR=1
# We first copy only the requirements file, to avoid rebuilding on every file # We first copy only the requirements file, to avoid rebuilding on every file
# change. # change.
COPY requirements.txt requirements_dev.txt requirements_all_ds.txt ./ COPY requirements.txt requirements_bundles.txt requirements_dev.txt requirements_all_ds.txt ./
RUN pip install -r requirements.txt -r requirements_dev.txt -r requirements_all_ds.txt RUN if [ "x$skip_dev_deps" = "x" ] ; then pip install -r requirements.txt -r requirements_dev.txt; else pip install -r requirements.txt; fi
RUN if [ "x$skip_ds_deps" = "x" ] ; then pip install -r requirements_all_ds.txt ; else echo "Skipping pip install -r requirements_all_ds.txt" ; fi
COPY . ./ COPY . /app
RUN npm install && npm run build && rm -rf node_modules COPY --from=frontend-builder /frontend/client/dist /app/client/dist
RUN chown -R redash /app RUN chown -R redash /app
USER redash USER redash
ENTRYPOINT ["/app/bin/docker-entrypoint"] ENTRYPOINT ["/app/bin/docker-entrypoint"]
CMD ["server"]

View File

@@ -1,4 +1,4 @@
Copyright (c) 2013-2018, Arik Fraimovich. Copyright (c) 2013-2020, Arik Fraimovich.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,

57
Makefile Normal file
View File

@@ -0,0 +1,57 @@
.PHONY: compose_build up test_db create_database clean down bundle tests lint backend-unit-tests frontend-unit-tests test build watch start redis-cli bash
compose_build:
docker-compose build
up:
docker-compose up -d --build
test_db:
@for i in `seq 1 5`; do \
if (docker-compose exec postgres sh -c 'psql -U postgres -c "select 1;"' 2>&1 > /dev/null) then break; \
else echo "postgres initializing..."; sleep 5; fi \
done
docker-compose exec postgres sh -c 'psql -U postgres -c "drop database if exists tests;" && psql -U postgres -c "create database tests;"'
create_database:
docker-compose run server create_db
clean:
docker-compose down && docker-compose rm
down:
docker-compose down
bundle:
docker-compose run server bin/bundle-extensions
tests:
docker-compose run server tests
lint:
./bin/flake8_tests.sh
backend-unit-tests: up test_db
docker-compose run --rm --name tests server tests
frontend-unit-tests: bundle
CYPRESS_INSTALL_BINARY=0 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 npm ci
npm run bundle
npm test
test: lint backend-unit-tests frontend-unit-tests
build: bundle
npm run build
watch: bundle
npm run watch
start: bundle
npm run start
redis-cli:
docker-compose run --rm redis redis-cli -h redis
bash:
docker-compose run --rm server bash

View File

@@ -1,49 +1,96 @@
<p align="center"> <p align="center">
<img title="Redash" src='https://redash.io/assets/images/logo.png' width="200px"/> <img title="Redash" src='https://redash.io/assets/images/logo.png' width="200px"/>
</p> </p>
<p align="center">
<img title="Build Status" src='https://circleci.com/gh/getredash/redash.png?circle-token=8a695aa5ec2cbfa89b48c275aea298318016f040'/>
</p>
[![Join the chat at https://gitter.im/getredash/redash](https://badges.gitter.im/getredash/redash.svg)](https://gitter.im/getredash/redash?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Documentation](https://img.shields.io/badge/docs-redash.io/help-brightgreen.svg)](https://redash.io/help/) [![Documentation](https://img.shields.io/badge/docs-redash.io/help-brightgreen.svg)](https://redash.io/help/)
[![Datree](https://s3.amazonaws.com/catalog.static.datree.io/datree-badge-20px.svg)](https://datree.io/?src=badge)
[![Build Status](https://circleci.com/gh/getredash/redash.png?style=shield&circle-token=8a695aa5ec2cbfa89b48c275aea298318016f040)](https://circleci.com/gh/getredash/redash/tree/master)
**_Redash_** is our take on freeing the data within our company in a way that will better fit our culture and usage patterns. 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.
Prior to **_Redash_**, we tried to use traditional BI suites and discovered a set of bloated, technically challenged and slow tools/flows. What we were looking for was a more hacker'ish way to look at data, so we built one. Redash features:
**_Redash_** was built to allow fast and easy access to billions of records, that we process and collect using Amazon Redshift ("petabyte scale data warehouse" that "speaks" PostgreSQL). 1. **Browser-based**: Everything in your browser, with a shareable URL.
Today **_Redash_** has support for querying multiple databases, including: Redshift, Google BigQuery, PostgreSQL, MySQL, Graphite, 2. **Ease-of-use**: Become immediately productive with data without the need to master complex software.
Presto, Google Spreadsheets, Cloudera Impala, Hive and custom scripts. 3. **Query editor**: Quickly compose SQL and NoSQL queries with a schema browser and auto-complete.
4. **Visualization and dashboards**: Create [beautiful visualizations](https://redash.io/help/user-guide/visualizations/visualization-types) with drag and drop, and combine them into a single dashboard.
5. **Sharing**: Collaborate easily by sharing visualizations and their associated queries, enabling peer review of reports and queries.
6. **Schedule refreshes**: Automatically update your charts and dashboards at regular intervals you define.
7. **Alerts**: Define conditions and be alerted instantly when your data changes.
8. **REST API**: Everything that can be done in the UI is also available through REST API.
9. **Broad support for data sources**: Extensible data source API with native support for a long list of common databases and platforms.
**_Redash_** consists of two parts: <img src="https://raw.githubusercontent.com/getredash/website/8e820cd02c73a8ddf4f946a9d293c54fd3fb08b9/website/_assets/images/redash-anim.gif" width="80%"/>
1. **Query Editor**: think of [JS Fiddle](http://jsfiddle.net) for SQL queries. It's your way to share data in the organization in an open way, by sharing both the dataset and the query that generated it. This way everyone can peer review not only the resulting dataset but also the process that generated it. Also it's possible to fork it and generate new datasets and reach new insights.
2. **Dashboards/Visualizations**: once you have a dataset, you can create different visualizations out of it, and then combine several visualizations into a single dashboard. Currently it supports charts, pivot table and cohorts.
## Demo
<img src="https://cloud.githubusercontent.com/assets/71468/17391289/8e83878e-5a1d-11e6-8938-af9054a33b19.gif" width="60%"/>
You can try out the demo instance: http://demo.redash.io/ (login with any Google account).
## Getting Started ## Getting Started
* [Setting up Redash instance](https://redash.io/help-onpremise/setup/setting-up-redash-instance.html) (includes links to ready made AWS/GCE images). * [Setting up Redash instance](https://redash.io/help/open-source/setup) (includes links to ready-made AWS/GCE images).
* [Documentation](https://redash.io/help/). * [Documentation](https://redash.io/help/).
## Supported Data Sources
Redash supports more than 35 SQL and NoSQL [data sources](https://redash.io/help/data-sources/supported-data-sources). It can also be extended to support more. Below is a list of built-in sources:
- Amazon Athena
- Amazon DynamoDB
- Amazon Redshift
- Axibase Time Series Database
- Cassandra
- ClickHouse
- CockroachDB
- CSV
- Databricks (Apache Spark)
- 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
## Getting Help ## Getting Help
* Issues: https://github.com/getredash/redash/issues * Issues: https://github.com/getredash/redash/issues
* Discussion Forum: https://discuss.redash.io/ * Discussion Forum: https://discuss.redash.io/
* Slack: http://slack.redash.io/
* Gitter (chat): https://gitter.im/getredash/redash
## Reporting Bugs and Contributing Code ## Reporting Bugs and Contributing Code
* Want to report a bug or request a feature? Please open [an issue](https://github.com/getredash/redash/issues/new). * Want to report a bug or request a feature? Please open [an issue](https://github.com/getredash/redash/issues/new).
* Want to help us build **_Redash_**? Fork the project, edit in a [dev environment](https://redash.io/help-onpremise/dev/guide.html), and make a pull request. We need all the help we can get! * Want to help us build **_Redash_**? Fork the project, edit in a [dev environment](https://redash.io/help-onpremise/dev/guide.html) and make a pull request. We need all the help we can get!
## Security
Please email security@redash.io to report any security vulnerabilities. We will acknowledge receipt of your vulnerability and strive to send you regular updates about our progress. If you're curious about the status of your disclosure please feel free to email us again. If you want to encrypt your disclosure email, you can use [this PGP key](https://keybase.io/arikfr/key.asc).
## License ## License

5
SECURITY.md Normal file
View File

@@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Please email security@redash.io to report any security vulnerabilities. We will acknowledge receipt of your vulnerability and strive to send you regular updates about our progress. If you're curious about the status of your disclosure please feel free to email us again. If you want to encrypt your disclosure email, you can use [this PGP key](https://keybase.io/arikfr/key.asc).

115
bin/bundle-extensions Executable file
View File

@@ -0,0 +1,115 @@
#!/usr/bin/env python3
"""Copy bundle extension files to the client/app/extension directory"""
import logging
import os
from pathlib import Path
from shutil import copy
from collections import OrderedDict as odict
import importlib_metadata
import importlib_resources
# Name of the subdirectory
BUNDLE_DIRECTORY = "bundle"
logger = logging.getLogger(__name__)
# Make a directory for extensions and set it as an environment variable
# to be picked up by webpack.
extensions_relative_path = Path("client", "app", "extensions")
extensions_directory = Path(__file__).parent.parent / extensions_relative_path
if not extensions_directory.exists():
extensions_directory.mkdir()
os.environ["EXTENSIONS_DIRECTORY"] = str(extensions_relative_path)
def entry_point_module(entry_point):
"""Returns the dotted module path for the given entry point"""
return entry_point.pattern.match(entry_point.value).group("module")
def load_bundles():
""""Load bundles as defined in Redash extensions.
The bundle entry point can be defined as a dotted path to a module
or a callable, but it won't be called but just used as a means
to find the files under its file system path.
The name of the directory it looks for files in is "bundle".
So a Python package with an extension bundle could look like this::
my_extensions/
├── __init__.py
└── wide_footer
├── __init__.py
└── bundle
├── extension.js
└── styles.css
and would then need to register the bundle with an entry point
under the "redash.bundles" group, e.g. in your setup.py::
setup(
# ...
entry_points={
"redash.bundles": [
"wide_footer = my_extensions.wide_footer",
]
# ...
},
# ...
)
"""
bundles = odict()
for entry_point in importlib_metadata.entry_points().get("redash.bundles", []):
logger.info('Loading Redash bundle "%s".', entry_point.name)
module = entry_point_module(entry_point)
# Try to get a list of bundle files
try:
bundle_dir = importlib_resources.files(module).joinpath(BUNDLE_DIRECTORY)
except (ImportError, TypeError):
# Module isn't a package, so can't have a subdirectory/-package
logger.error(
'Redash bundle module "%s" could not be imported: "%s"',
entry_point.name,
module,
)
continue
if not bundle_dir.is_dir():
logger.error(
'Redash bundle directory "%s" could not be found or is not a directory: "%s"',
entry_point.name,
bundle_dir,
)
continue
bundles[entry_point.name] = list(bundle_dir.rglob("*"))
return bundles
bundles = load_bundles().items()
if bundles:
print("Number of extension bundles found: {}".format(len(bundles)))
else:
print("No extension bundles found.")
for bundle_name, paths in bundles:
# Shortcut in case not paths were found for the bundle
if not paths:
print('No paths found for bundle "{}".'.format(bundle_name))
continue
# The destination for the bundle files with the entry point name as the subdirectory
destination = Path(extensions_directory, bundle_name)
if not destination.exists():
destination.mkdir()
# Copy the bundle directory from the module to its destination.
print('Copying "{}" bundle to {}:'.format(bundle_name, destination.resolve()))
for src_path in paths:
dest_path = destination / src_path.name
print(" - {} -> {}".format(src_path, dest_path))
copy(str(src_path), str(dest_path))

View File

@@ -1,32 +1,41 @@
#!/bin/bash #!/bin/bash
set -e set -e
worker() { scheduler() {
WORKERS_COUNT=${WORKERS_COUNT:-2} echo "Starting RQ scheduler..."
QUEUES=${QUEUES:-queries,scheduled_queries,celery}
echo "Starting $WORKERS_COUNT workers for queues: $QUEUES..." exec /app/manage.py rq scheduler
exec /usr/local/bin/celery worker --app=redash.worker -c$WORKERS_COUNT -Q$QUEUES -linfo --maxtasksperchild=10 -Ofair
} }
scheduler() { dev_scheduler() {
WORKERS_COUNT=${WORKERS_COUNT:-1} echo "Starting dev RQ scheduler..."
QUEUES=${QUEUES:-celery}
echo "Starting scheduler and $WORKERS_COUNT workers for queues: $QUEUES..." exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq scheduler
}
exec /usr/local/bin/celery worker --app=redash.worker --beat -c$WORKERS_COUNT -Q$QUEUES -linfo --maxtasksperchild=10 -Ofair worker() {
echo "Starting RQ worker..."
export WORKERS_COUNT=${WORKERS_COUNT:-2}
export QUEUES=${QUEUES:-}
exec supervisord -c worker.conf
}
dev_worker() {
echo "Starting dev RQ worker..."
exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq worker $QUEUES
} }
server() { server() {
exec /usr/local/bin/gunicorn -b 0.0.0.0:5000 --name redash -w${REDASH_WEB_WORKERS:-4} redash.wsgi:app # Recycle gunicorn workers every n-th request. See http://docs.gunicorn.org/en/stable/settings.html#max-requests for more details.
MAX_REQUESTS=${MAX_REQUESTS:-1000}
MAX_REQUESTS_JITTER=${MAX_REQUESTS_JITTER:-100}
exec /usr/local/bin/gunicorn -b 0.0.0.0:5000 --name redash -w${REDASH_WEB_WORKERS:-4} redash.wsgi:app --max-requests $MAX_REQUESTS --max-requests-jitter $MAX_REQUESTS_JITTER
} }
create_db() { create_db() {
while ! bash -c "echo > /dev/tcp/postgres/5432" &> /dev/null ; do
echo "Waiting for PostgreSQL container to become available."
sleep 5
done
exec /app/manage.py database create_tables exec /app/manage.py database create_tables
} }
@@ -37,11 +46,14 @@ help() {
echo "" echo ""
echo "server -- start Redash server (with gunicorn)" echo "server -- start Redash server (with gunicorn)"
echo "worker -- start Celery worker" echo "worker -- start a single RQ worker"
echo "scheduler -- start Celery worker with a beat (scheduler) process" echo "dev_worker -- start a single RQ worker with code reloading"
echo "scheduler -- start an rq-scheduler instance"
echo "dev_scheduler -- start an rq-scheduler instance with code reloading"
echo "" echo ""
echo "shell -- open shell" echo "shell -- open shell"
echo "dev_server -- start Flask development server with debugger and auto reload" echo "dev_server -- start Flask development server with debugger and auto reload"
echo "debug -- start Flask development server with remote debugger via ptvsd"
echo "create_db -- create database tables" echo "create_db -- create database tables"
echo "manage -- CLI to manage redash" echo "manage -- CLI to manage redash"
echo "tests -- run tests" echo "tests -- run tests"
@@ -71,9 +83,27 @@ case "$1" in
shift shift
scheduler scheduler
;; ;;
dev_scheduler)
shift
dev_scheduler
;;
dev_worker)
shift
dev_worker
;;
celery_healthcheck)
shift
echo "DEPRECATED: Celery has been replaced with RQ and now performs healthchecks autonomously as part of the 'worker' entrypoint."
;;
dev_server) dev_server)
export FLASK_DEBUG=1
exec /app/manage.py runserver --debugger --reload -h 0.0.0.0 exec /app/manage.py runserver --debugger --reload -h 0.0.0.0
;; ;;
debug)
export FLASK_DEBUG=1
export REMOTE_DEBUG=1
exec /app/manage.py runserver --debugger --no-reload -h 0.0.0.0
;;
shell) shell)
exec /app/manage.py shell exec /app/manage.py shell
;; ;;

9
bin/flake8_tests.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
set -o errexit # fail the build if any task fails
flake8 --version ; pip --version
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics

37
bin/get_changes.py Normal file
View File

@@ -0,0 +1,37 @@
#!/bin/env python3
import sys
import re
import subprocess
def get_change_log(previous_sha):
args = ['git', '--no-pager', 'log', '--merges', '--grep', 'Merge pull request', '--pretty=format:"%h|%s|%b|%p"', 'master...{}'.format(previous_sha)]
log = subprocess.check_output(args)
changes = []
for line in log.split('\n'):
try:
sha, subject, body, parents = line[1:-1].split('|')
except ValueError:
continue
try:
pull_request = re.match("Merge pull request #(\d+)", subject).groups()[0]
pull_request = " #{}".format(pull_request)
except Exception as ex:
pull_request = ""
author = subprocess.check_output(['git', 'log', '-1', '--pretty=format:"%an"', parents.split(' ')[-1]])[1:-1]
changes.append("{}{}: {} ({})".format(sha, pull_request, body.strip(), author))
return changes
if __name__ == '__main__':
previous_sha = sys.argv[1]
changes = get_change_log(previous_sha)
for change in changes:
print(change)

View File

@@ -1,8 +0,0 @@
#!/bin/bash
NAME=redash
VERSION=$(python ./manage.py version)
FULL_VERSION=$VERSION+b$CIRCLE_BUILD_NUM
FILENAME=$CIRCLE_ARTIFACTS/$NAME.$FULL_VERSION.tar.gz
sed -ri "s/^__version__ = '([A-Za-z0-9.-]*)'/__version__ = '$FULL_VERSION'/" redash/__init__.py
tar -zcv -f $FILENAME --exclude="optipng*" --exclude=".git*" --exclude="*.pyc" --exclude="*.pyo" --exclude="venv" --exclude="node_modules" *

View File

@@ -1,18 +0,0 @@
#!/usr/bin/env bash
# Heroku pre_compile script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd $DIR/..
# heroku requires cffi to be in requirements.txt in order for libffi to be installed.
# https://github.com/heroku/heroku-buildpack-python/blob/master/bin/steps/cryptography
# to avoid making it a requirement for other build systems, we'll inject it now
# into the requirements.txt file
# Remove Heroku unsupported Python packages:
grep -v -E "^(pymssql|thrift|sasl|pyhive)" requirements_all_ds.txt >> requirements.txt
# make the heroku Procfile the active one
cp Procfile.heroku Procfile
popd

View File

@@ -1,10 +1,10 @@
from __future__ import print_function #!/usr/bin/env python3
import os import os
import sys import sys
import json
import re import re
import subprocess import subprocess
import requests import requests
import simplejson
github_token = os.environ['GITHUB_TOKEN'] github_token = os.environ['GITHUB_TOKEN']
auth = (github_token, 'x-oauth-basic') auth = (github_token, 'x-oauth-basic')
@@ -17,7 +17,7 @@ def _github_request(method, path, params=None, headers={}):
url = path url = path
if params is not None: if params is not None:
params = json.dumps(params) params = simplejson.dumps(params)
response = requests.request(method, url, data=params, auth=auth) response = requests.request(method, url, data=params, auth=auth)
return response return response

View File

@@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import urllib import urllib
import argparse import argparse
import os import os
@@ -27,7 +27,7 @@ def run(cmd, cwd=None):
def confirm(question): def confirm(question):
reply = str(raw_input(question + ' (y/n): ')).lower().strip() reply = str(input(question + ' (y/n): ')).lower().strip()
if reply[0] == 'y': if reply[0] == 'y':
return True return True

View File

@@ -1,34 +0,0 @@
machine:
services:
- docker
- redis
node:
version:
6.9.1
dependencies:
override:
- pip install --upgrade setuptools
- pip install -r requirements_dev.txt
- pip install -r requirements.txt
- npm install
- npm run build
cache_directories:
- node_modules/
test:
override:
- pytest --junitxml=$CIRCLE_TEST_REPORTS/junit.xml tests/
deployment:
github_and_docker:
branch: [master, /release.*/]
commands:
- bin/pack
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- docker build -t redash/redash:$(./manage.py version | sed -e "s/\+/./") .
- docker push redash/redash:$(./manage.py version | sed -e "s/\+/./")
notify:
webhooks:
- url: https://webhooks.gitter.im/e/895d09c3165a0913ac2f
general:
branches:
ignore:
- gh-pages

View File

@@ -1,10 +1,29 @@
{ {
"presets": ["es2015", "stage-2"], "presets": [
[
"@babel/preset-env",
{
"exclude": ["@babel/plugin-transform-async-to-generator", "@babel/plugin-transform-arrow-functions"],
"corejs": "2",
"useBuiltIns": "usage"
}
],
"@babel/preset-react",
"@babel/preset-typescript"
],
"plugins": [ "plugins": [
"angularjs-annotate", "@babel/plugin-proposal-class-properties",
"transform-object-assign", "@babel/plugin-transform-object-assign",
["babel-plugin-transform-builtin-extend", { [
"globals": ["Error"] "babel-plugin-transform-builtin-extend",
}] {
] "globals": ["Error"]
}
]
],
"env": {
"test": {
"plugins": ["istanbul"]
}
}
} }

View File

@@ -1,3 +1,4 @@
build/*.js build/*.js
dist
config/*.js config/*.js
node_modules client/dist

View File

@@ -1,32 +1,57 @@
module.exports = { module.exports = {
root: true, root: true,
extends: "airbnb-base", parser: "@typescript-eslint/parser",
extends: [
"react-app",
"plugin:compat/recommended",
"prettier",
// Remove any typescript-eslint rules that would conflict with prettier
"prettier/@typescript-eslint",
],
plugins: ["jest", "compat", "no-only-tests", "@typescript-eslint"],
settings: { settings: {
"import/resolver": "webpack" "import/resolver": "webpack",
}, },
env: { env: {
"browser": true, browser: true,
"node": true node: true,
}, },
rules: { rules: {
// allow debugger during development // allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, "no-debugger": process.env.NODE_ENV === "production" ? 2 : 0,
'no-param-reassign': 0, "jsx-a11y/anchor-is-valid": "off",
'no-mixed-operators': 0, "no-restricted-imports": [
'no-underscore-dangle': 0, "error",
"prefer-destructuring": "off", {
"prefer-template": "off", paths: [
"no-restricted-properties": "off", {
"no-restricted-globals": "off", name: "antd",
"no-multi-assign": "off", message: "Please use 'import XXX from antd/lib/XXX' import instead.",
"no-lonely-if": "off", },
"consistent-return": "off", {
"max-len": ['error', 120, 2, { name: "antd/lib",
ignoreUrls: true, message: "Please use 'import XXX from antd/lib/XXX' import instead.",
ignoreComments: false, },
ignoreRegExpLiterals: true, ],
ignoreStrings: true, },
ignoreTemplateLiterals: true, ],
}] },
} overrides: [
{
// Only run typescript-eslint on TS files
files: ["*.ts", "*.tsx", ".*.ts", ".*.tsx"],
extends: ["plugin:@typescript-eslint/recommended"],
rules: {
// Do not require functions (especially react components) to have explicit returns
"@typescript-eslint/explicit-function-return-type": "off",
// Do not require to type every import from a JS file to speed up development
"@typescript-eslint/no-explicit-any": "off",
// Do not complain about useless contructors in declaration files
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
// Many API fields and generated types use camelcase
"@typescript-eslint/camelcase": "off",
},
},
],
}; };

10
client/app/.eslintrc.js Normal file
View File

@@ -0,0 +1,10 @@
module.exports = {
extends: ["plugin:jest/recommended"],
plugins: ["jest"],
env: {
"jest/globals": true,
},
rules: {
"jest/no-focused-tests": "off",
},
};

View File

@@ -0,0 +1,4 @@
import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-16";
configure({ adapter: new Adapter() });

View File

@@ -0,0 +1,5 @@
import MockDate from "mockdate";
const date = new Date("2000-01-01T02:00:00.000");
MockDate.set(date);

View File

@@ -1,718 +0,0 @@
body {
padding-top: 50px;
}
a[ng-click] {
cursor: pointer;
}
a.link {
cursor: pointer;
}
a.page-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 400px;
}
a.navbar-brand {
padding: 5px 5px 0px 0px;
margin-left: 0px !important;
}
.navbar .fa {
font-size: 18px;
}
a.navbar-brand img {
height: 40px;
}
.avatar {
margin-top: 5px;
margin-bottom: 5px;
}
.avatar img {
width: 40px;
height: 40px;
}
#logout {
color: white;
position: relative;
left: -9px;
bottom: -11px;
}
.details-toggle {
cursor: pointer;
}
.details-toggle::before {
content: '▸';
margin-right: 5px;
}
.details-toggle.open::before {
content: '▾';
margin-right: 5px;
}
.edit-in-place span {
white-space: pre-line;
}
.edit-in-place span.editable {
cursor: pointer;
}
.edit-in-place span.editable:hover {
background: #FCFCA2;
}
.edit-in-place input,
.edit-in-place textarea {
display: none;
}
.edit-in-place.active span {
display: none;
}
.edit-in-place.active input,
.edit-in-place.active textarea {
display: inline-block;
}
.delete-button {
float: none !important;
}
.list-group-item.active button {
color: white;
}
.panel-heading > p:last-child {
margin-bottom: 0px;
}
.panel-heading > a,
.panel-heading .query-link {
color: inherit;
}
.panel-heading .query-link:hover {
text-decoration: underline;
}
.form-group.required .control-label:after {
content: "*";
color: red;
}
.form-group .help-block.error {
display: none;
}
.form-group.has-error .help-block.error {
display: block;
}
/* angular-growl */
.growl {
position: fixed;
bottom: 10px;
right: 10px;
float: right;
width: 250px;
z-index: 10000;
}
.growl-item.ng-enter,
.growl-item.ng-leave {
-webkit-transition: 0.5s linear all;
-moz-transition: 0.5s linear all;
-o-transition: 0.5s linear all;
transition: 0.5s linear all;
}
.growl-item.ng-enter,
.growl-item.ng-leave.ng-leave-active {
opacity: 0;
}
.growl-item.ng-leave,
.growl-item.ng-enter.ng-enter-active {
opacity: 1;
}
/* Gridster */
li.widget {
/*background-color:grey;*/
border-width: 1px;
border-style: solid;
border-color: grey;
opacity: 0.7;
cursor: move;
}
li.widget:hover {
opacity: 1.0 !important;
-webkit-transition: opacity .6s;
-moz-transition: opacity .6s;
-o-transition: opacity .6s;
-ms-transition: opacity .6s;
transition: opacity .6s;
}
.gridster .preview-holder {
border: none !important;
border-radius: 0 !important;
background: rgba(0, 0, 0, 0.5) !important;
}
.gridster li .heading {
border: #ddd;
background-color: #f5f5f5;
padding: 5px;
}
/* Editor */
.ace_editor {
border: 1px solid #eee;
height: 100%;
margin-bottom: 10px;
}
/* Support for Font-Awesome in btn-xs */
.btn-xs > .fa {
font-size: 14px;
top: 1px;
position: relative;
}
/* Because of ng-repeat we add span between the .dropdown-menu element and the li element, so we had
to add those CSS styles here. */
.dropdown-menu > span > li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: 1.428571429;
color: #333333;
white-space: nowrap;
}
.dropdown-menu > span > li > a:hover,
.dropdown-menu > span > li > a:focus {
color: #ffffff;
text-decoration: none;
background-color: #428bca;
}
/* Dropdown submenus */
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
-webkit-border-radius: 0 6px 6px 6px;
-moz-border-radius: 0 6px 6px 6px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover > .dropdown-menu {
display: block;
}
.dropdown-submenu > a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
/*border-left-color: #ffffff;*/
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left > .dropdown-menu {
left: -100%;
margin-left: 10px;
-webkit-border-radius: 6px 0 6px 6px;
-moz-border-radius: 6px 0 6px 6px;
border-radius: 6px 0 6px 6px;
}
.rd-tab .remove {
cursor: pointer;
color: #A09797;
padding: 0 3px 1px 4px;
font-size: 11px;
}
.rd-tab .remove:hover {
color: white;
background-color: #FF8080;
border-radius: 50%;
}
.tab-nav > li.rd-tab-btn {
float: right;
padding-right: 10px;
padding-top: 10px;
}
/* light version of bootstrap's form-control */
.rd-form-control {
display: block;
padding: 6px 12px;
line-height: 1.428571429;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.rd-form-control {
width: 90%;
}
pivot-table-renderer > table, grid-renderer > div, visualization-renderer > div {
overflow: auto;
}
counter-renderer {
display: block;
text-align: center;
padding: 15px 10px;
overflow: hidden;
}
counter-renderer counter {
margin: 0;
display: block;
font-size: 80px;
overflow: hidden;
}
counter-renderer value,
counter-renderer counter-name,
counter-renderer counter-target {
font-size: 1em;
line-height: 1em;
display: block;
}
counter-renderer value .ruler,
counter-renderer counter-name .ruler,
counter-renderer counter-target .ruler {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font: inherit;
line-height: inherit;
margin: 0;
padding: 0;
}
counter-renderer counter-target {
color: #ccc;
}
counter-renderer counter.positive value {
color: #5cb85c;
}
counter-renderer counter.negative value {
color: #d9534f;
margin-right: 15px;
}
counter-renderer counter-name {
font-size: 0.5em;
display: block;
}
.box {
font: 10px sans-serif;
}
.box line,
.box rect,
.box circle {
fill: #fff;
stroke: #000;
stroke-width: 1.5px;
}
.box .center {
stroke-dasharray: 3, 3;
}
.box .outlier {
fill: none;
stroke: #000;
}
.axis text {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.grid-background {
fill: #ddd;
}
.grid path,
.grid line {
fill: none;
stroke: #fff;
shape-rendering: crispEdges;
}
.grid .minor line {
stroke-opacity: .5;
}
.grid text {
display: none;
}
.iframe-container {
height: 100%;
}
.schema-container {
height: 100%;
z-index: 10;
background-color: white;
}
.schema-control {
display: flex;
padding: 5px 0;
}
.schema-control .form-control {
height: 30px;
margin-right: 5px;
}
.schema-browser {
height: calc(100% - 45px);
overflow-y: auto;
overflow-x: hidden;
border: 1px solid rgba(0,0,0,.15);
}
.parameter-label {
display: block;
}
div.table-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
padding: 0 10px;
}
div.table-name:hover {
background: #f4f4f4;
}
.blankslate {
text-align: center;
padding: 30px;
}
/* Footer */
.footer {
color: #818d9f;
padding-bottom: 30px;
}
.footer a {
color: #818d9f;
margin-left: 20px;
}
.col-table .missing-value {
color: #b94a48;
}
.col-table .super-small-input {
padding-left: 3px;
height: 24px;
}
.col-table .ui-select-toggle, .col-table .ui-select-search {
padding: 2px;
padding-left: 5px;
height: 24px;
}
.clearable button {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
/* Immediately apply ng-cloak, instead of waiting for angular.js to load: */
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
}
.voffset {
margin-top: 2px;
}
.voffset1 {
margin-top: 5px;
}
.voffset2 {
margin-top: 10px;
}
.voffset3 {
margin-top: 15px;
}
.voffset4 {
margin-top: 30px;
}
.voffset5 {
margin-top: 40px;
}
.voffset6 {
margin-top: 60px;
}
.voffset7 {
margin-top: 80px;
}
.voffset8 {
margin-top: 100px;
}
.voffset9 {
margin-top: 150px;
}
.overlay {
background-color: #808080;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
padding: 0;
z-index: 1000;
opacity: 0.8;
}
.container-fluid {
padding-left: 5px;
padding-right: 5px;
}
.modal-xl {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: hidden;
}
.modal-xl .modal-dialog {
position: fixed;
margin: 0;
width: 100%;
height: 100%;
padding: 0;
}
.modal-xl .modal-content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
border: 2px solid #3c7dcf;
border-radius: 0;
box-shadow: none;
}
.modal-xl .modal-header {
position: absolute;
top: 0;
right: 0;
left: 0;
height: 50px;
padding: 10px;
border: 0;
}
.modal-xl .modal-body {
position: absolute;
top: 50px;
bottom: 60px;
width: 100%;
overflow: auto;
}
.modal-xl .modal-footer {
position: absolute;
right: 0;
bottom: 0;
left: 0;
height: 60px;
padding: 10px;
}
/* Bootstrap Overrides */
.flex-parent {
display: flex;
flex-direction: column;
justify-content: center;
}
.collapsing,
.collapse.in {
padding: 5px 10px;
transition: all 0.35s ease;
}
.navbar .collapse.in {
background: #222;
}
/* Fixes for SuperFlat */
.table-hover > tbody > tr:hover {
background-color: #f4f4f4;
}
.dropdown-menu {
z-index: 1000000000;
}
.t-body a.actions {
font-size: 24px;
line-height: 100%;
padding: 4px 10px 3px;
display: block;
}
.t-body a.actions:hover,
.t-body a.actions.open > a {
background-color: rgba(0, 0, 0, 0.1);
}
/* ui-select adjustments for SuperFlat */
/* Same definition as .form-control */
.ui-select-toggle.btn-default {
height: 35px;
padding: 6px 12px;
font-size: 13px;
line-height: 1.42857143;
color: #9E9E9E;
background: #fff none;
border: 1px solid #e8e8e8;
border-radius: 5px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.t-header.widget {
padding: 5px;
}
/* Sankey Visualization */
.sankey .node rect {
fill-opacity: .9;
shape-rendering: crispEdges;
stroke-width: 0;
}
.sankey .node text {
text-shadow: 0 1px 0 #fff;
}
.sankey .link {
fill: none;
stroke: #000;
stroke-opacity: .2;
}
/*Dashboard list view */
.m-2{
margin:2px;
}
.dropdown-menu > .disabled{
cursor: not-allowed;
}
/* The real magic ;) */
.dropdown-menu > .disabled > a{
pointer-events: none;
}
.map-visualization-container {
height: 500px;
}
.plotly-chart-container {
height: 400px;
overflow: hidden;
}
visualization-renderer .pagination {
margin: 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="630" height="630" viewBox="0 0 630 630" version="1.1">
<g transform="translate(-56.611934,-184.36221)">
<path fill="#a7a7a7" d="m 58.467329,810.92426 c 0,-10.37237 6.53079,-28.55017 15.29935,-42.58418 9.70782,-15.53729 28.965401,-35.11964 51.655121,-52.52627 7.21357,-5.53395 6.57284,-5.08564 22.23877,-15.56023 20.2393,-13.53245 55.34935,-32.58361 79.80676,-43.30416 19.72995,-8.64834 57.2268,-21.58721 62.55974,-21.58721 0.76988,0 3.09659,-0.67892 5.17046,-1.50872 7.3197,-2.92876 12.5713,-16.1286 13.89202,-34.91737 l 0.64689,-9.20257 -8.38455,-10.04931 c -7.66622,-9.18836 -11.59308,-14.62897 -20.80286,-28.82203 -9.85543,-15.1881 -22.91997,-47.26171 -24.69185,-60.61889 -0.56037,-4.22429 -1.0976,-5.21546 -3.27999,-6.05157 -10.15146,-3.88918 -15.7489,-9.08881 -20.96084,-19.47118 -6.6162,-13.17971 -8.62087,-36.5618 -4.2711,-49.81738 2.29242,-6.98599 4.4873,-10.89589 8.72413,-15.54098 2.11744,-2.32146 2.22102,-2.9999 1.45041,-9.5 -2.58899,-21.83821 -3.34954,-41.36055 -2.18394,-56.05862 3.87891,-48.91259 20.17112,-81.47548 50.89033,-101.71339 16.68129,-10.98968 34.4196,-16.74492 62.2113,-20.1846 32.20647,-3.98609 68.82401,0.75436 93.8318,12.14731 14.67849,6.68717 28.98155,17.91433 38.99893,30.61215 19.81832,25.12131 29.57328,66.42856 26.24603,111.13853 -0.69821,9.38224 -1.63714,20.17477 -2.08651,23.9834 -0.81425,6.90129 -0.80559,6.93815 2.55469,10.86388 7.03777,8.22205 10.02312,18.44949 9.84447,33.72599 -0.27308,23.35114 -10.37432,43.49379 -24.44339,48.74202 l -5.34465,1.99373 -1.18738,6.3748 c -4.9831,26.75313 -22.71761,61.14702 -45.76986,88.76506 l -7.88572,9.44759 0.64805,9.21931 c 1.18682,16.88381 6.49256,31.6953 12.30203,34.34227 1.23595,0.56314 6.42637,1.99946 11.53427,3.19182 35.45428,8.27628 97.76078,37.16683 137.59386,63.80012 15.66594,10.47459 15.02521,10.02628 22.23877,15.56023 22.46534,17.23449 41.43241,36.56563 52.11597,53.1163 7.31528,11.33263 13.49882,27.98884 14.54335,39.17447 l 0.58435,6.25763 -313.14461,0 -313.144601,0 0,-3.43795 z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48"><defs><path id="a" d="M44.5 20H24v8.5h11.8C34.7 33.9 30.1 37 24 37c-7.2 0-13-5.8-13-13s5.8-13 13-13c3.1 0 5.9 1.1 8.1 2.9l6.4-6.4C34.6 4.1 29.6 2 24 2 11.8 2 2 11.8 2 24s9.8 22 22 22c11 0 21-8 21-22 0-1.3-.2-2.7-.5-4z"/></defs><clipPath id="b"><use xlink:href="#a" overflow="visible"/></clipPath><path clip-path="url(#b)" fill="#FBBC05" d="M0 37V11l17 13z"/><path clip-path="url(#b)" fill="#EA4335" d="M0 11l17 13 7-6.1L48 14V0H0z"/><path clip-path="url(#b)" fill="#34A853" d="M0 37l30-23 7.9 1L48 0v48H0z"/><path clip-path="url(#b)" fill="#4285F4" d="M48 48L17 24l-4-3 35-10z"/></svg>

After

Width:  |  Height:  |  Size: 688 B

View File

@@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="844px" height="561px" viewBox="0 0 844 561" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>alert</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M16.1038207,9.60213053 C11.5200489,10.2779745 8.52171196,12.444141 6.39769565,16.0301575 C8.22444293,8.88931733 9.90197283,2.94073518 8.3864837,0.0421155289 C-3.90646467,5.86130533 1.23687228,25.24012 0.672644022,34.6950038 L0.9384375,34.7227307 C1.78827717,26.9072018 17.6985815,15.7205401 16.1038207,9.60213053 Z" id="path-1"></path>
<path d="M16.1038207,9.60213053 C11.5200489,10.2779745 8.52171196,12.444141 6.39769565,16.0301575 C8.22444293,8.88931733 9.90197283,2.94073518 8.3864837,0.0421155289 C-3.90646467,5.86130533 1.23687228,25.24012 0.672644022,34.6950038 L0.9384375,34.7227307 C1.78827717,26.9072018 17.6985815,15.7205401 16.1038207,9.60213053 Z" id="path-3"></path>
</defs>
<g id="alert" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Layer_3" transform="translate(165.000000, 26.000000)">
<path d="M457.831075,86.1467907 C448.970378,84.9675232 425.223707,91.0761286 411.514436,97.9182384 L19.0505003,294.681371 C7.37564487,300.508132 0,312.419912 0,325.450818 L0,431.514132 C0,444.543858 7.37564487,456.45446 19.0505003,462.282399 C78.8298874,481.970662 117.580279,494.762963 135.301674,500.6593 C161.883768,509.503806 184.667576,507.883492 198.380392,507.883492 L362.910555,507.883492 C376.621008,507.883492 397.189641,506.366954 414.326231,496.101431 C455.932284,478.305658 485.639644,463.479122 503.448311,451.621822 C511.961503,445.953599 516.523558,436.335266 514.539542,423.417282 C509.25454,389.006494 478.348459,113.067594 474.961758,101.477268 C471.575057,89.8869406 466.691773,87.3260581 457.831075,86.1467907 Z" id="Shape-Copy-4" fill="#7F5949" fill-rule="nonzero"></path>
<path d="M457.831075,74.1467907 C448.970378,72.9675232 425.223707,79.0761286 411.514436,85.9182384 L19.0505003,282.681371 C7.37564487,288.508132 0,300.419912 0,313.450818 L0,419.514132 C0,432.543858 7.37564487,444.45446 19.0505003,450.282399 C78.8298874,469.970662 117.580279,482.762963 135.301674,488.6593 C161.883768,497.503806 184.667576,495.883492 198.380392,495.883492 L362.910555,495.883492 C376.621008,495.883492 397.189641,494.366954 414.326231,484.101431 C455.932284,466.305658 485.639644,451.479122 503.448311,439.621822 C511.961503,433.953599 516.523558,424.335266 514.539542,411.417282 C509.25454,377.006494 478.348459,101.067594 474.961758,89.4772675 C471.575057,77.8869406 466.691773,75.3260581 457.831075,74.1467907 Z" id="Shape-Copy-3" fill="#6D9E3E" fill-rule="nonzero"></path>
<path d="M457.831075,63.1467907 C448.970378,61.9675232 425.223707,68.0761286 411.514436,74.9182384 L19.0505003,271.681371 C7.37564487,277.508132 0,289.419912 0,302.450818 L0,408.514132 C0,421.543858 7.37564487,433.45446 19.0505003,439.282399 C78.8298874,458.970662 117.580279,471.762963 135.301674,477.6593 C161.883768,486.503806 184.667576,484.883492 198.380392,484.883492 L362.910555,484.883492 C376.621008,484.883492 397.189641,483.366954 414.326231,473.101431 C455.932284,455.305658 485.639644,440.479122 503.448311,428.621822 C511.961503,422.953599 516.523558,413.335266 514.539542,400.417282 C509.25454,366.006494 478.348459,90.0675945 474.961758,78.4772675 C471.575057,66.8869406 466.691773,64.3260581 457.831075,63.1467907 Z" id="Shape" fill="#94C36C" fill-rule="nonzero"></path>
<g id="Group" transform="translate(376.000000, 299.000000)" fill-rule="nonzero">
<path d="M25.9420909,61.1810309 C30.4314545,62.1896907 35.2677273,64.5435052 35.9590909,69.2494845 C35.9590909,69.5868041 31.8141818,75.3030928 31.4689091,75.974433 C27.324,81.3542268 18.6880909,80.3463918 13.5065455,77.6560825 C9.70690909,75.6387629 5.562,75.302268 1.41709091,73.6206186 C-1.34590909,72.6119588 2.45372727,65.5513402 5.90727273,64.5426804 C9.70690909,63.5331959 11.7793636,60.8437113 15.579,61.5158763" id="Shape" fill="#E5C19E"></path>
<path d="M25.9429091,74.9657732 C23.5955455,75.8441237 21.1066364,76.3117526 18.6880909,76.3117526 C16.2703636,76.3117526 14.8876364,75.974433 13.1620909,74.6301031 C11.4349091,73.2849485 8.32581818,72.6127835 7.63445455,70.9319588 C6.94390909,69.2503093 5.21672727,68.2408247 6.94390909,66.56 C8.67027273,64.8791753 14.1979091,60.1715464 16.2695455,59.1628866 C18.3428182,58.1534021 17.6506364,57.4820619 21.105,58.4898969 C24.5601818,59.4993814 25.5951818,60.0461856 26.631,62.4 C27.6684545,64.7538144 34.9224545,71.6041237 25.9429091,74.9657732 Z" id="Shape" fill="#603E2F"></path>
<path d="M22.3011818,3.24948454 C22.3011818,3.24948454 22.1481818,4.16329897 21.9493636,5.7756701 C21.8495455,6.58061856 21.7300909,7.55876289 21.6278182,8.68371134 C21.5050909,9.80783505 21.4044545,11.0787629 21.3054545,12.4668041 C21.1835455,13.8540206 21.1352727,15.3608247 21.0534545,16.9534021 C21.0035455,17.7501031 20.9953636,18.5690722 20.9888182,19.4061856 C20.9781818,20.2449485 20.9675455,21.1010309 20.9577273,21.9703093 C20.9585455,23.7113402 21.0272727,25.5101031 21.06,27.3393814 C21.0853636,29.1579381 21.1115455,31.0045361 21.1377273,32.8527835 C21.0845455,34.691134 21.0305455,36.5319588 20.9781818,38.342268 C20.8849091,40.1575258 20.7932727,41.942268 20.7057273,43.6709278 C20.6402727,45.4004124 20.5363636,47.0713402 20.4946364,48.6589691 C20.4340909,50.2465979 19.0096364,61.3369072 18.9891818,62.1468041 C18.8599091,63.785567 20.2851818,63.1554639 20.3563636,61.7501031 C20.4414545,61.3212371 20.5347273,60.691134 20.6697273,59.8878351 C20.8088182,59.0870103 20.9503636,58.1113402 21.1017273,56.988866 C21.2539091,55.868866 21.4232727,54.6020619 21.5631818,53.2189691 C21.7112727,51.8342268 21.8830909,50.3364948 21.9951818,48.7447423 C22.1211818,47.1546392 22.2529091,45.4787629 22.3216364,43.7402062 C22.3617273,41.9991753 22.4288182,40.2028866 22.4320909,38.3727835 C22.4149091,36.5393814 22.3969091,34.6771134 22.3805455,32.8148454 C22.2954545,30.9616495 22.2111818,29.1076289 22.1260909,27.2824742 C22.0369091,25.4705155 21.9117273,23.6865979 21.8560909,21.9571134 C21.834,20.2268041 21.7669091,18.5542268 21.7849091,16.9674227 C21.8004545,15.3797938 21.7824545,13.8787629 21.8462727,12.4931959 C21.8863636,11.1068041 21.933,9.83670103 22.0090909,8.71340206 C22.0655455,7.58680412 22.1424545,6.60783505 22.2087273,5.80123711 C22.338,4.18886598 22.4517273,3.27010309 22.4517273,3.27010309 C22.4566364,3.22804124 22.4263636,3.19092784 22.3838182,3.18597938 C22.3453636,3.18103093 22.3077273,3.21072165 22.3011818,3.24948454 Z" id="Shape" fill="#B26B56"></path>
<path d="M33.9136364,29.2816495 C33.9136364,29.2816495 33.0234545,29.9035052 31.7454545,30.9096907 C30.4731818,31.9216495 28.7852727,33.28 27.2405455,34.7818557 C26.8576364,35.1604124 26.469,35.5323711 26.1204545,35.9290722 C25.7612727,36.316701 25.4078182,36.694433 25.0879091,37.0771134 C24.7393636,37.436701 24.4333636,37.8037113 24.129,38.1426804 C23.8131818,38.4750515 23.562,38.8181443 23.31,39.1249485 C23.0465455,39.4276289 22.8518182,39.7286598 22.6693636,39.996701 C22.4779091,40.2597938 22.3142727,40.4940206 22.2136364,40.7026804 C21.9935455,41.1134021 21.8454545,41.3558763 21.8454545,41.3558763 L21.8405455,41.3641237 C21.825,41.3872165 21.7939091,41.3954639 21.7701818,41.3806186 C21.753,41.3698969 21.744,41.3501031 21.7464545,41.3303093 C21.7464545,41.3303093 21.7808182,41.0589691 21.8806364,40.5715464 C21.9109091,40.3175258 22.0090909,40.0362887 22.1408182,39.7195876 C22.2676364,39.3987629 22.4059091,39.0276289 22.6300909,38.6721649 C22.8379091,38.3051546 23.0620909,37.9002062 23.3582727,37.5241237 C23.6348182,37.1290722 23.9465455,36.7282474 24.3057273,36.3529897 C24.6616364,35.9719588 25.0396364,35.5925773 25.4536364,35.2395876 C25.8545455,34.8725773 26.2759091,34.5195876 26.6980909,34.1682474 C28.3819091,32.7579381 30.1581818,31.4894845 31.5400909,30.614433 C32.913,29.7303093 33.8596364,29.1934021 33.8596364,29.1934021 C33.8841818,29.1793814 33.9152727,29.1876289 33.9291818,29.2123711 C33.9422727,29.2371134 33.9349091,29.2659794 33.9136364,29.2816495 Z" id="Shape" fill="#B26B56"></path>
<path d="M15.1003636,12.7298969 C15.1003636,12.7298969 15.6976364,13.4037113 16.5305455,14.4701031 C17.3724545,15.5298969 18.4000909,17.0185567 19.3270909,18.5839175 C19.5700909,18.9690722 19.7779091,19.3756701 20.0045455,19.7649485 C20.2336364,20.1534021 20.4087273,20.5641237 20.5993636,20.9501031 C20.7638182,21.3484536 20.8963636,21.7476289 21.0133636,22.1253608 C21.1205455,22.508866 21.1982727,22.88 21.2694545,23.2189691 C21.3340909,23.5604124 21.3512727,23.8861856 21.3799091,24.1657732 C21.4134545,24.4445361 21.3962727,24.697732 21.3815455,24.9014433 C21.3619091,25.308866 21.33,25.5364948 21.33,25.5364948 C21.3259091,25.5645361 21.2997273,25.5851546 21.2710909,25.5810309 C21.2522727,25.5785567 21.2375455,25.5653608 21.2301818,25.548866 L21.2277273,25.5430928 C21.2277273,25.5430928 21.1418182,25.3228866 21.0256364,24.9492784 C20.916,24.5756701 20.7065455,24.0560825 20.4848182,23.4408247 C20.3514545,23.1373196 20.2262727,22.8049485 20.0855455,22.457732 C19.9227273,22.1162887 19.782,21.7468041 19.6224545,21.3674227 C19.3107273,20.6053608 19.0006364,19.7740206 18.6111818,18.9748454 C17.8453636,17.3698969 16.9330909,15.8292784 16.2400909,14.6771134 C15.5380909,13.5307216 15.0226364,12.7958763 15.0226364,12.7958763 C15.0062727,12.7727835 15.0111818,12.7406186 15.0349091,12.7241237 C15.0537273,12.7068041 15.084,12.7109278 15.1003636,12.7298969 Z" id="Shape" fill="#B26B56"></path>
<path d="M24.5601818,0.403298969 C24.5601818,0.403298969 21.726,0.862680412 22.4345455,3.39051546 C22.4345455,3.39051546 24.0856364,3.6214433 24.5601818,0.403298969 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M24.0414545,14.3991753 C24.0414545,14.3991753 21.2080909,14.8602062 21.9166364,17.3872165 C21.9166364,17.3872165 23.5685455,17.6164948 24.0414545,14.3991753 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M18.6447273,9.75092784 C18.6447273,9.75092784 18.5743636,12.5459794 21.258,12.345567 C21.258,12.3463918 21.8020909,10.8090722 18.6447273,9.75092784 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M26.7790909,4.55835052 C26.7790909,4.55835052 22.7282727,3.46886598 22.068,7.24865979 C22.0688182,7.24865979 24.1159091,8.5443299 26.7790909,4.55835052 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M25.3521818,21.4639175 C25.3521818,21.4639175 21.2056364,22.131134 22.2357273,25.8301031 C22.2365455,25.8301031 24.6526364,26.1707216 25.3521818,21.4639175 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M12.7914545,19.1661856 C12.7914545,19.1661856 15.8498182,21.971134 18.2479091,18.9303093 C18.2479091,18.9303093 17.0599091,16.8536082 12.7914545,19.1661856 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M15.7647273,27.9694845 C15.7647273,27.9694845 17.694,32.3901031 21.2596364,33.0507216 C21.2588182,33.0507216 21.5967273,29.0160825 15.7647273,27.9694845 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M11.4913636,9.29484536 C11.4913636,9.29484536 12.159,14.1039175 15.2967273,12.8420619 C15.2967273,12.8412371 15.5299091,10.025567 11.4913636,9.29484536 Z" id="Shape" fill="#D3FF8D"></path>
</g>
<g id="Group" transform="translate(416.000000, 309.000000)" fill-rule="nonzero">
<path d="M10.8245455,61.6261224 C6.48818182,62.6377959 1.818,64.9958878 1.15118182,69.7137245 C1.15118182,70.0501224 5.15536364,75.7796327 5.48836364,76.4532551 C9.49172727,81.8438878 17.8298182,80.8338673 22.833,78.1377245 C26.5017273,76.1160306 30.5059091,75.7788061 34.5084545,74.0943367 C37.1773636,73.0826633 33.5078182,66.0067347 30.1720909,64.9950612 C26.5041818,63.9842143 24.5012727,61.288898 20.8317273,61.9625204" id="Shape" fill="#E5C19E"></path>
<path d="M10.8245455,75.4415816 C13.0917273,76.3210102 15.4939091,76.7888265 17.8298182,76.7888265 C20.1657273,76.7888265 21.4985455,76.451602 23.1668182,75.1035306 C24.8334545,73.7562857 27.8361818,73.0818367 28.503,71.3973673 C29.1698182,69.712898 30.8380909,68.7012245 29.1698182,67.0175816 C27.5023636,65.3322857 22.1645455,60.614449 20.1640909,59.603602 C18.1628182,58.5927551 18.8296364,57.9183061 15.4939091,58.9299796 C12.1573636,59.9408265 11.1567273,60.4896429 10.1577273,62.8477347 C9.15709091,65.2074796 2.15263636,72.0718163 10.8245455,75.4415816 Z" id="Shape" fill="#603E2F"></path>
<path d="M14.3410909,3.56978571 C14.3410909,3.56978571 14.4883636,4.48558163 14.679,6.10144898 C14.7763636,6.90896939 14.8917273,7.88840816 14.9907273,9.01579592 C15.1101818,10.1423571 15.2067273,11.4152143 15.3024545,12.8079184 C15.4202727,14.1973163 15.4652727,15.7073878 15.5446364,17.3025918 C15.5929091,18.1018469 15.6010909,18.9225918 15.6084545,19.7623469 C15.6182727,20.602102 15.6272727,21.4592143 15.6370909,22.3303776 C15.6370909,24.0751837 15.5708182,25.8786735 15.5389091,27.7119184 C15.5143636,29.5344184 15.4881818,31.3850204 15.4628182,33.2372755 C15.5151818,35.0804388 15.5667273,36.9244286 15.6174545,38.7394898 C15.7066364,40.5570306 15.7966364,42.3464694 15.8809091,44.0788776 C15.9430909,45.8121122 16.0445455,47.4866633 16.0838182,49.0777347 C16.1419091,50.6688061 17.5189091,61.7831633 17.5369091,62.5948163 C17.6620909,64.2379592 16.2859091,63.6064898 16.2171818,62.1972551 C16.1345455,61.7674592 16.0453636,61.1359898 15.9152727,60.330949 C15.7802727,59.5275612 15.6444545,58.5497755 15.4971818,57.4256939 C15.3499091,56.3032653 15.1870909,55.0345408 15.0512727,53.6476224 C14.9080909,52.2607041 14.7428182,50.758898 14.634,49.1645204 C14.5120909,47.5709694 14.3844545,45.8906327 14.3173636,44.1474796 C14.2780909,42.4035 14.2142727,40.6041429 14.211,38.7700714 C14.2281818,36.9318673 14.2445455,35.0655612 14.2625455,33.1992551 C14.3435455,31.3412143 14.4253636,29.484 14.5071818,27.6557143 C14.5922727,25.839 14.7125455,24.0512143 14.7665455,22.3179796 C14.7878182,20.5847449 14.8524545,18.9077143 14.8369091,17.3166429 C14.8213636,15.7272245 14.8377273,14.2212857 14.7763636,12.8327143 C14.7379091,11.4449694 14.6912727,10.1712857 14.6192727,9.04472449 C14.5660909,7.91733673 14.4916364,6.93541837 14.427,6.12707143 C14.3026364,4.51120408 14.1921818,3.59044898 14.1921818,3.59044898 C14.1872727,3.54829592 14.2159091,3.51110204 14.2576364,3.50614286 C14.2985455,3.50118367 14.3353636,3.53011224 14.3410909,3.56978571 Z" id="Shape" fill="#B26B56"></path>
<path d="M3.18109091,29.5724388 C3.18109091,29.5724388 4.10318182,30.1146429 5.43845455,31.008949 C6.78190909,31.8925102 8.50581818,33.1744592 10.134,34.5927857 C10.5439091,34.9457143 10.9497273,35.301949 11.3375455,35.6714082 C11.7384545,36.0251633 12.1025455,36.4086735 12.4453636,36.7897041 C12.7922727,37.164949 13.0884545,37.5682959 13.3543636,37.9600714 C13.6399091,38.3344898 13.8485455,38.7403163 14.049,39.1031633 C14.2633636,39.4560918 14.3893636,39.8272041 14.5104545,40.1421122 C14.5685455,40.3008061 14.6233636,40.4487551 14.6732727,40.5859592 C14.7133636,40.7272959 14.7289091,40.8661531 14.7542727,40.9851735 C14.8467273,41.4653878 14.877,41.7331837 14.877,41.7331837 C14.8802727,41.7604592 14.8598182,41.7852551 14.8328182,41.7885612 C14.8123636,41.7910408 14.7935455,41.7811224 14.7837273,41.7645918 L14.7788182,41.7571531 C14.7788182,41.7571531 14.6356364,41.5174592 14.4229091,41.1091531 C14.3255455,40.9025204 14.1725455,40.6686122 13.9868182,40.4057755 C13.8084545,40.1412857 13.6268182,39.8387755 13.3715455,39.5362653 C13.1260909,39.230449 12.8896364,38.8857857 12.5844545,38.5526939 C12.2890909,38.2154694 11.9986364,37.8460102 11.6623636,37.4856429 C11.3530909,37.1037857 11.016,36.7235816 10.6690909,36.3367653 C10.3328182,35.9400306 9.95972727,35.5647857 9.58909091,35.1862347 C8.09836364,33.6802959 6.46363636,32.3107347 5.22981818,31.294102 C3.98945455,30.281602 3.12545455,29.6559184 3.12545455,29.6559184 C3.10336364,29.6393878 3.09763636,29.6079796 3.11318182,29.5856633 C3.12954545,29.5658265 3.159,29.5600408 3.18109091,29.5724388 Z" id="Shape" fill="#B26B56"></path>
<path d="M21.3733636,13.1335714 C21.3733636,13.1335714 20.8742727,13.8741429 20.1943636,15.0255 C19.5242727,16.1818163 18.6422727,17.7299082 17.9050909,19.3391633 C17.5295455,20.140898 17.2325455,20.9723878 16.9322727,21.734449 C16.7800909,22.1146531 16.6434545,22.4841122 16.4855455,22.8262959 C16.3521818,23.1759184 16.2294545,23.5065306 16.1001818,23.8106939 C15.8858182,24.4256327 15.6829091,24.9446939 15.5757273,25.3174592 C15.4628182,25.691051 15.3785455,25.9100816 15.3785455,25.9100816 L15.3769091,25.9150408 C15.3662727,25.9414898 15.3368182,25.9547143 15.3114545,25.9447959 C15.2934545,25.9373571 15.282,25.9216531 15.2795455,25.9034694 C15.2795455,25.9034694 15.2476364,25.6778265 15.2271818,25.2728265 C15.2124545,25.0695 15.1936364,24.8190612 15.2247273,24.5413469 C15.2517273,24.2628061 15.2680909,23.9396327 15.3278182,23.599102 C15.3940909,23.261051 15.4693636,22.8932449 15.57,22.5097347 C15.6812727,22.1320102 15.8097273,21.734449 15.9668182,21.3360612 C16.1500909,20.9492449 16.3194545,20.5401122 16.5387273,20.1491633 C16.7604545,19.7598673 16.9592727,19.3515612 17.1940909,18.9647449 C18.09,17.3926837 19.0857273,15.8941837 19.9039091,14.8254796 C20.7130909,13.7509898 21.294,13.0699286 21.294,13.0699286 C21.312,13.0492653 21.3439091,13.0467857 21.3651818,13.0641429 C21.384,13.0831531 21.3872727,13.1120816 21.3733636,13.1335714 Z" id="Shape" fill="#B26B56"></path>
<path d="M12.1598182,0.716602041 C12.1598182,0.716602041 14.8966364,1.17863265 14.2126364,3.71194898 C14.2126364,3.71194898 12.6155455,3.94172449 12.1598182,0.716602041 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M12.6605455,14.7436531 C12.6605455,14.7436531 15.3973636,15.2048571 14.7133636,17.7381735 C14.7125455,17.7381735 13.1162727,17.9671224 12.6605455,14.7436531 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M17.8715455,10.0853265 C17.8715455,10.0853265 17.9402727,12.8872653 15.3482727,12.6864184 C15.3482727,12.6872449 14.823,11.1457653 17.8715455,10.0853265 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M10.0161818,4.88231633 C10.0161818,4.88231633 13.9279091,3.78964286 14.5660909,7.57763265 C14.5660909,7.57763265 12.5893636,8.87611224 10.0161818,4.88231633 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M0.522818182,25.6150102 C0.522818182,25.6150102 4.527,26.2828469 3.53290909,29.9906633 C3.53209091,29.9906633 1.19863636,30.3311939 0.522818182,25.6150102 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M8.54672727,34.1795204 C8.54672727,34.1795204 5.59227273,36.990551 3.27681818,33.9431327 C3.27681818,33.9423061 4.42309091,31.861102 8.54672727,34.1795204 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M20.6533636,28.3433878 C20.6533636,28.3433878 18.7887273,32.7727653 15.3474545,33.4356429 C15.3474545,33.4356429 15.021,29.3922551 20.6533636,28.3433878 Z" id="Shape" fill="#D3FF8D"></path>
<path d="M24.7794545,9.62742857 C24.7794545,9.62742857 24.1347273,14.446102 21.1041818,13.1823367 C21.1041818,13.1823367 20.88,10.3605612 24.7794545,9.62742857 Z" id="Shape" fill="#D3FF8D"></path>
</g>
<g id="Group" transform="translate(226.000000, 0.000000)" fill-rule="nonzero">
<path d="M5.44478127e-05,96.4371271 C0.0165546295,94.4848627 1.44853468,92.2058397 3.20226828,91.3486903 L20.7891048,82.7251041 C19.7224859,81.1801041 19.1084434,79.082219 19.1225864,76.5084029 C19.172087,68.7111845 24.9035429,59.5986443 31.9208345,56.1605753 C34.273289,55.006265 36.4630988,54.6534604 38.3452981,54.9683799 C38.3111191,54.3349891 38.2651543,53.7098857 38.2675115,53.0457133 C38.3724055,37.4489087 49.8270673,19.2332995 63.8616504,12.3524259 C69.4882124,9.59510408 74.6680909,9.09075926 78.8556012,10.4664604 C78.8827087,10.4415983 78.9192448,10.4048972 78.9192448,10.4048972 L79.5415374,10.7091616 C80.2156877,10.9719891 80.8568376,11.2869087 81.4744158,11.6503685 L85.5181389,13.6251271 C89.2283226,8.77465581 93.7953372,4.71503512 98.7524632,2.28802362 C104.091451,-0.330780975 108.963718,-0.617286722 112.765832,0.998747761 C112.777618,0.990460405 112.805904,0.959678795 112.805904,0.959678795 L119.847945,4.39774776 C119.847945,4.39774776 119.13608,4.97431098 118.202642,5.72490868 C119.658193,8.04892017 120.573953,11.0086903 120.758991,14.553311 C122.650619,12.3985983 124.846322,10.6073455 127.189348,9.45895466 C130.13463,8.01458684 132.831231,7.81213857 134.975076,8.62429949 L134.996291,8.60298914 L135.200186,8.70243742 C135.289758,8.74032247 135.372259,8.7876788 135.458296,8.82793167 L142.037154,12.0410581 C142.037154,12.0410581 140.79964,13.0426443 139.439554,14.1318397 C139.675271,15.1050121 139.810808,16.1717133 139.804915,17.347334 C139.784879,19.9258857 139.141372,22.6394029 138.04411,25.2499202 L152.462912,18.1808052 C153.18067,17.8315524 153.832427,17.7830121 154.360433,17.9665179 C154.374576,17.9534949 154.405219,17.9227133 154.405219,17.9227133 L161.447261,21.3595983 C161.447261,21.3595983 154.699865,26.8268857 155.375194,26.0798397 C156.050523,25.3339776 149.286627,28.3564949 148.27658,28.3564949 C147.912397,28.3564949 147.739145,28.0084259 147.597715,27.6035294 L31.7699757,84.3802075 C31.7593684,84.387311 31.7522969,84.3920466 31.7381539,84.400334 C31.7287252,84.400334 31.7192965,84.4086213 31.7110465,84.412173 L11.7234335,94.2113799 C11.8601493,94.7607133 11.8130059,95.3727937 11.4936096,95.7279662 C10.8182807,96.4726443 7.82939065,101.817989 7.82939065,101.817989 L1.39078405,98.6747133 C1.19160328,98.6226213 1.01481562,98.5267248 0.849813804,98.408334 L0.78734883,98.3799202 L0.792063168,98.3574259 C0.297057718,97.9809432 -0.00465988981,97.326242 5.44478127e-05,96.4371271 Z" id="Shape" fill="#DEEBFF"></path>
<path d="M10.2726468,94.9108416 L27.8606619,86.2872554 C26.7916859,84.7422554 26.178822,82.6443703 26.192965,80.0705542 C26.2424655,72.2745197 31.9727429,63.1619795 38.9900344,59.7239105 C41.3436675,58.5707841 43.5334773,58.2167956 45.4133195,58.5317151 C45.3814977,57.8983243 45.3355329,57.2732209 45.3378901,56.6090485 C45.4427841,41.0122439 56.8986245,22.7966347 70.932029,15.9157611 C79.7042327,11.6158071 87.408639,12.7665657 91.9285102,18.0479795 C95.7447665,12.813922 100.569891,8.42399101 105.819306,5.85254273 C117.615757,0.0667841087 127.170541,5.57195652 127.825834,18.1166462 C129.717462,15.9631174 131.913165,14.1706807 134.256191,13.0222899 C141.273482,9.57948526 146.921259,13.1146347 146.870579,20.9106692 C146.851722,23.4892209 146.205858,26.203922 145.109774,28.8132554 L159.528576,21.7441404 C161.28231,20.8858071 162.693075,21.7666347 162.683646,23.7177151 C162.668325,25.66406 161.238702,27.943083 159.481433,28.804968 L38.8332827,87.9447266 C38.823854,87.9518301 38.815604,87.9577496 38.8026395,87.9648531 C38.7920323,87.9648531 38.7837822,87.9731404 38.7755321,87.9766922 L10.2219677,101.974037 C8.47176986,102.83237 7.05746857,101.945623 7.07161159,99.9992784 C7.08693318,98.047014 8.51655607,95.7691749 10.2726468,94.9108416 Z" id="Shape" fill="#E9F2FF"></path>
</g>
<g id="Group" transform="translate(16.000000, 77.000000)" fill-rule="nonzero">
<path d="M0.628863309,96.6435977 C0.645381295,94.6913333 2.07772662,92.4134943 3.83453237,91.553977 L21.4415252,82.9327586 C20.3725755,81.3865747 19.7590504,79.2910575 19.7720288,76.7148736 C19.8215827,68.9176552 25.559223,59.8051149 32.5852662,56.367046 C34.9378993,55.2127356 37.1324317,54.859931 39.0143022,55.1748506 C38.982446,54.5414598 38.9364317,53.9163563 38.9387914,53.251 C39.0426187,37.6565632 50.5108201,19.4397701 64.5593669,12.5588966 C70.1908201,9.8003908 75.3774676,9.29722989 79.5706763,10.672931 C79.5954532,10.648069 79.6332086,10.6101839 79.6332086,10.6101839 L80.2561727,10.9168161 C80.9334101,11.1772759 81.5740719,11.4945632 82.1911367,11.8568391 L86.2404029,13.8315977 C89.9545899,8.98112644 94.5241727,4.92268966 99.4866475,2.49567816 C104.832576,-0.123126437 109.708921,-0.409632184 113.517496,1.2064023 C113.528115,1.19693103 113.556432,1.16614943 113.556432,1.16614943 L120.606072,4.6054023 C120.606072,4.6054023 119.893439,5.18196552 118.957813,5.93137931 C120.416115,8.2542069 121.331683,11.2151609 121.518101,14.7609655 C123.41177,12.605069 125.611022,10.8126322 127.955396,9.66542529 C130.903856,8.22105747 133.603367,8.0186092 135.749525,8.83077011 L135.770763,8.80945977 L135.976058,8.90772414 C136.063367,8.9467931 136.148317,8.99296552 136.235626,9.03321839 L142.820403,12.2475287 C142.820403,12.2475287 141.580374,13.2502989 140.21882,14.3383103 C140.454791,15.3114828 140.591655,16.377 140.584576,17.5538046 C140.564518,20.1323563 139.920317,22.8458736 138.82305,25.4563908 L153.25741,18.3872759 C153.974763,18.0368391 154.628403,17.9882989 155.155799,18.1729885 C155.169957,18.1599655 155.200633,18.128 155.200633,18.128 L162.250273,21.5672529 C162.250273,21.5672529 155.495597,27.0333563 156.172835,26.2863103 C156.847712,25.5404483 150.077698,28.5629655 149.065381,28.5629655 C148.701986,28.5629655 148.527367,28.2148966 148.386964,27.81 L32.4318849,84.5878621 C32.422446,84.5949655 32.4153669,84.6008851 32.4023885,84.6091724 C32.3917698,84.6091724 32.3835108,84.6162759 32.3752518,84.6198276 L12.3637122,94.4190345 C12.5017554,94.9695517 12.455741,95.5816322 12.1348201,95.9356207 C11.4587626,96.6814828 8.46664748,102.026828 8.46664748,102.026828 L2.02227338,98.8835517 C1.82169784,98.8302759 1.64471942,98.7343793 1.47953957,98.6171724 L1.41818705,98.5887586 L1.42290647,98.5662644 C0.927366906,98.1874138 0.624143885,97.5327126 0.628863309,96.6435977 Z" id="Shape" fill="#DEEBFF"></path>
<path d="M10.7119137,94.9103563 L28.3200863,86.2867701 C27.2511367,84.7417701 26.6376115,82.645069 26.6517698,80.0712529 C26.7001439,72.2728506 32.4377842,63.1614943 39.4614676,59.7222414 C41.8176403,58.5691149 44.0098129,58.2163103 45.8928633,58.5312299 C45.8598273,57.8966552 45.8138129,57.2727356 45.8161727,56.6085632 C45.9211799,41.0117586 57.3882014,22.7961494 71.4379281,15.9152759 C80.220777,11.6153218 87.9323165,12.7660805 92.4558849,18.0474943 C96.2786187,12.8122529 101.10895,8.42232184 106.364029,5.85205747 C118.172029,0.0651149425 127.738302,5.57265517 128.393122,18.1161609 C130.286791,15.9626322 132.484863,14.1701954 134.831597,13.0229885 C141.855281,9.579 147.507971,13.1141494 147.458417,20.9113678 C147.43954,23.4911034 146.792978,26.2034368 145.694532,28.813954 L160.131252,21.7448391 C161.886878,20.8865057 163.299165,21.7661494 163.287367,23.7184138 C163.275568,25.6647586 161.843223,27.9437816 160.082878,28.8056667 L39.3045468,87.9466092 C39.2951079,87.9525287 39.2880288,87.9572644 39.2738705,87.9655517 C39.2632518,87.9655517 39.2561727,87.9738391 39.2467338,87.9785747 L10.6635396,101.973552 C8.91027338,102.833069 7.49680576,101.945138 7.50860432,99.999977 C7.5251223,98.0453448 8.95628777,95.7686897 10.7119137,94.9103563 Z" id="Shape" fill="#E9F2FF"></path>
</g>
<g id="Group" transform="translate(286.000000, 99.000000)" fill-rule="nonzero">
<path d="M40.8528671,60.2199265 L40.0563357,58.6380441 C44.6898462,55.1919706 43.366993,51.2205882 39.3220699,44.6965147 L37.5633566,41.1992206 C41.6834685,38.2093676 40.5474126,34.76925 37.0264615,29.0921029 L22.636028,0.480044118 L6.69717483,32.8014265 C5.6645035,33.9211324 5.08648951,35.1051618 4.97723077,36.2963382 L4.93963636,36.3666176 L4.96665734,36.3666176 C4.81627972,38.2069853 5.77141259,40.0330588 7.83793007,41.5815882 L4.18304895,48.9954706 C2.98472727,50.2902794 2.31625175,51.6672794 2.1834965,53.0430882 L2.14355245,53.1276618 L2.1693986,53.1276618 C2.00257343,55.22175 3.06579021,57.3039265 5.3801958,59.0787794 L2.50422378,64.9107794 C1.20016783,66.3258971 0.468251748,67.8255882 0.324923077,69.3288529 L0.281454545,69.4181912 L0.308475524,69.4181912 C0.0735104895,72.4044706 2.12123077,75.3728824 6.51507692,77.5944265 C15.1559161,81.9588971 29.5674965,81.8016618 38.6911888,77.2156324 C47.1017622,72.9988676 45.9739301,68.4866912 40.8528671,60.2199265 Z" id="Shape" fill="#B4D38C"></path>
<path d="M40.8528671,60.2199265 L40.0563357,58.6380441 C44.6898462,55.1919706 43.366993,51.2205882 39.3220699,44.6965147 L37.5633566,41.1992206 C41.6834685,38.2093676 40.5474126,34.76925 37.0264615,29.0921029 L22.636028,0.480044118 L22.5502657,1.28766176 L26.164028,29.0921029 C29.6873287,34.76925 30.8010629,40.5488382 26.680951,43.5386912 L28.4596364,44.6965147 C32.5057343,51.2217794 34.6251189,56.7750441 29.9916084,60.2199265 C35.1126713,68.4866912 38.326993,75.5634706 29.9152448,79.7790441 C26.6492308,81.4216765 32.5633007,80.2983971 38.6923636,77.2156324 C47.1017622,72.9988676 45.9739301,68.4866912 40.8528671,60.2199265 Z" id="Shape" fill="#8AA563"></path>
</g>
<g id="Group" transform="translate(51.000000, 308.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#050E26" cx="8.69817143" cy="39.644" rx="8.04990476" ry="3.87084211"></ellipse>
<g transform="translate(0.809524, 0.000000)" id="Shape">
<path d="M15.0777587,37.5991579 C15.8091365,35.4558947 14.7013841,32.4256842 14.2134032,30.0890526 C13.074781,24.6098947 8.36475556,1.90010526 7.62506667,0.597473684 L7.54907937,0.597473684 C6.80939048,1.91515789 2.35226032,23.1324211 1.10440635,29.8273684 C0.656793651,32.2311579 -0.294234921,35.5751579 0.286355556,37.2645263 C1.13765079,39.754 4.69480635,42.0732632 7.60013333,42.0732632 C11.5942159,42.0732632 14.4009968,39.5861053 15.0777587,37.5991579 Z" fill="#7A9B54"></path>
<path d="M14.767873,30.3171579 C13.6304381,24.8368421 8.36475556,1.90010526 7.62506667,0.597473684 L10.067346,13.178 C11.4481778,19.5672632 10.5683873,25.9449474 11.1252317,28.6173684 C11.6096508,30.9574737 13.1068381,33.3230526 12.3778349,35.4651579 C11.701073,37.4544211 8.89191746,39.9415789 4.89664762,39.9415789 C3.92662222,39.9415789 2.88417143,39.6822105 1.8939619,39.2445263 C3.3840254,40.9697895 5.95453333,42.3002105 8.15222857,42.3002105 C12.1474984,42.3002105 14.9542794,39.8130526 15.6334159,37.8261053 C16.3636063,35.684 15.2534794,32.6514737 14.767873,30.3171579 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(72.000000, 332.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#050E26" cx="8.64236825" cy="39.6984211" rx="8.04990476" ry="3.87084211"></ellipse>
<g transform="translate(0.809524, 0.000000)" id="Shape">
<path d="M15.0207683,37.6535789 C15.7533333,35.5091579 14.645581,32.4812632 14.1564127,30.1434737 C13.0189778,24.6631579 8.30895238,1.95452632 7.56926349,0.651894737 L7.49327619,0.651894737 C6.7535873,1.96957895 2.29645714,23.1868421 1.04741587,29.8817895 C0.600990476,32.2855789 -0.350038095,35.6295789 0.230552381,37.3189474 C1.08184762,39.8072632 4.63900317,42.1276842 7.54195556,42.1276842 C11.5372254,42.1276842 14.3440063,39.6393684 15.0207683,37.6535789 Z" fill="#8BAD60"></path>
<path d="M14.7108825,30.3704211 C13.5734476,24.8901053 8.30895238,1.95452632 7.56926349,0.651894737 L10.0127302,13.2324211 C11.3911873,19.6216842 10.5125841,25.9993684 11.0694286,28.6729474 C11.5550349,31.0130526 13.0522222,33.3786316 12.3196571,35.5207368 C11.6428952,37.5088421 8.83492698,39.9948421 4.83965714,39.9948421 C3.86963175,39.9948421 2.82836825,39.7354737 1.83815873,39.2989474 C3.32822222,41.0242105 5.89873016,42.3546316 8.0964254,42.3546316 C12.0928825,42.3546316 14.8996635,39.8674737 15.5776127,37.8805263 C16.3078032,35.7384211 15.1964889,32.7070526 14.7108825,30.3704211 Z" fill="#56722E"></path>
</g>
</g>
<g id="Group" transform="translate(34.000000, 340.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#050E26" opacity="0.4" cx="7.98285714" cy="49.8423612" rx="7.74857143" ry="3.98595853"></ellipse>
<g id="Shape">
<path d="M14.4742857,46.5310595 C15.1794286,44.3247171 14.1108571,41.2065151 13.6422857,38.801113 C12.5462857,33.1606957 8.01371429,1.74504883 7.30057143,0.405270903 L7.22857143,0.405270903 C6.51657143,1.76173645 2.224,31.6409298 1.024,38.5317271 C0.594285714,41.0062635 -0.321142857,44.4498742 0.237714286,46.1877712 C1.056,48.7493217 4.48114286,51.1392281 7.27542857,51.1392281 C11.12,51.1392281 13.8228571,48.5776776 14.4742857,46.5310595 Z" fill="#B0D384"></path>
<path d="M14.176,39.0347398 C13.08,33.3931304 8.01371429,1.74743278 7.30057143,0.405270903 L9.65257143,21.3923438 C10.2731429,24.4700187 7.72342857,30.3893579 9.128,37.598412 C9.59542857,40.00739 8.512,40.9013699 7.80685714,43.1077124 C7.15542857,45.1543304 9.01257143,47.2402836 5.16571429,47.2402836 C4.23314286,47.2402836 2.736,48.6766114 1.784,48.2272375 C3.21714286,50.0044696 5.69257143,51.3728548 7.80685714,51.3728548 C11.6537143,51.3728548 14.3565714,48.8124963 15.0102857,46.7658783 C15.712,44.5619197 14.6434286,41.4413338 14.176,39.0347398 Z" fill="#7A9B54"></path>
</g>
</g>
<g id="Group" transform="translate(132.000000, 179.000000)" fill-rule="nonzero">
<path d="M25.792,62.5469824 C25.792,65.9563983 20.0192375,68.7149364 12.8972199,68.7149364 C5.78008211,68.7149364 0.00731964809,65.9563983 0.00731964809,62.5469824 C0.00731964809,59.1458505 5.78008211,56.3873123 12.8972199,56.3873123 C20.0180176,56.3861289 25.792,59.1458505 25.792,62.5469824 Z" id="Shape" fill="#050E26"></path>
<g id="Shape">
<path d="M24.4146862,59.2890436 C25.5882698,55.8748941 23.8083754,51.0489316 23.0276129,47.3270944 C21.2062405,38.5946822 13.6633431,2.41771489 12.4775601,0.343190073 L12.3567859,0.343190073 C11.1722229,2.44138317 4.03068622,36.2420551 2.03364223,46.9105327 C1.31631672,50.7388771 -0.204950147,56.0642403 0.72342522,58.7565073 C2.08609971,62.7233111 7.78322581,66.4202966 12.4348622,66.4202966 C18.8334545,66.4179298 23.3277185,62.4534927 24.4146862,59.2890436 Z" fill="#6A8C3E"></path>
<path d="M23.9157302,47.6868523 C22.0931378,38.9556235 14.5490205,2.77983959 13.3656774,0.702947942 L16.389912,20.3831235 C18.6004457,30.5628511 17.1926334,40.7236441 18.0844106,44.9827512 C18.8615132,48.7081386 21.2586979,52.4784958 20.0887742,55.8914619 C19.0018065,59.0594613 14.5075425,63.0227149 8.10651026,63.0227149 C6.55596481,63.0227149 4.88342522,62.60852 3.29872141,61.9126725 C5.68492669,64.6617433 9.80344868,66.7800545 13.3241994,66.7800545 C19.7227918,66.7800545 24.2207155,62.8168008 25.3052434,59.6511683 C26.4702874,56.2370188 24.6940528,51.4086895 23.9157302,47.6868523 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(97.000000, 201.000000)" fill-rule="nonzero">
<path d="M25.4220909,62.6653238 C25.4220909,66.0747397 19.8297273,68.8332778 12.9302727,68.8332778 C6.03554545,68.8332778 0.443181818,66.0747397 0.443181818,62.6653238 C0.443181818,59.2630085 6.03554545,56.5056538 12.9302727,56.5056538 C19.8285455,56.5056538 25.4220909,59.2630085 25.4220909,62.6653238 Z" id="Shape" fill="#050E26"></path>
<g transform="translate(0.812500, 0.000000)" id="Shape">
<path d="M23.2753182,59.407385 C24.4110455,55.9920521 22.6867727,51.167273 21.9315909,47.4442524 C20.1659545,38.7118402 12.8587727,2.53487288 11.7124091,0.460348063 L11.5930455,0.460348063 C10.4455,2.55972458 3.52831818,36.3603965 1.59368182,47.0276907 C0.898772727,50.8572185 -0.576136364,56.1825817 0.324409091,58.8760321 C1.64331818,62.8404691 7.16359091,66.538638 11.6698636,66.538638 C17.8685,66.5374546 22.2211364,62.5718341 23.2753182,59.407385 Z" fill="#7A9B54"></path>
<path d="M22.7931364,47.8051937 C21.0275,39.0739649 13.7179545,2.89936441 12.5727727,0.82247276 L15.5025,20.5026483 C17.6439545,30.6823759 16.2789545,40.8431689 17.1440455,45.102276 C17.8956818,48.82648 20.2191364,52.5980206 19.0857727,56.0109867 C18.0327727,59.1789861 13.6777727,63.1422397 7.47795455,63.1422397 C5.97468182,63.1422397 4.35440909,62.7268614 2.82040909,62.0310139 C5.13086364,64.7800847 9.12186364,66.8983959 12.5314091,66.8983959 C18.7312273,66.8983959 23.0874091,62.9351423 24.1392273,59.7706931 C25.2666818,56.3553602 23.5447727,51.5293977 22.7931364,47.8051937 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(68.000000, 232.000000)" fill-rule="nonzero">
<path d="M25.5000909,61.6924138 C25.5000909,65.0713103 19.9100909,67.8030345 13.0094545,67.8030345 C6.11472727,67.8030345 0.521181818,65.0713103 0.521181818,61.6924138 C0.521181818,58.3217241 6.11472727,55.59 13.0094545,55.59 C19.9100909,55.59 25.5000909,58.3217241 25.5000909,61.6924138 Z" id="Shape" fill="#050E26"></path>
<g transform="translate(0.812500, 0.000000)" id="Shape">
<path d="M23.3533182,58.4647586 C24.4914091,55.0823448 22.7671364,50.3012414 22.0107727,46.6128276 C20.2463182,37.9627586 12.9379545,2.12206897 11.7915909,0.0656551724 L11.6722273,0.0656551724 C10.5258636,2.14551724 3.6075,35.6308276 1.67168182,46.2001379 C0.979136364,49.994069 -0.495772727,55.2711034 0.403590909,57.9383448 C1.7225,61.8671034 7.24277273,65.5297241 11.7478636,65.5297241 C17.9476818,65.5285517 22.3003182,61.6009655 23.3533182,58.4647586 Z" fill="#B0D384"></path>
<path d="M22.8711364,46.9704138 C21.1066818,38.3203448 13.7971364,2.48082759 12.6507727,0.423241379 L15.5805,19.9216552 C17.7219545,30.0067586 16.3569545,40.0731034 17.2208636,44.2926207 C17.9736818,47.9822069 20.2959545,51.7186897 19.1625909,55.099931 C18.1107727,58.2384828 13.7557727,62.1637241 7.55477273,62.1637241 C6.05268182,62.1637241 4.43359091,61.7533793 2.89722727,61.064 C5.20886364,63.7863448 9.19868182,65.8861379 12.6094091,65.8861379 C18.8080455,65.8861379 23.1665909,61.9597241 24.2160455,58.8235172 C25.3470455,55.4422759 23.6263182,50.6588276 22.8711364,46.9704138 Z" fill="#8BAA61"></path>
</g>
</g>
<g id="Group" transform="translate(265.000000, 338.000000)" fill-rule="nonzero">
<g opacity="0.3" transform="translate(12.658915, 22.852941)" fill="#616D3C" id="Shape">
<path d="M0.261901938,23.0750882 C5.9123186,27.1107426 18.8272186,32.361 26.0917019,32.361 C32.1444519,31.9561324 45.0581686,30.7462647 51.1121019,28.7278456 C65.2387353,24.6898235 53.5355686,1.67747794 41.0241853,0.0615588235"></path>
</g>
<g id="Shape">
<path d="M38.7174833,0.167330882 C37.19335,3.21922794 29.4034667,12.0860662 29.4034667,12.0860662 C29.4034667,12.0860662 8.04903333,27.3443676 3.47308333,28.8715 C-1.10286667,30.3986324 0.42245,39.5519559 3.47308333,42.6062206 C6.52371667,45.6581176 28.04145,52.0507647 28.04145,52.0507647 L57.0212833,42.8950735 C55.49715,38.3172279 55.49715,23.0577426 55.49715,23.0577426 C47.8693833,16.9539485 38.7174833,0.167330882 38.7174833,0.167330882 Z" fill="#89756D"></path>
<path d="M3.47308333,42.6062206 L37.19335,20.0046618 C37.19335,12.3749191 38.7174833,0.167330882 38.7174833,0.167330882 L21.939,16.9539485 C21.939,16.9539485 1.57975,27.2354559 0.583383333,32.2134338 C-0.939566667,39.8419926 3.47308333,42.6062206 3.47308333,42.6062206 Z" fill="#C19B7C"></path>
<path d="M37.19335,20.0046618 C37.19335,12.3749191 38.7174833,0.167330882 38.7174833,0.167330882 L21.939,16.9539485 L37.19335,20.0046618 Z" fill="#F9E8DE"></path>
<path d="M34.71545,25.3389706 C34.71545,25.3389706 34.1415333,35.2653309 32.6162167,36.7900956 C31.0920833,38.3160441 28.04145,50.5248162 28.04145,52.0507647 C28.04145,53.5767132 23.4158,39.8739559 23.4158,39.8739559 L34.71545,25.3389706 Z" fill="#C19B7C"></path>
</g>
</g>
<g id="Group" opacity="0.2" transform="translate(178.000000, 231.000000)" fill="#285128" fill-rule="nonzero">
<path d="M0.127459459,60.8479437 C6.62317117,82.5530704 25.388036,76.283831 39.8228198,74.1128451 C61.4755856,71.2189859 80.480027,84.7240563 102.852703,83.2771268 C129.55664,81.1061408 133.647144,65.1887324 129.315883,44.207662 C125.708072,28.2914366 137.496892,14.7851831 117.04673,3.69126761 C97.4935045,-6.91757746 76.1499459,13.8209577 59.5495315,22.5013521 C45.837018,29.736 0.126279279,44.207662 0.126279279,63.0189296" id="Shape"></path>
</g>
<g id="Group" transform="translate(161.000000, 166.000000)">
<g transform="translate(15.692798, 94.237288)" id="Shape" stroke="#703D33" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.714">
<path d="M23.6830533,43.6306864 L23.6830533,11.7407881"></path>
<path d="M0.0353900975,0.216745763 L0.0353900975,32.1054661"></path>
</g>
<g transform="translate(119.146662, 42.406780)" id="Shape" stroke="#703D33" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.714">
<path d="M23.8513953,43.8792373 L23.8513953,11.989339"></path>
<path d="M0.204911853,0.464118644 L0.204911853,32.352839"></path>
</g>
<path d="M17.198057,55.5764407 C17.198057,55.5764407 20.8503151,86.5239661 21.8129257,87.4804746" id="Shape" stroke="#703D33" stroke-width="1.714" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M103.166502,13.0353729 C103.166502,13.0353729 106.81876,43.9840763 107.780191,44.9405847" id="Shape" stroke="#703D33" stroke-width="1.714" stroke-linecap="round" stroke-linejoin="round"></path>
<g transform="translate(7.435109, 35.338983)" fill-rule="nonzero" id="Shape">
<g>
<polygon fill="#77462B" points="9.51167854 64.6938983 123.204726 7.19501695 123.204726 4.97101695 114.206204 2.61508475 0.513156414 57.892322 0.513156414 60.1139661"></polygon>
<polygon fill="#EAA16E" points="9.51167854 62.4710763 123.204726 4.97101695 114.206204 0.391084746 0.513156414 57.892322"></polygon>
</g>
<g transform="translate(10.617029, 5.534350)">
<polygon fill="#77462B" points="9.16131658 64.3696928 122.855544 6.86845547 122.855544 4.64563344 113.857022 2.28852327 0.162794449 57.5657606 0.162794449 59.7885826"></polygon>
<polygon fill="#EAA16E" points="9.16131658 62.1456928 122.855544 4.64563344 113.857022 0.0657012336 0.162794449 57.5657606"></polygon>
</g>
<g transform="translate(20.876969, 10.601695)">
<polygon fill="#77462B" points="9.24708177 64.4535932 122.941309 6.95235593 122.941309 4.73071186 113.942787 2.37360169 0.24973931 57.649661 0.24973931 59.8724831"></polygon>
<polygon fill="#EAA16E" points="9.24708177 62.2295932 122.941309 4.73071186 113.942787 0.149601695 0.24973931 57.649661"></polygon>
</g>
</g>
<g fill-rule="nonzero" id="Shape">
<g transform="translate(2.359340, 11.779661)">
<polygon fill="#77462B" points="2.11833646 66.9438136 3.75217929 67.5492881 115.805486 9.58275424 115.614379 0.731516949 114.012387 0.159025424 0.324058515 57.5189068"></polygon>
<polygon fill="#E08344" points="3.72150788 67.5163051 117.409837 10.1564237 115.614379 0.731516949 1.92722993 58.0913983"></polygon>
</g>
<g>
<polygon fill="#77462B" points="2.04283758 67.1322881 3.67668042 67.7377627 115.731167 9.77122881 113.935709 0.3475 0.24737997 57.7073814"></polygon>
<polygon fill="#E08344" points="3.64364966 67.7059576 117.331979 10.3448983 115.537701 0.919991525 1.84937172 58.2810508"></polygon>
</g>
</g>
</g>
<g id="Group" transform="translate(97.000000, 305.000000)">
<g transform="translate(0.000000, 8.428357)" fill-rule="nonzero" id="Shape">
<path d="M8.06360326,8.02117029 L0.16557337,0.0508327082 C0.16557337,0.0508327082 1.64725543,3.21516879 3.09046739,7.45623406 C4.53251359,11.6996099 7.64742663,17.4621905 8.76305978,20.167877 C9.87869293,22.8747187 10.9395353,25.3262416 10.9395353,25.3262416 C10.9395353,25.3262416 11.6436549,18.4973293 10.989663,15.4277269 C10.3345054,12.3569692 10.3345054,12.3569692 10.3345054,12.3569692" fill="#B0E082"></path>
<path d="M0.16557337,0.0508327082 C0.16557337,0.0508327082 9.43686957,5.59737434 10.7833234,10.65985 C12.1321087,15.7269467 11.194837,15.8494074 10.775163,25.9396999 C10.775163,25.9396999 11.0666033,16.2133233 5.04195109,6.06988747 C4.07670109,4.44555139 0.16557337,0.0508327082 0.16557337,0.0508327082 Z" fill="#85B557"></path>
</g>
<path d="M25.7831685,9.60213053 C21.1993967,10.2779745 17.3896902,14.6230158 15.2656739,18.2090323 C17.0912554,11.0693473 19.5813207,2.94073518 18.0658315,0.0421155289 C7.18811685,4.2623856 10.9162201,25.24012 10.3519918,34.6950038 L10.8754185,34.6233758 C11.7264239,26.8066917 27.3779293,15.7205401 25.7831685,9.60213053 Z" id="Shape" fill="#85B557" fill-rule="nonzero"></path>
<g transform="translate(9.679348, 0.000000)">
<g id="SVGID_51_-link" fill="#85B557" fill-rule="nonzero">
<path d="M16.1038207,9.60213053 C11.5200489,10.2779745 8.52171196,12.444141 6.39769565,16.0301575 C8.22444293,8.88931733 9.90197283,2.94073518 8.3864837,0.0421155289 C-3.90646467,5.86130533 1.23687228,25.24012 0.672644022,34.6950038 L0.9384375,34.7227307 C1.78827717,26.9072018 17.6985815,15.7205401 16.1038207,9.60213053 Z" id="SVGID_51_"></path>
</g>
<g id="Clipped">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="SVGID_51_"></g>
<path d="M9.77257337,-2.12289572 C9.77257337,-2.12289572 5.72854891,3.14637659 4.49633967,7.39783946 C3.26413043,11.6504576 1.53297554,21.5582146 1.41173641,24.3135784 C1.29049728,27.0689422 0.673809783,34.6950038 0.673809783,34.6950038 L-0.854502717,34.1162041 C-0.854502717,34.1162041 -0.476796196,8.30474119 1.48984239,5.45579895 C3.45648098,2.60685671 9.77257337,-2.12289572 9.77257337,-2.12289572 Z" id="Shape" fill="#B0E082" fill-rule="nonzero" mask="url(#mask-2)"></path>
</g>
<g id="Clipped">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<g id="SVGID_51_"></g>
<path d="M16.7275027,8.86967742 C16.7275027,8.86967742 12.2078478,13.4203601 10.3682772,16.1329782 C8.526375,18.8455964 4.3704375,25.3417854 3.42500543,27.4836909 C2.47957337,29.6255964 0.673809783,34.6950038 0.673809783,34.6950038 L-0.285611413,34.8729182 C-0.285611413,34.8729182 2.20911685,24.4036909 3.65582609,21.7107127 C5.1002038,19.0188897 5.17248098,17.835874 7.02021196,15.2549587 C8.86677717,12.6740435 10.0068913,11.6989797 10.0068913,11.6989797 C10.0068913,11.6989797 12.6520027,9.20702176 13.7058505,9.15387847" id="Shape" fill="#B0E082" fill-rule="nonzero" mask="url(#mask-4)"></path>
</g>
</g>
</g>
<g id="Group" transform="translate(362.000000, 204.000000)">
<g transform="translate(33.476721, 0.000000)">
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(24.227076, 17.756414) rotate(-179.329603) translate(-24.227076, -17.756414) " cx="24.2270761" cy="17.7564137" rx="2.03962441" ry="1.77604566"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(15.810171, 7.832777) rotate(-179.358250) translate(-15.810171, -7.832777) " cx="15.8101711" cy="7.83277731" rx="2.03841718" ry="1.77484909"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(6.198341, 1.847034) rotate(-179.341062) translate(-6.198341, -1.847034) " cx="6.19834132" cy="1.84703447" rx="2.03961968" ry="1.77366874"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(24.380487, 47.149680) rotate(-179.346791) translate(-24.380487, -47.149680) " cx="24.3804868" cy="47.1496803" rx="2.03961734" ry="1.7748531"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(26.488087, 25.058694) rotate(-179.329603) translate(-26.488087, -25.058694) " cx="26.4880871" cy="25.0586941" rx="2.03962441" ry="1.77604566"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(16.920576, 32.139989) rotate(-179.329603) translate(-16.920576, -32.139989) " cx="16.9205763" cy="32.1399891" rx="2.03962441" ry="1.77367285"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(26.236463, 37.378770) rotate(-179.312415) translate(-26.236463, -37.378770) " cx="26.236463" cy="37.3787697" rx="2.03963166" ry="1.77486556"></ellipse>
<path d="M22.197457,24.6898305 C22.197457,24.6898305 4.66163335,24.1357627 0.728118674,46.8110169" id="Shape" stroke="#F7F7F7" stroke-width="0.639"></path>
<path d="M20.6216599,18.8762712 C20.6216599,18.8762712 12.9746204,21.6276271 11.2685033,28.2372881" id="Shape" stroke="#FFFFFF" stroke-width="0.639"></path>
<path d="M13.1168965,32.9901695 C13.1168965,32.9901695 7.38998608,34.3462712 6.31633983,33.150339" id="Shape" stroke="#F7F7F7" stroke-width="0.639"></path>
<path d="M12.5609438,10.3801695 C12.5609438,10.3801695 0.600189777,21.6038983 0.0298899291,35.7972881" id="Shape" stroke="#F7F7F7" stroke-width="0.639"></path>
<path d="M22.4186425,39.9557627 C22.4186425,39.9557627 12.5549658,46.2332203 6.81490385,48.6535593" id="Shape" stroke="#F7F7F7" stroke-width="0.639"></path>
<path d="M4.46316422,4.9640678 C4.46316422,4.9640678 0.694641953,13.4411864 5.1028087,20.2371186" id="Shape" stroke="#F7F7F7" stroke-width="0.639"></path>
<path d="M20.8428454,46.089661 L14.4691169,44.5971186" id="Shape" stroke="#E8E4E7" stroke-width="0.639"></path>
</g>
<g transform="translate(0.000000, 15.423729)">
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="4.82662576" cy="2.26966102" rx="1.78861336" ry="1.77491525"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="2.3218497" cy="9.72288136" rx="1.78861336" ry="1.77491525"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="11.2649165" cy="17.8879661" rx="1.78861336" ry="1.77491525"></ellipse>
<path d="M6.61404352,9.01457627 C6.61404352,9.01457627 21.9954011,8.65864407 25.2151442,31.3777966" id="Shape" stroke="#F4F4F4" stroke-width="0.5984" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M13.5891574,16.2898305 C13.5891574,16.2898305 16.9882401,14.3369492 19.8493041,16.8213559" id="Shape" stroke="#F4F4F4" stroke-width="0.5984" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M8.04517333,3.51186441 C8.04517333,3.51186441 14.3029289,6.88372881 15.3777707,11.8537288" id="Shape" stroke="#F4F4F4" stroke-width="0.5984" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
</g>
<g id="Group" transform="translate(222.000000, 148.000000)">
<g id="Shape">
<path d="M43.2711781,33.4327532 C43.2711781,33.4327532 48.3088356,49.3287967 49.3683288,51.9356155 C50.4290137,54.5412532 54.3070685,64.5090575 54.3070685,64.5090575 L49.3361507,65.7799851 C49.3361507,65.7799851 44.5964384,59.7525285 42.7432192,56.6271807 C41.4286849,54.4148691 36.5113973,42.2938112 36.5113973,42.2938112" fill="#FFC0B6" fill-rule="nonzero"></path>
<path d="M44.1995753,37.3081372 L39.8245479,47.6350141 C38.9295205,46.2672314 36.4434658,42.1627025 36.4434658,42.1627025" fill="#DD705E" fill-rule="nonzero"></path>
<g transform="translate(36.945205, 133.471014)" fill-rule="nonzero">
<path d="M0.698383562,4.0195213 C2.60880822,8.12759376 1.55884932,10.8064633 5.11035616,13.9719706 C8.85731507,17.3063836 9.29469863,20.6915865 12.6936575,21.3553981 C14.7232603,15.6704778 8.72979452,9.17410101 6.62749315,0.0201155029" fill="#FFC0B6"></path>
<g transform="translate(2.383562, 7.444884)">
<path d="M13.2597534,12.4151667 C15.9496027,16.5775725 13.8175068,19.1501377 11.3636301,19.4572391 C8.25784932,19.8446594 4.3809863,17.8307826 3.72193151,15.9291159 C3.04380822,13.9731159 2.93416438,13.7794058 2.48247945,12.8533768 C2.01172603,11.8836449 0.815178082,10.7013043 0.50769863,9.35360145 C0.106068493,7.59485507 0.104876712,6.90387681 0.104876712,6.90387681 L0.0989178082,2.60681884 C0.0989178082,2.60681884 0.777041096,3.56828261 1.68279452,2.83005797 C2.98421918,1.77055797 4.57047945,-0.581130435 6.70257534,0.309463768 C10.0383699,1.70323188 9.75710959,6.99364493 13.2597534,12.4151667 Z" fill="#000000"></path>
<path d="M0.23239726,7.83935507 C0.287219178,8.12755797 0.355150685,8.45710145 0.442150685,8.84334058 C0.750821918,10.1910435 1.4229863,11.2871594 2.08680822,12.2013768 C2.69342466,13.0364565 2.97826027,13.4652174 3.65519178,15.4223986 C4.31424658,17.3217029 8.19230137,19.3367609 11.2968904,18.9481594 C12.990411,18.737913 14.365726,17.6028188 14.5111233,15.507442 C15.4562055,18.5241232 13.561274,20.2167246 11.494726,20.4765797 C6.35576712,21.115587 4.42389041,18.5949928 3.8530274,16.9472754 C3.17371233,14.9924565 3.0140137,14.8235507 2.71487671,13.8455507 C2.41573973,12.8651884 0.902178082,11.4808696 0.593506849,10.1319855 C0.191876712,8.37323913 0.235972603,7.92203623 0.235972603,7.92203623 L0.23239726,7.83935507 Z" fill="#FFFFFF"></path>
<path d="M13.860411,17.8662174 C13.860411,17.8662174 12.9463151,16.1724348 10.7844247,16.1901522 C8.71430137,16.2078696 7.20312329,18.6989348 7.20312329,18.6989348 C7.20312329,18.6989348 9.70467123,19.9710435 10.9095616,19.8210362" fill="#FFFFFF"></path>
</g>
</g>
<g transform="translate(63.164384, 118.473869)" fill-rule="nonzero">
<path d="M1.2740137,4.47423188 C3.18563014,8.58112319 0.611383562,10.4012899 4.16408219,13.5644348 C7.9110411,16.9012101 12.5077397,19.4607826 15.910274,20.123413 C17.9410685,14.4384928 7.34375342,9.36186957 7.84191781,0.663811594" fill="#FFC0B6"></path>
<path d="M1.80793151,8.84215942 C1.80793151,8.84215942 -1.12146575,14.0534348 3.30480822,15.9173043 C9.78094521,18.6469638 12.033411,21.8042029 15.621863,22.5034493 C21.0075205,23.5535 23.4006164,21.0848768 22.7594384,19.5505507 C21.4866164,16.5067029 14.5242329,13.4002536 11.7581096,8.1559058 C8.95861644,2.84895652 7.99446575,8.98744203 7.00171233,9.91465217 C3.88639726,12.825029 1.80793151,8.84215942 1.80793151,8.84215942 Z" fill="#000000"></path>
<path d="M0.937931507,13.1699275 C1.21442466,14.1113116 1.63989041,15.0715942 5.57991781,16.5905652 C10.0622055,18.3162391 12.0572466,21.6978986 15.621863,22.5046304 C20.5272329,23.612558 22.0848904,20.8226594 22.7153425,19.3946377 C22.7522877,19.4383406 22.8309452,19.6202391 22.8643151,19.663942 C23.9071233,20.967942 21.6046027,24.8787609 15.4109178,23.635 C11.8248493,22.9168551 8.98841096,18.8229565 2.92343836,17.4941522 C0.0726986301,16.8693188 0.927205479,14.1680072 0.937931507,13.1699275 Z" fill="#FFFFFF"></path>
<path d="M23.0454658,20.2427101 C23.0454658,20.2427101 21.1255068,18.3871087 20.0612466,19.4241667 C18.9969863,20.4624058 18.3403151,22.7184203 18.3403151,22.7184203 C18.3403151,22.7184203 20.5987397,22.6451884 20.8573562,22.523529" fill="#FFFFFF"></path>
</g>
<path d="M45.2602603,65.6819488 C40.1582466,58.4414416 39.4038493,35.9391735 37.4147671,35.8411372 C33.1672603,35.6332532 23.9798219,35.802159 19.7311233,37.1451372 C15.2464521,38.7916735 4.34761644,46.3947967 2.48486301,51.2458184 C1.67326027,53.5195503 6.99694521,59.1028909 8.12436986,61.4073329 C10.3756438,66.0150358 12.1216027,75.3650938 14.142863,78.1916083" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M12.566137,74.7957749 C13.0488082,82.5902459 13.098863,85.0009923 19.1137808,92.5580503 C24.495863,99.3178256 29.6836849,103.370384 30.6776301,110.573094 C32.0672466,120.629485 37.2550685,138.377587 37.7067534,138.703587 C38.7221507,139.437087 46.5581096,137.968905 45.713137,135.80384 C44.6739041,133.14505 44.9694658,114.095311 43.2699863,103.145963 C42.7396438,99.7300503 36.9463973,85.7415793 36.9082603,84.6643619 C36.8546301,83.1772822 39.0832603,83.3072097 39.0832603,83.3072097 C40.2500137,84.0099996 59.3161233,94.7089416 59.1754932,97.0547242 C58.7106986,104.872818 63.2525753,120.801934 64.6421918,123.831608 C65.2690685,125.194666 72.7141233,124.826144 72.0002466,121.487007 C70.383,113.947666 71.3030548,91.7182459 68.5202466,87.8676662 C63.1524658,80.441717 46.7011233,66.3363112 46.7011233,66.3363112 C46.7011233,66.3363112 35.941726,73.1846735 31.1412329,73.9914054 C15.1368082,76.6773619 12.566137,74.7957749 12.566137,74.7957749 Z" fill="#F26D5B" fill-rule="nonzero"></path>
<path d="M24.9296712,74.3800068 C30.6847808,79.7271155 27.6397808,81.8532025 29.1473836,81.8520213 C32.4641096,81.8461155 36.8689315,85.1982459 38.0035068,88.0613764 C38.2073014,88.5787242 36.599589,84.9974488 38.1632055,84.2604054 C39.7256301,83.5221807 43.2521096,86.4703546 45.9550685,87.0845575 C45.9550685,87.0845575 42.4047534,80.3814778 46.9323288,76.9218619 C51.4587123,73.4587025 53.3441096,74.0882604 53.3441096,74.0882604 C47.5306027,70.2754778 47.0717671,66.5831735 47.0717671,66.5831735 L24.9296712,74.3800068 Z" fill="#D85648" fill-rule="nonzero"></path>
<g transform="translate(15.129941, 61.778217)" fill-rule="nonzero">
<path d="M16.1817162,23.3668768 C17.0183464,23.7708333 18.6451272,23.6468116 19.8166477,23.0881232 L45.083593,10.0587536 C46.2539217,9.5036087 46.3004012,9.16343478 45.463771,8.75947826 L30.6999902,1.65362319 C29.8621683,1.24966667 29.3926067,0.85515942 28.2234697,1.41148551 L1.00081213,13.6766449 C-0.171900196,14.2341522 0.030702544,15.559413 0.868524462,15.9645507 L16.1817162,23.3668768 Z" fill="#2D3B54"></path>
<path d="M16.0947162,22.5105362 C16.906319,22.9026812 18.483045,22.7822029 19.6164286,22.2412319 L45.5424286,9.82724638 C46.6758121,9.28745652 46.6317162,8.50671014 45.8201135,8.11574638 L31.2875382,0.965007246 C30.4747436,0.574043478 28.4153464,0.291746377 27.2795793,0.831536232 L1.35596282,13.2443406 C0.222579256,13.7853116 -0.0658317025,14.6841739 0.745771037,15.0763188 L16.0947162,22.5105362 Z" fill="#FFFFFF"></path>
<path d="M17.2042642,21.212442 C17.6630998,21.4333188 18.5509765,21.3648116 19.1921546,21.0600725 L33.8164971,14.0569783 C34.4564834,13.7534203 34.6018806,13.3258406 34.1442368,13.1037826 L25.7743601,9.05831159 C25.3167162,8.83625362 24.4276477,8.90357971 23.7888532,9.2095 L9.16451076,16.2102319 C8.52452446,16.5173333 8.37793542,16.9437319 8.83438748,17.1634275 L17.2042642,21.212442 Z" fill="#2D3B54"></path>
</g>
<path d="M27.3358767,74.7060068 C27.2166986,74.7213619 26.6672877,74.7060068 25.8246986,74.6741155 C23.8785205,74.6020648 20.368726,74.4508764 17.0269726,74.4059923 C14.5444932,74.3752822 7.35924658,72.9850575 5.11393151,72.7228401 C3.99365753,72.5905503 2.77565753,65.282717 2.12375342,60.4683112 C1.52786301,56.0696735 0.659054795,48.40513 2.32158904,46.2979416 C3.306,45.360101 11.3576712,43.2434633 11.8653699,44.7352677 C13.1989726,48.642543 12.5125068,64.7393836 12.615,65.5402097 C12.615,65.5402097 23.8606438,70.2494923 29.2975479,69.572688 C31.0649589,69.3518112 34.8035753,68.3442822 34.8035753,68.3442822 C34.8035753,68.3442822 35.6449726,73.8071445 34.1671644,74.1272387 C32.6893562,74.4473329 28.285726,74.5878909 27.3358767,74.7060068 Z" fill="#FFC0B6" fill-rule="nonzero"></path>
<path d="M1.79363014,57.8969271 C0.996328767,51.9344343 1.55050685,47.6350141 1.79363014,47.2428691 C1.12265753,48.3295358 12.392137,54.0321735 12.4195479,54.117217 L1.79363014,57.8969271 Z" fill="#DD705E" fill-rule="nonzero"></path>
<path d="M13.9438356,54.3451807 C9.57,54.7349633 0.622109589,53.9731155 0.731753425,51.9663256 C0.871191781,49.4150213 1.22038356,41.4433764 2.03317808,39.1696445 C3.89593151,34.3209851 14.7935753,26.7154996 19.2794384,25.0689633 C23.5269452,23.7248039 31.0435068,25.4174054 33.7273973,25.8083691 C41.8207808,26.9871662 43.8682603,32.453572 45.6571233,35.7749923 C45.6571233,35.7749923 41.7814521,41.9323764 38.6983151,42.4213764 C38.008274,42.5312242 39.1678767,49.0524054 39.1952877,50.3363256 C39.2226986,51.6249706 40.3882603,54.9310358 40.3882603,54.9310358" fill="#FFFFFF" fill-rule="nonzero"></path>
<g transform="translate(32.178082, 50.789855)">
<path d="M0.734136986,33.9749054 C0.675739726,34.7485648 1.22276712,35.0745648 1.95690411,34.6954126 L28.487137,21.2620865 C29.2224658,20.8864778 29.8696027,19.9509996 29.9291918,19.1749778 L31.3295342,0.900079271 C31.3879315,0.122876372 30.8397123,-0.200761309 30.1043836,0.177209706 L3.57534247,13.611717 C2.83882192,13.9885068 2.19406849,14.9228039 2.13447945,15.7000068 L0.734136986,33.9749054 Z" fill="#629AF4" fill-rule="nonzero"></path>
<path d="M0.636410959,33.9760865 L2.03794521,15.6988256 C2.09872603,14.9239851 2.74347945,13.9885068 3.47880822,13.6105358 L30.0090411,0.178390865 C30.5155479,-0.0814642073 30.9314795,-0.0105946421 31.1257397,0.31186188 C30.9302877,0.284695213 30.6978904,0.327216952 30.4404658,0.460687967 L3.91023288,13.8916517 C3.17609589,14.2684416 2.5289589,15.205101 2.47056164,15.9823039 L1.0690274,34.2560213 C1.04876712,34.4993401 1.09286301,34.6965938 1.17867123,34.8442387 C0.819945205,34.7899054 0.601849315,34.4792604 0.636410959,33.9760865 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M15.9996575,18.2241445 C15.9936986,19.0769416 16.7254521,19.4371952 17.6347808,19.0332387 C18.5429178,18.628101 19.2806301,17.6087604 19.2842055,16.7559633 C19.286589,15.9055285 18.5572192,15.5440938 17.6478904,15.9468691 C16.7397534,16.353188 16.0020411,17.3713474 15.9996575,18.2241445 Z" stroke="#FFFFFF" stroke-width="0.2128" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
<g transform="translate(14.301370, 0.000000)" fill-rule="nonzero">
<path d="M16.5204658,6.38065898 C14.5218493,2.50527492 4.71945205,7.75789087 2.6660137,10.3540793 C0.0119178082,14.0014996 3.05453425,22.9865793 7.32468493,25.3524416 C17.1938219,30.9617677 17.7384658,9.40678942 17.9839726,4.56167347" fill="#FFC0B6"></path>
<path d="M12.169274,29.8148619 C12.4850959,33.5331517 3.61109589,35.3367822 1.99146575,31.2617822 C1.08809589,28.9845068 1.7459589,28.51913 2.0260274,23.0031155 C2.06773973,22.1503184 2.22147945,18.2265068 2.61476712,17.6808112 C4.90894521,14.50113 9.94064384,17.1008619 11.6139041,20.6171735 C12.9641918,23.4519561 13.2251918,20.9821517 12.566137,24.9284054 C12.566137,24.9295865 11.9702466,27.4702604 12.169274,29.8148619 Z" fill="#FFC0B6"></path>
<path d="M12.6293014,25.4327604 C12.6293014,25.4327604 10.1503973,27.3793112 7.93726027,25.9678256 C5.98393151,24.7240648 4.76593151,22.6204199 4.76593151,22.6204199 C4.76593151,22.6204199 5.1890137,26.911572 8.14582192,28.1364343 C11.1026301,29.3612967 12.6293014,25.4327604 12.6293014,25.4327604 Z" fill="#DD705E"></path>
<path d="M16.1450548,2.90686913 C12.4052466,2.7474126 7.79424658,-2.8264787 3.85183562,2.25723144 C1.18820548,5.69086188 10.6366438,8.71344884 13.6887945,8.05318072" fill="#000000"></path>
<path d="M10.3124795,10.7261445 C16.0783151,9.84618072 18.7622055,10.8879633 20.1208356,8.64021695 C23.0752603,3.75376043 15.263137,1.27568797 12.6900822,3.30846333" fill="#000000"></path>
<path d="M11.5721918,9.29221695 C7.95990411,10.1958039 6.48924658,14.0487459 5.01143836,16.1334923 C1.76621918,9.76940536 3.06287671,2.53480391 11.3457534,1.59223869" fill="#000000"></path>
<path d="M6.54049315,10.5619633 C2.92939726,11.4643691 1.8889726,14.6464126 2.20121918,17.3807967 C-1.04280822,11.0155285 0.140630137,0.595340141 5.60613699,2.06115898" fill="#000000"></path>
</g>
</g>
<path d="M21.5628904,40.0496083 C21.9073151,39.6291155 22.3184795,39.2830358 22.7737397,39.0562532 C23.5710411,38.654659 24.3242466,38.7160793 24.8617397,39.136572 C25.2729041,38.240072 25.9414932,37.4640503 26.7423699,37.0624561 C27.1916712,36.8368546 27.627863,36.7612604 28.0223425,36.8085068 C28.8673151,36.9171735 29.5013425,37.6223256 29.6133699,38.7467894 C29.6467397,39.0668836 29.6312466,39.3964271 29.5776164,39.7247894 C29.3630959,42.240659 26.4730274,47.2877532 26.4730274,47.2877532 C26.4730274,47.2877532 21.3805479,46.2447894 20.7083836,44.1730358 C20.5975479,43.9273546 20.5224658,43.6426952 20.4902877,43.3214199 C20.3782603,42.1993184 20.8180274,40.9567387 21.5628904,40.0496083 Z" id="Shape" fill="#FF7373" fill-rule="nonzero"></path>
<g transform="translate(22.280626, 47.604304)" fill="#2D3B54" fill-rule="nonzero" id="Shape">
<path d="M2.45597652,5.94005072 C2.22000391,5.9495 1.96853816,6.031 1.68489432,6.19636232 C1.23320939,6.50582609 0.847072407,6.98183333 0.547935421,7.58894928 C0.232113503,8.23386232 0.0747984344,8.96263768 0.0759902153,9.80952899 C0.142729941,10.5631087 0.336990215,11.1631377 0.652812133,11.5966232 C0.962675147,12.0159348 1.32020939,12.2876014 1.71230528,12.3962681 C2.08175734,12.5025725 2.47623679,12.6242319 2.89336008,12.765971 C3.27353816,12.8923551 3.51904501,13.2490652 3.644182,13.8337391 C3.72879843,14.3924275 3.67397652,14.7703986 3.61081213,14.9062319 C3.47971624,15.1767174 3.19964775,15.477913 2.89097652,15.707058 C2.57992172,15.8877754 2.01501761,15.9657319 1.05563405,15.2948333 C0.885209393,15.2440435 0.714784736,15.3361739 0.543168297,15.5688623 C0.454976517,15.6917029 0.296469667,15.9539203 0.223771037,16.3425217 C0.182058708,16.5574928 0.178483366,16.7452971 0.214236791,16.9023913 C0.24164775,17.0335 0.297661448,17.1386232 0.397771037,17.2342971 C0.864949119,17.5803768 1.26538748,17.7717246 1.61934638,17.8248768 C1.98999022,17.878029 2.40353816,17.7658188 2.87905871,17.4811594 C3.34504501,17.1575217 3.70138748,16.8197101 3.96834638,16.4511884 C4.06368885,16.3212609 4.14830528,16.1830652 4.22457926,16.0413261 C4.4891546,15.5357899 4.67626419,15.0125362 4.77994912,14.4869203 C4.87886693,13.9872899 4.8931683,13.4805725 4.81808611,12.9195217 C4.69056556,12.202558 4.49868885,11.6875725 4.24841487,11.3970072 C4.00529159,11.1147101 3.7121135,10.9115507 3.36888063,10.7934348 C3.04233268,10.6824058 2.70386693,10.5749203 2.35229159,10.4757029 C2.02931898,10.3835725 1.75759295,10.194587 1.54903131,9.9111087 C1.34881213,9.64298551 1.23797652,9.30044928 1.2200998,8.91657246 C1.2141409,8.53978261 1.26777104,8.33189855 1.33570254,8.25866667 C1.6241135,7.97282609 1.86366145,7.84053623 2.07579843,7.8617971 C2.3201135,7.88542029 2.59303131,8.00707971 2.87429159,8.22441304 C3.06736008,8.39095652 3.296182,8.11928986 3.38675734,7.99644928 L3.38675734,7.99526812 C3.47733268,7.87242754 3.55956556,7.71651449 3.61677104,7.56650725 C3.69304501,7.38933333 3.80745597,7.04443478 3.73952446,6.73497101 C3.71926419,6.64047826 3.68351076,6.55543478 3.59651076,6.44558696 C3.05782583,6.09123913 2.69433268,5.92942029 2.45597652,5.94005072 Z"></path>
<path d="M6.94899022,2.42492029 C6.3530998,2.83478261 5.83229159,3.586 5.45568885,4.58762319 C5.10292172,5.51955797 4.9241546,6.6511087 4.90151076,8.04723913 C4.88125049,9.18115217 4.97897652,10.239471 5.19230528,11.1973913 C5.4830998,12.5025725 5.90141487,13.3872609 6.4341409,13.825471 C6.98831898,14.2825797 7.6211546,14.2731304 8.32192172,13.7912174 C8.55074364,13.6258551 8.76883953,13.4108841 8.97144227,13.1522101 C9.14901761,13.454587 9.3671135,13.6884565 9.61500391,13.847913 C9.78185323,13.9825652 9.93678474,13.9943768 10.1012505,13.8798043 C10.1822916,13.8242899 10.2609491,13.743971 10.3372231,13.6364855 C10.4254149,13.5148261 10.5052642,13.366 10.5874971,13.1616594 C10.6971409,12.8687319 10.8353875,12.3313043 10.517182,11.9852246 C10.2478395,11.8647464 10.0297436,11.6745797 9.86408611,11.4135435 C10.1381957,10.5572029 10.2895519,9.57093478 10.3181546,8.41457971 C10.3503327,7.15546377 10.2502231,5.99556522 10.0214012,4.9715 C9.73894912,3.70765942 9.32420939,2.8465942 8.79148337,2.41547101 C8.23849706,1.96072464 7.61996282,1.96544928 6.94899022,2.42492029 Z M7.99060665,10.1508841 C7.86189432,10.3316014 7.75105871,10.5690145 7.68431898,10.817058 L7.64737378,11.0379348 C7.62353816,11.4229928 7.72245597,11.7147391 7.9381683,11.906087 L8.02755186,11.9320725 C8.13362035,11.9190797 8.23134638,11.9556957 8.32192172,12.0336522 C7.91790802,12.2816957 7.5341546,12.2533478 7.17662035,11.9438841 C6.77737378,11.5989855 6.45797652,10.8961957 6.22677104,9.85441304 C6.05634638,9.09256522 5.97530528,8.25394203 5.98245597,7.36098551 C5.98960665,6.14557246 6.14572994,5.45813768 6.27563405,5.09197826 C6.35905871,4.8581087 6.45201761,4.67148551 6.55689432,4.5262029 C6.64746967,4.401 6.75592172,4.29587681 6.87748337,4.21083333 C7.28030528,3.93680435 7.67478474,3.95688406 8.04781213,4.2817029 C8.44467515,4.62187681 8.7581135,5.30222464 8.97859295,6.29912319 C9.16451076,7.12593478 9.2491272,8.05196377 9.23601761,9.05122464 C9.22886693,9.50951449 9.20145597,9.88866667 9.15974364,10.2016739 C8.98693542,9.99497101 8.8081683,9.87331159 8.61986693,9.8296087 C8.53763405,9.8118913 8.28140117,9.75047101 7.99060665,10.1508841 Z"></path>
<path d="M15.0435656,8.07794928 L14.9565656,8.13346377 C14.2653327,8.70750725 13.5669491,9.22839855 12.8363875,9.71976087 L12.0057162,0.605934783 C11.9330176,0.153550725 11.7101546,0.138195652 11.5361546,0.20315942 L11.4646477,0.2445 C11.3716888,0.311826087 11.2834971,0.401594203 11.202456,0.511442029 C11.0153464,0.770115942 10.8175108,1.23076812 10.8735245,1.65598551 L11.7554423,10.9564348 C11.762593,10.9942319 11.7685519,11.0343913 11.7792779,11.0757319 C11.8186067,11.2564493 11.8972642,11.4111812 12.0259765,11.5529203 C12.1928258,11.7182826 12.3894697,11.7277319 12.6230587,11.5753623 C13.4298943,11.0072246 14.2426888,10.3942029 15.041182,9.7481087 L15.1162642,9.68668841 L15.1889628,9.5792029 C15.3069491,9.41147826 15.5619902,8.965 15.4320861,8.39331884 C15.3427025,8.10747826 15.2187573,8.00471739 15.0435656,8.07794928 Z"></path>
</g>
<path d="M28.5526849,15.8405648 C28.5526849,15.8405648 29.3476027,18.7722025 29.1485753,19.7502025 C28.9507397,20.7270213 26.5063973,20.0301372 26.5063973,20.0301372 L28.5526849,15.8405648 Z" id="Shape" fill="#EF9D97" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -0,0 +1,595 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="844px" height="646px" viewBox="0 0 844 646" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 49.3 (51167) - http://www.bohemiancoding.com/sketch -->
<title>dashboard</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="-0.000102008082%" y1="49.9999524%" x2="100.000156%" y2="49.9999524%" id="linearGradient-1">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#F6F7FC" offset="19.43%"></stop>
<stop stop-color="#F1F2FA" offset="60.75%"></stop>
</linearGradient>
<linearGradient x1="62.50033%" y1="92.9494603%" x2="37.50011%" y2="7.05053973%" id="linearGradient-2">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#A9C9FF" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="62.49879%" y1="92.951206%" x2="37.4993033%" y2="7.05228549%" id="linearGradient-3">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#A9C9FF" offset="99.46%"></stop>
</linearGradient>
<polygon id="path-4" points="26.5156214 26.248381 52.6630874 13.1558095 26.5156214 0.0624761905 26.5156214 0.0624761905 26.5148544 0.0624761905 26.5148544 0.0624761905 26.5148544 0.0624761905 0.36892233 13.1558095 26.5156214 26.248381 26.5156214 26.248381 26.5156214 26.248381"></polygon>
<linearGradient x1="50.0005802%" y1="99.9997711%" x2="50.0005802%" y2="0.00104720209%" id="linearGradient-6">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="19.35%"></stop>
<stop stop-color="#8CB3FE" offset="94.09%"></stop>
</linearGradient>
<linearGradient x1="50.0001868%" y1="99.9999005%" x2="50.0001868%" y2="-0.00104593654%" id="linearGradient-7">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="19.35%"></stop>
<stop stop-color="#8CB3FE" offset="94.09%"></stop>
</linearGradient>
<linearGradient x1="104.217485%" y1="82.009814%" x2="-13.1394306%" y2="12.6572295%" id="linearGradient-8">
<stop stop-color="#92B6FE" offset="49.82%"></stop>
<stop stop-color="#4080FE" offset="73.5%"></stop>
</linearGradient>
<linearGradient x1="31.1908806%" y1="17.8972612%" x2="70.327312%" y2="82.4981081%" id="linearGradient-9">
<stop stop-color="#E9F2FF" offset="0%"></stop>
<stop stop-color="#D2E2FE" offset="36.75%"></stop>
<stop stop-color="#FFFFFF" offset="94.35%"></stop>
</linearGradient>
<linearGradient x1="50.0001821%" y1="99.999199%" x2="50.0001821%" y2="-0.00209545281%" id="linearGradient-10">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="49.9991509%" y1="100.000113%" x2="49.9991509%" y2="-0.000999261679%" id="linearGradient-11">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="62.5008433%" y1="92.9499564%" x2="37.5013567%" y2="7.05353506%" id="linearGradient-12">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#A9C9FF" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="-0.000393639232%" y1="49.9988601%" x2="100.002731%" y2="49.9988601%" id="linearGradient-13">
<stop stop-color="#FFFFFF" offset="16.13%"></stop>
<stop stop-color="#F1F2FA" offset="60.75%"></stop>
</linearGradient>
<linearGradient x1="50.001868%" y1="99.9979135%" x2="50.001868%" y2="-0.00419080784%" id="linearGradient-14">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="19.35%"></stop>
<stop stop-color="#C7D7FF" stop-opacity="0.7312" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="49.9998267%" y1="100.001587%" x2="49.9998267%" y2="0.0016863731%" id="linearGradient-15">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="19.35%"></stop>
<stop stop-color="#C7D7FF" stop-opacity="0.7312" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="69.0820638%" y1="94.0576058%" x2="26.1048521%" y2="3.19687565%" id="linearGradient-16">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="50.0002838%" y1="99.9983512%" x2="50.0002838%" y2="0.00320317604%" id="linearGradient-17">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="50.0005675%" y1="99.99765%" x2="50.0005675%" y2="0.00213534452%" id="linearGradient-18">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="49.9997162%" y1="99.9967249%" x2="49.9997162%" y2="-0.00106764528%" id="linearGradient-19">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="49.9977299%" y1="99.9999407%" x2="49.9977299%" y2="0.00320322695%" id="linearGradient-20">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" stop-opacity="0.9" offset="99.46%"></stop>
</linearGradient>
<linearGradient x1="62.0699037%" y1="98.8010777%" x2="42.593541%" y2="5.15112969%" id="linearGradient-21">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#BFD3FF" offset="99.46%"></stop>
</linearGradient>
</defs>
<g id="dashboard" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Layer_2" transform="translate(134.000000, 30.000000)">
<g id="Group" fill-rule="nonzero">
<path d="M328.29469,313.760333 L13.044751,471.219467 C8.606253,473.404118 9.04419707,477.220161 14.0234141,479.743982 L240.125273,594.500734 C245.10449,597.02609 252.741284,597.299267 257.181316,595.11615 L572.431254,437.657784 C576.869752,435.473132 576.431808,431.657857 571.452591,429.133269 L345.351499,314.376517 C340.369981,311.851928 332.734722,311.575681 328.29469,313.760333 Z" id="Shape" fill="#95BFE8" opacity="0.2"></path>
<g id="Shape">
<path d="M328.098344,2.808509 L324.194429,1.0704563 C322.71723,0.260899743 320.811292,0.27394473 318.725113,1.31140488 L9.20449534,155.194677 C4.52209854,157.523591 0.724026631,164.103636 0.724026631,169.891774 L0.724026631,439.781815 C0.724026631,443.144352 2.01101465,445.490148 4.00132091,446.417109 C3.99978695,446.421713 3.99518509,446.42862 3.99518509,446.42862 L9.12472969,448.694611 C9.12472969,448.694611 9.24207723,447.426177 9.29116378,446.004274 L318.723579,292.163973 C323.406743,289.835826 327.204815,283.255014 327.204815,277.467644 L327.204815,7.57760283 C327.204815,6.13421337 326.966285,4.87805784 326.540613,3.83906298 C327.433374,3.27045501 328.098344,2.808509 328.098344,2.808509 Z" fill="#CBD4F4"></path>
<path d="M331.731515,279.502662 C331.731515,285.291567 327.93421,291.871612 323.251047,294.198991 L13.7304288,448.083031 C9.04726498,450.41041 5.24996005,447.605738 5.24996005,441.8176 L5.24996005,171.927559 C5.24996005,166.138654 9.046498,159.558609 13.7304288,157.230463 L323.251047,3.34719023 C327.933443,1.01827635 331.731515,3.82448329 331.731515,9.61262082 L331.731515,279.502662 Z" fill="#FFFFFF"></path>
<polygon fill="#E9F2FF" points="321.130354 275.193979 15.8503542 426.968568 15.8503542 176.731184 321.130354 24.9550604"></polygon>
</g>
<path d="M575.513736,402.348073 L345.351499,293.439312 C340.369981,290.914724 332.734722,290.640012 328.29469,292.822361 L10.0151904,444.485684 L10.0151904,453.702351 C9.79506791,455.459587 11.145715,457.348808 14.0234141,458.80908 L240.125273,573.565064 C245.10449,576.088118 252.741284,576.363598 257.181316,574.180481 L572.431254,416.72058 C574.524336,415.690026 575.519872,414.296514 575.478455,412.846986 L575.513736,412.846986 L575.513736,402.348073 Z" id="Shape" fill="#C6DBF6"></path>
<path d="M328.29469,282.684871 L13.044751,440.144005 C8.606253,442.328657 9.04419707,446.144699 14.0234141,448.668521 L240.125273,563.425272 C245.10449,565.950629 252.741284,566.223806 257.181316,564.040689 L572.431254,406.582323 C576.869752,404.397671 576.431808,400.582396 571.452591,398.057807 L345.351499,283.301055 C340.369981,280.776467 332.734722,280.50022 328.29469,282.684871 Z" id="Shape" fill="url(#linearGradient-1)"></path>
</g>
<g id="Group" transform="translate(23.000000, 173.000000)" fill="#559AFF" fill-rule="nonzero">
<path d="M3.6585,8.96158824 C3.6585,10.2233529 2.8455,11.6579412 1.8435,12.1657059 C0.84225,12.6734706 0.03,12.0617059 0.03,10.7991765 C0.03,9.53741176 0.84225,8.10282353 1.8435,7.59505882 C2.8455,7.08805882 3.6585,7.69905882 3.6585,8.96158824 Z" id="Shape"></path>
<path d="M10.5975,5.40341176 C10.5975,6.66594118 9.78525,8.10052941 8.78325,8.60829412 C7.782,9.11682353 6.969,8.50429412 6.969,7.24252941 C6.969,5.98 7.782,4.54617647 8.78325,4.03841176 C9.78525,3.53064706 10.5975,4.14164706 10.5975,5.40341176 Z" id="Shape"></path>
<path d="M17.421,1.96452941 C17.421,3.22705882 16.60725,4.66164706 15.606,5.16941176 C14.6055,5.67717647 13.7925,5.06464706 13.7925,3.80288235 C13.7925,2.54111765 14.6055,1.10652941 15.606,0.598764706 C16.60725,0.0917647059 17.421,0.702764706 17.421,1.96452941 Z" id="Shape"></path>
</g>
<g id="Group" transform="translate(480.000000, 182.000000)" fill-rule="nonzero">
<path d="M64.6850595,37.3330769 C64.678869,36.58 64.1163095,35.7007692 63.4252976,35.37 L56.5074405,32.0446154 C56.9268452,31.4492308 57.1682738,30.64 57.1628571,29.6469231 C57.1435119,26.6392308 54.8894048,23.1246154 52.1292262,21.7992308 C51.2045238,21.3546154 50.3417262,21.2176923 49.6011905,21.3392308 C49.615119,21.0953846 49.6329167,20.8538462 49.631369,20.5976923 C49.5903571,14.5830769 45.0844643,7.55692308 39.5633333,4.90307692 C37.3502381,3.84 35.3120238,3.64461538 33.6653571,4.17615385 C33.6545238,4.16692308 33.6405952,4.15230769 33.6405952,4.15230769 L33.3968452,4.26923077 C33.129881,4.37 32.8783929,4.49307692 32.6361905,4.63307692 L31.0452381,5.39384615 C29.5842857,3.52307692 27.7898214,1.95769231 25.8398214,1.02153846 C23.7381548,0.0115384615 21.8229762,-0.0992307692 20.3256548,0.524615385 C20.3217857,0.521538462 20.3109524,0.509230769 20.3109524,0.509230769 L17.5407143,1.83615385 C17.5407143,1.83615385 17.8200595,2.05769231 18.187619,2.34769231 C17.6165476,3.24384615 17.2559524,4.38461538 17.1816667,5.75230769 C16.4372619,4.92076923 15.5744643,4.23 14.6528571,3.78769231 C13.4936905,3.23 12.4335714,3.15230769 11.5893452,3.46538462 L11.5816071,3.45769231 L11.501131,3.49615385 C11.4663095,3.51153846 11.4338095,3.52846154 11.3997619,3.54461538 L8.81136905,4.78384615 C8.81136905,4.78384615 9.29886905,5.17076923 9.83279762,5.59076923 C9.74071429,5.96615385 9.68732143,6.37692308 9.68964286,6.83076923 C9.69660714,7.82538462 9.95041667,8.87230769 10.3822024,9.87923077 L4.71017857,7.15230769 C4.4285119,7.01692308 4.17160714,6.99846154 3.96345238,7.06923077 C3.95880952,7.06461538 3.94642857,7.05230769 3.94642857,7.05230769 L1.17541667,8.37923077 C1.17541667,8.37923077 3.83113095,10.4876923 3.56571429,10.1992308 C3.29952381,9.91153846 5.96065476,11.0776923 6.35761905,11.0776923 C6.50077381,11.0776923 6.56886905,10.9430769 6.62613095,10.7876923 L52.1903571,32.6861538 C52.1942262,32.6884615 52.1973214,32.6907692 52.2019643,32.6938462 C52.2066071,32.6938462 52.2097024,32.6969231 52.2135714,32.6976923 L60.07625,36.4769231 C60.0220833,36.6892308 60.0406548,36.9261538 60.1667857,37.0623077 C60.4322024,37.3492308 61.6083929,39.4107692 61.6083929,39.4107692 L64.1395238,38.1992308 C64.2192262,38.1792308 64.2873214,38.1415385 64.3530952,38.0953846 L64.3763095,38.0846154 L64.3755357,38.0761538 C64.5682143,37.9284615 64.687381,37.6761538 64.6850595,37.3330769 Z" id="Shape" fill="#DEEBFF"></path>
<path d="M60.7231548,36.6646154 L53.8045238,33.3392308 C54.2254762,32.7430769 54.4653571,31.9338462 54.4607143,30.9407692 C54.4421429,27.9338462 52.1872619,24.42 49.4263095,23.0930769 C48.5008333,22.6476923 47.6388095,22.5130769 46.8990476,22.6330769 C46.9122024,22.3892308 46.9307738,22.1476923 46.9292262,21.8915385 C46.8882143,15.8769231 42.3815476,8.85076923 36.8604167,6.19692308 C33.41,4.53846154 30.3782143,4.98153846 28.6015476,7.01846154 C27.0995833,4.99923077 25.2014286,3.30615385 23.136131,2.31461538 C18.4955952,0.0830769231 14.7372024,2.20769231 14.47875,7.04538462 C13.735119,6.21461538 12.8715476,5.52307692 11.9499405,5.08153846 C9.1897619,3.75230769 6.96738095,5.11615385 6.9875,8.12307692 C6.99446429,9.11769231 7.24904762,10.1646154 7.68005952,11.1707692 L2.00880952,8.44538462 C1.31702381,8.11384615 0.76375,8.45230769 0.767619048,9.20615385 C0.772261905,9.95615385 1.33482143,10.8361538 2.02505952,11.1684615 L49.4866667,33.9784615 C49.4913095,33.98 49.493631,33.9823077 49.4998214,33.9853846 C49.5029167,33.9853846 49.5067857,33.9884615 49.5114286,33.99 L60.7432738,39.3884615 C61.4327381,39.7192308 61.9875595,39.3776923 61.9829167,38.6269231 C61.9759524,37.8730769 61.412619,36.9953846 60.7231548,36.6646154 Z" id="Shape" fill="#E9F2FF"></path>
</g>
<g id="Group" transform="translate(357.000000, 67.000000)" fill-rule="nonzero">
<path d="M92.3436639,59.2421481 C92.3429016,58.4231358 91.803959,57.4885432 91.1415246,57.1563457 L84.4821148,53.816 C84.8937541,53.1493086 85.1308279,52.2568148 85.1323525,51.1752593 C85.1323525,47.8999753 82.9796311,44.1639012 80.3245574,42.831284 C79.4334344,42.385037 78.6010082,42.2717531 77.8859754,42.4324938 C77.9012213,42.1676543 77.921041,41.9043457 77.921041,41.6257284 C77.921041,35.0720988 73.617123,27.6014815 68.3069754,24.9385432 C66.321959,23.942716 64.4794918,23.7605432 62.948041,24.2611358 C61.9723033,19.1396296 59.5100902,13.9699012 55.2008361,11.8343457 C53.7944016,11.137037 51.1179836,11.4409136 50.6133443,11.9460988 C50.3892295,8.9685679 46.9253607,5.3128642 44.2657131,3.98024691 C41.9620574,2.82520988 39.8550738,2.77622222 38.2016557,3.61360494 C38.1993689,3.61207407 38.1925082,3.60595062 38.1925082,3.60595062 L37.9615328,3.72995062 C37.9592459,3.72995062 37.9584836,3.73148148 37.9561967,3.73301235 L35.3948852,5.09548148 C35.3948852,5.09548148 35.6563525,5.34424691 36.0062459,5.66037037 C35.3826885,6.64471605 34.9451311,7.87553086 34.7598934,9.33597531 C32.9967049,5.89 30.3705984,2.94385185 27.4327131,1.47039506 C24.9453443,0.221975309 22.684377,0.263308642 20.9768361,1.31960494 C20.9692131,1.31271605 20.9577787,1.30353086 20.9577787,1.30353086 L18.1601557,2.7922963 C18.1601557,2.7922963 18.5077623,3.12525926 18.9392213,3.50950617 C18.2219016,4.81074074 17.8117869,6.49775309 17.8117869,8.50930864 C17.8117869,10.0432346 18.054959,11.6261481 18.4848934,13.1845679 C17.6501803,11.909358 16.5791557,10.8561235 15.4097951,10.269037 C14.1497213,9.63679012 13.0085656,9.66587654 12.149459,10.2131605 L12.1456475,10.2093333 L9.34878689,11.6980988 C9.34878689,11.6980988 10.0287541,12.3494815 10.6660328,12.8822222 C10.6263934,13.1692593 10.5997131,13.4677778 10.5997131,13.7892593 C10.5989508,14.8700494 10.8383115,16.0028889 11.2469016,17.0798519 L4.5874918,13.7379753 C4.31992623,13.6047901 4.0759918,13.5933086 3.87627049,13.6744444 C3.87322131,13.6721481 3.86407377,13.6644938 3.86407377,13.6644938 L1.06645082,15.1532593 C1.06645082,15.1532593 3.52866393,17.5130864 3.4722541,16.9229383 C3.44252459,16.6182963 4.05998361,16.667284 4.73766393,16.7813333 L15.4067459,22.134 L68.287918,48.6585185 C68.2924918,48.6608148 68.2963033,48.6638765 68.3001148,48.664642 C68.3039262,48.6669383 68.3085,48.6677037 68.3130738,48.6707654 L80.3230328,54.694716 L88.3439016,58.7178272 C88.2730082,59.1778519 88.2996885,59.7503951 88.3309426,60.0749383 C88.3873525,60.6650864 89.2266393,61.5912593 89.2266393,61.5912593 L92.0242623,60.1024938 C92.0242623,60.1024938 92.0181639,60.0925432 92.015877,60.088716 C92.2163607,59.9249136 92.3429016,59.6340494 92.3436639,59.2421481 Z" id="Shape" fill="#DEEBFF"></path>
<path d="M88.4544344,58.5892346 L81.7957869,55.2481235 C82.2066639,54.5814321 82.4452623,53.6897037 82.4460246,52.6073827 C82.4460246,49.3320988 80.2940656,45.5967901 77.6374672,44.2634074 C76.7471066,43.8163951 75.9146803,43.7038765 75.1988852,43.8646173 C75.2148934,43.5990123 75.2339508,43.3372346 75.2339508,43.0586173 C75.2339508,36.5049877 70.9307951,29.0343704 65.619123,26.3699012 C63.6341066,25.3748395 61.7931639,25.1934321 60.2624754,25.6932593 C59.2859754,20.5709877 56.8237623,15.4012593 52.5152705,13.2672346 C51.1073115,12.5699259 48.4308934,12.873037 47.9270164,13.3789877 C47.7036639,10.4014568 44.2375082,6.74651852 41.578623,5.4131358 C36.7487213,2.98901235 32.7588689,5.38787654 32.0735656,10.7696296 C30.310377,7.32365432 27.6842705,4.37674074 24.7463852,2.90251852 C19.4347131,0.238814815 15.1269836,3.38933333 15.1262213,9.94219753 C15.1262213,11.475358 15.3686311,13.0575062 15.7985656,14.6166914 C14.9630902,13.3422469 13.8928279,12.2882469 12.7234672,11.7011605 C10.0676311,10.3685432 7.91414754,11.9453333 7.91262295,15.2206173 C7.91262295,16.3014074 8.15122131,17.432716 8.55904918,18.5112099 L1.89963934,15.1693333 C1.23568033,14.8379012 0.698262295,15.2313333 0.6975,16.0495802 C0.6975,16.8678272 1.23568033,17.8024198 1.89963934,18.1361481 L12.7196557,23.565358 L65.6015902,50.0898765 C65.6054016,50.0914074 65.6092131,50.0952346 65.6145492,50.0967654 C65.6183607,50.0975309 65.6221721,50.0998272 65.6267459,50.1028889 L77.6359426,56.1268395 L88.455959,61.5529877 C89.119918,61.886716 89.6573361,61.4925185 89.6588607,60.6735062 C89.6573361,59.8560247 89.1183934,58.9221975 88.4544344,58.5892346 Z" id="Shape" fill="#E9F2FF"></path>
</g>
<g id="Group" transform="translate(29.000000, 254.000000)" fill-rule="nonzero">
<polygon id="Shape" fill="#FFFFFF" points="137.81343 85.2340704 0.739340782 152.860839 0.739340782 68.1872563 137.81343 0.560487437"></polygon>
<g transform="translate(75.553073, 29.984925)" id="Shape">
<path d="M34.3234525,38.6359598 C32.1509162,41.7966784 29.4125028,44.2992663 26.5091061,45.7608392 L26.3834413,45.8231156 C21.3992514,48.2757286 17.0834749,47.0063668 15.2092961,43.101407 L2.59655866,55.1645729 C3.89252514,57.9500955 5.7913743,60.1574472 8.22757542,61.6497739 C13.0938101,64.6282764 19.5420335,64.4153065 26.3842123,61.047 L26.6440223,60.9178342 C32.6774749,57.8816683 38.4434078,52.6189296 43.0089721,46.102206 L34.3234525,38.6359598 Z" fill="#A2DB52"></path>
<path d="M43.0082011,46.102206 L34.3234525,38.6359598 C37.1181453,34.6356633 38.6014525,30.1609899 38.5644469,26.1084121 C38.5158771,20.6580754 35.5546592,17.2328744 31.0168492,17.3835678 C29.5119553,17.432005 27.9176313,17.8748593 26.2747374,18.7036734 L26.1336536,3.55052261 C29.6129497,1.79832663 33.0058994,0.854954774 36.2099665,0.749623116 C45.8237095,0.431321608 52.1038659,7.6899799 52.2056313,19.243402 C52.2811844,27.8367739 48.9306369,37.6264673 43.0082011,46.102206 Z" fill="#8DB3FF"></path>
<path d="M26.1367374,3.54898492 C23.7891955,4.73069849 21.4616983,6.25531658 19.2174637,8.08209045 C15.0065363,11.5111357 11.1656648,15.768995 8.08263687,20.867201 L8.11501676,20.887191 C3.18402235,28.8308894 0.504972067,37.4596281 0.574357542,45.2211106 C0.60750838,48.9999799 1.29056983,52.3421457 2.60581006,55.159191 C2.63818994,55.2299246 2.67134078,55.2998894 2.70449162,55.3698543 L15.2162346,43.1406181 C14.5686369,41.7989849 14.2325028,40.189794 14.2163128,38.3568693 C14.183162,34.651809 15.318,30.7868291 17.6986927,27.0010402 C17.740324,26.913392 17.8405475,26.7726935 17.9114749,26.6612111 C19.3092067,24.4523216 21.0415307,22.4410251 23.0012849,20.8456734 C24.0590279,19.9868744 25.1591732,19.2656985 26.2716536,18.7052111 L26.1367374,3.54898492 Z" fill="#DCE9FF"></path>
</g>
<g transform="translate(13.106145, 63.814070)" id="Shape">
<path d="M34.2155196,38.0539447 C32.0414413,41.2138945 29.3037989,43.7187889 26.3996313,45.179593 L26.2739665,45.2418693 C21.2913184,47.6944824 16.974,46.4251206 15.1005922,42.519392 L2.48785475,54.5817889 C3.78459218,57.3680804 5.68267039,59.5754322 8.11887151,61.0677588 C12.9851061,64.0470302 19.4333296,63.8325226 26.2747374,60.4642161 L26.5345475,60.3358191 C32.5687709,57.3004221 38.3362458,52.0369146 42.8994972,45.5217286 L34.2155196,38.0539447 Z" fill="#4080FE" opacity="0.1"></path>
<path d="M42.8987263,45.5217286 L34.2155196,38.0539447 C37.0094413,34.0536482 38.4927486,29.5789749 38.456514,25.5271658 C38.4079441,20.0760603 35.4459553,16.6516281 30.9089162,16.8015528 C29.4032514,16.8507588 27.8089274,17.2936131 26.1660335,18.1224271 L26.0249497,2.96773869 C29.5042458,1.2170804 32.8964246,0.272170854 36.1004916,0.166839196 C45.7150056,-0.149924623 51.995162,7.10796482 52.0969274,18.6613869 C52.1724804,27.2555276 48.821162,37.0459899 42.8987263,45.5217286 Z" fill="#A2DB52"></path>
<path d="M8.19365363,20.0153216 C11.2774525,14.9171156 14.8970615,10.9306583 19.1095307,7.50084422 C21.3529944,5.67407035 23.6797207,4.14945226 26.0288045,2.96773869 L26.1629497,18.1247337 C25.0489274,18.6852211 23.9487821,19.4056281 22.892581,20.265196 C20.9328268,21.8605477 19.1997318,23.8710754 17.8012291,26.0799648 C17.7310726,26.1922161 17.6308492,26.3321457 17.5892179,26.419794 L8.19365363,20.0153216 Z" fill="#F26D5B"></path>
<g opacity="0.8" transform="translate(0.000000, 19.989950)" fill="#4080FE">
<path d="M2.59578771,34.7986583 C2.56263687,34.7286935 2.52948603,34.6579598 2.4963352,34.5887638 C1.18109497,31.7709497 0.49803352,28.4287839 0.465653631,24.6514523 C0.393955307,16.7915578 3.13622346,8.04518593 8.18594413,0.020758794 L17.5884469,6.43061307 C15.2069832,10.2171709 14.0721453,14.0806131 14.1052961,17.7872111 C14.121486,19.6209045 14.4576201,21.2293266 15.1052179,22.5709598 L2.59578771,34.7986583 Z"></path>
</g>
</g>
</g>
<g id="Group" transform="translate(260.000000, 379.000000)" fill-rule="nonzero">
<polygon id="Shape" fill="url(#linearGradient-2)" points="52.6791942 58.3395065 78.8251262 45.1717792 52.6791942 32.0048182 52.6791942 32.0048182 52.6784272 32.0048182 52.6784272 32.0048182 52.6784272 32.0048182 26.5324951 45.1717792 52.6791942 58.3395065 52.6791942 58.3395065 52.6791942 58.3395065"></polygon>
<polygon id="Shape" fill="#8CB3FE" points="26.5861845 26.6641688 0.439485437 13.4964416 0.439485437 31.9389221 26.5861845 45.1058831 52.7328835 31.9389221 52.7328835 31.9389221 52.7328835 13.4964416"></polygon>
<polygon id="Shape" fill="#A9CAFF" points="26.5861845 26.6641688 0.439485437 13.4964416 0.439485437 31.9389221 26.5861845 45.1058831"></polygon>
<polygon id="Shape" fill="#D7E7FF" points="26.5861845 26.6641688 52.7328835 13.4964416 26.5861845 0.329480519 26.5861845 0.329480519 26.5854175 0.329480519 26.5854175 0.329480519 26.5854175 0.329480519 0.439485437 13.4964416 26.5861845 26.6641688 26.5861845 26.6641688 26.5861845 26.6641688"></polygon>
</g>
<g id="Group" transform="translate(103.000000, 348.000000)">
<polygon id="Shape" fill="url(#linearGradient-3)" fill-rule="nonzero" points="52.6078641 95.5474286 78.7560971 82.4548571 52.6078641 69.3615238 52.6078641 69.3615238 52.6070971 69.3615238 52.6070971 69.3615238 52.6070971 69.3615238 26.461932 82.4548571 52.6078641 95.5474286 52.6078641 95.5474286 52.6078641 95.5474286"></polygon>
<polygon id="Shape" fill="#8CB3FE" fill-rule="nonzero" points="26.5156214 26.248381 0.36815534 13.1558095 0.36892233 69.296 26.5156214 82.3893333 52.6630874 69.296 52.6630874 69.296 52.6630874 13.1558095"></polygon>
<polygon id="Shape" fill="#A9CAFF" fill-rule="nonzero" points="26.5156214 26.248381 0.36815534 13.1558095 0.36892233 69.296 26.5156214 82.3893333"></polygon>
<polygon id="Shape" fill="#D7E7FF" fill-rule="nonzero" points="26.5156214 26.248381 52.6630874 13.1558095 26.5156214 0.0624761905 26.5156214 0.0624761905 26.5148544 0.0624761905 26.5148544 0.0624761905 26.5148544 0.0624761905 0.36892233 13.1558095 26.5156214 26.248381 26.5156214 26.248381 26.5156214 26.248381"></polygon>
<g id="Clipped">
<mask id="mask-5" fill="white">
<use xlink:href="#path-4"></use>
</mask>
<g id="SVGID_19_"></g>
<g id="Group" mask="url(#mask-5)" fill-rule="nonzero">
<g transform="translate(18.407767, 9.142857)" id="Shape">
<path d="M0.167970874,6.88457143 C0.167970874,6.88457143 30.6266893,25.384381 32.5288252,26.7352381 C34.4309612,28.0845714 39.8229029,22.9539048 39.8229029,22.9539048 L6.16430097,5.13447619" fill="url(#linearGradient-6)"></path>
<path d="M11.0109126,2.07466667 C11.0109126,2.07466667 42.4498447,20.615619 44.3519806,21.9641905 C46.2541165,23.3135238 52.0694369,17.8758095 52.0694369,17.8758095 L17.0080097,0.326095238" fill="url(#linearGradient-7)"></path>
</g>
</g>
</g>
</g>
<g id="Group" transform="translate(175.000000, 72.000000)">
<polygon id="Shape" fill="#FFFFFF" fill-rule="nonzero" points="63.3905169 133.558674 0.625752809 164.380674 0.625752809 67.8357209 63.3905169 37.0137209"></polygon>
<polygon id="Shape" fill="#FFFFFF" fill-rule="nonzero" points="135.974787 97.105186 73.2100225 127.927186 73.2100225 31.3822326 135.974787 0.560232558"></polygon>
<g transform="translate(8.404494, 51.418605)" id="Shape">
<polygon fill="#D7E7FF" fill-rule="nonzero" points="24.5770337 66.7290698 0.524898876 78.5146744 0.524898876 74.5516047 24.5770337 62.7667674"></polygon>
<polygon fill="#A9CAFF" fill-rule="nonzero" points="48.1325393 63.3300698 0.524898876 86.8536977 0.524898876 82.8913953 48.1325393 59.367"></polygon>
<polygon fill="#559AFF" fill-rule="nonzero" points="36.6260225 77.464814 0.524898876 95.1942558 0.524898876 91.231186 36.6260225 73.5032791"></polygon>
<g stroke="#A6C8FF" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4175">
<path d="M1.27977528,22.6502791 L46.6441798,0.235604651"></path>
<path d="M1.27977528,37.7159302 L29.3714157,23.7331395"></path>
<path d="M1.27977528,30.333907 L47.0177978,7.557"></path>
<path d="M1.27977528,44.8569767 L31.0469663,30.2694419"></path>
<path d="M1.27977528,52.1622558 L31.0469663,37.5739535"></path>
<path d="M23.0229663,52.9243256 C23.0229663,54.2473953 22.0014382,55.8237209 20.7422921,56.4430465 L2.75361798,65.4443721 C1.496,66.0636977 0.47447191,65.4934884 0.47447191,64.1704186 C0.47447191,62.845814 1.496,61.2702558 2.75361798,60.6516977 L20.7422921,51.6503721 C22.0014382,51.0302791 23.0229663,51.6012558 23.0229663,52.9243256 Z"></path>
</g>
</g>
<g transform="translate(80.224719, 34.534884)" fill-rule="nonzero" id="Shape">
<polygon fill="#559AFF" points="36.6229663 58.5274186 26.2907865 63.7475581 26.2907865 5.66986047 36.6229663 0.44972093"></polygon>
<polygon fill="#D7E7FF" points="49.5192809 52.0494419 39.1886292 57.2695814 39.1886292 16.684186 49.5192809 11.464814"></polygon>
<path d="M23.6685843,65.0023256 L23.6685843,40.2561628 C21.6591461,40.6199302 20.0447191,40.9829302 18.7488989,41.3336512 C12.8902022,42.9214884 13.5434607,43.2929302 13.5434607,44.2660465 C13.5434607,45.1255814 13.532764,70.1280698 13.532764,70.1280698 L23.6685843,65.0023256 Z" fill="url(#linearGradient-8)"></path>
<path d="M27.8410337,49.335 C26.8714607,49.189186 26.0852584,48.0165349 26.0852584,46.7149535 L26.0844944,46.5537907 L26.0906067,46.5514884 L26.0906067,46.9812558 L26.0906067,41.019 L26.0906067,40.4096512 C26.0906067,39.1088372 25.5764045,37.7719535 24.6068315,37.6261395 C24.275236,37.5770233 23.6953258,37.818 23.4317303,37.9906744 L13.5900674,43.1340698 L13.5900674,43.1356047 C13.804764,43.0427442 14.314382,42.8439767 14.5642247,42.8800465 C15.5330337,43.025093 16.0457079,44.3627442 16.0457079,45.6635581 L16.0457079,51.4707907 C16.0441798,51.4846047 16.0418876,51.4976512 16.0418876,51.5099302 L16.0441798,51.9796047 C16.0441798,53.2804186 16.829618,54.4530698 17.7999551,54.5981163 C18.1628764,54.6533721 18.479191,54.5136977 18.8253034,54.3264419 L28.4362247,49.2835814 C28.2520899,49.3465116 28.050382,49.3656977 27.8410337,49.335 Z" fill="url(#linearGradient-9)"></path>
<polygon fill="#A9CAFF" points="10.7317753 71.4933488 0.400359551 76.7127209 0.400359551 57.6203023 10.7317753 52.4009302"></polygon>
</g>
</g>
<g id="Group" transform="translate(175.000000, 182.000000)" fill-rule="nonzero">
<polygon id="Shape" fill="#FFFFFF" points="137.54514 84.8081307 0.471050279 152.436437 0.471050279 67.7620854 137.54514 0.134547739"></polygon>
<g transform="translate(10.022346, 11.532663)" fill="#4080FE" id="Shape">
<polygon opacity="0.1" points="0.427106145 89.2981809 59.3222682 75.7157789 72.6681788 41.1108693 120.835575 12.8635327 120.835575 65.321005 0.427106145 126.702452"></polygon>
<polygon opacity="0.2" points="0.427106145 112.684884 30.1333408 72.9502462 69.0524246 70.4976332 120.835575 0.658130653 120.835575 65.321005 0.427106145 126.702452"></polygon>
<polygon opacity="0.2" points="0.427106145 112.684884 30.329162 103.196578 69.2328268 61.1846231 120.835575 46.1052814 120.835575 65.321005 0.427106145 126.702452"></polygon>
</g>
</g>
<g id="Group" transform="translate(313.000000, 274.000000)" fill-rule="nonzero">
<path d="M27.7793478,109.450483 C27.7793478,109.450483 59.056413,129.293182 60.9441304,130.652386 C62.8318478,132.011591 69.5731522,126.57554 69.5731522,126.57554 L34.7907609,108.907415" id="Shape" fill="url(#linearGradient-10)"></path>
<path d="M10.7906522,111.42179 C10.7906522,111.42179 45.08,132.872983 46.9684783,134.232188 C48.8554348,135.590625 55.5959783,130.155341 55.5959783,130.155341 L19.9576087,112.100625" id="Shape" fill="url(#linearGradient-11)"></path>
<g transform="translate(8.369565, 96.647727)" id="Shape">
<path d="M5.01413043,1.76880682 C5.35271739,3.33894886 6.82347826,7.71877841 7.43978261,9.52823864 L7.56152174,10.6772727 C7.56152174,10.6772727 7.3423913,12.3072443 5.61293478,11.4880398 C3.88423913,10.6711364 2.93847826,10.7969318 1.47684783,11.1766193 C0.225978261,11.5018466 0.579021739,14.2049148 3.8226087,14.8216193 C7.06543478,15.4390909 9.75282609,17.161108 11.6055435,16.4661648 C12.6867391,16.0603977 11.4898913,12.385483 11.3978261,11.7810511 C11.193913,10.4256818 11.0896739,8.67528409 11.0348913,7.21176136 C11.0531522,6.35957386 11.0318478,5.44372159 10.978587,4.53017045 C10.9770652,4.39670455 10.9770652,4.32306818 10.9770652,4.32306818 L10.9648913,4.32460227 C10.8667391,2.81198864 10.681087,1.31701705 10.4406522,0.125028409" fill="#FFA694"></path>
<path d="M0.992173913,10.4103409 C1.51945652,10.4640341 2.80076087,10.7355682 3.83021739,10.8744034 C3.01913043,10.9488068 1.15043478,12.1684091 2.52836957,13.3174432 C3.44293478,14.0783523 11.5256522,16.1585795 11.8543478,13.7147727 C11.9951087,14.6720455 12.1784783,15.9852273 11.7691304,16.3127557 C9.57630435,18.0662216 6.41717391,15.6162784 3.17358696,14.9972727 C-0.0692391304,14.3813352 -0.547826087,10.2553977 0.992173913,10.4103409 Z" fill="#4080FE"></path>
</g>
<path d="M31.6377174,19.9339773 C32.7326087,20.2453977 39.865,29.9853409 41.5807609,34.070625 C42.2313043,35.6208239 41.5305435,37.056733 37.7992391,39.7759091 L36.1367391,36.7851989 C36.1367391,36.7851989 37.3503261,35.8340625 36.9006522,34.5653693 C36.4509783,33.2982102 33.0354348,29.1139773 29.9797826,28.3139489 C26.9248913,27.5139205 29.126087,25.5057955 29.126087,25.5057955 C29.126087,25.5057955 31.1492391,19.7966761 31.6377174,19.9339773 Z" id="Shape" fill="#FFA694"></path>
<path d="M27.5092391,62.2902273 C27.5092391,62.2902273 18.9258696,80.6832102 18.2973913,81.9519034 C18.0721739,82.4059943 19.1952174,90.3794318 19.4036957,105.813153 L15.6008696,106.505028 C15.6008696,106.505028 10.0381522,94.1134091 11.1223913,79.9084943 C12.2066304,65.7058807 16.473587,52.8609375 16.473587,52.8609375 L30.6303261,52.5947727" id="Shape" fill="#4080FE"></path>
<g transform="translate(24.347826, 98.181818)" id="Shape">
<path d="M6.98173913,4.69892045 C7.00380435,4.79326705 7.07152174,7.83536932 7.105,7.89826705 C7.1651087,8.17977273 7.0776087,8.60701705 5.92336957,8.46127841 C3.93597826,8.20815341 3.39195652,7.68349432 2.11141304,8.06164773 C1.01347826,8.38840909 1.29423913,10.5875284 4.1398913,11.204233 C6.98326087,11.8209375 9.34043478,13.5414205 10.9679348,12.8464773 C11.9167391,12.4407102 10.8941304,9.27051136 10.8142391,8.6653125 C10.4391304,5.8134375 10.5129348,0.441818182 10.5129348,0.441818182 L10.4809783,0.460994318" fill="#FFA694"></path>
<path d="M1.18391304,7.50017045 C1.89304348,7.35826705 3.33717391,7.98647727 4.24032609,8.12454545 C3.52891304,8.19894886 1.87021739,8.81872159 3.07847826,9.96698864 C3.88043478,10.7278977 10.9702174,12.8058239 11.2601087,10.362017 C11.381087,11.3192898 11.5431522,12.6324716 11.1832609,12.96 C9.25978261,14.7134659 6.48869565,12.2642898 3.64380435,11.6475852 C0.63,10.9963636 -1.27217391,7.99107955 1.18391304,7.50017045 Z" fill="#4080FE"></path>
</g>
<path d="M35.1042391,103.877898 C35.1042391,103.877898 35.2518478,97.4669318 34.9254348,90.9225 C34.6819565,86.0701705 33.9363043,80.9018182 33.9363043,79.5057955 C33.9363043,77.5130114 35.868913,61.5891477 35.868913,54.9511364 C35.868913,50.6656534 33.7780435,47.603608 33.1723913,47.2039773 L23.356413,54.691108 C23.356413,54.691108 25.6572826,68.7441477 27.8242391,82.9475284 C29.9919565,97.1516761 30.9696739,103.788153 30.9696739,103.788153 C30.9696739,103.788153 33.1267391,105.599148 35.1042391,103.877898 Z" id="Shape" fill="#4080FE"></path>
<path d="M15.5118478,25.4590057 C15.4661957,23.6012216 20.4331522,21.0277841 22.9265217,19.1623295 C25.3803261,17.3244886 31.4779348,18.1183807 32.4982609,21.2011364 C33.5163043,24.282358 32.7676087,33.614233 31.2846739,39.3218182 C30.2575,43.2736364 34.2497826,48.5639489 34.2497826,48.5639489 C34.2497826,48.5639489 27.5990217,58.8017045 16.0048913,53.2298864 C16.0048913,53.2298864 16.905,46.5565909 16.905,42.4475284 C16.905,38.3376989 15.5118478,25.4590057 15.5118478,25.4590057 Z" id="Shape" fill="#A7D873"></path>
<path d="M19.3763043,31.5754261 C19.3763043,31.5754261 20.8143478,41.0875568 20.5442391,44.1695455 C20.2748913,47.25 18.836087,54.135767 18.836087,54.135767 L13.8942391,52.3240057 C13.8942391,52.3240057 16.5892391,44.2600568 16.9498913,41.360625" id="Shape" fill="#7AAA43"></path>
<g transform="translate(14.456522, 3.068182)" id="Shape">
<path d="M0.848369565,9.36409091 C1.27217391,11.7089489 2.50326087,13.3120739 4.095,13.1924148 L6.54347826,13.0083239 C8.13369565,12.8894318 9.42869565,11.4044318 9.43402174,9.69392045 L9.45836957,3.34201705 C9.46445652,1.62997159 8.18086957,0.339801136 6.59065217,0.457926136 L4.14293478,0.642017045 C2.55195652,0.761676136 0.430652174,1.86622159 0.424565217,3.5775 C0.425326087,3.5775 0.426086957,7.02076705 0.848369565,9.36409091 Z" fill="#FFA694"></path>
<path d="M6.71695652,17.2263068 C6.71695652,17.2263068 6.1775,15.8678693 5.42576087,13.7907102 C4.8726087,12.2627557 2.95597826,11.897642 2.95597826,11.897642 L9.17684783,8.09923295 L11.4176087,16.4653977 L6.71695652,17.2263068 Z" fill="#FFA694"></path>
<path d="M0.540978261,6.91951705 C0.540978261,6.91951705 0.106521739,8.00642045 0.012173913,8.54948864 C-0.0814130435,9.09332386 0.442826087,9.36409091 0.884891304,9.39553977" fill="#F99282"></path>
</g>
<path d="M16.4553261,8.47048295 C17.5281522,12.7996875 19.2811957,18.4328693 17.7678261,20.436392 C15.9280435,22.8717614 25.1672826,21.5731534 27.8029348,20.0544034 C30.7840217,18.3377557 32.7303261,15.5802273 32.4069565,15.3447443 C26.8358696,11.2678977 29.8854348,4.59460227 25.1459783,1.85625 C18.1528261,-2.18454545 13.1782609,5.74977273 14.2533696,7.914375 L16.4553261,8.47048295 Z" id="Shape" fill="#FCBF7C"></path>
<g transform="translate(0.000000, 46.022727)" id="Shape">
<path d="M19.3230435,20.7332386 C19.2446739,21.3092898 18.7858696,21.617642 18.2966304,21.4212784 L1.3376087,14.6521023 C0.848369565,14.4557386 0.516630435,13.8328977 0.59576087,13.2583807 L2.26967391,1.01786932 C2.34880435,0.443352273 2.80836957,0.135 3.2976087,0.330596591 L20.2558696,7.09900568 C20.7451087,7.29460227 21.076087,7.91897727 20.9992391,8.49272727 L19.3230435,20.7332386 Z" fill="#BCD0ED"></path>
<path d="M18.9045652,20.993267 C18.8254348,21.5677841 18.3658696,21.8761364 17.8758696,21.6805398 L0.917608696,14.9113636 C0.429130435,14.715767 0.0973913043,14.0929261 0.175,13.517642 L1.84891304,1.27636364 C1.92804348,0.703380682 2.38913043,0.394261364 2.8776087,0.589857955 L19.8351087,7.35826705 C20.3251087,7.55463068 20.6568478,8.17823864 20.5784783,8.75275568 L18.9045652,20.993267 Z" fill="#D7E4F9"></path>
</g>
<path d="M10.9268478,64.8728693 C10.9268478,64.8728693 12.5444565,61.2478125 13.3532609,59.7528409 C14.1620652,58.2578693 16.8136957,52.1882386 16.8136957,52.1882386 L13.7572826,50.8735227 C13.7572826,50.8735227 8.49967391,60.3879545 8.365,61.8821591 C8.23032609,63.3778977 8.45478261,64.0122443 8.45478261,64.0122443 L10.9268478,64.8728693 Z" id="Shape" fill="#A8C4E5"></path>
<path d="M11.3019565,58.1458807 C11.3019565,58.1458807 19.4554348,46.845 19.4554348,43.7630114 C19.4554348,40.6802557 20.3334783,26.5182955 18.2973913,24.4641477 C16.2575,22.409233 14.221413,25.4927557 14.221413,28.5732102 C14.221413,31.6559659 15.3786957,40.6802557 13.341087,44.7908523 C11.3027174,48.8999148 10.283913,54.0383523 9.26586957,56.091733 C8.55978261,57.5123011 5.97434783,60.8489489 5.71565217,63.1063636 C5.60076087,64.1134943 5.985,63.8304545 7.15369565,64.2837784 C7.71902174,64.5039205 9.30923913,64.9587784 9.5801087,64.3742898 C10.208587,63.0158523 11.3019565,58.1458807 11.3019565,58.1458807 Z" id="Shape" fill="#FFA694"></path>
<g transform="translate(28.152174, 26.079545)" id="Shape">
<path d="M5.11,14.057642 C4.42521739,14.6513352 3.17282609,15.5901989 2.8273913,15.4107102 C2.29630435,15.1353409 1.15119565,15.3754261 0.680978261,15.4996875 C0.563043478,15.5296023 0.596521739,16.2912784 1.32695652,16.2782386 C2.09923913,16.2628977 2.3548913,16.6011648 2.48119565,16.6280114 C2.6075,16.6533239 4.07521739,18.815625 4.07521739,18.815625 C4.07521739,18.815625 10.7982609,12.9738068 11.1771739,12.5174148 C11.5568478,12.0625568 9.065,9.34644886 9.065,9.34644886 L5.11,14.057642 Z" fill="#FFA694"></path>
<path d="M4.92967391,0.375852273 L4.71054348,3.89352273 L8.43576087,7.71494318 C8.43576087,7.71494318 7.39413043,5.26960227 6.72836957,3.54605114 C6.05956522,1.82480114 4.92967391,0.375852273 4.92967391,0.375852273 Z" fill="#FF7B7B"></path>
</g>
<path d="M8.9501087,57.7608239 C8.50043478,58.1228693 6.61423913,59.4820739 6.07554348,60.1156534 C5.53532609,60.75 3.37826087,62.2902273 3.82717391,62.3807386 C4.27684783,62.47125 4.99586957,62.1092045 5.7148913,61.7471591 C6.43315217,61.3843466 7.33173913,61.3843466 7.6923913,61.0230682" id="Shape" fill="#FFA694"></path>
</g>
<g id="Group" transform="translate(193.000000, 361.000000)" fill-rule="nonzero">
<g transform="translate(0.000000, 9.230769)" id="Shape">
<polygon fill="url(#linearGradient-12)" points="53.0376923 80.1992308 79.2607692 66.98 53.0376923 53.7607692 53.0376923 53.7607692 53.0361538 53.7607692 53.0361538 53.7607692 53.0361538 53.7607692 26.8138462 66.98 53.0376923 80.1992308 53.0376923 80.1992308 53.0376923 80.1992308"></polygon>
<polygon fill="#8CB3FE" points="26.8692308 26.5907692 0.645384615 13.3715385 0.645384615 53.6953846 26.8692308 66.9146154 53.0923077 53.6953846 53.0923077 53.6953846 53.0923077 13.3715385"></polygon>
<polygon fill="#A9CAFF" points="26.8692308 26.5907692 0.645384615 13.3715385 0.645384615 53.6953846 26.8692308 66.9146154"></polygon>
<polygon fill="#D7E7FF" points="26.8692308 26.5907692 53.0923077 13.3715385 26.8692308 0.152307692 26.8692308 0.152307692 26.8676923 0.152307692 26.8676923 0.152307692 26.8676923 0.152307692 0.645384615 13.3715385 26.8692308 26.5907692 26.8692308 26.5907692 26.8692308 26.5907692"></polygon>
</g>
<g transform="translate(13.846154, 0.000000)" id="Shape">
<g>
<path d="M18.7307692,0.625384615 L18.5161538,0.529230769 C18.4346154,0.484615385 18.33,0.485384615 18.2146154,0.544615385 L1.16615385,9.01538462 C0.907692308,9.14461538 0.699230769,9.50692308 0.699230769,9.82461538 L0.699230769,24.6830769 C0.699230769,24.8676923 0.77,24.9976923 0.88,25.0484615 L0.879230769,25.0484615 L1.16076923,25.1746154 C1.16076923,25.1746154 1.16846154,25.1046154 1.17076923,25.0261538 L18.2146154,16.5569231 C18.4730769,16.4284615 18.6815385,16.0653846 18.6815385,15.7476923 L18.6815385,0.889230769 C18.6815385,0.809230769 18.6684615,0.741538462 18.6438462,0.682307692 C18.6930769,0.650769231 18.7307692,0.625384615 18.7307692,0.625384615 Z" fill="#D7E7FF"></path>
<path d="M18.93,15.8584615 C18.93,16.1776923 18.7215385,16.54 18.4638462,16.6684615 L1.41461538,25.14 C1.15615385,25.2692308 0.947692308,25.1146154 0.947692308,24.7946154 L0.947692308,9.93692308 C0.947692308,9.61846154 1.15615385,9.25615385 1.41461538,9.12846154 L18.4638462,0.655384615 C18.7223077,0.527692308 18.93,0.682307692 18.93,1.00076923 L18.93,15.8584615 Z" fill="#454B63"></path>
<polygon fill="#559AFF" points="18.2553846 15.3015385 1.89615385 23.4323077 1.89615385 10.0276923 18.2553846 1.89846154"></polygon>
</g>
<path d="M32.3584615,22.6215385 L19.6815385,17.1715385 C19.4069231,17.0315385 18.9861538,17.0176923 18.7415385,17.1376923 L1.21,24.9423077 L1.21,25.9938462 C1.19692308,26.0915385 1.27230769,26.1938462 1.43076923,26.2746154 L13.8838462,32.5930769 C14.1584615,32.7323077 14.5792308,32.7469231 14.8238462,32.6269231 L32.1884615,23.9576923 C32.3030769,23.9 32.3584615,23.8238462 32.3561538,23.7446154 L32.3584615,23.7446154 L32.3584615,22.6215385 Z" fill="#8CB3FE"></path>
<path d="M18.7415385,16.0353846 L1.37692308,24.7038462 C1.13230769,24.8238462 1.15615385,25.0346154 1.43076923,25.1730769 L13.8838462,31.49 C14.1584615,31.63 14.5792308,31.6446154 14.8238462,31.5246154 L32.1884615,22.8553846 C32.4315385,22.7361538 32.4084615,22.5246154 32.1346154,22.3869231 L19.6815385,16.0684615 C19.4069231,15.9292308 18.9861538,15.9138462 18.7415385,16.0353846 Z" fill="url(#linearGradient-13)"></path>
<path d="M18.9961538,17.0484615 L3.35461538,24.8584615 C3.18384615,24.9430769 3.2,25.0907692 3.39307692,25.1884615 L8.48538462,27.6076923 C8.67692308,27.7061538 8.97384615,27.7161538 9.14461538,27.6315385 L24.7838462,19.8207692 C24.9569231,19.7376923 24.9384615,19.5892308 24.7461538,19.4907692 L19.6546154,17.0707692 C19.4630769,16.9738462 19.1669231,16.9638462 18.9961538,17.0484615 Z" fill="#454B63"></path>
<g transform="translate(5.384615, 6.923077)" fill="#FFFFFF">
<polygon points="2.45076923 10.3 0.631538462 11.2146154 0.631538462 9.74307692 2.45076923 8.82692308"></polygon>
<polygon points="4.87538462 9.07846154 3.05692308 9.99307692 3.05692308 6.06615385 4.87538462 5.15076923"></polygon>
<polygon points="7.30153846 7.85692308 5.48230769 8.77230769 5.48230769 6.31769231 7.30153846 5.40153846"></polygon>
<polygon points="9.72692308 6.63538462 7.90769231 7.55076923 7.90769231 1.16923077 9.72692308 0.252307692"></polygon>
</g>
</g>
</g>
<g id="Group" transform="translate(350.000000, 121.000000)" fill="#A9CAFF" fill-rule="nonzero">
<g opacity="0.4" transform="translate(20.643016, 31.590393)" id="Shape">
<polygon points="70.9790975 80.0184653 52.8614109 49.5529985 34.6795015 40.2477016 16.4960631 9.67282421 0.338698366 1.40307574 0.720211875 0.594053486 17.100827 8.97706507 35.2835009 39.5519424 53.4654102 48.8572394 71.7138359 79.5415274"></polygon>
</g>
<g id="Shape">
<path d="M17.3447204,30.6303532 C17.3447204,31.9355757 18.2017878,33.4318817 19.2591689,33.9720003 C20.3165501,34.515201 21.1728529,33.8941801 21.1728529,32.5889575 C21.1728529,31.2845055 20.3165501,29.787429 19.2591689,29.2473104 C18.2017878,28.7048802 17.3447204,29.3251306 17.3447204,30.6303532 Z"></path>
<path d="M53.7100682,49.2401766 C53.7100682,50.5453992 54.5671356,52.0424756 55.6252813,52.5841352 C56.6818978,53.1242539 57.5382007,52.504774 57.5382007,51.1995514 C57.5382007,49.8950994 56.6818978,48.3980229 55.6252813,47.8571338 C54.5671356,47.3162446 53.7100682,47.9357245 53.7100682,49.2401766 Z"></path>
<path d="M35.5273943,39.9356501 C35.5273943,41.2408727 36.3844617,42.7371786 37.4418428,43.2788383 C38.4992239,43.8197275 39.3562914,43.2002476 39.3562914,41.895025 C39.3562914,40.5890319 38.4992239,39.092726 37.4418428,38.5510663 C36.3844617,38.0101772 35.5273943,38.6304275 35.5273943,39.9356501 Z"></path>
<g>
<path d="M53.7100682,70.5105275 C53.7100682,71.8157501 54.5671356,73.3128265 55.6252813,73.8537156 C56.6818978,74.3946048 57.5382007,73.7743544 57.5382007,72.4699023 C57.5382007,71.1646798 56.6818978,69.6683738 55.6252813,69.1274847 C54.5671356,68.585825 53.7100682,69.2053049 53.7100682,70.5105275 Z"></path>
<path d="M35.5273943,61.2052305 C35.5273943,62.5096826 36.3844617,64.006759 37.4418428,64.5476482 C38.4992239,65.0893079 39.3562914,64.4690575 39.3562914,63.1646054 C39.3562914,61.8593828 38.4992239,60.3615359 37.4418428,59.8221877 C36.3844617,59.280528 35.5273943,59.9007784 35.5273943,61.2052305 Z"></path>
<path d="M17.3447204,51.8991631 C17.3447204,53.2043856 18.2017878,54.7006916 19.2591689,55.2415807 C20.3165501,55.7840109 21.1728529,55.16299 21.1728529,53.8585379 C21.1728529,52.5540859 20.3165501,51.0570094 19.2591689,50.5153498 C18.2017878,49.9736901 17.3447204,50.594711 17.3447204,51.8991631 Z"></path>
<path d="M0.61240946,1.83147229 C0.61240946,3.13669487 1.46871233,4.63377129 2.52685801,5.17466046 C3.58423914,5.71554963 4.44054201,5.09684022 4.44054201,3.79161765 C4.44054201,2.48639507 3.58423914,0.989318646 2.52685801,0.44842948 C1.46871233,-0.0940006814 0.61240946,0.526249716 0.61240946,1.83147229 Z"></path>
</g>
<g transform="translate(16.820235, 56.246309)">
<path d="M36.8898333,35.5337985 C36.8898333,36.8390211 37.7469007,38.335327 38.8050464,38.8769867 C39.861663,39.4178759 40.7179658,38.798396 40.7179658,37.4924029 C40.7179658,36.1871803 39.861663,34.6908744 38.8050464,34.1499852 C37.7469007,33.6090961 36.8898333,34.228576 36.8898333,35.5337985 Z"></path>
<path d="M0.524485505,16.9232046 C0.524485505,18.2276567 1.38155293,19.7247331 2.43893406,20.2656223 C3.49631518,20.8065115 4.35261805,20.1862611 4.35261805,18.8825795 C4.35261805,17.5773569 3.49631518,16.0802805 2.43893406,15.5393913 C1.38155293,14.9985022 0.524485505,15.6179821 0.524485505,16.9232046 Z"></path>
<path d="M18.7071594,26.2277311 C18.7071594,27.5329537 19.5642268,29.0300301 20.6216079,29.5709193 C21.6789891,30.1110379 22.5360565,29.4923285 22.5360565,28.187106 C22.5360565,26.8826539 21.6789891,25.3855774 20.6216079,24.8446883 C19.5642268,24.3030286 18.7071594,24.923279 18.7071594,26.2277311 Z"></path>
<path d="M55.0732717,2.3007052 C55.0732717,3.60515728 55.9288101,5.1022337 56.9869557,5.64312287 C58.0435723,6.18478253 58.9006397,5.56376164 58.9006397,4.25930956 C58.9006397,2.95485748 58.0435723,1.45855156 56.9869557,0.916891892 C55.9288101,0.375232228 55.0732717,0.995482625 55.0732717,2.3007052 Z"></path>
<path d="M73.2559456,32.8748121 C73.2559456,34.1808051 74.1114839,35.6778816 75.1681005,36.2180002 C76.2262462,36.7588894 77.0833136,36.1394095 77.0833136,34.8349574 C77.0833136,33.5281938 76.2262462,32.0318879 75.1681005,31.4909988 C74.1122485,30.9501096 73.2559456,31.57036 73.2559456,32.8748121 Z"></path>
<path d="M55.0732717,23.5702856 C55.0732717,24.8747377 55.9288101,26.3725846 56.9869557,26.9127033 C58.0435723,27.4535924 58.9006397,26.8341125 58.9006397,25.5296605 C58.9006397,24.2244379 58.0435723,22.728132 56.9869557,22.1872428 C55.9288101,21.6448126 55.0732717,22.2642925 55.0732717,23.5702856 Z"></path>
<path d="M73.2559456,54.1443925 C73.2559456,55.449615 74.1114839,56.945921 75.1681005,57.4875806 C76.2262462,58.0292403 77.0833136,57.4089899 77.0833136,56.1037673 C77.0833136,54.7985447 76.2262462,53.3022388 75.1681005,52.7613496 C74.1122485,52.21969 73.2559456,52.8391699 73.2559456,54.1443925 Z"></path>
<path d="M55.0732717,44.8390955 C55.0732717,46.1450886 55.9288101,47.6413945 56.9869557,48.1822837 C58.0435723,48.7239433 58.9006397,48.1044634 58.9006397,46.7984704 C58.9006397,45.4924773 58.0435723,43.9969419 56.9869557,43.4552822 C55.9288101,42.914393 55.0732717,43.5331024 55.0732717,44.8390955 Z"></path>
</g>
</g>
<g opacity="0.4" transform="translate(3.058225, 3.852487)" id="Shape">
<polygon points="14.513569 25.3878889 0.183493471 0.731202021 0.923583806 0.263510107 15.2528948 24.920197"></polygon>
</g>
</g>
<g id="Group" transform="translate(215.000000, 330.000000)" fill-rule="nonzero">
<path d="M15.1616863,48.8640656 C15.1616863,48.8640656 12.4249533,53.7475631 11.1940412,54.5605862 C9.96158467,55.3743748 3.12129653,55.6469136 2.43711327,55.7824175 C1.75370223,55.9186869 0.384563501,56.0074917 0.612367182,56.3703664 C0.72665513,56.5502726 4.711289,56.6628097 4.81013263,56.9131473 C4.81013263,56.9131473 1.27415618,57.4773639 1.34288339,57.8172719 C1.48033781,58.4963222 2.11818812,58.5407246 2.80237138,58.8124979 C3.13365198,58.9434084 3.25875095,59.2641774 3.70045843,59.3820734 C4.08502193,59.4838926 5.38080015,59.7656182 6.08660545,59.625521 C7.45497197,59.3545133 9.00558143,59.3101109 10.921449,58.9028338 C12.8365443,58.4963222 15.4373674,55.2404021 15.4373674,55.2404021 L18.4466926,49.5438815" id="Shape" fill="#FFA694"></path>
<g transform="translate(10.811022, 0.000000)" id="Shape">
<g transform="translate(6.177727, 0.000000)">
<g transform="translate(0.772216, 110.240419)">
<path d="M0.599239512,5.94379591 C0.599239512,5.94379591 31.265476,24.532321 33.1797991,25.8904217 C35.0956667,27.2462257 41.9374992,21.8199473 41.9374992,21.8199473 L6.63642315,4.18683924" fill="url(#linearGradient-14)"></path>
<path d="M25.0390994,0.591011134 C25.0390994,0.591011134 58.9208428,21.7158314 60.8359381,23.0716354 C62.7518057,24.428205 69.5936383,19.0026922 69.5936383,19.0026922 L34.2925622,1.36881853" fill="url(#linearGradient-15)"></path>
</g>
<path d="M6.33139788,56.4453911 C4.55298474,62.8385698 1.61779224,72.5665212 0.667966724,77.912416 C0.277225496,80.1072721 2.77071053,90.7477692 3.12592982,92.578985 C3.70972502,95.5991132 5.52288787,107.084787 5.31361737,110.313912 C4.85801001,111.358134 3.74524695,114.217495 3.12592982,114.723529 C2.55603452,115.264779 2.41008572,114.959321 1.67956951,115.22497 C0.722021834,115.576361 2.23170385,116.491969 3.56145957,116.491969 C4.51051287,116.491969 5.40319441,116.800489 6.16305482,116.34881 C7.01712557,115.806029 7.20863511,114.541326 7.96695109,113.818639 C9.27740141,112.654225 12.8380888,111.106265 10.728395,109.315624 C10.3260706,108.378581 9.74536423,106.767846 9.77161957,105.322471 C9.92142944,97.1087945 11.3847785,95.1994917 9.8658299,88.1494638 C8.48588015,81.7409739 7.55149895,79.2169276 7.55149895,79.2169276 C7.55149895,79.2169276 12.5546855,71.1647837 14.5493191,65.6849162 C16.5416361,60.2058143 8.10903881,50.0529779 6.33139788,56.4453911 Z" fill="#FFA694"></path>
<g transform="translate(1.544432, 0.000000)">
<path d="M32.8871293,114.154719 C30.4731825,114.466302 29.3673694,112.603698 27.9449477,112.151253 C26.3495498,111.645219 23.5440895,110.375923 22.4027545,109.201556 C20.9942327,107.74776 23.8691924,107.633692 25.7904655,108.125946 C27.7086497,108.617435 33.3149369,110.183767 33.3149369,110.183767 C33.3149369,110.183767 35.2308044,113.853089 32.8871293,114.154719 Z" fill="#000000"></path>
<path d="M26.6445362,108.667962 C24.6576248,109.022415 30.1558018,111.378804 30.1558018,111.378804 C30.1558018,111.378804 33.6184177,112.560827 33.5357906,111.482155 C33.4245915,110.054388 33.6871449,93.6767959 33.0477502,89.0849762 C32.4083555,84.4954532 28.4522936,75.6762197 28.4522936,75.6762197 C27.7016998,64.0213577 28.4368493,67.6684782 28.0121305,58.1426342 C27.6074894,49.1289489 19.0227656,43.9239169 19.0227656,43.9239169 L13.2319189,56.4622334 C15.6250158,61.1558723 21.7008103,76.4754627 23.2205311,80.5367504 C24.7379353,84.5988036 29.1913042,104.439017 29.3974858,106.768611 C29.5202681,108.162693 28.1627126,108.396954 26.6445362,108.667962 Z" fill="#FFA694"></path>
<path d="M7.5877931,11.6586898 C8.01791733,13.997471 9.2673626,15.5990193 10.8836104,15.4788266 L13.3678289,15.2958581 C14.98176,15.176431 16.2960714,13.6950754 16.3030214,11.98788 L16.32696,5.64752479 C16.3331378,3.93956386 15.0304096,2.65189452 13.4157062,2.76979052 L10.9314878,2.95352455 C9.31678442,3.07295167 6.6194344,4.1967915 6.61248446,5.90475243 C6.61248446,5.90475243 7.15844108,9.31914318 7.5877931,11.6586898 Z" fill="#FFA694"></path>
<path d="M13.5438941,21.1324758 C13.5438941,21.1324758 12.996393,18.1490945 12.2334437,16.0767277 C11.6720428,14.5502042 9.72683105,14.1865639 9.72683105,14.1865639 L16.040468,10.3962839 L18.3146437,20.3738074 L13.5438941,21.1324758 Z" fill="#FFA694"></path>
<path d="M24.0738296,83.2475929 L16.9146163,66.9656955 L24.4985483,59.7510725 C24.4985483,59.7518381 22.1201235,78.7552959 24.0738296,83.2475929 Z" fill="#FF7B7B"></path>
<path d="M0.441707475,71.0690889 C0.441707475,71.0690889 7.18237977,77.5763358 16.6752294,75.7688523 C26.168079,73.9613688 28.5410984,69.7247682 28.5410984,69.7247682 C28.5410984,69.7247682 28.5936091,58.0844518 27.1240823,51.9974964 C26.1526347,47.9737211 23.9587695,46.3338949 23.0738101,43.6820004 C23.0668601,42.1478212 25.076938,36.6756093 26.1703957,33.777205 C27.4491852,30.3834843 28.4492047,23.8953763 28.4492047,23.8953763 C26.5642258,20.1694033 17.0296765,18.9031696 17.0296765,18.9031696 L9.49439407,23.3204419 C9.49439407,23.3204419 7.71906979,23.8333661 6.66653957,28.114369 C5.47887157,32.939684 5.79779672,30.0726676 5.79007456,32.3923097 C5.78003576,34.7104208 7.0086312,37.0599197 7.31133982,38.1171559 C7.61404844,39.1751577 7.52215475,43.8764522 7.34068402,45.9564746 C7.15921329,48.0357314 0.441707475,71.0690889 0.441707475,71.0690889 Z" fill="#2A5FFF"></path>
<path d="M25.5950949,23.289054 C26.768863,23.824945 31.9612425,32.1748911 32.2129848,37.9602164 C32.2801676,39.4913334 27.0970547,44.9298607 23.5772948,46.5888259 L21.5703058,44.0555929 C21.5703058,44.0555929 26.58662,39.4446343 26.6785137,38.0880647 C26.768863,36.7314951 25.5788783,31.5861767 22.0768794,30.4546813 C18.5756527,29.3216547 20.4420984,25.0092639 20.4420984,25.0092639 C20.4420984,25.0092639 23.8437093,22.489811 25.5950949,23.289054 Z" fill="#2A5FFF"></path>
<path d="M16.2319775,0.973790366 C12.3871147,-0.694361527 10.4009755,1.28766934 7.18855749,2.10222354 C3.95451745,2.92213666 4.25182056,6.38169535 5.91749018,6.71777552 C9.16929119,7.37539024 9.82335803,7.64792905 11.1214529,8.70057194 C12.4566141,9.78460273 12.8774718,13.5687582 13.1021866,16.1364413 C13.557794,20.2658637 16.8404836,20.6562985 16.8281281,22.3535416 C16.7717564,29.6462515 24.9008728,29.6776394 29.1318435,30.6292286 C32.7774746,31.446845 33.9659149,25.3369229 31.8647155,23.1680958 C30.4646881,21.7204247 30.2724064,19.89763 28.6376254,18.4683324 C27.4715794,17.2625778 25.4360184,15.2820781 24.2715169,13.8183303 C20.5386254,9.7003913 20.9841939,3.03543931 16.2319775,0.973790366 Z" fill="#000000"></path>
</g>
<path d="M8.82179405,9.21885502 C8.82179405,9.21885502 8.37931436,10.3036514 8.28355959,10.8456668 C8.18857704,11.3892133 8.72063377,11.6586898 9.16929119,11.6900777" fill="#F99282"></path>
<path d="M4.1421659,114.954728 C3.3537335,114.907263 2.22012061,114.038354 1.49578213,114.323142 C-0.118149027,114.954728 1.88497893,116.220962 3.02940284,116.621349 C3.79544098,116.889294 5.40164998,116.801255 6.16228261,116.350341 C7.01635336,115.80756 7.89667944,114.231275 8.65653986,113.507822 C10.0805059,112.24312 13.7160982,110.568078 10.2982708,108.579922 C10.2982708,108.579922 7.37929481,112.060151 6.83256598,112.78437 C6.28583715,113.507822 4.1421659,114.954728 4.1421659,114.954728 Z" stroke="#000000" stroke-width="0.7087" fill="#000000"></path>
<path d="M24.7572407,42.4287812 C24.7572407,42.4287812 24.6197862,43.8312843 24.8946951,44.6450729 C25.1279043,45.3363722 25.8468372,46.3086315 25.8468372,46.3086315 L28.5426428,44.2844949 C28.5426428,44.2844949 25.3503024,43.9208546 24.7572407,42.4287812 Z" fill="#000000"></path>
</g>
<path d="M21.8706977,26.3849725 C21.3602631,26.5235385 20.9162389,26.8266997 20.5216366,27.2462257 C19.1795255,28.6663367 18.3972708,31.4146916 17.4876005,33.5176807 C16.3130602,36.2407721 15.1223033,42.4800736 13.3346236,45.608911 C11.5484883,48.7362174 6.28660936,53.399234 5.10048579,55.2825078 C3.91667887,57.1657816 -0.245564645,56.1353399 0.610050534,53.7475631 C1.4648935,51.3605518 7.86270195,44.2523414 8.95770404,41.6754717 C9.72528661,39.8687537 11.8751356,31.4453139 12.3369207,29.4242396 C13.6937039,23.4789125 18.9478607,21.586452 21.1386371,21.1056813 C21.1386371,21.1056813 24.1093515,25.7794157 21.8706977,26.3849725 Z" fill="#2A5FFF"></path>
</g>
<path d="M5.63022588,54.3799144 C5.63022588,54.3799144 7.18006312,54.833125 7.63721491,54.833125 C8.09359449,54.833125 9.27894584,54.9226953 9.91679615,55.3751404 C10.5561909,55.8275854 7.90980711,56.0985931 7.90980711,56.0985931 C7.90980711,56.0985931 6.63333429,55.6469136 6.35842544,55.5558122 C6.08506102,55.4654763 3.89660126,54.3799144 4.62557304,54.3799144 C5.35686146,54.3799144 5.63022588,54.3799144 5.63022588,54.3799144 Z" id="Shape" fill="#FFA694"></path>
</g>
<g id="Group" transform="translate(161.000000, 106.000000)" fill-rule="nonzero">
<polygon id="Shape" fill="#1552EA" points="10.4798077 30.953122 10.4798077 24.4469024 18.4937308 16.5396341"></polygon>
<g id="Shape">
<path d="M10.6849615,1.25209756 C16.2362308,-1.32921951 20.7286154,1.78665854 20.7286154,8.19307317 C20.7286154,14.6123415 16.2362308,21.8950732 10.6849615,24.4763902 C5.13369231,27.0577073 0.6405,23.9410732 0.6405,17.5339024 C0.6405,11.1274878 5.13288462,3.83265854 10.6849615,1.25209756 Z" fill="#1552EA"></path>
<path d="M4.59415385,17.5119756 L6.07223077,16.8231707 C6.43003846,16.6590976 6.72,16.8587073 6.72161538,17.2722927 L6.72161538,18.9742683 C6.72,19.3893659 6.43084615,19.8589024 6.07223077,20.0275122 L4.59415385,20.7148049 C4.23634615,20.8796341 3.94638462,20.6785122 3.94638462,20.2649268 L3.94638462,18.5637073 C3.94719231,18.1486098 4.23634615,17.6790732 4.59415385,17.5119756 Z M8.01715385,12.1648537 L9.48634615,11.4828537 C9.84334615,11.3180244 10.1333077,11.5183902 10.1341154,11.9334878 L10.1341154,17.3879756 C10.1333077,17.8030732 9.84415385,18.2718537 9.48634615,18.4404634 L8.01715385,19.1224634 C7.66015385,19.2872927 7.37019231,19.0869268 7.36857692,18.6733415 L7.36857692,13.2173415 C7.37019231,12.803 7.65934615,12.3334634 8.01715385,12.1648537 Z M11.4288462,12.6427073 L12.9085385,11.9546585 C13.2647308,11.7898293 13.5563077,11.9901951 13.5571154,12.4045366 L13.5571154,15.794878 C13.5563077,16.2099756 13.2655385,16.6802683 12.9085385,16.848122 L11.4288462,17.5354146 C11.0718462,17.701 10.7826923,17.499122 10.7818846,17.0862927 L10.7818846,13.6951951 C10.7826923,13.2800976 11.0718462,12.810561 11.4288462,12.6427073 Z M14.9277692,6.12287805 L16.3969615,5.44087805 C16.7523462,5.27529268 17.0439231,5.47565854 17.0455385,5.89 L17.0455385,14.174561 C17.0439231,14.5889024 16.7531538,15.0599512 16.3969615,15.2262927 L14.9277692,15.9098049 C14.5707692,16.0746341 14.2808077,15.8742683 14.2808077,15.4599268 L14.2808077,7.17536585 C14.2816154,6.76102439 14.5707692,6.28997561 14.9277692,6.12287805 Z" fill="#FFFFFF"></path>
</g>
</g>
<g id="Group" transform="translate(170.000000, 477.000000)" fill-rule="nonzero">
<path d="M13.7671579,31.3343333 C13.7671579,33.0011111 11.1742105,34.3482222 7.97631579,34.3482222 C4.77989474,34.3482222 2.18768421,33.0011111 2.18768421,31.3343333 C2.18768421,29.6722222 4.78063158,28.3251111 7.97631579,28.3251111 C11.1742105,28.3251111 13.7671579,29.6722222 13.7671579,31.3343333 Z" id="Shape" fill="#050E26" opacity="0.2"></path>
<g id="Shape">
<path d="M11.2316842,29.008 C11.7585263,27.3396667 10.9605263,24.9814444 10.6105263,23.163 C9.79263158,18.8953333 6.40389474,1.21722222 5.87263158,0.203 L5.81810526,0.203 C5.28463158,1.22811111 2.07936842,17.745 1.18189474,22.9576667 C0.859894737,24.829 0.177578947,27.4322222 0.592421053,28.7474444 C1.20621053,30.6848889 3.76378947,32.4908889 5.85273684,32.4908889 C8.72715789,32.4916667 10.7446316,30.555 11.2316842,29.008 Z" fill="#7A9B54"></path>
<path d="M10.5648421,23.3208889 C9.74768421,19.054 6.35821053,1.37588889 5.82768421,0.360888889 L7.18494737,9.97811111 C8.17894737,14.9527778 7.546,19.9173333 7.94610526,21.9986667 C8.29536842,23.8202222 9.37189474,25.6627778 8.84652632,27.3295556 C8.358,28.8765556 6.33978947,30.814 3.46536842,30.814 C2.76684211,30.814 2.01747368,30.611 1.30494737,30.2695556 C2.37705263,31.6143333 4.22578947,32.6503333 5.80631579,32.6503333 C8.68,32.6503333 10.7011579,30.7136667 11.1874737,29.1666667 C11.7128421,27.4998889 10.9141053,25.1401111 10.5648421,23.3208889 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(193.000000, 494.000000)" fill-rule="nonzero">
<path d="M13.5475789,31.5381111 C13.5475789,33.2048889 10.9546316,34.552 7.75673684,34.552 C4.56031579,34.552 1.96736842,33.2048889 1.96736842,31.5381111 C1.96736842,29.876 4.56105263,28.5288889 7.75673684,28.5288889 C10.9546316,28.5288889 13.5475789,29.876 13.5475789,31.5381111 Z" id="Shape" fill="#050E26" opacity="0.2"></path>
<g id="Shape">
<path d="M11.0128421,29.2117778 C11.5396842,27.5434444 10.7416842,25.1852222 10.3902105,23.3652222 C9.57305263,19.0991111 6.18431579,1.42177778 5.65231579,0.406777778 L5.59852632,0.406777778 C5.06578947,1.43188889 1.86052632,17.9487778 0.963052632,23.1614444 C0.640315789,25.0327778 -0.0412631579,27.636 0.373578947,28.9512222 C0.986631579,30.8886667 3.54421053,32.6946667 5.63389474,32.6946667 C8.50757895,32.6954444 10.5250526,30.758 11.0128421,29.2117778 Z" fill="#7A9B54"></path>
<path d="M10.346,23.5246667 C9.52810526,19.2577778 6.13863158,1.57966667 5.60810526,0.564666667 L6.96610526,10.1818889 C7.95936842,15.1565556 7.32642105,20.1211111 7.72578947,22.2024444 C8.07578947,24.024 9.15157895,25.8665556 8.62694737,27.5333333 C8.13915789,29.0803333 6.11947368,31.017 3.24505263,31.017 C2.548,31.017 1.79789474,30.814 1.08536842,30.4748889 C2.15747368,31.8188889 4.00621053,32.8541111 5.58747368,32.8541111 C8.46115789,32.8541111 10.4801053,30.9174444 10.9671579,29.3696667 C11.4932632,27.7021111 10.6952632,25.3431111 10.346,23.5246667 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(479.000000, 371.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#050E26" opacity="0.2" cx="7.73757895" cy="31.6384444" rx="5.79084211" ry="3.01388889"></ellipse>
<g id="Shape">
<path d="M10.9936842,29.3121111 C11.522,27.6437778 10.7232632,25.2855556 10.3732632,23.4663333 C9.55463158,19.1994444 6.16736842,1.52133333 5.63463158,0.507111111 L5.58084211,0.507111111 C5.04736842,1.53144444 1.84136842,18.0491111 0.943894737,23.2625556 C0.622631579,25.1331111 -0.0604210526,27.7355556 0.355894737,29.0507778 C0.968210526,30.989 3.52578947,32.795 5.61547368,32.795 C8.48915789,32.7957778 10.5073684,30.8583333 10.9936842,29.3121111 Z" fill="#7A9B54"></path>
<path d="M10.3275789,23.625 C9.50894737,19.3581111 6.12094737,1.68 5.58894737,0.665 L6.94694737,10.2822222 C7.94094737,15.2568889 7.30726316,20.2206667 7.70810526,22.302 C8.05663158,24.1227778 9.13389474,25.9653333 8.60778947,27.6336667 C8.12073684,29.1806667 6.10105263,31.1173333 3.22663158,31.1173333 C2.52957895,31.1173333 1.77873684,30.9143333 1.06768421,30.5744444 C2.13905263,31.9192222 3.98778947,32.9544444 5.56978947,32.9544444 C8.442,32.9544444 10.4624211,31.017 10.9487368,29.4707778 C11.4741053,27.8024444 10.6768421,25.4434444 10.3275789,23.625 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(282.000000, 488.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#050E26" opacity="0.2" cx="10.58984" cy="38.9497018" rx="7.6646" ry="3.75080702"></ellipse>
<g id="Shape">
<path d="M14.8998,36.0528596 C15.59672,33.9752807 14.54032,31.0407193 14.07672,28.7752982 C12.99372,23.4644211 8.50896,1.4567193 7.80444,0.193877193 L7.733,0.193877193 C7.02696,1.47029825 2.78236,22.0325965 1.596,28.5203158 C1.16964,30.850614 0.26524,34.0914561 0.81624,35.7284737 C1.62792,38.1402456 5.01296,40.3890702 7.7786,40.3890702 C11.5824,40.3883158 14.25532,37.9780526 14.8998,36.0528596 Z" fill="#7A9B54"></path>
<path d="M14.01744,28.972193 C12.93368,23.6605614 8.4474,1.65587719 7.74364,0.392280702 L9.5418,12.3628772 C10.85584,18.5548772 10.01908,24.7363158 10.54956,27.3268772 C11.01012,29.593807 12.43588,31.886386 11.74048,33.9632105 C11.09296,35.8899123 8.42156,38.3016842 4.61624,38.3016842 C3.6936,38.3016842 2.70028,38.0474561 1.75788,37.625 C3.1768,39.2997368 5.62476,40.5867193 7.7178,40.5867193 C11.52236,40.5867193 14.19528,38.1764561 14.83976,36.2512632 C15.53592,34.1736842 14.47876,31.237614 14.01744,28.972193 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(532.000000, 308.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#7981A5" opacity="0.2" cx="12.0952857" cy="92.8128837" rx="9.13392857" ry="5.57623256"></ellipse>
<g id="Shape">
<path d="M12.0945,92.8128837 C12.0945,93.5350465 11.4957857,94.1221395 10.7548571,94.1221395 C10.0155,94.1221395 9.416,93.5350465 9.416,92.8128837 L9.416,73.1303023 C9.416,72.4073721 10.0155,71.821814 10.7548571,71.821814 C11.4957857,71.821814 12.0945,72.4073721 12.0945,73.1303023 L12.0945,92.8128837 Z" fill="#514443"></path>
<g>
<path d="M10.0579286,3.24551163 C10.0579286,3.24551163 1.05285714,34.9684884 0.625428571,49.3112093 C0.249857143,61.8688605 -0.230214286,72.765 3.19785714,80.3012791 C6.62828571,87.8398605 11.5586429,87.212093 12.2013571,84.2812326 C13.0994286,80.1861628 18.6324286,81.9781395 18.6324286,71.926186 C18.6324286,61.8757674 18.6324286,50.9865349 16.0615714,33.3983023 C13.4883571,15.8100698 10.0579286,3.24551163 10.0579286,3.24551163 Z" fill="#5E8455"></path>
<path d="M6.512,27.3846279 L9.46628571,22.7485116 L11.4360714,19.6564884 C11.4360714,19.6564884 13.6125,20.1568605 12.4142857,22.7285581 C11.2184286,25.2987209 6.512,27.3846279 6.512,27.3846279 Z" fill="#729668"></path>
<path d="M11.3598571,8.76188372 C11.3598571,8.76188372 10.9858571,9.8102093 10.4358571,11.2637442 C9.53935714,13.6274651 8.17457143,17.0648372 7.17828571,18.8138372 C5.56992857,21.641093 2.233,35.3882791 2.233,35.3882791 C2.233,35.3882791 8.46528571,5.30762791 8.46528571,4.36597674 C8.46528571,3.4227907 8.46528571,4.99297674 8.46528571,3.4227907 C8.46528571,1.85183721 9.43092857,0.280883721 9.43092857,0.280883721 C9.43092857,0.280883721 11.3598571,6.24927907 11.3598571,8.76188372 Z" fill="#729668"></path>
<path d="M2.74842857,33.752093 C2.74842857,33.752093 4.49664286,35.1457674 5.23128571,35.6929535 C5.96592857,36.240907 5.96592857,36.240907 5.96592857,36.240907 L7.56328571,37.1142558 C7.56328571,37.1142558 5.48114286,36.5624651 3.63,36.1357674 C1.77807143,35.7083023 2.74842857,33.752093 2.74842857,33.752093 Z" fill="#729668"></path>
<path d="M1.99807143,41.1855349 C1.99807143,41.1855349 3.74707143,42.5784419 4.48092857,43.1271628 C5.21478571,43.6743488 5.21478571,43.6743488 5.21478571,43.6743488 L6.81214286,44.5476977 C6.81214286,44.5476977 4.73157143,43.9966744 2.87964286,43.5699767 C1.0285,43.1409767 1.99807143,41.1855349 1.99807143,41.1855349 Z" fill="#729668"></path>
<path d="M10.8232143,38.1848372 C10.8232143,36.3007674 14.0399286,30.6462558 14.0399286,30.6462558 C14.0399286,30.6462558 14.0399286,34.1012791 14.0399286,35.0436977 C14.0399286,35.9853488 14.0399286,35.9853488 14.0399286,35.9853488 L10.8232143,38.1848372 Z" fill="#729668"></path>
<path d="M17.5772143,45.4087674 C17.5772143,45.4087674 19.9343571,73.4050465 18.5420714,78.078 C17.1505714,82.750186 15.3112143,86.5835581 9.84421429,86.268907 C4.378,85.9557907 10.824,86.559 12.4315714,79.0204186 C14.0407143,71.4818372 15.6482857,61.4291163 15.6482857,60.4874651 C15.6482857,59.545814 15.9712143,59.2303953 15.9712143,57.974093 C15.9704286,56.7177907 17.5772143,45.4087674 17.5772143,45.4087674 Z" fill="#4E7244"></path>
<path d="M10.1812857,70.5394186 L17.2566429,62.6869535 C17.2566429,62.6869535 17.2566429,68.0260465 16.291,69.2831163 C15.3253571,70.540186 10.1812857,70.5394186 10.1812857,70.5394186 Z" fill="#4E7244"></path>
<path d="M12.7529286,58.2887442 C12.7529286,57.3455581 15.9704286,49.1792093 15.9704286,49.1792093 C15.9704286,49.1792093 17.5772143,53.8913023 16.9337143,55.1476047 C16.291,56.403907 12.7529286,58.2887442 12.7529286,58.2887442 Z" fill="#4E7244"></path>
<path d="M6.32185714,75.5653953 L13.7185714,74.6222093 C13.7185714,74.6222093 12.4307857,78.078 10.1812857,78.3911163 C7.93021429,78.7065349 6.32185714,75.5653953 6.32185714,75.5653953 Z" fill="#4E7244"></path>
<path d="M5.35621429,80.2759535 C5.35621429,80.2759535 14.3612857,79.9636047 14.6826429,79.0204186 C15.004,78.078 13.7319286,81.5084651 12.7529286,83.4178605 C11.7723571,85.3287907 5.35621429,80.2759535 5.35621429,80.2759535 Z" fill="#4E7244"></path>
<path d="M3.4265,56.7177907 C3.4265,56.7177907 3.10514286,57.3440233 5.35621429,57.9733256 C7.60807143,58.6026279 10.5034286,58.9165116 10.5034286,58.9165116 C10.5034286,58.9165116 7.28514286,60.4874651 5.67835714,60.4874651 C4.07078571,60.4866977 3.4265,56.7177907 3.4265,56.7177907 Z" fill="#4E7244"></path>
<path d="M11.2105714,46.4755116 C11.2105714,46.4755116 11.5319286,47.1040465 13.3972143,45.7226512 C15.2632857,44.3420233 17.2582143,42.2699302 17.2582143,42.2699302 C17.2582143,42.2699302 16.6139286,45.7249535 15.6475,46.9812558 C14.6826429,48.2360233 11.2105714,46.4755116 11.2105714,46.4755116 Z" fill="#4E7244"></path>
<path d="M9.77978571,30.1512558 C9.77978571,30.1512558 10.2708571,30.5073488 11.1445714,28.7614186 C12.0182857,27.0147209 12.7215,24.6955116 12.7215,24.6955116 C12.7215,24.6955116 13.5865714,27.5580698 13.3469286,28.8734651 C13.1072857,30.188093 9.77978571,30.1512558 9.77978571,30.1512558 Z" fill="#4E7244"></path>
<path d="M4.80621429,64.2847674 C5.77028571,64.4935116 9.09385714,64.7022558 9.41521429,64.7022558 C9.73578571,64.7022558 12.5235,63.9701163 12.5235,63.9701163 C12.5235,63.9701163 10.2724286,66.0644651 7.91292857,65.6454419 C5.55578571,65.2241163 4.80621429,64.2847674 4.80621429,64.2847674 Z" fill="#4E7244"></path>
<path d="M8.66407143,72.0305581 C9.84342857,72.0305581 12.2013571,71.7166744 12.2013571,71.7166744 C12.2013571,71.7166744 9.19992857,72.9737442 8.23428571,72.9737442 C7.27021429,72.9737442 5.12678571,71.299186 5.12678571,71.299186 L8.66407143,72.0305581 Z" fill="#4E7244"></path>
</g>
</g>
</g>
<g id="Group" transform="translate(499.000000, 334.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#7981A5" opacity="0.2" cx="13.1529655" cy="58.1197108" rx="8.81896552" ry="5.6026988"></ellipse>
<path d="M11.8284138,58.330988 C11.8284138,58.9609639 11.3262069,59.4721928 10.7056552,59.4721928 C10.0873793,59.4721928 9.58365517,58.9609639 9.58365517,58.330988 L9.58365517,49.3470843 C9.58365517,48.7178795 10.0866207,48.2074217 10.7056552,48.2074217 C11.3262069,48.2074217 11.8284138,48.7171084 11.8284138,49.3470843 L11.8284138,58.330988 Z" id="Shape" fill="#934318"></path>
<path d="M19.8606897,40.2760482 C19.8606897,45.6674699 15.5615862,50.0364337 10.2588276,50.0364337 C4.95455172,50.0364337 0.656206897,45.6674699 0.656206897,40.2760482 L2.90096552,24.3068916 C5.2982069,17.1920964 6.26772414,-0.0300722892 10.7564828,0.350072289 C15.246,0.730216867 17.1167586,18.5360964 17.1167586,23.926747 L19.8606897,40.2760482 Z" id="Shape" fill="#B4D38C"></path>
<path d="M17.116,23.926747 C17.116,19.6186988 15.921931,7.38390361 13.1491724,2.44819277 C13.8281379,8.74563855 12.6264828,19.0982169 12.6264828,22.7855422 L15.3704138,39.1371566 C15.3704138,44.5270361 11.072069,48.896 5.76855172,48.896 C5.76248276,48.896 5.75641379,48.8952289 5.75186207,48.8952289 C7.09537931,49.6223614 8.62855172,50.0364337 10.258069,50.0364337 C15.5608276,50.0364337 19.859931,45.6674699 19.859931,40.2760482 L17.116,23.926747 Z" id="Shape" fill="#96B56D"></path>
</g>
<g id="Group" transform="translate(238.000000, 482.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#7981A5" opacity="0.2" cx="13.4105333" cy="58.5843452" rx="8.96463333" ry="5.65422619"></ellipse>
<path d="M12.0627333,58.7971429 C12.0627333,59.4324405 11.5529,59.9485714 10.9219333,59.9485714 C10.2925,59.9485714 9.7819,59.4324405 9.7819,58.7971429 L9.7819,49.7296429 C9.7819,49.0927976 10.2925,48.5782143 10.9219333,48.5782143 C11.5529,48.5782143 12.0627333,49.0927976 12.0627333,49.7296429 L12.0627333,58.7971429 Z" id="Shape" fill="#934318"></path>
<path d="M20.2269667,40.5747024 C20.2269667,46.0153571 15.8577333,50.4252976 10.4673,50.4252976 C5.0784,50.4252976 0.7084,46.0153571 0.7084,40.5747024 L2.98923333,24.4547024 C5.42723333,17.27375 6.41086667,-0.109107143 10.9748333,0.27547619 C15.5380333,0.658511905 17.4393667,18.6317857 17.4393667,24.070119 L20.2269667,40.5747024 Z" id="Shape" fill="#B4D38C"></path>
<path d="M17.4386,24.0693452 C17.4386,19.7228571 16.2242,7.37285714 13.4082333,2.39184524 C14.0959333,8.74714286 12.8761667,19.1974405 12.8761667,22.9186905 L15.6645333,39.4217262 C15.6645333,44.862381 11.2945333,49.2723214 5.90486667,49.2723214 C5.89796667,49.2723214 5.89336667,49.2723214 5.888,49.2723214 C7.2542,50.0066667 8.8113,50.42375 10.4680667,50.42375 C15.8585,50.42375 20.2277333,46.0138095 20.2277333,40.5731548 L17.4386,24.0693452 Z" id="Shape" fill="#96B56D"></path>
</g>
<g id="Group" transform="translate(514.000000, 384.000000)" fill-rule="nonzero">
<path d="M13.356,31.3273333 C13.356,32.9948889 10.7623158,34.3404444 7.56442105,34.3404444 C4.36726316,34.3404444 1.77505263,32.9948889 1.77505263,31.3273333 C1.77505263,29.666 4.368,28.3188889 7.56442105,28.3188889 C10.7623158,28.3188889 13.356,29.6667778 13.356,31.3273333 Z" id="Shape" fill="#050E26" opacity="0.2"></path>
<g id="Shape">
<path d="M10.8212632,29.001 C11.3481053,27.3326667 10.5501053,24.9736667 10.1986316,23.1552222 C9.38147368,18.8883333 5.99347368,1.21022222 5.46073684,0.196777778 L5.40694737,0.196777778 C4.87421053,1.22188889 1.66821053,17.738 0.770736842,22.9514444 C0.448736842,24.822 -0.232842105,27.4244444 0.182,28.7396667 C0.795052632,30.6778889 3.35263158,32.4846667 5.44157895,32.4846667 C8.31526316,32.4862222 10.3327368,30.5487778 10.8212632,29.001 Z" fill="#7A9B54"></path>
<path d="M10.1529474,23.3146667 C9.33505263,19.0485556 5.94631579,1.37044444 5.41505263,0.354666667 L6.77378947,9.97266667 C7.76705263,14.9473333 7.13336842,19.9103333 7.53347368,21.9916667 C7.882,23.8132222 8.95926316,25.6565556 8.43463158,27.3233333 C7.94536842,28.8703333 5.92789474,30.807 3.052,30.807 C2.35568421,30.807 1.60557895,30.604 0.893052632,30.2641111 C1.96515789,31.6081111 3.81389474,32.6441111 5.39442105,32.6441111 C8.26884211,32.6441111 10.2877895,30.7074444 10.7748421,29.1604444 C11.3009474,27.4928889 10.5036842,25.1338889 10.1529474,23.3146667 Z" fill="#466025"></path>
</g>
</g>
<g id="Group" transform="translate(367.000000, 325.000000)" fill-rule="nonzero">
<path d="M61.4178045,63.6025739 C61.4178045,63.6025739 73.2406015,70.6089043 75.1425564,71.9641043 C77.0437444,73.3208348 85.3793684,62.4279652 85.3793684,62.4279652 L68.7595038,52.493913" id="Shape" fill="url(#linearGradient-16)"></path>
<path d="M101.919474,29.4226087 L76.2814286,10.1391304 L44.8255489,0.197426087 L44.8255489,26.5086609 L44.8470226,30.2192 L46.8939248,39.7354435 C56.9006617,39.1186783 67.3368722,41.0125913 75.006812,45.3735652 C77.5069624,46.7938087 75.0405564,42.5062957 75.0405564,42.5062957 L75.0405564,72.4783304 C75.0359549,72.4798609 75.0298195,72.483687 75.0244511,72.487513 L87.0305414,79.3346783 C96.9567519,73.7929739 101.917173,66.4652522 101.916406,59.1053913 L101.91794,59.1053913 L101.91794,29.4226087 L101.919474,29.4226087 Z" id="Shape" fill="#2A5FFF"></path>
<polygon id="Shape" fill="#559AFF" points="46.8448421 0.837147826 44.8255489 0.197426087 44.8255489 26.5086609 44.8477895 30.2184348 46.8448421 39.5043478"></polygon>
<path d="M46.8908571,39.7346783 L46.8617143,39.5908174 L46.8617143,20.7840696 L40.8490827,14.1657043 L35.4246767,14.5368348 L24.2844361,10.8331826 L24.2844361,34.1264 C24.2821353,34.1286957 24.2767669,34.1294609 24.2744662,34.1302261 L24.2844361,34.1409391 L24.2844361,34.2044522 L24.3526917,34.2044522 L33.1745414,42.3448348 C37.4125263,40.9008696 42.0999248,40.0308174 46.8908571,39.7346783 Z" id="Shape" fill="#A9CAFF"></path>
<path d="M33.1653383,42.334887 L33.1653383,29.0139826 L28.4840752,25.6814609 L24.2736992,26.7282783 C20.9544812,27.8600348 17.8154887,29.2221217 14.9449173,30.824487 C9.95458647,33.6098783 0.769984962,40.314713 0.769984962,40.314713 L0.769984962,53.6448 L0.772285714,53.6448 C0.772285714,53.6478609 0.77075188,53.6532174 0.767684211,53.6585739 L17.507188,55.3657739 C18.638391,51.5810087 21.7789173,47.9645913 26.9502406,45.0781913 C28.866,44.0076522 30.9604511,43.0993391 33.1753083,42.3463652 L33.1653383,42.334887 Z" id="Shape" fill="#A9CAFF"></path>
<path d="M21.7052932,64.088487 L21.7052932,68.2229565 C19.5962707,66.1675826 22.124797,60.044313 21.4652481,57.7693217 L17.5578045,55.3810783 C17.5578045,55.3772522 17.5593383,55.3726609 17.5601053,55.3703652 L17.5578045,55.3703652 L17.5578045,33.5264696 L0.125774436,35.6277565 L0.125774436,58.9814261 L0.137278195,58.9814261 C0.382691729,66.1606957 5.34541353,73.328487 15.0346466,78.8525913 C16.3775188,79.6185739 17.7794436,80.333287 19.2273835,80.9974957 L29.8077744,73.5993739 L29.8346165,73.5978435 L29.8346165,63.9637565 L21.7052932,64.088487 Z" id="Shape" fill="#A9CAFF"></path>
<path d="M19.0985414,52.1633391 L19.0985414,80.9385739 C19.1422556,80.9577043 19.1836692,80.9783652 19.2258496,80.9974957 L29.8062406,73.5993739 L29.8330827,73.5978435 L29.8330827,51.6269217 C29.8330827,51.6269217 19.788,53.2560696 19.0985414,52.1633391 Z" id="Shape" fill="#73A3EF"></path>
<path d="M46.8617143,16.3412174 L40.8490827,14.1649391 L35.4246767,14.5360696 L33.1124211,13.7677913 L33.1124211,42.2882087 L33.1737744,42.3440696 C37.4125263,40.9001043 42.0999248,40.0300522 46.8908571,39.733913 L46.8617143,39.5900522 L46.8617143,16.3412174 Z" id="Shape" fill="#71A4F4"></path>
<path d="M87.0236391,79.3147826 L87.0236391,74.5321739 L80.1006767,74.5321739 L80.1006767,75.3654957 L75.0413233,72.4806261 C62.6947218,79.3698783 43.1291278,79.7165217 29.8008722,73.6085565 L26.0774887,76.2125913 L19.1905714,76.2125913 L19.1905714,81.0250435 L19.2043759,81.0250435 C39.1856391,90.1785739 68.5041203,89.6605217 87.0190376,79.3453913 L87.0251729,79.3453913 L87.0251729,79.3415652 C87.033609,79.3369739 87.0412782,79.3331478 87.0504812,79.3277913 L87.0236391,79.3147826 Z" id="Shape" fill="#D7E7FF"></path>
<g id="Shape">
<path d="M87.0090677,74.8795826 L87.0313083,79.333913 C96.9575188,73.7922087 101.91794,66.464487 101.917173,59.1046261 L101.918707,59.1046261 L101.918707,29.4226087 L100.093444,32.4934261 L87.0083008,28.0490435 L87.0083008,74.8795826 L87.0090677,74.8795826 Z" fill="#1552EA"></path>
<path d="M87.006,8.65690435 C75.5114436,2.10128696 59.8509925,-0.730017391 44.8454887,0.194365217 L46.8939248,9.71596522 C56.9006617,9.10073043 67.3422406,10.9831652 75.006812,15.3548522 C88.2583759,22.9121391 88.266812,35.0752696 75.0244511,42.4688 L87.0305414,49.3174957 C106.889865,38.2317913 106.877594,19.9928348 87.006,8.65690435 Z" fill="#5787FF"></path>
<path d="M33.1737744,19.018713 C37.4125263,17.5739826 42.0999248,16.7039304 46.8908571,16.4085565 L44.8416541,6.88542609 C37.6571729,7.32772174 30.6268421,8.6370087 24.2744662,10.8056348 L33.1737744,19.018713 Z" fill="#D7E7FF"></path>
<path d="M24.2736992,26.7282783 C21.9031579,27.5363478 19.6269474,28.4622609 17.4726767,29.5121391 L17.4726767,55.3619478 L17.507188,55.3657739 C18.638391,51.5810087 21.7789173,47.9645913 26.9502406,45.0781913 C28.866,44.0076522 30.9604511,43.0993391 33.1753083,42.3463652 L33.1645714,42.3356522 L33.1645714,29.0147478 L29.8376842,26.6471652 L24.600406,26.6471652 L24.2736992,26.7282783 Z" fill="#8CB3FE"></path>
<path d="M26.9510075,31.7481043 C28.8667669,30.6790957 30.961218,29.7715478 33.1760752,29.0162783 L24.2744662,20.8039652 C20.9552481,21.9357217 17.8162556,23.2985739 14.9456842,24.9009391 C7.18831579,29.2305391 2.46333835,34.6521043 0.768451128,40.328487 L17.5079549,42.0372174 C18.638391,38.2509217 21.7789173,34.6360348 26.9510075,31.7481043 Z" fill="#FFFFFF"></path>
<path d="M29.8284812,51.7531826 C28.8621654,51.310887 27.9272932,50.8372174 27.0323008,50.3260522 C18.9758346,45.7309217 15.9281053,39.4852174 17.4627068,33.5272348 L0.820601504,31.8330435 C-1.79535338,40.6766609 2.94266165,50.1278609 15.0338797,57.0247652 C16.3767519,57.791513 17.7786767,58.5062261 19.2266165,59.1689043 L29.8284812,51.7531826 Z" fill="#D7E7FF"></path>
<path d="M75.0206165,67.6742957 C62.674782,74.564313 43.1084211,74.9101913 29.7786316,68.8029913 L19.1775338,76.2179478 C39.1695338,85.3783652 68.5125564,84.856487 87.0267068,74.5222261 L75.0206165,67.6742957 Z" fill="#FFFFFF"></path>
</g>
</g>
<g id="Group" transform="translate(340.000000, 405.000000)" fill-rule="nonzero">
<g transform="translate(0.000000, 46.365489)" id="Shape">
<path d="M2.15522807,40.8139946 C2.15522807,40.8139946 19.7143158,50.8830333 21.4449825,52.1202191 C23.1756491,53.3589504 29.3580351,48.4071162 29.3580351,48.4071162 L10.6456842,37.844285" fill="url(#linearGradient-17)"></path>
<path d="M10.6418246,3.0948964 L0.750315789,3.0948964 L0.750315789,38.7530486 L0.761122807,38.7530486 C0.774245614,39.4446671 1.23122807,40.1262398 2.13978947,40.6493971 C4.03024561,41.7351223 7.1565614,41.7134851 9.12035088,40.6007133 C10.0335439,40.0837381 10.5345263,39.4222571 10.6202105,38.7522758 L10.6418246,38.7522758 L10.6418246,3.0948964 Z" fill="#71A4F4"></path>
<path d="M9.25235088,1.05481488 C11.1443509,2.14054008 11.0849123,3.92252038 9.11957895,5.03529212 C7.15578947,6.14651834 4.02947368,6.16815557 2.13824561,5.08243037 C0.247789474,3.99670516 0.305684211,2.21472486 2.27178947,1.10272588 C4.23635088,-0.0108186141 7.36112281,-0.0324558424 9.25235088,1.05481488 Z" fill="#A9CAFF"></path>
</g>
<g transform="translate(20.842105, 45.592731)" id="Shape">
<path d="M1.42807018,31.354662 C1.42807018,31.354662 18.986386,41.4221552 20.7178246,42.6608865 C22.4492632,43.8996179 28.6316491,38.9462381 28.6316491,38.9462381 L9.91929825,28.3841797" fill="url(#linearGradient-18)"></path>
<path d="M9.91389474,3.53768682 L0.0231578947,3.53768682 L0.0231578947,29.2929433 L0.0331929825,29.2929433 C0.0463157895,29.9837891 0.503298246,30.6661345 1.41185965,31.1877463 C3.30231579,32.2734715 6.42940351,32.252607 8.39242105,31.1390625 C9.30715789,30.6220873 9.80736842,29.9606063 9.89305263,29.2921705 L9.91389474,29.2921705 L9.91389474,3.53768682 Z" fill="#D2E4FF"></path>
<path d="M8.52596491,1.4976053 C10.4164211,2.58410326 10.3569825,4.36608356 8.39164912,5.47962806 C6.42863158,6.59085428 3.30154386,6.61249151 1.41108772,5.5267663 C-0.480140351,4.4410411 -0.420701754,2.65828804 1.54385965,1.54628906 C3.50842105,0.434290082 6.63473684,0.410334579 8.52596491,1.4976053 Z" fill="#FFFFFF"></path>
</g>
<g transform="translate(58.666667, 0.000000)" id="Shape">
<path d="M1.53536842,58.3262398 C1.53536842,58.3262398 19.0929123,68.3945058 20.8251228,69.6332371 C22.5557895,70.8704229 28.7389474,65.9185887 28.7389474,65.9185887 L10.0258246,55.3557575" fill="url(#linearGradient-19)"></path>
<path d="M10.021193,3.12426121 L0.13045614,3.12426121 L0.13045614,56.2637483 L0.139719298,56.2637483 C0.152842105,56.9561396 0.610596491,57.6377123 1.51915789,58.1600968 C3.40884211,59.245822 6.53670175,59.2249575 8.4997193,58.111413 C9.41445614,57.5959834 9.91466667,56.9329569 10.0003509,56.2637483 L10.021193,56.2637483 L10.021193,3.12426121 Z" fill="#71A4F4"></path>
<path d="M8.63326316,1.08417969 C10.5237193,2.16913213 10.4650526,3.95111243 8.4997193,5.06542969 C6.53670175,6.17665591 3.40884211,6.19829314 1.51838596,5.11256793 C-0.372070175,4.02529721 -0.312631579,2.24331692 1.65115789,1.13131793 C3.61649123,0.0193189538 6.74126316,-0.00309103261 8.63326316,1.08417969 Z" fill="#A9CAFF"></path>
</g>
<g transform="translate(38.596491, 17.773438)" id="Shape">
<path d="M1.97459649,49.7663978 C1.97459649,49.7663978 19.5321404,59.8346637 21.2635789,61.0718495 C22.9950175,62.3098081 29.1781754,57.3579738 29.1781754,57.3579738 L10.4650526,46.7959154" fill="url(#linearGradient-20)"></path>
<path d="M10.4604211,3.29813179 L0.568912281,3.29813179 L0.568912281,47.7039062 L0.579719298,47.7039062 C0.592070175,48.3962976 1.04982456,49.0778702 1.95838596,49.6002548 C3.84884211,50.6867527 6.97515789,50.6651155 8.9397193,49.5523437 C9.85445614,49.0345958 10.3538947,48.3731148 10.4395789,47.7031335 L10.4604211,47.7031335 L10.4604211,3.29813179 Z" fill="#A9CAFF"></path>
<path d="M9.07094737,1.25805027 C10.9621754,2.34377548 10.9027368,4.12575577 8.93894737,5.23852751 C6.97438596,6.35052649 3.84807018,6.37370924 1.95761404,5.28643852 C0.0671578947,4.20071332 0.125052632,2.41796026 2.08884211,1.30596128 C4.05417544,0.193962296 7.18049123,0.170779552 9.07094737,1.25805027 Z" fill="#D7E7FF"></path>
</g>
</g>
<g id="Group" transform="translate(29.000000, 144.000000)">
<path d="M136.634671,95.0789764 L0.457243668,162.70783 L0.457243668,67.9487028 L136.634671,0.319849057 L136.634671,95.0789764 Z" id="Shape" stroke="#A9CAFF" stroke-width="0.7087" stroke-dasharray="2.835,3.5437"></path>
<g transform="translate(3.063609, 22.297170)" id="Shape">
<g transform="translate(0.000000, 0.768868)" fill="#FFFFFF" fill-rule="nonzero">
<polygon points="137.337004 76.7937594 0.546088334 133.646929 8.88140298 43.4441132 104.225516 4.31873113 144.394027 0.685830189"></polygon>
</g>
<g transform="translate(9.190828, 8.457547)" opacity="0.4" stroke="#7FA8EF" stroke-dasharray="2.835,3.5437" stroke-width="0.7087">
<g transform="translate(5.361316, 0.000000)">
<path d="M0.417416749,51.9201132 L125.627889,0.332919811"></path>
</g>
<g transform="translate(3.063609, 17.683962)">
<path d="M0.722245861,51.8547594 L125.936548,0.268334906"></path>
</g>
<g transform="translate(1.531805, 35.367925)">
<path d="M0.0834833498,51.6087217 L125.296254,0.0222971698"></path>
</g>
<g transform="translate(0.000000, 53.820755)">
<path d="M0.348485543,51.5895 L125.561256,0.0030754717"></path>
</g>
</g>
<polygon fill="#8CB3FE" fill-rule="nonzero" points="104.406269 4.36025 143.851003 0.728886792 146.747645 8.90195283"></polygon>
</g>
<path d="M16.9976696,86.9635755 C28.5788781,81.8767453 30.2768835,102.763811 35.6359018,108.487264 C42.0135702,115.298665 45.5865044,105.307995 47.0348256,98.9517642 C48.4831469,92.5932264 49.7499493,80.3336274 55.7201576,78.9711934 C61.6911319,77.6087594 62.8292627,101.037703 69.8342051,99.4968915 C78.0515708,97.689283 76.2126394,64.076684 84.3557125,60.8074575 C91.140075,58.0825896 86.978162,96.7643349 96.9762505,92.9576698 C107.469878,88.9610943 107.456857,62.5081934 115.432198,59.8532925 C120.498642,58.7630377 117.425076,78.3591745 123.574505,77.1543585 C130.993801,75.701967 127.736418,55.7206274 137.960448,54.948684" id="Shape" stroke="#A6C8FF" stroke-width="1.4175" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
<g id="Group" transform="translate(405.000000, 276.000000)">
<path d="M3.56153846,99.2268461 C3.56153846,99.2268461 15.4192308,106.267243 17.3269231,107.629801 C19.2353846,108.991591 27.5946154,98.0472951 27.5946154,98.0472951 L16.2369231,92.3702252" id="Shape" fill="url(#linearGradient-21)" fill-rule="nonzero"></path>
<g id="Shape">
<path d="M30.0707692,23.5433462 C30.0707692,23.5433462 26.6176923,34.6252819 25.8915385,36.4407447 C25.1630769,38.2577454 22.5061538,45.205101 22.5061538,45.205101 L25.9130769,46.0909177 C25.9130769,46.0909177 29.1630769,41.8902089 30.4346154,39.7102695 C31.3338462,38.1685486 34.7053846,29.7194569 34.7053846,29.7194569" fill="#FFA694" fill-rule="nonzero"></path>
<path d="M29.4353846,26.2461636 L32.4330769,33.444962 C33.0461538,32.4914787 34.7492308,29.6294912 34.7492308,29.6294912" fill="#FF7B7B" fill-rule="nonzero"></path>
<g transform="translate(22.307692, 93.041508)" fill-rule="nonzero">
<path d="M11.6207692,3.03730543 C10.3115385,5.90083085 11.03,7.76704358 8.59461538,9.97389588 C6.02769231,12.2976268 5.72769231,14.6590356 3.39615385,15.1211674 C2.00461538,11.1572916 6.11461538,6.6305531 7.55461538,0.248367001" fill="#FFA694"></path>
<g transform="translate(0.000000, 5.382567)">
<path d="M1.37615385,8.69668973 C-0.468461538,11.5978931 0.992307692,13.3918257 2.67615385,13.6055905 C4.80461538,13.8762567 7.46230769,12.4721757 7.91384615,11.1472954 C8.37846154,9.78319924 8.45384615,9.6470972 8.76307692,9.00195815 C9.08538462,8.32683051 9.90538462,7.50175994 10.1176923,6.56288654 C10.3923077,5.33489242 10.3930769,4.85507506 10.3930769,4.85507506 L10.3984615,1.85929229 C10.3984615,1.85929229 9.93230769,2.5298063 9.31230769,2.01538672 C8.41923077,1.27720616 7.33153846,-0.362938776 5.86923077,0.258363196 C3.58384615,1.23030093 3.77692308,4.91735905 1.37615385,8.69668973 Z" fill="#000000"></path>
<path d="M10.3053846,5.50713456 C10.2684615,5.7078274 10.2223077,5.93850882 10.1607692,6.20686821 C9.95076923,7.14651055 9.48846154,7.91083501 9.03384615,8.5467468 C8.61846154,9.12883293 8.42307692,9.42794984 7.95846154,10.7912771 C7.50692308,12.1169263 4.84923077,13.5202383 2.72,13.2503411 C1.55923077,13.1034739 0.616153846,12.3122366 0.515384615,10.8512542 C-0.130769231,12.9542999 1.16615385,14.1353888 2.58461538,14.3153203 C6.10615385,14.7605355 7.43153846,13.0035119 7.82384615,11.8554874 C8.28846154,10.4921602 8.39769231,10.3745126 8.60307692,9.69323348 C8.80846154,9.00810965 9.84615385,8.04386129 10.0576923,7.10498789 C10.3323077,5.87776271 10.3030769,5.56480491 10.3030769,5.56480491 L10.3053846,5.50713456 Z" fill="#FFFFFF"></path>
<path d="M0.963846154,12.4967817 C0.963846154,12.4967817 1.58923077,11.3164618 3.07230769,11.3279958 C4.49230769,11.3402989 5.52692308,13.0765611 5.52692308,13.0765611 C5.52692308,13.0765611 3.81230769,13.9623777 2.98538462,13.85934" fill="#FFFFFF"></path>
</g>
</g>
<g transform="translate(0.000000, 83.045313)" fill-rule="nonzero">
<path d="M15.56,2.89658976 C14.2492308,5.76011519 16.0146154,7.02809409 13.5792308,9.23340851 C11.0115385,11.5594462 7.85923077,13.3441515 5.52692308,13.8047454 C4.13461538,9.84240747 11.3984615,6.30452335 11.0576923,0.24067762" fill="#FFA694"></path>
<path d="M15.1938462,5.94158457 C15.1938462,5.94158457 17.2023077,9.57481702 14.1684615,10.8743224 C9.72923077,12.7766752 8.18461538,14.9781449 5.72384615,15.4656517 C2.03307692,16.1961429 0.392307692,14.4767973 0.832307692,13.4064355 C1.70538462,11.2849353 6.47769231,9.11960567 8.37307692,5.46407402 C10.2923077,1.76317503 10.9538462,6.0430844 11.6346154,6.68976133 C13.7692308,8.71821999 15.1938462,5.94158457 15.1938462,5.94158457 Z" fill="#000000"></path>
<path d="M15.79,8.95889761 C15.6007692,9.6148018 15.3084615,10.2853158 12.6092308,11.3418367 C9.53615385,12.5444559 8.16923077,14.902789 5.72384615,15.4648827 C2.36230769,16.2368966 1.29461538,14.2922522 0.862307692,13.2980152 C0.837692308,13.3272349 0.783076923,13.4548786 0.76,13.4848672 C0.0446153846,14.3929831 1.62461538,17.1204064 5.86923077,16.2538132 C8.32692308,15.7524656 10.2723077,12.8989364 14.4292308,11.972366 C16.3846154,11.537147 15.7969231,9.65401764 15.79,8.95889761 Z" fill="#FFFFFF"></path>
<path d="M0.635384615,13.8885597 C0.635384615,13.8885597 1.95153846,12.5944369 2.68,13.3180076 C3.41,14.0408094 3.86076923,15.6132878 3.86076923,15.6132878 C3.86076923,15.6132878 2.31307692,15.5633068 2.13461538,15.4779547" fill="#FFFFFF"></path>
</g>
<path d="M28.7069231,46.0240201 C32.2046154,40.9774794 32.7215385,25.2919114 34.0846154,25.223476 C36.9969231,25.0781467 43.2946154,25.1957942 46.2069231,26.1323608 C49.2815385,27.2796164 56.7523077,32.5814445 58.0284615,35.9609274 C58.5861538,37.5464777 54.9353846,41.4373044 54.1638462,43.044385 C52.62,46.2570083 51.4238462,52.7729896 50.0376923,54.7437779" fill="#E6F0FF" fill-rule="nonzero"></path>
<path d="M51.1176923,52.3762176 C50.7869231,57.8087651 50.7538462,59.4896638 46.63,64.7584275 C42.9423077,69.4697112 39.3846154,72.2955586 38.7023077,77.3151864 C37.7507692,84.3255949 34.1946154,96.6978087 33.8846154,96.9254144 C33.1892308,97.4367582 27.8161538,96.4125327 28.3953846,94.9038762 C29.1076923,93.0499664 28.9053846,79.7704057 30.07,72.1379263 C30.4346154,69.757294 34.4046154,60.0071591 34.4307692,59.2559066 C34.4684615,58.2193781 32.9407692,58.3093438 32.9407692,58.3093438 C32.1392308,58.8006953 19.0715385,66.2578568 19.1661538,67.8926192 C19.4838462,73.3413144 16.3723077,84.4455493 15.4184615,86.5570533 C14.9892308,87.5074607 9.88461538,87.2506354 10.3746154,84.9222909 C11.4830769,79.667368 10.8530769,64.1717278 12.76,61.4873649 C16.44,56.3101048 27.7169231,46.4776935 27.7169231,46.4776935 C27.7169231,46.4776935 35.0923077,51.2520301 38.3838462,51.8141238 C49.3569231,53.6880259 51.1176923,52.3762176 51.1176923,52.3762176 Z" fill="#F26D5B" fill-rule="nonzero"></path>
<path d="M42.6438462,52.0863279 C38.6992308,55.8149087 40.7853846,57.2966524 39.7515385,57.2943456 C37.48,57.2912698 34.4592308,59.6273037 33.6815385,61.623467 C33.5407692,61.9848679 34.6438462,59.4881259 33.5723077,58.9737063 C32.5007692,58.4592868 30.0838462,60.5146582 28.2307692,60.9421878 C28.2307692,60.9421878 30.6646154,56.27012 27.5607692,53.8579613 C24.4576923,51.4450336 23.1646154,51.8825593 23.1646154,51.8825593 C27.1515385,49.2266472 27.4646154,46.6514735 27.4646154,46.6514735 L42.6438462,52.0863279 Z" fill="#D85648" fill-rule="nonzero"></path>
<g transform="translate(16.923077, 43.060533)" fill-rule="nonzero">
<path d="M21.3461538,16.5306309 C20.7715385,16.8120623 19.6553846,16.7259412 18.8538462,16.3368585 L1.53384615,7.25339294 C0.730769231,6.86584815 0.697692308,6.62901522 1.27230769,6.34758388 L11.3923077,1.39562262 C11.9661538,1.11342235 12.2876923,0.837373573 13.0892308,1.22722518 L31.7515385,9.77474092 C32.5546154,10.1638236 32.4161538,11.0873182 31.8430769,11.3695185 L21.3461538,16.5306309 Z" fill="#2D3B54"></path>
<path d="M21.4046154,15.933935 C20.8484615,16.2076769 19.7676923,16.1230937 18.99,15.747083 L1.21769231,7.09345382 C0.44,6.71667416 0.47,6.17303494 1.02692308,5.89852404 L10.9892308,0.915805258 C11.5469231,0.643601176 12.9592308,0.445984089 13.7353846,0.821994811 L31.5076923,9.47562401 C32.2853846,9.85163473 32.4830769,10.4783193 31.9261538,10.7520612 L21.4046154,15.933935 Z" fill="#FFFFFF"></path>
<path d="M20.6446154,15.0288948 C20.3307692,15.1819135 19.7215385,15.1342394 19.2823077,14.9220125 L9.25692308,10.0407935 C8.81923077,9.82933552 8.71846154,9.53098755 9.03230769,9.37719993 L14.77,6.5559661 C15.0830769,6.40217848 15.6923077,6.44908371 16.1323077,6.66207956 L26.1569231,11.5432985 C26.5953846,11.7562944 26.6969231,12.0538734 26.3830769,12.2061231 L20.6446154,15.0288948 Z" fill="#2D3B54"></path>
</g>
<path d="M40.9938462,52.3147025 C41.0753846,52.3246987 41.4530769,52.3147025 42.0307692,52.2924033 C43.3653846,52.2431913 45.7707692,52.1363089 48.0607692,52.1070892 C49.7623077,52.0840211 54.6884615,51.1151591 56.2276923,50.9321519 C56.9961538,50.8406482 57.83,45.7464334 58.2769231,42.3900187 C58.6869231,39.3258004 59.2807692,33.9824497 58.1407692,32.5122401 C57.4669231,31.8586427 51.9469231,30.3838194 51.5984615,31.4234237 C50.6853846,34.1462335 51.1561538,45.3673469 51.0846154,45.9263649 C51.0846154,45.9263649 43.3776923,49.2089616 39.65,48.7368336 C38.4384615,48.583046 35.8746154,47.8794677 35.8746154,47.8794677 C35.8746154,47.8794677 35.2976923,51.688018 36.31,51.9102411 C37.3246154,52.1340021 40.3423077,52.2316572 40.9938462,52.3147025 Z" fill="#FFA694" fill-rule="nonzero"></path>
<path d="M58.5053846,40.5968551 C59.05,36.4415137 58.6707692,33.444962 58.5053846,33.17122 C58.9638462,33.9278551 51.24,37.9040339 51.2184615,37.9632421 L58.5053846,40.5968551 Z" fill="#FF7B7B" fill-rule="nonzero"></path>
<path d="M50.1746154,38.1224123 C53.1723077,38.3938475 59.3069231,37.8617423 59.2315385,36.4630439 C59.1361538,34.6844901 58.8953846,29.1296814 58.3392308,27.5433622 C57.0623077,24.1623414 49.5915385,18.8620512 46.5169231,17.7147956 C43.6061538,16.77746 38.4538462,17.9570111 36.6123077,18.2299841 C31.0646154,19.0519789 29.6615385,22.8620671 28.4361538,25.1788776 C28.4361538,25.1788776 31.0923077,29.4695521 33.2053846,29.8101916 C33.6784615,29.8878544 32.8830769,34.4322785 32.8646154,35.3288603 C32.8453846,36.226211 32.0469231,38.5291806 32.0469231,38.5291806" fill="#E6F0FF" fill-rule="nonzero"></path>
<g transform="translate(16.153846, 35.371152)">
<path d="M21.0184615,23.9539592 C21.0576923,24.4945227 20.6823077,24.7213594 20.1784615,24.4560758 L1.99153846,15.0927167 C1.48692308,14.8297399 1.04461538,14.1784493 1.00384615,13.6371169 L0.0438461538,0.89888862 C0.00307692308,0.358325147 0.38,0.133026288 0.883846154,0.395234175 L19.07,9.7601311 C19.5753846,10.022339 20.0161538,10.6736295 20.0576923,11.2157309 L21.0184615,23.9539592 Z" fill="#629AF4" fill-rule="nonzero"></path>
<path d="M21.0838462,23.9547281 L20.1230769,11.2157309 C20.0815385,10.6751674 19.6392308,10.022339 19.1353846,9.7601311 L0.949230769,0.396772051 C0.602307692,0.215302663 0.316923077,0.265283639 0.184615385,0.489813559 C0.318461538,0.470590107 0.477692308,0.500578692 0.653846154,0.593620201 L18.8407692,9.95621031 C19.3446154,10.2191871 19.7869231,10.8720156 19.8269231,11.412579 L20.7869231,24.1508073 C20.8007692,24.3207426 20.7715385,24.4576136 20.7123077,24.5606513 C20.9592308,24.5229734 21.11,24.3061328 21.0838462,23.9547281 Z" fill="#FFFFFF" fill-rule="nonzero"></path>
<path d="M10.5538462,12.9758302 C10.5569231,13.5686814 10.0546154,13.8216621 9.43230769,13.5394618 C8.81076923,13.2572615 8.30384615,12.5467627 8.30230769,11.9523736 C8.29923077,11.3587534 8.8,11.1065417 9.42307692,11.388742 C10.0453846,11.6717112 10.5507692,12.381441 10.5538462,12.9758302 Z" stroke="#FFFFFF" stroke-width="0.2269" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
<g transform="translate(35.384615, 0.000000)" fill-rule="nonzero">
<path d="M3.22,4.68590868 C4.58923077,1.98462919 11.3107692,5.64631235 12.7169231,7.45716154 C14.5361538,9.9985019 12.5838462,16.5237105 9.52384615,17.9116437 C1.53923077,21.5310353 2.38538462,6.79587478 2.21692308,3.41869872" fill="#FFA694"></path>
<path d="M6.20307692,21.0235361 C5.98615385,23.6140886 12.0684615,24.8720713 13.18,22.030845 C13.7992308,20.4445258 13.3469231,20.1200339 13.1561538,16.2738056 C13.1269231,15.6801854 13.0215385,12.9458416 12.7523077,12.5644483 C11.1792308,10.3475998 7.73,12.1607558 6.58230769,14.6121304 C5.65769231,16.5883013 5.47923077,14.8666489 5.92923077,17.6179094 C5.93,17.6171404 6.33923077,19.3887738 6.20307692,21.0235361 Z" fill="#FFA694"></path>
<path d="M6.04153846,18.3107226 C6.04153846,18.3107226 7.16384615,18.79054 8.46153846,18.3583967 C9.41384615,18.0408253 9.95230769,17.6855759 10.1446154,17.348781 C10.1446154,17.348781 9.71153846,18.8866572 8.41384615,19.8478298 C7.78615385,20.3122684 6.25,20.8405289 6.25,20.3768592 C6.25,19.8001557 6.04153846,18.3107226 6.04153846,18.3107226 Z" fill="#FF7B7B"></path>
<path d="M3.47692308,2.26529159 C6.04,2.15456451 9.20153846,-1.73011069 11.9053846,1.813156 C13.7315385,4.20609132 7.25384615,6.31298167 5.16153846,5.85315669" fill="#000000"></path>
<path d="M7.47615385,7.71629367 C3.52230769,7.10268108 1.68307692,7.82855863 0.750769231,6.26300069 C-1.27384615,2.85583604 2.74076923,2.06613663 6.49076923,1.15263819" fill="#000000"></path>
<path d="M6.61230769,6.7174431 C9.08923077,7.34643445 10.0953846,10.0315662 11.11,11.4856282 C13.3346154,7.04885541 12.4453846,2.00615946 6.76769231,1.34948634" fill="#000000"></path>
<path d="M11.8269231,9.75628641 C13.1253846,7.59326358 13.8946154,10.5736676 13.0346154,12.3552971 C13.6538462,12.207661 14.0861538,11.4387229 14.3269231,9.70861224 C14.8484615,5.95850121 14.7115385,0.865824282 11.3461538,1.58631927" fill="#000000"></path>
</g>
</g>
<path d="M44.9515385,28.1554369 C44.7146154,27.8617025 44.4330769,27.6210249 44.1230769,27.4633926 C43.5753846,27.1842681 43.0584615,27.2265597 42.6907692,27.520294 C42.4092308,26.8951474 41.95,26.3538149 41.4007692,26.0746904 C41.0938462,25.9170581 40.7938462,25.8640014 40.5230769,25.8978347 C39.9446154,25.9747285 39.5092308,26.465311 39.4323077,27.2480899 C39.4107692,27.4718509 39.42,27.7009945 39.4576923,27.930138 C39.6038462,29.6848547 41.5853846,33.2019775 41.5853846,33.2019775 C41.5853846,33.2019775 45.0776923,32.4761 45.5376923,31.0312653 C45.6130769,30.8597921 45.6661538,30.662175 45.6869231,30.438414 C45.7646154,29.6556351 45.4630769,28.7890419 44.9515385,28.1554369 Z" id="Shape" fill="#FF7373" fill-rule="nonzero"></path>
<g transform="translate(33.846154, 32.295400)" fill="#2D3B54" fill-rule="nonzero" id="Shape">
<path d="M3.49923077,1.16878589 C3.34923077,0.996543756 3.18,0.851214459 2.98076923,0.728184365 C2.65384615,0.555942235 2.34538462,0.523646835 2.07307692,0.630529229 C1.78692308,0.744332065 1.58461538,1.02345659 1.46846154,1.48635732 C1.40461538,1.94772017 1.44307692,2.42138603 1.58076923,2.8973587 C1.71615385,3.36025943 1.90076923,3.77779281 2.13153846,4.13227326 C2.34769231,4.46753027 2.57769231,4.83123798 2.82076923,5.22570322 C3.03923077,5.58018367 3.14384615,5.96080802 3.14076923,6.37295884 C3.11692308,6.74128018 3.02923077,6.90737081 2.97076923,6.93428364 C2.85,6.9819578 2.63153846,6.93428364 2.40692308,6.82586337 C2.18769231,6.6912992 1.82307692,6.30836804 1.31615385,5.21955171 C1.21615385,5.06268834 1.09615385,4.98271878 0.957692308,4.98271878 C0.885384615,4.98271878 0.749230769,5.00578692 0.650769231,5.16418817 C0.593846154,5.24877136 0.566153846,5.34950225 0.566153846,5.46099827 C0.566153846,5.55480872 0.586153846,5.65553961 0.636153846,5.78164545 C0.879230769,6.32297786 1.10230769,6.72974611 1.31923077,7.02578727 C1.54230769,7.33259357 1.81769231,7.5855742 2.15384615,7.78626704 C2.49076923,7.96081598 2.76153846,8.04616811 2.97923077,8.04616811 C3.05692308,8.04616811 3.12923077,8.03463404 3.19538462,8.01387271 C3.43230769,7.93851678 3.62153846,7.79395642 3.76076923,7.58403632 C3.89230769,7.38718817 3.97,7.12036666 4.00230769,6.75819682 C4.02230769,6.2691522 3.97461538,5.84546731 3.85846154,5.4979073 C3.74615385,5.16034348 3.58846154,4.82739329 3.39153846,4.50597717 C3.20384615,4.19840194 3.00615385,3.8846752 2.80076923,3.56633483 C2.61076923,3.27183155 2.46769231,2.96502525 2.37461538,2.65206745 C2.28769231,2.35525735 2.26538462,2.08612902 2.30769231,1.8615991 C2.35692308,1.651679 2.42,1.57939882 2.47153846,1.58862608 C2.69076923,1.64937219 2.86076923,1.76163715 2.99076923,1.93080353 C3.14230769,2.12918955 3.29384615,2.39908682 3.44076923,2.73049914 C3.53769231,2.96656313 3.71846154,2.99193808 3.79230769,2.99193808 L3.79307692,2.99193808 C3.86692308,2.99193808 3.93923077,2.96886994 3.99692308,2.93119198 C4.06923077,2.89043826 4.18923077,2.79047631 4.18923077,2.56902214 C4.18923077,2.50212452 4.17846154,2.42676859 4.14076923,2.30296956 C3.85461538,1.70473573 3.64923077,1.34256589 3.49923077,1.16878589 Z"></path>
<path d="M6.8,2.63745763 C6.37,2.40985195 5.94,2.42984434 5.56538462,2.69205223 C5.21538462,2.93503667 4.94307692,3.41639191 4.73615385,4.16303079 C4.56538462,4.76664718 4.47923077,5.41947561 4.47923077,6.10229263 C4.47923077,7.03424559 4.61846154,7.83240332 4.89,8.47369768 C5.17307692,9.13959806 5.57153846,9.61095711 6.07692308,9.87700969 C6.24384615,9.960055 6.41,10.0061913 6.57153846,10.0177254 C6.64153846,10.3176112 6.74615385,10.6082698 6.87846154,10.8820118 C6.96461538,11.0819357 7.05923077,11.2041968 7.17769231,11.2672497 C7.23538462,11.2972383 7.29692308,11.313386 7.36,11.313386 C7.43307692,11.313386 7.50307692,11.2926247 7.58384615,11.2418748 C7.69230769,11.1634431 7.85538462,10.9750533 7.70307692,10.5459858 C7.55153846,10.2783954 7.44,10.009267 7.37307692,9.74167658 C7.66538462,9.48254445 7.89692308,9.05655275 8.07538462,8.44678485 C8.27076923,7.78165341 8.36923077,7.07423037 8.36923077,6.34297025 C8.36923077,5.44023694 8.23153846,4.65899585 7.95692308,4.0200083 C7.67230769,3.3556458 7.28384615,2.89043826 6.8,2.63745763 Z M6.37692308,7.64093774 C6.26923077,7.64093774 6.16846154,7.68784296 6.09076923,7.77319509 L6.03615385,7.8662366 C5.96923077,8.06000899 5.98923077,8.29376617 6.09846154,8.55828087 L6.15076923,8.64132618 C6.21846154,8.7143753 6.27461538,8.80587893 6.32076923,8.91814389 C6.03461538,8.74897752 5.79615385,8.44294016 5.61692308,8.00464545 C5.41538462,7.51636977 5.31307692,6.89199204 5.31307692,6.14996679 C5.31307692,5.60555863 5.37846154,5.08421861 5.50692308,4.60209443 C5.68230769,3.94465237 5.87538462,3.68705811 6.00692308,3.58555828 C6.09307692,3.52173642 6.17692308,3.48944102 6.26307692,3.48944102 C6.33692308,3.48944102 6.41846154,3.51174023 6.50538462,3.55787651 C6.79769231,3.71166413 7.04076923,4.02154618 7.23,4.47983328 C7.43,4.96426427 7.53230769,5.57249429 7.53230769,6.28376202 C7.53230769,6.87507541 7.45538462,7.44408959 7.30846154,7.97927049 C7.24,8.22456174 7.16846154,8.40987582 7.1,8.54905361 C7.02076923,8.30683812 6.92615385,8.10537634 6.81461538,7.93928571 C6.76461538,7.8662366 6.61384615,7.64093774 6.37692308,7.64093774 Z"></path>
<path d="M11.0784615,11.8254988 L11.0161538,11.7901276 C10.5038462,11.5809765 9.99461538,11.3395299 9.46769231,11.0565607 L10.2184615,5.45407783 C10.2361538,5.15342304 10.0992308,4.97733622 9.98,4.88198789 L9.93,4.85046143 C9.86230769,4.81662816 9.79538462,4.79971152 9.72923077,4.79971152 C9.57615385,4.79971152 9.38846154,4.90044241 9.36384615,5.1749533 L8.62076923,10.9181519 C8.61846154,10.9435268 8.61615385,10.9704396 8.61615385,11.0011972 C8.61615385,11.1296098 8.64538462,11.2734012 8.70538462,11.4464123 C8.78538462,11.661715 8.90923077,11.8170405 9.07615385,11.909313 C9.66,12.207661 10.2538462,12.4852477 10.8438462,12.7351525 L10.8992308,12.7582207 L10.9607692,12.7559139 C11.0553846,12.7513002 11.2784615,12.6997814 11.2769231,12.2907063 C11.2638462,12.0684832 11.1976923,11.9154645 11.0784615,11.8254988 Z"></path>
</g>
<path d="M39.4069231,11.3418367 C39.4069231,11.3418367 38.3653846,13.5525337 38.41,13.9677603 C38.4838462,14.6574978 40.4330769,14.2899453 40.4330769,14.2899453 L39.4069231,11.3418367 Z" id="Shape" fill="#FF7B7B" fill-rule="nonzero"></path>
</g>
<g id="Group" transform="translate(78.000000, 248.000000)" fill-rule="nonzero">
<path d="M70.4212929,14.3595191 L68.017697,13.0934488 C68.017697,13.0934488 68.8751919,7.53514769 68.4951919,6.86726308 C67.972404,5.94662398 68.8329697,3.95522491 68.8329697,3.95522491 L75.3175354,1.28675016 C75.3175354,1.28675016 74.0923232,2.19130489 72.3934545,5.96194243 C71.9205657,7.01585209 70.4212929,14.3595191 70.4212929,14.3595191 Z" id="Shape" fill="#FFBDA6"></path>
<g transform="translate(0.000000, 0.765923)" id="Shape">
<g transform="translate(40.686869, 52.082745)">
<g transform="translate(0.000000, 53.614590)">
<path d="M6.89527273,3.21457764 C6.89527273,3.21457764 7.23151515,5.01526195 5.30848485,4.88965063 C3.22270707,4.75408231 0.865171717,7.28469096 4.13777778,7.90049283 C7.40961616,8.51859246 10.1195152,10.2365571 11.9895758,9.54263113 C13.0827475,9.13669209 11.8728889,5.46715635 11.7807677,4.86360925 C11.575798,3.51022381 11.4698586,1.76238817 11.4153535,0.301007628" fill="#FFBDA6"></path>
<path d="M1.33652525,4.72880686 C1.86929293,4.78165552 5.63858586,6.30354396 7.04266667,6.98138557 C8.12048485,7.50068117 12.6206061,8.60973726 12.0763232,6.75620429 C12.6206061,7.93112974 12.7626263,10.2740873 12.3480808,10.6011363 C10.1371717,12.3520357 6.36173737,10.1630285 3.18969697,9.15354239 C-1.07244444,7.79556142 -0.215717172,4.57409047 1.33652525,4.72880686 Z" fill="#FFFFFF"></path>
<path d="M1.33652525,4.18500173 C1.86929293,4.23938224 5.32383838,4.48983897 6.36250505,4.6292369 C5.59175758,5.12632075 5.63858586,5.76050476 7.04266667,6.43834636 C8.12048485,6.95840789 12.6206061,8.06746398 12.0763232,6.21239916 C12.6206061,7.38809053 12.7626263,9.7302822 12.3480808,10.0573312 C10.1371717,11.8089965 6.36173737,9.62075525 3.18969697,8.60973726 C-1.07244444,7.25328813 -0.215717172,4.03105126 1.33652525,4.18500173 Z" fill="#000000"></path>
</g>
<g transform="translate(11.515152, 49.019054)">
<path d="M6.87454545,3.16326082 C6.87454545,3.16326082 7.2100202,4.96241328 5.28775758,4.83680196 C3.2019798,4.70123364 0.843676768,7.2318423 4.11705051,7.84841008 C7.38735354,8.46574379 10.0980202,10.1829425 11.9696162,9.49054839 C13.0612525,9.08537527 11.8513939,5.41507361 11.7592727,4.81076059 C11.554303,3.45737515 11.4491313,1.71107135 11.3930909,0.24815896" fill="#FFBDA6"></path>
<path d="M1.38412121,4.84599303 C1.91535354,4.8988417 5.32153535,6.4092413 6.72715152,7.08784882 C7.80420202,7.60791035 12.6666667,8.72692344 12.1231515,6.87262454 C12.6666667,8.04908183 12.8086869,10.3912735 12.3949091,10.7183225 C10.1832323,12.4692218 7.29292929,9.62152117 3.39389899,8.95363656 C-1.01486869,8.19920269 -0.170424242,4.69127664 1.38412121,4.84599303 Z" fill="#FFFFFF"></path>
<path d="M1.38412121,4.3021879 C1.91535354,4.35580249 5.24630303,4.50592334 6.2849697,4.64455536 C5.51422222,5.1416392 5.32153535,5.86620209 6.72715152,6.5440437 C7.80420202,7.06410522 12.6666667,8.18388423 12.1231515,6.32881941 C12.6666667,7.50527671 12.8086869,9.84746837 12.3949091,10.1737515 C10.1832323,11.9261826 7.29292929,9.07771604 3.39389899,8.40983143 C-1.01486869,7.6569294 -0.170424242,4.14747151 1.38412121,4.3021879 Z" fill="#000000"></path>
</g>
<path d="M18.4234747,52.1823147 C19.1489293,53.4591079 23.937697,54.1576294 23.7173737,51.9678564 C23.5469495,50.2713375 20.4186667,30.395643 20.4186667,28.4800703 C20.4186667,27.1833632 21.0427879,14.5073422 21.4465859,6.47511065 C21.6377374,2.65775183 20.5077172,0.369940672 20.5077172,0.369940672 L10.5340606,4.75867784 C10.5340606,4.75867784 11.7132121,22.6736102 13.3460606,30.3336033 C14.9781414,37.9928305 17.6980202,50.9055215 18.4234747,52.1823147 Z" fill="#4080FE"></path>
<path d="M14.5697374,24.588417 C14.5697374,22.6728443 13.4811717,13.4603258 13.4811717,13.4603258 L11.3055758,11.9675425 C11.3055758,11.9675425 11.7132121,22.6743761 13.3460606,30.3336033 C13.3460606,30.3336033 14.5697374,26.5032238 14.5697374,24.588417 Z" fill="#3463E8"></path>
<path d="M6.27268687,55.936102 C6.54444444,57.3385065 10.6246465,59.4647079 11.7585051,56.7066202 C12.5791515,54.7083278 9.71878788,38.0541043 10.262303,32.9476975 C10.6054545,29.7292903 11.6226263,17.3948708 14.1605657,12.5082839 C15.8932121,9.17652007 15.2491313,3.82272028 15.2491313,3.82272028 L2.28076768,6.13657281 C2.28076768,6.13657281 1.66816162,25.7020686 2.21244444,31.446489 C2.75672727,37.1916753 6.00016162,54.5344634 6.27268687,55.936102 Z" fill="#4080FE"></path>
</g>
<path d="M59.8803232,19.038541 C62.6009697,23.8561949 61.0587071,28.2280817 61.4663434,43.2914838 C61.5768889,47.3608312 61.6029899,53.1979282 61.6029899,53.1979282 C61.6029899,53.1979282 60.1528485,56.5856044 56.344404,58.3502904 C47.4808081,62.4548702 42.9676364,58.5593873 42.9676364,58.5593873 C42.9676364,58.5593873 43.1495758,48.0363751 42.8785859,43.1497881 C42.6060606,38.264733 41.4361212,29.2528863 41.9473939,26.5323288 C42.7634343,22.189547 50.2229495,20.1468312 50.2229495,20.1468312 C50.2229495,20.1468312 54.1327273,17.1436482 57.178101,17.3427881 C58.2589899,17.4140189 59.230101,17.8873591 59.8803232,19.038541 Z" fill="#F26D5B"></path>
<g transform="translate(44.525253, 3.829614)">
<path d="M0.695515152,6.21852654 C-0.274828283,8.39144929 -0.15430303,10.4142512 1.23826263,11.21847 L3.38008081,12.457733 C4.77341414,13.2627178 6.69030303,12.7732932 7.66141414,11.3655272 L11.2694949,6.14346611 C12.2413737,4.73493424 11.8997576,2.94267508 10.5079596,2.1376903 L8.36460606,0.89919327 C6.97280808,0.0949744169 4.12242424,-0.487126848 3.14977778,0.919873183 C3.15054545,0.919873183 1.66662626,4.04636971 0.695515152,6.21852654 Z" fill="#FFBDA6"></path>
<path d="M3.45377778,16.9291898 C3.24957576,16.3853847 3.32557576,15.6554603 2.70606061,13.5353863 C2.0719596,11.3639954 1.0210101,9.50586684 1.0210101,9.50586684 L9.59749495,8.83032301 C9.59749495,8.83032301 9.86925253,13.3538626 10.5494141,14.3043727 C10.9839192,14.9117494 10.6407677,18.3760178 7.46642424,18.6249427 C4.9499798,18.8210189 3.65874747,17.4714631 3.45377778,16.9291898 Z" fill="#FFBDA6"></path>
<path d="M1.82092929,4.03028534 C1.82092929,4.03028534 0.844444444,4.67825596 0.459070707,5.07270616 C0.0744646465,5.46792228 0.359272727,5.98874973 0.708565657,6.26524783" fill="#F27C70"></path>
</g>
<path d="M49.4076768,7.86602631 C48.8641616,8.54463383 48.4549899,10.3085539 47.6389495,10.8508271 C46.8229091,11.3946323 45.3267071,10.4441222 44.5106667,11.1219638 C43.6946263,11.8013372 43.0597576,13.6265311 43.422101,14.6505697 C44.2381414,16.957529 47.2451313,17.3044919 47.1629899,16.6182252 C46.9587879,14.9209405 47.9114747,13.9719622 48.8641616,12.3436105 C49.8153131,10.7144929 50.7672323,9.49284616 50.7672323,9.49284616 C50.7672323,9.49284616 52.5367273,10.0351194 52.264202,11.1211979 C51.9916768,12.2072763 49.7247273,12.5236023 50.1331313,13.7444832 C50.5415354,14.9668958 55.3195556,15.5129987 55.2105455,14.6505697 C55.0316768,13.2022099 58.7932929,9.35804376 58.7932929,7.72969206 C58.7932929,6.10134036 57.1612121,3.52171265 54.9848485,2.97943937 C52.8077172,2.43716609 48.3191111,-0.278029946 47.7748283,0.26500926 C47.2313131,0.808048467 46.0790303,3.9414383 47.6750303,4.74872085 C49.2702626,5.55753524 51.3107475,5.55753524 51.4473939,6.23614276 C51.5832727,6.91551621 49.9511919,7.1881847 49.4076768,7.86602631 Z" fill="#000000"></path>
<path d="M18.1440404,31.5989076 C18.1440404,31.5989076 12.6950707,30.5748689 12.0686465,30.2416926 C10.7090909,29.5178956 10.0749899,28.1905515 9.51151515,27.9669021 C7.27911111,27.076134 6.82464646,24.14265 6.44694949,24.4513168 C5.44820202,25.2654927 7.14630303,27.3396114 6.99046465,28.0703017 C6.83078788,28.8186082 5.26779798,29.0652353 3.49983838,29.96979 C3.29717172,30.0724236 1.00565657,31.0558684 0.370787879,31.4173839 C-0.0307070707,31.6463948 4.9599596,31.99106 5.53955556,31.9604231 C7.46488889,31.8593213 9.40480808,32.5540132 10.5271515,33.0465016 C11.8920808,33.6431554 15.3596768,35.1022381 15.8770909,35.3082713" fill="#FFBDA6"></path>
<path d="M43.852,33.9962457 C43.852,33.9962457 34.1485657,37.8411778 29.1164444,38.384217 C26.2476364,38.6928838 18.6883232,37.1173808 14.1536566,35.1267477 C12.8079192,34.5354553 13.7007273,30.3305396 16.1496162,30.8743447 C18.2906667,31.3492168 26.1309495,31.8784694 28.2098182,31.5069969 C32.0182626,30.8283894 38.8198788,26.8019336 40.2707879,25.2647267 C41.7224646,23.7275199 45.2576162,22.0984022 46.7085253,21.5545971" fill="#F26D5B"></path>
</g>
<path d="M70.1249697,4.35580249 C70.2808081,4.11070722 71.0515556,2.41112471 71.2603636,2.08330979 C71.4691717,1.75549487 72.6414141,-0.100335876 72.9216162,0.288752864 C73.2256162,0.713839972 72.4141818,1.75855856 72.3911515,2.78029946 C72.3681212,3.80280629 72.278303,3.88552594 72.1570101,4.7303387" id="Shape" fill="#FFBDA6"></path>
<path d="M45.2798788,41.9541828 C45.6199596,44.8723483 44.5544242,50.5493675 44.1913131,51.9954296 C43.8289697,53.4437894 43.1042828,56.8812506 43.1042828,56.8812506 C43.1042828,56.8812506 42.8094949,45.3456885 42.6275556,42.6320244 C42.4456162,39.9183602 42.0157172,35.5066453 42.0157172,35.5066453 L42.8317576,35.371077 C43.9195556,36.8194369 44.9405657,39.0367831 45.2798788,41.9541828 Z" id="Shape" fill="#FC5D4C"></path>
</g>
<g id="Group" transform="translate(263.000000, 194.000000)" stroke="#4080FE" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.1262">
<path d="M23.6592308,0.614397661 L49.7376923,118.977877" id="Shape"></path>
<path d="M0.761538462,12.3783509 L26.84,130.74183" id="Shape"></path>
<path d="M24.4792308,116.896433 L46.4669231,106.12762" id="Shape"></path>
<path d="M21.2076923,102.055895 L43.1953846,91.1966842" id="Shape"></path>
<path d="M17.5723077,87.938538 L40.1523077,76.8540994" id="Shape"></path>
<path d="M14.3015385,73.2787953 L36.8815385,62.1943567" id="Shape"></path>
<path d="M11.3938462,58.6190526 L33.9738462,47.5330819" id="Shape"></path>
<path d="M7.94076923,44.1393392 L30.5207692,33.0549006" id="Shape"></path>
<path d="M4.67076923,29.2084035 L27.25,18.1239649" id="Shape"></path>
</g>
<path d="M139.843516,266.087144 C141.419197,265.530302 142.294081,264.834446 143.08081,263.860561 C143.86828,262.887463 144.918733,256.624758 145.838066,256.207716 C146.755916,255.789103 148.856823,255.928902 148.987945,257.319829 C149.119066,258.710756 148.164917,266.084002 146.887778,268.453525 C145.838066,270.401294 139.756102,274.900796 138.618975,275.967356 C137.923364,276.620016 133.63858,267.271513 134.024537,267.107366 C134.680885,266.830908 138.267836,266.644771 139.843516,266.087144 Z" id="Shape" fill="#F26D5B" fill-rule="nonzero"></path>
<g id="Group" transform="translate(271.000000, 159.000000)" fill-rule="nonzero">
<path d="M39.067,97.116834 C44.3963333,99.294686 40.537,104.920996 42.9271111,108.186621 C45.3141111,105.464882 46.9684444,103.287799 47.5198889,99.656509 C47.7034444,97.6607208 47.7034444,97.6607208 46.417,96.3901151 C45.1313333,95.4828689 42.3756667,94.5756226 40.9056667,94.0309675" id="Shape" fill="#FFBDA6"></path>
<path d="M28.2037778,25.9752059 C25.3781111,24.7499241 18.3687778,19.3148967 17.5233333,18.307016 C16.807,17.4558485 10.3887778,8.38953136 10.0403333,6.18248772 C10.0131111,6.01578794 9.97111111,5.8659886 9.92211111,5.72540768 C9.92133333,5.59174057 9.92211111,5.45807346 9.92133333,5.32286996 C9.91355556,4.43713333 9.90733333,3.52066864 10.0885556,2.66412368 C10.1266667,2.47975526 10.0076667,2.29922785 9.81944444,2.26081776 C9.63588889,2.22163947 9.46711111,2.62494539 9.42744444,2.80931382 C9.27733333,3.52527785 9.23766667,4.08990614 9.23066667,4.73212281 C9.17855556,4.68987171 9.12255556,4.65376623 9.06811111,4.61689254 C9.06344444,4.3349625 9.05411111,4.04535044 9.04477778,3.74344715 C9.01366667,2.93990811 8.98411111,2.10948202 9.07277778,1.48647039 C9.10777778,1.23910943 8.93277778,1.01018531 8.68311111,0.975616228 C8.43111111,0.942583553 8.25066667,1.4465239 8.21411111,1.69465307 C8.11377778,2.39755768 8.09744444,2.9337625 8.12933333,3.77647982 C8.13322222,3.92551096 8.13944444,4.0737739 8.14488889,4.21896404 C8.141,4.21819583 8.13944444,4.21819583 8.13711111,4.21819583 C7.99011111,3.17574605 7.91544444,2.09411798 7.99633333,1.07240965 C8.01577778,0.823512281 7.87733333,0.458616447 7.62455556,0.438643202 C7.37333333,0.419438158 7.15244444,0.605342982 7.133,0.855008553 C7.10811111,1.17842149 7.09255556,1.51719846 7.08866667,1.86519386 C7.06766667,1.69926228 7.042,1.54408553 7.01166667,1.41195482 C6.78766667,0.460152851 6.181,0.406378728 6.16077778,1.98887434 C6.14288889,3.69581864 6.53411111,6.43983531 6.272,6.8738693 C5.93988889,7.41775614 5.36433333,6.2608443 4.08333333,6.96912632 C2.80233333,7.67510373 3.78855556,7.77727456 4.41233333,7.63669364 C5.00811111,7.50302654 5.48566667,8.09838289 6.03244444,8.44330548 C6.20122222,8.55008553 6.81566667,9.6755011 7.833,9.86831974 C8.876,10.0649794 12.929,21.3928825 15.869,25.0226357 C19.5821111,29.608032 22.0811111,30.9016838 24.5046667,30.4668816 C27.5558889,29.9199219 33.1854444,28.1346211 28.2037778,25.9752059 Z M7.182,3.93319298 C7.18744444,3.99311272 7.19833333,4.04842325 7.20455556,4.10757478 C7.18977778,4.10834298 7.18044444,4.10834298 7.18044444,4.10834298 C7.18044444,4.10834298 7.18122222,4.04381404 7.182,3.93319298 Z" id="Shape" fill="#FFBDA6"></path>
<g transform="translate(12.444444, 106.780044)" id="Shape">
<path d="M5.24455556,0.292684868 C5.593,1.86596206 7.09488889,6.25239408 7.72411111,8.06381382 L7.84933333,9.21534825 C7.84933333,9.21534825 7.62533333,10.8470088 5.85822222,10.0281057 C4.09033333,9.20920263 3.122,9.33518772 1.62944444,9.71544759 C0.35,10.0396287 0.712444444,12.7483081 4.02811111,13.3659423 C7.34222222,13.9851129 10.0885556,15.7081895 11.984,15.0121987 C13.09,14.6065882 11.8642222,10.9253654 11.7708889,10.3200224 C11.5632222,8.96184167 11.3703333,6.67183224 10.7271111,5.03863531" fill="#FFBDA6"></path>
<path d="M1.13477778,8.94801404 C1.673,9.00101996 2.98433333,9.27373158 4.03588889,9.41200789 C3.20755556,9.48575526 1.29733333,10.7087325 2.70511111,11.8587305 C3.63844444,12.6215548 11.9031111,14.7041498 12.2375556,12.256659 C12.3822222,13.2146066 12.5704444,14.5305362 12.1504444,14.8585583 C9.91122222,16.6154357 6.68033333,14.1610311 3.36544444,13.5418605 C0.0497777778,12.9249945 -0.438666667,8.79283728 1.13477778,8.94801404 Z" fill="#000000"></path>
</g>
<path d="M42.6502222,94.4842066 C42.6502222,94.4842066 42.0995556,91.2185809 36.7702222,88.3147783 C32.4574444,85.9640809 32.1766667,85.1759059 32.1766667,83.7777787 C32.1766667,81.7819906 35.0241111,69.8940684 33.9212222,62.2712024 C33.3075556,58.0230467 31.0955556,55.6846406 30.4764444,55.2844075 L23.7237778,61.4553721 C23.7237778,61.4553721 24.3856667,83.1455487 25.3773333,88.0428349 C26.1115556,91.67182 40.2608889,97.7536732 40.2608889,97.7536732 C40.2608889,97.7536732 39.5251111,95.0296298 42.6502222,94.4842066 Z" id="Shape" fill="#4080FE"></path>
<path d="M25.7918889,69.2587656 C25.7918889,69.2587656 26.4802222,73.7504412 26.3425556,77.153575 C26.2048889,80.5559406 25.5157778,88.7226934 25.5157778,88.7226934 C25.5157778,88.7226934 24.5046667,80.9638557 24.0916667,77.9694053 C23.6786667,74.9749548 23.6327778,72.2985399 23.6327778,72.2985399" id="Shape" fill="#3463E8"></path>
<path d="M27.7666667,68.8961743 C27.7666667,68.8961743 24.8321111,73.2902884 24.7356667,73.6152377 C23.1077778,79.0264509 19.5704444,87.769355 19.3137778,89.2220246 C19.2258889,89.7228921 21.5491111,97.9618559 23.7478889,113.268276 L19.9818889,114.444393 C19.9818889,114.444393 12.7454444,102.847619 12.0143333,88.5982447 C11.284,74.3496386 13.9556667,61.0413114 13.9556667,61.0413114 L28.2745556,58.9602529" id="Shape" fill="#4080FE"></path>
<path d="M13.8934444,34.413134 C13.5255556,31.5999792 18.0965556,29.1140783 20.6461111,27.2442752 C23.1567778,25.404432 27.6515556,24.2728708 30.1318889,26.7910362 C33.4848889,30.19417 28.6385556,41.4006971 27.1234444,47.1168864 C26.0726667,51.07543 28.777,54.5576886 28.777,54.5576886 C28.777,54.5576886 27.0316667,62.7705336 15.1806667,57.1895478 C15.1806667,57.1895478 14.49,54.6813691 14.49,50.5653441 C14.49,46.4493191 13.8934444,34.413134 13.8934444,34.413134 Z" id="Shape" fill="#FFD1C5"></path>
<path d="M20.3248889,36.8636976 C20.2338889,31.0560923 16.191,30.5114373 16.191,30.5114373 C16.8342222,30.0581982 16.8941111,29.847711 17.8445556,29.150952 C19.3223333,28.0662511 23.5231111,34.4799675 26.0221111,33.2339443 C30.7533333,30.8747967 25.1712222,25.4981526 25.1712222,25.4981526 C25.9046667,25.2085406 25.655,25.3614127 25.655,25.3614127 C33.6466667,28.6961765 30.4772222,40.5833305 28.9613333,46.3002879 C27.9121111,50.2595998 32.0848889,57.1895478 32.0848889,57.1895478 C32.0848889,57.1895478 25.2871111,65.8103079 13.7565556,61.3631879 C13.7565556,61.3631879 14.5452222,56.7255539 15.1417778,52.30148 C16.0984444,45.2117461 9.94388889,43.6691969 13.8942222,37.4990004 C13.8934444,37.4990004 20.4174444,42.6705346 20.3248889,36.8636976 Z" id="Shape" fill="#000000"></path>
<g transform="translate(15.555556, 10.754825)" id="Shape">
<path d="M0.933333333,7.46154364 C0.382666667,10.5235958 1.60066667,12.4479412 3.20755556,13.0870851 L4.49866667,13.5026822 C6.10477778,14.1418261 8.07177778,13.3375189 8.89233333,11.7081629 L11.9365556,5.65703772 C12.7571111,4.02614539 12.1193333,2.1878386 10.5132222,1.54792654 L8.04144444,0.564628289 C6.43533333,-0.0737473684 3.31022222,-0.257347588 2.48966667,1.37277654 C2.49044444,1.37200833 1.38133333,4.96642434 0.933333333,7.46154364 Z" fill="#FFD1C5"></path>
<path d="M4.30966667,18.1234158 C4.30966667,18.1234158 4.67755556,16.2175072 3.89666667,13.585648 C3.38722222,11.8679489 2.08988889,10.2263018 2.08988889,10.2263018 L9.49511111,9.58638969 C9.49511111,9.58638969 8.35333333,10.7502154 8.904,13.4043524 C9.45544444,16.0584895 12.621,17.3029763 10.6501111,18.1234158 C8.03055556,19.2127259 4.30966667,18.1234158 4.30966667,18.1234158 Z" fill="#FFD1C5"></path>
<path d="M1.59911111,5.10854167 C1.59911111,5.10854167 0.780888889,6.06188004 0.451111111,6.50820526 C0.122888889,6.95453048 0.564666667,7.37166404 0.956666667,7.59674715" fill="#E8A78B"></path>
</g>
<path d="M6.63522222,60.8193011 C6.63522222,60.8193011 16.9711111,54.8042814 17.3841111,51.745302 C17.9355556,47.6623096 19.6373333,33.5804033 17.5544444,31.523159 C15.4707778,29.4651465 13.5255556,32.5510129 13.5255556,35.6376476 C13.5255556,38.7250504 12.7905556,48.1147805 13.0666667,49.8386252 C13.0666667,49.8386252 6.92922222,57.6251182 4.61377778,57.3708434 C2.95944444,57.1887796 1.48944444,57.7342029 1.12311111,58.8219765 C0.797222222,59.7853015 0.387333333,60.9998285 1.30588889,60.9998285 C2.22444444,60.9998285 3.23788889,60.5550397 3.87955556,60.681793 C4.79811111,60.864625 6.63522222,60.8193011 6.63522222,60.8193011 Z" id="Shape" fill="#FFD1C5"></path>
<path d="M19.8652222,9.3689886 C17.5225556,9.3689886 15.3175556,9.77690373 17.7978889,12.9073259 C19.4561111,14.895432 19.6023333,14.9384513 19.6598889,17.1954281 C19.6684444,17.5641649 19.7166667,18.5351719 19.6598889,19.0329667 C21.3134444,18.7610232 21.6572222,15.7665728 22.7593333,16.9910864 C23.5861111,17.9444248 22.2086667,21.006477 22.3463333,21.8906772 C22.3463333,21.8906772 25.1486667,22.0251125 25.655,21.6187338 C27.8592222,19.8487969 29.3743333,16.0369798 29.3743333,16.0369798 C29.3743333,16.0369798 30.8217778,16.3780614 32.8891111,12.770586 C33.712,11.3355851 31.2355556,6.71331513 27.9968889,7.39394189 C25.2987778,7.96010658 24.6897778,10.0480789 24.6897778,10.0480789 C23.9998889,9.64016382 22.2934444,9.98047719 20.8304444,9.91210724" id="Shape" fill="#000000"></path>
<path d="M44.3496667,97.7974607 C43.064,99.2493621 42.6961111,104.149721 42.1446667,106.145509 C41.776,107.415347 40.6738889,109.593967 41.5932222,110.682509 C43.4303333,113.405016 45.0838889,110.863804 45.8204444,109.775262 C47.2904444,107.415347 47.7485556,104.824202 48.3917778,102.152396 C49.3111111,98.3421158 46.9217778,93.804348 44.3496667,97.7974607" id="Shape" fill="#000000"></path>
</g>
<g id="Group" transform="translate(324.000000, 416.000000)">
<g transform="translate(100.925083, 0.000000)">
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(14.732283, 7.656908) rotate(164.514226) translate(-14.732283, -7.656908) " cx="14.7322826" cy="7.65690758" rx="1.19657791" ry="1.053563"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(8.329062, 3.429870) rotate(164.496131) translate(-8.329062, -3.429870) " cx="8.32906164" cy="3.42987033" rx="1.1965585" ry="1.05431325"></ellipse>
<path d="M0.75387979,1.91298164 C0.909854919,2.47390806 1.55057628,2.78544859 2.18747472,2.60742543 C2.82437317,2.43170429 3.21660474,1.83164347 3.06215878,1.27148438 C2.90541907,0.712092642 2.26393312,0.39978477 1.62703468,0.578575272 C0.990900819,0.75506375 0.599433829,1.35358989 0.75387979,1.91298164 Z" id="Shape" fill="#FF7A71" fill-rule="nonzero"></path>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(17.164448, 11.437683) rotate(164.514226) translate(-17.164448, -11.437683) " cx="17.1644479" cy="11.4376828" rx="1.19734249" ry="1.05279566"></ellipse>
<path d="M11.7998243,17.3687683 C11.9557995,17.92816 12.5972854,18.2412352 13.235713,18.0616774 C13.8718469,17.8859563 14.2633139,17.2858954 14.1065742,16.724969 C13.9528928,16.1655773 13.3106423,15.8555714 12.6737438,16.0305252 C12.0360808,16.2093157 11.6446138,16.8070745 11.7998243,17.3687683 Z" id="Shape" fill="#FF7A71" fill-rule="nonzero"></path>
<path d="M14.7174767,11.9659188 C14.7174767,11.9659188 4.74194975,14.5226997 6.255826,28.0938964" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M12.8725356,8.9080641 C12.8725356,8.9080641 9.01444495,11.7326471 9.1406013,15.7780699" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M10.9648986,18.1852193 C10.9648986,18.1852193 7.95778991,19.8971576 7.15650591,19.3907124" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M6.93018906,5.38750263 C6.93018906,5.38750263 2.0360871,13.7453831 4.0484721,21.9298444" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M1.47564705,3.62645456 C1.47564705,3.62645456 0.74623395,9.07611183 4.34971818,12.2275822" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
</g>
<g transform="translate(87.927156, 19.183530)">
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(4.945020, 1.788177) rotate(150.843556) translate(-4.945020, -1.788177) " cx="4.94502004" cy="1.78817742" rx="1.19734851" ry="1.05433564"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(13.663922, 16.868906) rotate(150.843556) translate(-13.663922, -16.868906) " cx="13.663922" cy="16.8689064" rx="1.19734851" ry="1.05510299"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(8.264092, 4.922520) rotate(150.861359) translate(-8.264092, -4.922520) " cx="8.26409196" cy="4.92252018" rx="1.19651358" ry="1.05350636"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(5.491487, 11.351922) rotate(150.822962) translate(-5.491487, -11.351922) " cx="5.49148716" cy="11.3519222" rx="1.19654989" ry="1.05353834"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" transform="translate(11.762067, 11.302853) rotate(150.876948) translate(-11.762067, -11.302853) " cx="11.7620666" cy="11.3028534" rx="1.19660612" ry="1.05282049"></ellipse>
<path d="M5.98363411,5.98372675 C5.98363411,5.98372675 -3.10803382,10.8325559 1.55745754,23.6617335" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M3.47197579,3.45150076 C3.47197579,3.45150076 0.38764407,7.10864896 1.46264913,11.0113464" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M3.80151148,12.9166546 C3.80151148,12.9166546 1.28373648,15.292343 0.384585735,14.9915452" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M10.5849004,13.7799134 C10.5849004,13.7799134 7.40958321,19.9017616 5.1976418,22.8291683" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M11.5865054,17.4002293 L7.90197528,18.4982945" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
</g>
<g transform="translate(0.000000, 59.852614)">
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="2.93370867" cy="1.50782548" rx="1.04977378" ry="1.05355948"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="1.46494288" cy="5.93154755" rx="1.04977378" ry="1.05355948"></ellipse>
<ellipse id="Oval" fill="#FF7A71" fill-rule="nonzero" cx="6.7138118" cy="10.7773073" rx="1.04977378" ry="1.05355948"></ellipse>
<path d="M3.98348246,5.51027723 C3.98348246,5.51027723 13.0109253,5.30079308 14.8986831,18.7829781" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M8.07706501,9.82964089 C8.07706501,9.82964089 10.0695708,8.67095567 11.750891,10.1450181" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
<path d="M4.82376024,2.24600772 C4.82376024,2.24600772 8.49758619,4.24646625 9.12760338,7.19766055" id="Shape" stroke="#8CB3FE" stroke-width="0.5612"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 137 KiB

View File

@@ -0,0 +1,13 @@
<svg width="274" height="199" viewBox="0 0 274 199" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.5" d="M57.9111 49.2668L202.769 30" stroke="#F2F2F2" stroke-width="59" stroke-linecap="round"/>
<path opacity="0.5" d="M39.2842 92.7371L244.24 64.886" stroke="#F2F2F2" stroke-width="59" stroke-linecap="round"/>
<path opacity="0.5" d="M30 136.299L232.813 107.734" stroke="#F2F2F2" stroke-width="59" stroke-linecap="round"/>
<path opacity="0.5" d="M86.4541 169.149L234.166 150.596" stroke="#F2F2F2" stroke-width="59" stroke-linecap="round"/>
<path d="M167.829 69.1349H96.458L117.605 51.9531H183.028L167.829 69.1349Z" fill="#C0D5FF"/>
<path d="M171.133 70.4566H92.4933V85.6559V143.149H171.133V70.4566Z" fill="#E8F4FF"/>
<path d="M190.298 48.6489L171.133 70.4566L186.993 94.9076L192.28 89.9514L206.818 73.7608L190.298 48.6489Z" fill="#E8F4FF"/>
<path d="M171.133 70.4566V143.149L192.28 118.037V89.9514L186.993 94.9076L171.133 70.4566Z" fill="#E8F4FF"/>
<path d="M92.4933 70.4566L81.9199 89.9514L92.4933 85.6559V70.4566Z" fill="#E8F4FF"/>
<path d="M92.4933 70.4566H171.133M92.4933 70.4566L118.927 48.6489H190.298M92.4933 70.4566L81.9199 89.9514L92.4933 85.6559M92.4933 70.4566V85.6559M171.133 70.4566V143.149M171.133 70.4566L190.298 48.6489M171.133 70.4566L186.993 94.9076L192.28 89.9514M171.133 143.149H92.4933V85.6559M171.133 143.149L192.28 118.037V89.9514M190.298 48.6489L206.818 73.7608L192.28 89.9514" stroke="black" stroke-width="3" stroke-linejoin="round"/>
<path d="M117.605 89.6208H147.343" stroke="black" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -0,0 +1,3 @@
The illustrations shared in this folder are covered by the CC-BY-SA-NC-ND License v4.0 (or newer). You are allowed to use them when using unmodified versions of the Redash source code for non-commercial purposes (meaning for yourself), but you are not allowed to use for any other use or to distribute them as part of your software or fork of Redash.
For any questions, please contact us.

View File

@@ -0,0 +1,414 @@
@import "~antd/lib/style/core/iconfont";
@import "~antd/lib/style/core/motion";
@import "~antd/lib/alert/style/index";
@import "~antd/lib/input/style/index";
@import "~antd/lib/input-number/style/index";
@import "~antd/lib/date-picker/style/index";
@import "~antd/lib/modal/style/index";
@import "~antd/lib/tooltip/style/index";
@import "~antd/lib/select/style/index";
@import "~antd/lib/checkbox/style/index";
@import "~antd/lib/upload/style/index";
@import "~antd/lib/form/style/index";
@import "~antd/lib/button/style/index";
@import "~antd/lib/radio/style/index";
@import "~antd/lib/time-picker/style/index";
@import "~antd/lib/pagination/style/index";
@import "~antd/lib/table/style/index";
@import "~antd/lib/popover/style/index";
@import "~antd/lib/tag/style/index";
@import "~antd/lib/grid/style/index";
@import "~antd/lib/switch/style/index";
@import "~antd/lib/empty/style/index";
@import "~antd/lib/drawer/style/index";
@import "~antd/lib/card/style/index";
@import "~antd/lib/steps/style/index";
@import "~antd/lib/divider/style/index";
@import "~antd/lib/dropdown/style/index";
@import "~antd/lib/menu/style/index";
@import "~antd/lib/list/style/index";
@import "~antd/lib/badge/style/index";
@import "~antd/lib/card/style/index";
@import "~antd/lib/spin/style/index";
@import "~antd/lib/skeleton/style/index";
@import "~antd/lib/tabs/style/index";
@import "~antd/lib/notification/style/index";
@import "~antd/lib/collapse/style/index";
@import "~antd/lib/progress/style/index";
@import "~antd/lib/typography/style/index";
@import "~antd/lib/descriptions/style/index";
@import "inc/ant-variables";
// Increase z-indexes to avoid conflicts with some other libraries (e.g. Plotly)
@zindex-modal: 2000;
@zindex-modal-mask: 2000;
@zindex-message: 2010;
@zindex-notification: 2010;
@zindex-popover: 2030;
@zindex-dropdown: 2050;
@zindex-picker: 2050;
@zindex-tooltip: 2060;
@item-hover-bg: #e5f8ff;
.@{drawer-prefix-cls} {
&.help-drawer {
z-index: @zindex-tooltip; // help drawer should be topmost
}
}
// Remove bold in labels for Ant checkboxes and radio buttons
.ant-checkbox-wrapper,
.ant-radio-wrapper {
font-weight: normal;
}
.ant-select-dropdown-menu-item em {
color: @input-color-placeholder;
font-size: 11px;
}
// Fix for disabled button styles inside Tooltip component.
// Tooltip wraps disabled buttons with `<span>` and moves all styles
// and classes to that `<span>`. This resets all button styles and
// turns it into simple inline element (because now it's wrapper is a button)
.btn {
button[disabled] {
-moz-appearance: none !important;
-webkit-appearance: none !important;
appearance: none !important;
border: 0 !important;
outline: none !important;
background: transparent !important;
margin: 0 !important;
padding: 0 !important;
}
}
// Button overrides
.@{btn-prefix-cls} {
transition-duration: 150ms;
&.icon-button {
width: 32px;
padding: 0 10px;
}
}
// Fix ant input number showing duplicate arrows
.ant-input-number-input::-webkit-outer-spin-button,
.ant-input-number-input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
// Pagination overrides (based on existing Bootstrap overrides)
.@{pagination-prefix-cls} {
display: inline-block;
margin-top: 18px;
margin-bottom: 18px;
vertical-align: top;
&-item {
background-color: @pagination-bg;
border-color: transparent;
color: @pagination-color;
font-size: 14px;
margin-right: 5px;
a {
color: inherit;
}
&:focus,
&:hover {
background-color: @pagination-hover-bg;
border-color: transparent;
color: @pagination-hover-color;
a {
color: inherit;
}
}
&-active {
&,
&:hover,
&:focus {
background-color: @pagination-active-bg;
color: @pagination-active-color;
border-color: transparent;
pointer-events: none;
cursor: default;
a {
color: inherit;
}
}
}
}
&-disabled {
&,
&:hover,
&:focus {
opacity: 0.5;
pointer-events: none;
}
}
&-prev,
&-next {
.@{pagination-prefix-cls}-item-link {
background-color: @pagination-bg;
border-color: transparent;
color: @pagination-color;
line-height: @pagination-item-size - 2px;
.@{pagination-prefix-cls}.mini & {
line-height: @pagination-item-size-sm - 2px;
}
}
&:focus .@{pagination-prefix-cls}-item-link,
&:hover .@{pagination-prefix-cls}-item-link {
background-color: @pagination-hover-bg;
border-color: transparent;
color: @pagination-hover-color;
}
}
&-prev,
&-jump-prev,
&-jump-next {
margin-right: 5px;
}
&-jump-prev,
&-jump-next {
.@{pagination-prefix-cls}-item-container {
.@{pagination-prefix-cls}-item-link-icon {
color: @pagination-color;
}
}
}
}
// Table
.@{table-prefix-cls} {
color: inherit;
tr,
th,
td {
transition: none !important;
}
&-thead > tr > th {
padding: @table-padding-vertical * 2 @table-padding-horizontal;
}
.@{table-prefix-cls}-column-sorters {
&:before,
&:hover:before {
content: none;
}
}
&-thead > tr > th {
.@{table-prefix-cls}-column-sorter {
&-up,
&-down {
&.on {
color: @table-header-icon-active-color;
}
}
}
}
// Custom styles
&-headerless &-tbody > tr:first-child > td {
border-top: @border-width-base @border-style-base @border-color-split;
}
}
// List
.@{list-prefix-cls} {
&-item {
// custom rule
&.selected {
background-color: #f6f8f9;
}
&.disabled {
background-color: fade(#f6f8f9, 40%);
& > * {
opacity: 0.4;
}
}
}
}
.@{dialog-prefix-cls} {
// styling for short modals (no lines)
&.shortModal {
.@{dialog-prefix-cls} {
&-header,
&-footer {
border: none;
padding: 16px;
}
&-body {
padding: 10px 16px;
}
&-close-x {
width: 46px;
height: 46px;
line-height: 46px;
}
}
}
// fullscreen modals
&-fullscreen {
.@{dialog-prefix-cls} {
position: absolute;
left: 15px;
top: 15px;
right: 15px;
bottom: 15px;
width: auto !important;
height: auto !important;
max-width: none;
max-height: none;
margin: 0;
padding: 0;
.@{dialog-prefix-cls}-content {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
width: auto;
height: auto;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
.@{dialog-prefix-cls}-body {
flex: 1 1 auto;
overflow: auto;
}
}
}
}
// description in modal header
.modal-header-desc {
font-size: @font-size-base;
color: @text-color-secondary;
font-weight: normal;
margin-top: 4px;
}
// Notification overrides
.@{notification-prefix-cls} {
// vertical centering
&-notice-close {
top: 20px;
right: 20px;
}
&-notice-description {
max-width: 484px;
}
}
.@{btn-prefix-cls} .@{iconfont-css-prefix}-ellipsis {
margin: 0 -7px 0 -8px;
}
// Collapse
.@{collapse-prefix-cls} {
&&-headerless {
border: 0;
background: none;
.@{collapse-prefix-cls}-header {
display: none;
}
.@{collapse-prefix-cls}-item,
.@{collapse-prefix-cls}-content {
border: 0;
}
.@{collapse-prefix-cls}-content-box {
padding: 0;
}
}
}
// overrides for tall form components such as ace editor
.@{form-prefix-cls}-item {
&-children {
display: block; // so feeback icon positions correctly
}
// no change for short components, sticks to body for tall ones
&-children-icon {
top: auto !important;
bottom: 8px;
// makes the icon white instead of see-through
& svg {
background: white;
border-radius: 50%;
}
}
// for form items that contain text
&.form-item-line-height-normal .@{form-prefix-cls}-item-control {
line-height: 20px;
margin-top: 9px;
}
}
.@{menu-prefix-cls} {
// invert stripe position with class .invert-stripe-position
&-inline.invert-stripe-position {
.@{menu-prefix-cls}-item {
&::after {
right: auto;
left: 0;
}
}
}
}
// overrides for checkbox
@checkbox-prefix-cls: ~"@{ant-prefix}-checkbox";
.@{checkbox-prefix-cls}-wrapper + span,
.@{checkbox-prefix-cls} + span {
padding-right: 0;
}
// make sure Multiple select has room for icons
.@{select-prefix-cls}-multiple {
&.@{select-prefix-cls}-show-arrow,
&.@{select-prefix-cls}-show-search,
&.@{select-prefix-cls}-loading {
.@{select-prefix-cls}-selector {
padding-right: 30px;
}
}
}

View File

@@ -1,7 +1,25 @@
.ace_editor { .ace_editor {
border: 1px solid #eee; border: 1px solid fade(@redash-gray, 15%);
height: 100%; height: 100%;
margin-bottom: 10px; margin-bottom: 10px;
&.ace_autocomplete .ace_completion-highlight {
text-shadow: none !important;
background: #ffff005e;
font-weight: 600;
}
&.ace-tm {
.ace_gutter {
background: #fff !important;
}
.ace_gutter-active-line {
background-color: fade(@redash-gray, 20%) !important;
}
.ace_marker-layer .ace_active-line {
background: fade(@redash-gray, 9%) !important;
}
}
} }

View File

@@ -1,45 +1,49 @@
.alert { .alert-page h3 {
padding-left: 30px; flex-grow: 1;
padding-right: 30px;
input {
span { margin: -0.2em 0;
cursor: pointer; width: 100%;
} min-width: 170px;
}
} }
.alert-dismissable, .btn-create-alert[disabled] {
.alert-dismissible { display: block;
padding-right: 44px; margin-top: -20px;
}
.alert-inverse {
.alert-variant(@alert-inverse-bg; @alert-inverse-border; @alert-inverse-text);
} }
.alert-link { .alert-state {
color: #fff !important; border-bottom: 1px solid @input-border;
font-weight: normal !important; padding-bottom: 30px;
text-decoration: underline;
.alert-state-indicator {
text-transform: uppercase;
font-size: 14px;
padding: 5px 8px;
}
.ant-form-item-explain {
margin-top: 10px;
}
.alert-last-triggered {
color: @headings-color;
}
} }
.growl-animated { .alert-query-selector {
&.alert-inverse { min-width: 250px;
box-shadow: 0 0 5px fade(@alert-inverse-bg, 50%); width: auto !important;
} }
&.alert-info { // allow form item labels to gracefully break line
box-shadow: 0 0 5px fade(@alert-info-bg, 50%); .alert-form-item label {
} white-space: initial;
padding-right: 8px;
&.alert-success { line-height: 21px;
box-shadow: 0 0 5px fade(@alert-success-bg, 50%);
} &::after {
margin-right: 0 !important;
&.alert-warning { }
box-shadow: 0 0 5px fade(@alert-warning-bg, 50%);
}
&.alert-danger {
box-shadow: 0 0 5px fade(@alert-danger-bg, 50%);
}
} }

View File

@@ -1,8 +0,0 @@
a[ng-click] {
cursor: pointer;
}
/* Immediately apply ng-cloak, instead of waiting for angular.js to load: */
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
}

View File

@@ -0,0 +1,76 @@
/* --------------------------------------------------------
Colors
-----------------------------------------------------------*/
@lightblue: #03a9f4;
@primary-color: #2196f3;
@redash-gray: rgba(102, 136, 153, 1);
@redash-orange: rgba(255, 120, 100, 1);
@redash-black: rgba(0, 0, 0, 1);
@redash-yellow: rgba(252, 252, 161, 0.75);
/* --------------------------------------------------------
Font
-----------------------------------------------------------*/
@redash-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",
sans-serif;
@font-family-no-number: @redash-font;
@font-family: @redash-font;
@code-family: @redash-font;
@font-size-base: 13px;
/* --------------------------------------------------------
Borders
-----------------------------------------------------------*/
@border-color-split: #f0f0f0;
/* --------------------------------------------------------
Typograpgy
-----------------------------------------------------------*/
@text-color: #595959;
/* --------------------------------------------------------
Form
-----------------------------------------------------------*/
@input-height-base: 35px;
@input-color: #595959;
@input-color-placeholder: #b4b4b4;
@border-radius-base: 2px;
@border-color-base: #e8e8e8;
/* --------------------------------------------------------
Pagination
-----------------------------------------------------------*/
@pagination-item-size: 33px;
@pagination-font-family: @redash-font;
@pagination-font-weight-active: normal;
@pagination-bg: fade(@redash-gray, 15%);
@pagination-color: #7e7e7e;
@pagination-active-bg: @lightblue;
@pagination-active-color: #fff;
@pagination-disabled-bg: fade(@redash-gray, 15%);
@pagination-hover-color: #333;
@pagination-hover-bg: fade(@redash-gray, 25%);
/* --------------------------------------------------------
Table
-----------------------------------------------------------*/
@table-border-radius-base: 0;
@table-header-color: #333;
@table-header-bg: fade(@redash-gray, 3%);
@table-header-icon-color: fade(@text-color, 20%);
@table-header-icon-active-color: @text-color;
@table-header-sort-bg: @table-header-bg;
@table-header-sort-active-bg: @table-header-bg;
@table-header-filter-active-bg: @table-header-bg;
@table-body-sort-bg: transparent;
@table-row-hover-bg: fade(@redash-gray, 5%);
@table-padding-vertical: 7px;
@table-padding-horizontal: 10px;
/* --------------------------------------------------------
Notification
-----------------------------------------------------------*/
@notification-padding: @notification-padding-vertical 48px @notification-padding-vertical 17px;
@notification-width: auto;

View File

@@ -1,74 +1,227 @@
*, button, input, i, a { *,
-webkit-font-smoothing: antialiased; button,
input,
i,
a {
-webkit-font-smoothing: antialiased;
} }
*, *,
*:active, *:active,
*:hover { *:hover {
outline: none !important; outline: none !important;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important; -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
} }
html { html {
overflow-x: ~"hidden\0/"; overflow-x: ~"hidden\0/";
-ms-overflow-style: auto; -ms-overflow-style: auto;
} }
html, body { html,
min-height: 100vh; body {
min-height: 100vh;
} }
body { body {
padding-top: @header-height; padding-top: 0;
position: relative; background: #f6f8f9;
padding-bottom: @footer-height; font-family: @redash-font;
&.headless { position: relative;
padding-top: 0;
padding-bottom: 0; #application-root {
.nav.app-header { padding-bottom: 15px;
display: none; }
} }
div#footer {
display: none; #application-root {
} min-height: 100vh;
} }
#application-root,
#app-content {
display: flex;
flex-direction: column;
flex-grow: 1;
} }
strong { strong {
font-weight: 500; font-weight: 500;
} }
#content { #content {
position: relative; position: relative;
padding-top: 30px; padding-top: 30px;
padding-bottom: 30px; padding-bottom: 30px;
@media (min-width: (@screen-sm-min + 1)) { @media (min-width: (@screen-sm-min + 1)) {
padding-right: 15px; padding-right: 15px;
padding-left: 15px; padding-left: 15px;
} }
@media (min-width: (@screen-lg-min + 80px)) { @media (min-width: (@screen-lg-min + 80px)) {
margin-left: @sidebar-left-width; margin-left: @sidebar-left-width;
} }
@media (min-width: @screen-sm-min) and (max-width: (@screen-md-max + 80px)) { @media (min-width: @screen-sm-min) and (max-width: (@screen-md-max + 80px)) {
margin-left: @sidebar-left-mid-width; margin-left: @sidebar-left-mid-width;
} }
@media (max-width: (@screen-sm-min)) { @media (max-width: (@screen-sm-min)) {
margin-left: 0; margin-left: 0;
} }
} }
.container { .container {
&.c-boxed { &.c-boxed {
max-width: @boxed-width; max-width: @boxed-width;
} }
}
.settings-screen,
.home-page,
.page-dashboard-list,
.page-queries-list,
.page-alerts-list,
.alert-page,
.admin-page-layout {
.container {
width: 100%;
max-width: none;
}
} }
.scrollbox { .scrollbox {
overflow: auto; overflow: auto;
position: relative; position: relative;
}
.clickable {
cursor: pointer;
}
.resize-vertical {
resize: vertical !important;
transition: height 0s !important;
}
.resize-horizontal {
resize: horizontal !important;
transition: width 0s !important;
}
.resize-both,
.resize-vertical.resize-horizontal {
resize: both !important;
transition: height 0s, width 0s !important;
}
.bg-ace {
background-color: fade(@redash-gray, 12%) !important;
}
// resizeable
.rg-top span,
.rg-bottom span {
height: 3px;
border-color: #b1c1ce; // TODO: variable
}
.rg-bottom {
bottom: 15px;
span {
margin: 1.5px 0 0 -10px;
}
}
// Plotly
text.slicetext {
text-shadow: 1px 1px 5px #333;
}
// markdown
.markdown strong {
font-weight: bold;
}
.markdown img {
max-width: 100%;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: fade(@redash-gray, 15%);
color: #111;
}
.profile__image--sidebar {
border-radius: 100%;
margin-right: 3px;
margin-top: -2px;
}
.profile__image--settings {
border-radius: 100%;
}
.profile__image_thumb {
border-radius: 100%;
margin-right: 3px;
margin-top: -2px;
width: 20px;
height: 20px;
}
// Error state
.error-state {
display: flex;
flex-direction: column;
justify-content: flex-start;
text-align: center;
margin-top: 25vh;
padding: 35px;
font-size: 14px;
line-height: 21px;
.error-state__icon {
.zmdi {
font-size: 64px;
color: @redash-gray;
}
}
@media (max-width: 767px) {
margin-top: 10vh;
}
}
.warning-icon-danger {
color: @red !important;
}
// page
.page-title {
display: flex;
align-items: center;
.label {
margin-top: 3px;
display: inline-block;
}
.favorites-control {
font-size: 19px;
margin-right: 10px;
}
}
.page-header--new {
h3 {
margin: 0.2em 0;
line-height: 1.3;
font-weight: 500;
}
}
.select-option-divider {
margin: 10px 0 !important;
} }

View File

@@ -31,7 +31,7 @@
.collapsing, .collapsing,
.collapse.in { .collapse.in {
padding: 5px 10px; padding: 0;
transition: all 0.35s ease; transition: all 0.35s ease;
} }
@@ -40,3 +40,10 @@
vertical-align: top; vertical-align: top;
margin-left: 0; margin-left: 0;
} }
// Hide URLs next to links when printing (override `bootstrap` rules)
@media print {
a[href]:after {
content: none !important;
}
}

View File

@@ -122,3 +122,21 @@
top: 1px; top: 1px;
position: relative; position: relative;
} }
.btn-default {
background-color: fade(@redash-gray, 15%);
}
.btn-transparent {
background-color: transparent !important;
}
.btn-default:hover, .btn-default:focus, .btn-default.focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default {
background-color: fade(@redash-gray, 25%);
}
.btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus {
color: #333;
background-color: fade(@redash-gray, 45%);
}

View File

@@ -1,75 +0,0 @@
.contacts {
&:not(.c-profile) {
padding: 0 3px;
}
& > [class*="col-"] {
padding: 0 10px;
}
.c-item {
border: 1px solid #e2e2e2;
border-radius: 2px;
margin-bottom: 24px;
.ci-avatar {
display: block;
img {
width: 100%;
border-radius: 2px 2px 0 0;
}
}
}
.ci-avatar {
margin: -1px -1px 0;
}
.c-info {
text-align: center;
margin-top: 15px;
padding: 0 5px;
strong {
color: #000;
font-size: 14px;
font-weight: 500;
}
small {
color: #999;
margin-top: 3px;
}
strong,
small {
.text-overflow();
display: block;
}
}
.c-footer {
border-top: 1px solid #e2e2e2;
margin-top: 18px;
& > button {
padding: 4px 10px 3px;
color: #333;
display: block;
width: 100%;
text-align: center;
color: #333;
font-weight: 500;
border-radius: 2px;
background: #fff;
border: 0;
& > i {
font-size: 16px;
vertical-align: middle;
margin-top: -3px;
}
}
}
}

View File

@@ -11,6 +11,7 @@
// The real magic ;) // The real magic ;)
> a { > a {
pointer-events: none; pointer-events: none;
color: @dropdown-link-disabled-color;
} }
} }
@@ -29,8 +30,6 @@
&:not([class*="bg-"]) { &:not([class*="bg-"]) {
& > li > a { & > li > a {
color: #4C4C4C;
&:hover { &:hover {
color: #000; color: #000;
} }

View File

@@ -7,6 +7,7 @@
} }
.edit-in-place span.editable { .edit-in-place span.editable {
display: inline-block;
cursor: pointer; cursor: pointer;
} }
@@ -15,15 +16,6 @@
border-radius: @redash-radius; border-radius: @redash-radius;
} }
.edit-in-place input,
.edit-in-place textarea {
display: none;
}
.edit-in-place.active span {
display: none;
}
.edit-in-place.active input, .edit-in-place.active input,
.edit-in-place.active textarea { .edit-in-place.active textarea {
display: inline-block; display: inline-block;
@@ -32,32 +24,3 @@
.edit-in-place { .edit-in-place {
display: inline-block; display: inline-block;
} }
.edit-in-place {
.rd-form-control {
padding: 0px 6px;
width: 30vw;
}
&.active {
textarea.rd-form-control {
height: 29px;
width: 40vw;
}
}
}
@media (max-width: 880px) {
.edit-in-place {
.rd-form-control {
width: 50vw;
}
&.active {
textarea.rd-form-control {
width: 50vw;
}
}
}
}

View File

@@ -1,48 +0,0 @@
#footer {
position: absolute;
bottom: 0;
text-align: center;
width: 100%;
height: @footer-height;
color: #a2a2a2;
padding-top: 10px;
padding-bottom: 15px;
.f-menu {
display: block;
width: 100%;
.list-inline();
margin-top: 8px;
& > li > a {
color: #a2a2a2;
&:hover {
color: #777;
}
}
}
@media (min-width: (@screen-lg-min + 80px)) {
padding-left: (@sidebar-left-width + @grid-gutter-width);
}
@media (min-width: @screen-sm-min) and (max-width: (@screen-md-max + 80px)) {
padding-left: (@sidebar-left-mid-width + @grid-gutter-width);
}
@media (max-width: (@screen-sm-min)) {
padding-left: @grid-gutter-width/2;
}
}
.footer {
color: #818d9f;
padding-bottom: 30px;
a {
color: #818d9f;
margin-left: 20px;
}
}

View File

@@ -1,9 +1,9 @@
label { label {
font-weight: 500; font-weight: 500;
} }
textarea.v-resizable { textarea.v-resizable {
resize: vertical; resize: vertical;
} }
.form-group { .form-group {
@@ -29,282 +29,266 @@ textarea.v-resizable {
} }
} }
/* light version of bootstrap's form-control */
.rd-form-control {
display: block;
padding: 6px 12px;
line-height: 1.428571429;
color: #555555;
vertical-align: middle;
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
width: 90%;
}
/* -------------------------------------------------------- /* --------------------------------------------------------
Input Fields Input Fields
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.form-control { .form-control {
.transition(all); .transition(all);
.transition-duration(300ms); .transition-duration(300ms);
resize: none; resize: none;
box-shadow: 0 0 0 40px rgba(0, 0, 0, 0) !important; box-shadow: 0 0 0 40px rgba(0, 0, 0, 0) !important;
border-radius: 0; border-radius: @redash-input-radius;
&:focus { &:focus {
box-shadow: 0 0 1px -2px rgba(121,194,255,0.5) !important; box-shadow: none !important;
} border-color: @blue;
}
&:hover {
border-color: @blue;
}
} }
/* -------------------------------------------------------- /* --------------------------------------------------------
Custom Checkbox + Radio Custom Checkbox + Radio
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.cra-validatation(@color) { .cra-validatation(@color) {
input[type="checkbox"], input[type="radio"] { input[type="checkbox"],
& + .input-helper { input[type="radio"] {
border-color: @color; & + .input-helper {
} border-color: @color;
&:checked + .input-helper:before {
background: @color;
}
} }
&:checked + .input-helper:before {
background: @color;
}
}
} }
.cr-alt { .cr-alt {
position: relative;
padding-top: 0;
margin: 0;
label {
position: relative; position: relative;
padding-top: 0; padding-left: 28px;
}
&.has-success {
.cra-validatation(@green);
}
&.has-warning {
.cra-validatation(@orange);
}
&.has-error {
.cra-validatation(@red);
}
input[type="checkbox"],
input[type="radio"] {
.opacity(0);
width: 20px;
height: 20px;
position: absolute;
z-index: 10;
margin: 0; margin: 0;
top: 0;
left: 0;
cursor: pointer;
label { & + .input-helper {
position: relative; border: 1px solid @input-border;
padding-left: 28px; width: 19px;
height: 19px;
background: #fff;
position: absolute;
left: 0;
top: -1px;
cursor: pointer;
} }
&.has-success { &:checked + .input-helper:before {
.cra-validatation(@green); content: "";
width: 9px;
height: 9px;
background: #31acff;
position: absolute;
left: 4px;
top: 4px;
}
}
input[type="radio"] {
& + i {
border-radius: 50%;
} }
&.has-warning { &:checked + i:before {
.cra-validatation(@orange); border-radius: 50%;
} }
}
&.has-error { &.disabled {
.cra-validatation(@red); .opacity(0.7);
}
}
input[type="checkbox"], input[type="radio"] {
.opacity(0);
width: 20px;
height: 20px;
position: absolute;
z-index: 10;
margin: 0;
top: 0;
left: 0;
cursor: pointer;
& + .input-helper {
border: 1px solid @input-border;
width: 19px;
height: 19px;
background: #fff;
position: absolute;
left: 0;
top: -1px;
cursor: pointer;
}
&:checked + .input-helper:before {
content: "";
width: 9px;
height: 9px;
background: #31ACFF;
position: absolute;
left: 4px;
top: 4px;
}
}
input[type="radio"] {
& + i {
border-radius: 50%;
}
&:checked + i:before {
border-radius: 50%;
}
}
&.disabled {
.opacity(0.7);
}
} }
.checkbox-inline, .checkbox-inline,
.radio-inline { .radio-inline {
padding-left: 27px; padding-left: 27px;
} }
/* -------------------------------------------------------- /* --------------------------------------------------------
Input Addon Input Addon
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.input-group { .input-group {
.input-group-addon {
min-width: 40px;
color: #333;
padding: 0;
}
&:not([class*="input-group-"]) {
.input-group-addon { .input-group-addon {
min-width: 40px; font-size: 15px;
color: #333;
padding: 0;
}
&:not([class*="input-group-"]) {
.input-group-addon {
font-size: 15px;
}
} }
}
} }
/* -------------------------------------------------------- /* --------------------------------------------------------
Toggle Switch Toggle Switch
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.ts-color(@color){ .ts-color(@color) {
input { input {
&:not(:disabled) { &:not(:disabled) {
&:checked { &:checked {
& + .ts-helper { & + .ts-helper {
background: fade(@color, 50%); background: fade(@color, 50%);
&:before { &:before {
background: @color; background: @color;
} }
&:active { &:active {
&:before { &:before {
box-shadow: 0 2px 8px rgba(0,0,0,0.28), 0 0 0 20px fade(@color, 20%); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.28), 0 0 0 20px fade(@color, 20%);
}
}
}
} }
}
} }
}
} }
}
} }
.toggle-switch { .toggle-switch {
display: inline-block;
vertical-align: top;
.user-select(none);
.ts-label {
display: inline-block; display: inline-block;
margin: 0 20px 0 0;
vertical-align: top; vertical-align: top;
.user-select(none); -webkit-transition: color 0.56s cubic-bezier(0.4, 0, 0.2, 1);
transition: color 0.56s cubic-bezier(0.4, 0, 0.2, 1);
}
.ts-label { .ts-helper {
display: inline-block; display: inline-block;
margin: 0 20px 0 0; position: relative;
vertical-align: top; width: 40px;
-webkit-transition: color 0.56s cubic-bezier(0.4, 0, 0.2, 1); height: 16px;
transition: color 0.56s cubic-bezier(0.4, 0, 0.2, 1); border-radius: 8px;
background: rgba(0, 0, 0, 0.26);
-webkit-transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
vertical-align: middle;
cursor: pointer;
&:before {
content: "";
position: absolute;
top: -4px;
left: -4px;
width: 24px;
height: 24px;
background: #fafafa;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.28);
border-radius: 50%;
webkit-transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
} }
}
&:not(.disabled) {
.ts-helper { .ts-helper {
display: inline-block; &:active {
position: relative;
width: 40px;
height: 16px;
border-radius: 8px;
background: rgba(0,0,0,0.26);
-webkit-transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
vertical-align: middle;
cursor: pointer;
&:before { &:before {
content: ''; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.28), 0 0 0 20px rgba(128, 128, 128, 0.1);
position: absolute;
top: -4px;
left: -4px;
width: 24px;
height: 24px;
background: #fafafa;
box-shadow: 0 2px 8px rgba(0,0,0,0.28);
border-radius: 50%;
webkit-transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
transition: left 0.28s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);
} }
}
} }
}
&:not(.disabled) { input {
.ts-helper { position: absolute;
&:active { z-index: 1;
&:before { width: 46px;
box-shadow: 0 2px 8px rgba(0,0,0,0.28), 0 0 0 20px rgba(128,128,128,0.1); margin: 0 0 0 -4px;
} height: 24px;
} .opacity(0);
cursor: pointer;
&:checked {
& + .ts-helper {
&:before {
left: 20px;
} }
}
} }
}
input { &:not([data-ts-color]) {
position: absolute; .ts-color(@teal);
z-index: 1; }
width: 46px;
margin: 0 0 0 -4px;
height: 24px;
.opacity(0);
cursor: pointer;
&:checked { &.disabled {
& + .ts-helper { .opacity(0.6);
&:before { }
left: 20px;
}
}
}
}
&:not([data-ts-color]){ &[data-ts-color="red"] {
.ts-color(@teal); .ts-color(@red);
} }
&.disabled { &[data-ts-color="blue"] {
.opacity(0.6); .ts-color(@blue);
} }
&[data-ts-color="red"] { &[data-ts-color="amber"] {
.ts-color(@red); .ts-color(@amber);
} }
&[data-ts-color="blue"] { &[data-ts-color="purple"] {
.ts-color(@blue); .ts-color(@purple);
} }
&[data-ts-color="amber"] { &[data-ts-color="pink"] {
.ts-color(@amber); .ts-color(@pink);
} }
&[data-ts-color="purple"] { &[data-ts-color="lime"] {
.ts-color(@purple); .ts-color(@lime);
} }
&[data-ts-color="pink"] { &[data-ts-color="cyan"] {
.ts-color(@pink); .ts-color(@cyan);
} }
&[data-ts-color="lime"] {
.ts-color(@lime);
}
&[data-ts-color="cyan"] {
.ts-color(@cyan);
}
&[data-ts-color="green"] {
.ts-color(@green);
}
&[data-ts-color="green"] {
.ts-color(@green);
}
} }

View File

@@ -76,6 +76,8 @@
.font-size(20, 8px, 8); .font-size(20, 8px, 8);
.f-inherit { font-size: inherit !important; }
/* -------------------------------------------------------- /* --------------------------------------------------------
Font Weight Font Weight
@@ -146,9 +148,17 @@
Width Width
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.w-100 { width: 100% !important; } .w-100 { width: 100% !important; }
.w-50 { width: 50% !important; }
.w-25 { width: 25% !important; }
/* -------------------------------------------------------- /* --------------------------------------------------------
Border Radius Border Radius
-----------------------------------------------------------*/ -----------------------------------------------------------*/
.brd-2 { border-radius: 2px; } .brd-2 { border-radius: 2px; }
/* --------------------------------------------------------
Alignment
-----------------------------------------------------------*/
.va-top { vertical-align: top; }

View File

@@ -1,29 +0,0 @@
.gridster .preview-holder {
border: none !important;
border-radius: 0 !important;
background: rgba(0, 0, 0, 0.5) !important;
}
.gridster li .heading {
border: #ddd;
background-color: #f5f5f5;
padding: 5px;
}
li.widget {
/*background-color:grey;*/
border-width: 1px;
border-style: solid;
border-color: grey;
opacity: 0.7;
cursor: move;
&:hover {
opacity: 1.0 !important;
-webkit-transition: opacity .6s;
-moz-transition: opacity .6s;
-o-transition: opacity .6s;
-ms-transition: opacity .6s;
transition: opacity .6s;
}
}

View File

@@ -1,28 +0,0 @@
/* angular-growl */
.growl {
position: fixed;
bottom: 10px;
right: 10px;
float: right;
width: 250px;
z-index: 10000;
}
.growl-item.ng-enter,
.growl-item.ng-leave {
-webkit-transition: 0.5s linear all;
-moz-transition: 0.5s linear all;
-o-transition: 0.5s linear all;
transition: 0.5s linear all;
}
.growl-item.ng-enter,
.growl-item.ng-leave.ng-leave-active {
opacity: 0;
}
.growl-item.ng-leave,
.growl-item.ng-enter.ng-enter-active {
opacity: 1;
}

Some files were not shown because too many files have changed in this diff Show More