Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include table visualization in pulses and alerts #7022

Merged
merged 3 commits into from Mar 2, 2018
Merged

Conversation

senior
Copy link
Contributor

@senior senior commented Feb 26, 2018

If the query result is a table visualization show the first 20 rows
and 10 columns. If there are more than 20 rows or 10 columns, include
a CSV that has the full resultset.

Backend TODO

  • Limit attached results to 2000
  • Ensure message sending exceptions are bubbled up
  • Hide "only in detail views" and fields that are of a special_type "description"
  • Fix issue with SQL questions failing to preview
  • Hide the attachment notification text from slacks
  • Add truncated column information along with truncated row info
  • Apply numeric specific style to numeric columns (headings and data cells)

Frontend TODO

  • Show errors when sending emails fails
  • Fixup integ test failures
  • In PulseEditCards.jsx, add logic to show a notice/warning when a table is larger than either 20 rows or 10 columns to say, "[head]Heads up[\head] [body]We'll display part of this table in your Pulse, and add a file attachment with more results, up to 2,000 rows."
  • Because we're automatically including a file attachment when there are more than 10 cols or 20 rows, in PulseEditCards.jsx in this state the UI should show the file attachment options automatically for this card, and disable or hide the paperclip icon (to make it clear that the file attachment is going to happen automatically for this question).

Design/CSS to-dos:

  • Fix: tables in Gmail on desktop are getting cut off without horizontal scrolling.
  • Finish table styling
  • Truncate wide columns
  • Fix the attachment options colliding with card previews
  • Fix the footer centering

@senior senior requested a review from mazameli February 26, 2018 16:49
@senior senior force-pushed the pulse-tables branch 5 times, most recently from 76931e1 to 993135d Compare February 26, 2018 22:55
@mazameli
Copy link
Contributor

  1. It appears that my CSS hasn't been applied to the tables yet, right?

screen shot 2018-02-26 at 2 54 54 pm

  1. I couldn't get test email pulses to send when I included a table with 27,000 rows, but it did work with a test Slack pulse.

  2. I think we need to either let long cells go wider, and/or cut them off after a certain character length rather than let them wrap:

screen shot 2018-02-26 at 2 33 24 pm

  1. The file attachment option in the Pulse creation form counted on the cards being a fixed width so the options could be placed in a fixed position. Right now, they're colliding with the table preview. We could either A) show table previews differently, or B) reposition the file attachment options somewhere. I'll take ownership of this one.

screen shot 2018-02-26 at 2 24 14 pm

  1. The Pulse edit form was having troubles with a small SQL question. The card preview just spins indefinitely. I was getting a 500 error from /api/pulse/preview_card_info/. This happened pretty reliably with every SQL question I tried based off the sample dataset.

  2. In Slack, the table shouldn't say that "full results have been included as a file attachment" (they haven't been, haha). A simple thing we could do is move the footer that says "Showing x of y rows" to the top, and amend it to also conditionally say "Showing x of y rows, and q of p columns."

screen shot 2018-02-26 at 2 20 01 pm

  1. It would be nice if Slack tables gave more room to date fields so they didn't wrap

screen shot 2018-02-26 at 2 22 34 pm

  1. Email footer div should be reworked now that the cards aren't centered. I'll take a look at this, too.

@salsakran
Copy link
Contributor

salsakran commented Feb 26, 2018

wrt point 3, should those even be in the rendered table?

We have a field visibility of Only in Detail Views to keep this sort of thing from happening. Does the renderer respect this field? I.e. alerts should definitely not include these fields.

@senior
Copy link
Contributor Author

senior commented Feb 27, 2018

The issue with #2 above is we're exceeding the file size limit allowed by SES. It's returning an error message (that isn't being bubbled up) from the email sending code. We should limit the number of results attached to 2000, just like we do for table displays today.

We should also bubble up that message sending error to the UI.

@mazameli
Copy link
Contributor

@senior and I found that our SMTP server has a 10MB limit for emails, which was causing pulses with super large CSV attachments to choke and not send.

Consequently, we're proposing that we limit CSV attachments to 2,000 rows. This would make it far less likely that we'd hit SMTP size limits, and would be consistent with the row limit we have in-app. This is a much smaller limit than our downloads limit, but we're thinking that if you're sending tables with more than 2,000 rows in the full result, you're not really using Pulses for their intended use, and you should instead download the full large results and email them manually.

Opinions, @salsakran?

@salsakran
Copy link
Contributor

My opinion is that there's a special place in hell for people who distribute huge files via SMTP. Imo anything that big should just be a download link.

That said, I don't like limits without being aware of them however. Eg, how does the user know that the csv they got has 2000 or 2000 (out of 10,000) rows?

@mazameli
Copy link
Contributor

That said, I don't like limits without being aware of them however. Eg, how does the user know that the csv they got has 2000 or 2000 (out of 10,000) rows?

Yep, I'll need to come up with a solution for this question.

@salsakran
Copy link
Contributor

There's another factor -- different setups (read: companies) have different limits here.

@mazameli
Copy link
Contributor

Yeah, we talked about that, and that was another reason for choosing a relatively conservative limit, since we can't really know what each instance's SMTP server's limit is going to be.

@mazameli
Copy link
Contributor

@senior, update on item #5 in my comment above: it looks like the card preview code is having problems with GUI-built pivot tables, too. When I try to add this question, I get this error:

screen shot 2018-02-27 at 12 14 43 pm

02-27 12:13:00 ERROR metabase.middleware :: GET /api/pulse/preview_card_info/94 500 (20 ms) (23 DB calls)
{:message
 "[:div [:table {:style \"max-width: 100%; white-space: nowrap; padding-bottom: 8px; border-collapse: collapse; border-bottom: 4px solid rgb(248,248,248);\"} [:thead [:tr ([:th {:style \"min-width: 60px; color: rgb(57,67,64); text-align: left; font-size: 14.22px; font-weight: 700; padding-right: 1em; padding-top: 0px; padding-bottom: 10px; font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; border-bottom: 1px solid rgb(248,248,248);\"} \"Rating\"] [:th {:style \"min-width: 60px; color: rgb(57,67,64); text-align: left; font-size: 14.22px; font-weight: 700; padding-right: 1em; padding-top: 0px; padding-bottom: 10px; font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; border-bottom: 1px solid rgb(248,248,248);\"} \"Category\"] [:th {:style \"min-width: 60px; color: rgb(57,67,64); text-align: left; font-size: 14.22px; font-weight: 700; padding-right: 1em; padding-top: 0px; padding-bottom: 10px; font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; border-bottom: 1px solid rgb(248,248,248);\"} \"count\"]) nil]] [:tbody ([:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"5\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Doohickey\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"5\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Gizmo\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"5\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Widget\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"4\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Doohickey\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"2\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"4\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Gadget\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"5\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"4\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Gizmo\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"3\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"4\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Widget\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"3\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Gizmo\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"3\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Widget\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil] [:tr {:style \"color: rgb(124,131,129);\"} ([:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"Widget\"] [:td {:style \"font-family: Lato, \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif; font-size: 14.22px; font-weight: 400; text-align: left; padding-right: 1em; padding-top: 8px; border-bottom: 1px solid rgb(248,248,248);\"} \"1\"]) nil])]] nil] is not a valid element name.",
 :type java.lang.IllegalArgumentException,
 :stacktrace
 ["api.pulse$fn__44401$fn__44402.invoke(pulse.clj:129)"
  "api.common.internal$do_with_caught_api_exceptions.invokeStatic(internal.clj:254)"
  "api.common.internal$do_with_caught_api_exceptions.invoke(internal.clj:249)"
  "api.pulse$fn__44401.invokeStatic(pulse.clj:120)"
  "api.pulse$fn__44401.invoke(pulse.clj:120)"
  "middleware$enforce_authentication$fn__43410.invoke(middleware.clj:117)"
  "api.routes$fn__53520.invokeStatic(routes.clj:80)"
  "api.routes$fn__53520.invoke(routes.clj:80)"
  "routes$fn__53581$fn__53582.doInvoke(routes.clj:106)"
  "routes$fn__53581.invokeStatic(routes.clj:101)"
  "routes$fn__53581.invoke(routes.clj:101)"
  "middleware$log_api_call$fn__43523$fn__43525.invoke(middleware.clj:336)"
  "middleware$log_api_call$fn__43523.invoke(middleware.clj:335)"
  "middleware$add_security_headers$fn__43459.invoke(middleware.clj:249)"
  "core$wrap_streamed_json_response$fn__54586.invoke(core.clj:66)"
  "middleware$bind_current_user$fn__43414.invoke(middleware.clj:138)"
  "middleware$maybe_set_site_url$fn__43463.invoke(middleware.clj:273)"]}

Interestingly, it's not having problems with this other GUI pivot table, and the difference appears to be that this one has several metrics/aggregations, but only a single breakout field; the question above had two breakout dimensions. My hunch is that this has to do with the wacky logic in Pulses that was previously used to determine if we should show a small table, or if we should error out and say "you can't include raw data questions" in the UI.

screen shot 2018-02-27 at 12 15 58 pm

Here it is in the Pulse preview UI:

screen shot 2018-02-27 at 12 17 53 pm

@senior
Copy link
Contributor Author

senior commented Feb 28, 2018

@salsakran @mazameli I am working on hiding fields with a visibility type of details-only or special_type of type/Description. If I somehow find that I have a sensitive or retired field in the output, should I exclude those from the table as well?

@salsakran
Copy link
Contributor

@senior yes.

@tlrobinson
Copy link
Contributor

tlrobinson commented Mar 1, 2018

@mazameli I've implemented that UI.

@senior It seems like there's some unrelated integration tests failing and I'm not sure why. In particular people.integ.spec.js, I suspect due to some change to the email code.

 RUNS  frontend/test/admin/people/people.integ.spec.js
03-01 15:54:16 INFO models.user :: Adding user 3 to All Users permissions group...
03-01 15:54:17 ERROR metabase.middleware :: POST /api/user 500 (186 ms) (9 DB calls)
{:message "SMTP host is not set.",
 :type java.lang.Exception,
 :stacktrace
 ["email$fn__23332$send_message_or_throw_BANG___23337$fn__23341.invoke(email.clj:75)"
  "email$fn__23332$send_message_or_throw_BANG___23337.invoke(email.clj:69)"
  "email$send_message_BANG_.invokeStatic(email.clj:102)"
  "email$send_message_BANG_.doInvoke(email.clj:88)"
  "email.messages$send_new_user_email_BANG_.invokeStatic(messages.clj:68)"
  "email.messages$send_new_user_email_BANG_.invoke(messages.clj:54)"
  "models.user$send_welcome_email_BANG_.invokeStatic(user.clj:119)"
  "models.user$send_welcome_email_BANG_.invoke(user.clj:115)"
  "models.user$invite_user_BANG_.invokeStatic(user.clj:131)"
  "models.user$invite_user_BANG_.invoke(user.clj:121)"
  "api.user$fn__44302$fn__44305.invoke(user.clj:57)"
  "api.common.internal$do_with_caught_api_exceptions.invokeStatic(internal.clj:254)"
  "api.common.internal$do_with_caught_api_exceptions.invoke(internal.clj:249)"
  "api.user$fn__44302.invokeStatic(user.clj:46)"
  "api.user$fn__44302.invoke(user.clj:46)"
  "middleware$enforce_authentication$fn__33205.invoke(middleware.clj:117)"
  "api.routes$fn__46236.invokeStatic(routes.clj:89)"
  "api.routes$fn__46236.invoke(routes.clj:89)"
  "routes$fn__46948$fn__46949.doInvoke(routes.clj:106)"
  "routes$fn__46948.invokeStatic(routes.clj:101)"
  "routes$fn__46948.invoke(routes.clj:101)"
  "middleware$log_api_call$fn__33304$fn__33306.invoke(middleware.clj:336)"
  "middleware$log_api_call$fn__33304.invoke(middleware.clj:335)"
  "middleware$add_security_headers$fn__33254.invoke(middleware.clj:249)"
  "core$wrap_streamed_json_response$fn__47743.invoke(core.clj:66)"
  "middleware$bind_current_user$fn__33209.invoke(middleware.clj:138)"
(node:91399) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): [object Object]
(node:91399) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

 FAIL  frontend/test/admin/people/people.integ.spec.js (5.814s)
  ● admin/people › user management › should allow admin to create new users

    Method “is” is only meant to be run on a single node. 0 found instead.

@mazameli
Copy link
Contributor

mazameli commented Mar 1, 2018

This is ready to go from my perspective once poor @senior figures out what's up with the FE tests.

@senior
Copy link
Contributor Author

senior commented Mar 1, 2018

@salsakran @tlrobinson Not sure if I'm on the right track or not. The error mentioned here is related to an error sending an email. Previously that error was logged, then swallowed, returning a 200. Now it will generate a correct error code and the front end correctly lets the user know.

I just pushed a commit that adds a dev dependency on maildev and adds the appropriate settings to the H2 database that the tests use. Only problem is that test still isn't working and it broke two other tests that I think were relying on there not being an smtp host configured. Below is what I see now locally.

Summary of all failing tests
 FAIL  frontend/test/admin/people/people.integ.spec.js (5.647s)
  ● admin/people › user management › should allow admin to create new users

    The wrapper you provided for `click(wrapper)` is empty.

      at click (frontend/test/__support__/enzyme_utils.js:22:11)
      at _callee2$ (frontend/test/admin/people/people.integ.spec.js:72:39)
      at tryCatch (node_modules/regenerator-runtime/runtime.js:65:40)
      at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:303:22)
      at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:117:21)
      at step (frontend/test/admin/people/people.integ.spec.js:25:361)
      at frontend/test/admin/people/people.integ.spec.js:25:521
          at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

 FAIL  frontend/test/alert/alert.integ.spec.js (18.319s)
  ● Alerts › missing email/slack credentials › should prompt you to add email/slack credentials

    expect(received).toBe(expected)

    Expected value to be (using ===):
      1
    Received:
      0

      at _callee5$ (frontend/test/alert/alert.integ.spec.js:197:87)
      at tryCatch (node_modules/regenerator-runtime/runtime.js:65:40)
      at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:303:22)
      at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:117:21)
      at step (frontend/test/alert/alert.integ.spec.js:52:2573)
      at frontend/test/alert/alert.integ.spec.js:52:2733
          at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

  ● Alerts › with only slack set › should say to non-admins that admin must add email credentials

    expect(received).toBe(expected)

    Expected value to be (using ===):
      1
    Received:
      0

      at _callee9$ (frontend/test/alert/alert.integ.spec.js:268:75)
      at tryCatch (node_modules/regenerator-runtime/runtime.js:65:40)
      at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:303:22)
      at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:117:21)
      at step (frontend/test/alert/alert.integ.spec.js:52:2573)
      at frontend/test/alert/alert.integ.spec.js:52:2733
          at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

iethree and others added 3 commits March 2, 2018 09:32
Previously pulses and alerts that used a table visualization were
limited to 3 columns and 10 rows. This commit changes the backed to
bump that to 10 columns and 20 rows. When a resultset has more data
than will fit into a 10x20 table, it will trigger a CSV attachment
that will include the full results of the query, up to 2000 results.

This commit also limits all queries to 2000 rows, similar to how queries
issued via the UI are constrained. Users wanting more than 2000 rows
use the existing export functionality.
@looric
Copy link

looric commented Apr 9, 2018

to limit to 2000 rows for xlsx file, is too limited.
xlsx file is compressed, not easy to exceed smtp limitation.
why not increase. that or let user choose the maximum rows?

@jornh
Copy link
Contributor

jornh commented Apr 11, 2018

Fixes #7001
(At least that what it says over there)

@mazameli mazameli added this to the 0.29 milestone Apr 11, 2018
@ozombo
Copy link

ozombo commented Jul 1, 2021

to limit to 2000 rows for xlsx file, is too limited.
xlsx file is compressed, not easy to exceed smtp limitation.
why not increase. that or let user choose the maximum rows?

I agree with this too

@flamber
Copy link
Contributor

flamber commented Jul 1, 2021

@ozombo There's a request open about that - #7622 - upvote by clicking 👍 on the first post

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants