http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-app/src/main/resources/dashboard/tsconfig.json
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/tsconfig.json 
b/asterixdb/asterix-app/src/main/resources/dashboard/tsconfig.json
deleted file mode 100755
index 0897e9e..0000000
--- a/asterixdb/asterix-app/src/main/resources/dashboard/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-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.
-*/
-{
-  "compileOnSave": false,
-  "compilerOptions": {
-    "outDir": "./dist/out-tsc",
-    "sourceMap": true,
-    "declaration": false,
-    "moduleResolution": "node",
-    "emitDecoratorMetadata": true,
-    "experimentalDecorators": true,
-    "target": "es5",
-    "typeRoots": [
-      "node_modules/@types"
-    ],
-    "lib": [
-      "es2017",
-      "dom"
-    ]
-  }
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-app/src/main/resources/dashboard/tslint.json
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/main/resources/dashboard/tslint.json 
b/asterixdb/asterix-app/src/main/resources/dashboard/tslint.json
deleted file mode 100755
index 1d02629..0000000
--- a/asterixdb/asterix-app/src/main/resources/dashboard/tslint.json
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-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.
-*/
-{
-  "rulesDirectory": [
-    "node_modules/codelyzer"
-  ],
-  "rules": {
-    "arrow-return-shorthand": true,
-    "callable-types": true,
-    "class-name": true,
-    "comment-format": [
-      true,
-      "check-space"
-    ],
-    "curly": true,
-    "eofline": true,
-    "forin": true,
-    "import-blacklist": [
-      true,
-      "rxjs",
-      "rxjs/Rx"
-    ],
-    "import-spacing": true,
-    "indent": [
-      true,
-      "spaces"
-    ],
-    "interface-over-type-literal": true,
-    "label-position": true,
-    "max-line-length": [
-      true,
-      140
-    ],
-    "member-access": false,
-    "member-ordering": [
-      true,
-      {
-        "order": [
-          "static-field",
-          "instance-field",
-          "static-method",
-          "instance-method"
-        ]
-      }
-    ],
-    "no-arg": true,
-    "no-bitwise": true,
-    "no-console": [
-      true,
-      "debug",
-      "info",
-      "time",
-      "timeEnd",
-      "trace"
-    ],
-    "no-construct": true,
-    "no-debugger": true,
-    "no-duplicate-super": true,
-    "no-empty": false,
-    "no-empty-interface": true,
-    "no-eval": true,
-    "no-inferrable-types": [
-      true,
-      "ignore-params"
-    ],
-    "no-misused-new": true,
-    "no-non-null-assertion": true,
-    "no-shadowed-variable": true,
-    "no-string-literal": false,
-    "no-string-throw": true,
-    "no-switch-case-fall-through": true,
-    "no-trailing-whitespace": true,
-    "no-unnecessary-initializer": true,
-    "no-unused-expression": true,
-    "no-use-before-declare": true,
-    "no-var-keyword": true,
-    "object-literal-sort-keys": false,
-    "one-line": [
-      true,
-      "check-open-brace",
-      "check-catch",
-      "check-else",
-      "check-whitespace"
-    ],
-    "prefer-const": true,
-    "quotemark": [
-      true,
-      "single"
-    ],
-    "radix": true,
-    "semicolon": [
-      true,
-      "always"
-    ],
-    "triple-equals": [
-      true,
-      "allow-null-check"
-    ],
-    "typedef-whitespace": [
-      true,
-      {
-        "call-signature": "nospace",
-        "index-signature": "nospace",
-        "parameter": "nospace",
-        "property-declaration": "nospace",
-        "variable-declaration": "nospace"
-      }
-    ],
-    "typeof-compare": true,
-    "unified-signatures": true,
-    "variable-name": false,
-    "whitespace": [
-      true,
-      "check-branch",
-      "check-decl",
-      "check-operator",
-      "check-separator",
-      "check-type"
-    ],
-    "directive-selector": [
-      true,
-      "attribute",
-      "app",
-      "camelCase"
-    ],
-    "component-selector": [
-      true,
-      "element",
-      "app",
-      "kebab-case"
-    ],
-    "use-input-property-decorator": true,
-    "use-output-property-decorator": true,
-    "use-host-property-decorator": true,
-    "no-input-rename": true,
-    "no-output-rename": true,
-    "use-life-cycle-interface": true,
-    "use-pipe-transform-interface": true,
-    "component-class-suffix": true,
-    "directive-class-suffix": true,
-    "invoke-injectable": true
-  }
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-dashboard/pom.xml 
b/asterixdb/asterix-dashboard/pom.xml
new file mode 100644
index 0000000..723c409
--- /dev/null
+++ b/asterixdb/asterix-dashboard/pom.xml
@@ -0,0 +1,81 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you 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.
+ !-->
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <parent>
+    <artifactId>apache-asterixdb</artifactId>
+    <groupId>org.apache.asterix</groupId>
+    <version>0.9.3-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>asterix-dashboard</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-http</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.asterix</groupId>
+      <artifactId>asterix-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+            <configuration>
+              <licenses combine.children="append">
+                <license
+                    
implementation="org.apache.rat.analysis.license.MITLicense"/>
+              </licenses>
+              <excludes combine.children="append">
+                <exclude>src/main/resources/dashboard/static/*
+                </exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
 
b/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
new file mode 100644
index 0000000..598d802
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.asterix.api.http.server;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.asterix.common.config.ExternalProperties;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.hyracks.http.api.IServletRequest;
+import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.hyracks.http.server.StaticResourceServlet;
+import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import io.netty.handler.codec.http.HttpResponseStatus;
+
+public class QueryWebInterfaceServlet extends StaticResourceServlet {
+    private static final Logger LOGGER = LogManager.getLogger();
+    private ICcApplicationContext appCtx;
+
+    public QueryWebInterfaceServlet(ICcApplicationContext appCtx, 
ConcurrentMap<String, Object> ctx, String[] paths) {
+        super(ctx, paths);
+        this.appCtx = appCtx;
+    }
+
+    @Override
+    protected void get(IServletRequest request, IServletResponse response) 
throws IOException {
+        String requestURI = request.getHttpRequest().uri();
+        if ("/".equals(requestURI)) {
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML);
+            // Dashboard Administration Console
+            deliverResource("/dashboard/static/index.html", response);
+        } else {
+            deliverResource(requestURI, response);
+        }
+    }
+
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) 
throws IOException {
+        HttpUtil.setContentType(response, 
HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
+        ExternalProperties externalProperties = appCtx.getExternalProperties();
+        response.setStatus(HttpResponseStatus.OK);
+        ObjectNode obj = OBJECT_MAPPER.createObjectNode();
+        try {
+            PrintWriter out = response.writer();
+            obj.put("api_port", 
String.valueOf(externalProperties.getAPIServerPort()));
+            out.println(obj.toString());
+            return;
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Failure writing response", e);
+        }
+        try {
+            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Failure setting response status", e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json
new file mode 100755
index 0000000..7e41979
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json
@@ -0,0 +1,69 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "asterixdb-web-console"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "static",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "main.scss",
+        "../node_modules/codemirror/lib/codemirror.css",
+        "../node_modules/codemirror/theme/monokai.css",
+        "../node_modules/primeng/resources/themes/omega/theme.css",
+        "../node_modules/primeng/resources/primeng.min.css"
+      ],
+      "scripts": [
+        "../node_modules/codemirror/lib/codemirror.js"
+      ],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "src/tsconfig.spec.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "e2e/tsconfig.e2e.json",
+      "exclude": "**/node_modules/**"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "css",
+    "class": {
+      "spec": false
+    },
+    "component": {}
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig
new file mode 100755
index 0000000..ba060b8
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig
@@ -0,0 +1,25 @@
+# Editor configuration, see http://editorconfig.org
+#/*
+#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.
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore
new file mode 100755
index 0000000..fc1e2ce
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore
@@ -0,0 +1,47 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+/documents
+# /static
+/dist
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db
+
+# Others
+package-lock.json

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md
new file mode 100755
index 0000000..14f16fc
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md
@@ -0,0 +1,47 @@
+/*
+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.
+*/
+
+# AsterixDB Web Administration Console
+
+AsterixDB Administration Console is an Angular 5 HTML/CSS/Typescript web 
application using predictable state containers, immutable data updates with 
Redux/NGRx frameworks, observable patterns, and standard Open Sourced UI 
widgets for data, metadata manipulation and visualization through SQL++ 
AsterixDB Query language.
+
+The main goal is create a baseline solution with unopinionated UI/UX design 
and SW architecture with two differentiated isolated, indepent minimal coupled 
levels between the UI components and application core or internal core, easily 
extensible and scalable by the AsterixDB community.
+
+## Development
+
+This project was generated with [Angular 
CLI](https://github.com/angular/angular-cli) version 1.4.9.
+
+## Installation
+
+Install node and npm, any of the latest versions will do.
+
+Run `npm install` to download all the dependency packages an recreate the 
node_modules directory.
+
+## Development server
+
+The development version uses the webpack proxy to avoid CORS problems in 
Angular see:  
+
+`https://daveceddia.com/access-control-allow-origin-cors-errors-in-angular`. 
+
+Please check `proxy.config.js` to see how it's configured.
+
+Run `ng serve` or `npm start` for a dev server. Navigate to 
`http://localhost:4200/`. The app will automatically reload if you change any 
of the source files.
+
+A technical document describing the internals and architecture exist, here:
+
+`https://github.com/EmilioMobile/asterixdb-dashboard/blob/master/documents/AsterixDB%20Architecture%20v1.0.pdf?raw=true`
+
+A brief user guide document describing how to use it, here:
+
+`https://github.com/EmilioMobile/asterixdb-dashboard/blob/master/documents/AsterixDB%20User%20Guide%20v1.0.pptx?raw=true`

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts
new file mode 100755
index 0000000..e75aa02
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts
@@ -0,0 +1,27 @@
+/*
+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.
+*/
+import { AppPage } from './app.po';
+
+describe('asterixdb-dashboard', () => {
+  let page: AppPage;
+
+  beforeEach(() => {
+    page = new AppPage();
+  });
+
+  it('should display welcome message', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('Welcome to AsterixDB Dashboard!');
+  });
+});

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts
new file mode 100755
index 0000000..37d3de9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts
@@ -0,0 +1,24 @@
+/*
+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.
+*/
+import { browser, by, element } from 'protractor';
+
+export class AppPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
new file mode 100755
index 0000000..41b7fc0
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
@@ -0,0 +1,27 @@
+/*
+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.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/e2e",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "jasminewd2",
+      "node"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js
new file mode 100755
index 0000000..c9da2c5
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js
@@ -0,0 +1,47 @@
+/*
+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.
+*/
+
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular/cli'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('@angular/cli/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in 
browser
+    },
+    coverageIstanbulReporter: {
+      reports: [ 'html', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    angularCli: {
+      environment: 'dev'
+    },
+    reporters: ['progress', 'kjhtml'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_INFO,
+    autoWatch: true,
+    browsers: ['Chrome'],
+    singleRun: false
+  });
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json
new file mode 100755
index 0000000..3073159
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json
@@ -0,0 +1,60 @@
+{
+  "name": "asterixdb-web-console",
+  "version": "1.0.0",
+  "license": "Apache License, Version 2.0",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve --proxy-config proxy.config.js --host 0.0.0.0",
+    "build": "ng build",
+    "test": "ng test",
+    "lint": "ng lint",
+    "e2e": "ng e2e"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^5.0.3",
+    "@angular/cdk": "^5.0.0-rc.2",
+    "@angular/common": "^5.0.3",
+    "@angular/compiler": "^5.0.3",
+    "@angular/core": "^5.0.3",
+    "@angular/forms": "^5.0.3",
+    "@angular/http": "^5.0.3",
+    "@angular/material": "^5.0.0-rc.2",
+    "@angular/platform-browser": "^5.0.3",
+    "@angular/platform-browser-dynamic": "^5.0.3",
+    "@angular/router": "^5.0.3",
+    "@ngrx/db": "^2.0.2",
+    "@ngrx/effects": "^4.1.0",
+    "@ngrx/entity": "^4.1.0",
+    "@ngrx/store": "^4.1.0",
+    "@ngrx/store-devtools": "^4.0.0",
+    "codemirror": "^5.31.0",
+    "core-js": "^2.4.1",
+    "file-saver": "^1.3.3",
+    "hammerjs": "^2.0.8",
+    "primeng": "^4.3.0",
+    "rxjs": "^5.5.2",
+    "zone.js": "^0.8.18"
+  },
+  "devDependencies": {
+    "@angular/cli": "1.5.4",
+    "@angular/compiler-cli": "^5.0.3",
+    "@angular/language-service": "^5.0.0",
+    "@types/file-saver": "^1.3.0",
+    "@types/jasmine": "~2.5.53",
+    "@types/jasminewd2": "~2.0.2",
+    "@types/node": "~6.0.60",
+    "jasmine-core": "~2.6.2",
+    "jasmine-spec-reporter": "~4.1.0",
+    "karma": "~1.7.0",
+    "karma-chrome-launcher": "~2.1.1",
+    "karma-cli": "~1.0.1",
+    "karma-coverage-istanbul-reporter": "^1.2.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "^0.2.2",
+    "protractor": "~5.1.2",
+    "ts-node": "^3.2.2",
+    "tslint": "^5.7.0",
+    "typescript": "^2.4.2"
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js
new file mode 100755
index 0000000..ac4c723
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js
@@ -0,0 +1,41 @@
+/*
+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.
+*/
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+  allScriptsTimeout: 11000,
+  specs: [
+    './e2e/**/*.e2e-spec.ts'
+  ],
+  capabilities: {
+    'browserName': 'chrome'
+  },
+  directConnect: true,
+  baseUrl: 'http://localhost:4200/',
+  framework: 'jasmine',
+  jasmineNodeOpts: {
+    showColors: true,
+    defaultTimeoutInterval: 30000,
+    print: function() {}
+  },
+  onPrepare() {
+    require('ts-node').register({
+      project: 'e2e/tsconfig.e2e.json'
+    });
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: 
true } }));
+  }
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js
new file mode 100755
index 0000000..58752c3
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js
@@ -0,0 +1,23 @@
+/*
+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.
+*/
+const PROXY_CONFIG = {
+    "/query-service/*": {
+        "target": "http://localhost:19002";,
+        "secure": false,
+        logLevel: "debug",
+        pathRewrite: function (path) { return path.replace('/query-service', 
'/query/service')}
+    }
+}
+
+module.exports = PROXY_CONFIG;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
new file mode 100755
index 0000000..87a0c2b
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
@@ -0,0 +1,75 @@
+/*
+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.
+*/
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import {
+  Http,
+  Headers,
+  RequestOptions
+}                     from '@angular/http';
+
+@Injectable()
+export class ConfigService {
+
+  private config: Object
+  private env: Object
+
+  constructor(private http: Http) {}
+
+  /**
+   * Loads the environment config file first. Reads the environment variable 
from the file
+   * and based on that loads the appropriate configuration file - development 
or production
+   */
+  load() {
+    return new Promise((resolve, reject) => {
+      let headers = new Headers({ 'Accept': 'application/json', 
'Content-Type': 'application/json', 'DataType': 'application/json' });
+      let options = new RequestOptions({ headers: headers });
+
+      this.http.get('/config/env.json')
+      .map(res => res.json())
+      .subscribe((env_data) => {
+        this.env = env_data;
+
+        this.http.get('/config/' + env_data.env + '.json')
+          .map(res => res.json())
+          .catch((error: any) => {
+            return Observable.throw(error.json().error || 'Server error');
+          })
+          .subscribe((data) => {
+            this.config = data;
+            resolve(true);
+          });
+      });
+
+    });
+  }
+
+  /**
+   * Returns environment variable based on given key
+   *
+   * @param key
+   */
+  getEnv(key: any) {
+    return this.env[key];
+  }
+
+  /**
+   * Returns configuration value based on given key
+   *
+   * @param key
+   */
+  get(key: any) {
+    return this.config[key];
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
new file mode 100755
index 0000000..58481be
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
@@ -0,0 +1,15 @@
+<!--/*
+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.
+*/-->
+<awc-bar></awc-bar>
+<awc-tab></awc-tab>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
new file mode 100755
index 0000000..b01fcf5
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
@@ -0,0 +1,14 @@
+/*
+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.
+*/
+// Place holder for future expansion
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
new file mode 100755
index 0000000..a913109
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
@@ -0,0 +1,31 @@
+/*
+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.
+*/
+import { Component } from '@angular/core';
+import { AppCoreService } from './shared/services/app-core.service'
+
+/*
+ * Root component
+ * Defines AsterixDB Dashboard application's layout
+ */
+@Component({
+  selector: 'awc-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.scss']
+})
+export class AppComponent {
+  title = 'Asterix DB Web Console';
+
+  constructor(private appCoreService: AppCoreService) {
+  }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
new file mode 100755
index 0000000..11c8602
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
@@ -0,0 +1,121 @@
+/*
+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.
+*/
+import { BrowserModule } from '@angular/platform-browser';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { HttpClientModule } from '@angular/common/http';
+import { EffectsModule } from '@ngrx/effects';
+import { DataverseEffects } from './shared/effects/dataverse.effects';
+import { DatasetEffects } from './shared/effects/dataset.effects';
+import { DatatypeEffects } from './shared/effects/datatype.effects';
+import { IndexEffects } from './shared/effects/index.effects';
+import { SQLQueryEffects } from './shared/effects/query.effects';
+import { MetadataEffects } from './shared/effects/metadata.effects';
+import { AppComponent } from './app.component';
+import { AppBarComponent }  from './dashboard/appbar.component';
+import { DataverseCollection } from 
'./dashboard/metadata/dataverses-collection/dataverses.component';
+import { DatasetCollection } from 
'./dashboard/metadata/datasets-collection/datasets.component';
+import { DatatypeCollection } from 
'./dashboard/metadata/datatypes-collection/datatypes.component';
+import { CodemirrorComponent } from './dashboard/query/codemirror.component';
+import { CodemirrorMetadataComponent } from 
'./dashboard/metadata/codemirror-metadata.component';
+import { IndexCollection } from 
'./dashboard/metadata/indexes-collection/indexes.component';
+import { MetadataContainerComponent }  from 
'./dashboard/metadata/metadata-container.component';
+import { MetadataComponent }  from './dashboard/query/metadata.component';
+import { QueryContainerComponent }  from 
'./dashboard/query/query-container.component';
+import { InputQueryComponent }  from './dashboard/query/input.component';
+import { InputQueryMetadataComponent }  from 
'./dashboard/metadata/input-metadata.component';
+import { QueryOutputComponent, SafeHtmlPipe }  from 
'./dashboard/query/ouput.component';
+import { AppTabComponent }  from './dashboard/apptab.component';
+import { KeysPipe } from './shared/pipes/keys.pipe';
+import { ObjectTypePipe } from './shared/pipes/objectType.pipe';
+import { ObjectArrayTypePipe } from './shared/pipes/objectArrayType.pipe';
+import { reducers } from './shared/reducers';
+import { SQLService } from './shared/services/async-query.service'
+import { AppCoreService } from './shared/services/app-core.service'
+import { MetadataService } from './shared/services/async-metadata.service'
+import { DBModule } from '@ngrx/db';
+import { FormsModule } from '@angular/forms';
+import { MaterialModule } from './material.module';
+import { NgModule } from '@angular/core';
+import { StoreModule,  } from '@ngrx/store';
+import { StoreDevtoolsModule } from '@ngrx/store-devtools';
+import { schema } from './db';
+import { DataTableModule, SharedModule } from 'primeng/primeng';
+import { TreeModule, TreeNode} from 'primeng/primeng';
+import { DialogCreateDataverse, DialogDropDataverse } from 
'./dashboard/metadata/dataverses-collection/dataverses.component';
+import { DialogCreateDataset, DialogDropDataset } from 
'./dashboard/metadata/datasets-collection/datasets.component';
+import { DialogCreateDatatype, DialogDropDatatype } from 
'./dashboard/metadata/datatypes-collection/datatypes.component';
+import { DialogCreateIndex, DialogDropIndex } from 
'./dashboard/metadata/indexes-collection/indexes.component';
+
+
+
+@NgModule({
+  declarations: [
+    AppComponent,
+    AppBarComponent,
+    InputQueryComponent,
+    InputQueryMetadataComponent,
+               QueryOutputComponent,
+    CodemirrorComponent,
+    CodemirrorMetadataComponent,
+               DataverseCollection,
+               DatasetCollection,
+               DatatypeCollection,
+               IndexCollection,
+    KeysPipe,
+               MetadataContainerComponent,
+    MetadataComponent,
+    QueryContainerComponent,
+               AppTabComponent,
+               ObjectTypePipe,
+    ObjectArrayTypePipe,
+    DialogCreateDataverse,
+    DialogDropDataverse,
+    DialogCreateDataset,
+    DialogDropDataset,
+    DialogCreateDatatype,
+    DialogDropDatatype,
+    DialogCreateIndex,
+    DialogDropIndex,
+    SafeHtmlPipe
+  ],
+  imports: [
+    TreeModule,
+    DataTableModule,
+    SharedModule,
+    FormsModule,
+    BrowserModule,
+               BrowserAnimationsModule,
+               DBModule.provideDB(schema),
+               EffectsModule.forRoot([MetadataEffects, DataverseEffects, 
DatasetEffects, DatatypeEffects, IndexEffects, SQLQueryEffects]),
+    HttpClientModule,
+    MaterialModule,
+               StoreModule.forRoot(reducers),
+               StoreDevtoolsModule.instrument({
+                       maxAge: 10
+               })
+  ],
+  entryComponents: [
+    DialogCreateDataverse, 
+    DialogDropDataverse, 
+    DialogCreateDataset, 
+    DialogDropDataset , 
+    DialogCreateDatatype, 
+    DialogDropDatatype,
+    DialogCreateIndex, 
+    DialogDropIndex 
+  ],
+  providers: [AppCoreService, SQLService, MetadataService],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
new file mode 100755
index 0000000..62cf771
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
@@ -0,0 +1,45 @@
+<!--/*
+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.
+*/ -->
+<header class="awc-navbar">
+    <nav class="awc-navbar-header">
+      <a mat-button class="awc-button" routerLink="/" aria-label="AsterixDB 
Web Console">
+      <img class="awc-asterixDB-logo"
+            src="assets/asterixdb_tm.png"
+            alt="AsterixDB">
+            <span>Administration Console</span>
+      </a>
+      <div class="flex-spacer"></div>
+      <a mat-button class="awc-button awc-navbar-hide-small" 
href="https://asterixDB.apache.org";
+         aria-label="WEBSITE">
+        WEBSITE
+      </a>
+      <a mat-button class="awc-button awc-navbar-hide-small" 
href="https://issues.apache.org/jira/browse/ASTERIXDB";
+         aria-label="FILE ISSUES">
+        FILE ISSUES
+      </a>
+      <a mat-button class="awc-button awc-navbar-hide-small" 
href="https://ci.apache.org/projects/asterixdb/index.html";
+         aria-label="DOCUMENTATION">
+        DOCUMENTATION
+      </a>
+      <a mat-button class="awc-button docs-navbar-hide-small" 
href="https://asterixdb.apache.org/community.html";
+         aria-label="CONTACT">
+        CONTACT
+      </a>
+
+      <a mat-button class="awc-button docs-navbar-hide-small" 
href="https://github.com/apache/asterixdb/";
+         aria-label="GITHUB">
+        GITHUB
+      </a>
+    </nav>
+</header>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
new file mode 100755
index 0000000..8a764e6
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
@@ -0,0 +1,62 @@
+/*
+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.
+*/
+.awc-navbar {
+  a {
+    //color: #f0f0f0;
+    text-decoration: none;
+  }
+
+  border-bottom: 1px solid  hsla(0,0%,0%,.10);
+  overflow: hidden;
+}
+
+.awc-navbar-header {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  padding: 8px 16px;
+
+  > .mat-button {
+    &:last-child {
+      margin-left: auto;
+    }
+  }
+}
+
+.flex-spacer {
+  flex-grow: 1;
+}
+
+.awc-asterixDB-logo {
+  height: 26px;
+  margin: 0 4px 3px 0;
+  vertical-align: middle;
+}
+
+.awc-github-logo {
+  height: 21px;
+  margin: 0 7px 2px 0;
+  vertical-align: middle;
+}
+
+.awc-navbar-link {
+  text-decoration: inherit;
+  flex: 1;
+}
+
+/*
+* Rules for when the device is detected to be a small screen.
+* Moves content two rows instead of one.
+*/
+//@media (max-width: 720px) {}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
new file mode 100755
index 0000000..563ed11
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
@@ -0,0 +1,25 @@
+/*
+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.
+*/
+import { Component } from '@angular/core';
+
+@Component({
+       moduleId: module.id,
+       selector: 'awc-bar',
+  templateUrl: 'appbar.component.html',
+       styleUrls: ['appbar.component.scss']
+})
+
+export class AppBarComponent {
+       constructor() {}
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
new file mode 100755
index 0000000..bd5c963
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
@@ -0,0 +1,23 @@
+<!--/*
+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.
+*/ -->
+<div class="content">
+  <mat-tab-group class="menu">
+    <mat-tab label=">_ QUERY">
+      <awc-query-container></awc-query-container>
+    </mat-tab>
+    <mat-tab label="METADATA">
+      <awc-metadata-container></awc-metadata-container>
+    </mat-tab>
+  </mat-tab-group>
+</div>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
new file mode 100755
index 0000000..4d6fb7b
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
@@ -0,0 +1,26 @@
+/*
+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.
+*/
+.content {
+  width:95%;
+  margin: 0 auto;
+}
+
+.menu {    
+  /deep/ .mat-tab-label {
+      font-size: 0.80rem !important;
+      font-weight: 500  !important;
+  }
+}
+
+

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
new file mode 100755
index 0000000..b4db7f4
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
@@ -0,0 +1,25 @@
+/*
+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.
+*/
+import { Component } from '@angular/core';
+import { Store } from '@ngrx/store';
+
+@Component({
+  selector: 'awc-tab',
+  templateUrl: 'apptab.component.html',
+  styleUrls: ['apptab.component.scss']
+})
+
+export class AppTabComponent {
+  constructor(private store: Store<any>) {};
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
new file mode 100755
index 0000000..9812ecb
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
@@ -0,0 +1,27 @@
+/*
+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.
+*/
+.textarea-metadata {
+    background-color: red !important;
+    border: 1px solid black !important;
+    padding: 0;
+       margin: 0;
+}
+
+codemirror-metadata {
+    border: 1px solid #eee;
+    height: auto;
+    background-color: blue !important;
+    padding: 0;
+       margin: 0;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
new file mode 100755
index 0000000..aed6ddf
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
@@ -0,0 +1,244 @@
+/*
+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.
+*/
+/**
+ * Integrating codemirror (using ng2-codemirror) with our application
+ *
+ * component from "https://runkit.com/npm/ng2-codemirror";
+ *                "https://www.npmjs.com/package/ng2-codemirror";
+ * copy component from /src/codemirror.component.ts
+ * and modified for custom mode (asterix aql, sql++ code hilighting)
+ *
+ * therefore, actually we don't need to "npm install ng2-codemirror"
+ *
+ * Because on the outside of this component,
+ * It was hard to access the codemirror instance that 'ng-codemirror' use
+ * So, we copied the component in our application and modified it
+ *
+ * 'codemirror.js(^5.23.0)' is included in the 'index.html'
+ * And in this component(codemirror.component.ts)
+ * add statement like "declare var CodeMirror: any;"
+ *
+ * I don't know whether this is right way
+ *
+ * ref 1) usage : https://embed.plnkr.co/8e9gxss9u10VeFrv29Zt/
+ * ref 2) custom mode : http://jsfiddle.net/TcqAf/99/
+ * ref 3) integrating : 
http://stackoverflow.com/questions/37092142/integrating-codemirror-with-angular2-typescript
+ * ref 3) integrating :  
https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.8ok74uvwg
+ */
+import {
+    Component,
+    Input,
+    Output,
+    ElementRef,
+    ViewChild,
+    EventEmitter,
+    forwardRef,
+    AfterViewInit,
+    OnDestroy,
+    ChangeDetectionStrategy
+  } from '@angular/core';
+  import { NG_VALUE_ACCESSOR } from '@angular/forms';
+  import * as CodeMirrorMetadata from 'codemirror';
+ 
+ /**
+  * CodeMirror component
+  * Usage :
+  * <codemirror [(ngModel)]="data" [config]="{...}"></codemirror>
+  */
+ @Component({
+   moduleId: module.id,
+   selector: 'codemirror-metadata',
+   providers: [
+     {
+       provide: NG_VALUE_ACCESSOR,
+       useExisting: forwardRef(() => CodemirrorMetadataComponent),
+       multi: true
+     }
+   ],
+   styleUrls: ['codemirror-metadata.component.scss'],
+   template: `<textarea class="textarea-metadata" 
#hostMetadata></textarea>`,//,
+ })
+ 
+export class CodemirrorMetadataComponent implements AfterViewInit, OnDestroy {
+  @Input() config;
+  @Output() change = new EventEmitter();
+  @Output() focus = new EventEmitter();
+  @Output() blur = new EventEmitter();
+  @Output() instance = null;
+  @ViewChild('hostMetadata') hostMetadata;
+  _value = '';
+ 
+  /**
+  * Constructor
+  */
+  constructor(){
+      /**
+      * Custom mode for AsterixDB
+      */
+      CodeMirrorMetadata.defineMode("asterix", function(){
+        var KEYWORD_MATCH = [
+              // AQL
+              "drop", "dataverse", "dataset",
+              "if", "exists", "create",
+              "use", "type", "as", "closed",
+              "primary", "key",  "hints", "cardinality",
+              "index", "on", "btree", "rtree", "keyword",
+              "for", "in", "Metadata", "Dataset",
+              "return", "Index", "load", "using", "localfs", "path", "format",
+              // Query (not perfect)
+              "from", "in", "with", "group", "by", "select",
+              "let", "where", "order", "asc", "desc", "limit",
+              "keeping", "offset", "distinct", "or", "and",
+              // Built in functions (TODO)
+              // Built in functions (TODO)
+              // Built in functions (TODO)
+              // Asterix Data Model
+              // Primitive type
+              "boolean",
+              "tinyint", "smallint", "integer", "bigint",
+              "float", "double",
+              "string",
+              "binary", "hex", "base64",
+              "point", "line", "rectangle", "circle", "polygon",
+              "date", "time", "datetime", "duration", "interval", "uuid",
+              // Incomplete information type
+              "null", "missing",
+              // Derived type
+              // object {}, array [], multiset {{}}
+              // SQL++
+              "DROP", "DATAVERSE", "IF", "EXISTS", "CREATE", "USE", "TYPE", 
"AS", "DATASET", "PRIMARY", "KEY",
+              "INDEX", "SELECT", "VALUE", "INSERT", "INTO", "FROM", "WHERE", 
"AND", "SOME", "IN", "SATISFIES", "IS", "UNKNOWN", "NOT", "EVERY",
+              "GROUP", "BY", "ORDER", "DESC", "LIMIT", "OR", "SET", "DELETE", 
"LOAD", "USING",
+          ];
+
+          //"(", ")","{{", "}}", "[", "]",     "{", "}",  ";", ",", ":","?", 
"=",
+        var VAR_MATCH = /[$][a-zA-Z]+(\d*)/;
+        var DOT_MATCH = /[.](\S)*/;
+        var DOUBLE_QUOTE_MATCH = /["].*["]/;
+        var SINGLE_QUOTE_MATCH = /['].*[']/;
+        var BREAK_POINT = /(\s)/;
+
+        return {
+            startState: function() {return {inString: false};},
+            token: function(stream, state) {
+                if (state.newLine == undefined)state.newLine = true;
+
+                //match variable reference
+                if (stream.match(VAR_MATCH)) {
+                    return "variable";
+                }
+
+                if (stream.match(DOT_MATCH)) {
+                    return "dot-variable";
+                }
+
+                //string variable match
+                if (stream.match(DOUBLE_QUOTE_MATCH)) {
+                    return "string";
+                }
+                if (stream.match(SINGLE_QUOTE_MATCH)) {
+                    return "string";
+                }
+
+                //keyword match
+                for (var i in KEYWORD_MATCH){
+                    if (state.newLine && stream.match(KEYWORD_MATCH[i])){
+                            return "keyword";
+                    }
+                }
+
+                if (stream.peek() === " " || stream.peek() === null){
+                    state.newLine = true;
+                }else{
+                    state.newLine = false;
+                }
+                stream.next();
+                return null;
+            }
+        };
+      });
+   }
+ 
+  get value() { return this._value; };
+ 
+  @Input() set value(v) {
+    if (v !== this._value) {
+      this._value = v;
+      this.onChange(v);
+    }
+  }
+
+  /**
+  * On component destroy
+  */
+  ngOnDestroy() {}
+ 
+   /**
+    * On component view init
+    */
+  ngAfterViewInit() {
+  this.config = this.config || {};
+  this.codemirrorInit(this.config); 
+  }
+
+  /**
+  * Initialize codemirror
+  */
+  codemirrorMetadataConfig =   {       mode: "asterix",
+    //lineNumbers: true,
+    lineWrapping: true,
+    showCursorWhenSelecting: true,
+    autofocus: true
+  };
+
+  codemirrorInit(config){
+    this.instance = 
CodeMirrorMetadata.fromTextArea(this.hostMetadata.nativeElement, 
this.codemirrorMetadataConfig);
+    this.instance.setSize("100%" , "100px");
+    this.instance.on('change', () => {
+      this.updateValue(this.instance.getValue());
+    });
+
+    this.instance.on('focus', () => {
+      this.focus.emit();
+    });
+
+    this.instance.on('blur', () => {
+      this.blur.emit();
+    });
+  }
+ 
+  /**
+  * Value update process
+  */
+  updateValue(value){
+    this.value = value;
+    this.onTouched();
+    this.change.emit(value);
+  }
+ 
+  /**
+  * Implements ControlValueAccessor
+  */
+  writeValue(value){
+    this._value = value || '';
+    if (this.instance) {
+      this.instance.setValue(this._value);
+    }
+  }
+ 
+  onChange(_) {}
+  onTouched() {}
+  registerOnChange(fn){this.onChange = fn;}
+  registerOnTouched(fn){this.onTouched = fn;}
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
new file mode 100755
index 0000000..ef88719
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
@@ -0,0 +1,14 @@
+<!--/*
+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.
+*/-->
+<!-- Place holder for future expansion -->

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
new file mode 100755
index 0000000..c969489
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+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.
+*/
+.dataset-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
new file mode 100755
index 0000000..517006c
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
@@ -0,0 +1,26 @@
+<!--/*
+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.
+*/-->
+<div class="dataset-dialog">
+    <p mat-dialog-title>DROP DATASET</p>
+    <mat-dialog-content>
+        <p>PLEASE GIVE THE NAME OF THE DATASET TO DROP</p>
+    </mat-dialog-content>
+        <mat-form-field>
+            <input matInput tabindex="0" [(ngModel)]="data.datasetName">
+        </mat-form-field>
+    <mat-dialog-actions>
+        <button mat-button (click)="onClick()" tabindex="1">DROP</button>
+        <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+    </mat-dialog-actions>
+</div>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
new file mode 100755
index 0000000..c969489
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+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.
+*/
+.dataset-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
new file mode 100755
index 0000000..f556951
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
@@ -0,0 +1,112 @@
+<!--/*
+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.
+*/ -->
+<div class="container" (click)="onClick()">
+  <div class="master">
+      <mat-card class="datasets-card" *ngIf="loaded$ | async as ld">
+        <mat-toolbar color="primary" class="datasets-selector">
+            <mat-icon class="icon">menu</mat-icon>
+            <span>DATASETS - METADATA</span>
+            <span class="spacer"></span>
+        </mat-toolbar>
+        <mat-card-content class="datasets-content">
+            <mat-table #table [dataSource]="dataSource" class="datasets-table">
+                <!-- CompactionPolicy Column -->
+                <ng-container matColumnDef="CompactionPolicy">
+                  <mat-header-cell *matHeaderCellDef 
class="header-compactionpolicy-cell">Compaction Policy</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-compactionpolicy-cell"> {{element.CompactionPolicy}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetId Column -->
+                <ng-container matColumnDef="DatasetId">
+                  <mat-header-cell *matHeaderCellDef 
class="header-datasetid-cell">Dataset Id</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-datasetid-cell"> {{element.DatasetId}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetName Column -->
+                <ng-container matColumnDef="DatasetName">
+                  <mat-header-cell *matHeaderCellDef 
class="header-datasetname-cell">Dataset Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-datasetname-cell"> {{element.DatasetName}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetType Column -->
+                <ng-container matColumnDef="DatasetType">
+                  <mat-header-cell *matHeaderCellDef 
class="header-datasettype-cell">Dataset Type</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-datasettype-cell"> {{element.DatasetType}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatatypeDataverseName Column -->
+                <ng-container matColumnDef="DatatypeDataverseName">
+                  <mat-header-cell *matHeaderCellDef 
class="header-datatypedataversename-cell">Datatype Dataverse 
Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-datatypedataversename-cell"> {{element.DatatypeDataverseName}} 
</mat-cell>
+                </ng-container>
+    
+                <!-- DatatypeName Column -->
+                <ng-container matColumnDef="DatatypeName">
+                  <mat-header-cell *matHeaderCellDef 
class="header-datatypename-cell">Datatype Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-datatypename-cell"> {{element.DatatypeName}} </mat-cell>
+                </ng-container>
+    
+                <!-- DataverseName Column -->
+                <ng-container matColumnDef="DataverseName">
+                  <mat-header-cell *matHeaderCellDef 
class="header-dataversename-cell">Dataverse Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-dataversename-cell"> {{element.DataverseName}} </mat-cell>
+                </ng-container>
+    
+                <!-- GroupName Column -->
+                <ng-container matColumnDef="GroupName">
+                  <mat-header-cell *matHeaderCellDef 
class="header-groupname-cell">Group Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-groupname-cell"> {{element.GroupName}} </mat-cell>
+                </ng-container>
+    
+                <!-- PendingOp Column -->
+                <ng-container matColumnDef="PendingOp">
+                  <mat-header-cell *matHeaderCellDef 
class="header-pendingop-cell">Pending Op</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-pendingop-cell"> {{element.PendingOp}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetType Column -->
+                <ng-container matColumnDef="Timestamp">
+                  <mat-header-cell *matHeaderCellDef 
class="header-timestamp-cell">Timestamp</mat-header-cell>
+                  <mat-cell *matCellDef="let element" 
class="dataset-timestamp-cell"> {{element.Timestamp}} </mat-cell>
+                </ng-container>
+    
+                <mat-header-row *matHeaderRowDef="['DatasetName', 
'DataverseName', 'DatatypeName', 'Timestamp']"></mat-header-row>
+                <mat-row *matRowDef="let row; columns: ['DatasetName', 
'DataverseName', 'DatatypeName', 'Timestamp'];"
+                  [ngClass]="{'highlight': selectedRowIndex == row.id}"
+                  (click)="highlight(row)">
+                </mat-row>
+            </mat-table>
+        </mat-card-content>
+        <mat-card-actions class="actions">
+            <button class="refresh-button" mat-button 
(click)="openDropDatasetDialog()">DROP</button>
+            <span class="error-message">{{errorMessage}}</span>
+            <span class="spacer"></span>
+            <button class="refresh-button" mat-button 
(click)="getDatasets()">REFRESH</button>
+        </mat-card-actions>
+      </mat-card>
+      <awc-query-metadata #querymetadata class="query"></awc-query-metadata>
+  </div>
+  <div class="detail">
+      <mat-card class="datasets-details-card">
+          <mat-toolbar color="primary" class="datasets-selector">
+              <mat-icon class="icon">menu</mat-icon>
+              <span>DATASET - METADATA - DETAILS</span>
+              <span class="spacer"></span>
+          </mat-toolbar>
+          <mat-card-content class="datasets-content output">
+            <span><pre>{{output}}</pre></span>
+          </mat-card-content>
+        </mat-card>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/a7e8dbe3/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
new file mode 100755
index 0000000..38a8272
--- /dev/null
+++ 
b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
@@ -0,0 +1,415 @@
+/*
+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.
+*/
+$datasets-spacing-unit: 8px;
+
+.container {
+  display: flex;
+       flex-flow: row;
+       padding: 0;
+  margin: 0;
+}
+
+.master {
+  width: 60%;
+  overflow: hidden;
+}
+
+.detail {
+  width: 40%;
+  overflow: hidden;
+}
+
+.datasets-card {
+       display: flex;
+       flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin-top: ($datasets-spacing-unit * 2);
+  min-height: 450px;
+  max-height: 450px;
+  //min-width: 98%; //(100vw / 2);
+  //max-width: 98%; // (100vw / 2);
+  width: 95%; // 98%;
+  overflow: hidden;
+}
+
+.datasets-details-card {
+       display: flex;
+       flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin: ($datasets-spacing-unit * 2);
+  min-height: 716px;
+  max-height: 716px;
+  //min-width: 95%; //(100vw / 2);
+  //max-width: 95%; // (100vw / 2);
+  overflow: hidden;
+}
+
+.icon {
+       padding: 0 14px 0 0;
+       margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.datasets-selector {
+       min-height: 42px;
+       max-height: 42px;
+       justify-content: center;
+       font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+       border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.datasets-content {
+  position:relative;
+  top: 0;
+  left: 0;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+}
+
+.datasets-table {
+  margin: $datasets-spacing-unit !important;
+  height: 330px;
+  overflow: auto;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.example-header {
+  min-height: 64px;
+  display: flex;
+  align-items: center;
+  padding-left: 24px;
+  font-size: 20px;
+}
+
+.mat-table {
+  overflow: auto;
+}
+
+.customWidthClass{
+   flex: 0 0 250px;
+}
+
+.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-header-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.header-compactionpolicy-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-compactionpolicy-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasetid-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasetid-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasettype-cell {
+  border: none;
+  font-size: 12px;
+  //letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasettype-cell {
+  border: none;
+  font-size: 12px;
+  //letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datatypedataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datatypedataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+
+.header-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.example-header {
+  min-height: 56px;
+  max-height: 56px;
+  display: flex;
+  align-items: center;
+  padding: 8px 24px 0;
+  font-size: 20px;
+  justify-content: space-between;
+  border-bottom: 1px solid transparent;
+}
+
+.mat-form-field {
+  font-size: 14px;
+  flex-grow: 1;
+  margin-top: 8px;
+}
+
+.example-no-results {
+  display: flex;
+  justify-content: center;
+  padding: 24px;
+  font-size: 12px;
+  font-style: italic;
+}
+
+.actions {
+  display: flex;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  padding: $datasets-spacing-unit;
+  margin: 0;
+}
+
+.error-message {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding-top: 10px;  
+  padding-left: 20px;
+  text-overflow: ellipsis;
+}
+
+.output {
+  padding-left: ($datasets-spacing-unit * 2);
+}
+
+

Reply via email to