diff --git a/.babelrc b/.babelrc
new file mode 100644
index 00000000..e26ee76e
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,18 @@
+{
+ "presets": [
+ [
+ "@babel/preset-env",
+ {
+ "targets": { "node": "10" }
+ }
+ ],
+ "@babel/preset-react",
+ "@babel/preset-typescript"
+ ],
+ "plugins": [
+ "@babel/plugin-transform-modules-commonjs",
+ ["@babel/plugin-transform-runtime", { "regenerator": true }],
+ "@babel/plugin-proposal-class-properties",
+ "@babel/plugin-proposal-object-rest-spread"
+ ]
+}
diff --git a/.cypress/integration/01-create.spec.ts b/.cypress/integration/01-create.spec.ts
new file mode 100644
index 00000000..e493a9b9
--- /dev/null
+++ b/.cypress/integration/01-create.spec.ts
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+describe('Cypress', () => {
+ it('Visits Reporting homepage', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+ });
+
+ it('Visit Create page', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+ cy.wait(12500); // wait for the page to load
+ cy.get('#createReportHomepageButton').click({ force: true });
+ });
+
+ it('Create a new on-demand report definition', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+ cy.wait(12500);
+ cy.get('#createReportHomepageButton').click();
+
+ // enter a report name
+ cy.get('#reportSettingsName').type('Create cypress test on-demand report');
+
+ // enter a report description
+ cy.get('#reportSettingsDescription').type('Description for cypress test');
+
+ // select a report source
+ cy.get('.euiComboBox').click({ force: true });
+
+ // create an on-demand report definition
+ cy.get('#createNewReportDefinition').click({ force: true });
+ });
+
+ it('Create a new scheduled report definition', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+ cy.wait(12500);
+ cy.get('#createReportHomepageButton').click();
+
+ // enter a report name
+ cy.get('#reportSettingsName').type('Create cypress test scheduled report');
+
+ // enter a report description
+ cy.get('#reportSettingsDescription').type('Description for cypress test');
+
+ // set report trigger to Schedule option
+ cy.get('[type="radio"]').check({ force: true });
+
+ // create scheduled report definition
+ cy.get('#createNewReportDefinition').click({ force: true });
+ });
+});
diff --git a/.cypress/integration/02-edit.spec.ts b/.cypress/integration/02-edit.spec.ts
new file mode 100644
index 00000000..c38c902d
--- /dev/null
+++ b/.cypress/integration/02-edit.spec.ts
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+describe('Cypress', () => {
+ it('Visit edit page, update name and description', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+
+ cy.get('#reportDefinitionDetailsLink').first().click();
+
+ cy.get('#editReportDefinitionButton').should('exist');
+
+ cy.get('#editReportDefinitionButton').click();
+
+ cy.url().should('include', 'edit');
+
+ cy.wait(1000);
+
+ // update the report name
+ cy.get('#reportSettingsName').type(' update name');
+
+ // update report description
+ cy.get('#reportSettingsDescription').type(' update description');
+
+ cy.get('#editReportDefinitionButton').click({ force: true });
+ });
+
+ it('Visit edit page, change report source and trigger', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+
+ cy.get('#reportDefinitionDetailsLink').first().click();
+
+ cy.get('#editReportDefinitionButton').should('exist');
+
+ cy.get('#editReportDefinitionButton').click();
+
+ cy.url().should('include', 'edit');
+
+ cy.wait(1000);
+ cy.get('#visualizationReportSource').check({ force: true });
+
+ cy.get('#Schedule').check({ force: true });
+ cy.get('#editReportDefinitionButton').click({ force: true });
+ });
+
+ it('Visit edit page, change report source back', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+
+ cy.get('#reportDefinitionDetailsLink').first().click();
+
+ cy.get('#editReportDefinitionButton').should('exist');
+
+ cy.get('#editReportDefinitionButton').click();
+
+ cy.url().should('include', 'edit');
+
+ cy.wait(1000);
+
+ cy.get('#dashboardReportSource').check({ force: true });
+
+ cy.get('#editReportDefinitionButton').click({ force: true });
+ });
+});
diff --git a/.cypress/integration/03-details.spec.ts b/.cypress/integration/03-details.spec.ts
new file mode 100644
index 00000000..2144a3ef
--- /dev/null
+++ b/.cypress/integration/03-details.spec.ts
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+describe('Cypress', () => {
+ it('Visit report definition details page', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+
+ cy.get('#reportDefinitionDetailsLink').first().click();
+
+ cy.url().should('include', 'report_definition_details');
+
+ cy.get('#deleteReportDefinitionButton').should('exist');
+
+ cy.get('#editReportDefinitionButton').should('exist');
+
+ if (cy.get('body').contains('Schedule details')) {
+ cy.wait(1000);
+ cy.get('#changeStatusFromDetailsButton').click();
+ } else {
+ cy.wait(1000);
+ cy.get('#generateReportFromDetailsButton').click();
+ }
+
+ cy.get('#deleteReportDefinitionButton').click();
+ });
+
+ it('Visit report details page', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+ cy.get('#reportDetailsLink').first().click();
+
+ cy.url().should('include', 'report_details');
+ });
+});
diff --git a/.cypress/integration/04-download.spec.ts b/.cypress/integration/04-download.spec.ts
new file mode 100644
index 00000000..0c143fb8
--- /dev/null
+++ b/.cypress/integration/04-download.spec.ts
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+describe('Cypress', () => {
+ it('Download from reporting homepage', () => {
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+
+ cy.wait(12500);
+ cy.get('#landingPageOnDemandDownload').click({ force: true });
+ cy.get('body').then($body => {
+ if ($body.find('#downloadInProgressLoadingModal').length > 0) {
+ return;
+ }
+ else {
+ assert(false);
+ }
+ })
+ });
+
+ it('Download pdf from in-context menu', () => {
+ cy.visit('http://localhost:5601/app/dashboards#');
+ cy.wait(5000);
+
+ // click first entry in dashboards page
+ cy.get('tr.euiTableRow:nth-child(1) > td:nth-child(2) > div:nth-child(2) > a:nth-child(1)').click({ force: true });
+
+ // click Reporting in-context menu
+ cy.get('#downloadReport > span:nth-child(1) > span:nth-child(1)').click({ force: true });
+
+ // download PDF
+ cy.get('#generatePDF > span:nth-child(1) > span:nth-child(2)').click({ force: true });
+
+ cy.get('#reportGenerationProgressModal');
+ });
+
+ it('Download png from in-context menu', () => {
+ cy.visit('http://localhost:5601/app/dashboards#');
+ cy.wait(5000);
+
+ // click first entry in dashboards page
+ cy.get('tr.euiTableRow:nth-child(1) > td:nth-child(2) > div:nth-child(2) > a:nth-child(1)').click({ force: true });
+
+ // click Reporting in-context menu
+ cy.get('#downloadReport > span:nth-child(1) > span:nth-child(1)').click({ force: true });
+
+ cy.get('#generatePNG').click({ force: true });
+
+ cy.get('#reportGenerationProgressModal');
+ });
+
+ it('Download csv from saved search in-context menu', () => {
+ cy.visit('http://localhost:5601/app/discover#');
+ cy.wait(5000);
+
+ // open saved search list
+ cy.get('button.euiButtonEmpty:nth-child(3) > span:nth-child(1) > span:nth-child(1)').click({ force: true });
+ cy.wait(5000);
+
+ // click first entry
+ cy.get('li.euiListGroupItem:nth-child(1) > button:nth-child(1)').click({ force: true });
+
+ // open reporting menu
+ cy.get('#downloadReport').click({ force: true });
+
+ cy.get('#generateCSV').click({ force: true });
+ });
+
+ it('Download from Report definition details page', () => {
+ // create an on-demand report definition
+
+ cy.visit('http://localhost:5601/app/opendistro_kibana_reports#/');
+ cy.location('pathname', { timeout: 60000 }).should(
+ 'include',
+ '/opendistro_kibana_reports'
+ );
+ cy.wait(12500);
+ cy.get('#createReportHomepageButton').click();
+
+ // enter a report name
+ cy.get('#reportSettingsName').type('Create cypress test on-demand report');
+
+ // enter a report description
+ cy.get('#reportSettingsDescription').type('Description for cypress test');
+
+ // create an on-demand report definition
+ cy.get('#createNewReportDefinition').click({ force: true });
+
+ cy.wait(10000);
+
+ // visit the details page of the newly created on-demand definition
+ cy.get('#reportDefinitionDetailsLink').first().click();
+
+ cy.url().should('include', 'report_definition_details');
+
+ cy.get('#generateReportFromDetailsButton').should('exist');
+
+ cy.get('#generateReportFromDetailsButton').click({ force: true });
+
+ cy.get('#downloadInProgressLoadingModal');
+ });
+});
\ No newline at end of file
diff --git a/.cypress/plugins/index.js b/.cypress/plugins/index.js
new file mode 100644
index 00000000..8c76f947
--- /dev/null
+++ b/.cypress/plugins/index.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+///
+// ***********************************************************
+// This example plugins/index.js can be used to load plugins
+//
+// You can change the location of this file or turn off loading
+// the plugins file with the 'pluginsFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/plugins-guide
+// ***********************************************************
+
+// This function is called when a project is opened or re-opened (e.g. due to
+// the project's config changing)
+
+/**
+ * @type {Cypress.PluginConfig}
+ */
+module.exports = (on, config) => {
+ // `on` is used to hook into various events Cypress emits
+ // `config` is the resolved Cypress config
+}
diff --git a/.cypress/support/commands.js b/.cypress/support/commands.js
new file mode 100644
index 00000000..104bef84
--- /dev/null
+++ b/.cypress/support/commands.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+// ***********************************************
+// This example commands.js shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add("login", (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
diff --git a/.cypress/support/index.js b/.cypress/support/index.js
new file mode 100644
index 00000000..09218067
--- /dev/null
+++ b/.cypress/support/index.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
diff --git a/.cypress/tsconfig.json b/.cypress/tsconfig.json
new file mode 100644
index 00000000..2d48dc0e
--- /dev/null
+++ b/.cypress/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "allowJs": true,
+ "baseUrl": "../node_modules",
+ "types": ["cypress"]
+ },
+ "include": ["**/*.*"]
+}
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000..661af680
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,9 @@
+---
+extends: '@elastic/kibana'
+
+settings:
+ import/resolver:
+ '@kbn/eslint-import-resolver-kibana':
+ rootPackageName: 'opendistro-kibana-reports'
+ pluginPaths:
+ - .
diff --git a/.github/workflows/kibana-reports-release-workflow.yml b/.github/workflows/kibana-reports-release-workflow.yml
deleted file mode 100644
index ef59742a..00000000
--- a/.github/workflows/kibana-reports-release-workflow.yml
+++ /dev/null
@@ -1,114 +0,0 @@
-name: Release Kibana Reports Artifacts
-
-on:
- push:
- tags:
- - "v*"
-
-env:
- PLUGIN_NAME: opendistroReportsKibana
- OD_VERSION: 1.13.0.0
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_STAGING_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_STAGING_SECRET_ACCESS_KEY }}
- aws-region: us-east-1
-
- - name: Checkout Plugin
- uses: actions/checkout@v1
-
- - name: Checkout Kibana
- uses: actions/checkout@v1
- with:
- repository: opendistro-for-elasticsearch/kibana-oss
- ref: 7.10.2
- token: ${{secrets.OD_ACCESS}}
- path: dashboards-reports/kibana
-
- - name: Setup Node
- uses: actions/setup-node@v1
- with:
- node-version: "10.23.1"
-
- - name: Move Kibana Reports to Plugins Dir
- run: mv kibana-reports kibana/plugins/${{ env.PLUGIN_NAME }}
-
- - name: Add Chromium Binary to Reporting for Testing
- run: |
- sudo apt install -y libnss3-dev fonts-liberation libfontconfig1
- cd kibana/plugins/${{ env.PLUGIN_NAME }}
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-x64.zip
- unzip chromium-linux-x64.zip
- rm chromium-linux-x64.zip
-
- - name: Kibana Plugin Bootstrap
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 30
- max_attempts: 3
- command: cd kibana/plugins/${{ env.PLUGIN_NAME }}; yarn kbn bootstrap
-
- - name: Test
- uses: nick-invision/retry@v1
- with:
- timeout_minutes: 30
- max_attempts: 3
- command: cd kibana/plugins/${{ env.PLUGIN_NAME }}; yarn test
-
- - name: Build Artifact and upload to S3
- run: |
- cd kibana/plugins/${{ env.PLUGIN_NAME }}
- yarn build
-
- cd build
- mkdir -p ./{linux-x64,linux-arm64,windows-x64}/kibana/${{ env.PLUGIN_NAME }}
- cp ./${{ env.PLUGIN_NAME }}-*.zip ./linux-x64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-x64.zip
- cp ./${{ env.PLUGIN_NAME }}-*.zip ./linux-arm64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-arm64.zip
- mv ./${{ env.PLUGIN_NAME }}-*.zip ./windows-x64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-windows-x64.zip
-
- s3_prefix="s3://staging.artifacts.opendistroforelasticsearch.amazon.com/snapshots/kibana-plugins/reports/"
-
- cd linux-x64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-x64.zip
- unzip chromium-linux-x64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- rm chromium-linux-x64.zip
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- linux_x64_artifact=`ls ./${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-x64.zip`
-
- #Inject build number before the suffix and upload to S3
- linux_x64_artifact_outfile=`basename ${linux_x64_artifact%.zip}-build-${GITHUB_RUN_NUMBER}.zip`
- echo "Copying $linux_x64_artifact to ${s3_prefix}${linux_x64_artifact_outfile}"
- aws s3 cp --quiet $linux_x64_artifact ${s3_prefix}${linux_x64_artifact_outfile}
- cd ..
-
- cd linux-arm64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-arm64.zip
- unzip chromium-linux-arm64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- rm chromium-linux-arm64.zip
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- linux_arm64_artifact=`ls ./${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-arm64.zip`
-
- #Inject build number before the suffix and upload to S3
- linux_arm64_artifact_outfile=`basename ${linux_arm64_artifact%.zip}-build-${GITHUB_RUN_NUMBER}.zip`
- echo "Copying $linux_arm64_artifact to ${s3_prefix}${linux_arm64_artifact_outfile}"
- aws s3 cp --quiet $linux_arm64_artifact ${s3_prefix}${linux_arm64_artifact_outfile}
- cd ..
-
- cd windows-x64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-windows-x64.zip
- unzip chromium-windows-x64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- rm chromium-windows-x64.zip
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- windows_x64_artifact=`ls ./${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-windows-x64.zip`
-
- #Inject build number before the suffix and upload to S3
- windows_x64_artifact_outfile=`basename ${windows_x64_artifact%.zip}-build-${GITHUB_RUN_NUMBER}.zip`
- echo "Copying $windows_x64_artifact to ${s3_prefix}${windows_x64_artifact_outfile}"
- aws s3 cp --quiet $windows_x64_artifact ${s3_prefix}${windows_x64_artifact_outfile}
diff --git a/.github/workflows/kibana-reports-test-and-build-workflow.yml b/.github/workflows/kibana-reports-test-and-build-workflow.yml
index 5360e484..c9e9a316 100644
--- a/.github/workflows/kibana-reports-test-and-build-workflow.yml
+++ b/.github/workflows/kibana-reports-test-and-build-workflow.yml
@@ -10,9 +10,6 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - name: Checkout Plugin
- uses: actions/checkout@v1
-
- name: Checkout Kibana
uses: actions/checkout@v1
with:
@@ -25,97 +22,37 @@ jobs:
with:
node-version: "10.23.1"
- # bootstrap first to workaround errors caused by removing puppeteer-core from x-pack
- - name: Kibana Plugin Bootstrap
- uses: nick-invision/retry@v1
+ - name: Checkout Plugin
+ uses: actions/checkout@v1
with:
- timeout_minutes: 30
- max_attempts: 3
- command: cd ../kibana; yarn kbn bootstrap
-
- - name: Move Kibana Reports to Plugins Dir
- run: mv kibana-reports ../kibana/plugins/${{ env.PLUGIN_NAME }}
-
- - name: Add Chromium Binary to Reporting for Testing
- run: |
- sudo apt install -y libnss3-dev fonts-liberation libfontconfig1
- cd ../kibana/plugins/${{ env.PLUGIN_NAME }}
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-x64.zip
- unzip chromium-linux-x64.zip
- rm chromium-linux-x64.zip
-
- # reporting uses newer version of puppeteer-core than x-pack, removing it to avoid conflicts
- - name: Remove x-pack puppeteer-core dependency
- run: |
- sed -i '/"puppeteer-core": "/d' ../kibana/x-pack/package.json
+ path: kibana/plugins/${{ env.PLUGIN_NAME }}
- name: Kibana Plugin Bootstrap
- uses: nick-invision/retry@v1
+ uses: nick-fields/retry@v1
with:
timeout_minutes: 30
max_attempts: 3
- command: cd ../kibana/plugins/${{ env.PLUGIN_NAME }}; yarn kbn bootstrap
+ command: yarn kbn bootstrap
- name: Test
- uses: nick-invision/retry@v1
+ uses: nick-fields/retry@v1
with:
timeout_minutes: 30
max_attempts: 3
- command: cd ../kibana/plugins/${{ env.PLUGIN_NAME }}; yarn test --coverage
+ command: yarn test --coverage
- - name: Upload coverage
+ - name: Uploads coverage
uses: codecov/codecov-action@v1
with:
- flags: Kibana-reports
- directory: ../kibana/plugins/
token: ${{ secrets.CODECOV_TOKEN }}
- name: Build Artifact
run: |
- cd ../kibana/plugins/${{ env.PLUGIN_NAME }}
yarn build
+ mv ./build/*.zip ./build/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}.zip || true
- cd build
- mkdir -p ./{linux-x64,linux-arm64,windows-x64}/kibana/${{ env.PLUGIN_NAME }}
- cp ./${{ env.PLUGIN_NAME }}-*.zip ./linux-x64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-x64.zip
- cp ./${{ env.PLUGIN_NAME }}-*.zip ./linux-arm64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-arm64.zip
- mv ./${{ env.PLUGIN_NAME }}-*.zip ./windows-x64/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-windows-x64.zip
-
- cd linux-x64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-x64.zip
- unzip chromium-linux-x64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- mv ./${{ env.PLUGIN_NAME }}-*.zip ..
- cd ..
-
- cd linux-arm64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-linux-arm64.zip
- unzip chromium-linux-arm64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- mv ./${{ env.PLUGIN_NAME }}-*.zip ..
- cd ..
-
- cd windows-x64
- wget https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/download/chromium-1.12.0.0/chromium-windows-x64.zip
- unzip chromium-windows-x64.zip -d ./kibana/${{ env.PLUGIN_NAME }}
- zip -ur ./${{ env.PLUGIN_NAME }}-*.zip ./kibana
- mv ./${{ env.PLUGIN_NAME }}-*.zip ..
- cd ..
-
- - name: Upload Artifact For Linux x64
- uses: actions/upload-artifact@v1
- with:
- name: kibana-reports-linux-x64
- path: ../kibana/plugins/${{ env.PLUGIN_NAME }}/build/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-x64.zip
-
- - name: Upload Artifact For Linux arm64
- uses: actions/upload-artifact@v1
- with:
- name: kibana-reports-linux-arm64
- path: ../kibana/plugins/${{ env.PLUGIN_NAME }}/build/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-linux-arm64.zip
-
- - name: Upload Artifact For Windows
+ - name: Upload Artifact
uses: actions/upload-artifact@v1
with:
- name: kibana-reports-windows-x64
- path: ../kibana/plugins/${{ env.PLUGIN_NAME }}/build/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}-windows-x64.zip
+ name: kibana-reports
+ path: ./build/${{ env.PLUGIN_NAME }}-${{ env.OD_VERSION }}.zip
diff --git a/.github/workflows/reports-scheduler-release-workflow.yml b/.github/workflows/reports-scheduler-release-workflow.yml
deleted file mode 100644
index 3b1558b1..00000000
--- a/.github/workflows/reports-scheduler-release-workflow.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-name: Release Reports Scheduler Artifacts
-# This workflow is triggered on creating tags to master or an opendistro release branch
-on:
- push:
- tags:
- - "v*"
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_STAGING_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_STAGING_SECRET_ACCESS_KEY }}
- aws-region: us-east-1
-
- - name: Checkout Plugin
- uses: actions/checkout@v1
-
- - name: Set up JDK 1.14
- uses: actions/setup-java@v1
- with:
- java-version: 1.14
-
- - name: Run build
- run: |
- cd reports-scheduler
- ./gradlew build buildDeb buildRpm --no-daemon --refresh-dependencies -Dbuild.snapshot=false
-
- - name: Upload to S3
- shell: bash
- run: |
- cd reports-scheduler
- zip=`ls build/distributions/*.zip`
- rpm=`ls build/distributions/*.rpm`
- deb=`ls build/distributions/*.deb`
-
- # Inject the build number before the suffix
- zip_outfile=`basename ${zip%.zip}-build-${GITHUB_RUN_NUMBER}.zip`
- rpm_outfile=`basename ${rpm%.rpm}-build-${GITHUB_RUN_NUMBER}.rpm`
- deb_outfile=`basename ${deb%.deb}-build-${GITHUB_RUN_NUMBER}.deb`
-
- s3_prefix="s3://staging.artifacts.opendistroforelasticsearch.amazon.com/snapshots/elasticsearch-plugins/reports-scheduler/"
-
- echo "Copying ${zip} to ${s3_prefix}${zip_outfile}"
- aws s3 cp --quiet $zip ${s3_prefix}${zip_outfile}
-
- echo "Copying ${rpm} to ${s3_prefix}${rpm_outfile}"
- aws s3 cp --quiet $rpm ${s3_prefix}${rpm_outfile}
-
- echo "Copying ${deb} to ${s3_prefix}${deb_outfile}"
- aws s3 cp --quiet $deb ${s3_prefix}${deb_outfile}
\ No newline at end of file
diff --git a/.github/workflows/reports-scheduler-test-and-build-workflow.yml b/.github/workflows/reports-scheduler-test-and-build-workflow.yml
deleted file mode 100644
index f61dbdea..00000000
--- a/.github/workflows/reports-scheduler-test-and-build-workflow.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: Test and Build Reports Scheduler
-
-on: [push, pull_request]
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v1
-
- - name: Set up JDK 1.14
- uses: actions/setup-java@v1
- with:
- java-version: 1.14
-
- - name: Build with Gradle
- run: |
- cd reports-scheduler
- ./gradlew build
-
- - name: Upload coverage
- uses: codecov/codecov-action@v1
- with:
- flags: reports-scheduler
- directory: reports-scheduler/
- token: ${{ secrets.CODECOV_TOKEN }}
-
- - name: Create Artifact Path
- run: |
- mkdir -p reports-scheduler-builds
- cp -r ./reports-scheduler/build/distributions/*.zip reports-scheduler-builds/
-
- - name: Upload Artifacts
- uses: actions/upload-artifact@v1
- with:
- name: reports-scheduler
- path: reports-scheduler-builds
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..77852916
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,21 @@
+.DS_Store
+
+*.iml
+.gradle
+out
+local-test
+.local-*
+
+npm-debug.log*
+node_modules
+/build/
+/public/app.css
+.idea/
+.vscode/
+yarn-error.log
+/coverage/
+.history/
+.eslintcache
+
+# Kibana
+.empty
\ No newline at end of file
diff --git a/.gitignore.~1~ b/.gitignore.~1~
new file mode 100644
index 00000000..0bebbcb8
--- /dev/null
+++ b/.gitignore.~1~
@@ -0,0 +1,12 @@
+npm-debug.log*
+node_modules
+/build/
+/public/app.css
+.idea/
+yarn-error.log
+/coverage/
+.DS_Store
+.history/
+.eslintcache
+package-lock.json
+/target/
\ No newline at end of file
diff --git a/.kibana-plugin-helpers.json b/.kibana-plugin-helpers.json
new file mode 100644
index 00000000..cbfa2867
--- /dev/null
+++ b/.kibana-plugin-helpers.json
@@ -0,0 +1,12 @@
+{
+ "serverSourcePatterns": [
+ "package.json",
+ "tsconfig.json",
+ "yarn.lock",
+ "kibana.json",
+ "common/**/*",
+ "scripts/**/*",
+ "public/**/*",
+ "server/**/*"
+ ]
+}
diff --git a/.lintstagedrc b/.lintstagedrc
new file mode 100644
index 00000000..e7e7db11
--- /dev/null
+++ b/.lintstagedrc
@@ -0,0 +1,3 @@
+{
+ "*.{ts,tsx,js,jsx,json,css,md}": ["prettier --write", "git add"]
+}
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 00000000..7dc413d2
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,8 @@
+.vscode
+build
+coverage
+node_modules
+npm-debug.log
+yarn.lock
+*.md
+*.lock
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..f443e3cf
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "trailingComma": "es5",
+ "singleQuote": true,
+ "printWidth": 80,
+ "bracketSpacing": true
+}
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..5b627cfa
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,4 @@
+## Code of Conduct
+This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
+For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
+opensource-codeofconduct@amazon.com with any additional questions or comments.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..cd94f03b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,59 @@
+# Contributing Guidelines
+
+Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional
+documentation, we greatly value feedback and contributions from our community.
+
+Please read through this document before submitting any issues or pull requests to ensure we have all the necessary
+information to effectively respond to your bug report or contribution.
+
+## Reporting Bugs/Feature Requests
+
+We welcome you to use the GitHub issue tracker to report bugs or suggest features.
+
+When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already
+reported the issue. Please try to include as much information as you can. Details like these are incredibly useful:
+
+- A reproducible test case or series of steps
+- The version of our code being used
+- Any modifications you've made relevant to the bug
+- Anything unusual about your environment or deployment
+
+## Contributing via Pull Requests
+
+Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that:
+
+1. You are working against the latest source on the _dev_ branch.
+2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already.
+3. You open an issue to discuss any significant work - we would hate for your time to be wasted.
+
+To send us a pull request, please:
+
+1. Fork the repository.
+2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.
+3. Ensure local tests pass.
+4. Commit to your fork using clear commit messages.
+5. Send us a pull request, answering any default questions in the pull request interface.
+6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation.
+
+GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and
+[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
+
+## Finding contributions to work on
+
+Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start.
+
+## Code of Conduct
+
+This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
+For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
+opensource-codeofconduct@amazon.com with any additional questions or comments.
+
+## Security issue notifications
+
+If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.
+
+## Licensing
+
+See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution.
+
+We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 00000000..67db8588
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,175 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 00000000..6ba6ecfb
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,2 @@
+kibana-reports
+Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..6222e4f4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+[![Kibana Reports CI](https://github.com/opendistro-for-elasticsearch/kibana-reports/workflows/Test%20and%20Build%20Kibana%20Reports/badge.svg)](https://github.com/opendistro-for-elasticsearch/kibana-reports/actions?query=workflow%3A%22Test+and+Build+Kibana+Reports%22)
+[![Reports Scheduler CI](https://github.com/opendistro-for-elasticsearch/kibana-reports/workflows/Test%20and%20Build%20Reports%20Scheduler/badge.svg)](https://github.com/opendistro-for-elasticsearch/kibana-reports/actions?query=workflow%3A%22Test+and+Build+Reports+Scheduler%22)
+[![codecov](https://codecov.io/gh/opendistro-for-elasticsearch/kibana-reports/branch/dev/graph/badge.svg?token=FBVYQSZD3B)](https://codecov.io/gh/opendistro-for-elasticsearch/kibana-reports)
+[![Documentation](https://img.shields.io/badge/documentation-blue.svg)](https://opendistro.github.io/for-elasticsearch-docs/docs/kibana/reporting/)
+![PRs welcome!](https://img.shields.io/badge/PRs-welcome!-success)
+
+# Kibana Reports for Open Distro
+
+Kibana Reports for Open Distro allows ‘Report Owner’ (engineers, including but not limited to developers, DevOps, IT Engineer, and IT admin) export and share reports from Kibana dashboards, saved search, alerts and visualizations. It helps automate the process of scheduling reports on an on-demand or a periodical basis (on cron schedules as well). Further, it also automates the process of exporting and sharing reports triggered for various alerts. The feature is present in the Dashboard, Discover, and Visualization tabs. Scheduled reports can be sent to (shared with) self or various stakeholders within the organization such as, including but not limited to, executives, managers, engineers (developers, DevOps, IT Engineer) in the form of pdf, hyperlinks, csv, excel via various channels such as email, slack, Amazon Chime. However, in order to export, schedule and share reports, report owners should have the necessary permissions as defined under Roles and Privileges.
+
+# Request for Comments ( RFC )
+
+Please add your feature requests here [ New Requests ](https://github.com/opendistro-for-elasticsearch/kibana-reports/issues) and view project progress here [RFCs](https://github.com/opendistro-for-elasticsearch/kibana-reports/projects/1).
+
+## Setup & Build
+
+Complete Kibana Report feature is composed of 2 plugins. Refer to README in each plugin folder for more details.
+
+- [Kibana reports plugin](./kibana-reports/README.md)
+- [Reports scheduler ES plugin](./reports-scheduler/README.md)(TODO)
+
+## Troubleshooting
+
+#### Fail to launch Chromium
+
+There could be two reasons for this problem
+
+1. You are not having the correct version of headless-chrome matching to the OS that your Kibana is running. Different versions of headless-chrome can be found [here](https://github.com/opendistro-for-elasticsearch/kibana-reports/releases/tag/chromium-1.12.0.0)
+
+2. Missing additional dependencies. Please refer to [additional dependencies section](./kibana-reports/rendering-engine/headless-chrome/README.md#additional-libaries) to install required dependencies according to your operating system.
+
+## Contributing to Kibana reports for Open Distro
+
+We welcome you to get involved in development, documentation, testing the kibana reports plugin. See our [CONTRIBUTING.md](./CONTRIBUTING.md) and join in.
+
+Since this is a Kibana plugin, it can be useful to review the [Kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) alongside the documentation around [Kibana plugins](https://www.elastic.co/guide/en/kibana/master/kibana-plugins.html) and [plugin development](https://www.elastic.co/guide/en/kibana/master/plugin-development.html).
+
+## Code of Conduct
+
+This project has adopted an [Open Source Code of Conduct](https://opendistro.github.io/for-elasticsearch/codeofconduct.html).
+
+## Security issue notifications
+
+If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public GitHub issue.
+
+## License
+
+See the [LICENSE](./LICENSE.txt) file for our project's licensing. We will ask you to confirm the licensing of your contribution.
+
+## Copyright
+
+Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
diff --git a/README.md.~1~ b/README.md.~1~
new file mode 100644
index 00000000..51bd9964
--- /dev/null
+++ b/README.md.~1~
@@ -0,0 +1,74 @@
+# Kibana Reports for Open Distro
+
+Kibana Reports for Open Distro allows ‘Report Owner’ (engineers, including but not limited to developers, DevOps, IT Engineer, and IT admin) export and share reports from Kibana dashboards, saved search, alerts and visualizations. It helps automate the process of scheduling reports on an on-demand or a periodical basis (on cron schedules as well). Further, it also automates the process of exporting and sharing reports triggered for various alerts. The feature is present in the Dashboard, Discover, and Visualization tabs. Scheduled reports can be sent to (shared with) self or various stakeholders within the organization such as, including but not limited to, executives, managers, engineers (developers, DevOps, IT Engineer) in the form of pdf, hyperlinks, csv, excel via various channels such as email, slack, Amazon Chime. However, in order to export, schedule and share reports, report owners should have the necessary permissions as defined under Roles and Privileges.
+
+# Request for Comments ( RFC )
+
+Please add your feature requests here [ New Requests ](https://github.com/opendistro-for-elasticsearch/kibana-reports/issues) and view project progress here [RFCs](https://github.com/opendistro-for-elasticsearch/kibana-reports/projects/1).
+
+## Setup
+
+1. Download Elasticsearch for the version that matches the [Kibana version specified in package.json](./package.json#L7).
+1. Download the Kibana source code for the [version specified in package.json](./package.json#L7) you want to set up.
+
+ See the [Kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#setting-up-your-development-environment) for more instructions on setting up your development environment.
+
+1. Change your node version to the version specified in `.node-version` inside the Kibana root directory.
+1. Create a `plugins` directory inside the Kibana source code directory, if `plugins` directory doesn't exist.
+1. Check out this package from version control into the `plugins` directory.
+ ```
+ git clone git@github.com:opendistro-for-elasticsearch/kibana-reports.git plugins --no-checkout
+ cd plugins
+ echo 'kibana-reports/*' >> .git/info/sparse-checkout
+ git config core.sparseCheckout true
+ git checkout dev
+ ```
+1. Run `yarn kbn bootstrap` inside `kibana/plugins/kibana-reports`.
+
+Ultimately, your directory structure should look like this:
+
+
+```md
+.
+├── kibana
+│ └──plugins
+│ └── kibana-reports
+```
+
+## Build
+
+To build the plugin's distributable zip simply run `yarn build`.
+
+Example output: `./build/opendistro-kibana-reports-0.0.1.zip`
+
+## Run
+
+- `yarn start`
+
+ Starts Kibana and includes this plugin. Kibana will be available on `localhost:5601`.
+
+- `yarn test:jest`
+
+ Runs the plugin tests.
+
+## Contributing to Kibana reports for Open Distro
+
+We welcome you to get involved in development, documentation, testing the kibana reports plugin. See our [CONTRIBUTING.md](./CONTRIBUTING.md) and join in.
+
+Since this is a Kibana plugin, it can be useful to review the [Kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) alongside the documentation around [Kibana plugins](https://www.elastic.co/guide/en/kibana/master/kibana-plugins.html) and [plugin development](https://www.elastic.co/guide/en/kibana/master/plugin-development.html).
+
+## Code of Conduct
+
+This project has adopted an [Open Source Code of Conduct](https://opendistro.github.io/for-elasticsearch/codeofconduct.html).
+
+## Security issue notifications
+
+If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public GitHub issue.
+
+## License
+
+See the [LICENSE](./LICENSE.txt) file for our project's licensing. We will ask you to confirm the licensing of your contribution.
+
+## Copyright
+
+Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
diff --git a/THIRD-PARTY b/THIRD-PARTY
new file mode 100644
index 00000000..ee9ee3fd
--- /dev/null
+++ b/THIRD-PARTY
@@ -0,0 +1,203 @@
+** @elastic/eui; version 5.1.0 -- https://elastic.github.io/eui/#/
+
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND
+DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction, and
+ distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by the
+ copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all other
+ entities that control, are controlled by, or are under common control
+ with that entity. For the purposes of this definition, "control" means
+ (i) the power, direct or indirect, to cause the direction or management
+ of such entity, whether by contract or otherwise, or (ii) ownership of
+ fifty percent (50%) or more of the outstanding shares, or (iii)
+ beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity exercising
+ permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation source,
+ and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but not limited
+ to compiled object code, generated documentation, and conversions to
+ other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or Object
+ form, made available under the License, as indicated by a copyright
+ notice that is included in or attached to the work (an example is
+ provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object form,
+ that is based on (or derived from) the Work and for which the editorial
+ revisions, annotations, elaborations, or other modifications represent,
+ as a whole, an original work of authorship. For the purposes of this
+ License, Derivative Works shall not include works that remain separable
+ from, or merely link (or bind by name) to the interfaces of, the Work and
+ Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including the original
+ version of the Work and any modifications or additions to that Work or
+ Derivative Works thereof, that is intentionally submitted to Licensor for
+ inclusion in the Work by the copyright owner or by an individual or Legal
+ Entity authorized to submit on behalf of the copyright owner. For the
+ purposes of this definition, "submitted" means any form of electronic,
+ verbal, or written communication sent to the Licensor or its
+ representatives, including but not limited to communication on electronic
+ mailing lists, source code control systems, and issue tracking systems
+ that are managed by, or on behalf of, the Licensor for the purpose of
+ discussing and improving the Work, but excluding communication that is
+ conspicuously marked or otherwise designated in writing by the copyright
+ owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity on
+ behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of this
+ License, each Contributor hereby grants to You a perpetual, worldwide,
+ non-exclusive, no-charge, royalty-free, irrevocable copyright license to
+ reproduce, prepare Derivative Works of, publicly display, publicly perform,
+ sublicense, and distribute the Work and such Derivative Works in Source or
+ Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of this
+ License, each Contributor hereby grants to You a perpetual, worldwide,
+ non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
+ this section) patent license to make, have made, use, offer to sell, sell,
+ import, and otherwise transfer the Work, where such license applies only to
+ those patent claims licensable by such Contributor that are necessarily
+ infringed by their Contribution(s) alone or by combination of their
+ Contribution(s) with the Work to which such Contribution(s) was submitted.
+ If You institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+ Contribution incorporated within the Work constitutes direct or contributory
+ patent infringement, then any patent licenses granted to You under this
+ License for that Work shall terminate as of the date such litigation is
+ filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the Work or
+ Derivative Works thereof in any medium, with or without modifications, and
+ in Source or Object form, provided that You meet the following conditions:
+
+ (a) You must give any other recipients of the Work or Derivative Works a
+ copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices stating
+ that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works that You
+ distribute, all copyright, patent, trademark, and attribution notices
+ from the Source form of the Work, excluding those notices that do not
+ pertain to any part of the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must include
+ a readable copy of the attribution notices contained within such NOTICE
+ file, excluding those notices that do not pertain to any part of the
+ Derivative Works, in at least one of the following places: within a
+ NOTICE text file distributed as part of the Derivative Works; within the
+ Source form or documentation, if provided along with the Derivative
+ Works; or, within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents of the
+ NOTICE file are for informational purposes only and do not modify the
+ License. You may add Your own attribution notices within Derivative Works
+ that You distribute, alongside or as an addendum to the NOTICE text from
+ the Work, provided that such additional attribution notices cannot be
+ construed as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and may
+ provide additional or different license terms and conditions for use,
+ reproduction, or distribution of Your modifications, or for any such
+ Derivative Works as a whole, provided Your use, reproduction, and
+ distribution of the Work otherwise complies with the conditions stated in
+ this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any
+ Contribution intentionally submitted for inclusion in the Work by You to the
+ Licensor shall be under the terms and conditions of this License, without
+ any additional terms or conditions. Notwithstanding the above, nothing
+ herein shall supersede or modify the terms of any separate license agreement
+ you may have executed with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor, except
+ as required for reasonable and customary use in describing the origin of the
+ Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in
+ writing, Licensor provides the Work (and each Contributor provides its
+ Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied, including, without limitation, any
+ warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
+ FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining
+ the appropriateness of using or redistributing the Work and assume any risks
+ associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory, whether
+ in tort (including negligence), contract, or otherwise, unless required by
+ applicable law (such as deliberate and grossly negligent acts) or agreed to
+ in writing, shall any Contributor be liable to You for damages, including
+ any direct, indirect, special, incidental, or consequential damages of any
+ character arising as a result of this License or out of the use or inability
+ to use the Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all other
+ commercial damages or losses), even if such Contributor has been advised of
+ the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing the Work
+ or Derivative Works thereof, You may choose to offer, and charge a fee for,
+ acceptance of support, warranty, indemnity, or other liability obligations
+ and/or rights consistent with this License. However, in accepting such
+ obligations, You may act only on Your own behalf and on Your sole
+ responsibility, not on behalf of any other Contributor, and only if You
+ agree to indemnify, defend, and hold each Contributor harmless for any
+ liability incurred by, or claims asserted against, such Contributor by
+ reason of your accepting any such warranty or additional liability. END OF
+ TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification
+within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+
+you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+
+distributed under the License is distributed on an "AS IS" BASIS,
+
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and
+
+limitations under the License.
+
+* For kibana-reports see also this required NOTICE:
+ kibana-reports
+ Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
\ No newline at end of file
diff --git a/common/index.ts b/common/index.ts
new file mode 100644
index 00000000..2ba8d437
--- /dev/null
+++ b/common/index.ts
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+export const PLUGIN_ID = 'opendistroReportsKibana';
+export const PLUGIN_NAME = 'opendistro_kibana_reports';
+
+export const API_PREFIX = '/api/reporting';
+
+export const NOTIFICATION_API = {
+ SEND: '/_opendistro/_notifications/send',
+};
+
+const BASE_REPORTS_URI = '/_opendistro/_reports';
+
+export const ES_REPORTS_API = {
+ ON_DEMAND_REPORT: `${BASE_REPORTS_URI}/on_demand`,
+ REPORT_INSTANCE: `${BASE_REPORTS_URI}/instance`,
+ LIST_REPORT_INSTANCES: `${BASE_REPORTS_URI}/instances`,
+ REPORT_DEFINITION: `${BASE_REPORTS_URI}/definition`,
+ LIST_REPORT_DEFINITIONS: `${BASE_REPORTS_URI}/definitions`,
+ POLL_REPORT_INSTANCE: `${BASE_REPORTS_URI}/poll_instance`,
+};
diff --git a/cypress.json b/cypress.json
new file mode 100644
index 00000000..d91f38d7
--- /dev/null
+++ b/cypress.json
@@ -0,0 +1,10 @@
+{
+ "baseUrl": "http://localhost:5601",
+ "video": false,
+ "fixturesFolder": ".cypress/fixtures",
+ "integrationFolder": ".cypress/integration",
+ "pluginsFile": ".cypress/plugins/index.js",
+ "screenshotsFolder": ".cypress/screenshots",
+ "supportFile": ".cypress/support/index.js",
+ "videosFolder": ".cypress/videos"
+}
diff --git a/docs/dev/Kibana-Reporting-Design-Proposal.md b/docs/dev/Kibana-Reporting-Design-Proposal.md
new file mode 100644
index 00000000..d1c0bbe2
--- /dev/null
+++ b/docs/dev/Kibana-Reporting-Design-Proposal.md
@@ -0,0 +1,492 @@
+# Kibana Reporting
+### You don’t have to go a dashboard, we will bring dashboards to you.
+
+---
+
+## 1. Overview
+
+### 1.1 Motivation
+
+The ability to generate reports from dashboards and views on Kibana is a highly requested feature .
+This plugin will introduce the ability to generate reports, as well as enable the user to customize them, receive them on a schedule or monitor, and have the reports received on external channels such as email, Slack and Chime.
+
+- https://discuss.opendistrocommunity.dev/t/reporting-module/153
+- https://github.com/opendistro-for-elasticsearch/community/issues/16
+
+### 1.2 Introduction
+
+Kibana Reports for Open Distro allows ‘Report Owner’ (engineers, including but not limited to developers, DevOps, IT Engineer, and IT admin) export and share reports from Kibana dashboards, saved search, alerts and visualizations. It helps automate the process of scheduling reports on an on-demand or a periodical basis (on cron schedules as well). Further, it also automates the process of exporting and sharing reports triggered for various alerts. The feature is present in the Dashboard, Discover, and Visualization tabs. Scheduled reports can be sent to (shared with) self or various stakeholders within the organization such as, including but not limited to, executives, managers, engineers (developers, DevOps, IT Engineer) in the form of pdf, hyperlinks, csv, excel via various channels such as email, slack, Amazon Chime. However, in order to export, schedule and share reports, report owners should have the necessary permissions as defined under Roles and Privileges.
+
+
+## 2. Requirements
+
+
+1. As a user, I want to see a 'Share >' 'As a report' on the share menu, and a 'Download > ' 'PDF, CSV, PNG' contextually button in the Dashboard, Visualizations, and Discover Tabs.
+1. As a user, I should be able to export and share reports only if I have the permissions to do so. Else, an error should be thrown.
+1. As a user, when I click ‘Share > As a report’ I should be able to configure, save, export and share the report.
+1. As a user, when I click ‘Share > As a report’, the system should allow me to share the dashboard or saved search or visualizations that I am currently working on as a report.
+
+ Here is the matrix showing various panels and what kind of export option should be available.
+ Kibana panel | PDF | PNG |Hyperlink (HTML) | CSV/Excel
+ ------------ | ------------- | ------------- | ------------- | -------------
+ Dashboards | Yes | Yes | Yes | No
+ Visualizations | Yes | Yes |Yes | No
+ Discover (saved search) | No | No | Yes | Yes
+
+### In-context reports
+1. As a user, I can download a PDF, PNG, CSV, XLS file in-context from any available panel (e.g. Dashboards, visualizations, saved searches, etc).
+1. As a user, any time I download a report from any available panel (e.g. Dashboards, visualizations, saved searches, etc), a report will be auto-generated in the reports list.
+1. As a user, I can create a report definition from the share menu of any available panel (e.g. Dashboards, visualizations, saved searches, etc).
+
+### Reporting Landing Page
+#### Reports
+1. As a user, I should see Name, Type, Sender, Recepient(s), Source, Last updated, State, Download on the `Reports` list.
+1. As a user, I should be able to filter my reports list by sender, receiver, status, and type.
+1. As a user, I should be able to search my reports by report name.
+1. As a user, I should be able to view a report details page for any report on the list.
+1. As a user, I should see my reports ordered in reverse chronological order by default.
+1. As a user, I should be able to download the default file format from the reports list.
+1. As a user, I should be able to see a list of reports for the past 100 days.
+1. As a user, archived reports should not be visible by default (the default filter should exclude archived reports) (p2)
+
+
+#### Report definitions
+1. As a user, I should see Name, Type, Owner, Source, Last updated, Details, Status (active/disabled) on the `Report definitions` list.
+1. As a user, I should be able to view, edit and delete a report definition.
+1. As a user, I should be able to enable/disable a report definition
+1. As a user, I should be able to export and import one or more report definitions (as xml or some other format) via APIs
+
+### Create, View, Edit
+#### Create report definition
+##### Report settings
+1. As a user, I should be able to set the report name.
+1. As a user, I should be able to set an optional report descritption.
+1. As a user, I should be able to select a report source type (Dashboard, Visualization, Saved Search)
+1. As a user, I should be able to select a specific source (Dashboard, Visualization, or Saved search, contextually).
+1. As a user, I should be able to select the default file format for my report, contextual to my selected source (PDF, PNG, CSV, Excel, etc)
+1. As a user, I should be able to add a `Header` and `Footer` to PDF and PNG reports.
+ 1. As a user, I should see Report title and a sample paragraph in the `header` by Default.
+ 1. As a user, I should see date, time and report name in the `footer` by Default.
+1. As a user, I should be able to select which charts/visualizations I can include in a PDF or PNG report. (p2)
+
+##### Report trigger
+1. As a user, I should be able to select a report trigger type that belongs to one of two categories: `Schedule`, and `Alert`.
+1. As a user, when I select `Schedule`, I should be able to select a request time of now, future date, recurring, or custom cron expression (similar to alerting).
+ 1. As a user, if I select `now`, I should be able to generate a report immediately after saving the report definition.
+ 1. As a user, if I select `future date`, I should be able to configure the date and time the report will be generated.
+ 1. As a user, if I select `recurring`, I should be able to configure a recurring schedule.
+ 1. As a user, if I select `custom cron`, I should be able to configure a cron-based schedule.
+ 1. As a user, if I select `recurring` or `custom cron`, I should be able to configure an end date.
+1. As a user, when I select `Alert`, I should be able to select the alert a report gets triggered from.
+
+##### Delivery settings
+1. As a user, I should be able to deliver a report to Kibana and/or Email recepients.
+1. As a user, when I set Kibana as a delivery channel, I should be able to select which Kibana users the report gets delivered to.
+1. As a user, when I set email as a delivery channel, I should be able to set recepients, email subject, and email body.
+1. As a user, I should be able to insert a file URL refecence to the email body.
+1. As a user, I should be able to insert the report source URL reference to the email body.
+1. As a user, I should be able to attach the report file to an email.
+1. As a user, I should be able to set the file format of report attachment (pdf, png | csv, excel, depending on the source).
+
+#### Report creation
+1. As a user, when I create a report definition, the definition settings are saved and show up as a list item in the ‘Report definitions’ list.
+1. As a user, when a report definition has been triggered via schedule or alert, I should be able to see an instance of the report in my "Reports" list, and any users I send the report to, will also see a report instance in their repective "Reports" list page.
+1. As a user, when a report is created from a triggered definition condition, I should receive a notification on all configured delivery channels (Email, chime, slack, etc)
+1. As a user, when a new report is available I should see a notification status in the reporting icon in the sidebar
+1. As a user, when a report fails due to an error, I should see the report with a failed status on the `Reports` list.
+1. As a report definition owner, when a report fails to trigger due to an error, I should receive a kibana toast alert letting me know that the report failed.
+
+#### View report definition details
+1. As a user, I should be able to view all my saved definition settings.
+1. As a user, I should be able to edit, duplicate or delete a report definition.
+ 1. As a user, when I delete a report definition, any schedule or alert based triggers will automatically stop.
+
+#### Edit report definition
+1. As a user, I should be able to edit the report settings, triggers and delivery settings.
+1. As a user, I should be able to save my updated report definition.
+
+#### View report details
+1. As a user, I should be able to see both created date, and last updated date.
+1. As a user, I should be able to share an existing report.
+1. As a user, I should be able to archive an existing report. (p2)
+1. As a user, I should be able to downlaod available report files (PDF, PNG, CSV, Excel, etc)
+1. As a user, I should be able to copy the permalink to a report source.
+1. As a user, I should be able to view the report shared with me via email as an embedded HTML.
+
+##### Sharing or archiving an existing report
+1. As a report owner, I should be able to share or archive a report.
+ 1. As report owner, I should be able to add new email recepients, and new kibana recepients to an existing report.
+ 1. As a report owner, I sholud not be able to remove existing email or kibana recepients from an existing report.
+ 1. As a report owner, I should receive a Kibana toast notification when a report has been delivered to new recepients.
+ 1. As a report recepient, I should not get new notifications or emails when additional users have been added to an existing report.
+1. As a report recepient, I can only archive a report.
+
+
+
+### Functional
+* The user should be able to create/modify reports both through the Kibana UI or programmatically through APIs.
+* Ability to schedule/trigger reports periodically (a cron based schedule) or at a given frequency continuously or within certain time range.
+* Ability on instantly create downloadable reports or deliver scheduled reports via external channels.
+* Ability to enable/disable report generation
+* Ability to generate download logs as part of fine-grained audit logs.
+
+### Non-functional
+
+* In the absence of missing subsystems such as a Elasticsearch report scheduler plugin, the scheduling UI should be hidden or present the user with correct messaging (for example limited functionality)
+* The service should be reliable - we should be able to generate a report in an acceptable time frame or else abort.
+* **Security** - a user should not be allowed to create reports of resources they don’t have access to. For example, if a user should not be able to generate report of dashboard with index-pattern they do not have read permissions to.
+
+
+
+## 3. Design
+
+From implementation point of view need to answer/solve four problems:
+
+### 3.1 What: (Report Configuration)
+
+We will provide user to generate two kind of reports :
+
+1. Based on Kibana dashboards **TODO**: Investigate how dashboards are defined
+2. Based on queries
+ 1. SQL queries
+ 2. Elasticsearch DSL (Out of Scope) - Though this will be a great feature to have, we will have to scope down what kind of Elasticsearch queries can be supported (depending on whether how easily it can be CSV formatted) and re-implement the CSV formatting logic from Elasticsearch JSON response.
+
+
+
+![Dashboard Reports](img/dashboard_reports.png)
+
+*Figure -1*
+
+![SQL Reports](img/SQL_query_report.png)
+
+*Figure -2*
+
+### 3.2 When: (Schedule or Trigger)
+
+We should expose the APIs to generate reports on-demand (instantly) and to schedule periodically (cron like) or continuously with fixed intervals. Any external or integrated scheduler/trigger will be a consumer of instant report generation API with a mandatory report delivery channel.
+
+
+### 3.3 Where: (Notification)
+
+Storing the reports **TODO: why we don’t want to store reports, kibana detached mode, ; kibana locally on each node**
+
+1. For instant on-demand reports, if requested through browser or any HTTP client the reports
+2. For reports triggered by non-browser clients (ODFE Report scheduler plugin , ODFE plugin), it will be mandatory to provide delivery channels such as email, Chime or Slack endpoints.
+
+
+![Delivery channels](img/delivery.png)
+
+*Figure - 3*
+
+### 3.4 How:
+
+**(I)** We want to reduce time to market and avoid reinventing the wheel. To create PDF/PNG based reports for dashboard we will be relying on open source headless browser libraries.
+
+List of curated headless browsers https://github.com/dhamaniasad/HeadlessBrowsers
+
+|Binding |Library |Comments/Info |
+|--- |--- |--- |
+|NodeJS |[Puppeteer](https://developers.google.com/web/tools/puppeteer) |[Github](https://github.com/puppeteer/puppeteer), [NPM](https://www.npmjs.com/package/puppeteer) |
+| |[Horseman](https://www.npmjs.com/package/node-horseman) | |
+| | | |
+|Java |[Selenium](https://www.selenium.dev/) |No support for PDF generation |
+| |[jBrowserDriver](https://github.com/MachinePublishers/jBrowserDriver) |No support for PDF generation |
+
+**(II)** To generate CSV reports based on SQL queries, we will be leveraging OpenDistro SQL plugin with **`format=csv`**
+
+```
+POST _opendistro/_sql?format=csv
+{
+ "query" : "SELECT ... FROM ... WHERE ... ORDER BY ..."
+}
+```
+
+
+Based on the above technical requirements, we propose the following architectures.
+
+### 3.5 Architecture Considerations
+
+### 3.5.1 Architecture - 1
+
+In this architecture , the Kibana backend plugin will handle both the report generation logic as well as scheduling mechanism.
+
+![Architecture 1](img/arch_1.png)
+
+
+**Pros:**
+
+* Easy to manage in terms of release and distribution since all the report generation, notification and scheduling are embedded in a single application.
+
+**Cons:**
+
+* Kibana is not distributed by nature. In the absence of leader election capabilities where multiple Kibana instances are running with reporting plugin, the same report will be generated per instance of Kibana.
+* Effort to create integration scheduling module.
+
+### 3.5.2 Architecture - 2
+
+In this architecture , the Kibana backend plugin will handle only the report generation logic and the scheduling functionality will be delegated to a separate Elasticsearch plugin
+
+![Architecture 2](img/arch_2.png)
+
+
+**Pros:**
+
+* No need to reinvent the integrated scheduling mechanism, since we can leverage ODFE Job scheduler plugin.
+* Extending job scheduler plugin will allow us to make sure that only one instance of Kibana handles report generation and thus eliminate coordination among Kibana instances.
+
+**Cons:**
+
+* This will introduce hard dependency on report scheduler plugin.
+* Multiple indices to manage.
+
+### 3.5.3 Architecture - 3
+
+In this architecture , the whole report generation and scheduling functionality will implemented as Elasticsearch plugin. Kibana backend will act as a proxy between Kibana UI and ES plugin.
+
+![Architecture 3](img/arch_3.png)
+
+**Pros:**
+
+
+* Since Kibana server plugin will act as proxy, the Kibana APIs will have chances of modification and in the future
+* Reduced interprocess communication between Kibana server and Elasticsearch, thus reduced latency and minimal coordination errors.
+
+**Cons:**
+
+* Lack of Java based headless browser that can generate PDF’s.
+
+
+
+### **3.5.4 Decision:**
+
+Because of the limited distributed nature of Kibana sever and added effort to develop a stable scheduling mechanism as part of Kibana server plugin, we need to eliminate option ***3.5.1. ***Though ***3.5.3*** would be an idle choice to go with, lack of core functionality (to generate PDFs) as Java/Kotlin binding prohibits to go with that approach. ***3.5.2 ***allows to reuse existing libraries and plugin extensions, and would be the choice of implementation.
+
+
+## 4. Detail Design
+
+### 4.1 Data Model
+
+TODO: write-up
+
+![Data Model](img/data_model.png)
+
+TODO: Add index mappings .
+
+### 4.2 Kibana Server APIs
+
+All the Kibana Server APIs will be exposed as HTTP(S) RESTFul APIs.
+
+API calls are stateless. Each request that you make happens in isolation from other calls and must include all of the necessary information for Kibana to fulfill the request. APIs may optionally take JSON formatted request body.
+API requests return JSON output, which is a format that is machine-readable and works well for automation.
+
+List of existing [Kibana REST APIs](https://www.elastic.co/guide/en/kibana/master/using-api.html)
+
+**(A) generateReport**
+
+To create one-time reports
+
+```
+# used to create one-time instant report from browser which will be downloaded
+#in the browser (user might be prompted for download location)
+generateReport(report_config)
+
+
+```
+
+To create one time reports will external delivery channel
+
+```
+# used to create one-time instant report delivered to a destination
+# useful to non-browser usecases, for example ad hoc command line report creation
+# via curl or scripts
+generateReport(report_config, destination)
+```
+
+Used by external triggers such as Reporting Scheduler Plugin and Alerting plugin, with delivery predefined as part of report definition
+
+```
+# this will be used by job scheduler
+generateReport(report_id)
+
+```
+
+**(B) createReport**
+
+Create a schedule report with destination
+
+```
+# to create schedule reports - report configuration , schedule and destination
+# are all mandatory
+createReport(report_config, schedule, destination)
+
+```
+
+
+**(C) listReports**
+
+```
+# list report details for a specific report
+listReports(report_id)
+
+```
+
+```
+# list all reports
+listReports()
+
+```
+
+
+**(D) updateReport**
+
+Update different attributes of the report like report configuration and/or schedule and/or destination
+
+```
+# updates report config , for example changes in custom header , footer, layout,
+# format (pdf -> png) etc
+updateReport(report_config)
+
+```
+
+```
+# updates schedule frequency or disable temporarily
+updateReport(schedule)
+
+```
+
+```
+# update deleivery methods for example from chimr to email
+updateReport(destination)
+
+```
+
+```
+# update report configuartion and/or schedule and/or destination or
+# a combination thereof
+updateReport(report_config x schedule x destination)
+
+```
+
+
+**(E) deleteReport**
+
+```
+# delete report definition by report_id, this will delete report definition
+# and associated schedule, but will leave report config and destination intact
+deleteReport(report_id)
+
+```
+
+
+**(F) createDestination**
+
+```
+# create a new destination
+createDestination()
+```
+
+
+**(G) listDestination**
+
+```
+# useful API for use in Kibana UI to help resuse destinations (via dropdown)
+listDestination()
+```
+
+
+**(H) updateDestination**
+
+```
+# modify an existing destination
+updateDestination(destination_id, updated paramter values)
+```
+
+
+**(I) deleteDestination**
+
+```
+# delete an existing destination by destination_id
+deleteDestination(destination_id)
+```
+
+
+**(F) listReportEvents**
+
+List all the instances of report generation/failure for audit/testing/security inspection
+
+```
+listReportEvents()
+
+# filtered API
+listReportEvents()
+```
+
+### 4.3 Job Scheduler APIs
+
+https://github.com/opendistro-for-elasticsearch/job-scheduler
+
+**(A) createSchedule**
+
+**(B) updateSchedule**
+
+**(C) deleteSchedule**
+
+### 4.4 Workflows
+
+Scheduled Report Creation workflow
+
+![Scheduled Report Creation workflow ](img/workflows.png)
+
+### 4.4 Alerting Integration
+
+https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/
+
+ODFE Alerting can be used as an external trigger. To generate the report the `generateReport()` API can be utilized as `custom_webhook` destination.
+
+```
+POST _opendistro/_alerting/destinations
+
+{
+ "type": "custom_webhook",
+ "name": "my-custom-destination",
+ "custom_webhook": {
+ "path": "/api/kibana/generateReport/", <-----
+ "header_params": {
+ "Content-Type": "application/json"
+ },
+ "scheme": "HTTPS",
+ "port": ,
+ "query_params": {
+ "token": "R2x1UlN4ZHF8MXxxVFJpelJNVDgzdGNwXXXXXXXXX"
+ },
+ "host":
+ }
+}
+
+```
+
+
+
+### 4.5 Security Considerations
+
+TODO
+
+
+
+* * *
+
+## Appendix
+
+### (I) Resources for API Design principles/best practices
+
+* https://www.toptal.com/api-developers/5-golden-rules-for-designing-a-great-web-api
+* https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design
+* [Designing RESTFul APIs - Lynda.com](https://www.lynda.com/Web-Development-tutorials/Designing-RESTful-APIs/642497-2.html?srchtrk=index%3a38%0alinktypeid%3a2%0aq%3arestful%0apage%3a1%0as%3arelevance%0asa%3atrue%0aproducttypeid%3a2) (Access for free with free KCLS membership https://kcls.org/library-cards/)
+* OpenAPI - https://swagger.io/
+
+### (II) Security reference
+
+* https://opendistro.github.io/for-elasticsearch-docs/docs/security-configuration/concepts/
+* https://opendistro.github.io/for-elasticsearch-docs/docs/security-access-control/
+* https://opendistro.github.io/for-elasticsearch-docs/docs/security-access-control/api/
+
diff --git a/docs/dev/img/SQL_query_report.png b/docs/dev/img/SQL_query_report.png
new file mode 100644
index 00000000..36c631b3
Binary files /dev/null and b/docs/dev/img/SQL_query_report.png differ
diff --git a/docs/dev/img/arch_1.png b/docs/dev/img/arch_1.png
new file mode 100644
index 00000000..6c2f35d4
Binary files /dev/null and b/docs/dev/img/arch_1.png differ
diff --git a/docs/dev/img/arch_2.png b/docs/dev/img/arch_2.png
new file mode 100644
index 00000000..c406ee1f
Binary files /dev/null and b/docs/dev/img/arch_2.png differ
diff --git a/docs/dev/img/arch_3.png b/docs/dev/img/arch_3.png
new file mode 100644
index 00000000..67b14161
Binary files /dev/null and b/docs/dev/img/arch_3.png differ
diff --git a/docs/dev/img/dashboard_reports.png b/docs/dev/img/dashboard_reports.png
new file mode 100644
index 00000000..5a13cde4
Binary files /dev/null and b/docs/dev/img/dashboard_reports.png differ
diff --git a/docs/dev/img/data_model.png b/docs/dev/img/data_model.png
new file mode 100644
index 00000000..4dad7cde
Binary files /dev/null and b/docs/dev/img/data_model.png differ
diff --git a/docs/dev/img/delivery.png b/docs/dev/img/delivery.png
new file mode 100644
index 00000000..7509798b
Binary files /dev/null and b/docs/dev/img/delivery.png differ
diff --git a/docs/dev/img/matrix.png b/docs/dev/img/matrix.png
new file mode 100644
index 00000000..b8953dea
Binary files /dev/null and b/docs/dev/img/matrix.png differ
diff --git a/docs/dev/img/workflows.png b/docs/dev/img/workflows.png
new file mode 100644
index 00000000..ee109c65
Binary files /dev/null and b/docs/dev/img/workflows.png differ
diff --git a/docs/dev/resources/SQL_query_report.drawio b/docs/dev/resources/SQL_query_report.drawio
new file mode 100644
index 00000000..78d3caf2
--- /dev/null
+++ b/docs/dev/resources/SQL_query_report.drawio
@@ -0,0 +1 @@
+1VhJk9soFP41OmZKK20fvSWZqsxUp1yTZW4IkEw1FhqE23Z+/YAE2u2oE02S6T5YfG/hbTw95ASb4+WNgPnhD44Jc3wXX5xg6/i+7wKgfjRyrRDPi8IKSQXFBmuAPf1CDOga9EQxKTqMknMmad4FEc8ygmQHg0Lwc5ct4ay7aw5TMgD2CLIh+pFiebBuuG5DeEtoejBbLyJDOELLbIDiADE/t6Bg5wQbwbmsno6XDWE6ejYuldzrG9TaMEEyOUXgcbHb4cz78CTfgViCt38//fX6VVBpeYbsZBze7D84PoDH3AnWWVzoH2O/vNqgCH7KMNF6PUU+H6gk+xwiTT2rOlDYQR6ZISeUsQ1nXJSyQZIkPkIKL6TgT6RFwSAGEagpNtxBbUHbV+P+MxGSXFqQ8f0N4UcixVWxGGq4NHkwlegvzPrcSqvN1aGVUWAwaCoprVU3wVYPJt4viD0YxH4QaJLhlS5itUIMFgVF3diqcIjrJ7Vw7eKzXvwW2eX20iZur3Z1ofKT1aGeW1Jq1QjpRVvmkQiqnCfCYDfzIqFIifx64RHcOX7D7LWyE40kx2KCMCjpc/fQjmXM7PDIqbK4Lg6/VxwBiLoqCn4SiBip9iHrKYrcG1VmFVWBGSgqC6h2+9tryvNGigowFa21hLEqK9+NucCkOnLgn5PuPmuveeyEvKZrr6IOE1LG5BBjmqUd1rDD1ZSyBY3ylSJarVUh1WkdIVUmv0KcMZgXpOKpV60NQWp+K49jrt47fVCM2hVD9JSWfU1vo1uS3kN1JfiAlqFfm9IlJuVfz07jQn7RG3Gm8lXyLhdx4nt3rD3oMmE0zTqGMZLIoVAGj8QKqkLRst+hrZBQzqhOe3xHlwbF1LR8V0SxRVZxrA5ga398m/fjavj+myToh3cZX+T2rWokMPFxMFPB1SZuDiSb6OTmW6PjgfmiM4/XW/jcrdQ71v/+bqqb/nxu/tgieCSqlU9z8s/PU49E9PJoaHCscWu8eoVZvDcsqUFQ463xaDBiIlf/O2NDqe7jwZqrgTJh5cClWRTSzLp3B57pg6gX9mYNf2QQHZt1lv/VIOoNJ9HdBemb3IxzP4ZkkYzO/QAtSJw4/bk/nCfc/bk/WEY/ee73Hv5fg//NJFRD8YRp9Ku3AVuBv8h1IOhN8cHDTNeB0P/B14HFoNT279WrzH1/ImU8y9u+CldxYnJCQ7UTIFKloF85a30OKYJsZQhHirEWXyuV9EvZrqsiyrWLpdPR2om2WtdJ8qL63jPSLgBePIBwrF0EqygMSgmeybEePkuPjsbz1m4a4UgB9vM7oWmoZfMRqEp88y0t2P0L
\ No newline at end of file
diff --git a/docs/dev/resources/arch_1.drawio b/docs/dev/resources/arch_1.drawio
new file mode 100644
index 00000000..3a864a07
--- /dev/null
+++ b/docs/dev/resources/arch_1.drawio
@@ -0,0 +1 @@
+7Zhdb5swFIZ/TaTtohXgQJLLNO22ap0WtcvWXRpwwKrBzJiG9NfvEAwBTNSsC92krTfF5/gDv8/rDzJCiyh/L3ASfuI+YSPL8PMRuhxZlmU4DvwrItsyYpr2uIwEgvoqtg/c0SeigoaKZtQnaaui5JxJmrSDHo9j4slWDAvBN+1qa87aoyY4IFrgzsNMj36jvgyraRjGPvGB0CBUQ09tlYhwVVkF0hD7fNMIoasRWgjOZfkU5QvCCvUqXcp27w5k6xcTJJbHNCCG7U+Wyf02d1f56ot8vH36eobKXh4xy9SEP167OMYQW7IsoDE8vLnlmSTirZqG3FbaCJ7FPim6N0foYhNSSe4S7BXZDdgBYqGMmEqvKWMLzrjYtUXr9dryPIinUvAH0sj4juvYTp2pVEcQUS9LhCT5QRXMWltwJeERkWILVVQD21E4lCEtZJflTYNuhSxsgDWRCmLlqKDuey86PCjdf4GBozHQlAbvJMWjt2UUJBfPy+2WbG7cOoC9h2BH7HMmoRdygMvUI/1c3Kk9BnMPxGUy63CxjuUyHorLROMy9ySocQhOFrGyAroopKCwidxgl7AlT6mkPIYqLpeSR1CBFYmLGkl7YcBfo485o0HRVvIOYl5yXNQ7n6HjJKZvk0kfzpkzQdg5DTxz2oHn6PBQDztnKHSmddS+RhIOGscBFFbXp93fjhB+kHWE0F+3v5l9G5zDZLEpwUMgdzMvA2sO02xCcH5kvEqcpbvrwRwqmCjJ98mql5rx6rrqEN647LM9DoQbY3e4g/qyDbcNMebF7tkirkJYrVUPaBHRs4gj6vvFML1u2vvNOJEZbLuzLg3NDJMeL1iDWUHfU4eyAlVWuCMCNPxvh+LuM+lu07od6ovt6/hh9vzdh8T+vLjIFzoynKa0vJ1gIfVwgxFoIrb3Srxd4XtROLer4mXeTF5uWzoTX/ss6KgM3yFYBEQ+ewrpOBpy2z1qVzFBGJb0sf0efQjUCEtOdyum+vgy27SR0aGY8kx4RLVqfjh0OkId24y7diiF0DraOaKe9stNUk19AJMcC/tPMRzbnRU7m53bL6PY/fDR7DA0Rf1K9q9QdLrX45dT7H4mvTpF/QeD3z/Ax30H+BWQhrMyJVh44f/jGzJTo3Obm+nH9+w0pzcU9z9Mld7Z/76Hrn4C
\ No newline at end of file
diff --git a/docs/dev/resources/arch_2.drawio b/docs/dev/resources/arch_2.drawio
new file mode 100644
index 00000000..e02a4895
--- /dev/null
+++ b/docs/dev/resources/arch_2.drawio
@@ -0,0 +1 @@
+7Vnbcts2EP0azbQP9pCEBVKPtuK0nrpTTVy36SNEQiQaiGBB0BLz9QEIgHdZSiw66SR+MXGwWBB7FnuhZmC53f/CUZb8ziJMZ54T7WfgzczzPAdC+U8hpUZc15lrJOYkMlgDPJCP2ICOQQsS4bwjKBijgmRdMGRpikPRwRDnbNcV2zDa3TVDMR4ADyGiQ/RvEomkPobTTPyKSZyYrYO5mdgiK2yAPEER27UgcDsDS86Y0E/b/RJTZT1rF73u7YHZ+sU4TsUpC7Azj/xV9r7crx/3j3+Kp3cf/7rwFlrNE6KFObF5W1FaE+BIWsQMGRcJi1mK6G2D3nBWpBFW+zhy1MjcM5ZJ0JXgv1iI0tCLCsEklIgtNbN6T7XRwcMZKGcFD/EzJwLGSRCPsXhGzvVqDqT3YrbFgpdyIccUCfLUfRFkvCiu5RpDywdj68+wOxiY/be7NUqRxFa0iEkqH356xwqB+c8DQhpzK9vtEiLwQ4Yqq+zkNeyadkMoXTLKeLUWbDYbLwwlngvOPuDWTATXcA7rGevtoKbnCXOB988TNLSnWXBl74UJBB4wcWDXuVUaS1oXygXORBzA464v72ymHsOSEmlyftzca83N/boGUPghrhj7oxBSCz7ASxDicV7WwVwZbyJeAr/Hi3cqL1dT8eIPeLkOhbTGIXKKLdUC4EaZgsjgfY/WmK5YTgRhqRRZMyHYVgpQNXFTU9K9GPKvpeOaklitFaxHMdM8LuuM4wzpxG40x/4YnQvoAwTPQ54b9MiDQ/LACHdwKuq8IXf/83TieifmE/A104l9yyP5BGfSmCSN5eDx7rx55QSHnyR+ef0rMJZXvFfNK+5YYoFUqGQgH2JRnVwDGyaP2SYB/lcwO3GRVw5+LQVckO2bSaul5vjxziqUb6x1dveRcGvvHu/S+qJLbpfElKms1WHcQMjEyFCyhflI8NySKKru9Jg3de/5GZwB2ObCOoMtOlrO4I/4gjeZK4zFw2lcgRhXeMBc2vCHO1Q153F3qBu51/GHU9qtNLpWjauyI0V5TnRViLgYwl+Q84bWalljPmIMi52cycwOK0Yqh7aB2u0GauD0jKxTsVnV7mP7ioIjinSqHiiqCKuP/YIax/1uObxyzsRhvxt8dQ6H9dK5OMR7It6r50sHQDP+R8W0y8AJzPjN3gS5alDaQSoPpZZeOJeO51vELPYWFmhWV6OypWuFOZG2UbG3keiDp3rZGT+2wK/ptbAfeWyX9Lle63sDRZc9VVP77fC70cvriauxeuJW+rZM3TlGPEx+VBNyJuh3GothNbF4zWLCG/YZPdYc3fGpqjBMcFRQVRjWDeEZu78I4WAz+vUKhgFeb6bq/iDsd38jFd7YF5BgKlLA91sdzCHokuEHXxZn1WfoZxVNHGXBhNWBzfF1dtbpHSzAsfT+slT+badof9G7x/37earrBP2Wr6/ogOtI0lDZEsuUQH74hQN3fJ/GE7XGE/1SDpsfArV483squP0E
\ No newline at end of file
diff --git a/docs/dev/resources/arch_3.drawio b/docs/dev/resources/arch_3.drawio
new file mode 100644
index 00000000..47ff1c53
--- /dev/null
+++ b/docs/dev/resources/arch_3.drawio
@@ -0,0 +1 @@
+7Vlbc5s4FP41ntl96A4gg+3HxHXbTLOzmbpp91XAMagRiAoR2/31ewBxJ4k3sd3ppHlw4NORjnS+c5M9Icto917SJPxb+MAnluHvJuTtxLIsw3HwX47sS8Q0DbtEAsl8jTXAmv0ADRoazZgPaUdQCcEVS7qgJ+IYPNXBqJRi2xXbCN7VmtAABsDao3yIfmW+CutjGM3AB2BBqFXPbT0Q0UpYA2lIfbFtQWQ1IUsphCqfot0SeG69yi7lvHcPjNYbkxCrQyaAYfuzm+Tf/c693d1+Vveffnx5Yy3KZe4pz/SJ9W7VvjIB+GgR/SqkCkUgYspXDXopRRb7kOsx8K2RuRYiQdBE8Bsotdf00kwJhEIVcT1a6swVPXg4DaUikx48ciKinYTKANQjcqZVc4DeCyICJfc4UQKnit13N0K1FwW1XGNofNC2/h92JwOzf7xyaUwRu+FZwGJ8+OOrkHdpqR1tIcUO9S6LLfpM5s6OQ4UqCd8zSFVaBAd+rNb5BL1OPiOlEVQLfWRa0Vu4/4yhlP45YLzhMydnGzIF64QWZt9inHe52zDOl4ILWcwlm83G8jzEUyXFHbRGfMd1bKceqcKJIOLTNKz1adOAVLB73B2G7OkJ0yoKddqxiM4621YMT7VM2ApfkxgnYtx5OtAwQyT5o7fnDO0vn7a9WxJ17dYA9e6Cgr5/MoWrwAMkzT0YJ8md27nxxkg6Ai/zWY8Xa4QXc4yX6al4mQ14ufAUWuMhcrKIlwLkMjcFw1JxTV3gNyJliokYRVyhlIhQgOcDlzUl3SjBv9YaF5wF+VwlehSLksdlXd+MIZ1g+jbMxuhcODNCneOQZ8575DlD8sgId86pqLOG3P3ixcu0Dqxe5GcWr2qXj1evT5CgMVkc4Mvt1XGLzAEOf5L8ZfVDYKyuWGetK+ZYYXG4yosBPgSqOHkJbESsOiQ43zNRDbxJCwe/QAGTJLtmsFql5vj2qloQd1yu2dWDcEt3j3e0vuqS2yUxFnnV6jCuIapzpIdsgRxJnhHz/SKmx7ypG+dHcAZSXWUqZ6iajpYzzEZ8wTqZK4zlw9O4QtVDrkGiDX+7Q95z9nub6UhuMM7qD4dc7mL/Ir8m53bkNE1Z2RVSqYbwM2re0Fota9gjxqiwgyuZ1nAjWOHQVaI2u2QQo2fkshTrWe1bc3+h+RMLlaV6sFBBWH3sF/Q45qvlcGocicP+bfDsHA5v+y/Py9OxvLxCnjEFpkClF/7Oyjgy73dsi2GRXpwzKVtn69d6zmC0G/KqTX++h7ykffcpzDejXz843hzczanad8fpt+9DZzDHrrCna9/J683v9qIfmou/7Odl+D6x587w5PV2WrPjsTj4dnC41LN5xNfmp5ZSvPnFiqz+Aw==
\ No newline at end of file
diff --git a/docs/dev/resources/dashboard_reports.drawio b/docs/dev/resources/dashboard_reports.drawio
new file mode 100644
index 00000000..a6f34399
--- /dev/null
+++ b/docs/dev/resources/dashboard_reports.drawio
@@ -0,0 +1 @@
+7VhNc5swEP01PsYDCAg+xnY+DvlwJ5k2PXUEkkGtQETINu6vrwTCgHDGScaJL50cwr6VdqW3D7TyCMzS8prDPLljCNORY6FyBOYjx3Es35f/FLKtEdu2vBqJOUEaa4FH8hdr0NLoiiBc9AYKxqggeR+MWJbhSPQwyDnb9IctGe1nzWGMB8BjBOkQ/UGQSHbbsFrHDSZxolMHnnaksBmsgSKBiG06ELgcgRlnTNRPaTnDVLHX8FLPu3rFu1sYx5l4y4Ttb39y9rD49f1lcj/5dp9/f9o8nDl1lDWkK71hvVixbRjIGckE5pdrmUeRaY/AdLcXSxoIFglG2khESptBgrM/eMYo4xLJWCYDTikMMV2wggjCMglHWAWXjjXmgkjeb40BIROCpZ0BF5TEyiFYLlGorV2cJaG0yTlygGepv3rJudpRWsZKquO0iCAes7QYq/WHDHKkuZB5cPkqyfaudFL0mKVY8K0c0kzwdbW13kFT/U1HPEBjSUc3E41Brdd4F7otqXzQVX1HhcGgwov51aDInK0yVBVRVW6TEIEfcxgp70bS1S+sQTHycIDcQcGlJ3BCIL8Ajad5gYBEjsC1O+lz7bh7uHb2cO1/FtfukOv766NyvVwunSjaxzXyQ9/7Mq4B8E7MtTfg+ubp7va4ZAcR3k92GHhu/VXpke1+DtnuyYV9fviYwBm6UOet+hZTWBQk6nMr9863z/qUqIyfyhh7jTkvu875Vlt1IowGx7TBpuwLII+xOPQpHLLeYdXbQ2qDcUyhIOv+MvYxrTMs1LnZFtUx3yCzWAVb8QjrWd1z3AgEXCOQbQSqeRgEqgq/2/bHtRCcTgu4JOK5iSGfO7Ok1U5SRnfOAnMit636g3dqqi7K4QbqoPbcU2oPWIZkzj+oPc8I5ARfq73Jf+19QHveSbVnG9ozJfNm7RmBBi3zJ2uvSd8Tn08lW9NQPsSiKm4NLFm18laW/suKNY6zorrlXsgBtpeXrbOJMm8vJHU4ud46Yj+LhDuZjfdAth+ir/zBVcm8UaUEITV9yrFcIgyrUEqz1RWwYtmbjry5irUSrN5GFfoITY8dGE2PPewwJ3tk6ry/55Fme+2u5dH+egEu/wE=
\ No newline at end of file
diff --git a/docs/dev/resources/data_model.drawio b/docs/dev/resources/data_model.drawio
new file mode 100644
index 00000000..89f32321
--- /dev/null
+++ b/docs/dev/resources/data_model.drawio
@@ -0,0 +1 @@
+7V1bd9q4Fv41rHXmIVm+gnlsIemcNelMJnTmdJ5YwhagE2NRWW6gv34kW/JFMgmh2DiBPrRoy5LM3p8+bW1t0Z49Wm0+EbBefsYBDHuWEWx69rhnWbbZ77N/uGSbSUzTcDPJgqBAyArBBP2AQmgIaYICGFcepBiHFK2rQh9HEfRpRQYIwU/Vx+Y4rI66BguoCSY+CHXp/1BAl/nXMIqKXyFaLMXQnisqVkA+LATxEgT4qSSyb3r2iGBMs0949n/+BSwjBDOmxfS5rCWBa0zoVOorE8pS0dVqM4IhU/9tVmQfRJeVWgOpCiAwouU3vd3RABpuMLhff91uZn9t/vpCvz/8+PtqOMy6+Q7CRKjsIX1d8aXpVmoyfkKrEESs9NFfojC4A1uc8IFjCvxHWfq4xAT9wBEFXAUmE7BqQgUwbKPyxIS3ZGIunaMwHOEQk3Q0ez6fW77P5AQnUQAD0dmctRN9mY4si3c00sEIfswtbfH2MGbP30stGbnoDsRUvqI0La8NQLxMx+MFEKJFxD77rDUkXEB8OX4/H6/03kF/1nd5jVArJBRudhrMLBn/E8QrSMmWPSIaXNl9gT0x+zxRfCohWT6yLIHYlJgFYvYs8r6tMr4ERF4Bl3zelPBSwNtibGGbmYpTWQRWUJeyuT5Hi2qD2GdKT0JYlTLqoCgCFOGoWlH5qABV2iyEc6qZKMIpgstoE6J4DXwULe7SVmNHARuHEjcmYtTyQQxA8VqiCcxyCBJMAS2Vmb0lzvbCxDPTVEeKAIa9JzCGzeHC3MEjo9TYCUmNeCGV05OKO6ySSh2r5LK2WMXaxSp1XFGtUjiGbteshw/cZ2E6n2FAWFOjNxhx4H0Lp98SmKojk7CGIQfYPKEJgdO0sdVf0CrFwE06IPverEXa9/34Nu/j/vdP+efR5O/889e7yde88OuXz3dluoOUEdsiznobyzedSLFsNvnz7k/+wkXF2VKgoJjXcGAtjBvkQFtD8bhYwC7cd3rus5w9uM9smfscDTU73Z5yxU7eY2DiNZLzQg4JWYIrgMI6HtrBK2fMNvar2aYOOA2yzUBnG30duXDOqTnHVTjH2ddZb5JzPJ1zJHamCUGl2e4nMcWr6RKCAJLpkq5CvXKOMdUrQ4EmzkncfyIA0ZyIGAiD2Afc3ToLNhl0ff+mx4F03/NCJl0jE3dwejIx9ZBQvslKJ7/cZBHGIVMchdt0E4ZgXLPVOj8/o+uRHVPf1UxEsO7UjOD58C0ywsxzHdc4DiOYSoi4C3ygb2jqo7u5tD5MXHkWRnzmnXMIWEzELjNFXzP8bRpX+8L2phcvortexMDsAGvo21lAKUGzhMKpWZrshdSqldol6fX1tVo6C6bod50p9P3niODo4ld0xq9QGMI23T0ZwnYbA42+RW3Cr0gxM6Wo0tRn6JzCzZqZL05j+efme3hHYZQ8e+j46LBcDR3/5fOGlS+00hlasYYqr9QgZ1CHHKexxcjS3dbWeAUJiJZESYRE0DSGPo6CuDeyeh/YtzdWKGIOTh5CXeKEnPWBcDblX0VKtdAym4OW7ufc8BO4y2aoO5shU6GkLpzPWLqrMyd4VT7uxWXvxGfDzPjfuWiGg211ewT85Yrr5HK8W8zMDm+R5BuUw678KP9CHd2lji7EUWw9ETNNAZkuMX6cJqTsaqzYbobnz9fzxDnQgG3UW7g7NGBp5hzx/J4LDXSXBrpwKGvrp3ZpXtiFBnbPsi7TgO4QapaBwQLKSca+L6LbBximuYI3RY2m9jRpJ1MgjIIP/MoVK948rEAU/JGZjjNDXQUbhGy/MuGVcW0YfSn5h5vm2mEIFILxRhgrK23LpXtIGCrTSTsuvE/+VZ6fjZbB3moBnw9aOfVWLZvRqI1SCSFJ9fe9+ip1xhVj3GPEZ0yRbmpUiYGZ8VoJgMVsE+9D0bBAidaX+2JPmT60nlK85V/+JyDo6A5pnj2P01ctsNj/lmBZcRWnaOMBDdNdb4rKUvZH2stMCq7xmkERcWq5ekQzEIGrLMTCCOQqy/qXbfi+R+uHSMl/GFYZsQVs6Bk3/G9pZ2lkhTCe6MmreaxfjrEwWaDoF72b0mDZN5ViZQIy3qHVGaWtSyrJrVAQpNNS5bk1t2NqWfdjzx3zvhKKYzFxj7RwOe6wiqrBtR7mz0N05SnSXDTO0ReuU8AszmPGhwDtZsL+epRoK4NM9ktaAtwRYGIqZ0E1R0G2W4eRxmL9jp5hoq+GxWImXJDcYzSrOlNc2gBAb+7XOY1934Ozuea+2q9Ytp5djOqU6P7kUiRvjqqe5ovrjrwhobRrfJXRg/F7mLZkzaptzLKbwrwU2yp7KXntqTwUY4ff2TAo8jwQT4lfeK9Fieypr3g6jrpANI4bPX3kOdz4IYhj5O8Pnapza7kvIOeoINkRqjwRSBzPPhAkatpR/lsLrYFEP455CyDpjOn79qH8oJq+b7W/f9lnC30x/nOLw6GbVz3hUF1omja+a70Xt+JkeMijYNKGarRrbzRYbPIPy3+c6gJjtA2ORnyHN2dQ52DvTztCb316t7qw26cPbdo77gKcCDqHOwam6l2qrNI0dGQcvx3otLlvsLtFLwPvUO9BxUjfZuvHoGWY7OE9xkt+n9ke8zMpBMIH6FMQLdLw7tMSUThZA5/XPxGwrgIoPetKAZAdq2lHrfIUTQOaFvALEGHj8hxl3orwB4/z0xnqWYacOCU4DWvg1OAZ52APp65zNnmCMT2SSRxlXpiubpJc/dUk/eZsoodmTc0ob+6gxDWqLqpVo+k6RTeIfT3d/TOItm9f1Y75Ms847apaD0m/D1XvQ+ktq1rfib0D9jAVSFs1em6ZPfT90jvQs4bnmnTMlvWse41vX8/aefDJ1Sz9oCPv4TaIZvE9V5T+KdUUGzheqGz8S43ynd/R9n3Zruk5bcjfX9gjQerEJ0tK2GioBv7ezsmSp2ddHwOBjaPpZYzsumTVDkbUe8jmoUFnU4lG2FbLx0/e7rymWe/gpKZnc5iWTI65dp9PYfrZhKp4DaLDe/mpHD32lbLR30tGnvpzPsOatbXlhDxP32lmv+x98x1yhWgRl1YvIAQu9AKeTv7GLiB41szuH+0CgvzRBcmShlHjktVlrFvNRYI8fdtcd1F6ASMCKAymzLDazeok5gxQfhZmPyQ/DVgb5S51qTZOfB/G8Y6mMGQLEtnyp15+qGYgivFjqRjhILsozgq353yn0nv1fex6TKpu4BEx+bqT3nNOHM0z+7wXXOu9bzAMmvLRWbH4b3iyx4v/zci++Rc=
\ No newline at end of file
diff --git a/docs/dev/resources/delivery.drawio b/docs/dev/resources/delivery.drawio
new file mode 100644
index 00000000..0776fdac
--- /dev/null
+++ b/docs/dev/resources/delivery.drawio
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/docs/dev/resources/workflows.drawio b/docs/dev/resources/workflows.drawio
new file mode 100644
index 00000000..a46e2fd9
--- /dev/null
+++ b/docs/dev/resources/workflows.drawio
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/docs/ux/Kibana-Reporting-UX-documentation.md b/docs/ux/Kibana-Reporting-UX-documentation.md
new file mode 100644
index 00000000..f14c62d9
--- /dev/null
+++ b/docs/ux/Kibana-Reporting-UX-documentation.md
@@ -0,0 +1,118 @@
+# Kibana Reporting
+## Overview
+Kibana Reports for Open Distro allows `report owners` (including but not limited to Developers, DevOps, IT Engineers, and IT admins) to export and share reports from Kibana dashboards, saved queries, alerts and visualizations. It helps automate the process of scheduling reports via on-demand or periodic basis (including cron schedules). It also automates exporting and sharing reports from triggers, such as alerts. The feature is present in the Dashboard, Discover, and Visualization tabs. Scheduled reports can be sent to (shared with) self or various stakeholders within the organization such as, including but not limited to, executives, managers, engineers (developers, DevOps, IT Engineer) in the form of pdf, hyperlinks, csv, excel via various channels such as email or the Kibana reporting plugin.
+
+## Key user flows
+### From source
+These cover downloading a PDF or PNG report from a Dashboard or Visualization, downloading a CSV or Excel report from Discover, as well as creating a new Report Definition from the Dashboard, Visualization, or Discover tabs.
+
+### From report definitions list
+This flow covers creating a new report definition from the `Report definitions` list.
+
+---
+
+### Share a report
+This flow covers sharing a report from the `report details` page.
+
+![Key user flows](img/flows/0.0.1_key-user-flows.png)
+
+---
+
+## Key screens
+These cover the key connections between Reports, Report details, Report definitions, Report definition details, the Dashboard, Visualization and Discover tabs, as well as Emails.
+
+![Key screens](img/flows/0.0.2_key-screens.png)
+
+---
+
+## Mockups
+### Dashboard
+This is representative of the `Dashboard`, `Visualization` and `Discover` tabs. There is a new `Download` context menu that has been added to this view.
+
+![Dashboard](img/screens/0.1.0_dashboard.png)
+
+---
+
+From the share menu, you can create a new report definition.
+
+![Dashboard - Share](img/screens/0.1.02_dashboard-share.png)
+
+---
+
+The download menu allows users to generate a report (PDF, PNG, CSV, XLS, depending on the source type)
+
+![Dashboard - Download](img/screens/0.1.01_dashboard-download.png)
+
+---
+
+Triggering a download will start the generation / download process.
+
+![Supporting information - Download modals](img/supporting/0.1.04_modals_generating-downloading.png)
+
+---
+
+After successfully creating or downloading a report, you are returned to the context where you were working from, and a toast alert notifies you that your report, or report definition is ready. From the alert you can navigate to the report details, report definition, or the Reports landing page. In the case of a report download failure, this is where the failure notification is also delivered.
+
+![Dashboard - Toasts](img/screens/0.1.03_dashboard-toasts.png)
+
+### Reporting plugin landing page
+
+The reporting landing page displays a list of available reports, as well as a list of configured report definitions. From here you can create a new report, link directly to the report source, download the report file (which will trigger the same download flow as above, with the exception that a new report will not be generated), or view the report details.
+
+![Reporting - Landing page](img/screens/0.2.1_reporting.png)
+
+---
+
+An empty state view is also available when there are no reports or report definitions in the list.
+
+![Reporting - Empty state](img/screens/0.2.0_reporting_empty-state.png)
+
+---
+
+### Report details
+
+Here you can view the details of a report that's been generated. From the report details, you can download the report file, share a report, archive a report, and visit the report source or copy it's permalink.
+
+![Reporting - Report details](img/screens/0.3.0_report.png)
+
+---
+
+### Report details - sharing a report
+
+Sharing a report allows you to add kibana recepients, optionally add new email recepients, as well as configure the email subject, body and optionally include the report as an attachment to the email.
+
+![Reporting - Report details - Share](img/screens/0.3.1_report_share.png)
+
+---
+
+### Report definition
+
+Here you can view the details of a report definition. From the report definition page, you can edit your report definition, and enable or disable it (so it's not triggered by the set schedule or alert). You can also visit or copy the report source URL.
+
+![Reporting - Report definition](img/screens/0.4.0_report-definition.png)
+
+---
+
+### Create Report definition
+
+Creating a report definition allows you to define how a report will be triggered or configured. Here you can generate a one-time report to be delivered immediately (Similar to sharing a report from a dashboard), or at a later date, as well as set recurring and cron-based schedules, or select an alert that will trigger the report generation. You can also configure delivery to yourself and other Kibana users, email recepients, and optionally include the report as part of the email attachment.
+
+![Reporting - Create Report definition](img/screens/0.5.0_create-report-definition.png)
+
+---
+
+#### Supporting view: Report settings
+
+![Report settings](img/supporting/0.5.1_report-settings.png)
+
+---
+
+#### Supporting view: Report trigger
+
+![Report trigger](img/supporting/0.5.2_report-trigger.png)
+
+---
+
+#### Supporting view: Delivery settings
+
+![Delivery settings](img/supporting/0.5.3_delivery-settings.png)
\ No newline at end of file
diff --git a/docs/ux/img/flows/0.0.1_key-user-flows.png b/docs/ux/img/flows/0.0.1_key-user-flows.png
new file mode 100644
index 00000000..6bd16d22
Binary files /dev/null and b/docs/ux/img/flows/0.0.1_key-user-flows.png differ
diff --git a/docs/ux/img/flows/0.0.1_key-user-flows@2x.png b/docs/ux/img/flows/0.0.1_key-user-flows@2x.png
new file mode 100644
index 00000000..ce541814
Binary files /dev/null and b/docs/ux/img/flows/0.0.1_key-user-flows@2x.png differ
diff --git a/docs/ux/img/flows/0.0.2_key-screens.png b/docs/ux/img/flows/0.0.2_key-screens.png
new file mode 100644
index 00000000..9c3c0468
Binary files /dev/null and b/docs/ux/img/flows/0.0.2_key-screens.png differ
diff --git a/docs/ux/img/flows/0.0.2_key-screens@2x.png b/docs/ux/img/flows/0.0.2_key-screens@2x.png
new file mode 100644
index 00000000..372409df
Binary files /dev/null and b/docs/ux/img/flows/0.0.2_key-screens@2x.png differ
diff --git a/docs/ux/img/screens/0.1.01_dashboard-download.png b/docs/ux/img/screens/0.1.01_dashboard-download.png
new file mode 100644
index 00000000..f38ad105
Binary files /dev/null and b/docs/ux/img/screens/0.1.01_dashboard-download.png differ
diff --git a/docs/ux/img/screens/0.1.01_dashboard-download@2x.png b/docs/ux/img/screens/0.1.01_dashboard-download@2x.png
new file mode 100644
index 00000000..4078eb8e
Binary files /dev/null and b/docs/ux/img/screens/0.1.01_dashboard-download@2x.png differ
diff --git a/docs/ux/img/screens/0.1.02_dashboard-share.png b/docs/ux/img/screens/0.1.02_dashboard-share.png
new file mode 100644
index 00000000..a41f4c47
Binary files /dev/null and b/docs/ux/img/screens/0.1.02_dashboard-share.png differ
diff --git a/docs/ux/img/screens/0.1.02_dashboard-share@2x.png b/docs/ux/img/screens/0.1.02_dashboard-share@2x.png
new file mode 100644
index 00000000..de9578a4
Binary files /dev/null and b/docs/ux/img/screens/0.1.02_dashboard-share@2x.png differ
diff --git a/docs/ux/img/screens/0.1.03_dashboard-toasts.png b/docs/ux/img/screens/0.1.03_dashboard-toasts.png
new file mode 100644
index 00000000..40a9aae5
Binary files /dev/null and b/docs/ux/img/screens/0.1.03_dashboard-toasts.png differ
diff --git a/docs/ux/img/screens/0.1.03_dashboard-toasts@2x.png b/docs/ux/img/screens/0.1.03_dashboard-toasts@2x.png
new file mode 100644
index 00000000..63ff5a42
Binary files /dev/null and b/docs/ux/img/screens/0.1.03_dashboard-toasts@2x.png differ
diff --git a/docs/ux/img/screens/0.1.0_dashboard.png b/docs/ux/img/screens/0.1.0_dashboard.png
new file mode 100644
index 00000000..d895dac8
Binary files /dev/null and b/docs/ux/img/screens/0.1.0_dashboard.png differ
diff --git a/docs/ux/img/screens/0.1.0_dashboard@2x.png b/docs/ux/img/screens/0.1.0_dashboard@2x.png
new file mode 100644
index 00000000..1012bd6a
Binary files /dev/null and b/docs/ux/img/screens/0.1.0_dashboard@2x.png differ
diff --git a/docs/ux/img/screens/0.2.0_reporting_empty-state.png b/docs/ux/img/screens/0.2.0_reporting_empty-state.png
new file mode 100644
index 00000000..3f8a7f79
Binary files /dev/null and b/docs/ux/img/screens/0.2.0_reporting_empty-state.png differ
diff --git a/docs/ux/img/screens/0.2.0_reporting_empty-state@2x.png b/docs/ux/img/screens/0.2.0_reporting_empty-state@2x.png
new file mode 100644
index 00000000..3d3987fa
Binary files /dev/null and b/docs/ux/img/screens/0.2.0_reporting_empty-state@2x.png differ
diff --git a/docs/ux/img/screens/0.2.1_reporting.png b/docs/ux/img/screens/0.2.1_reporting.png
new file mode 100644
index 00000000..f8b912cc
Binary files /dev/null and b/docs/ux/img/screens/0.2.1_reporting.png differ
diff --git a/docs/ux/img/screens/0.2.1_reporting@2x.png b/docs/ux/img/screens/0.2.1_reporting@2x.png
new file mode 100644
index 00000000..0261e122
Binary files /dev/null and b/docs/ux/img/screens/0.2.1_reporting@2x.png differ
diff --git a/docs/ux/img/screens/0.3.0_report.png b/docs/ux/img/screens/0.3.0_report.png
new file mode 100644
index 00000000..5a88c557
Binary files /dev/null and b/docs/ux/img/screens/0.3.0_report.png differ
diff --git a/docs/ux/img/screens/0.3.0_report@2x.png b/docs/ux/img/screens/0.3.0_report@2x.png
new file mode 100644
index 00000000..6cb741cc
Binary files /dev/null and b/docs/ux/img/screens/0.3.0_report@2x.png differ
diff --git a/docs/ux/img/screens/0.3.1_report_share.png b/docs/ux/img/screens/0.3.1_report_share.png
new file mode 100644
index 00000000..228875d2
Binary files /dev/null and b/docs/ux/img/screens/0.3.1_report_share.png differ
diff --git a/docs/ux/img/screens/0.3.1_report_share@2x.png b/docs/ux/img/screens/0.3.1_report_share@2x.png
new file mode 100644
index 00000000..1ff8d893
Binary files /dev/null and b/docs/ux/img/screens/0.3.1_report_share@2x.png differ
diff --git a/docs/ux/img/screens/0.4.0_report-definition.png b/docs/ux/img/screens/0.4.0_report-definition.png
new file mode 100644
index 00000000..e4828a1b
Binary files /dev/null and b/docs/ux/img/screens/0.4.0_report-definition.png differ
diff --git a/docs/ux/img/screens/0.4.0_report-definition@2x.png b/docs/ux/img/screens/0.4.0_report-definition@2x.png
new file mode 100644
index 00000000..a2a2ad27
Binary files /dev/null and b/docs/ux/img/screens/0.4.0_report-definition@2x.png differ
diff --git a/docs/ux/img/screens/0.5.0_create-report-definition.png b/docs/ux/img/screens/0.5.0_create-report-definition.png
new file mode 100644
index 00000000..453f0fcf
Binary files /dev/null and b/docs/ux/img/screens/0.5.0_create-report-definition.png differ
diff --git a/docs/ux/img/screens/0.5.0_create-report-definition@2x.png b/docs/ux/img/screens/0.5.0_create-report-definition@2x.png
new file mode 100644
index 00000000..258e1b30
Binary files /dev/null and b/docs/ux/img/screens/0.5.0_create-report-definition@2x.png differ
diff --git a/docs/ux/img/screens/0.6.0_edit-report-definition.png b/docs/ux/img/screens/0.6.0_edit-report-definition.png
new file mode 100644
index 00000000..ed0df2c5
Binary files /dev/null and b/docs/ux/img/screens/0.6.0_edit-report-definition.png differ
diff --git a/docs/ux/img/screens/0.6.0_edit-report-definition@2x.png b/docs/ux/img/screens/0.6.0_edit-report-definition@2x.png
new file mode 100644
index 00000000..e46184c0
Binary files /dev/null and b/docs/ux/img/screens/0.6.0_edit-report-definition@2x.png differ
diff --git a/docs/ux/img/supporting/0.1.04_modals_generating-downloading.png b/docs/ux/img/supporting/0.1.04_modals_generating-downloading.png
new file mode 100644
index 00000000..1140cfa0
Binary files /dev/null and b/docs/ux/img/supporting/0.1.04_modals_generating-downloading.png differ
diff --git a/docs/ux/img/supporting/0.1.04_modals_generating-downloading@2x.png b/docs/ux/img/supporting/0.1.04_modals_generating-downloading@2x.png
new file mode 100644
index 00000000..66ddf5fb
Binary files /dev/null and b/docs/ux/img/supporting/0.1.04_modals_generating-downloading@2x.png differ
diff --git a/docs/ux/img/supporting/0.5.1_report-settings.png b/docs/ux/img/supporting/0.5.1_report-settings.png
new file mode 100644
index 00000000..d5d9036a
Binary files /dev/null and b/docs/ux/img/supporting/0.5.1_report-settings.png differ
diff --git a/docs/ux/img/supporting/0.5.1_report-settings@2x.png b/docs/ux/img/supporting/0.5.1_report-settings@2x.png
new file mode 100644
index 00000000..4260e217
Binary files /dev/null and b/docs/ux/img/supporting/0.5.1_report-settings@2x.png differ
diff --git a/docs/ux/img/supporting/0.5.2_report-trigger.png b/docs/ux/img/supporting/0.5.2_report-trigger.png
new file mode 100644
index 00000000..0e0395b9
Binary files /dev/null and b/docs/ux/img/supporting/0.5.2_report-trigger.png differ
diff --git a/docs/ux/img/supporting/0.5.2_report-trigger@2x.png b/docs/ux/img/supporting/0.5.2_report-trigger@2x.png
new file mode 100644
index 00000000..b07e8f0a
Binary files /dev/null and b/docs/ux/img/supporting/0.5.2_report-trigger@2x.png differ
diff --git a/docs/ux/img/supporting/0.5.3_delivery-settings.png b/docs/ux/img/supporting/0.5.3_delivery-settings.png
new file mode 100644
index 00000000..c8c8ce93
Binary files /dev/null and b/docs/ux/img/supporting/0.5.3_delivery-settings.png differ
diff --git a/docs/ux/img/supporting/0.5.3_delivery-settings@2x.png b/docs/ux/img/supporting/0.5.3_delivery-settings@2x.png
new file mode 100644
index 00000000..f7b7875a
Binary files /dev/null and b/docs/ux/img/supporting/0.5.3_delivery-settings@2x.png differ
diff --git a/kibana.json b/kibana.json
new file mode 100644
index 00000000..5bbd74df
--- /dev/null
+++ b/kibana.json
@@ -0,0 +1,9 @@
+{
+ "id": "opendistroReportsKibana",
+ "version": "1.13.0.0",
+ "kibanaVersion": "7.10.2",
+ "requiredPlugins": ["navigation", "data", "kibanaUtils"],
+ "optionalPlugins": ["share"],
+ "server": true,
+ "ui": true
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..8173175d
--- /dev/null
+++ b/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "opendistro_kibana_reports",
+ "version": "1.13.0.0",
+ "description": "Kibana Reporting Plugin",
+ "license": "Apache-2.0",
+ "main": "index.ts",
+ "kibana": {
+ "version": "7.10.2",
+ "templateVersion": "1.0.0"
+ },
+ "scripts": {
+ "kbn": "node ../../scripts/kbn",
+ "es": "node ../../scripts/es",
+ "lint": "eslint .",
+ "start": "yarn plugin_helpers start",
+ "build": "yarn plugin_helpers build",
+ "test": "../../node_modules/.bin/jest --config ./test/jest.config.js",
+ "cypress:run": "cypress run",
+ "cypress:open": "cypress open",
+ "plugin_helpers": "node ../../scripts/plugin_helpers",
+ "postinstall": "node ./scripts/patch-html2canvas.js"
+ },
+ "dependencies": {
+ "babel-polyfill": "^6.26.0",
+ "cheerio": "0.22.0",
+ "cron-validator": "^1.1.1",
+ "dompurify": "^2.3.8",
+ "elastic-builder": "^2.7.1",
+ "enzyme-adapter-react-16": "^1.15.2",
+ "html2canvas": "1.4.1",
+ "jest-fetch-mock": "^3.0.3",
+ "jquery": "^3.5.0",
+ "jsdom": "13.1.0",
+ "json-2-csv": "^3.7.6",
+ "jspdf": "^2.5.1",
+ "react-addons-test-utils": "^15.6.2",
+ "react-id-generator": "^3.0.1",
+ "react-markdown": "^4.3.1",
+ "react-mde": "^10.2.1",
+ "react-native-base64": "^0.0.2",
+ "react-native-i18n": "^2.0.15",
+ "react-navigation": "^4.3.9",
+ "react-router-dom": "^5.2.0",
+ "react-toast-notifications": "^2.4.0",
+ "set-interval-async": "1.0.33",
+ "showdown": "^1.9.1",
+ "svg-pathdata": "5.0.5",
+ "ws": "^7.2.3"
+ },
+ "devDependencies": {
+ "@elastic/eslint-import-resolver-kibana": "link:../../packages/kbn-eslint-import-resolver-kibana",
+ "@types/dompurify": "^2.3.3",
+ "@types/enzyme-adapter-react-16": "^1.0.6",
+ "@types/jsdom": "^16.2.3",
+ "@types/react": "^16.9.36",
+ "@types/react-addons-test-utils": "^0.14.25",
+ "@types/react-dom": "^16.9.8",
+ "@types/react-test-renderer": "^16.9.1",
+ "@types/set-interval-async": "^1.0.0",
+ "@types/showdown": "^1.9.3",
+ "babel-jest": "^26.3.0",
+ "cypress": "^5.0.0",
+ "elastic-builder": "^2.7.1",
+ "eslint-plugin-babel": "^5.3.0",
+ "eslint-plugin-no-unsanitized": "^3.0.2",
+ "eslint-plugin-prefer-object-spread": "^1.2.1",
+ "identity-obj-proxy": "^3.0.0",
+ "jest-dom": "^4.0.0",
+ "react-test-renderer": "^16.12.0",
+ "replace-in-file": "^6.3.5",
+ "ts-jest": "^26.1.0",
+ "tsc": "^1.20150623.0"
+ },
+ "resolutions": {
+ "trim": "^1.0.0",
+ "doc-path": "2.1.2",
+ "y18n": "^5.0.5",
+ "yargs": "16.2.0"
+ }
+}
diff --git a/public/app.scss b/public/app.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/public/application.tsx b/public/application.tsx
new file mode 100644
index 00000000..584f95d0
--- /dev/null
+++ b/public/application.tsx
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { AppMountParameters, CoreStart } from '../../../src/core/public';
+import { AppPluginStartDependencies } from './types';
+import { OpendistroKibanaReportsApp } from './components/app';
+
+export const renderApp = (
+ { notifications, http, chrome }: CoreStart,
+ { navigation }: AppPluginStartDependencies,
+ { appBasePath, element }: AppMountParameters
+) => {
+ ReactDOM.render(
+ ,
+ element
+ );
+
+ return () => ReactDOM.unmountComponentAtNode(element);
+};
diff --git a/public/components/app.tsx b/public/components/app.tsx
new file mode 100644
index 00000000..98a99519
--- /dev/null
+++ b/public/components/app.tsx
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+import { FormattedMessage, I18nProvider } from '@kbn/i18n/react';
+import { HashRouter as Router, Route, Switch } from 'react-router-dom';
+
+import {
+ EuiPage,
+ EuiPageBody,
+ EuiPageContentBody,
+ EuiPageContentHeader,
+ EuiPageContentHeaderSection,
+} from '@elastic/eui';
+import CSS from 'csstype';
+import {
+ CoreStart,
+ CoreSystem,
+ ChromeBreadcrumb,
+ IUiSettingsClient,
+} from '../../../../src/core/public';
+import { NavigationPublicPluginStart } from '../../../../src/plugins/navigation/public';
+
+import { CreateReport } from './report_definitions/create/create_report_definition';
+import { Main } from './main/main';
+import { ReportDetails } from './main/report_details/report_details';
+import { ReportDefinitionDetails } from './main/report_definition_details/report_definition_details';
+import { EditReportDefinition } from './report_definitions/edit/edit_report_definition';
+
+export interface CoreInterface {
+ http: CoreStart['http'];
+ uiSettings: IUiSettingsClient;
+ setBreadcrumbs: (newBreadcrumbs: ChromeBreadcrumb[]) => void;
+}
+
+interface OpendistroKibanaReportsAppDeps {
+ basename: string;
+ notifications: CoreStart['notifications'];
+ http: CoreStart['http'];
+ navigation: NavigationPublicPluginStart;
+ chrome: CoreStart['chrome'];
+}
+
+const styles: CSS.Properties = {
+ float: 'left',
+ width: '100%',
+ maxWidth: '1600px',
+};
+
+export const OpendistroKibanaReportsApp = ({
+ basename,
+ notifications,
+ http,
+ navigation,
+ chrome,
+}: OpendistroKibanaReportsAppDeps) => {
+ // Render the application DOM.
+ return (
+
+
+
+
+
+
+
+
+
+
+ */}
+
+
+ {showDeleteConfirmationModal}
+ {showLoadingModal}
+
+
+ );
+}
diff --git a/public/components/main/report_definitions_table.tsx b/public/components/main/report_definitions_table.tsx
new file mode 100644
index 00000000..7bebe9f7
--- /dev/null
+++ b/public/components/main/report_definitions_table.tsx
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React, { useState } from 'react';
+import {
+ EuiLink,
+ EuiInMemoryTable,
+ EuiButton,
+ EuiEmptyPrompt,
+ EuiText,
+ EuiIcon,
+} from '@elastic/eui';
+import { humanReadableDate } from './main_utils';
+
+const emptyMessageReportDefinitions = (
+ No report definitions to display}
+ titleSize="xs"
+ body={
+
+ Create a new report definition to get started
+
+ To learn more, see{' '}
+
+ Get started with Kibana reporting
+
+
+
+
+
+
+
+
+
+
+ */}
+
+
+ {showLoadingModal}
+
+
+ );
+}
diff --git a/public/components/main/reports_table.tsx b/public/components/main/reports_table.tsx
new file mode 100644
index 00000000..68330997
--- /dev/null
+++ b/public/components/main/reports_table.tsx
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React, { Fragment, useState } from 'react';
+import {
+ EuiButton,
+ // @ts-ignore
+ EuiLink,
+ EuiText,
+ EuiIcon,
+ EuiEmptyPrompt,
+ EuiInMemoryTable,
+} from '@elastic/eui';
+import {
+ fileFormatsUpper,
+ humanReadableDate,
+ generateReportById,
+} from './main_utils';
+import { GenerateReportLoadingModal } from './loading_modal';
+
+const reportStatusOptions = [
+ 'Created',
+ 'Error',
+ 'Pending',
+ 'Shared',
+ 'Archived',
+];
+const reportTypeOptions = ['Schedule', 'On demand'];
+
+const emptyMessageReports = (
+ No reports to display}
+ titleSize="xs"
+ body={
+
+
+ Create a report definition, or share/download a report from a
+ dashboard, saved search or visualization.
+
+
+ To learn more, see{' '}
+
+ Get started with Kibana reporting
+
+
+
+ );
+}
diff --git a/public/components/report_definitions/create/index.ts b/public/components/report_definitions/create/index.ts
new file mode 100644
index 00000000..4aa74347
--- /dev/null
+++ b/public/components/report_definitions/create/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+export { CreateReport } from './create_report_definition';
diff --git a/public/components/report_definitions/delivery/__tests__/__snapshots__/delivery.test.tsx.snap b/public/components/report_definitions/delivery/__tests__/__snapshots__/delivery.test.tsx.snap
new file mode 100644
index 00000000..d70dbdde
--- /dev/null
+++ b/public/components/report_definitions/delivery/__tests__/__snapshots__/delivery.test.tsx.snap
@@ -0,0 +1,91 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[` panel render create component 1`] = `
+
+ );
+};
diff --git a/public/components/report_definitions/delivery/index.ts b/public/components/report_definitions/delivery/index.ts
new file mode 100644
index 00000000..fc3303a4
--- /dev/null
+++ b/public/components/report_definitions/delivery/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+export { ReportDelivery } from './delivery';
diff --git a/public/components/report_definitions/delivery/kibana_user.tsx b/public/components/report_definitions/delivery/kibana_user.tsx
new file mode 100644
index 00000000..4157fd92
--- /dev/null
+++ b/public/components/report_definitions/delivery/kibana_user.tsx
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React, { useState } from 'react';
+import { EuiComboBox, EuiFormRow } from '@elastic/eui';
+import { useEffect } from 'react';
+import { ReportDeliveryProps } from './delivery';
+
+const KibanaUserDelivery = (props: ReportDeliveryProps) => {
+ const {
+ edit,
+ editDefinitionId,
+ reportDefinitionRequest,
+ httpClientProps,
+ } = props;
+
+ const options = [];
+ const [selectedOptions, setSelected] = useState([]);
+
+ const onChangeDeliveryRecipients = (selectedOptions) => {
+ setSelected(selectedOptions);
+ reportDefinitionRequest.delivery.delivery_params.kibana_recipients = selectedOptions.map(
+ (option) => option.label
+ );
+ };
+
+ const onCreateDeliveryRecipientOption = (
+ searchValue: string,
+ flattenedOptions = []
+ ) => {
+ const normalizedSearchValue = searchValue.trim().toLowerCase();
+
+ if (!normalizedSearchValue) {
+ return;
+ }
+
+ const newOption = {
+ label: searchValue,
+ };
+
+ // Create the option if it doesn't exist.
+ if (
+ flattenedOptions.findIndex(
+ (option) => option.label.trim().toLowerCase() === normalizedSearchValue
+ ) === -1
+ ) {
+ options.push(newOption);
+ }
+
+ // Select the option.
+ onChangeDeliveryRecipients([...selectedOptions, newOption]);
+ };
+
+ const defaultEditDeliveryParams = (deliveryParams) => {
+ if (deliveryParams.kibana_recipients) {
+ reportDefinitionRequest.delivery.delivery_params = {
+ kibana_recipients: deliveryParams.kibana_recipients.map(
+ (kibanaRecipient) =>
+ onCreateDeliveryRecipientOption(kibanaRecipient, selectedOptions)
+ ),
+ };
+ } else {
+ const kibanaUserParams = {
+ kibana_recipients: selectedOptions,
+ };
+ reportDefinitionRequest.delivery.delivery_params = kibanaUserParams;
+ }
+ };
+
+ useEffect(() => {
+ if (edit) {
+ httpClientProps
+ .get(`../api/reporting/reportDefinitions/${editDefinitionId}`)
+ .then(async (response) => {
+ defaultEditDeliveryParams(
+ response.report_definition.delivery.delivery_params
+ );
+ });
+ } else {
+ reportDefinitionRequest.delivery.delivery_params = {
+ kibana_recipients: selectedOptions,
+ };
+ }
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export { KibanaUserDelivery };
diff --git a/public/components/report_definitions/edit/edit_report_definition.tsx b/public/components/report_definitions/edit/edit_report_definition.tsx
new file mode 100644
index 00000000..81576254
--- /dev/null
+++ b/public/components/report_definitions/edit/edit_report_definition.tsx
@@ -0,0 +1,360 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React, { useEffect, useState } from 'react';
+import {
+ EuiButtonEmpty,
+ EuiFlexGroup,
+ EuiFlexItem,
+ EuiButton,
+ EuiPage,
+ EuiTitle,
+ EuiPageBody,
+ EuiSpacer,
+ EuiGlobalToastList,
+} from '@elastic/eui';
+import { ReportSettings } from '../report_settings';
+import { ReportDelivery } from '../delivery';
+import { ReportTrigger } from '../report_trigger';
+import { ReportDefinitionSchemaType } from 'server/model';
+import { converter } from '../utils';
+import {
+ permissionsMissingToast,
+ permissionsMissingActions,
+} from '../../utils/utils';
+import { definitionInputValidation } from '../utils/utils';
+
+export function EditReportDefinition(props) {
+ const [toasts, setToasts] = useState([]);
+ const [comingFromError, setComingFromError] = useState(false);
+ const [preErrorData, setPreErrorData] = useState({});
+
+ const [
+ showSettingsReportNameError,
+ setShowSettingsReportNameError,
+ ] = useState(false);
+ const [
+ settingsReportNameErrorMessage,
+ setSettingsReportNameErrorMessage,
+ ] = useState('');
+ const [
+ showSettingsReportSourceError,
+ setShowSettingsReportSourceError
+ ] = useState(false);
+ const [
+ settingsReportSourceErrorMessage,
+ setSettingsReportSourceErrorMessage
+ ] = useState('');
+ const [
+ showTriggerIntervalNaNError,
+ setShowTriggerIntervalNaNError,
+ ] = useState(false);
+ const [showCronError, setShowCronError] = useState(false);
+ const [
+ showEmailRecipientsError,
+ setShowEmailRecipientsError
+ ] = useState(false);
+ const [
+ emailRecipientsErrorMessage,
+ setEmailRecipientsErrorMessage,
+ ] = useState('');
+ const [showTimeRangeError, setShowTimeRangeError] = useState(false);
+
+ const addPermissionsMissingViewEditPageToastHandler = (errorType: string) => {
+ let toast = {};
+ if (errorType === 'permissions') {
+ toast = permissionsMissingToast(
+ permissionsMissingActions.VIEWING_EDIT_PAGE
+ );
+ } else if (errorType === 'API') {
+ toast = {
+ title: 'Error loading report definition values.',
+ color: 'danger',
+ iconType: 'alert',
+ id: 'errorToast',
+ };
+ }
+ setToasts(toasts.concat(toast));
+ };
+
+ const handleViewEditPageErrorToast = (errorType: string) => {
+ addPermissionsMissingViewEditPageToastHandler(errorType);
+ };
+
+ const addInputValidationErrorToastHandler = () => {
+ const errorToast = {
+ title: 'One or more fields have an error. Please check and try again.',
+ color: 'danger',
+ iconType: 'alert',
+ id: 'errorToast',
+ };
+ setToasts(toasts.concat(errorToast));
+ };
+
+ const handleInputValidationErrorToast = () => {
+ addInputValidationErrorToastHandler();
+ };
+
+ const addErrorUpdatingReportDefinitionToastHandler = (errorType: string) => {
+ let toast = {};
+ if (errorType === 'permissions') {
+ toast = permissionsMissingToast(
+ permissionsMissingActions.UPDATING_DEFINITION
+ );
+ } else if (errorType === 'API') {
+ toast = {
+ title: 'Error updating report definition.',
+ color: 'danger',
+ iconType: 'alert',
+ id: 'errorToast',
+ };
+ }
+ setToasts(toasts.concat(toast));
+ };
+
+ const handleErrorUpdatingReportDefinitionToast = (errorType: string) => {
+ addErrorUpdatingReportDefinitionToastHandler(errorType);
+ };
+
+ const addErrorDeletingReportDefinitionToastHandler = () => {
+ const errorToast = {
+ title: 'Error deleting old scheduled report definition.',
+ color: 'danger',
+ iconType: 'alert',
+ id: 'errorDeleteToast',
+ };
+ setToasts(toasts.concat(errorToast));
+ };
+
+ const handleErrorDeletingReportDefinitionToast = () => {
+ addErrorDeletingReportDefinitionToastHandler();
+ };
+
+ const removeToast = (removedToast) => {
+ setToasts(toasts.filter((toast) => toast.id !== removedToast.id));
+ };
+
+ const reportDefinitionId = props['match']['params']['reportDefinitionId'];
+ let reportDefinition: ReportDefinitionSchemaType;
+ let editReportDefinitionRequest = {
+ report_params: {
+ report_name: '',
+ report_source: '',
+ description: '',
+ core_params: {
+ base_url: '',
+ report_format: '',
+ time_duration: '',
+ },
+ },
+ delivery: {
+ delivery_type: '',
+ delivery_params: {},
+ },
+ trigger: {
+ trigger_type: '',
+ },
+ time_created: 0,
+ last_updated: 0,
+ status: '',
+ };
+ reportDefinition = editReportDefinitionRequest; // initialize reportDefinition object
+
+ let timeRange = {
+ timeFrom: new Date(),
+ timeTo: new Date(),
+ };
+
+ if (comingFromError) {
+ editReportDefinitionRequest = preErrorData;
+ }
+
+ const callUpdateAPI = async (metadata) => {
+ const { httpClient } = props;
+ httpClient
+ .put(`../api/reporting/reportDefinitions/${reportDefinitionId}`, {
+ body: JSON.stringify(metadata),
+ params: reportDefinitionId.toString(),
+ })
+ .then(async () => {
+ window.location.assign(`opendistro_kibana_reports#/edit=success`);
+ })
+ .catch((error) => {
+ console.log('error in updating report definition:', error);
+ if (error.body.statusCode === 400) {
+ handleInputValidationErrorToast();
+ } else if (error.body.statusCode === 403) {
+ handleErrorUpdatingReportDefinitionToast('permissions');
+ } else {
+ handleErrorUpdatingReportDefinitionToast('API');
+ }
+ setPreErrorData(metadata);
+ setComingFromError(true);
+ });
+ };
+
+ const editReportDefinition = async (metadata) => {
+ if ('header' in metadata.report_params.core_params) {
+ metadata.report_params.core_params.header = converter.makeHtml(
+ metadata.report_params.core_params.header
+ );
+ }
+ if ('footer' in metadata.report_params.core_params) {
+ metadata.report_params.core_params.footer = converter.makeHtml(
+ metadata.report_params.core_params.footer
+ );
+ }
+
+ // client-side input validation
+ let error = false;
+ await definitionInputValidation(
+ metadata,
+ error,
+ setShowSettingsReportNameError,
+ setSettingsReportNameErrorMessage,
+ setShowSettingsReportSourceError,
+ setSettingsReportSourceErrorMessage,
+ setShowTriggerIntervalNaNError,
+ timeRange,
+ setShowTimeRangeError,
+ setShowCronError,
+ setShowEmailRecipientsError,
+ setEmailRecipientsErrorMessage
+ ).then((response) => {
+ error = response;
+ });
+ if (error) {
+ handleInputValidationErrorToast();
+ setPreErrorData(metadata);
+ setComingFromError(true);
+ } else {
+ await callUpdateAPI(metadata);
+ }
+ };
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ const { httpClient } = props;
+ httpClient
+ .get(`../api/reporting/reportDefinitions/${reportDefinitionId}`)
+ .then((response) => {
+ reportDefinition = response.report_definition;
+ const {
+ time_created: timeCreated,
+ status,
+ last_updated: lastUpdated,
+ report_params: { report_name: reportName },
+ } = reportDefinition;
+ // configure non-editable fields
+ editReportDefinitionRequest.time_created = timeCreated;
+ editReportDefinitionRequest.last_updated = lastUpdated;
+ editReportDefinitionRequest.status = status;
+
+ props.setBreadcrumbs([
+ {
+ text: 'Reporting',
+ href: '#',
+ },
+ {
+ text: `Report definition details: ${reportName}`,
+ href: `#/report_definition_details/${reportDefinitionId}`,
+ },
+ {
+ text: `Edit report definition: ${reportName}`,
+ },
+ ]);
+ })
+ .catch((error) => {
+ console.error(
+ 'error when loading edit report definition page: ',
+ error
+ );
+ if (error.body.statusCode === 403) {
+ handleViewEditPageErrorToast('permissions');
+ } else {
+ handleViewEditPageErrorToast('API');
+ }
+ });
+ }, []);
+
+ return (
+
+
+
+
Edit report definition
+
+
+
+
+
+
+
+
+
+
+ {
+ window.location.assign('opendistro_kibana_reports#/');
+ }}
+ >
+ Cancel
+
+
+
+ editReportDefinition(editReportDefinitionRequest)}
+ id={'editReportDefinitionButton'}
+ >
+ Save Changes
+
+
+
+
+
+
+ );
+}
diff --git a/public/components/report_definitions/edit/index.ts b/public/components/report_definitions/edit/index.ts
new file mode 100644
index 00000000..b104ae23
--- /dev/null
+++ b/public/components/report_definitions/edit/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+export { EditReportDefinition } from './edit_report';
diff --git a/public/components/report_definitions/report_settings/__tests__/__snapshots__/report_settings.test.tsx.snap b/public/components/report_definitions/report_settings/__tests__/__snapshots__/report_settings.test.tsx.snap
new file mode 100644
index 00000000..cc069d8c
--- /dev/null
+++ b/public/components/report_definitions/report_settings/__tests__/__snapshots__/report_settings.test.tsx.snap
@@ -0,0 +1,7556 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[` panel dashboard create from in-context 1`] = `
+
+
+
+ Report Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Valid characters are a-z, A-Z, 0-9, (), [], _ (underscore), - (hyphen) and (space).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Select a dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Time range is relative to the report creation date on the report trigger.
+
+
+
+
+
+
+
+
+
+ {schedule}
+
+
+ );
+}
diff --git a/public/components/report_definitions/report_trigger/report_trigger_constants.tsx b/public/components/report_definitions/report_trigger/report_trigger_constants.tsx
new file mode 100644
index 00000000..de5ecb5e
--- /dev/null
+++ b/public/components/report_definitions/report_trigger/report_trigger_constants.tsx
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import moment from 'moment-timezone';
+
+export const TRIGGER_TYPE_OPTIONS = [
+ {
+ id: 'On demand',
+ label: 'On demand',
+ },
+ {
+ id: 'Schedule',
+ label: 'Schedule',
+ },
+];
+
+export const SCHEDULE_TYPE_OPTIONS = [
+ {
+ id: 'Recurring',
+ label: 'Recurring',
+ },
+ {
+ id: 'Cron based',
+ label: 'Cron-based',
+ },
+];
+
+export const SCHEDULE_RECURRING_OPTIONS = [
+ {
+ value: 'daily',
+ text: 'Daily',
+ },
+ {
+ value: 'byInterval',
+ text: 'By interval',
+ },
+ // TODO: disable on UI. Add them back once we support
+// {
+// value: 'weekly',
+// text: 'Weekly',
+// },
+// {
+// value: 'monthly',
+// text: 'Monthly',
+// },
+];
+
+export const INTERVAL_TIME_PERIODS = [
+ {
+ value: 'MINUTES',
+ text: 'Minutes',
+ },
+ {
+ value: 'HOURS',
+ text: 'Hours',
+ },
+ {
+ value: 'DAYS',
+ text: 'Days',
+ },
+];
+
+export const WEEKLY_CHECKBOX_OPTIONS = [
+ {
+ id: 'monCheckbox',
+ label: 'Mon',
+ },
+ {
+ id: 'tueCheckbox',
+ label: 'Tue',
+ },
+ {
+ id: 'wedCheckbox',
+ label: 'Wed',
+ },
+ {
+ id: 'thuCheckbox',
+ label: 'Thu',
+ },
+ {
+ id: 'friCheckbox',
+ label: 'Fri',
+ },
+ {
+ id: 'satCheckbox',
+ label: 'Sat',
+ },
+ {
+ id: 'sunCheckbox',
+ label: 'Sun',
+ },
+];
+
+export const MONTHLY_ON_THE_OPTIONS = [
+ {
+ value: 'day',
+ text: 'Day',
+ },
+];
+
+export const TIMEZONE_OPTIONS = moment.tz
+ .names()
+ .map((tz) => ({ value: tz, text: tz }));
diff --git a/public/components/report_definitions/report_trigger/timezone.tsx b/public/components/report_definitions/report_trigger/timezone.tsx
new file mode 100644
index 00000000..597adb14
--- /dev/null
+++ b/public/components/report_definitions/report_trigger/timezone.tsx
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import { EuiFormRow, EuiSelect } from '@elastic/eui';
+import React, { useState, useEffect } from 'react';
+import { TIMEZONE_OPTIONS } from './report_trigger_constants';
+
+export function TimezoneSelect(props) {
+ const {
+ reportDefinitionRequest,
+ httpClientProps,
+ edit,
+ editDefinitionId,
+ } = props;
+ const [timezone, setTimezone] = useState(TIMEZONE_OPTIONS[0].value);
+
+ const handleTimezone = (e) => {
+ setTimezone(e.target.value);
+ if (
+ reportDefinitionRequest.trigger.trigger_params.schedule_type ===
+ 'Cron based'
+ ) {
+ reportDefinitionRequest.trigger.trigger_params.schedule.cron.timezone =
+ e.target.value;
+ }
+ };
+
+ useEffect(() => {
+ let unmounted = false;
+ if (edit) {
+ httpClientProps
+ .get(`../api/reporting/reportDefinitions/${editDefinitionId}`)
+ .then(async (response) => {
+ if (
+ !unmounted &&
+ reportDefinitionRequest.trigger.trigger_params.schedule_type ===
+ 'Cron based'
+ ) {
+ setTimezone(
+ response.report_definition.trigger.trigger_params.schedule.cron
+ .timezone
+ );
+ }
+ });
+ }
+ return () => {
+ unmounted = true;
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/public/components/report_definitions/utils/index.ts b/public/components/report_definitions/utils/index.ts
new file mode 100644
index 00000000..8d36e1c3
--- /dev/null
+++ b/public/components/report_definitions/utils/index.ts
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import Showdown from 'showdown';
+
+export const converter = new Showdown.Converter({
+ tables: true,
+ simplifiedAutoLink: true,
+ strikethrough: true,
+ tasklists: true,
+ noHeaderId: true,
+});
diff --git a/public/components/report_definitions/utils/utils.tsx b/public/components/report_definitions/utils/utils.tsx
new file mode 100644
index 00000000..d463a193
--- /dev/null
+++ b/public/components/report_definitions/utils/utils.tsx
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import { isValidCron } from "cron-validator";
+import moment from "moment";
+
+ export const definitionInputValidation = async (
+ metadata,
+ error,
+ setShowSettingsReportNameError,
+ setSettingsReportNameErrorMessage,
+ setShowSettingsReportSourceError,
+ setSettingsReportSourceErrorMessage,
+ setShowTriggerIntervalNaNError,
+ timeRange,
+ setShowTimeRangeError,
+ setShowCronError,
+ setShowEmailRecipientsError,
+ setEmailRecipientsErrorMessage
+ ) => {
+ // check report name
+ // allow a-z, A-Z, 0-9, (), [], ',' - and _ and spaces
+ let regexp = /^[\w\-\s\(\)\[\]\,\_\-+]+$/;
+ if (metadata.report_params.report_name.search(regexp) === -1) {
+ setShowSettingsReportNameError(true);
+ if (metadata.report_params.report_name === '') {
+ setSettingsReportNameErrorMessage('Name must not be empty.');
+ } else {
+ setSettingsReportNameErrorMessage('Invalid characters in report name.');
+ }
+ error = true;
+ }
+
+ // if recurring by interval and input is not a number
+ if (
+ metadata.trigger.trigger_type === 'Schedule' &&
+ metadata.trigger.trigger_params.schedule_type === 'Recurring'
+ ) {
+ let interval = parseInt(
+ metadata.trigger.trigger_params.schedule.interval.period
+ );
+ if (isNaN(interval)) {
+ setShowTriggerIntervalNaNError(true);
+ error = true;
+ }
+ }
+
+ // if report source is blank
+ if (metadata.report_params.core_params.base_url === "") {
+ setShowSettingsReportSourceError(true);
+ setSettingsReportSourceErrorMessage('Report source must not be empty.');
+ error = true;
+ }
+
+ // if time range is invalid
+ const nowDate = new Date(moment.now());
+ if (timeRange.timeFrom > timeRange.timeTo || timeRange.timeTo > nowDate) {
+ setShowTimeRangeError(true);
+ error = true;
+ }
+
+ // if cron based and cron input is invalid
+ if (
+ metadata.trigger.trigger_type === 'Schedule' &&
+ metadata.trigger.trigger_params.schedule_type === 'Cron based'
+ ) {
+ if (
+ !isValidCron(metadata.trigger.trigger_params.schedule.cron.expression)
+ ) {
+ setShowCronError(true);
+ error = true;
+ }
+ }
+ // if email delivery
+ if (metadata.delivery.delivery_type === 'Channel') {
+ // no recipients are listed
+ if (metadata.delivery.delivery_params.recipients.length === 0) {
+ setShowEmailRecipientsError(true);
+ setEmailRecipientsErrorMessage(
+ 'Email recipients list cannot be empty.'
+ );
+ error = true;
+ }
+ // recipients have invalid email addresses: regexp checks format xxxxx@yyyy.zzz
+ let emailRegExp = /\S+@\S+\.\S+/;
+ let index;
+ let recipients = metadata.delivery.delivery_params.recipients;
+ for (index = 0; index < recipients.length; ++index) {
+ if (recipients[0].search(emailRegExp) === -1) {
+ setShowEmailRecipientsError(true);
+ setEmailRecipientsErrorMessage(
+ 'Invalid email addresses in recipients list.'
+ );
+ error = true;
+ }
+ }
+ }
+ return error;
+ };
\ No newline at end of file
diff --git a/public/components/utils/settings_service.ts b/public/components/utils/settings_service.ts
new file mode 100644
index 00000000..16ac00f9
--- /dev/null
+++ b/public/components/utils/settings_service.ts
@@ -0,0 +1,37 @@
+/*
+ * Copyright OpenSearch Contributors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { HttpStart, IUiSettingsClient } from '../../../../../src/core/public';
+
+let uiSettings: IUiSettingsClient;
+let http: HttpStart;
+
+export const uiSettingsService = {
+ init: (uiSettingsClient: IUiSettingsClient, httpClient: HttpStart) => {
+ uiSettings = uiSettingsClient;
+ http = httpClient;
+ },
+ get: (key: string, defaultOverride?: any) => {
+ return uiSettings?.get(key, defaultOverride) || '';
+ },
+ getSearchParams: function () {
+ const rawTimeZone = this.get('dateFormat:tz');
+ const timezone =
+ !rawTimeZone || rawTimeZone === 'Browser'
+ ? Intl.DateTimeFormat().resolvedOptions().timeZone
+ : rawTimeZone;
+ const dateFormat = this.get('dateFormat');
+ const csvSeparator = this.get('csv:separator');
+ const allowLeadingWildcards = this.get('query:allowLeadingWildcards');
+ return {
+ timezone,
+ dateFormat,
+ csvSeparator,
+ allowLeadingWildcards,
+ };
+ },
+ getHttpClient: () => http,
+};
+
diff --git a/public/components/utils/utils.tsx b/public/components/utils/utils.tsx
new file mode 100644
index 00000000..469da045
--- /dev/null
+++ b/public/components/utils/utils.tsx
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+import React from 'react';
+
+export const permissionsMissingToast = (action: string) => {
+ return {
+ title: 'Error ' + action,
+ color: 'danger',
+ iconType: 'alert',
+ id: 'permissionsMissingErrorToast' + action.replace(' ', ''),
+ text: (
+
Insufficient permissions. Reach out to your Kibana administrator.
+ ),
+ };
+};
+
+export const permissionsMissingActions = {
+ CHANGE_SCHEDULE_STATUS: 'changing schedule status.',
+ DELETE_REPORT_DEFINITION: 'deleting report definition.',
+ GENERATING_REPORT: 'generating report.',
+ LOADING_REPORTS_TABLE: 'loading reports table.',
+ LOADING_DEFINITIONS_TABLE: 'loading report definitions table.',
+ VIEWING_EDIT_PAGE: 'viewing edit page.',
+ UPDATING_DEFINITION: 'updating report definition',
+ CREATING_REPORT_DEFINITION: 'creating new report definition.',
+};
+
+export const timeRangeMatcher = /time:\(from:(.+?),to:(.+?)\)/;
diff --git a/public/components/visual_report/assets/report_styles.ts b/public/components/visual_report/assets/report_styles.ts
new file mode 100644
index 00000000..a78ee8a8
--- /dev/null
+++ b/public/components/visual_report/assets/report_styles.ts
@@ -0,0 +1,222 @@
+/*
+ * Copyright OpenSearch Contributors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export const reportingStyle = `
+html,
+body {
+ margin: 0;
+ padding: 0;
+}
+
+iframe, embed, object {
+ display: none !important;
+}
+
+/* nice padding + matches Kibana default UI colors you could also set this to inherit if
+ the wrapper gets inserted inside a kibana section. I might also remove the manual text color here as well, potentially */
+.reportWrapper {
+ padding: 8px;
+ background-color: #fafbfd;
+}
+
+/* Notice that I'm using an ID of #reportingHeader, and #reportingFooter, instead of a classname (.reportingHeader, .reportingFooter). This is
+ in order to force specificity here higher in case any other styles would conflict */
+#reportingHeader,
+#reportingFooter {
+ font-family: 'Inter UI', -apple-system, BlinkMacSystemFont, 'Segoe UI',
+ Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
+ 'Segoe UI Symbol';
+ background-color: #fff;
+ border: 1px solid #d3dae6;
+ box-shadow: 0 2px 2px -1px rgba(152, 162, 179, 0.3),
+ 0 1px 5px -2px rgba(152, 162, 179, 0.3);
+ border-radius: 4px;
+ padding: 1em;
+ margin-bottom: 1em;
+}
+
+#reportingFooter {
+ margin-top: 1em;
+}
+
+#reportingHeader p,
+#reportingFooter p {
+ max-width: 960px;
+}
+
+/* Adjust the margin when the header is the first item */
+#reportingHeader h1:first-child,
+#reportingFooter h1:first-child,
+#reportingHeader h2:first-child,
+#reportingFooter h2:first-child,
+#reportingHeader h3:first-child,
+#reportingFooter h3:first-child,
+#reportingHeader h4:first-child,
+#reportingFooter h4:first-child,
+#reportingHeader h5:first-child,
+#reportingFooter h5:first-child,
+#reportingHeader h6:first-child,
+#reportingFooter h6:first-child {
+ margin-top: 0.25em;
+}
+
+/* nicer list styles */
+#reportingHeader ul,
+#reportingFooter ul,
+#reportingHeader ol,
+#reportingFooter ol {
+ max-width: 70rem;
+ margin-bottom: 1em;
+}
+
+#reportingHeader ul li,
+#reportingFooter ul li,
+#reportingHeader ol li,
+#reportingFooter ol li {
+ margin-bottom: 0.25em;
+ margin-left: -0.5em;
+ padding-left: 0.25em;
+}
+
+#reportingHeader ul,
+#reportingFooter ul {
+ list-style-type: disc;
+}
+
+/* here we explicitly set nested paragraphs inside lists to inherit their styles from the list, in case markdown does funky things */
+#reportingHeader ul p,
+#reportingFooter ul p,
+#reportingHeader ol p,
+#reportingFooter ol p {
+ font-family: inherit;
+ font-size: inherit;
+ font-weight: inherit;
+ /* We only inherit vertical spacing, not horizontal */
+ margin-top: inherit;
+ margin-bottom: inherit;
+}
+
+
+
+
+
+ A new Kibana report is available
+
+
+
+
+
+