This is an automated email from the ASF dual-hosted git repository.

vogievetsky pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 9a29496  Web console: Improve retention rules dialog in all sorts of 
ways (#10226)
9a29496 is described below

commit 9a29496b6c6bca6fe6a3eb63047fbbacdacf1c57
Author: Vadim Ogievetsky <[email protected]>
AuthorDate: Tue Aug 4 16:43:31 2020 -0700

    Web console: Improve retention rules dialog in all sorts of ways (#10226)
    
    * improve ret rules
    
    * tidy up tests
---
 .../src/components/rule-editor/rule-editor.scss    |   2 -
 .../src/components/rule-editor/rule-editor.tsx     |  18 +-
 .../__snapshots__/retention-dialog.spec.tsx.snap   | 505 ++++++++++++++++++++-
 .../dialogs/retention-dialog/retention-dialog.scss |  13 +-
 .../retention-dialog/retention-dialog.spec.tsx     |  14 +-
 .../dialogs/retention-dialog/retention-dialog.tsx  |  63 ++-
 .../__snapshots__/datasource-view.spec.tsx.snap    |   9 +
 .../src/views/datasource-view/datasource-view.tsx  |  16 +-
 8 files changed, 573 insertions(+), 67 deletions(-)

diff --git a/web-console/src/components/rule-editor/rule-editor.scss 
b/web-console/src/components/rule-editor/rule-editor.scss
index 6e28917..ffc7626 100644
--- a/web-console/src/components/rule-editor/rule-editor.scss
+++ b/web-console/src/components/rule-editor/rule-editor.scss
@@ -21,8 +21,6 @@
     text-align: right;
   }
 
-  margin-bottom: 20px;
-
   .title {
     display: flex;
 
diff --git a/web-console/src/components/rule-editor/rule-editor.tsx 
b/web-console/src/components/rule-editor/rule-editor.tsx
index 09fca2f..a5ff567 100644
--- a/web-console/src/components/rule-editor/rule-editor.tsx
+++ b/web-console/src/components/rule-editor/rule-editor.tsx
@@ -31,9 +31,12 @@ import { IconNames } from '@blueprintjs/icons';
 import React, { useState } from 'react';
 
 import { Rule, RuleUtil } from '../../utils/load-rule';
+import { SuggestibleInput } from '../suggestible-input/suggestible-input';
 
 import './rule-editor.scss';
 
+const PERIOD_SUGGESTIONS: string[] = ['P1D', 'P7D', 'P1M', 'P1Y', 'P1000Y'];
+
 export interface RuleEditorProps {
   rule: Rule;
   tiers: any[];
@@ -46,7 +49,6 @@ export interface RuleEditorProps {
 export const RuleEditor = React.memo(function RuleEditor(props: 
RuleEditorProps) {
   const { rule, onChange, tiers, onDelete, moveUp, moveDown } = props;
   const [isOpen, setIsOpen] = useState(true);
-  if (!rule) return null;
 
   function removeTier(key: string) {
     const newTierReplicants = Object.assign({}, rule.tieredReplicants);
@@ -173,12 +175,16 @@ export const RuleEditor = React.memo(function 
RuleEditor(props: RuleEditorProps)
                 })}
               </HTMLSelect>
               {RuleUtil.hasPeriod(rule) && (
-                <InputGroup
+                <SuggestibleInput
                   value={rule.period || ''}
-                  onChange={(e: any) =>
-                    onChange(RuleUtil.changePeriod(rule, e.target.value as 
any))
-                  }
-                  placeholder="P1D"
+                  onValueChange={period => {
+                    if (typeof period === 'undefined') return;
+                    // Ensure the period is upper case and does not contain 
anytihng but the allowed chars
+                    period = period.toUpperCase().replace(/[^PYMDTHS0-9]/g, 
'');
+                    onChange(RuleUtil.changePeriod(rule, period));
+                  }}
+                  placeholder={PERIOD_SUGGESTIONS[0]}
+                  suggestions={PERIOD_SUGGESTIONS}
                 />
               )}
               {RuleUtil.hasIncludeFuture(rule) && (
diff --git 
a/web-console/src/dialogs/retention-dialog/__snapshots__/retention-dialog.spec.tsx.snap
 
b/web-console/src/dialogs/retention-dialog/__snapshots__/retention-dialog.spec.tsx.snap
index 76efa8b..92444e0 100644
--- 
a/web-console/src/dialogs/retention-dialog/__snapshots__/retention-dialog.spec.tsx.snap
+++ 
b/web-console/src/dialogs/retention-dialog/__snapshots__/retention-dialog.spec.tsx.snap
@@ -23,7 +23,7 @@ exports[`retention dialog matches snapshot 1`] = `
           <h4
             class="bp3-heading"
           >
-            Edit retention rules: test
+            Edit retention rules: test-datasource
           </h4>
           <button
             aria-label="Close"
@@ -71,41 +71,498 @@ exports[`retention dialog matches snapshot 1`] = `
           >
             <div
               class="bp3-form-content"
-            />
+            >
+              <div
+                class="rule-editor"
+              >
+                <div
+                  class="title"
+                >
+                  <button
+                    class="bp3-button bp3-minimal left"
+                    type="button"
+                  >
+                    <span
+                      class="bp3-button-text"
+                    >
+                      loadByPeriod(P1000Y+future)
+                    </span>
+                    <span
+                      class="bp3-icon bp3-icon-caret-down"
+                      icon="caret-down"
+                    >
+                      <svg
+                        data-icon="caret-down"
+                        height="16"
+                        viewBox="0 0 16 16"
+                        width="16"
+                      >
+                        <desc>
+                          caret-down
+                        </desc>
+                        <path
+                          d="M12 6.5c0-.28-.22-.5-.5-.5h-7a.495.495 0 
00-.37.83l3.5 4c.09.1.22.17.37.17s.28-.07.37-.17l3.5-4c.08-.09.13-.2.13-.33z"
+                          fill-rule="evenodd"
+                        />
+                      </svg>
+                    </span>
+                  </button>
+                  <div
+                    class="spacer"
+                  />
+                  <button
+                    class="bp3-button bp3-minimal"
+                    type="button"
+                  >
+                    <span
+                      class="bp3-icon bp3-icon-trash"
+                      icon="trash"
+                    >
+                      <svg
+                        data-icon="trash"
+                        height="16"
+                        viewBox="0 0 16 16"
+                        width="16"
+                      >
+                        <desc>
+                          trash
+                        </desc>
+                        <path
+                          d="M14.49 3.99h-13c-.28 
0-.5.22-.5.5s.22.5.5.5h.5v10c0 .55.45 1 1 1h10c.55 0 1-.45 1-1v-10h.5c.28 0 
.5-.22.5-.5s-.22-.5-.5-.5zm-8.5 9c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 
1-1s1 .45 1 1v6zm3 0c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 1-1s1 .45 1 
1v6zm3 0c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 1-1s1 .45 1 
1v6zm2-12h-4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1h-4c-.55 0-1 .45-1 
1v1h14v-1c0-.55-.45-1-1-1z"
+                          fill-rule="evenodd"
+                        />
+                      </svg>
+                    </span>
+                  </button>
+                </div>
+                <div
+                  class="bp3-collapse"
+                  style="height: auto; overflow-y: visible; transition: none;"
+                >
+                  <div
+                    aria-hidden="false"
+                    class="bp3-collapse-body"
+                    style="transform: translateY(0); transition: none;"
+                  >
+                    <div
+                      class="bp3-card bp3-elevation-0"
+                    >
+                      <div
+                        class="bp3-form-group"
+                      >
+                        <div
+                          class="bp3-form-content"
+                        >
+                          <div
+                            class="bp3-control-group"
+                          >
+                            <div
+                              class="bp3-html-select"
+                            >
+                              <select>
+                                <option
+                                  value="loadForever"
+                                >
+                                  loadForever
+                                </option>
+                                <option
+                                  value="loadByInterval"
+                                >
+                                  loadByInterval
+                                </option>
+                                <option
+                                  value="loadByPeriod"
+                                >
+                                  loadByPeriod
+                                </option>
+                                <option
+                                  value="dropForever"
+                                >
+                                  dropForever
+                                </option>
+                                <option
+                                  value="dropByInterval"
+                                >
+                                  dropByInterval
+                                </option>
+                                <option
+                                  value="dropByPeriod"
+                                >
+                                  dropByPeriod
+                                </option>
+                                <option
+                                  value="dropBeforeByPeriod"
+                                >
+                                  dropBeforeByPeriod
+                                </option>
+                                <option
+                                  value="broadcastForever"
+                                >
+                                  broadcastForever
+                                </option>
+                                <option
+                                  value="broadcastByInterval"
+                                >
+                                  broadcastByInterval
+                                </option>
+                                <option
+                                  value="broadcastByPeriod"
+                                >
+                                  broadcastByPeriod
+                                </option>
+                              </select>
+                              <span
+                                class="bp3-icon bp3-icon-double-caret-vertical"
+                                icon="double-caret-vertical"
+                              >
+                                <svg
+                                  data-icon="double-caret-vertical"
+                                  height="16"
+                                  viewBox="0 0 16 16"
+                                  width="16"
+                                >
+                                  <desc>
+                                    double-caret-vertical
+                                  </desc>
+                                  <path
+                                    d="M5 7h6a1.003 1.003 0 
00.71-1.71l-3-3C8.53 2.11 8.28 2 8 2s-.53.11-.71.29l-3 3A1.003 1.003 0 005 7zm6 
2H5a1.003 1.003 0 00-.71 1.71l3 3c.18.18.43.29.71.29s.53-.11.71-.29l3-3A1.003 
1.003 0 0011 9z"
+                                    fill-rule="evenodd"
+                                  />
+                                </svg>
+                              </span>
+                            </div>
+                            <div
+                              class="bp3-input-group suggestible-input"
+                            >
+                              <input
+                                class="bp3-input"
+                                placeholder="P1D"
+                                style="padding-right: 0px;"
+                                suggestions="P1D,P7D,P1M,P1Y,P1000Y"
+                                type="text"
+                                value="P1000Y"
+                              />
+                              <span
+                                class="bp3-input-action"
+                              >
+                                <span
+                                  class="bp3-popover-wrapper"
+                                >
+                                  <span
+                                    class="bp3-popover-target"
+                                  >
+                                    <button
+                                      class="bp3-button bp3-minimal"
+                                      type="button"
+                                    >
+                                      <span
+                                        class="bp3-icon bp3-icon-caret-down"
+                                        icon="caret-down"
+                                      >
+                                        <svg
+                                          data-icon="caret-down"
+                                          height="16"
+                                          viewBox="0 0 16 16"
+                                          width="16"
+                                        >
+                                          <desc>
+                                            caret-down
+                                          </desc>
+                                          <path
+                                            d="M12 
6.5c0-.28-.22-.5-.5-.5h-7a.495.495 0 00-.37.83l3.5 
4c.09.1.22.17.37.17s.28-.07.37-.17l3.5-4c.08-.09.13-.2.13-.33z"
+                                            fill-rule="evenodd"
+                                          />
+                                        </svg>
+                                      </span>
+                                    </button>
+                                  </span>
+                                </span>
+                              </span>
+                            </div>
+                            <label
+                              class="bp3-control bp3-switch include-future"
+                            >
+                              <input
+                                checked=""
+                                type="checkbox"
+                              />
+                              <span
+                                class="bp3-control-indicator"
+                              />
+                              Include future
+                            </label>
+                          </div>
+                        </div>
+                      </div>
+                      <div
+                        class="bp3-form-group"
+                      >
+                        <div
+                          class="bp3-form-content"
+                        >
+                          <div
+                            class="bp3-control-group"
+                          >
+                            <button
+                              class="bp3-button bp3-minimal"
+                              style="pointer-events: none;"
+                              type="button"
+                            >
+                              <span
+                                class="bp3-button-text"
+                              >
+                                Replicants:
+                              </span>
+                            </button>
+                            <div
+                              class="bp3-control-group bp3-numeric-input"
+                            >
+                              <div
+                                class="bp3-input-group"
+                              >
+                                <input
+                                  autocomplete="off"
+                                  class="bp3-input"
+                                  max="256"
+                                  min="1"
+                                  style="padding-right: 10px;"
+                                  type="text"
+                                  value="2"
+                                />
+                              </div>
+                              <div
+                                class="bp3-button-group bp3-vertical bp3-fixed"
+                              >
+                                <button
+                                  class="bp3-button"
+                                  type="button"
+                                >
+                                  <span
+                                    class="bp3-icon bp3-icon-chevron-up"
+                                    icon="chevron-up"
+                                  >
+                                    <svg
+                                      data-icon="chevron-up"
+                                      height="16"
+                                      viewBox="0 0 16 16"
+                                      width="16"
+                                    >
+                                      <desc>
+                                        chevron-up
+                                      </desc>
+                                      <path
+                                        d="M12.71 9.29l-4-4C8.53 5.11 8.28 5 8 
5s-.53.11-.71.29l-4 4a1.003 1.003 0 001.42 1.42L8 7.41l3.29 
3.29c.18.19.43.3.71.3a1.003 1.003 0 00.71-1.71z"
+                                        fill-rule="evenodd"
+                                      />
+                                    </svg>
+                                  </span>
+                                </button>
+                                <button
+                                  class="bp3-button"
+                                  type="button"
+                                >
+                                  <span
+                                    class="bp3-icon bp3-icon-chevron-down"
+                                    icon="chevron-down"
+                                  >
+                                    <svg
+                                      data-icon="chevron-down"
+                                      height="16"
+                                      viewBox="0 0 16 16"
+                                      width="16"
+                                    >
+                                      <desc>
+                                        chevron-down
+                                      </desc>
+                                      <path
+                                        d="M12 5c-.28 0-.53.11-.71.29L8 
8.59l-3.29-3.3a1.003 1.003 0 00-1.42 1.42l4 
4c.18.18.43.29.71.29s.53-.11.71-.29l4-4A1.003 1.003 0 0012 5z"
+                                        fill-rule="evenodd"
+                                      />
+                                    </svg>
+                                  </span>
+                                </button>
+                              </div>
+                            </div>
+                            <button
+                              class="bp3-button bp3-minimal"
+                              style="pointer-events: none;"
+                              type="button"
+                            >
+                              <span
+                                class="bp3-button-text"
+                              >
+                                Tier:
+                              </span>
+                            </button>
+                            <div
+                              class="bp3-html-select bp3-fill"
+                            >
+                              <select>
+                                <option
+                                  value="_default_tier"
+                                >
+                                  _default_tier
+                                </option>
+                                <option
+                                  value="tier1"
+                                >
+                                  tier1
+                                </option>
+                                <option
+                                  value="tier2"
+                                >
+                                  tier2
+                                </option>
+                              </select>
+                              <span
+                                class="bp3-icon bp3-icon-double-caret-vertical"
+                                icon="double-caret-vertical"
+                              >
+                                <svg
+                                  data-icon="double-caret-vertical"
+                                  height="16"
+                                  viewBox="0 0 16 16"
+                                  width="16"
+                                >
+                                  <desc>
+                                    double-caret-vertical
+                                  </desc>
+                                  <path
+                                    d="M5 7h6a1.003 1.003 0 
00.71-1.71l-3-3C8.53 2.11 8.28 2 8 2s-.53.11-.71.29l-3 3A1.003 1.003 0 005 7zm6 
2H5a1.003 1.003 0 00-.71 1.71l3 3c.18.18.43.29.71.29s.53-.11.71-.29l3-3A1.003 
1.003 0 0011 9z"
+                                    fill-rule="evenodd"
+                                  />
+                                </svg>
+                              </span>
+                            </div>
+                            <button
+                              class="bp3-button bp3-disabled"
+                              disabled=""
+                              tabindex="-1"
+                              type="button"
+                            >
+                              <span
+                                class="bp3-icon bp3-icon-trash"
+                                icon="trash"
+                              >
+                                <svg
+                                  data-icon="trash"
+                                  height="16"
+                                  viewBox="0 0 16 16"
+                                  width="16"
+                                >
+                                  <desc>
+                                    trash
+                                  </desc>
+                                  <path
+                                    d="M14.49 3.99h-13c-.28 
0-.5.22-.5.5s.22.5.5.5h.5v10c0 .55.45 1 1 1h10c.55 0 1-.45 1-1v-10h.5c.28 0 
.5-.22.5-.5s-.22-.5-.5-.5zm-8.5 9c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 
1-1s1 .45 1 1v6zm3 0c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 1-1s1 .45 1 
1v6zm3 0c0 .55-.45 1-1 1s-1-.45-1-1v-6c0-.55.45-1 1-1s1 .45 1 
1v6zm2-12h-4c0-.55-.45-1-1-1h-2c-.55 0-1 .45-1 1h-4c-.55 0-1 .45-1 
1v1h14v-1c0-.55-.45-1-1-1z"
+                                    fill-rule="evenodd"
+                                  />
+                                </svg>
+                              </span>
+                            </button>
+                          </div>
+                          <div
+                            class="bp3-form-group right"
+                          >
+                            <div
+                              class="bp3-form-content"
+                            >
+                              <button
+                                class="bp3-button bp3-minimal"
+                                type="button"
+                              >
+                                <span
+                                  class="bp3-icon bp3-icon-plus"
+                                  icon="plus"
+                                >
+                                  <svg
+                                    data-icon="plus"
+                                    height="16"
+                                    viewBox="0 0 16 16"
+                                    width="16"
+                                  >
+                                    <desc>
+                                      plus
+                                    </desc>
+                                    <path
+                                      d="M13 7H9V3c0-.55-.45-1-1-1s-1 .45-1 
1v4H3c-.55 0-1 .45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1V9h4c.55 0 1-.45 
1-1s-.45-1-1-1z"
+                                      fill-rule="evenodd"
+                                    />
+                                  </svg>
+                                </span>
+                                <span
+                                  class="bp3-button-text"
+                                >
+                                  Add a tier
+                                </span>
+                              </button>
+                            </div>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <div>
+                <button
+                  class="bp3-button"
+                  type="button"
+                >
+                  <span
+                    class="bp3-icon bp3-icon-plus"
+                    icon="plus"
+                  >
+                    <svg
+                      data-icon="plus"
+                      height="16"
+                      viewBox="0 0 16 16"
+                      width="16"
+                    >
+                      <desc>
+                        plus
+                      </desc>
+                      <path
+                        d="M13 7H9V3c0-.55-.45-1-1-1s-1 .45-1 1v4H3c-.55 0-1 
.45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1V9h4c.55 0 1-.45 1-1s-.45-1-1-1z"
+                        fill-rule="evenodd"
+                      />
+                    </svg>
+                  </span>
+                  <span
+                    class="bp3-button-text"
+                  >
+                    New rule
+                  </span>
+                </button>
+              </div>
+            </div>
           </div>
           <div
-            class="bp3-form-group right"
+            class="bp3-divider"
+          />
+          <div
+            class="bp3-form-group"
           >
             <div
               class="bp3-form-content"
             >
+              <p>
+                Cluster defaults (
+                <a>
+                  edit
+                </a>
+                ):
+              </p>
               <button
-                class="bp3-button"
+                class="bp3-button bp3-disabled"
+                disabled=""
+                tabindex="-1"
                 type="button"
               >
                 <span
-                  class="bp3-icon bp3-icon-plus"
-                  icon="plus"
-                >
-                  <svg
-                    data-icon="plus"
-                    height="16"
-                    viewBox="0 0 16 16"
-                    width="16"
-                  >
-                    <desc>
-                      plus
-                    </desc>
-                    <path
-                      d="M13 7H9V3c0-.55-.45-1-1-1s-1 .45-1 1v4H3c-.55 0-1 
.45-1 1s.45 1 1 1h4v4c0 .55.45 1 1 1s1-.45 1-1V9h4c.55 0 1-.45 1-1s-.45-1-1-1z"
-                      fill-rule="evenodd"
-                    />
-                  </svg>
-                </span>
-                <span
                   class="bp3-button-text"
                 >
-                  New rule
+                  loadForever
                 </span>
               </button>
             </div>
diff --git a/web-console/src/dialogs/retention-dialog/retention-dialog.scss 
b/web-console/src/dialogs/retention-dialog/retention-dialog.scss
index f363c85..5917962 100644
--- a/web-console/src/dialogs/retention-dialog/retention-dialog.scss
+++ b/web-console/src/dialogs/retention-dialog/retention-dialog.scss
@@ -22,16 +22,13 @@
     width: 750px;
   }
 
-  .dialog-body {
-    overflow: scroll;
-    max-height: 70vh;
-
-    .form-group {
-      margin: 0 0 5px;
+  .bp3-dialog-body {
+    .rule-editor {
+      margin-bottom: 15px;
     }
 
-    .small {
-      width: 0px;
+    .no-rules-message {
+      font-style: italic;
     }
 
     .comment {
diff --git a/web-console/src/dialogs/retention-dialog/retention-dialog.spec.tsx 
b/web-console/src/dialogs/retention-dialog/retention-dialog.spec.tsx
index 2372b39..950e96d 100644
--- a/web-console/src/dialogs/retention-dialog/retention-dialog.spec.tsx
+++ b/web-console/src/dialogs/retention-dialog/retention-dialog.spec.tsx
@@ -25,9 +25,17 @@ describe('retention dialog', () => {
   it('matches snapshot', () => {
     const retentionDialog = (
       <RetentionDialog
-        datasource={'test'}
-        rules={[null]}
-        tiers={['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']}
+        datasource={'test-datasource'}
+        rules={[
+          {
+            period: 'P1000Y',
+            includeFuture: true,
+            tieredReplicants: { _default_tier: 2 },
+            type: 'loadByPeriod',
+          },
+        ]}
+        defaultRules={[{ tieredReplicants: { _default_tier: 2 }, type: 
'loadForever' }]}
+        tiers={['tier1', 'tier2']}
         onEditDefaults={() => {}}
         onCancel={() => {}}
         onSave={() => {}}
diff --git a/web-console/src/dialogs/retention-dialog/retention-dialog.tsx 
b/web-console/src/dialogs/retention-dialog/retention-dialog.tsx
index a563939..a430e72 100644
--- a/web-console/src/dialogs/retention-dialog/retention-dialog.tsx
+++ b/web-console/src/dialogs/retention-dialog/retention-dialog.tsx
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-import { Button, FormGroup } from '@blueprintjs/core';
+import { Button, Divider, FormGroup } from '@blueprintjs/core';
 import { IconNames } from '@blueprintjs/icons';
 import axios from 'axios';
 import React from 'react';
@@ -25,6 +25,7 @@ import { SnitchDialog } from '..';
 import { ExternalLink, RuleEditor } from '../../components';
 import { getLink } from '../../links';
 import { QueryManager } from '../../utils';
+import { Rule, RuleUtil } from '../../utils/load-rule';
 
 import './retention-dialog.scss';
 
@@ -40,23 +41,24 @@ export function reorderArray<T>(items: T[], oldIndex: 
number, newIndex: number):
 
 export interface RetentionDialogProps {
   datasource: string;
-  rules: any[];
+  rules: Rule[];
+  defaultRules: Rule[];
   tiers: string[];
   onEditDefaults: () => void;
   onCancel: () => void;
-  onSave: (datasource: string, newRules: any[], comment: string) => void;
+  onSave: (datasource: string, newRules: Rule[], comment: string) => void;
 }
 
 export interface RetentionDialogState {
-  currentRules: any[];
-  historyRecords: any[];
+  currentRules: Rule[];
+  historyRecords: any[] | undefined;
 }
 
 export class RetentionDialog extends React.PureComponent<
   RetentionDialogProps,
   RetentionDialogState
 > {
-  private historyQueryManager: QueryManager<string, any>;
+  private historyQueryManager: QueryManager<string, any[]>;
 
   constructor(props: RetentionDialogProps) {
     super(props);
@@ -91,7 +93,7 @@ export class RetentionDialog extends React.PureComponent<
     onSave(datasource, currentRules, comment);
   };
 
-  private changeRule = (newRule: any, index: number) => {
+  private changeRule = (newRule: Rule, index: number) => {
     const { currentRules } = this.state;
 
     const newRules = (currentRules || []).map((r, i) => {
@@ -125,7 +127,7 @@ export class RetentionDialog extends React.PureComponent<
     });
   }
 
-  renderRule = (rule: any, index: number) => {
+  renderRule = (rule: Rule, index: number) => {
     const { tiers } = this.props;
     const { currentRules } = this.state;
 
@@ -142,6 +144,14 @@ export class RetentionDialog extends React.PureComponent<
     );
   };
 
+  renderDefaultRule = (rule: Rule, index: number) => {
+    return (
+      <Button disabled key={index}>
+        {RuleUtil.ruleToString(rule)}
+      </Button>
+    );
+  };
+
   reset = () => {
     const { rules } = this.props;
 
@@ -165,7 +175,7 @@ export class RetentionDialog extends React.PureComponent<
   };
 
   render(): JSX.Element {
-    const { datasource, onCancel, onEditDefaults } = this.props;
+    const { datasource, onCancel, onEditDefaults, defaultRules } = this.props;
     const { currentRules, historyRecords } = this.state;
 
     return (
@@ -188,17 +198,32 @@ export class RetentionDialog extends React.PureComponent<
           </ExternalLink>
           .
         </p>
-        <FormGroup>{(currentRules || []).map(this.renderRule)}</FormGroup>
-        <FormGroup className="right">
-          <Button icon={IconNames.PLUS} onClick={this.addRule}>
-            New rule
-          </Button>
+        <FormGroup>
+          {currentRules.length ? (
+            currentRules.map(this.renderRule)
+          ) : datasource !== '_default' ? (
+            <p className="no-rules-message">
+              This datasource currently has no rules, it will use the cluster 
defaults.
+            </p>
+          ) : (
+            undefined
+          )}
+          <div>
+            <Button icon={IconNames.PLUS} onClick={this.addRule}>
+              New rule
+            </Button>
+          </div>
         </FormGroup>
-        {!currentRules.length && datasource !== '_default' && (
-          <p>
-            This datasource currently has no rules, it will use the cluster 
defaults (
-            <a onClick={onEditDefaults}>edit cluster defaults</a>)
-          </p>
+        {datasource !== '_default' && (
+          <>
+            <Divider />
+            <FormGroup>
+              <p>
+                Cluster defaults (<a onClick={onEditDefaults}>edit</a>):
+              </p>
+              {defaultRules.map(this.renderDefaultRule)}
+            </FormGroup>
+          </>
         )}
       </SnitchDialog>
     );
diff --git 
a/web-console/src/views/datasource-view/__snapshots__/datasource-view.spec.tsx.snap
 
b/web-console/src/views/datasource-view/__snapshots__/datasource-view.spec.tsx.snap
index 7a2e3e7..b5c61ef 100755
--- 
a/web-console/src/views/datasource-view/__snapshots__/datasource-view.spec.tsx.snap
+++ 
b/web-console/src/views/datasource-view/__snapshots__/datasource-view.spec.tsx.snap
@@ -21,6 +21,15 @@ exports[`data source view matches snapshot 1`] = `
         shouldDismissPopover={true}
         text="View SQL query for table"
       />
+      <Blueprint3.MenuItem
+        disabled={false}
+        icon="edit"
+        multiline={false}
+        onClick={[Function]}
+        popoverProps={Object {}}
+        shouldDismissPopover={true}
+        text="Edit default retention rules"
+      />
     </Memo(MoreButton)>
     <Blueprint3.Switch
       checked={false}
diff --git a/web-console/src/views/datasource-view/datasource-view.tsx 
b/web-console/src/views/datasource-view/datasource-view.tsx
index 2b9cf31..d486f87 100644
--- a/web-console/src/views/datasource-view/datasource-view.tsx
+++ b/web-console/src/views/datasource-view/datasource-view.tsx
@@ -53,7 +53,7 @@ import {
 } from '../../utils';
 import { BasicAction } from '../../utils/basic-action';
 import { Capabilities, CapabilitiesMode } from '../../utils/capabilities';
-import { RuleUtil } from '../../utils/load-rule';
+import { Rule, RuleUtil } from '../../utils/load-rule';
 import { LocalStorageBackedArray } from 
'../../utils/local-storage-backed-array';
 import { deepGet } from '../../utils/object-change';
 
@@ -107,7 +107,7 @@ function formatLoadDrop(segmentsToLoad: number, 
segmentsToDrop: number): string
 
 interface Datasource {
   datasource: string;
-  rules: any[];
+  rules: Rule[];
   [key: string]: any;
 }
 
@@ -125,7 +125,7 @@ interface DatasourceQueryResultRow {
 
 interface RetentionDialogOpenOn {
   datasource: string;
-  rules: any[];
+  rules: Rule[];
 }
 
 interface CompactionDialogOpenOn {
@@ -145,7 +145,7 @@ export interface DatasourcesViewState {
   datasourcesLoading: boolean;
   datasources: Datasource[] | null;
   tiers: string[];
-  defaultRules: any[];
+  defaultRules: Rule[];
   datasourcesError?: string;
   datasourceFilter: Filter[];
 
@@ -497,6 +497,11 @@ GROUP BY 1`;
             onClick={() => goToQuery(DatasourcesView.DATASOURCE_SQL)}
           />
         )}
+        <MenuItem
+          icon={IconNames.EDIT}
+          text="Edit default retention rules"
+          onClick={this.editDefaultRules}
+        />
       </MoreButton>
     );
   }
@@ -700,13 +705,14 @@ GROUP BY 1`;
   }
 
   renderRetentionDialog() {
-    const { retentionDialogOpenOn, tiers } = this.state;
+    const { retentionDialogOpenOn, tiers, defaultRules } = this.state;
     if (!retentionDialogOpenOn) return null;
 
     return (
       <RetentionDialog
         datasource={retentionDialogOpenOn.datasource}
         rules={retentionDialogOpenOn.rules}
+        defaultRules={defaultRules}
         tiers={tiers}
         onEditDefaults={this.editDefaultRules}
         onCancel={() => this.setState({ retentionDialogOpenOn: undefined })}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to