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); +} + +
