Commit a5f8c5aa by Shwetha GS

ATLAS-582 Move Atlas UI to use backboneJS (kevalbhatt18 via shwethags)

parent c2356f8e
# 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.
.DS_Store
.bower-*/
.idea/
node_modules/
public/js/libs/
dist
target/
*.log
*.tgz
node/
dist/
/*
* 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.
*/
'use strict';
var git = require('git-rev');
var LIVERELOAD_PORT = 3010;
var lrSnippet = require('connect-livereload')({ port: LIVERELOAD_PORT });
var mountFolder = function(connect, dir) {
return connect.static(require('path').resolve(dir));
};
module.exports = function(grunt) {
var classPathSep = (process.platform === "win32") ? ';' : ':',
gitHash = '',
pkg = grunt.file.readJSON('package.json'),
distPath = 'dist',
publicPath = 'public',
libPath = distPath + '/js/libs',
isDashboardDirectory = grunt.file.isDir('public'),
modulesPath = 'public/';
if (!isDashboardDirectory) {
modulesPath = '../public/'
}
var proxySnippet = require('grunt-connect-proxy/lib/utils').proxyRequest;
grunt.initConfig({
watch: {
options: {
livereload: 35729
},
js: {
files: ['public/**/*.js'],
tasks: ['shell']
},
html: {
files: ['public/**/*.html'],
tasks: ['copy:dist']
},
css: {
files: ['public/**/*.css'],
tasks: ['copy:dist']
},
image: {
files: ['public/**/*.{ico,gif,png}'],
tasks: ['copy:dist']
}
},
connect: {
server: {
options: {
port: 9999,
base: 'public',
keepalive: true,
//logger: 'dev',
//debug: true,
// change this to '0.0.0.0' to access the server from outside
hostname: '0.0.0.0',
middleware: function(connect, options, defaultMiddleware) {
var proxy = require('grunt-connect-proxy/lib/utils').proxyRequest;
return [
// Include the proxy first
proxy
].concat(defaultMiddleware);
}
},
proxies: [{
context: '/api', // the context of the data service
host: '127.0.0.1', // wherever the data service is running
port: 21000, // the port that the data service is running on
ws: true,
changeOrigin: false,
https: false,
xforward: false,
//xforward: false
}],
},
livereload: {
options: {
middleware: function(connect) {
return [
require('grunt-connect-proxy/lib/utils').proxyRequest,
mountFolder(connect, 'public')
];
}
}
},
dist: {
options: {
middleware: function(connect) {
return [
mountFolder(connect, publicPath)
];
}
}
}
},
concurrent: {
tasks: ['watch', 'connect'],
options: {
logConcurrentOutput: true
}
},
dist: distPath + '/js/app.min.js',
modules: grunt.file.expand(
modulesPath + 'js/app.js',
modulesPath + 'js/config.js',
modulesPath + 'js/routes.js',
modulesPath + 'js/init.js'
).join(' '),
shell: {
min: {
command: ''
/*command: 'java ' +
'-cp ' + distPath + '/lib/closure-compiler/compiler.jar' + classPathSep +
'' + distPath + '/lib/ng-closure-runner/ngcompiler.jar ' +
'org.angularjs.closurerunner.NgClosureRunner ' +
'--compilation_level SIMPLE_OPTIMIZATIONS ' +
//'--formatting PRETTY_PRINT ' +
'--language_in ECMASCRIPT5_STRICT ' +
'--angular_pass ' +
'--manage_closure_dependencies ' +
'--js <%= modules %> ' +
'--js_output_file <%= dist %>'
*/
}
},
devUpdate: {
main: {
options: {
updateType: 'force'
}
}
},
compress: {
release: {
options: {
archive: function() {
return [pkg.name, pkg.version, gitHash].join('_') + '.tgz';
}
},
src: ['node_modules/**', 'package.json', 'server.js', 'server/**', 'public/**', '!public/js/**', '!public/modules/**/*.js']
}
},
npmcopy: {
// Javascript
js: {
options: {
destPrefix: libPath
},
files: {
'jquery/js': 'jquery/dist/jquery.min.js',
'requirejs': 'requirejs/require.js',
'requirejs-text': 'requirejs-text/text.js',
'underscore': 'underscore/underscore-min.js',
'bootstrap/js': 'bootstrap/dist/js/bootstrap.min.js',
'backbone': 'backbone/backbone-min.js',
'backbone-babysitter': 'backbone.babysitter/lib/backbone.babysitter.min.js',
'backbone-marionette': 'backbone.marionette/lib/backbone.marionette.min.js',
'backbone-paginator': 'backbone.paginator/lib/backbone.paginator.min.js',
'backbone-wreqr': 'backbone.wreqr/lib/backbone.wreqr.min.js',
'backgrid/js': 'backgrid/lib/backgrid.js',
'backgrid-filter/js': 'backgrid-filter/backgrid-filter.min.js',
'backgrid-orderable-columns/js': 'backgrid-orderable-columns/backgrid-orderable-columns.js',
'backgrid-paginator/js': 'backgrid-paginator/backgrid-paginator.min.js',
'backgrid-sizeable-columns/js': 'backgrid-sizeable-columns/backgrid-sizeable-columns.js',
'jquery-asBreadcrumbs/js': 'jquery-asBreadcrumbs/dist/jquery-asBreadcrumbs.min.js',
'd3': 'd3/d3.min.js',
'd3/': 'd3-tip/index.js',
'noty/js': 'noty/js/noty/packaged/jquery.noty.packaged.min.js',
'dagre-d3': 'dagre-d3/dist/dagre-d3.min.js'
}
},
css: {
options: {
destPrefix: libPath
},
files: {
'bootstrap/css': 'bootstrap/dist/css/bootstrap.min.css',
'bootstrap/fonts': 'bootstrap/dist/fonts',
'backgrid/css': 'backgrid/lib/backgrid.css',
'backgrid-filter/css': 'backgrid-filter/backgrid-filter.min.css',
'backgrid-orderable-columns/css': 'backgrid-orderable-columns/backgrid-orderable-columns.css',
'backgrid-paginator/css': 'backgrid-paginator/backgrid-paginator.css',
'backgrid-sizeable-columns/css': 'backgrid-sizeable-columns/backgrid-sizeable-columns.css',
'jquery-asBreadcrumbs/css': 'jquery-asBreadcrumbs/css/asBreadcrumbs.css',
'noty/css': 'noty/js/noty/packaged/jquery.noty.packaged.min.js'
}
}
},
copy: {
dist: {
expand: true,
cwd: modulesPath,
src: ['**', 'js/**/*.js', '!modules/**/*.js'],
dest: distPath
}
},
clean: {
build: [distPath, libPath],
options: {
force: true
}
}
});
grunt.loadNpmTasks('grunt-connect-proxy');
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-npmcopy');
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'devUpdate',
'npmcopy:js',
'npmcopy:css'
]);
grunt.registerTask('server', ['clean', 'copy:dist', 'concurrent', 'watch']);
grunt.registerTask('dev', [
'clean',
'npmcopy:js',
'npmcopy:css',
'copy:dist',
'configureProxies:server',
'connect:server',
'concurrent',
'watch',
'connect:livereload'
]);
grunt.registerTask('build', [
'npmcopy:js',
'npmcopy:css',
'copy:dist'
]);
grunt.registerTask('minify', 'Minify the all js', function() {
var done = this.async();
grunt.task.run(['shell:min']);
done();
});
grunt.registerTask('release', 'Create release package', function() {
var done = this.async();
git.short(function(str) {
gitHash = str;
grunt.task.run(['minify', 'compress:release']);
done();
});
});
};
{
"name": "atlas-metadata",
"description": "Apache Atlas",
"version": "0.5.0-incubating",
"private": true,
"repository": {
"type": "git",
"url": "https://git-wip-us.apache.org/repos/asf/incubator-atlas.git"
},
"engines": {
"node": "4.4.x",
"npm": "3.8.x"
},
"keywords": [
"Apache",
"Atlas",
"HortonWorks"
],
"dependencies": {
"backbone": "1.2.3",
"backbone.babysitter": "git+https://github.com/marionettejs/backbone.babysitter.git",
"backbone.marionette": "2.3.2",
"backbone.paginator": "^2.0.0",
"backbone.wreqr": "^1.3.2",
"backgrid": "^0.3.7",
"backgrid-filter": "^0.3.7",
"backgrid-orderable-columns": "^0.1.2",
"backgrid-paginator": "^0.3.7",
"backgrid-sizeable-columns": "^0.1.1",
"bootstrap": "^3.3.5",
"d3": "^3.5.16",
"d3-tip": "^0.6.7",
"dagre-d3": "^0.4.17",
"jquery": "^2.2.2",
"jquery-asBreadcrumbs": "git+https://github.com/amazingSurge/jquery-asBreadcrumbs.git",
"jquery-ui": "^1.10.4",
"noty": "^2.3.8",
"requirejs": "^2.1.16",
"requirejs-text": "^2.0.12",
"underscore": "^1.8.3"
},
"devDependencies": {
"connect-livereload": "^0.5.4",
"git-rev": "^0.2.1",
"grunt": "~0.4.2",
"grunt-cli": "~0.1.11",
"grunt-concurrent": "^1.0.0",
"grunt-connect-proxy": "^0.2.0",
"grunt-contrib-clean": "~0.6.0",
"grunt-contrib-compress": "^0.13.0",
"grunt-contrib-connect": "^1.0.0",
"grunt-contrib-copy": "~0.8.0",
"grunt-contrib-jshint": "^0.11.0",
"grunt-contrib-watch": "^0.6.1",
"grunt-dev-update": "^1.0.2",
"grunt-jsbeautifier": "^0.2.6",
"grunt-nginx": "~0.2.2",
"grunt-nodemon": "^0.4.0",
"grunt-npmcopy": "^0.1.0",
"grunt-shell": "^1.1.1",
"load-grunt-tasks": "^3.1.0",
"proxit": "~0.6.4"
}
}
<?xml version="1.0"?>
<!--
~ 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:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.atlas</groupId>
<artifactId>apache-atlas</artifactId>
<version>0.7-incubating-SNAPSHOT</version>
</parent>
<artifactId>atlas-dashboardv2</artifactId>
<description>Apache Atlas UI Application</description>
<name>Apache Atlas UI</name>
<packaging>war</packaging>
<url>http://atlas.incubator.apache.org</url>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<configuration>
<phase>validate</phase>
<workingDirectory>${project.build.directory}</workingDirectory>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<resource>
<directory>${project.build.directory}/dist</directory>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<goals>
<goal>copy-resources</goal>
</goals>
<phase>validate</phase>
<configuration>
<outputDirectory>${basedir}/target/</outputDirectory>
<resources>
<resource>
<directory>${basedir}</directory>
<includes>
<include>package.json</include>
<include>gruntfile.js</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>${node-for-v2.version}</nodeVersion>
<npmVersion>3.8.5</npmVersion>
</configuration>
</execution>
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<execution>
<id>npm remaining</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>install --ignore-scripts</arguments>
</configuration>
</execution>
<execution>
<id>grunt dist</id>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>build</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@charset "UTF-8";/*!;Animate.css - http://daneden.me/animate;Licensed under the MIT license - http://opensource.org/licenses/MIT;;Copyright (c) 2015 Daniel Eden;*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%)}}@keyframes slideOutDown{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}100%{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}
\ No newline at end of file
/*!
* Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com)
* Code licensed under the Apache License v2.0.
* For details, see http://www.apache.org/licenses/LICENSE-2.0.
*/
/* Toggle Styles */
#wrapper {
padding-left: 0;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
#wrapper.toggled {
padding-left: 300px;
}
#sidebar-wrapper {
z-index: 1000;
position: fixed;
left: 300px;
width: 0;
height: 100%;
margin-left: -300px;
overflow-y: auto;
background: #323544;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
#wrapper.toggled #sidebar-wrapper {
width: 300px;}
#page-content-wrapper {
width: 100%;
position: absolute;
}
#wrapper.toggled #page-content-wrapper {
position: absolute;
margin-right: -300px;
}
/* Sidebar Styles */
.sidebar-nav, .sidebar-components {
margin: 0;
padding: 0;
list-style: none;
}
.sidebar-nav li {
line-height: 50px;
padding: 0 20px;
border-bottom: 1px #1c1e2a solid;
}
.sidebar-components li {
line-height: 40px;
padding: 0 20px;
}
.sidebar-components li:hover {
background-color: #1d1f2b;
}
.sidebar-nav li a ,
.sidebar-components li a {
display: block;
text-decoration: none;
color: #fff;
}
.sidebar-nav li a:hover {
text-decoration: none;
color: #fff;
}
.sidebar-nav li a:active,
.sidebar-nav li a:focus {
text-decoration: none;
}
.sidebar-nav > .sidebar-brand {
font-size: 18px;
line-height: 35px;
padding: 10px;
}
.sidebar-nav > .sidebar-brand a {
color: #ddd;
letter-spacing: 1px;
}
.sidebar-nav > .sidebar-brand a:hover {
color: #fff;
background: none;
}
/* Extended Eleemnts */
.sidebar-actions a {
display: inline-block !important;
margin-right: 20px;
color: #359f89 !important;
}
.sidebar-actions a i {
color: #fff;
}
.sidebar-actions a:hover {
background-color: transparent;
}
.sidebar-input .input-group {
margin: 10px 0px;
}
.sidebar-input .form-control,
.sidebar-input .input-group-addon {
background-color: transparent;
border-radius: 0px;
}
.sidebar-input .form-control {
border-right: none;
color: #eee;
}
.sidebar-input .input-group-addon {
border-left: none;
color: #ccc;
}
.sidebar-input .form-control:focus + .input-group-addon {
border-color: #66afe9;
}
.sidebar-item:hover,
.sidebar-item.active {
background-color: #1d1f2b;
}
.component-badge {
float: right;
margin-top: 8px;
padding: 0px 10px 2px 10px;
background-color: #4990e2;
color: #fff;
font-size: 12px;
line-height: 22px;
border-radius: 12px;
}
@media(min-width:768px) {
#wrapper {
padding-left: 300px;
}
#wrapper.toggled {
padding-left: 0;
}
#sidebar-wrapper {
width: 300px; }
#wrapper.toggled #sidebar-wrapper {
width: 0;
padding: 0;
}
#page-content-wrapper {
position: relative;
}
#wrapper.toggled #page-content-wrapper {
position: relative;
margin-right: 0;
}
}
\ No newline at end of file
/*
* 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.
*/
body {
font-family: 'Raleway', sans-serif;
background-color: #E6E6E6;
/* color: #686868;*/
}
a {
color: #359f89;
}
header {
background-color: #fff;
border-bottom: 1px #e7e8ed solid;
}
textarea:focus,
button:focus {
outline: none !important;
}
textarea {
resize: none;
}
/* Bootstrap Extended */
.form-control:focus {
box-shadow: none;
}
.breadcrumb {
padding: 8px 25px;
background-color: transparent;
margin-bottom: 0px;
font-weight: 600;
line-height: 44px;
}
.breadcrumb>li+li:before {
padding: 0 10px;
font-family: FontAwesome;
color: #686868;
content: "\f105";
}
.well {
background-color: #f6f7fa;
border: 1px solid #e8e9ef;
}
/* Header */
.main-search .form-control {
border: none;
border-left: 1px #e7e8ed solid;
border-radius: 0px;
box-shadow: none;
height: 60px;
font-size: 18px;
font-style: italic;
-webkit-font-smoothing: antialiased;
}
.main-search .input-group-addon {
font-size: 20px;
color: #b5b9bc;
background: none;
border: none;
}
.page-title {
background-color: #fff;
padding: 50px;
}
.page-title h1 {
margin-top: 0px;
margin-bottom: 20px;
font-weight: 600;
-webkit-font-smoothing: antialiased;
}
.page-title h1 small {
position: relative;
bottom: 5px;
margin-left: 15px;
padding-left: 15px;
border-left: 1px #e8e9ef solid;
color: #b4b7bc;
font-size: 40%;
font-weight: 600;
text-transform: uppercase;
}
.page-title .sub-title {
margin-bottom: 40px;
}
/* Atlas Specific */
.atlast-tabbable {
margin: 50px 0px;
}
.atlast-tabbable .nav-tabs {
border-bottom: 1px solid #e8e9ee;
}
.atlast-tabbable .nav-tabs>li>a {
padding: 15px 30px;
text-transform: uppercase;
letter-spacing: 1px;
border-radius: 2px 2px 0 0;
}
.atlast-tabbable .nav-tabs>li.active>a,
.atlast-tabbable .nav-tabs>li.active>a:focus,
.atlast-tabbable .nav-tabs>li.active>a:hover {
border: 1px solid #e8e9ee;
border-bottom-color: transparent;
}
.atlast-tabbable .tab-content {
background-color: #fff;
padding: 35px;
border: 1px solid #e8e9ee;
border-top: none;
}
.btn-atlas {
padding: 10px 20px;
background-color: #fff;
color: #37bb9b;
border: 1px #37bb9b solid;
border-radius: 4px;
-webkit-transition: all .3s ease;
-moz-transition: all .3s ease;
transition: all .3s ease;
}
.btn-atlas:hover {
background-color: #37bb9b;
color: #fff;
}
.btn-tag {
color: #4a90e2;
border: 1px #4a90e2 solid;
background-color: #fff;
border-radius: 4px;
-webkit-transition: all .3s ease;
-moz-transition: all .3s ease;
transition: all .3s ease;
}
.btn-tag:hover {
color: #fff;
background-color: #4a90e2;
}
.breadcrumb > li {
display: inline-block;
}
.breadcrumb-dropdown + li:before,
.breadcrumb-ellipsis + li:before {
display: none;
}
.breadcrumb-menu {
display: none
}
.sidebar-item.active i {
display: block !important;
}
.arrowPosition {
left: -75px;
}
.dropdown-menu>li>a {
color: #359f89;
padding: 6px 20px;
}
/*!
* Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot?v=4.5.0');src:url('fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* 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.
*/
body {
font-family: 'Raleway', sans-serif;
background-color: #f6f7fb;
color: #686868;
}
a {
color: #359f89;
}
button:focus {
outline: none !important;
}
/* Bootstrap Extended */
.form-control:focus {
box-shadow: none;
}
.errorBox {
position: absolute;
right: 36px;
display: none;
top: 26px;
width: 251px;
}
.errorBox .alert {
box-shadow: 4px 3px 8px -2px gray;
}
.close {
padding: 6px;
font-size: 15px;
}
/* Login Page */
.login-pane {
margin-top: 50px;
background: #323544;
color: #eee;
padding: 15px;
border-radius: 5px;
}
.login-pane h2 {
margin-bottom: 40px;
}
.login-pane .input-group {
margin: 20px 0px;
}
.login-pane .form-control,
.login-pane .input-group-addon {
background-color: transparent;
border-radius: 0px;
}
.login-pane .form-control {
border-left: none;
color: #eee;
}
.login-pane .form-control:focus {
border-color: #CCC;
}
.login-pane .input-group-addon {
border-right: none;
color: #ccc;
}
.login-pane .form-control:focus + .input-group-addon {
border-color: #66afe9;
}
.login-pane .btn-atlas {
background-color: #37bb9b;
color: #fff;
}
/* Login Page */
.login-pane {
margin-top: 35%;
background: #323544;
color: #eee;
padding: 15px;
border-radius: 5px;
}
.login-pane h2 {
margin-bottom: 40px;
}
.login-pane .input-group {
margin: 20px 0px;
}
.login-pane .form-control,
.login-pane .input-group-addon {
background-color: transparent;
border-radius: 0px;
}
.login-pane .form-control {
border-left: none;
color: #eee;
}
.login-pane .form-control:focus {
border-color: #CCC;
}
.login-pane .input-group-addon {
border-right: none;
color: #ccc;
}
.login-pane .form-control:focus + .input-group-addon {
border-color: #66afe9;
}
.login-pane .btn-atlas {
padding: 10px 20px;
background-color: #37bb9b;
color: #fff;
border: 1px #37bb9b solid;
border-radius: 4px;
-webkit-transition: all .3s ease;
-moz-transition: all .3s ease;
transition: all .3s ease;
}
/**
* 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.
*/
#old header a.mainLogo {
color: #FFF;
font-size: 16px;
line-height: 40px;
padding: 2px 5px 0 15px;
text-shadow: 0 1px 0 #555;
}
#old footer.navbar-bottom {
background-color: #fafafa;
border-top: solid 4px #444;
position: absolute;
bottom: 0px;
width: 100%;
height: 60px;
}
#old .footer {
padding: 7px;
}
#old .tab a {
color: #000;
}
#old .backgrid th {
text-align: left;
}
#old .backgrid a,
#old table a {
color: #428bca;
}
.backgrid th {
text-transform: capitalize;
}
#old .fa-refresh {
color: #333;
}
#old .tagList a {
display: inline-block;
text-transform: capitalize;
background: #ADD8E6 !important;
color: #333 !important;
padding: 3px 6px;
margin: 0px 3px 3px 0px;
cursor: pointer;
}
#old .tagList a i.fa {
margin-left: 5px;
}
/*
#old .tagList a {
max-width: 100px;
display: list-item;
overflow: hidden;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
white-space: nowrap;
text-transform: capitalize;
float: left;
background: #ADD8E6 !important;
color: #000 !important;
margin: 4px !important;
padding-left: 7px !important;
padding-right: 7px !important;
cursor: pointer;
}*/
#new footer {
display: none;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:focus,
.nav-tabs > li.active > a:hover {
border-width: 0;
}
.nav-tabs > li > a {
border: none;
color: #666;
}
.nav-tabs > li.active > a,
.nav-tabs > li > a:hover {
border: none;
color: #359f89 !important;
}
.nav-tabs > li > a:after {
content: "";
background: #359f89;
height: 2px;
position: absolute;
width: 100%;
left: 0px;
top: -1px;
transition: all 250ms ease 0s;
transform: scale(0);
}
.nav-tabs > li > a:hover:after {
background: #359f89;
}
.nav-tabs > li.active > a:after,
.nav-tabs > li:hover > a:after {
transform: scale(1);
}
.tab-nav > li > a:after {
background: #21527d none repeat scroll 0% 0%;
color: #fff;
}
.tab-pane {
padding: 15px 0;
}
.sidebar-nav .dropdown-menu li {
border-bottom: none;
color: #323544;
}
.sidebar-nav .dropdown-menu li a:hover,
.sidebar-nav .dropdown-menu li a {
color: #323544;
}
.sidebar-nav .dropdown-menu li:hover {
background: #E4E4E4;
}
.sidebar-nav .dropdown-menu:after {
position: absolute;
top: -6px;
left: 10px;
display: inline-block;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
border-left: 6px solid transparent;
content: '';
}
.breadcrumb-ellipsis {
color: #359f89;
cursor: pointer;
display: none !important;
}
.breadcrumb>li:last-child a {
color: #b4b7bc;
}
.atlas-tag .select2-selection__choice {
padding: 3px 6px !important;
background-color: #4a90e2 !important;
color: #fff !important;
font-size: 12px;
text-transform: uppercase;
border-radius: 4px;
}
.atlas-tag .select2-selection__choice__remove {
font-size: 17px;
line-height: 14px;
margin: 0px 6px !important;
color: #fff !important;
float: right;
}
.breadcrumb-dropdown .popover.bottom
{
margin-top: 35px;
}
/*
* 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.
*/
html {
min-height: 100%;
position: relative;
}
body {
font-family: 'PT Sans', sans-serif;
background-color: #e8ebf1;
-webkit-font-smoothing: antialiased;
}
.initialLoading {
display: block;
margin: auto;
margin-top: 18%;
height: 60px;
}
/* Bootstrap Extended */
.row-margin-bottom {
margin-bottom: 15px;
}
.navbar-brand {
/* font-family: 'Yeseva One', cursive;*/
font-size: 30px;
height: auto;
}
.navbar-toggle .icon-bar {
background-color: #fff;
}
.navbar-fixed-top + .wrapper {
margin-top: 90px;
padding-bottom: 90px;
}
.navbar-form {
width: 30%;
padding: 0;
}
.navbar-form .form-control {
width: 100%;
padding: 6px 0px;
background-color: transparent;
color: #fff;
border: none;
box-shadow: 0px 2px #fff;
}
.form-control {
border-radius: 0px;
}
.form-control:focus {
border-color: #8FA5B1;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 2px rgb(143, 165, 177);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 2px rgb(143, 165, 177);
}
.input-group-btn .glyphicon {
top: 2px;
}
.panel {
border-radius: 0px;
}
.panel-primary {
border-color: #698797;
}
.panel-primary>.panel-heading {
color: #fff;
background-color: #698797;
border-color: #698797;
border-radius: 0px;
}
.list-group-item:first-child,
.list-group-item:last-child {
border-radius: 0px;
}
.pagination>.active>a,
.pagination>.active>a:focus,
.pagination>.active>a:hover,
.pagination>.active>span,
.pagination>.active>span:focus,
.pagination>.active>span:hover {
background-color: #1BA9E2;
border-color: #1BA9E2;
}
/* Bootstrap Buttons */
.btn {
border-radius: 0px;
}
.btn-primary {
color: #fff;
background-color: #44697d;
border-color: #44697d
}
.btn-primary:hover {
color: #fff;
background-color: #334f5e;
border-color: #334f5e;
}
.btn-success {
color: #fff;
background-color: #359F89;
border-color: #359F89;
}
.btn-success:hover {
color: #fff;
background-color: #359F89;
border-color: #359F89
}
.btn-info {
color: #fff;
background-color: #3cb5e6;
border-color: #3cb5e6
}
.btn-info:hover {
color: #fff;
background-color: #339cc7;
border-color: #339cc7
}
.btn-warning {
color: #fff;
background-color: #f5a700;
border-color: #f5a700
}
.btn-warning:hover {
color: #fff;
background-color: #de9800;
border-color: #de9800
}
.btn-danger {
color: #fff;
background-color: #e14f00;
border-color: #e14f00
}
.btn-danger:hover {
color: #fff;
background-color: #c74600;
border-color: #c74600
}
.tabs {
position: relative;
height: 42px;
background-color: #FFF;
width: 100%;
white-space: nowrap;
padding: 0px;
border-bottom: 1px solid #e9ecf2;
}
.tabs li.tab {
display: block;
float: left;
text-align: center;
background-color: #fff;
line-height: 42px;
height: 42px;
padding: 0 20px;
margin: 0;
text-transform: uppercase;
letter-spacing: 0.8px;
border-bottom: 1px solid #e9ecf2;
}
.tabs li.tab a {
color: #ee6e73;
display: block;
text-decoration: none;
width: 100%;
height: 100%;
-webkit-transition: color 0.28s ease;
-moz-transition: color 0.28s ease;
-o-transition: color 0.28s ease;
-ms-transition: color 0.28s ease;
transition: color 0.28s ease;
color: #9398a0;
}
.tabs li.tab a:hover {
color: #26530c;
}
.tabs li.tab a.active {
color: #1BA9E2;
}
.tabs .indicator {
position: absolute;
bottom: 0;
height: 2px;
background-color: #1BA9E2;
will-change: left, right;
}
ul.tabs li.tab {
padding: 0;
}
/* Atlas Specific */
.navbar-atlas {
background-color: #323544;
box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-moz-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
}
.navbar-atlas .navbar-brand {
color: #fff;
}
.navbar-atlas .nav>li>a {
color: #fff;
padding-top: 18px;
padding-bottom: 18px;
font-size: 100%;
}
.navbar-atlas .nav>li>a:focus,
.navbar-atlas .nav>li>a:hover {
background-color: transparent;
}
.graph-bg svg {
background-image: linear-gradient(to right, #000 -10px, rgba(0, 0, 0, 0) 1px), linear-gradient(#000 -10px, #ECECEC 1px);
background-size: 10px 10px;
position: relative;
}
.card {
background: #FFF none repeat scroll 0% 0%;
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.3);
margin-bottom: 30px;
}
/*create tags*/
.h160 {
height: 160px !important;
}
.inputs button.addAttr {
background-color: #ff8e00;
}
.inputs button.addAttr,
.inputs button.saveAttr {
height: 40px;
border-radius: 4px;
border: 1px solid #FFFFFF;
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
font-weight: bold;
}
.inputs input {
height: 50px;
border-radius: 0px;
border: 1px solid #e3e3e3;
color: #414141;
box-shadow: none;
}
.inputs button.remove {
position: absolute;
right: 28px;
bottom: 12px;
color: #FFFFFF;
border: 0;
border-radius: 4px;
background-color: #a94442;
}
.inputs .control-label {
padding: 15px;
padding-top: 15px !important;
color: #333;
}
/*About Atlas*/
.subContent {
width: 580px;
}
/*add tag model*/
.input-spacing {
padding-bottom: 10px!important;
}
.modalHeight {
height: 50px;
}
.fa-spin-custom,
.glyphicon-spin {
-webkit-animation: spin 1000ms infinite linear;
animation: spin 1000ms infinite linear;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
.loader {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
text-align: center;
z-index: 9;
background: rgba(255, 255, 255, 0.8) url('../img/loading.gif') no-repeat center center;
}
.fontLoader {
text-align: center;
display: none;
}
.headerDroupDown {
border-left: 1px solid #FFF;
font-size: 11px;
padding-left: 15px;
margin-left: 15px;
}
.circle {
position: absolute;
top: -3px;
right: -2px;
width: 12px;
height: 12px;
background: #4A90E2;
border: 2px solid #323544;
border-radius: 16px;
}
.switch {
float: left;
margin-top: 4px;
position: absolute;
z-index: 99;
top: 0;
left: 20px;
height: 26px;
width: 120px;
background: #DADADA;
border-radius: 3px;
-webkit-box-shadow: inset 0 1px 3px #545454, 0 1px #FFF;
box-shadow: inset 0 1px 3px #545454, 0 1px #FFF;
/* -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px rgba(255, 255, 255, 0.1);*/
}
.switch-label {
position: relative;
z-index: 2;
float: left;
width: 58px;
line-height: 26px;
font-size: 11px;
/*color: rgba(255, 255, 255, 0.35);*/
text-align: center;
/*text-shadow: 0 1px 1px rgba(0, 0, 0, 0.45);*/
cursor: pointer;
}
.switch-label:active {
font-weight: bold;
}
.switch-label-off {
padding-left: 2px;
}
.switch-label-on {
padding-right: 2px;
}
.switch-input {
display: none;
}
.switch-input:checked + .switch-label {
font-weight: bold;
color: rgba(0, 0, 0, 0.65);
text-shadow: 0 1px rgba(255, 255, 255, 0.25);
-webkit-transition: 0.15s ease-out;
-moz-transition: 0.15s ease-out;
-o-transition: 0.15s ease-out;
transition: 0.15s ease-out;
}
.switch-input:checked + .switch-label-on ~ .switch-selection {
/* Note: left: 50% doesn't transition in WebKit */
left: 60px;
}
.switch-selection {
display: block;
position: absolute;
z-index: 1;
top: 2px;
left: 2px;
width: 58px;
height: 22px;
background: #65bd63;
border-radius: 3px;
background-image: linear-gradient(to bottom, #A7CEC6, #359F89);
background-image: -moz-linear-gradient(top, #A7CEC6, #359F89);
background-image: -o-linear-gradient(top, #A7CEC6, #359F89);
background-image: linear-gradient(to bottom, #A7CEC6, #359F89);
/* background-image: -webkit-linear-gradient(top, #9dd993, #65bd63);
background-image: -moz-linear-gradient(top, #9dd993, #65bd63);
background-image: -o-linear-gradient(top, #9dd993, #65bd63);
background-image: linear-gradient(to bottom, #9dd993, #65bd63);*/
-webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
box-shadow: inset 0 1px rgba(255, 255, 255, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
-webkit-transition: left 0.15s ease-out;
-moz-transition: left 0.15s ease-out;
-o-transition: left 0.15s ease-out;
transition: left 0.15s ease-out;
}
.switch-blue .switch-selection {
background: #3aa2d0;
background-image: -webkit-linear-gradient(top, #4fc9ee, #3aa2d0);
background-image: -moz-linear-gradient(top, #4fc9ee, #3aa2d0);
background-image: -o-linear-gradient(top, #4fc9ee, #3aa2d0);
background-image: linear-gradient(to bottom, #4fc9ee, #3aa2d0);
}
.switch-yellow .switch-selection {
background: #c4bb61;
background-image: -webkit-linear-gradient(top, #e0dd94, #c4bb61);
background-image: -moz-linear-gradient(top, #e0dd94, #c4bb61);
background-image: -o-linear-gradient(top, #e0dd94, #c4bb61);
background-image: linear-gradient(to bottom, #e0dd94, #c4bb61);
}
.scrollTagList {
height: 330px;
overflow-y: auto;
margin-bottom: 0px;
}
.scrollTagList i.fa {
margin-right: 5px;
}
.tagsList .atlast-tabbable {
margin: 0px 0px;
}
.tagsList .atlast-tabbable .tab-content {
padding: 10px 22px;
}
.tagsList .atlast-tabbable .nav-tabs>li>a {
padding: 10px 20px;
}
.appForm .panel-body {
padding-bottom: 0;
}
.appForm .panel-footer {
margin-bottom: 0;
}
#new > * {
color: #686868;
}
.branchListParent .parentActive {
background: none;
}
ul[data-id=branchList] .fa,
.branchListParent .fa {
line-height: 40px;
}
ul[data-id=branchList] li {
padding-left: 50px;
}
.node {
cursor: pointer;
}
.overlay {
/* background-color: #EEE;*/
}
.node circle {
fill: #fff;
stroke: steelblue;
stroke-width: 1.5px;
}
.node text {
font-size: 10px;
font-family: sans-serif;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 1.5px;
}
.templink {
fill: none;
stroke: red;
stroke-width: 3px;
}
.ghostCircle.show {
display: block;
}
.ghostCircle,
.activeDrag .ghostCircle {
display: none;
}
.d3-tip {
line-height: 1;
font-weight: bold;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
}
/* Creates a small triangle extender for the tooltip */
.d3-tip:after {
box-sizing: border-box;
display: inline;
font-size: 10px;
width: 100%;
line-height: 1;
color: rgba(0, 0, 0, 0.8);
content: "\25BC";
position: absolute;
text-align: center;
}
/* Style northward tooltips differently */
.d3-tip.n:after {
margin: -1px 0 0 0;
top: 100%;
left: 0;
}
.noTags {
font-size: 24px;
font-weight: bold;
text-align: center;
}
.addTag-dropdown {
display: inline-block;
}
.addTagBase {
border-radius: 4px;
padding: 4px 8px;
border: solid 1px #4a90e2;
cursor: pointer
}
.addTagText {
font-size: 12px;
font-weight: 600;
color: #4a90e2;
}
.addTagPlus {
font-size: 12px;
font-weight: 600;
color: #4a90e2;
}
.menuItem {
padding: 10px;
color: #4a90e2;
cursor: pointer;
}
.input-tag {
display: inline-block;
padding: 6px 12px;
background-color: #4a90e2;
color: #fff;
font-size: 12px;
text-transform: uppercase;
border-radius: 4px;
margin-right: 3px;
margin-bottom: 3px;
}
.tagging {
display: inline-block;
}
.input-tag i.fa {
position: relative;
right: -5px;
cursor: pointer;
}
.crossClearText {
line-height: 20px !important;
}
.inputSearchTag {
max-width: 140px;
}
.appndList {
max-height: 200px;
overflow: auto;
max-width: 140px;
overflow-x: hidden;
}
.dropdown .fa-ellipsis-h {
position: relative;
top: 4px;
}
g.type-TK > rect {
fill: #00ffd0;
}
text {
font-weight: 300;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serf;
font-size: 14px;
}
.node rect {
stroke: #999;
fill: #fff;
stroke-width: 1.5px;
}
.edgePath path {
stroke: #333;
stroke-width: 1.5px;
}
<!--
* 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.
-->
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Atlas</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="icon" href="favicon.ico" type="image/x-icon">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<link rel="stylesheet" type="text/css" href="css/animate.min.css" />
<link rel="stylesheet" href="js/libs/backgrid/css/backgrid.css">
<link rel="stylesheet" href="js/libs/backgrid-filter/css/backgrid-filter.min.css">
<link rel="stylesheet" href="js/libs/backgrid-paginator/css/backgrid-paginator.css">
<link rel="stylesheet" href="js/libs/backgrid-orderable-columns/css/backgrid-orderable-columns.css">
<link rel="stylesheet" href="js/libs/backgrid-sizeable-columns/css/backgrid-sizeable-columns.css">
<link rel="stylesheet" href="js/libs/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="js/libs/jquery-asBreadcrumbs/css/asBreadcrumbs.css">
<link href='https://fonts.googleapis.com/css?family=Raleway:400,400italic,600,600italic,700,700italic' rel='stylesheet' type='text/css'>
<link href="css/bootstrap-sidebar.css" rel="stylesheet">
<link href="css/font-awesome.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<link href="css/business-catlog.css" rel="stylesheet">
<link href="css/override.css" rel="stylesheet">
</head>
<body>
<div id="new">
<div id="wrapper">
<div id="sidebar-wrapper">
<div id="sideNav-wrapper"></div>
</div>
<div id="page-content-wrapper">
<header id="new-header" class="clearfix"></header>
<div id="new-page-wrapper"> </div>
</div>
</div>
</div>
<div id='old'>
<!--Header Begin-->
<header id="header" class="navbar-fixed-top navbar-top navbar-atlas"> </header>
<!--Header End-->
<div class="container wrapper">
<div class="">
<div id="page-wrapper">
<div>
<img class="initialLoading" src="../img/ring.gif">
</div>
</div>
</div>
</div>
<div id="footer"></div>
</div>
<!-- build:js scripts/main.js -->
<script data-main="js/main" src="js/libs/requirejs/require.js"></script>
<!-- endbuild -->
</body>
</html>
/**
* 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.
*/
define(['marionette'], function(Marionette) {
var App = new Marionette.Application();
App.addRegions({
rHeader: '#header',
rSideNav: '#sideNav-wrapper',
rNContent: '#new-page-wrapper',
rNHeader: '#new-header',
rContent: '#page-wrapper',
rFooter: '#footer'
});
App.addInitializer(function() {
Backbone.history.start();
});
return App;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'utils/Utils',
'backbone.paginator'
], function(require, Globals, Utils) {
'use strict';
var BaseCollection = Backbone.PageableCollection.extend(
/** @lends BaseCollection.prototype */
{
/**
* BaseCollection's initialize function
* @augments Backbone.PageableCollection
* @constructs
*/
initialize: function() {
},
bindErrorEvents: function() {
this.bind("error", Utils.defaultErrorHandler);
},
/**
* state required for the PageableCollection
*/
state: {
firstPage: 0,
pageSize: Globals.settings.PAGE_SIZE
},
mode: 'client',
/**
* override the parseRecords of PageableCollection for our use
*/
parseRecords: function(resp, options) {
this.responseData = {
dataType: resp.dataType,
query: resp.query,
queryType: resp.queryType,
requestId: resp.requestId
}
try {
if (!this.modelAttrName) {
throw new Error("this.modelAttrName not defined for " + this);
}
return resp[this.modelAttrName];
} catch (e) {
console.log(e);
}
},
////////////////////////////////////////////////////////////
// Overriding backbone-pageable page handlers methods //
////////////////////////////////////////////////////////////
getFirstPage: function(options) {
return this.getPage('first', _.extend({
reset: true
}, options));
},
getPreviousPage: function(options) {
return this.getPage("prev", _.extend({
reset: true
}, options));
},
getNextPage: function(options) {
return this.getPage("next", _.extend({
reset: true
}, options));
},
getLastPage: function(options) {
return this.getPage("last", _.extend({
reset: true
}, options));
},
hasPrevious: function(options) {
return this.hasPreviousPage();
},
hasNext: function(options) {
return this.hasNextPage();
}
/////////////////////////////
// End overriding methods //
/////////////////////////////
},
/** BaseCollection's Static Attributes */
{
// Static functions
getTableCols: function(cols, collection) {
var retCols = _.map(cols, function(v, k, l) {
var defaults = collection.constructor.tableCols[k];
if (!defaults) {
//console.log("Error!! " + k + " not found in collection: " , collection);
defaults = {};
}
return _.extend({
'name': k
}, defaults, v);
});
return retCols;
},
nonCrudOperation: function(url, requestMethod, options) {
return Backbone.sync.call(this, null, this, _.extend({
url: url,
type: requestMethod
}, options));
}
});
return BaseCollection;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VCommon',
], function(require, Globals, BaseCollection, VCommon) {
'use strict';
var VCommonList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + '',
model: VCommon,
initialize: function() {
this.modelName = 'VCommon';
this.modelAttrName = '';
this.bindErrorEvents();
},
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VCommonList;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VEntity'
], function(require, Globals, BaseCollection, VEntity) {
'use strict';
var VEntityList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + '/api/atlas/entities',
model: VEntity,
initialize: function() {
this.modelName = 'VEntity';
this.modelAttrName = 'definition';
this.bindErrorEvents();
}
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VEntityList;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VLineage'
], function(require, Globals, BaseCollection, VLineage) {
'use strict';
var VLineageList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + 'api/atlas/lineage/hive/table/assetName/outputs/graph',
model: VLineage,
initialize: function() {
this.modelName = 'VLineage';
this.modelAttrName = 'results';
this.bindErrorEvents();
}
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VLineageList;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VSchema'
], function(require, Globals, BaseCollection, VSchema) {
'use strict';
var VSchemaList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + '/api/atlas/lineage/hive/table/log_fact_daily_mv/schema',
model: VSchema,
initialize: function() {
this.modelName = 'VSchema';
this.modelAttrName = 'results';
this.bindErrorEvents();
},
parseRecords: function(resp, options) {
try {
if (!this.modelAttrName) {
throw new Error("this.modelAttrName not defined for " + this);
}
var arr = [];
resp[this.modelAttrName].rows.forEach(function(d) {
arr.push(d)
})
return arr;
} catch (e) {
console.log(e);
}
},
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VSchemaList;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VSearch'
], function(require, Globals, BaseCollection, VSearch) {
'use strict';
var VSearchList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + '/api/atlas/discovery/search',
model: VSearch,
initialize: function() {
this.modelName = 'VSearch';
this.modelAttrName = 'results';
this.bindErrorEvents();
}
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VSearchList;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'collection/BaseCollection',
'models/VTag'
], function(require, Globals, BaseCollection, VTag) {
'use strict';
var VTagList = BaseCollection.extend(
//Prototypal attributes
{
url: Globals.baseURL + '/api/atlas/types',
model: VTag,
initialize: function() {
this.modelName = 'VTag';
this.modelAttrName = 'results';
this.bindErrorEvents();
},
parseRecords: function(resp, options) {
try {
if (!this.modelAttrName) {
throw new Error("this.modelAttrName not defined for " + this);
}
var arr = [];
resp[this.modelAttrName].forEach(function(d) {
arr.push({
tags: d
})
})
return arr;
} catch (e) {
console.log(e);
}
},
},
//Static Class Members
{
/**
* Table Cols to be passed to Backgrid
* UI has to use this as base and extend this.
*
*/
tableCols: {}
}
);
return VTagList;
});
/**
* 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.
*/
require.config({
/* starting point for application */
hbs: {
disableI18n: true, // This disables the i18n helper and doesn't require the json i18n files (e.g. en_us.json)
helperPathCallback: // Callback to determine the path to look for helpers
function(name) { // ('/template/helpers/'+name by default)
return 'modules/Helpers';
},
templateExtension: 'html', // Set the extension automatically appended to templates
compileOptions: {} // options object which is passed to Handlebars compiler
},
/**
* Requested as soon as the loader has processed the configuration. It does
* not block any other require() calls from starting their requests for
* modules, it is just a way to specify some modules to load asynchronously
* as part of a config block.
* @type {Array} An array of dependencies to load.
*/
deps: ['marionette'],
/**
* The number of seconds to wait before giving up on loading a script.
* @default 7 seconds
* @type {Number}
*/
waitSeconds: 30,
shim: {
backbone: {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
asBreadcrumbs: {
deps: ['jquery'],
exports: 'asBreadcrumbs'
},
bootstrap: {
deps: ['jquery'],
exports: 'jquery'
},
underscore: {
exports: '_'
},
marionette: {
deps: ['backbone']
},
backgrid: {
deps: ['backbone'],
exports: 'Backgrid'
},
'backgrid-paginator': {
deps: ['backbone', 'backgrid']
},
'backgrid-filter': {
deps: ['backbone', 'backgrid']
},
'backgrid-orderable': {
deps: ['backbone', 'backgrid'],
},
'backgrid-sizeable': {
deps: ['backbone', 'backgrid'],
},
hbs: {
deps: ['underscore', 'handlebars']
},
d3: {
exports: 'd3'
},
'd3-tip': {
deps: ['d3'],
exports: 'd3-tip'
},
noty: {
deps: ['jquery'],
},
dagreD3: {
deps: ['d3'],
exports: 'dagreD3'
}
},
paths: {
'jquery': 'libs/jquery/js/jquery.min',
'underscore': 'libs/underscore/underscore-min',
'bootstrap': 'libs/bootstrap/js/bootstrap.min',
'backbone': 'libs/backbone/backbone-min',
'backbone.babysitter': 'libs/backbone.babysitter/lib/backbone.babysitter.min',
'marionette': 'libs/backbone-marionette/backbone.marionette.min',
'backbone.paginator': 'libs/backbone-paginator/backbone.paginator.min',
'backbone.wreqr': 'libs/backbone-wreqr/backbone.wreqr.min',
'backgrid': 'libs/backgrid/js/backgrid',
'backgrid-filter': 'libs/backgrid-filter/js/backgrid-filter.min',
'backgrid-orderable': 'libs/backgrid-orderable-columns/js/backgrid-orderable-columns',
'backgrid-paginator': 'libs/backgrid-paginator/js/backgrid-paginator.min',
'backgrid-sizeable': 'libs/backgrid-sizeable-columns/js/backgrid-sizeable-columns',
'asBreadcrumbs': 'libs/jquery-asBreadcrumbs/js/jquery-asBreadcrumbs.min',
'd3': 'libs/d3/d3.min',
'd3-tip': 'libs/d3/index',
'tmpl': 'templates',
'noty': 'libs/noty/js/jquery.noty.packaged.min',
'requirejs.text': 'libs/requirejs-text/text',
'handlebars': 'require-handlebars-plugin/js/handlebars',
'json2': 'require-handlebars-plugin/js/json2',
'hbs': 'require-handlebars-plugin/js/hbs',
'i18nprecompile': 'require-handlebars-plugin/js/i18nprecompile',
'dagreD3': 'libs/dagre-d3/dagre-d3.min'
},
/**
* If set to true, an error will be thrown if a script loads that does not
* call define() or have a shim exports string value that can be checked.
* To get timely, correct error triggers in IE, force a define/shim export.
* @type {Boolean}
*/
enforceDefine: false
});
require(['App',
'router/Router',
'utils/Overrides',
'bootstrap',
'd3'
], function(App, Router) {
App.appRouter = new Router();
App.start();
});
/**
* 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.
*/
define(['require', 'utils/Utils', 'backbone'], function(require, Utils, Backbone) {
'use strict';
var BaseModel = Backbone.Model.extend(
/** @lends BaseModel.prototype */
{
/**
* BaseModel's initialize function
* @augments Backbone.Model
* @constructs
*/
initialize: function() {
},
bindErrorEvents: function() {
this.bind("error", Utils.defaultErrorHandler);
},
/**
* toString for a model. Every model should implement this function.
*/
toString: function() {
throw new Error('ERROR: toString() not defined for ' + this.modelName);
},
/**
* Silent'ly set the attributes. ( do not trigger events )
*/
silent_set: function(attrs) {
return this.set(attrs, {
silent: true
});
}
},
/** BaseModel's Static Attributes */
{
/**
* [nonCrudOperation description]
* @param {[type]} url [description]
* @param {[type]} requestMethod [description]
* @param {[type]} options [description]
* @return {[type]} [description]
*/
nonCrudOperation: function(url, requestMethod, options) {
return Backbone.sync.call(this, null, this, _.extend({
url: url,
type: requestMethod
}, options));
}
});
return BaseModel;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, VBaseModel) {
'use strict';
var VCommon = VBaseModel.extend({
urlRoot: Globals.baseURL + '',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VCommon';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
}, {});
return VCommon;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, VBaseModel) {
'use strict';
var VEntity = VBaseModel.extend({
urlRoot: Globals.baseURL + '/api/atlas/entities/',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VEntity';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
/*************************
* Non - CRUD operations
*************************/
getEntity: function(token, options) {
var url = Globals.baseURL + '/api/atlas/entities/' + token;
options = _.extend({
contentType: 'application/json',
dataType: 'json'
}, options);
return this.constructor.nonCrudOperation.call(this, url, 'GET', options);
},
saveEntity: function(token, options) {
var url = Globals.baseURL + '/api/atlas/entities/' + token + '/traits';
options = _.extend({
contentType: 'application/json',
dataType: 'json'
}, options);
return this.constructor.nonCrudOperation.call(this, url, 'POST', options);
},
}, {});
return VEntity;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, VBaseModel) {
'use strict';
var VLineage = VBaseModel.extend({
urlRoot: Globals.baseURL + 'api/atlas/lineage/hive/table/assetName/outputs/graph',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VLineage';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
}, {});
return VLineage;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, VBaseModel) {
'use strict';
var VSchema = VBaseModel.extend({
urlRoot: Globals.baseURL + '/api/atlas/lineage/hive/table/log_fact_daily_mv/schema',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VSchema';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
}, {});
return VSchema;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, VBaseModel) {
'use strict';
var VSearch = VBaseModel.extend({
urlRoot: Globals.baseURL + '/api/atlas/discovery/search',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VSearch';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
/*************************
* Non - CRUD operations
*************************/
getEntity: function(token, options) {
var url = Globals.baseURL + '/api/atlas/entities/' + token;
options = _.extend({
contentType: 'application/json',
dataType: 'json'
}, options);
return this.constructor.nonCrudOperation.call(this, url, 'GET', options);
},
}, {});
return VSearch;
});
/**
* 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.
*/
define(['require',
'utils/Globals',
'models/BaseModel'
], function(require, Globals, vBaseModel) {
'use strict';
var VTag = vBaseModel.extend({
urlRoot: Globals.baseURL + '/api/atlas/types',
defaults: {},
serverSchema: {},
idAttribute: 'id',
initialize: function() {
this.modelName = 'VTag';
this.bindErrorEvents();
},
toString: function() {
return this.get('name');
},
/*************************
* Non - CRUD operations
*************************/
deleteTag: function(guid, name, options) {
var url = Globals.baseURL + '/api/atlas/entities/' + guid + '/traits/' + name;
options = _.extend({
contentType: 'application/json',
dataType: 'json'
}, options);
return this.constructor.nonCrudOperation.call(this, url, 'DELETE', options);
}
}, {});
return VTag;
});
/**
* 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.
*/
define(['require',
'handlebars',
], function(require, Handlebars, localization) {
/*
* General guidelines while writing helpers:
*
* - If returning HTML use return new Handlebars.SafeString();
* - If the helper needs optional arguments use the "hash arguments"
* Eg. {{{link . "See more..." story.url class="story"}}}
* NOTE: the first argument after the helper name should be . which will be context in the helper function
* Handlebars.registerHelper('link', function (context, text, url, options) {
* var attrs = [];
*
* for(var prop in options.hash) {
* attrs.push(prop + '="' + options.hash[prop] + '"');
* }
* return new Handlebars.SafeString("<a " + attrs.join(" ") + ">" + text + "</a>");
* });
*
*
* NOTE: Due to some limitations in the require-handlebars-plugin, we cannot have helper that takes zero arguments,
* for such helpers we have to pass a "." as first argument. [https://github.com/SlexAxton/require-handlebars-plugin/issues/72]
*/
var HHelpers = {};
/**
* Convert new line (\n\r) to <br>
* from http://phpjs.org/functions/nl2br:480
*/
HHelpers.nl2br = function(text) {
text = Handlebars.Utils.escapeExpression(text);
var nl2br = (text + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '<br>' + '$2');
return new Handlebars.SafeString(nl2br);
};
Handlebars.registerHelper('nl2br', HHelpers.nl2br);
Handlebars.registerHelper('toHumanDate', function(val) {
if (!val) return "";
return val //localization.formatDate(val, 'f');
});
Handlebars.registerHelper('tt', function(str) {
//return localization.tt(str);
return str;
});
Handlebars.registerHelper('ifCond', function(v1, operator, v2, options) {
switch (operator) {
case '==':
return (v1 == v2) ? options.fn(this) : options.inverse(this);
break;
case '===':
return (v1 === v2) ? options.fn(this) : options.inverse(this);
break;
case '<':
return (v1 < v2) ? options.fn(this) : options.inverse(this);
break;
case '<=':
return (v1 <= v2) ? options.fn(this) : options.inverse(this);
break;
case '>':
return (v1 > v2) ? options.fn(this) : options.inverse(this);
break;
case '>=':
return (v1 >= v2) ? options.fn(this) : options.inverse(this);
break;
default:
return options.inverse(this);
break;
}
//return options.inverse(this);
});
return HHelpers;
});
/**
* 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.
*/
define(function(require) {
var Backbone = require('backbone');
var template = require('hbs!tmpl/common/modal');
var Modal = Backbone.View.extend({
className: 'modal',
events: {
'click .close': function(event) {
event.preventDefault();
this.trigger('closeModal');
if (this.options.content && this.options.content.trigger) {
this.options.content.trigger('closeModal', this);
}
},
'click .cancel': function(event) {
event.preventDefault();
this.trigger('closeModal');
if (this.options.content && this.options.content.trigger) {
this.options.content.trigger('closeModal', this);
}
},
'click .ok': function(event) {
event.preventDefault();
this.trigger('ok');
if (this.options.content && this.options.content.trigger) {
this.options.content.trigger('ok', this);
}
if (this.options.okCloses) {
this.close();
}
}
},
/**
* Creates an instance of a Bootstrap Modal
*
* @see http://twitter.github.com/bootstrap/javascript.html#modals
*
* @param {Object} options
* @param {String|View} [options.content] Modal content. Default: none
* @param {String} [options.title] Title. Default: none
* @param {String} [options.okText] Text for the OK button. Default: 'OK'
* @param {String} [options.cancelText] Text for the cancel button. Default: 'Cancel'. If passed a falsey value, the button will be removed
* @param {Boolean} [options.allowCancel Whether the modal can be closed, other than by pressing OK. Default: true
* @param {Boolean} [options.escape] Whether the 'esc' key can dismiss the modal. Default: true, but false if options.cancellable is true
* @param {Boolean} [options.animate] Whether to animate in/out. Default: false
* @param {Function} [options.template] Compiled underscore template to override the default one
*/
initialize: function(options) {
this.options = _.extend({
title: null,
okText: 'OK',
focusOk: true,
okCloses: true,
cancelText: 'Cancel',
allowCancel: false,
showFooter: true,
escape: true,
animate: true,
contentWithFooter: false,
template: template
}, options);
},
/**
* Creates the DOM element
*
* @api private
*/
render: function() {
var $el = this.$el,
options = this.options,
content = options.content;
//Create the modal container
$el.html(options.template(options));
// var $content = this.$content = $el.find('.modal-body');
//Insert the main content if it's a view
if (content && content.$el) {
content.render();
if (options.contentWithFooter) {
$el.find('.modal-content').append(content.$el);
} else {
$el.find('.modal-body').html(content.$el);
}
} else {
if (options.htmlContent) {
$el.find('.modal-body').append(options.htmlContent);
}
}
// if (options.mainClass) $el.addClass(options.mainClass);
if (options.animate) $el.addClass('fade');
this.isRendered = true;
return this;
},
onClose: function() {
alert('close');
},
/**
* Renders and shows the modal
*
* @param {Function} [cb] Optional callback that runs only when OK is pressed.
*/
open: function(cb) {
if (!this.isRendered) this.render();
var self = this,
$el = this.$el;
//Create it
$el.modal(_.extend({
keyboard: this.options.allowCancel,
backdrop: this.options.allowCancel ? true : 'static'
}, this.options.modalOptions));
//Focus OK button
$el.one('shown', function() {
if (self.options.focusOk) {
$el.find('.btn.ok').focus();
}
if (self.options.content && self.options.content.trigger) {
self.options.content.trigger('shown', self);
}
self.trigger('shown');
});
//Adjust the modal and backdrop z-index; for dealing with multiple modals
var numModals = Modal.count,
$backdrop = $('.modal-backdrop:eq(' + numModals + ')'),
backdropIndex = parseInt($backdrop.css('z-index'), 10),
elIndex = parseInt($backdrop.css('z-index'), 10);
$backdrop.css('z-index', backdropIndex + numModals);
this.$el.css('z-index', elIndex + numModals);
if (this.options.allowCancel) {
$backdrop.one('click', function() {
if (self.options.content && self.options.content.trigger) {
self.options.content.trigger('closeModal', self);
}
self.trigger('closeModal');
});
$(document).one('keyup.dismiss.modal', function(e) {
e.which == 27 && self.trigger('closeModal');
if (self.options.content && self.options.content.trigger) {
e.which == 27 && self.options.content.trigger('shown', self);
}
});
}
this.on('cancel', function() {
self.close();
});
Modal.count++;
//Run callback on OK if provided
if (cb) {
self.on('ok', cb);
}
return this;
},
/**
* Closes the modal
*/
close: function() {
var self = this,
$el = this.$el;
//Check if the modal should stay open
if (this._preventClose) {
this._preventClose = false;
return;
}
$el.one('hidden.bs.modal', function onHidden(e) {
// Ignore events propagated from interior objects, like bootstrap tooltips
if (e.target !== e.currentTarget) {
return $el.one('hidden.bs.modal', onHidden);
}
self.remove();
if (self.options.content && self.options.content.trigger) {
self.options.content.trigger('hidden.bs.modal', self);
}
self.trigger('hidden.bs.modal');
});
$el.modal('hide');
Modal.count--;
},
/**
* Stop the modal from closing.
* Can be called from within a 'close' or 'ok' event listener.
*/
preventClose: function() {
this._preventClose = true;
}
}, {
//STATICS
//The number of modals on display
count: 0
});
return Modal;
});
/**
* 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.
*/
define(['backbone.wreqr'], function(Wreqr) {
"use strict";
return new Wreqr.EventAggregator();
});
This source diff could not be displayed because it is too large. You can view the blob instead.
/**
* @license Handlebars hbs 0.4.0 - Alex Sexton, but Handlebars has it's own licensing junk
*
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/require-cs for details on the plugin this was based off of
*/
/* Yes, deliciously evil. */
/*jslint evil: true, strict: false, plusplus: false, regexp: false */
/*global require: false, XMLHttpRequest: false, ActiveXObject: false,
define: false, process: false, window: false */
define([
//>>excludeStart('excludeHbs', pragmas.excludeHbs)
'handlebars', 'underscore', 'i18nprecompile', 'json2'
//>>excludeEnd('excludeHbs')
], function(
//>>excludeStart('excludeHbs', pragmas.excludeHbs)
Handlebars, _, precompile, JSON
//>>excludeEnd('excludeHbs')
) {
//>>excludeStart('excludeHbs', pragmas.excludeHbs)
var fs, getXhr,
progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
fetchText = function() {
throw new Error('Environment unsupported.');
},
buildMap = [],
filecode = "w+",
templateExtension = "hbs",
customNameExtension = "@hbs",
devStyleDirectory = "/styles/",
buildStyleDirectory = "/demo-build/styles/",
helperDirectory = "template/helpers/",
i18nDirectory = "template/i18n/",
buildCSSFileName = "screen.build.css";
Handlebars.registerHelper('$', function() {
//placeholder for translation helper
});
if (typeof window !== "undefined" && window.navigator && window.document && !window.navigator.userAgent.match(/Node.js/)) {
// Browser action
getXhr = function() {
//Would love to dump the ActiveX crap in here. Need IE 6 to die first.
var xhr, i, progId;
if (typeof XMLHttpRequest !== "undefined") {
return new XMLHttpRequest();
} else {
for (i = 0; i < 3; i++) {
progId = progIds[i];
try {
xhr = new ActiveXObject(progId);
} catch (e) {}
if (xhr) {
progIds = [progId]; // so faster next time
break;
}
}
}
if (!xhr) {
throw new Error("getXhr(): XMLHttpRequest not available");
}
return xhr;
};
fetchText = function(url, callback) {
var prependComment = "<!--START: " + url + "--> == <!--END: " + url + "-->";
var xhr = getXhr();
xhr.open('GET', url, true);
xhr.onreadystatechange = function(evt) {
//Do not explicitly handle errors, those should be
//visible via console output in the browser.
if (xhr.readyState === 4) {
callback(xhr.responseText);
//TODO FIXME Gautam:Not working with backbone-forms when it does this : $($.trim(this.template(_.result(this, 'templateData'))));
// callback(prependComment.replace('==',xhr.responseText));
}
};
xhr.send(null);
};
} else if (typeof process !== "undefined" &&
process.versions &&
!!process.versions.node) {
//Using special require.nodeRequire, something added by r.js.
fs = require.nodeRequire('fs');
fetchText = function(path, callback) {
var body = fs.readFileSync(path, 'utf8') || "";
// we need to remove BOM stuff from the file content
body = body.replace(/^\uFEFF/, '');
callback(body);
};
} else if (typeof java !== "undefined" && typeof java.io !== "undefined") {
fetchText = function(path, callback) {
var f = new java.io.File(path);
var is = new java.io.FileReader(f);
var reader = new java.io.BufferedReader(is);
var line;
var text = "";
while ((line = reader.readLine()) !== null) {
text += new String(line) + "\n";
}
reader.close();
callback(text);
};
}
var cache = {};
var fetchOrGetCached = function(path, callback) {
if (cache[path]) {
callback(cache[path]);
} else {
fetchText(path, function(data) {
cache[path] = data;
callback.call(this, data);
});
}
};
var styleList = [],
styleMap = {};
//>>excludeEnd('excludeHbs')
return {
get: function() {
return Handlebars;
},
write: function(pluginName, name, write) {
if ((name + customNameExtension) in buildMap) {
var text = buildMap[name + customNameExtension];
write.asModule(pluginName + "!" + name, text);
}
},
version: '0.4.0',
load: function(name, parentRequire, load, config) {
//>>excludeStart('excludeHbs', pragmas.excludeHbs)
var compiledName = name + customNameExtension,
disableI18n = (config.hbs && config.hbs.disableI18n),
partialDeps = [];
function recursiveNodeSearch(statements, res) {
_(statements).forEach(function(statement) {
if (statement && statement.type && statement.type === 'partial') {
res.push(statement.partialName.name);
}
if (statement && statement.program && statement.program.statements) {
recursiveNodeSearch(statement.program.statements, res);
}
if (statement && statement.program && statement.program.inverse && statement.program.inverse.statements) {
recursiveNodeSearch(statement.program.inverse.statements, res);
}
});
return res;
}
// TODO :: use the parser to do this!
function findPartialDeps(nodes) {
var res = [];
if (nodes && nodes.statements) {
res = recursiveNodeSearch(nodes.statements, []);
}
return _(res).unique();
}
// See if the first item is a comment that's json
function getMetaData(nodes) {
var statement, res, test;
if (nodes && nodes.statements) {
statement = nodes.statements[0];
if (statement && statement.type === "comment") {
try {
res = (statement.comment).replace(new RegExp('^[\\s]+|[\\s]+$', 'g'), '');
test = JSON.parse(res);
return res;
} catch (e) {
return "{}";
}
}
}
return "{}";
}
function composeParts(parts) {
if (!parts) {
return [];
}
var res = [parts[0]],
cur = parts[0],
i;
for (i = 1; i < parts.length; ++i) {
if (parts.hasOwnProperty(i)) {
cur += "." + parts[i];
res.push(cur);
}
}
return res;
}
function recursiveVarSearch(statements, res, prefix, helpersres) {
prefix = prefix ? prefix + "." : "";
var newprefix = "",
flag = false;
// loop through each statement
_(statements).forEach(function(statement) {
var parts, part, sideways;
// if it's a mustache block
if (statement && statement.type && statement.type === 'mustache') {
// If it has params, the first part is a helper or something
if (!statement.params || !statement.params.length) {
parts = composeParts(statement.id.parts);
for (part in parts) {
if (parts[part]) {
newprefix = parts[part] || newprefix;
res.push(prefix + parts[part]);
}
}
res.push(prefix + statement.id.string);
}
var paramsWithoutParts = ['this', '.', '..', './..', '../..', '../../..'];
// grab the params
if (statement.params && typeof Handlebars.helpers[statement.id.string] === 'undefined') {
_(statement.params).forEach(function(param) {
if (_(paramsWithoutParts).contains(param.original) || param instanceof Handlebars.AST.StringNode || param instanceof Handlebars.AST.IntegerNode || param instanceof Handlebars.AST.BooleanNode) {
helpersres.push(statement.id.string);
}
parts = composeParts(param.parts);
for (var part in parts) {
if (parts[part]) {
newprefix = parts[part] || newprefix;
helpersres.push(statement.id.string);
res.push(prefix + parts[part]);
}
}
});
}
}
// If it's a meta block
if (statement && statement.mustache) {
recursiveVarSearch([statement.mustache], res, prefix + newprefix, helpersres);
}
// if it's a whole new program
if (statement && statement.program && statement.program.statements) {
sideways = recursiveVarSearch([statement.mustache], [], "", helpersres)[0] || "";
if (statement.program.inverse && statement.program.inverse.statements) {
recursiveVarSearch(statement.program.inverse.statements, res, prefix + newprefix + (sideways ? (prefix + newprefix) ? "." + sideways : sideways : ""), helpersres);
}
recursiveVarSearch(statement.program.statements, res, prefix + newprefix + (sideways ? (prefix + newprefix) ? "." + sideways : sideways : ""), helpersres);
}
});
return res;
}
// This finds the Helper dependencies since it's soooo similar
function getExternalDeps(nodes) {
var res = [];
var helpersres = [];
if (nodes && nodes.statements) {
res = recursiveVarSearch(nodes.statements, [], undefined, helpersres);
}
var defaultHelpers = ["helperMissing", "blockHelperMissing", "each", "if", "unless", "with"];
return {
vars: _(res).chain().unique().map(function(e) {
if (e === "") {
return '.';
}
if (e.length && e[e.length - 1] === '.') {
return e.substr(0, e.length - 1) + '[]';
}
return e;
}).value(),
helpers: _(helpersres).chain().unique().map(function(e) {
if (_(defaultHelpers).contains(e)) {
return undefined;
}
return e;
}).compact().value()
};
}
function fetchAndRegister(langMap) {
fetchText(path, function(text) {
// for some reason it doesn't include hbs _first_ when i don't add it here...
var nodes = Handlebars.parse(text),
deps = findPartialDeps(nodes),
meta = getMetaData(nodes),
extDeps = getExternalDeps(nodes),
vars = extDeps.vars,
helps = extDeps.helpers || [],
depStr = deps.join("', 'hbs!").replace(/_/g, '/'),
helpDepStr = config.hbs && config.hbs.disableHelpers ?
"" : (function() {
var i, paths = [],
pathGetter = config.hbs && config.hbs.helperPathCallback ? config.hbs.helperPathCallback : function(name) {
return (config.hbs && config.hbs.helperDirectory ? config.hbs.helperDirectory : helperDirectory) + name;
};
for (i = 0; i < helps.length; i++) {
paths[i] = "'" + pathGetter(helps[i], path) + "'"
}
return paths;
})().join(','),
debugOutputStart = "",
debugOutputEnd = "",
debugProperties = "",
metaObj, head, linkElem;
if (depStr) {
depStr = ",'hbs!" + depStr + "'";
}
if (helpDepStr) {
helpDepStr = "," + helpDepStr;
}
if (meta !== "{}") {
try {
metaObj = JSON.parse(meta);
if (metaObj && metaObj.styles) {
styleList = _.union(styleList, metaObj.styles);
// In dev mode in the browser
if (require.isBrowser && !config.isBuild) {
head = document.head || document.getElementsByTagName('head')[0];
_(metaObj.styles).forEach(function(style) {
if (!styleMap[style]) {
linkElem = document.createElement('link');
linkElem.href = config.baseUrl + devStyleDirectory + style + '.css';
linkElem.media = 'all';
linkElem.rel = 'stylesheet';
linkElem.type = 'text/css';
head.appendChild(linkElem);
styleMap[style] = linkElem;
}
});
} else if (config.isBuild) {
(function() {
var fs = require.nodeRequire('fs'),
str = _(metaObj.styles).map(function(style) {
if (!styleMap[style]) {
styleMap[style] = true;
return "@import url(" + style + ".css);\n";
}
return "";
}).join("\n");
// I write out my import statements to a file in order to help me build stuff.
// Then I use a tool to inline my import statements afterwards. (you can run r.js on it too)
fs.open(__dirname + buildStyleDirectory + buildCSSFileName, filecode, '0666', function(e, id) {
fs.writeSync(id, str, null, encoding = 'utf8');
fs.close(id);
});
filecode = "a";
})();
}
}
} catch (e) {
console.log('error injecting styles');
}
}
if (!config.isBuild && !config.serverRender) {
debugOutputStart = "<!-- START - " + name + " -->";
debugOutputEnd = "<!-- END - " + name + " -->";
debugProperties = "t.meta = " + meta + ";\n" +
"t.helpers = " + JSON.stringify(helps) + ";\n" +
"t.deps = " + JSON.stringify(deps) + ";\n" +
"t.vars = " + JSON.stringify(vars) + ";\n";
}
var mapping = disableI18n ? false : _.extend(langMap, config.localeMapping),
configHbs = config.hbs || {},
options = _.extend(configHbs.compileOptions || {}, {
originalKeyFallback: configHbs.originalKeyFallback
}),
prec = precompile(text, mapping, options);
text = "/* START_TEMPLATE */\n" +
"define(['hbs','handlebars'" + depStr + helpDepStr + "], function( hbs, Handlebars ){ \n" +
"var t = Handlebars.template(" + prec + ");\n" +
"Handlebars.registerPartial('" + name.replace(/\//g, '_') + "', t);\n" +
debugProperties +
"return t;\n" +
"});\n" +
"/* END_TEMPLATE */\n";
//Hold on to the transformed text if a build.
if (config.isBuild) {
buildMap[compiledName] = text;
}
//IE with conditional comments on cannot handle the
//sourceURL trick, so skip it if enabled.
/*@if (@_jscript) @else @*/
if (!config.isBuild) {
text += "\r\n//@ sourceURL=" + path;
}
/*@end@*/
for (var i in deps) {
if (deps.hasOwnProperty(i)) {
deps[i] = 'hbs!' + deps[i].replace(/_/g, '/');
}
}
if (!config.isBuild) {
require(deps, function() {
load.fromText(text);
//Give result to load. Need to wait until the module
//is fully parse, which will happen after this
//execution.
parentRequire([name], function(value) {
load(value);
});
});
} else {
load.fromText(name, text);
//Give result to load. Need to wait until the module
//is fully parse, which will happen after this
//execution.
parentRequire([name], function(value) {
load(value);
});
}
if (config.removeCombined) {
fs.unlinkSync(path);
}
});
}
var path,
omitExtension = config.hbs && config.hbs.templateExtension === false;
if (omitExtension) {
path = parentRequire.toUrl(name);
} else {
path = parentRequire.toUrl(name + '.' + (config.hbs && config.hbs.templateExtension ? config.hbs.templateExtension : templateExtension));
}
if (disableI18n) {
fetchAndRegister(false);
} else {
// Workaround until jam is able to pass config info or we move i18n to a separate module.
// This logs a warning and disables i18n if there's an error loading the language file
var langMapPath = (config.hbs && config.hbs.i18nDirectory ? config.hbs.i18nDirectory : i18nDirectory) + (config.locale || "en_us") + '.json';
try {
fetchOrGetCached(parentRequire.toUrl(langMapPath), function(langMap) {
fetchAndRegister(JSON.parse(langMap));
});
} catch (er) {
// if there's no configuration at all, log a warning and disable i18n for this and subsequent templates
if (!config.hbs) {
console.warn('hbs: Error reading ' + langMapPath + ', disabling i18n. Ignore this if you\'re using jam, otherwise check your i18n configuration.\n');
config.hbs = {
disableI18n: true
};
fetchAndRegister(false);
} else {
throw er;
}
}
}
//>>excludeEnd('excludeHbs')
}
};
});
/* END_hbs_PLUGIN */
//>>excludeStart('excludeAfterBuild', pragmas.excludeAfterBuild)
define(['handlebars', "underscore"], function(Handlebars, _) {
function replaceLocaleStrings(ast, mapping, options) {
options = options || {};
mapping = mapping || {};
// Base set of things
if (ast && ast.type === "program" && ast.statements) {
_(ast.statements).forEach(function(statement, i) {
var newString = "<!-- i18n error -->";
// If it's a translation node
if (statement.type === "mustache" && statement.id && statement.id.original === "$") {
if (statement.params.length && statement.params[0].string) {
var key = statement.params[0].string;
newString = mapping[key] || (options.originalKeyFallback ? key : newString);
}
ast.statements[i] = new Handlebars.AST.ContentNode(newString);
}
// If we need to recurse
else if (statement.program) {
statement.program = replaceLocaleStrings(statement.program, mapping, options);
}
});
// Also cover the else blocks
if (ast.inverse) {
replaceLocaleStrings(ast.inverse, mapping, options);
}
}
return ast;
}
return function precompile(string, mapping, options) {
var ast, environment;
options = options || {};
if (!('data' in options)) {
options.data = true;
}
if (options.compat) {
options.useDepths = true;
}
ast = Handlebars.parse(string);
// avoid replacing locale if mapping is `false`
if (mapping !== false) {
ast = replaceLocaleStrings(ast, mapping, options);
}
environment = new Handlebars.Compiler().compile(ast, options);
return new Handlebars.JavaScriptCompiler().compile(environment, options);
};
});
//>>excludeEnd('excludeAfterBuild')
//>>excludeStart('excludeAfterBuild', pragmas.excludeAfterBuild)
/*
http://www.JSON.org/json2.js
2011-10-19
Public Domain.
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
See http://www.JSON.org/js.html
This code should be minified before deployment.
See http://javascript.crockford.com/jsmin.html
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
NOT CONTROL.
*/
/*jslint evil: true, regexp: true */
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
lastIndex, length, parse, prototype, push, replace, slice, stringify,
test, toJSON, toString, valueOf
*/
(function(window) {
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.
// Return the window JSON element if it exists;
var JSON = window.JSON || {};
(function() {
'use strict';
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
if (typeof Date.prototype.toJSON !== 'function') {
Date.prototype.toJSON = function(key) {
return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z' : null;
};
String.prototype.toJSON =
Number.prototype.toJSON =
Boolean.prototype.toJSON = function(key) {
return this.valueOf();
};
}
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
gap,
indent,
meta = { // table of character substitutions
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"': '\\"',
'\\': '\\\\'
},
rep;
function quote(string) {
// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.
escapable.lastIndex = 0;
return escapable.test(string) ? '"' + string.replace(escapable, function(a) {
var c = meta[a];
return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
}) + '"' : '"' + string + '"';
}
function str(key, holder) {
// Produce a string from holder[key].
var i, // The loop counter.
k, // The member key.
v, // The member value.
length,
mind = gap,
partial,
value = holder[key];
// If the value has a toJSON method, call it to obtain a replacement value.
if (value && typeof value === 'object' &&
typeof value.toJSON === 'function') {
value = value.toJSON(key);
}
// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.
if (typeof rep === 'function') {
value = rep.call(holder, key, value);
}
// What happens next depends on the value's type.
switch (typeof value) {
case 'string':
return quote(value);
case 'number':
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite(value) ? String(value) : 'null';
case 'boolean':
case 'null':
// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.
return String(value);
// If the type is 'object', we might be dealing with an object or an array or
// null.
case 'object':
// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.
if (!value) {
return 'null';
}
// Make an array to hold the partial results of stringifying this object value.
gap += indent;
partial = [];
// Is the value an array?
if (Object.prototype.toString.apply(value) === '[object Array]') {
// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.
length = value.length;
for (i = 0; i < length; i += 1) {
partial[i] = str(i, value) || 'null';
}
// Join all of the elements together, separated with commas, and wrap them in
// brackets.
v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
gap = mind;
return v;
}
// If the replacer is an array, use it to select the members to be stringified.
if (rep && typeof rep === 'object') {
length = rep.length;
for (i = 0; i < length; i += 1) {
if (typeof rep[i] === 'string') {
k = rep[i];
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
} else {
// Otherwise, iterate through all of the keys in the object.
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = str(k, value);
if (v) {
partial.push(quote(k) + (gap ? ': ' : ':') + v);
}
}
}
}
// Join all of the member texts together, separated with commas,
// and wrap them in braces.
v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
gap = mind;
return v;
}
}
// If the JSON object does not yet have a stringify method, give it one.
if (typeof JSON.stringify !== 'function') {
JSON.stringify = function(value, replacer, space) {
// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.
var i;
gap = '';
indent = '';
// If the space parameter is a number, make an indent string containing that
// many spaces.
if (typeof space === 'number') {
for (i = 0; i < space; i += 1) {
indent += ' ';
}
// If the space parameter is a string, it will be used as the indent string.
} else if (typeof space === 'string') {
indent = space;
}
// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.
rep = replacer;
if (replacer && typeof replacer !== 'function' &&
(typeof replacer !== 'object' ||
typeof replacer.length !== 'number')) {
throw new Error('JSON.stringify');
}
// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.
return str('', {
'': value
});
};
}
// If the JSON object does not yet have a parse method, give it one.
if (typeof JSON.parse !== 'function') {
JSON.parse = function(text, reviver) {
// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
var j;
function walk(holder, key) {
// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.
var k, v, value = holder[key];
if (value && typeof value === 'object') {
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = walk(value, k);
if (v !== undefined) {
value[k] = v;
} else {
delete value[k];
}
}
}
}
return reviver.call(holder, key, value);
}
// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.
text = String(text);
cx.lastIndex = 0;
if (cx.test(text)) {
text = text.replace(cx, function(a) {
return '\\u' +
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
});
}
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.
// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
if (/^[\],:{}\s]*$/
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
return typeof reviver === 'function' ? walk({
'': j
}, '') : j;
}
// If the text is not JSON parseable, then a SyntaxError is thrown.
throw new SyntaxError('JSON.parse');
};
}
}());
define(function() {
return JSON;
});
// otherwise just leave it alone
}).call(this, this);
//>>excludeEnd('excludeAfterBuild')
/**
* 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.
*/
define([
'jquery',
'underscore',
'backbone',
'App',
'utils/Globals',
'utils/Utils'
], function($, _, Backbone, App, Globals, Utils) {
var AppRouter = Backbone.Router.extend({
routes: {
// Define some URL routes
'': 'assetPageLoad',
'!/': 'assetPageLoad',
"!/dashboard/assetPage": 'assetPageLoad',
'!/dashboard/detailPage/:id': 'detailPageLoad',
'!/dashboard/createTags': 'tagPageLoad',
// Default
'*actions': 'defaultAction'
},
initialize: function() {
this.showRegions();
this.bindCommonEvents();
this.listenTo(this, 'route', this.postRouteExecute, this);
this.globalVent = new Backbone.Wreqr.EventAggregator();
this.catalogVent = new Backbone.Wreqr.EventAggregator();
this.tagVent = new Backbone.Wreqr.EventAggregator();
},
bindCommonEvents: function() {
var that = this;
$('body').on('click', 'li.aboutAtlas', function() {
that.aboutAtlas();
});
},
aboutAtlas: function() {
var that = this;
require([
'hbs!tmpl/common/aboutAtlas_tmpl',
'modules/Modal'
], function(aboutAtlasTmpl, Modal) {
var aboutAtlas = Marionette.LayoutView.extend({
template: aboutAtlasTmpl,
events: {},
});
var view = new aboutAtlas();
var modal = new Modal({
title: 'About',
content: view,
okCloses: true,
showFooter: true,
}).open();
view.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
showRegions: function() {},
/**
* @override
* Execute a route handler with the provided parameters. This is an
* excellent place to do pre-route setup or post-route cleanup.
* @param {Function} callback - route handler
* @param {Array} args - route params
*/
execute: function(callback, args) {
this.preRouteExecute();
if (callback) callback.apply(this, args);
this.postRouteExecute();
},
preRouteExecute: function() {
// console.log("Pre-Route Change Operations can be performed here !!");
},
postRouteExecute: function(name, args) {
// console.log("Post-Route Change Operations can be performed here !!");
// console.log("Route changed: ", name);
},
/**
* Define route handlers here
*/
assetPageLoad: function() {
var that = this;
$('#old').show();
$('#new').hide();
require([
'views/asset/AssetPageLayoutView',
'collection/VSearchList',
'views/site/Header',
/*'views/site/footer',*/
], function(AssetPageLayoutView, VSearchList, HeaderView /*, FooterView*/ ) {
that.searchCollection = new VSearchList([], {
state: {
firstPage: 0,
pageSize: 10
}
});
App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent }));
App.rContent.show(new AssetPageLayoutView({
'globalVent': that.globalVent,
'collection': that.searchCollection,
'vent': that.tagVent
}));
});
},
detailPageLoad: function(id) {
var that = this;
$('#old').show();
$('#new').hide();
if (id) {
require([
'views/detail_page/DetailPageLayoutView',
'collection/VEntityList',
'views/site/Header',
], function(DetailPageLayoutView, VEntityList, HeaderView) {
this.entityCollection = new VEntityList([], {});
App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent }));
App.rContent.show(new DetailPageLayoutView({
'globalVent': that.globalVent,
'collection': entityCollection,
'id': id,
'vent': that.tagVent
}));
entityCollection.url = "/api/atlas/entities/" + id;
entityCollection.fetch({ reset: true });
});
}
},
tagPageLoad: function() {
var that = this;
$('#old').show();
$('#new').hide();
require([
'views/tag/createTagsLayoutView',
'collection/VTagList',
'views/site/Header',
], function(CreateTagsLayoutView, VTagList, HeaderView) {
this.tagsCollection = new VTagList([], {});
App.rHeader.show(new HeaderView({ 'globalVent': that.globalVent }));
App.rContent.show(new CreateTagsLayoutView({
'globalVent': that.globalVent,
'tagsCollection': tagsCollection,
}));
});
},
defaultAction: function(actions) {
// We have no matching route, lets just log what the URL was
console.log('No route:', actions);
}
});
return AppRouter;
});
<!--
* 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.
-->
<div class="row">
<div class="col-sm-3">
<div id="r_tagLayoutView"></div>
</div>
<div class="col-sm-9">
<div class="panel panel-default">
<div class="panel-body">
<div id="r_searchLayoutView"></div>
<div class="fontLoader">
<i class="fa fa-refresh fa-spin-custom"></i>
</div>
<div id="r_entityTableLayoutView" class="entityTable"></div>
</div>
</div>
</div>
</div>
<!--
* 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.
-->
<div class="clearfix">
<div class="form-group pull-right no-margin">
<div data-id="control" class="pull-right"></div>
<label class="select pull-right">
<select data-id="pageSize" class="form-control">
<option selected>10</option>
<option>25</option>
<option>50</option>
<option>100</option>
</select>
</label>
</div>
</div>
<div class="position-relative thick-border">
<div data-id="r_tableList" class="table-responsive tableBorder"> </div>
<div data-id="r_tableSpinner"></div>
</div>
<div class="row banded">
<div data-id="r_footerRecords" class="col-sm-6 margin-top-10"></div>
<div data-id="r_pagination" class="col-sm-6 text-right"></div>
</div>
\ No newline at end of file
<!--
* 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.
-->
<div class="row">
<div class="col-md-4">
<img src="img/ApacheAtlasLogo.png" class="img-responsive">
<div class="col-md-8 subContent">
<h2 class="title-bold">Apache Atlas</h2>
<p class="ng-binding"><b>Version : </b> 0.7-incubating-SNAPSHOT-ra2cc01c4342ace7f7a3e3e254d7ede781f990318</p>
<br>
<p class="text-info">Get involved!</p>
<p class="text-info"><a href="http://apache.org/licenses/LICENSE-2.0" target="_blank">Licensed under the Apache License Version 2.0</a></p>
</div>
</div>
<!--
* 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.
-->
<div class="modal-dialog {{mainClass}}" role="document">
<div class="modal-content">
{{#if title}}
<div class="modal-header">
<a class="close">&times;</a>
<h4 class="modal-title">
{{#if titleHtml}}
{{{tt title}}}
{{else}}
{{tt title}}
{{/if}}
</h4>
</div>
{{/if}}
{{#if contentWithFooter}}
{{else}}
<div class="modal-body">{{content}}</div>
{{#if showFooter}}
<div class="modal-footer" >
<a href="#" class="btn ok btn-success">{{tt okText}}</a>
{{#if allowCancel}}
{{#if cancelText}}
<a href="#" class="btn btn-default cancel">{{tt cancelText}}</a>
{{/if}}
{{/if}}
</div>
{{/if}}
{{/if}}
</div>
</div>
\ No newline at end of file
<!--
* 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.
-->
<div class="col-sm-12">
<ol class="breadcrumb">
<li><a href="#!/dashboard/assetPage">Home</a></li>
<li class="active breadcrumbName"></li>
</ol>
<div class="panel panel-default lineageLayout" style="display:none">
<div id="r_lineageLayoutView"></div>
</div>
<div class="panel panel-default">
<div class="panel-body">
<p class="name"></p>
<p class="description"></p>
<hr>
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="tab active"><a href="#tab-details" aria-controls="tab-details" role="tab" data-toggle="tab">Details</a></li>
<li role="presentation" class="tab schemaTable" style="display:none"><a href="#tab-schema" aria-controls="tab-schema" role="tab" data-toggle="tab">Schema</a></li>
<li role="presentation" class="tab "><a href="#tab-tags" aria-controls="tab-tags" role="tab" data-toggle="tab">Tags</a></li>
</ul>
<div class="tab-content">
<div id="tab-details" role="tabpanel" class="tab-pane active">
<div id="r_entityDetailTableLayoutView"></div>
</div>
<div id="tab-schema" class="tab-pane">
<div id="r_schemaTableLayoutView"></div>
</div>
<div id="tab-tags" class="tab-pane">
<div id="r_tagTableLayoutView"></div>
</div>
</div>
</div>
</div>
</div>
<!--
* 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.
-->
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
</thead>
<tbody data-id="detailValue">
</tbody>
</table>
<!--
* 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.
-->
<div class="panel-heading">
<h3 class="panel-title">Lineage</h3>
</div>
<div class="fontLoader">
<i class="fa fa-refresh fa-spin-custom"></i>
</div>
<div class="panel-body graph-bg" align="center">
<!-- <div class="temp">
<i class="glyphicon glyphicon-plus"></i>
<i class="glyphicon glyphicon-minus"></i>
</div> -->
<div class="graph" id="tree-container">
</div>
<div>
<svg width=100% height=350> </svg>
</div>
</div>
<!--
* 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.
-->
<div id="r_tagLayoutView"></div>
\ No newline at end of file
<!--
* 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.
-->
<div class="row row-margin-bottom">
<div class="col-sm-12">
<div class="switch" style="float: left;">
<input type="radio" class="switch-input" name="queryType" value="fulltext" id="fulltext_toggle" checked="">
<label for="fulltext_toggle" class="switch-label switch-label-off">Text</label>
<input type="radio" class="switch-input" name="queryType" value="dsl" id="dsl_toggle">
<label for="dsl_toggle" class="switch-label switch-label-on">DSL</label>
<span class="switch-selection"></span>
</div>
<div class="input-group">
<input style="padding-left: 132px;" type="text" class="form-control" data-id="searchInput" placeholder="Search using a query string: e.g. sales_fact">
<span class="input-group-btn">
<button class="btn btn-success" data-id="searchButton" type="button"><i class="fa fa-search"></i></button>
</span>
</div>
</div>
</div>
<!--
* 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.
-->
<footer class="footer navbar-bottom">
<div class="container">
<p align="right">Powered by<img src="../img/logo-green.png"></p>
</div>
</footer>
<!--
* 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.
-->
<div class="container">
<div class="row">
<div class="navbar-header">
<ul class="sidebar-nav">
<li class="sidebar-brand clearfix">
<a class="pull-left" href="#!/"><i class="fa fa-globe"></i><strong> Atlas</strong></a>
<div class="dropdown headerDroupDown pull-left">
<a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
{{#ifCond urlType "==" "assetPage"}}
Assets
{{else}}
{{#ifCond urlType "==" "createTags"}}
Tag Definition
{{else}}
Asset Details
{{/ifCond}}
{{/ifCond}}
<span class="caret"></span></a>
<ul class="dropdown-menu">
{{#ifCond urlType "==" "assetPage"}}
<li><a href="#!/dashboard/createTags">Tag Definition</a></li>
{{else}} {{#ifCond urlType "==" "createTags"}}
<li><a href="#!/dashboard/assetPage">Assets</a></li>
{{else}}
<li><a href="#!/dashboard/assetPage">Assets</a></li>
<li><a href="#!/dashboard/createTags">Tag Definition</a></li>
{{/ifCond}} {{/ifCond}}
<li><a target="_blank" href="https://cwiki.apache.org/confluence/display/ATLAS/Atlas+Home">Help</a></li>
<li class="aboutAtlas"><a href="javascript:void(0)">About</a></li>
<li><a href="logout.html">Logout</a></li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
<!--
* 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.
-->
<div>
<button class="add-tag btn btn-success pull-right" data-id="addTag" style="margin-bottom:10px">Add Tag</button>
</div>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Tag</th>
<th>Attribute</th>
<th>Tools</th>
</tr>
</thead>
<tbody data-id="detailValue">
</tbody>
</table>
<div class="noTags" style="display:none">
No tags to display
</div>
<!--
* 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.
-->
<div class="tagsList">
<div class="atlast-tabbable">
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="tab active"><a href="#tab-tags" role="tab" data-toggle="tab">Tags</a></li>
<li role="presentation" class="tab"><a href="#tab-types" role="tab" data-toggle="tab">Type</a></li>
<div class="pull-right" data-id="referesh"><a href="javascript:void(0)"><i class="fa fa-refresh"></i></a></div>
<div class="indicator" style="right: 116px; left: 0px;"></div>
</ul>
<div class="tab-content">
<div id="tab-tags" role="tabpanel" class="tab-pane active">
<div class="row-margin-bottom">
<input data-id="searchTag" data-type="listTag" placeholder="Search for Tags…" class="form-control">
</div>
<div class="list-group scrollTagList" data-id="listTag"> </div>
</div>
<div id="tab-types" role="tabpanel" class="tab-pane">
<div class="row-margin-bottom ">
<input data-id="searchTag" data-type="listType" placeholder="Search for Types…" class="form-control">
</div>
<div class="list-group scrollTagList" data-id="listType"> </div>
</div>
</div>
</div>
</div>
<!--
* 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.
-->
<div class="form-group">
<label class="col-sm-2 control-label">Attribute name</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="name" id="attributeId" placeholder="Attribute name" required="">
<button class="remove" id="close"><i class="fa fa-times"></i></button>
</div>
</div>
<!--
* 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.
-->
<div class="modalHeight">
<form name="tagDefinitionform" class="css-form">
<div class="form-group">
<label class="control-label col-sm-4">Tag definition</label>
<div class="col-sm-8 input-spacing">
<select class="form-control" data-id="addTagOptions" id="addTagID" required>
</select>
</div>
</div>
</form>
</div>
<div class="form-group modalHeight" data-id="tagAttribute" style="display:none">
</div>
<!--
* 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.
-->
<div class="row">
<div class="appForm col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
<h4>Tag Definition</h4></div>
<div class="panel-body inputs">
<form data-name="tagForm" class="form-horizontal" novalidate="" role="form">
<fieldset>
<div class="form-group hide">
<label for="category" class="col-sm-2 control-label">Category</label>
<div class="col-sm-10">
<select class="form-control" data-id="category" name="category" required="">
</select>
</div>
</div>
<div class="form-group">
<label for="typeName" class="col-sm-2 control-label">Tag Name</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="typeName" data-id="typeName" placeholder="Tag Name" required="">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Parent Tag</label>
<div class="col-sm-5 mrt-8">
<select class="form-control h160" data-id="parentTag" name="ParentTag" multiple>
</select>
</div>
<div class="mtop3">
<a href="javascript:void(0)" class="pull-left fa fa-refresh" title="Refreh parent tag list" data-id="refreshBtn">
</a>
</div>
</div>
<div data-id="addAttributeDiv"></div>
<div class="form-group text-right">
<div class="col-sm-offset-2 col-sm-10">
<button type="default" class="btn btn-default addAttr" disabled="true" data-id="addAttrBtn"><i class="fa fa-plus"></i> Add Attribute</button>
</div>
</div>
<div class="form-group panel-footer">
<div class="col-sm-12 text-right padding0">
<button class="btn btn-primary saveAttr" type="button" disabled="true" data-id="saveButton">Save</button>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
/**
* 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.
*/
define(['require'], function(require) {
'use strict';
var Globals = {};
Globals.baseURL = '';
Globals.settings = {};
Globals.settings.PAGE_SIZE = 25;
Globals.saveApplicationState = {
mainPageState: {},
detailPageState: {}
};
return Globals;
});
/**
* 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.
*/
define(['require', 'backgrid'], function(require) {
'use strict';
/*
* HtmlCell renders any html code
* @class Backgrid.HtmlCell
* @extends Backgrid.Cell
*/
var HtmlCell = Backgrid.HtmlCell = Backgrid.Cell.extend({
/** @property */
className: "html-cell",
render: function() {
this.$el.empty();
var rawValue = this.model.get(this.column.get("name"));
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
this.$el.append(formattedValue);
this.delegateEvents();
return this;
}
});
var UriCell = Backgrid.UriCell = Backgrid.Cell.extend({
className: "uri-cell",
title: null,
target: "_blank",
initialize: function(options) {
UriCell.__super__.initialize.apply(this, arguments);
this.title = options.title || this.title;
this.target = options.target || this.target;
},
render: function() {
this.$el.empty();
var rawValue = this.model.get(this.column.get("name"));
var href = _.isFunction(this.column.get("href")) ? this.column.get('href')(this.model) : this.column.get('href');
var klass = this.column.get("klass");
var formattedValue = this.formatter.fromRaw(rawValue, this.model);
this.$el.append($("<a>", {
tabIndex: -1,
href: href,
title: this.title || formattedValue,
'class': klass
}).text(formattedValue));
if (this.column.has("iconKlass")) {
var iconKlass = this.column.get("iconKlass");
var iconTitle = this.column.get("iconTitle");
this.$el.find('a').append('<i class="' + iconKlass + '" title="' + iconTitle + '"></i>');
}
this.delegateEvents();
return this;
}
});
});
/**
* 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.
*/
/**
* @file This is the common View file for displaying Table/Grid to be used overall in the application.
*/
define(['require',
'backbone',
'hbs!tmpl/common/TableLayout_tmpl',
'backgrid-filter',
'backgrid-paginator',
'backgrid-sizeable',
'backgrid-orderable'
], function(require, Backbone, FSTablelayoutTmpl) {
'use strict';
var FSTableLayout = Backbone.Marionette.LayoutView.extend(
/** @lends FSTableLayout */
{
_viewName: 'FSTableLayout',
template: FSTablelayoutTmpl,
/** Layout sub regions */
regions: {
'rTableList': 'div[data-id="r_tableList"]',
'rTableSpinner': 'div[data-id="r_tableSpinner"]',
'rPagination': 'div[data-id="r_pagination"]',
'rFooterRecords': 'div[data-id="r_footerRecords"]'
},
// /** ui selector cache */
ui: {
selectPageSize: 'select[data-id="pageSize"]'
},
gridOpts: {
className: 'table table-bordered table-hover table-condensed backgrid',
emptyText: 'No Records found!'
},
/**
* Backgrid.Filter default options
*/
filterOpts: {
placeholder: 'plcHldr.searchByResourcePath',
wait: 150
},
/**
* Paginator default options
*/
paginatorOpts: {
// If you anticipate a large number of pages, you can adjust
// the number of page handles to show. The sliding window
// will automatically show the next set of page handles when
// you click next at the end of a window.
windowSize: 5, // Default is 10
// Used to multiple windowSize to yield a number of pages to slide,
// in the case the number is 5
slideScale: 0.5, // Default is 0.5
// Whether sorting should go back to the first page
goBackFirstOnSort: false // Default is true
},
/**
page handlers for pagination
*/
controlOpts: {
rewind: {
label: "&#12298;",
title: "First"
},
back: {
label: "&#12296;",
title: "Previous"
},
forward: {
label: "&#12297;",
title: "Next"
},
fastForward: {
label: "&#12299;",
title: "Last"
}
},
columnOpts: {
initialColumnsVisible: 4,
// State settings
saveState: false,
loadStateOnInit: true
},
includePagination: true,
includeFilter: false,
includeHeaderSearch: false,
includePageSize: false,
includeFooterRecords: true,
includeColumnManager: false,
includeSizeAbleColumns: false,
includeOrderAbleColumns: false,
/** ui events hash */
events: function() {
var events = {};
events['change ' + this.ui.selectPageSize] = 'onPageSizeChange';
return events;
},
/**
* intialize a new HDFSTableLayout Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'collection', 'columns', 'includePagination',
'includeHeaderSearch', 'includeFilter', 'includePageSize',
'includeFooterRecords', 'includeColumnManager', 'includeSizeAbleColumns', 'includeOrderAbleColumns'));
_.extend(this.gridOpts, options.gridOpts, { collection: this.collection, columns: this.columns });
_.extend(this.filterOpts, options.filterOpts);
_.extend(this.paginatorOpts, options.paginatorOpts);
_.extend(this.controlOpts, options.controlOpts);
_.extend(this.columnOpts, options.columnOpts);
this.bindEvents();
},
/** all events binding here */
bindEvents: function() {
this.listenTo(this.collection, 'request', function() {
this.$('div[data-id="r_tableSpinner"]').addClass('loading');
}, this);
this.listenTo(this.collection, 'sync error', function() {
this.$('div[data-id="r_tableSpinner"]').removeClass('loading');
}, this);
this.listenTo(this.collection, 'reset', function(collection, response) {
if (this.includePagination) {
this.renderPagination();
}
if (this.includeFooterRecords) {
this.renderFooterRecords(this.collection.state);
}
}, this);
/*This "sort" trigger event is fired when clicked on
'sortable' header cell (backgrid).
Collection.trigger event was fired because backgrid has
removeCellDirection function (backgrid.js - line no: 2088)
which is invoked when "sort" event is triggered
on collection (backgrid.js - line no: 2081).
removeCellDirection function - removes "ascending" and "descending"
which in turn removes chevrons from every 'sortable' header-cells*/
this.listenTo(this.collection, "backgrid:sort", function() {
this.collection.trigger("sort");
});
/*this.listenTo(this.collection, 'remove', function(model, collection, response){
if (model.isNew() || !this.includePagination) {
return;
}
if (this.collection.state && this.collection.state.totalRecords>0) {
this.collection.state.totalRecords-=1;
}
if (this.collection.length===0 && this.collection.state && this.collection.state.totalRecords>0) {
if (this.collection.state.totalRecords>this.collection.state.currentPage*this.collection.state.pageSize) {
this.collection.fetch({reset:true});
} else {
if (this.collection.state.currentPage>0) {
this.collection.state.currentPage-=1;
this.collection.fetch({reset:true});
}
}
} else if (this.collection.length===0 && this.collection.state && this.collection.state.totalRecords===0) {
this.collection.state.currentPage=0;
this.collection.fetch({reset:true});
}
}, this);*/
// It will show tool tip when td has ellipsis Property
this.listenTo(this.collection, "backgrid:refresh", function() {
/*this.$('.table td').bind('mouseenter', function() {
var $this = $(this);
if (this.offsetWidth < this.scrollWidth && !$this.attr('title')) {
$this.attr('title', $this.text());
}
});*/
}, this);
},
/** on render callback */
onRender: function() {
this.renderTable();
if (this.includePagination) {
this.renderPagination();
}
if (this.includeFilter) {
this.renderFilter();
}
if (!this.includePageSize) {
this.ui.selectPageSize.remove();
}
if (this.includeFooterRecords) {
this.renderFooterRecords(this.collection.state);
}
if (this.includeColumnManager) {
this.renderColumnManager();
}
if (this.includeSizeAbleColumns) {
this.renderSizeAbleColumns();
}
if (this.includeOrderAbleColumns) {
this.renderOrderAbleColumns();
}
this.$('[data-id="pageSize"]').val(this.collection.state.pageSize);
},
/**
* show table
*/
renderTable: function() {
var that = this;
this.rTableList.show(new Backgrid.Grid(this.gridOpts));
},
/**
* show pagination buttons(first, last, next, prev and numbers)
*/
renderPagination: function() {
var options = _.extend({
collection: this.collection,
controls: this.controlOpts
}, this.paginatorOpts);
// TODO - Debug this part
if (this.rPagination) {
this.rPagination.show(new Backgrid.Extension.Paginator(options));
} else if (this.regions.rPagination) {
this.$('div[data-id="r_pagination"]').show(new Backgrid.Extension.Paginator(options));
}
},
/**
* show/hide pagination buttons of the grid
*/
showHidePager: function() {
if (!this.includePagination) {
return;
}
if (this.collection.state && this.collection.state.totalRecords > this.collection.state.pageSize) {
this.$('div[data-id="r_pagination"]').show();
} else {
this.$('div[data-id="r_pagination"]').hide();
}
},
/**
* show/hide filter of the grid
*/
renderFilter: function() {
this.rFilter.show(new Backgrid.Extension.ServerSideFilter({
collection: this.collection,
name: ['name'],
placeholder: 'plcHldr.searchByResourcePath',
wait: 150
}));
setTimeout(function() {
that.$('table').colResizable({ liveDrag: true });
}, 0);
},
/**
* show/hide footer details of the list/collection shown in the grid
*/
renderFooterRecords: function(collectionState) {
var collState = collectionState;
var totalRecords = collState.totalRecords || 0;
var pageStartIndex = totalRecords ? (collState.currentPage * collState.pageSize) : 0;
var pageEndIndex = pageStartIndex + this.collection.length;
this.$('[data-id="r_footerRecords"]').html('Showing ' + (totalRecords ? pageStartIndex + 1 : 0) + ' to ' + pageEndIndex + ' of ' + totalRecords + ' entries');
return this;
},
/**
* ColumnManager for the table
*/
renderColumnManager: function() {
var $el = this.$("[data-id='control']");
var colManager = new Backgrid.Extension.ColumnManager(this.columns, this.columnOpts);
// Add control
var colVisibilityControl = new Backgrid.Extension.ColumnManagerVisibilityControl({
columnManager: colManager
});
$el.append(colVisibilityControl.render().el);
},
renderSizeAbleColumns: function() {
// Add sizeable columns
var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
collection: this.collection,
columns: this.columns,
grid: this.getGridObj()
});
this.$('thead').before(sizeAbleCol.render().el);
// Add resize handlers
var sizeHandler = new Backgrid.Extension.SizeAbleColumnsHandlers({
sizeAbleColumns: sizeAbleCol,
grid: this.getGridObj(),
saveModelWidth: true
});
this.$('thead').before(sizeHandler.render().el);
// Listen to resize events
this.columns.on('resize', function(columnModel, newWidth, oldWidth) {
console.log('Resize event on column; name, model, new and old width: ', columnModel.get("name"), columnModel, newWidth, oldWidth);
});
},
renderOrderAbleColumns: function() {
// Add orderable columns
var sizeAbleCol = new Backgrid.Extension.SizeAbleColumns({
collection: this.collection,
grid: this.getGridObj(),
columns: this.columns
});
var orderHandler = new Backgrid.Extension.OrderableColumns({
grid: this.getGridObj(),
sizeAbleColumns: sizeAbleCol
});
this.$('thead').before(orderHandler.render().el);
},
/** on close */
onClose: function() {},
/**
* get the Backgrid object
* @return {null}
*/
getGridObj: function() {
if (this.rTableList.currentView) {
return this.rTableList.currentView;
}
return null;
},
/**
* handle change event on page size select box
* @param {Object} e event
*/
onPageSizeChange: function(e) {
var pagesize = $(e.currentTarget).val();
this.collection.state.pageSize = parseInt(pagesize, 10);
this.collection.state.currentPage = this.collection.state.firstPage;
this.collection.fetch({
sort: false,
reset: true,
cache: false
});
}
});
return FSTableLayout;
});
/**
* 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.
*/
define(['require', 'utils/Globals'], function(require, Globals) {
'use strict';
var Utils = {};
require(['noty'], function() {
$.extend($.noty.defaults, {
timeout: 5000,
layout: "topRight",
theme: "relax",
closeWith: ['click', 'button'],
animation: {
open: 'animated flipInX',
close: 'animated flipOutX',
easing: 'swing',
speed: 500
}
});
});
Utils.generateUUID = function() {
var d = new Date().getTime();
if (window.performance && typeof window.performance.now === "function") {
d += performance.now(); //use high-precision timer if available
}
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid;
};
Utils.notifyInfo = function(options) {
noty({
type: "information",
text: "<i class='fa fa-exclamation-circle'></i> " + (options.content || "Info message.")
});
};
Utils.notifyWarn = function(options) {
noty({
type: "warning",
text: "<i class='fa fa-times-circle'></i> " + (options.content || "Info message.")
});
};
Utils.notifyError = function(options) {
noty({
type: "error",
text: "<i class='fa fa-times-circle'></i> " + (options.content || "Error occurred.")
});
};
Utils.notifySuccess = function(options) {
noty({
type: "success",
text: "<i class='fa fa-check-circle-o'></i> " + (options.content || "Error occurred.")
});
};
Utils.defaultErrorHandler = function(model, error) {
/*
require(['views/common/ErrorView', 'App'], function(vError, App) {
if (error.status == 404) {
App.rContent.show(new vError({
status: error.status
}));
} else if (error.status == 401) {
App.rContent.show(new vError({
status: error.status
}));
} else if (error.status == 419) {
window.location = 'login.jsp'
} else if (error.status == "0") {
var diffTime = (new Date().getTime() - prevNetworkErrorTime);
if (diffTime > 3000) {
prevNetworkErrorTime = new Date().getTime();
Utils.notifyError({
content: "Network Connection Failure : " +
"It seems you are not connected to the internet. Please check your internet connection and try again"
})
}
}
});
*/
};
Utils.localStorage = {
checkLocalStorage: function(key, value) {
if (typeof(Storage) !== "undefined") {
return this.getLocalStorage(key, value);
} else {
console.log('Sorry! No Web Storage support');
Utils.cookie.checkCookie(key, value);
}
},
setLocalStorage: function(key, value) {
localStorage.setItem(key, value);
return { found: false, 'value': value };
},
getLocalStorage: function(key, value) {
var keyValue = localStorage.getItem(key)
if (!keyValue || keyValue == "undefined") {
return this.setLocalStorage(key, value);
} else {
return { found: true, 'value': keyValue };
}
}
}
Utils.cookie = {
setCookie: function(cname, cvalue) {
//var d = new Date();
//d.setTime(d.getTime() + (exdays*24*60*60*1000));
//var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; "
return { found: false, 'value': cvalue };
},
getCookie: function(findString) {
var search = findString + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1);
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
},
checkCookie: function(key, value) {
var findString = getCookie(key);
if (findString != "" || keyValue != "undefined") {
return { found: true, 'value': ((findString == "undefined") ? (undefined) : (findString)) };
} else {
return setCookie(key, value);
}
}
}
Utils.getQueryParams = function(qs) {
qs = qs.split('+').join(' ');
var params = {},
tokens,
re = /[?&]?([^=]+)=([^&]*)/g;
while (tokens = re.exec(qs)) {
params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
}
return params;
}
Utils.setUrl = function(options) {
if (options) {
if (options.mergeBrowserUrl) {
var hashUrl = window.location.hash.split("?");
if (hashUrl.length > 1) {
var param = Utils.getQueryParams(hashUrl[1]);
options.urlParams = _.extend(param, options.urlParams)
}
}
if (options.urlParams) {
var urlParams = "?"
_.each(options.urlParams, function(value, key, obj) {
urlParams += key + "=" + value + "&";
});
urlParams = urlParams.slice(0, -1);
options.url += urlParams;
}
Backbone.history.navigate(options.url, { trigger: options.trigger != undefined ? options.trigger : true });
}
}
return Utils;
});
\ No newline at end of file
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/asset/AssetPageLayoutView_tmpl',
'modules/Modal',
'models/VEntity',
'utils/Utils',
'utils/Globals',
], function(require, Backbone, AssetPageLayoutViewTmpl, Modal, VEntity, Utils, Globals) {
'use strict';
var AssetPageLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends AssetPageLayoutView */
{
_viewName: 'AssetPageLayoutView',
template: AssetPageLayoutViewTmpl,
/** Layout sub regions */
regions: {
RTagLayoutView: "#r_tagLayoutView",
RSearchLayoutView: "#r_searchLayoutView",
REntityTableLayoutView: "#r_entityTableLayoutView",
},
/** ui selector cache */
ui: {
tagClick: '[data-id="tagClick"]',
addTag: '[data-id="addTag"]',
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.tagClick] = function(e) {
if (e.target.nodeName.toLocaleLowerCase() == "i") {
this.onClickTagCross(e);
} else {
Utils.setUrl({
url: '#!/dashboard/assetPage',
urlParams: {
query: e.currentTarget.text
},
mergeBrowserUrl: true,
trigger: false
});
this.vent.trigger("tag:click", { 'query': e.currentTarget.text });
}
};
events["click " + this.ui.addTag] = function(e) {
this.addModalView(e);
};
events["click " + this.ui.tagCrossIcon] = function(e) {};
return events;
},
/**
* intialize a new AssetPageLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'collection', 'vent'));
this.entityModel = new VEntity();
this.searchCollection = this.collection;
this.fetchList = 0
this.commonTableOptions = {
collection: this.searchCollection,
includeFilter: false,
includePagination: true,
includePageSize: false,
includeFooterRecords: true,
includeSizeAbleColumns: false,
gridOpts: {
emptyText: 'No Record found!',
className: 'table table-bordered table-hover table-condensed backgrid table-quickMenu'
},
filterOpts: {},
paginatorOpts: {}
};
},
bindEvents: function() {
this.listenTo(this.vent, "search:click", function(value) {
this.fetchCollection(value);
this.REntityTableLayoutView.reset();
}, this);
this.listenTo(this.searchCollection, "reset", function(value) {
this.renderTableLayoutView();
}, this);
this.listenTo(this.searchCollection, "error", function(value) {
this.$('.fontLoader').hide();
this.$('.entityTable').show();
Utils.notifyError({
content: "Invalid expression"
});
}, this);
},
onRender: function() {
this.renderTagLayoutView();
this.renderSearchLayoutView();
this.renderTableLayoutView();
this.bindEvents();
},
fetchCollection: function(value) {
this.$('.fontLoader').show();
this.$('.entityTable').hide();
if (value) {
if (value.type) {
this.searchCollection.url = "/api/atlas/discovery/search/" + value.type;
}
$.extend(this.searchCollection.queryParams, { 'query': value.query });
}
this.searchCollection.fetch({ reset: true });
},
renderTagLayoutView: function() {
var that = this;
require(['views/tag/TagLayoutView'], function(TagLayoutView) {
that.RTagLayoutView.show(new TagLayoutView({
globalVent: that.globalVent,
vent: that.vent
}));
});
},
renderSearchLayoutView: function() {
var that = this;
require(['views/search/SearchLayoutView'], function(SearchLayoutView) {
that.RSearchLayoutView.show(new SearchLayoutView({
globalVent: that.globalVent,
vent: that.vent
}));
var hashUrl = window.location.hash.split("?");
if (hashUrl.length > 1) {
var param = Utils.getQueryParams(hashUrl[1]);
if (param) {
var type = param.searchType;
var query = param.query;
that.vent.trigger("tag:click", { 'query': query, 'searchType': type });
}
}
});
},
renderTableLayoutView: function() {
var that = this,
count = 4;
require(['utils/TableLayout'], function(TableLayout) {
var columnCollection = Backgrid.Columns.extend({
sortKey: "position",
comparator: function(item) {
return item.get(this.sortKey) || 999;
},
setPositions: function() {
_.each(this.models, function(model, index) {
if (model.get('name') == "name") {
model.set("position", 1, { silent: true });
} else if (model.get('name') == "description") {
model.set("position", 2, { silent: true });
} else if (model.get('name') == "owner") {
model.set("position", 3, { silent: true });
} else if (model.get('name') == "createTime") {
model.set("position", 4, { silent: true });
} else {
model.set("position", ++count, { silent: true });
}
});
return this;
}
});
var columns = new columnCollection(that.getEntityTableColumns());
columns.setPositions().sort();
that.REntityTableLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, {
globalVent: that.globalVent,
columns: columns,
includeOrderAbleColumns: true
})));
if (that.fetchList <= 0) {
that.$('.fontLoader').hide();
that.$('.entityTable').show();
}
});
},
getEntityTableColumns: function() {
var that = this,
col = {};
var responseData = this.searchCollection.responseData;
if (this.searchCollection.responseData) {
if (responseData.dataType) {
if (responseData.dataType.attributeDefinitions.length == 2 && responseData.dataType.attributeDefinitions[1].name == "instanceInfo") {
return this.getFixedColumn();
} else {
var modelJSON = this.searchCollection.toJSON()[0];
_.keys(modelJSON).map(function(key) {
if (key.indexOf("$") == -1 && typeof modelJSON[key] != "object") {
if (typeof modelJSON[key] == "string" || typeof modelJSON[key] == "number") {
if (typeof modelJSON[key] == "number" && key != "createTime") {
return;
}
col[key] = {
cell: (key == "name") ? ("Html") : ("String"),
editable: false,
sortable: false,
orderable: true,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
if (model.get('createTime') == rawValue) {
return new Date(rawValue);
}
if (model.get('name') == rawValue) {
if (model.get('$id$')) {
return '<a href="#!/dashboard/detailPage/' + model.get('$id$').id + '">' + rawValue + '</a>';
} else {
return '<a>' + rawValue + '</a>';
}
} else {
return rawValue;
}
}
})
};
}
}
});
col['tag'] = {
label: "Tags",
cell: "Html",
editable: false,
sortable: false,
orderable: true,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var traits = model.get('$traits$');
var atags = "";
_.keys(model.get('$traits$')).map(function(key) {
atags += '<a data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
});
return '<div class="tagList">' + atags + '</div>';
}
})
};
col['addTag'] = {
label: "Tools",
cell: "Html",
editable: false,
sortable: false,
orderable: true,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
if (model.get('$id$')) {
return '<a href="javascript:void(0)" data-id="addTag" class="addTagGuid" data-guid="' + model.get('$id$').id + '" ><i class="fa fa-tag"></i></a>';
} else {
return '<a href="javascript:void(0)" data-id="addTag"><i class="fa fa-tag"></i></a>';
}
}
})
};
return this.searchCollection.constructor.getTableCols(col, this.searchCollection);
}
} else {
return this.getFixedColumn();
}
}
},
getFixedColumn: function() {
var that = this;
return this.searchCollection.constructor.getTableCols({
instanceInfo: {
label: "Type Name",
cell: "html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var modelObject = model.toJSON();
if (modelObject.$typeName$ && modelObject.instanceInfo) {
return '<a href="#!/dashboard/detailPage/' + modelObject.instanceInfo.guid + '">' + modelObject.instanceInfo.typeName + '</a>';
} else if (!modelObject.$typeName$) {
return '<a href="#!/dashboard/detailPage/' + modelObject.guid + '">' + modelObject.typeName + '</a>';
}
}
})
},
name: {
label: "Name",
cell: "html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var modelObject = model.toJSON();
if (modelObject.$typeName$ && modelObject.instanceInfo) {
var guid = model.toJSON().instanceInfo.guid;
++that.fetchList
model.getEntity(guid, {
beforeSend: function() {},
success: function(data) {
--that.fetchList
if (that.fetchList <= 0) {
that.$('.fontLoader').hide();
that.$('.entityTable').show();
}
if (data.definition && data.definition.values && data.definition.values.name) {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.values.name);
} else {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.id.id);
}
},
error: function(error, data, status) {
that.$('.fontLoader').hide();
that.$('.entityTable').show();
},
complete: function() {}
});
return '<a href="#!/dashboard/detailPage/' + guid + '" data-id="' + guid + '"></a>';
} else if (!modelObject.$typeName$) {
var guid = model.toJSON().guid;
++that.fetchList
model.getEntity(guid, {
beforeSend: function() {},
success: function(data) {
--that.fetchList
if (that.fetchList <= 0) {
that.$('.fontLoader').hide();
that.$('.entityTable').show();
}
if (data.definition && data.definition.values && data.definition.values.name) {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.values.name);
} else {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.id.id);
}
},
error: function(error, data, status) {
that.$('.fontLoader').hide();
that.$('.entityTable').show();
},
complete: function() {}
});
return '<a href="#!/dashboard/detailPage/' + guid + '" data-id="' + guid + '"></a>';
}
}
})
}
}, this.searchCollection);
},
addModalView: function(e) {
var that = this;
require(['views/tag/addTagModalView'], function(addTagModalView) {
var view = new addTagModalView({
vent: that.vent,
guid: that.$(e.currentTarget).data("guid"),
modalCollection: that.searchCollection
});
// view.saveTagData = function() {
//override saveTagData function
// }
});
},
onClickTagCross: function(e) {
var tagName = $(e.target).data("name");
var that = this;
require([
'modules/Modal'
], function(Modal) {
var modal = new Modal({
title: 'Are you sure you want to delete ?',
okText: 'Delete',
htmlContent: "<b>Tag: " + tagName + "</b>",
cancelText: "Cancel",
allowCancel: true,
okCloses: true,
showFooter: true,
}).open();
modal.on('ok', function() {
that.deleteTagData(e);
});
modal.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
deleteTagData: function(e) {
var that = this,
tagName = $(e.target).data("name");
var guid = $(e.target).data("guid");
require(['models/VTag'], function(VTag) {
var tagModel = new VTag();
tagModel.deleteTag(guid, tagName, {
beforeSend: function() {},
success: function(data) {
that.searchCollection.fetch({ reset: true });
},
error: function(error, data, status) {},
complete: function() {}
});
});
}
});
return AssetPageLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'underscore',
'utils/Utils',
'utils/Globals',
'backgrid-filter',
'backgrid-paginator',
'select2',
], function(require, Backbone, _, Utils) {
'use strict';
var HeaderSearchCell = Backbone.View.extend({
tagName: 'td',
className: 'backgrid-filter',
template: _.template('<input type="search" <% if (placeholder) { %> placeholder="<%- placeholder %>" <% } %> name="<%- name %>" <% if (style) { %> style="<%- style %>" <% } %> />'),
//<a class='clear' href='#'>&times;</a>'),
placeholder: '',
events: {
'keyup input': 'evKeyUp',
'submit': 'search'
},
initialize: function(options) {
_.extend(this, _.pick(options, 'column'));
this.name = this.column.get('name');
if (this.column.get('reName') !== undefined)
this.name = this.column.get('reName');
var collection = this.collection,
self = this;
if (Backbone.PageableCollection && collection instanceof Backbone.PageableCollection) {
collection.queryParams[this.name] = function() {
return self.searchBox().val() || null;
};
}
},
render: function() {
this.$el.empty().append(this.template({
name: this.column.get('name'),
placeholder: this.column.get('placeholder') || 'Search',
style: this.column.get('headerSearchStyle')
}));
this.$el.addClass('renderable');
this.delegateEvents();
return this;
},
evKeyUp: function(e) {
var $clearButton = this.clearButton();
var searchTerms = this.searchBox().val();
if (!e.shiftKey) {
this.search();
}
if (searchTerms) {
$clearButton.show();
} else {
$clearButton.hide();
}
},
searchBox: function() {
return this.$el.find('input[type=search]');
},
clearButton: function() {
return this.$el.find('.clear');
},
search: function() {
var data = {};
// go back to the first page on search
var collection = this.collection;
if (Backbone.PageableCollection &&
collection instanceof Backbone.PageableCollection &&
collection.mode === 'server') {
collection.state.currentPage = collection.state.firstPage;
}
var query = this.searchBox().val();
if (query) data[this.name] = query;
if (collection.extraSearchParams) {
_.extend(data, collection.extraSearchParams);
}
if (collection.mode === 'server') {
collection.fetch({
data: data,
reset: true,
success: function() {},
error: function(msResponse) {
Utils.notifyError('Error', 'Invalid input data!');
}
});
} else if (collection.mode === 'client') {
}
},
clear: function(e) {
if (e) e.preventDefault();
this.searchBox().val(null);
this.collection.fetch({
reset: true
});
}
});
var HeaderFilterCell = Backbone.View.extend({
tagName: 'td',
className: 'backgrid-filter',
template: _.template('<select > <option>ALL</option>' +
'<% _.each(list, function(data) {' +
'if(_.isObject(data)){ %>' +
'<option value="<%= data.value %>"><%= data.label %></option>' +
'<% }else{ %>' +
'<option value="<%= data %>"><%= data %></option>' +
'<% } %>' +
'<% }); %></select>'),
placeholder: '',
events: {
'click': function() {},
},
initialize: function(options) {
_.extend(this, _.pick(options, 'column'));
this.name = this.column.get('name');
this.headerFilterOptions = this.column.get('headerFilterOptions');
},
render: function() {
var that = this;
this.$el.empty().append(this.template({
name: this.column.get('name'),
list: this.headerFilterOptions.filterList,
}));
this.$el.find('select').select2({
allowClear: true,
closeOnSelect: false,
width: this.headerFilterOptions.filterWidth || '100%',
height: this.headerFilterOptions.filterHeight || '20px',
});
this.$el.addClass('renderable');
this.$el.find('select').on('click', function(e) {
that.search(e.currentTarget.value);
});
return this;
},
search: function(selectedOptionValue) {
var data = {},
query;
// go back to the first page on search
var collection = this.collection;
if (Backbone.PageableCollection &&
collection instanceof Backbone.PageableCollection &&
collection.mode === 'server') {
collection.state.currentPage = collection.state.firstPage;
}
if (selectedOptionValue !== 'ALL') {
query = selectedOptionValue;
}
if (query) {
data[this.name] = query;
}
if (collection.extraSearchParams) {
_.extend(data, collection.extraSearchParams);
}
collection.fetch({
data: data,
reset: true
});
},
/*clear: function (e) {
if (e) e.preventDefault();
this.searchBox().val(null);
this.collection.fetch({reset: true});
}*/
});
var HeaderRow = Backgrid.Row.extend({
requiredOptions: ['columns', 'collection'],
initialize: function() {
Backgrid.Row.prototype.initialize.apply(this, arguments);
},
makeCell: function(column, options) {
var headerCell;
switch (true) {
case (column.has('canHeaderSearch') && column.get('canHeaderSearch') === true):
headerCell = new HeaderSearchCell({
column: column,
collection: this.collection,
});
break;
case (column.has('canHeaderFilter') && column.get('canHeaderFilter') === true):
headerCell = new HeaderFilterCell({
column: column,
collection: this.collection,
});
break;
default:
headerCell = new Backbone.View({
tagName: 'td'
});
}
return headerCell;
}
});
var Header = Backgrid.Header.extend({
initialize: function(options) {
var args = Array.prototype.slice.apply(arguments);
Backgrid.Header.prototype.initialize.apply(this, args);
this.searchRow = new HeaderRow({
columns: this.columns,
collection: this.collection
});
},
/**
Renders this table head with a single row of header cells.
*/
render: function() {
var args = Array.prototype.slice.apply(arguments);
Backgrid.Header.prototype.render.apply(this, args);
this.$el.append(this.searchRow.render().$el);
return this;
},
remove: function() {
var args = Array.prototype.slice.apply(arguments);
Backgrid.Header.prototype.remove.apply(this, args);
this.searchRow.remove.apply(this.searchRow, arguments);
return Backbone.View.prototype.remove.apply(this, arguments);
}
});
return Header;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/detail_page/DetailPageLayoutView_tmpl'
], function(require, Backbone, DetailPageLayoutViewTmpl) {
'use strict';
var DetailPageLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends DetailPageLayoutView */
{
_viewName: 'DetailPageLayoutView',
template: DetailPageLayoutViewTmpl,
/** Layout sub regions */
regions: {
REntityDetailTableLayoutView: "#r_entityDetailTableLayoutView",
RSchemaTableLayoutView: "#r_schemaTableLayoutView",
RTagTableLayoutView: "#r_tagTableLayoutView",
RLineageLayoutView: "#r_lineageLayoutView",
},
/** ui selector cache */
ui: {},
/** ui events hash */
events: function() {
var events = {};
return events;
},
/**
* intialize a new DetailPageLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'collection', 'vent'));
this.bindEvents();
this.commonTableOptions = {
collection: this.collection,
includeFilter: false,
includePagination: false,
includePageSize: false,
includeFooterRecords: true,
gridOpts: {
className: "table table-striped table-condensed backgrid table-quickMenu",
emptyText: 'No records found!'
},
filterOpts: {},
paginatorOpts: {}
};
},
bindEvents: function() {
this.listenTo(this.collection, 'reset', function() {
var collectionJSON = this.collection.toJSON();
if (collectionJSON[0].id && collectionJSON[0].id.id) {
var tagGuid = collectionJSON[0].id.id;
}
if (collectionJSON && collectionJSON.length) {
if (collectionJSON[0].values) {
this.name = collectionJSON[0].values.name;
this.description = collectionJSON[0].values.description;
if (this.name) {
this.$('.breadcrumbName').text(this.name);
this.$('.name').show();
this.$('.name').html('<strong>Name: </strong><span>' + this.name + '</span>');
} else {
this.$('.name').hide();
}
if (this.description) {
this.$('.description').show();
this.$('.description').html('<strong>Description: </strong><span>' + this.description + '</span>');
} else {
this.$('.description').hide();
}
}
}
this.renderEntityDetailTableLayoutView();
this.renderTagTableLayoutView(tagGuid);
this.renderLineageLayoutView(tagGuid);
this.renderSchemaLayoutView();
}, this);
},
onRender: function() {},
renderEntityDetailTableLayoutView: function() {
var that = this;
require(['views/entity/EntityDetailTableLayoutView'], function(EntityDetailTableLayoutView) {
that.REntityDetailTableLayoutView.show(new EntityDetailTableLayoutView({
globalVent: that.globalVent,
collection: that.collection
}));
});
},
renderTagTableLayoutView: function(tagGuid) {
var that = this;
require(['views/tag/TagDetailTableLayoutView'], function(TagDetailTableLayoutView) {
that.RTagTableLayoutView.show(new TagDetailTableLayoutView({
globalVent: that.globalVent,
collection: that.collection,
guid: tagGuid
}));
});
},
renderLineageLayoutView: function(tagGuid) {
var that = this;
require(['views/graph/LineageLayoutView'], function(LineageLayoutView) {
that.RLineageLayoutView.show(new LineageLayoutView({
globalVent: that.globalVent,
assetName: that.name,
guid: tagGuid
}));
});
},
renderSchemaLayoutView: function() {
var that = this;
require(['views/schema/SchemaLayoutView'], function(SchemaLayoutView) {
that.RSchemaTableLayoutView.show(new SchemaLayoutView({
globalVent: that.globalVent,
name: that.name,
vent: that.vent
}));
});
},
getTagTableColumns: function() {
var that = this;
return this.collection.constructor.getTableCols({
tag: {
label: "Tag",
cell: "html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var modelObject = model.toJSON();
if (modelObject.$typeName$ && modelObject.instanceInfo) {
return '<a href="#!/dashboard/detailPage/' + modelObject.instanceInfo.guid + '">' + modelObject.instanceInfo.typeName + '</a>';
} else if (!modelObject.$typeName$) {
return '<a href="#!/dashboard/detailPage/' + modelObject.guid + '">' + modelObject.typeName + '</a>';
}
}
})
},
attributes: {
label: "Attributes",
cell: "html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var modelObject = model.toJSON();
if (modelObject.$typeName$ && modelObject.instanceInfo) {
var guid = model.toJSON().instanceInfo.guid;
model.getEntity(guid, {
beforeSend: function() {},
success: function(data) {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.values.name);
},
error: function(error, data, status) {},
complete: function() {}
});
return '<a href="#!/dashboard/detailPage/' + guid + '" data-id="' + guid + '"></a>';
} else if (!modelObject.$typeName$) {
var guid = model.toJSON().guid;
model.getEntity(guid, {
beforeSend: function() {},
success: function(data) {
return that.$('td a[data-id="' + guid + '"]').html(data.definition.values.name);
},
error: function(error, data, status) {},
complete: function() {}
});
return '<a href="#!/dashboard/detailPage/' + guid + '" data-id="' + guid + '"></a>';
}
}
})
}
}, this.collection);
}
});
return DetailPageLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/entity/EntityDetailTableLayoutView_tmpl',
], function(require, Backbone, EntityDetailTableLayoutView_tmpl) {
'use strict';
var EntityDetailTableLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends EntityDetailTableLayoutView */
{
_viewName: 'EntityDetailTableLayoutView',
template: EntityDetailTableLayoutView_tmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
detailValue: "[data-id='detailValue']",
},
/** ui events hash */
events: function() {
var events = {};
return events;
},
/**
* intialize a new EntityDetailTableLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'collection'));
this.collectionObject = this.collection.toJSON();
this.entityModel = new this.collection.model();
},
bindEvents: function() {},
onRender: function() {
this.entityTableGenerate();
},
entityTableGenerate: function() {
var that = this,
table = "",
valueObject = this.collectionObject[0].values;
_.keys(valueObject).map(function(key) {
/* if (key == 'columns')
return;*/
var keyValue = valueObject[key];
if (_.isArray(keyValue)) {
var subLink = "";
for (var i = 0; i < keyValue.length; i++) {
var inputOutputField = keyValue[i];
if (_.isObject(inputOutputField.id)) {
id = inputOutputField.id.id;
} else {
id = inputOutputField.id;
}
that.fetchInputOutputValue(id);
//var coma = (i = 0) ? ('') : (',');
subLink += '<div data-id="' + id + '"></div>';
}
table += '<tr><td>' + key + '</td><td>' + subLink + '</td></tr>';
} else if (_.isObject(keyValue)) {
var id = "";
if (_.isObject(keyValue.id)) {
id = keyValue.id.id;
} else {
id = keyValue.id;
}
that.fetchInputOutputValue(id);
table += '<tr><td>' + key + '</td><td><div data-id="' + id + '"></div></td></tr>';
} else {
if (key == "createTime" || key == "lastAccessTime" || key == "retention") {
table += '<tr><td>' + key + '</td><td>' + new Date(valueObject[key]) + '</td></tr>';
} else {
table += '<tr><td>' + key + '</td><td>' + valueObject[key] + '</td></tr>';
}
}
});
that.ui.detailValue.append(table);
},
fetchInputOutputValue: function(id) {
var that = this;
this.entityModel.getEntity(id, {
beforeSend: function() {},
success: function(data) {
var value = "";
if (data.definition.values.name) {
value = data.definition.values.name;
} else {
value = data.GUID;
}
that.$('td div[data-id="' + data.GUID + '"]').html('<a href="#!/dashboard/detailPage/' + data.GUID + '">' + value + '</a>');
},
error: function(error, data, status) {},
complete: function() {}
});
}
});
return EntityDetailTableLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/graph/LineageLayoutView_tmpl',
'collection/VLineageList',
'models/VEntity',
'dagreD3',
'd3-tip'
], function(require, Backbone, LineageLayoutViewtmpl, VLineageList, VEntity, dagreD3, d3Tip) {
'use strict';
var LineageLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends LineageLayoutView */
{
_viewName: 'LineageLayoutView',
template: LineageLayoutViewtmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
graph: ".graph"
},
/** ui events hash */
events: function() {
var events = {};
return events;
},
/**
* intialize a new LineageLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'assetName', 'guid'));
this.inputCollection = new VLineageList();
this.outputCollection = new VLineageList();
this.entityModel = new VEntity();
this.inputCollection.url = "/api/atlas/lineage/hive/table/" + this.assetName + "/inputs/graph";
this.outputCollection.url = "/api/atlas/lineage/hive/table/" + this.assetName + "/outputs/graph";
this.bindEvents();
this.fetchGraphData();
this.data = {};
this.fetchList = 0
},
bindEvents: function() {
this.listenTo(this.inputCollection, 'reset', function() {
$('.lineageLayout').show();
this.generateData(this.inputCollection, 'input');
this.outputCollection.fetch({ reset: true });
}, this);
this.listenTo(this.outputCollection, 'reset', function() {
$('.lineageLayout').show();
this.generateData(this.outputCollection, 'output');
this.outputState = true;
}, this);
this.listenTo(this.outputCollection, 'error', function() {
this.$('.fontLoader').hide();
$('.lineageLayout').hide();
}, this);
this.listenTo(this.inputCollection, 'error', function() {
this.$('.fontLoader').hide();
this.$('.lineageLayout').hide();
}, this);
},
onRender: function() {
this.$('.fontLoader').show();
this.g = new dagreD3.graphlib.Graph()
.setGraph({})
.setDefaultEdgeLabel(function() {
return {};
});
},
fetchGraphData: function() {
this.inputCollection.fetch({ reset: true });
},
generateData: function(collection, type) {
var that = this;
function addValueInObject(data) {
var obj = {};
if (data && data.definition && data.definition.values) {
var values = data.definition.values;
obj['label'] = values.name
obj['id'] = data.GUID;
if (values.queryText) {
obj['queryText'] = values.queryText;
}
} else {
obj['label'] = vertices[val].values.name;
}
obj['class'] = "type-TOP";
that.g.setNode(data.GUID, obj);
--that.fetchList;
if (that.fetchList <= 0) {
if (that.edgesAndvertices) {
that.createGraph(that.edgesAndvertices, that.startingPoint);
} else if (this.outputState && !that.edgesAndvertices) {
that.$('svg').height('100');
that.$('svg').html('<text x="' + (that.$('svg').width() - 150) / 2 + '" y="' + that.$('svg').height() / 2 + '" fill="black">No lineage data found</text>');
that.$('.fontLoader').hide();
}
}
}
function fetchLoadProcess(id) {
++that.fetchList
that.entityModel.getEntity(id, {
beforeSend: function() {},
success: function(data) {
addValueInObject(data);
},
error: function(error, data, status) {},
complete: function() {}
});
}
function makeNode(c) {
var edges = c.edges,
vertices = c.vertices,
allKeys = [];
_.each(c.edges, function(val, key, obj) {
allKeys.push(key)
_.each(val, function(val1, key1, obj1) {
allKeys.push(val1)
});
});
var uniquNode = _.uniq(allKeys);
_.each(uniquNode, function(val, key) {
var obj = {}
if (vertices[val] && vertices[val].values) {
obj['label'] = vertices[val].values.name;
obj['id'] = val;
obj['class'] = "type-TOP";
obj['typeName'] = vertices[val].values.vertexId.values.typeName;
that.g.setNode(val, obj);
} else {
fetchLoadProcess(val);
}
});
}
_.each(collection.models, function(values) {
var valuObj = values.get('values');
that.startingPoint = [];
if (!_.isEmpty(valuObj.edges)) {
if (type == "input") {
that.edgesAndvertices = {
edges: {},
vertices: valuObj.vertices
}
_.each(valuObj.edges, function(val, key, obj) {
_.each(val, function(val1, key1, obj1) {
var chiledParent = {};
if (!obj[val1]) {
that.startingPoint.push(val1)
}
that.edgesAndvertices.edges[val1] = [key];
});
});
} else {
that.edgesAndvertices = valuObj;
that.startingPoint = [that.guid];
}
makeNode(that.edgesAndvertices);
} else {
if (type == 'output') {
that.outputState = true;
}
}
});
if (this.fetchList <= 0) {
if (this.edgesAndvertices) {
this.createGraph(that.edgesAndvertices, this.startingPoint);
} else if (this.outputState && !this.edgesAndvertices) {
this.$('.fontLoader').hide();
that.$('svg').height('100');
that.$('svg').html('<text x="' + (that.$('svg').width() - 150) / 2 + '" y="' + that.$('svg').height() / 2 + '" fill="black">No lineage data found</text>');
}
}
},
createGraph: function(edgesAndvertices, startingPoint) {
var that = this;
this.g.nodes().forEach(function(v) {
var node = that.g.node(v);
// Round the corners of the nodes
node.rx = node.ry = 5;
});
// Set up edges, no special attributes.
// For input
var lastVal = "";
_.each(startingPoint, function(val, key, obj) {
that.g.setEdge(val, edgesAndvertices.edges[val][0]);
lastVal = edgesAndvertices.edges[val][0];
});
createRemaningEdge(edgesAndvertices.edges, lastVal);
function createRemaningEdge(obj, starting) {
if (obj[starting] && obj[starting].length) {
that.g.setEdge(starting, obj[starting]);
createRemaningEdge(obj, obj[starting]);
}
}
if (this.outputState) {
// Create the renderer
var render = new dagreD3.render();
// Set up an SVG group so that we can translate the final graph.
var svg = d3.select(this.$("svg")[0]),
svgGroup = svg.append("g");
var zoom = d3.behavior.zoom().on("zoom", function() {
svgGroup.attr("transform", "translate(" + d3.event.translate + ")" +
"scale(" + d3.event.scale + ")");
});
var tooltip = d3Tip()
.attr('class', 'd3-tip')
.html(function(d) {
var value = that.g.node(d)
var htmlStr = "<h5>Name: <span style='color:#359f89'>" + value.label + "</span></h5> ";
if (value.queryText) {
htmlStr += "<h5>Query: <span style='color:#359f89'>" + value.queryText + "</span></h5> "
}
return htmlStr;
});
svg.call(zoom)
.call(tooltip);
this.$('.fontLoader').hide();
// Run the renderer. This is what draws the final graph.
this.g.graph().rankDir = 'LR';
//render(d3.select(this.$("svg g")[0]), this.g);
render(svgGroup, this.g);
svg.on("dblclick.zoom", function() {
return null;
})
svgGroup.selectAll("g.nodes g.node")
.on('mouseover', function(d) {
tooltip.show(d);
})
.on('dblclick', function(d) {
tooltip.hide(d);
Backbone.history.navigate("#!/dashboard/detailPage/" + d, { trigger: true });
})
.on('mouseout', function(d) {
tooltip.hide(d);
});
// Center the graph
var initialScale = 1.5;
zoom.translate([(this.$('svg').width() - this.g.graph().width * initialScale) / 2, (this.$('svg').height() - this.g.graph().height * initialScale) / 2])
.scale(initialScale)
.event(svg);
//svg.attr('height', this.g.graph().height * initialScale + 40);
}
}
});
return LineageLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/schema/SchemaTableLayoutView_tmpl',
'collection/VSchemaList',
'utils/Utils',
], function(require, Backbone, SchemaTableLayoutViewTmpl, VSchemaList, Utils) {
'use strict';
var SchemaTableLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends SchemaTableLayoutView */
{
_viewName: 'SchemaTableLayoutView',
template: SchemaTableLayoutViewTmpl,
/** Layout sub regions */
regions: {
RTagLayoutView: "#r_tagLayoutView",
},
/** ui selector cache */
ui: {
tagClick: '[data-id="tagClick"]',
DetailValue: "[data-id='detailValue']",
addTag: "[data-id='addTag']",
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.addTag] = function(e) {
this.onClickSchemaTag(e);
},
events["click " + this.ui.tagClick] = function(e) {
if (e.target.nodeName.toLocaleLowerCase() == "i") {
this.onClickTagCross(e);
} else {
var value = e.currentTarget.text;
Utils.setUrl({
url: '#!/dashboard/assetPage',
urlParams: {
query: value
},
mergeBrowserUrl: false,
trigger: true
});
}
};
return events;
},
/**
* intialize a new SchemaTableLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'name', 'vent'));
this.schemaCollection = new VSchemaList([], {});
this.schemaCollection.url = "/api/atlas/lineage/hive/table/" + this.name + "/schema";
this.commonTableOptions = {
collection: this.schemaCollection,
includeFilter: false,
includePagination: false,
includePageSize: false,
includeFooterRecords: true,
gridOpts: {
className: "table table-striped table-condensed backgrid table-quickMenu",
emptyText: 'No records found!'
},
filterOpts: {},
paginatorOpts: {}
};
this.bindEvents();
},
bindEvents: function() {
this.listenTo(this.schemaCollection, "reset", function(value) {
this.renderTableLayoutView();
$('.schemaTable').show();
}, this);
this.listenTo(this.schemaCollection, "error", function(value) {
$('.schemaTable').hide();
}, this);
},
onRender: function() {
this.schemaCollection.fetch({ reset: true });
this.renderTableLayoutView();
},
renderTableLayoutView: function() {
var that = this;
require(['utils/TableLayout'], function(TableLayout) {
var cols = new Backgrid.Columns(that.getSchemaTableColumns());
that.RTagLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, {
globalVent: that.globalVent,
columns: cols,
gridOpts: {
className: "table table-bordered table-hover table-condensed backgrid table-quickMenu",
},
})));
});
},
getSchemaTableColumns: function() {
var that = this;
return this.schemaCollection.constructor.getTableCols({
name: {
label: "Name",
cell: "Html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return '<div><a href="#!/dashboard/detailPage/' + model.get('$id$').id + '">' + rawValue + '</a></div>';
}
})
},
comment: {
label: "Comment",
cell: "html",
editable: false,
sortable: false
},
dataType: {
label: "DataType",
cell: "html",
editable: false,
sortable: false
},
tag: {
label: "Tags",
cell: "Html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var traits = model.get('$traits$');
var atags = "";
_.keys(model.get('$traits$')).map(function(key) {
atags += '<a data-id="tagClick">' + traits[key].$typeName$ + '<i class="fa fa-times" data-id="delete" data-name="' + traits[key].$typeName$ + '" data-guid="' + model.get('$id$').id + '" ></i></a>';
});
return '<div class="tagList">' + atags + '</div>';
}
})
},
addTag: {
label: "Tools",
cell: "Html",
editable: false,
sortable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return '<a href="javascript:void(0);" data-id="addTag" data-guid="' + model.get('$id$').id + '"><i class="fa fa-tag"></i></a>';
}
})
}
}, this.schemaCollection);
},
onClickSchemaTag: function(e) {
var that = this;
require(['views/tag/addTagModalView'], function(addTagModalView) {
var view = new addTagModalView({
vent: that.vent,
guid: that.$(e.currentTarget).data("guid"),
modalCollection: that.schemaCollection
});
// view.saveTagData = function() {
//override saveTagData function
// }
});
},
onClickTagCross: function(e) {
var tagName = $(e.target).data("name");
var that = this;
require([
'modules/Modal'
], function(Modal) {
var modal = new Modal({
title: 'Are you sure you want to delete ?',
okText: 'Delete',
htmlContent: "<b>Tag: " + tagName + "</b>",
cancelText: "Cancel",
allowCancel: true,
okCloses: true,
showFooter: true,
}).open();
modal.on('ok', function() {
that.deleteTagData(e);
});
modal.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
deleteTagData: function(e) {
var that = this,
tagName = $(e.target).data("name");
var guid = $(e.target).data("guid");
require(['models/VTag'], function(VTag) {
var tagModel = new VTag();
tagModel.deleteTag(guid, tagName, {
beforeSend: function() {},
success: function(data) {
that.schemaCollection.fetch({ reset: true });
},
error: function(error, data, status) {},
complete: function() {}
});
});
}
});
return SchemaTableLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/search/SearchLayoutView_tmpl',
'utils/Utils',
], function(require, Backbone, SearchLayoutViewTmpl, Utils) {
'use strict';
var SearchLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends SearchLayoutView */
{
_viewName: 'SearchLayoutView',
template: SearchLayoutViewTmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
searchButton: '[data-id="searchButton"]',
searchInput: '[data-id="searchInput"]',
searchType: 'input[name="queryType"]'
},
/** ui events hash */
events: function() {
var events = {},
that = this;
events["click " + this.ui.searchButton] = 'onSearchButtonClick';
events["keyup " + this.ui.searchInput] = function(e) {
var code = e.which;
if (code == 13) {
Utils.setUrl({
url: '#!/dashboard/assetPage',
urlParams: {
query: this.ui.searchInput.val(),
searchType: this.type
},
mergeBrowserUrl: false,
trigger: false
});
that.onSearchButtonClick(e.currentTarget.value);
}
};
events["change " + this.ui.searchType] = function(e) {
this.type = e.currentTarget.value;
if (this.ui.searchInput.val() !== "") {
this.onSearchButtonClick();
}
this.ui.searchInput.attr("placeholder", this.type == "dsl" ? 'Search using a DSL query: e.g. DataSet where name="sales_fact "' : 'Search using a query string: e.g. sales_fact');
Utils.setUrl({
url: '#!/dashboard/assetPage',
urlParams: {
query: this.ui.searchInput.val(),
searchType: this.type
},
mergeBrowserUrl: false,
trigger: false
});
};
return events;
},
/**
* intialize a new SearchLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'vent'));
this.bindEvents();
this.type = "fulltext";
},
bindEvents: function() {
this.listenTo(this.vent, "tag:click", function(tagvalues) {
if (tagvalues.searchType) {
this.type = tagvalues.searchType;
this.$('input[name="queryType"][value=' + this.type + ']').prop('checked', true);
}
if (tagvalues.query) {
this.ui.searchInput.val(tagvalues.query);
this.triggerSearch(tagvalues.query);
}
}, this);
},
onRender: function() {},
onSearchButtonClick: function(e) {
this.triggerSearch(this.ui.searchInput.val());
},
triggerSearch: function(value) {
this.vent.trigger("search:click", { 'query': value, type: this.type });
}
});
return SearchLayoutView;
});
/**
* 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.
*/
define(['require',
'hbs!tmpl/site/header',
], function(require, tmpl) {
'use strict';
var Header = Marionette.LayoutView.extend({
template: tmpl,
templateHelpers: function() {
return {
urlType: this.urlType
};
},
regions: {},
events: {},
initialize: function(options) {
var url = window.location.href.split("/");
this.urlType = url[url.length - 1];
/*if we us only old ui then uncomment this condition*/
if (this.urlType == "") {
this.urlType = "assetPage";
}
},
onRender: function() {},
addTagsFileds: function() {
var that = this;
require(['views/tag/createTagsLayoutView'], function(createTagsLayoutView) {
var view = new createTagsLayoutView({
vent: that.vent
});
});
}
});
return Header;
});
/**
* 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.
*/
define(['require',
'hbs!tmpl/site/footer'
], function(require, tmpl) {
'use strict';
var Footer = Marionette.LayoutView.extend({
template: tmpl,
templateHelpers: function() {},
regions: {},
events: {},
initialize: function(options) {},
onRender: function() {}
});
return Footer;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/tag/TagDetailTableLayoutView_tmpl'
], function(require, Backbone, TagDetailTableLayoutView_tmpl) {
'use strict';
var TagDetailTableLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends TagDetailTableLayoutView */
{
_viewName: 'TagDetailTableLayoutView',
template: TagDetailTableLayoutView_tmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
detailValue: "[data-id='detailValue']",
addTag: "[data-id='addTag']",
deleteTag: "[data-id='delete']",
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.addTag] = function(e) {
this.addModalView(e);
};
events["click " + this.ui.deleteTag] = function(e) {
this.deleteTagDataModal(e);
};
return events;
},
/**
* intialize a new EntityDetailTableLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'collection', 'guid'));
this.collectionObject = this.collection.toJSON();
},
bindEvents: function() {},
onRender: function() {
this.tagTableGenerate();
},
tagTableGenerate: function() {
var that = this,
table = "",
valueObject = this.collectionObject[0].traits;
if (_.isEmpty(valueObject)) {
this.$(".noTags").show();
} else {
this.$(".noTags").hide();
_.keys(valueObject).map(function(key) {
var keyValue = valueObject[key];
var tagValue = 'NA';
if (_.isObject(keyValue)) {
//tagValue = "";
if (!_.isEmpty(keyValue.values)) {
var stringArr = [];
tagValue = "";
_.each(keyValue.values, function(val, key) {
var attrName = "<span>" + key + ":" + val + "</span>";
stringArr.push(attrName);
});
tagValue += stringArr.join(", ");
}
table += '<tr><td>' + keyValue.typeName + '</td><td>' + tagValue + '</td><td>' + '<a href="javascript:void(0)"><i class="fa fa-trash" data-id="delete" data-name="' + keyValue.typeName + '"></i></a></tr>';
} else {}
});
that.ui.detailValue.append(table);
}
},
addModalView: function(e) {
var that = this;
require(['views/tag/addTagModalView'], function(addTagModalView) {
var view = new addTagModalView({
vent: that.vent,
guid: that.guid,
modalCollection: that.collection
});
// view.saveTagData = function() {
//override saveTagData function
// }
});
},
deleteTagDataModal: function(e) {
var tagName = $(e.currentTarget).data("name");
var that = this;
require([
'modules/Modal'
], function(Modal) {
var modal = new Modal({
title: 'Are you sure you want to delete ?',
okText: 'Delete',
htmlContent: "<b>Tag: " + tagName + "</b>",
cancelText: "Cancel",
allowCancel: true,
okCloses: true,
showFooter: true,
}).open();
modal.on('ok', function() {
that.deleteTagData(e);
});
modal.on('closeModal', function() {
modal.trigger('cancel');
});
});
},
deleteTagData: function(e) {
var that = this,
tagName = $(e.currentTarget).data("name");
require(['models/VTag'], function(VTag) {
var tagModel = new VTag();
tagModel.deleteTag(that.guid, tagName, {
beforeSend: function() {},
success: function(data) {
that.collection.fetch({ reset: true });
},
error: function(error, data, status) {},
complete: function() {}
});
});
}
});
return TagDetailTableLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/tag/TagLayoutView_tmpl',
'collection/VTagList',
'utils/Utils',
], function(require, Backbone, TagLayoutViewTmpl, VTagList, Utils) {
'use strict';
var TagLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends TagLayoutView */
{
_viewName: 'TagLayoutView',
template: TagLayoutViewTmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {
listTag: "[data-id='listTag']",
listType: "[data-id='listType']",
tagElement: "[data-id='tags']",
referesh: "[data-id='referesh']",
searchTag: "[data-id='searchTag']"
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.tagElement] = 'onTagClick';
events["click " + this.ui.referesh] = 'refereshClick';
events["keyup " + this.ui.searchTag] = 'offlineSearchTag';
return events;
},
/**
* intialize a new TagLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'vent'));
this.tagCollection = new VTagList();
$.extend(this.tagCollection.queryParams, { type: 'TRAIT' });
this.typeCollection = new VTagList();
$.extend(this.typeCollection.queryParams, { type: 'CLASS' });
this.bindEvents();
},
bindEvents: function() {
this.listenTo(this.tagCollection, 'reset', function() {
this.tagsAndTypeGenerator('tagCollection', 'listTag');
}, this);
this.listenTo(this.typeCollection, 'reset', function() {
this.tagsAndTypeGenerator('typeCollection', 'listType');
}, this);
},
onRender: function() {
this.fetchCollections();
},
fetchCollections: function() {
this.tagCollection.fetch({ reset: true });
this.typeCollection.fetch({ reset: true });
},
tagsAndTypeGenerator: function(collection, element, searchString) {
if (element == "listType") {
var searchType = "dsl";
var icon = "fa fa-cogs"
} else {
var searchType = "fulltext";
var icon = "fa fa-tags"
}
var str = '';
_.each(this[collection].fullCollection.models, function(model) {
var tagName = model.get("tags");
if (searchString) {
if (tagName.search(new RegExp(searchString, "i")) != -1) {
str += '<a href="javascript:void(0)" data-id="tags" data-type="' + searchType + '" class="list-group-item"><i class="' + icon + '"></i>' + tagName + '</a>';
} else {
return;
}
} else {
str += '<a href="javascript:void(0)" data-id="tags" data-type="' + searchType + '" class="list-group-item"><i class="' + icon + '"></i>' + tagName + '</a>';
}
});
this.ui[element].empty().append(str);
},
onTagClick: function(e) {
var data = $(e.currentTarget).data();
this.vent.trigger("tag:click", { 'query': e.currentTarget.text, 'searchType': data.type });
Utils.setUrl({
url: '#!/dashboard/assetPage',
urlParams: {
query: e.currentTarget.text,
searchType: data.type
},
mergeBrowserUrl: true,
trigger: false
});
},
refereshClick: function() {
this.fetchCollections();
},
offlineSearchTag: function(e) {
var type = $(e.currentTarget).data('type');
var collectionType = type == "listTag" ? "tagCollection" : "typeCollection";
this.tagsAndTypeGenerator(collectionType, type, $(e.currentTarget).val());
}
});
return TagLayoutView;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/tag/addTagAttributeItemView_tmpl',
], function(require, Backbone, addTagAttributeItemViewTmpl) {
'use strict';
return Backbone.Marionette.ItemView.extend(
/** @lends GlobalExclusionListView */
{
template: addTagAttributeItemViewTmpl,
/** Layout sub regions */
regions: {},
/** ui selector cache */
ui: {},
/** ui events hash */
events: {
'click #close': 'onCloseButton',
'change input': function(e) {
this.saveBtn.removeAttr("disabled");
this.model.set({ name: e.currentTarget.value });
},
'keypress #attributeId': function(e) {
if (this.$(e.currentTarget).val() == "") {
this.saveBtn.removeAttr("disabled");
}
},
'keyup #attributeId': function(e) {
if (e.keyCode == 8 && this.$(e.currentTarget).val() == "") {
this.saveBtn.attr("disabled", "true");
}
},
},
/**
* intialize a new GlobalExclusionComponentView Layout
* @constructs
*/
initialize: function(options) {
this.saveBtn = options.saveBtn;
},
onRender: function() {},
bindEvents: function() {},
onCloseButton: function() {
this.model.destroy();
this.saveBtn.removeAttr("disabled");
}
});
});
/**
* 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.
*/
define(['require',
'hbs!tmpl/tag/addTagModalView_tmpl',
'collection/VTagList',
'collection/VCommonList',
'modules/Modal',
'models/VEntity',
'utils/Utils'
], function(require, addTagModalViewTmpl, VTagList, VCommonList, Modal, VEntity, Utils) {
'use strict';
var AddTagModel = Marionette.LayoutView.extend({
template: addTagModalViewTmpl,
regions: {},
ui: {
addTagOptions: "[data-id='addTagOptions']",
tagAttribute: "[data-id='tagAttribute']"
},
events: {
'change #addTagID': 'onChangeTagDefination'
},
/**
* intialize a new AddTagModel Layout
* @constructs
*/
initialize: function(options) {
var that = this;
_.extend(this, _.pick(options, 'vent', 'modalCollection', 'guid'));
this.collection = new VTagList();
this.commonCollection = new VCommonList();
var modal = new Modal({
title: 'Add Tag',
content: this,
okText: 'Save',
cancelText: "Cancel",
allowCancel: true,
}).open();
this.on('ok', function() {
that.saveTagData();
});
this.on('closeModal', function() {
modal.trigger('cancel');
});
this.bindEvents();
},
onRender: function() {
$.extend(this.collection.queryParams, { type: 'TRAIT' });
this.collection.fetch({ reset: true });
},
bindEvents: function() {
this.listenTo(this.collection, 'reset', function() {
this.tagsCollection();
}, this);
this.listenTo(this.commonCollection, 'reset', function() {
this.subAttributeData();
}, this);
},
tagsCollection: function() {
for (var i = 0; i < this.collection.fullCollection.models.length; i++) {
var tags = this.collection.fullCollection.models[i].get("tags");
var str = '<option>' + tags + '</option>';
this.ui.addTagOptions.append(str);
}
},
onChangeTagDefination: function() {
this.ui.tagAttribute.empty();
var tagname = this.ui.addTagOptions.val();
this.fetchTagSubData(tagname);
},
fetchTagSubData: function(tagname) {
this.commonCollection.url = "/api/atlas/types/" + tagname;
this.commonCollection.modelAttrName = 'definition';
this.commonCollection.fetch({ reset: true });
},
subAttributeData: function() {
if (this.commonCollection.models[0] && this.commonCollection.models[0].attributes && this.commonCollection.models[0].attributes.traitTypes[0].attributeDefinitions) {
for (var i = 0; i < this.commonCollection.models[0].attributes.traitTypes[0].attributeDefinitions.length; i++) {
var attribute = this.commonCollection.models[0].attributes.traitTypes[0].attributeDefinitions;
this.ui.tagAttribute.show();
this.strAttribute = '<label class="control-label col-sm-4 ng-binding">' + attribute[i].name + '</label>' +
'<div class="col-sm-8 input-spacing">' +
'<input type="text" class="form-control attributeInputVal attrName" data-key="' + attribute[i].name + '" ></input></div>';
this.ui.tagAttribute.append(this.strAttribute);
if (this.commonCollection.models[0].attributes.traitTypes[0].superTypes.length > 0) {
for (var j = 0; j < this.commonCollection.models[0].attributes.traitTypes[0].superTypes.length; j++) {
var superTypeAttr = this.commonCollection.models[0].attributes.traitTypes[0].superTypes[j];
this.fetchTagSubData(superTypeAttr);
}
}
}
}
},
saveTagData: function() {
var that = this,
values = {};
this.entityModel = new VEntity();
var names = this.$(".attrName");
names.each(function(i, item) {
var selection = $(item).data("key");
values[selection] = $(item).val();
});
var tagName = this.ui.addTagOptions.val();
var json = {
"jsonClass": "org.apache.atlas.typesystem.json.InstanceSerialization$_Struct",
"typeName": tagName,
"values": values
};
that.entityModel.saveEntity(that.guid, {
data: JSON.stringify(json),
beforeSend: function() {},
success: function(data) {
that.modalCollection.fetch({ reset: true });
Utils.notifySuccess({
content: "Tag " + tagName + " has been added to entity"
});
},
error: function(error, data, status) {
if (error && error.responseText) {
var data = JSON.parse(error.responseText);
Utils.notifyError({
content: data.error
});
}
},
complete: function() {}
});
},
});
return AddTagModel;
});
/**
* 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.
*/
define(['require',
'backbone',
'hbs!tmpl/tag/createTagLayoutView_tmpl',
'views/tag/addTagAttributeItemView',
'utils/Utils'
], function(require, Backbone, createTagLayoutViewTmpl, addTagAttributeItemView, Utils) {
'use strict';
var CreateTagView = Marionette.CompositeView.extend({
template: createTagLayoutViewTmpl,
regions: {},
childView: addTagAttributeItemView,
childViewContainer: "div[data-id='addAttributeDiv']",
childViewOptions: function() {
return {
saveBtn: this.ui.saveButton
};
},
/** ui selector cache */
ui: {
parentTag: "[data-id='parentTag']",
addAttrBtn: "[data-id='addAttrBtn']",
refreshBtn: "[data-id='refreshBtn']",
typeName: "[data-id='typeName']",
saveButton: "[data-id='saveButton']"
},
events: function() {
var events = {},
that = this;
events["click " + this.ui.refreshBtn] = 'onRefreshClick';
events["click " + this.ui.addAttrBtn] = 'onAddAttribute';
events["keypress " + this.ui.typeName] = 'onTypeName';
events["keyup " + this.ui.typeName] = 'onBackSpceName';
events["click " + this.ui.saveButton] = 'onSaveButton';
return events;
},
/**
* intialize a new createTagLayoutView_tmpl Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'globalVent', 'tagsCollection'));
this.collection = new Backbone.Collection();
this.bindEvents();
this.json = {
"enumTypes": [],
"traitTypes": [],
"structTypes": [],
"classTypes": []
};
},
bindEvents: function() {
this.listenTo(this.tagsCollection, 'reset', function() {
this.tagsCollectionList();
}, this);
},
onRender: function() {
this.fetchCollection();
},
tagsCollectionList: function() {
this.ui.parentTag.empty();
for (var i = 0; i < this.tagsCollection.fullCollection.models.length; i++) {
var tags = this.tagsCollection.fullCollection.models[i].get("tags");
var str = '<option>' + tags + '</option>';
this.ui.parentTag.append(str);
}
},
fetchCollection: function() {
$.extend(this.tagsCollection.queryParams, { type: 'TRAIT' });
this.tagsCollection.fetch({ reset: true });
},
onRefreshClick: function() {
this.fetchCollection();
},
onAddAttribute: function(e) {
e.preventDefault();
this.collection.add(new Backbone.Model({
"dataTypeName": "string",
"multiplicity": "optional",
"isComposite": false,
"isUnique": false,
"isIndexable": true,
"reverseAttributeName": null
}));
if (this.ui.addAttrBtn.val() == "") {
this.ui.saveButton.attr("disabled", "true");
}
},
onTypeName: function() {
if (this.ui.typeName.val() == "") {
this.ui.saveButton.removeAttr("disabled");
this.ui.addAttrBtn.removeAttr("disabled");
}
},
onBackSpceName: function(e) {
if (e.keyCode == 8 && this.ui.typeName.val() == "") {
this.ui.saveButton.attr("disabled", "true");
this.ui.addAttrBtn.attr("disabled", "true");
}
},
onSaveButton: function() {
var that = this;
this.name = this.ui.typeName.val();
this.json.traitTypes[0] = {
attributeDefinitions: this.collection.toJSON(),
typeName: this.name,
typeDescription: null,
superTypes: this.ui.parentTag.val(),
hierarchicalMetaTypeName: "org.apache.atlas.typesystem.types.TraitType"
};
new this.tagsCollection.model().set(this.json).save(null, {
success: function(model, response) {
that.fetchCollection();
that.ui.typeName.val("");
that.ui.saveButton.attr("disabled", "true");
Utils.notifySuccess({
content: that.name + " has been created"
});
that.collection.reset();
},
error: function(model, response) {
if (response.responseJSON && response.responseJSON.error) {
Utils.notifyError({
content: response.responseJSON.error
});
}
}
});
}
});
return CreateTagView;
});
......@@ -334,6 +334,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<node.version>v0.10.30</node.version>
<node-for-v2.version>v4.4.2</node-for-v2.version>
<slf4j.version>1.7.7</slf4j.version>
<jetty.version>9.2.12.v20150709</jetty.version>
<jersey.version>1.19</jersey.version>
......@@ -432,6 +433,7 @@
<module>titan</module>
<module>repository</module>
<module>dashboard</module>
<!-- <module>dashboardv2</module> -->
<module>webapp</module>
<module>docs</module>
<module>addons/hdfs-model</module>
......@@ -1018,6 +1020,13 @@
<dependency>
<groupId>org.apache.atlas</groupId>
<artifactId>atlas-dashboardv2</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.apache.atlas</groupId>
<artifactId>atlas-webapp</artifactId>
<version>${project.version}</version>
<type>war</type>
......@@ -1617,6 +1626,15 @@
<exclude>*.json</exclude>
<exclude>**/overlays/**</exclude>
<exclude>dev-support/**</exclude>
<exclude>**/public/css/animate.min.css</exclude>
<exclude>**/public/css/fonts/**</exclude>
<exclude>**/public/css/font-awesome.min.css</exclude>
<exclude>**/public/js/require-handlebars-plugin/**</exclude>
<exclude>**/node_modules/**</exclude>
<!-- All the npm plugins are copied here, so exclude it -->
<exclude>**/public/js/libs/**</exclude>
</excludes>
</configuration>
<executions>
......
......@@ -14,6 +14,7 @@ ATLAS-409 Atlas will not import avro tables with schema read from a file (dosset
ATLAS-379 Create sqoop and falcon metadata addons (venkatnrangan,bvellanki,sowmyaramesh via shwethags)
ALL CHANGES:
ATLAS-582 Move Atlas UI to use backboneJS (kevalbhatt18 via shwethags)
ATLAS-540 API to retrieve entity version events (shwethags)
ATLAS-529 support drop database (sumasai)
ATLAS-528 Support drop table,view (sumasai)
......
......@@ -235,6 +235,12 @@
<artifactId>atlas-dashboard</artifactId>
<type>war</type>
</dependency>
<!-- <dependency>
<groupId>org.apache.atlas</groupId>
<artifactId>atlas-dashboardv2</artifactId>
<type>war</type>
</dependency> -->
</dependencies>
<build>
......@@ -249,6 +255,10 @@
<groupId>org.apache.atlas</groupId>
<artifactId>atlas-dashboard</artifactId>
</overlay>
<!-- <overlay>
<groupId>org.apache.atlas</groupId>
<artifactId>atlas-dashboardv2</artifactId>
</overlay> -->
<overlay>
<!-- empty groupId/artifactId represents the current build -->
</overlay>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment