提交 d1402a4a 编写于 作者: B break60 提交者: lgcareer

Front-end compliance modification (#1545)

上级 86677dfd
/*
* 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.
*/
var fs = require('fs')
var path = require('path')
var request = require('request')
var cdnUrl = 'https://s1.analysys.cn/libs/??'
var version = '1.0.0'
// js集合
var jslibs = {
'es5': [
'es5-shim/4.5.7/es5-shim.min.js',
'es5-shim/4.5.7/es5-sham.min.js'
],
'3rd': [
'vue/2.5.2/vue.js',
'vue-router/2.7.0/vue-router.min.js',
'vuex/3.0.0/vuex.min.js',
'jquery/3.3.1/jquery.min.js',
'lodash.js/4.17.5/lodash.min.js',
'jqueryui/1.12.1/jquery-ui.min.js',
'twitter-bootstrap/3.3.7/js/bootstrap.min.js',
'jsPlumb/2.8.5/js/jsplumb.min.js',
'clipboard.js/2.0.1/clipboard.min.js',
'd3/3.3.6/d3.min.js',
'echarts/4.1.0/echarts.min.js',
'dayjs/1.7.8/dayjs.min.js',
'codemirror/5.43.0/codemirror.min.js',
'codemirror/5.43.0/mode/sql/sql.min.js',
'codemirror/5.43.0/addon/hint/show-hint.min.js',
'codemirror/5.43.0/addon/hint/sql-hint.min.js',
'codemirror/5.43.0/mode/textile/textile.min.js',
'codemirror/5.43.0/mode/shell/shell.min.js',
'codemirror/5.43.0/mode/python/python.min.js',
'codemirror/5.43.0/addon/hint/xml-hint.min.js',
'codemirror/5.43.0/mode/xml/xml.min.js',
'html2canvas/0.5.0-beta4/html2canvas.min.js',
'canvg/1.5/canvg.min.js'
],
'local': []
}
// css
csslibs = {
'base': [
'normalize/7.0.0/normalize.min.css',
'twitter-bootstrap/3.3.7/css/bootstrap.min.css',
'-/@analysys/reset.css@1.0.1',
'-/@vue/animate.css@'
],
'3rd': [
'highlight.js/9.13.1/styles/vs.min.css',
'jsPlumb/2.8.5/css/jsplumbtoolkit-defaults.min.css',
'codemirror/5.43.0/codemirror.min.css',
'codemirror/5.20.0/theme/mdn-like.min.css',
'codemirror/5.43.0/addon/hint/show-hint.min.css'
]
}
// Create folder directory
var dirPath = path.resolve(__dirname, '..', 'src/combo/' + version)
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath)
console.log('Folder created successfully')
} else {
console.log('Folder already exists')
}
var jsKeys = Object.keys(jslibs)
var jsUrl = jsKeys.map(v => {
return jslibs[v].join()
})
jsUrl.forEach((v, i) => {
var url = cdnUrl + v
console.log(url)
var stream = fs.createWriteStream(path.join(dirPath, jsKeys[i] + '.js'), { encoding: 'utf-8' })
request(url).pipe(stream).on('close', function (err) {
if (!err) {
console.log('file[' + version + '/' + jsKeys[i] + '.js' + ']Download completed')
}
})
})
var cssKeys = Object.keys(csslibs)
var cssUrl = cssKeys.map(v => {
return csslibs[v].join()
})
cssUrl.forEach((v, i) => {
var url = cdnUrl + v
console.log(url)
var stream = fs.createWriteStream(path.join(dirPath, cssKeys[i] + '.css'), { encoding: 'utf-8' })
request(url).pipe(stream).on('close', function (err) {
if (!err) {
console.log('file[' + version + '/' + cssKeys[i] + '.css' + ']Download completed')
}
})
})
......@@ -18,8 +18,9 @@
const path = require('path')
const glob = require('globby')
const webpack = require('webpack')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const HtmlWebpackExtPlugin = require('html-webpack-ext-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const isProduction = process.env.NODE_ENV !== 'development'
const resolve = dir => path.join(__dirname, '..', dir)
......@@ -106,7 +107,7 @@ const pages = glob.sync(['*/!(_*).html'], { cwd: viewDir }).map(p => {
}
return new HtmlWebpackPlugin({
filename: newPagePath || path.join('view', p),
template: `html-loader?min=false!${path.join(viewDir, p)}`,
template: `${path.join('src/view', p)}`,
cache: true,
inject: true,
chunks: chunks,
......@@ -121,14 +122,15 @@ const baseConfig = {
publicPath: '/',
filename: 'js/[name].[chunkhash:7].js'
},
devServer: {
historyApiFallback: true,
hot: true,
inline: true,
progress: true
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: !isProduction
}
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
......@@ -142,10 +144,41 @@ const baseConfig = {
}
]
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: !isProduction,
},
},
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}),
require('cssnano')
]
}
},
'sass-loader'
]
},
{
test: /\.(png|jpe?g|gif|svg|cur)(\?.*)?$/,
loader: 'file-loader',
options: {
esModule: false,
name: 'images/[name].[ext]?[hash]'
}
},
......@@ -153,6 +186,7 @@ const baseConfig = {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
esModule: false,
limit: 10000,
// publicPath: distDir,
name: 'font/[name].[hash:7].[ext]'
......@@ -168,38 +202,18 @@ const baseConfig = {
],
alias: {
'@': resolve('src/js'),
'~': resolve('src/lib')
'~': resolve('src/lib'),
'jquery':'jquery/dist/jquery.min.js',
'jquery-ui': 'jquery-ui'
},
extensions: ['.js', 'json', '.vue', '.scss']
},
externals: {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'jquery': '$',
'lodash': '_',
'bootstrap': 'bootstrap',
'd3': 'd3',
'canvg': 'canvg',
'html2canvas': 'html2canvas',
'./jsplumb': 'jsPlumb',
'./highlight.js': 'highlight.js',
'./clipboard': 'clipboard',
'./codemirror': 'CodeMirror'
},
plugins: [
new webpack.ProvidePlugin({ vue: 'Vue', _: 'lodash' }),
new VueLoaderPlugin(),
new webpack.ProvidePlugin({ vue: 'Vue', _: 'lodash',jQuery:"jquery/dist/jquery.min.js",$:"jquery/dist/jquery.min.js" }),
new webpack.DefinePlugin({
PUBLIC_PATH: JSON.stringify(process.env.PUBLIC_PATH ? process.env.PUBLIC_PATH : '')
}),
new HtmlWebpackExtPlugin({
cache: true,
delimiter: '$',
locals: {
NODE_ENV:isProduction,
PUBLIC_PATH: process.env.PUBLIC_PATH ? process.env.PUBLIC_PATH : ''
}
}),
...pages
]
}
......
......@@ -17,7 +17,7 @@
const webpack = require('webpack')
const merge = require('webpack-merge')
const { assetsDir, baseConfig } = require('./config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const ProgressPlugin = require('progress-bar-webpack-plugin')
const getEnv = require('env-parse').getEnv
......@@ -26,70 +26,6 @@ const config = merge.smart(baseConfig, {
output: {
filename: 'js/[name].js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: true // Open hot overload
}
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
}
]
},
devServer: {
hot: true,
contentBase: assetsDir,
......@@ -116,10 +52,9 @@ const config = merge.smart(baseConfig, {
plugins: [
new ProgressPlugin(),
new webpack.HotModuleReplacementPlugin(),
new ExtractTextPlugin({ filename: 'css/[name].css', allChunks: true }),
new webpack.optimize.CommonsChunkPlugin({ name: 'common', filename: 'js/[name].js' }),
new webpack.optimize.OccurrenceOrderPlugin()
]
new MiniCssExtractPlugin({ filename: 'css/[name].css' })
],
mode: 'development'
})
module.exports = config
......@@ -19,10 +19,9 @@ const webpack = require('webpack')
const merge = require('webpack-merge')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const { baseConfig } = require('./config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const ProgressPlugin = require('progress-bar-webpack-plugin')
const UglifyJSPlugin = require('uglifyjs-webpack-plugin')
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const resolve = dir =>
path.resolve(__dirname, '..', dir)
......@@ -32,105 +31,11 @@ const config = merge.smart(baseConfig, {
output: {
filename: 'js/[name].[chunkhash:7].js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
hotReload: false // Open hot overload
}
},
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
},
{
test: /\.scss$/,
loader: ExtractTextPlugin.extract({
use: [
'css-loader',
'sass-loader',
{
loader: 'postcss-loader',
options: {
plugins: (loader) => [
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}),
require('cssnano')
]
}
}
],
fallback: ['vue-style-loader']
})
}
]
},
plugins: [
new ProgressPlugin(),
new ExtractTextPlugin({ filename: 'css/[name].[contenthash:7].css', allChunks: true }),
new webpack.optimize.CommonsChunkPlugin({ name: 'common', filename: 'js/[name].[hash:7].js' }),
new MiniCssExtractPlugin({ filename: 'css/[name].[contenthash:7].css' }),
new webpack.optimize.OccurrenceOrderPlugin(),
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorOptions: { discardComments: { removeAll: true } },
canPrint: true
}),
new UglifyJSPlugin({
parallel: true,
sourceMap: true,
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true,
drop_console: true,
pure_funcs: ['console.log']// remove console
},
comments: function (n, c) {
/*! IMPORTANT: Please preserve 3rd-party library license info, inspired from @allex/amd-build-worker/config/jsplumb.js */
var text = c.value, type = c.type
if (type === 'comment2') {
return /^!|@preserve|@license|@cc_on|MIT/i.test(text)
}
}
}
}),
new CopyWebpackPlugin([
{
from: resolve('src/combo'),
to: resolve('dist/combo')
},
{
from: resolve('src/lib'),
to: resolve('dist/lib')
......@@ -140,7 +45,34 @@ const config = merge.smart(baseConfig, {
to: resolve('dist/images')
},
]),
]
],
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
warnings: false,
drop_console: true,
drop_debugger: true,
pure_funcs: ['console.log']
}
},
cache: true,
parallel: true,
sourceMap: false,
exclude: /node_modules/,
extractComments: (astNode, comment) => {
if (/^!|@preserve|@license|@cc_on|MIT/i.test(comment.value)) {
return true
}
return false
}
}),
],
sideEffects: true
},
mode: 'production'
})
module.exports = config
......@@ -7,46 +7,32 @@
"build": "npm run clean && cross-env NODE_ENV=production webpack --config ./build/webpack.config.prod.js",
"dev": "cross-env NODE_ENV=development webpack-dev-server --config ./build/webpack.config.dev.js",
"clean": "rimraf dist",
"lint": "standard \"**/*.{js,vue}\"",
"lint:fix": "standard \"**/*.{js,vue}\" --fix",
"start": "npm run dev",
"combo": "node ./build/combo.js",
"build:combined": "npm run clean && cross-env NODE_ENV=production PUBLIC_PATH=/dolphinscheduler/ui webpack --config ./build/webpack.config.combined.js"
"build:release": "npm run clean && cross-env NODE_ENV=production PUBLIC_PATH=/dolphinscheduler/ui webpack --config ./build/webpack.config.release.js"
},
"dependencies": {
"ans-ui": "0.1.0",
"ans-ui": "1.1.7",
"axios": "^0.16.2",
"jquery": "1.12.4",
"vue": "^2.5.17",
"vue-router": "2.7.0",
"vuex": "^3.0.0",
"bootstrap": "3.3.7",
"canvg": "1.5.1",
"clipboard": "^2.0.1",
"codemirror": "^5.43.0",
"d3": "^3.5.17",
"dayjs": "^1.7.8",
"echarts": "^4.1.0",
"echarts": "4.1.0",
"html2canvas": "^0.5.0-beta4",
"jquery": "3.3.1",
"jquery-ui": "^1.12.1",
"jsplumb": "^2.8.6",
"lodash": "^4.17.11",
"vue": "^2.5.17",
"vue-router": "2.7.0",
"vuex": "^3.0.0",
"vuex-router-sync": "^4.1.2"
},
"standard": {
"parser": "babel-eslint",
"ignore": [
"src/~/**",
"src/font/*",
"src/combo/**",
"dist/**",
"src/lib/**",
"build/**"
]
},
"devDependencies": {
"autoprefixer": "^9.1.0",
"babel-core": "^6.25.0",
"babel-eslint": "^8.2.2",
"babel-helper-vue-jsx-merge-props": "^2.0.2",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
......@@ -61,25 +47,24 @@
"css-loader": "^0.28.8",
"cssnano": "4.1.10",
"env-parse": "^1.0.5",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.11",
"file-loader": "^5.0.2",
"globby": "^8.0.1",
"html-loader": "^0.5.5",
"html-webpack-ext-plugin": "^1.0.0",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.8.2",
"node-sass": "^4.13.0",
"optimize-css-assets-webpack-plugin": "3.2.0",
"postcss-loader": "^2.1.6",
"postcss-loader": "^3.0.0",
"progress-bar-webpack-plugin": "^1.12.1",
"rimraf": "^2.6.2",
"sass-loader": "^7.1.0",
"uglifyjs-webpack-plugin": "^1.2.7",
"url-loader": "^0.5.9",
"vue-loader": "^13.7.0",
"sass-loader": "^8.0.0",
"terser-webpack-plugin": "^2.1.3",
"url-loader": "^3.0.0",
"vue-loader": "^15.8.3",
"vue-style-loader": "^4.1.1",
"vue-template-compiler": "^2.5.16",
"webpack": "^3.12.0",
"webpack-dev-server": "^2.11.2",
"webpack-merge": "^4.1.4"
"webpack": "^4.41.3",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0",
"webpack-merge": "^4.2.2"
}
}
.hljs{display:block;overflow-x:auto;padding:0.5em;background:white;color:black}.hljs-comment,.hljs-quote,.hljs-variable{color:#008000}.hljs-keyword,.hljs-selector-tag,.hljs-built_in,.hljs-name,.hljs-tag{color:#00f}.hljs-string,.hljs-title,.hljs-section,.hljs-attribute,.hljs-literal,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-addition{color:#a31515}.hljs-deletion,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-meta{color:#2b91af}.hljs-doctag{color:#808080}.hljs-attr{color:#f00}.hljs-symbol,.hljs-bullet,.hljs-link{color:#00b0e8}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}
.jtk-node{position:absolute}.jtk-group{position:absolute;overflow:visible}[jtk-group-content]{position:relative}.katavorio-clone-drag{pointer-events:none}.jtk-surface{overflow:hidden!important;position:relative;cursor:move;cursor:-moz-grab;cursor:-webkit-grab;touch-action:none}.jtk-surface-panning{cursor:-moz-grabbing;cursor:-webkit-grabbing;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jtk-surface-canvas{overflow:visible!important}.jtk-surface-droppable-node{touch-action:none}.jtk-surface-nopan{overflow:scroll!important;cursor:default}.jtk-surface-tile{border:none;outline:0;margin:0;-webkit-transition:opacity .3s ease .15s;-moz-transition:opacity .3s ease .15s;-o-transition:opacity .3s ease .15s;-ms-transition:opacity .3s ease .15s;transition:opacity .3s ease .15s}.jtk-lasso{border:2px solid #3177b8;background-color:#f5f5f5;opacity:.5;display:none;z-index:20000;position:absolute}.jtk-lasso-select-defeat *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jtk-lasso-mask{position:fixed;z-index:20000;display:none;opacity:.5;background-color:#07234e;top:0;bottom:0;left:0;right:0}.jtk-surface-selected-element{border:2px dashed #f76258!important}.jtk-surface-pan{background-color:Azure;opacity:.4;text-align:center;cursor:pointer;z-index:2;-webkit-transition:background-color .15s ease-in;-moz-transition:background-color .15s ease-in;-o-transition:background-color .15s ease-in;transition:background-color .15s ease-in}.jtk-surface-pan-bottom,.jtk-surface-pan-top{width:100%;height:20px}.jtk-surface-pan-bottom:hover,.jtk-surface-pan-left:hover,.jtk-surface-pan-right:hover,.jtk-surface-pan-top:hover{opacity:.6;background-color:#3177b8;color:#fff;font-weight:700}.jtk-surface-pan-left,.jtk-surface-pan-right{width:20px;height:100%;line-height:40}.jtk-surface-pan-active,.jtk-surface-pan-active:hover{background-color:#f76258}.jtk-miniview{overflow:hidden!important;width:125px;height:125px;position:relative;background-color:#b2c9cd;border:1px solid #e2e6cd;border-radius:4px;opacity:.8}.jtk-miniview-panner{border:5px dotted #f5f5f5;opacity:.4;background-color:#4f6f7e;cursor:move;cursor:-moz-grab;cursor:-webkit-grab}.jtk-miniview-panning{cursor:-moz-grabbing;cursor:-webkit-grabbing}.jtk-miniview-element{background-color:#607a86;position:absolute}.jtk-miniview-group-element{background:0 0;border:2px solid #607a86}.jtk-miniview-collapse{color:#f5f5f5;position:absolute;font-size:18px;top:-1px;right:3px;cursor:pointer;font-weight:700}.jtk-miniview-collapse:before{content:"\2012"}.jtk-miniview-collapsed{background-color:#449ea6;border-radius:4px;height:22px;margin-right:0;padding:4px;width:21px}.jtk-miniview-collapsed .jtk-miniview-element,.jtk-miniview-collapsed .jtk-miniview-panner{visibility:hidden}.jtk-miniview-collapsed .jtk-miniview-collapse:before{content:"+"}.jtk-miniview-collapse:hover{color:#e4f013}.jtk-dialog-underlay{left:0;right:0;top:0;bottom:0;position:fixed;z-index:100000;opacity:.8;background-color:#ccc;display:none}.jtk-dialog-overlay{position:fixed;z-index:100001;display:none;background-color:#fff;font-family:"Open Sans",sans-serif;padding:7px;box-shadow:0 0 5px gray;overflow:hidden}.jtk-dialog-overlay-x{max-height:0;transition:max-height .5s ease-in;-moz-transition:max-height .5s ease-in;-ms-transition:max-height .5s ease-in;-o-transition:max-height .5s ease-in;-webkit-transition:max-height .5s ease-in}.jtk-dialog-overlay-y{max-width:0;transition:max-width .5s ease-in;-moz-transition:max-width .5s ease-in;-ms-transition:max-width .5s ease-in;-o-transition:max-width .5s ease-in;-webkit-transition:max-width .5s ease-in}.jtk-dialog-overlay-top{top:20px}.jtk-dialog-overlay-bottom{bottom:20px}.jtk-dialog-overlay-left{left:20px}.jtk-dialog-overlay-right{right:20px}.jtk-dialog-overlay-x.jtk-dialog-overlay-visible{max-height:1000px}.jtk-dialog-overlay-y.jtk-dialog-overlay-visible{max-width:1000px}.jtk-dialog-buttons{text-align:right;margin-top:5px}.jtk-dialog-button{border:none;cursor:pointer;margin-right:5px;min-width:56px;background-color:#fff;outline:1px solid #ccc}.jtk-dialog-button:hover{color:#fff;background-color:#234b5e}.jtk-dialog-title{text-align:left;font-size:14px;margin-bottom:9px}.jtk-dialog-content{font-size:12px;text-align:left;min-width:250px;margin:0 14px}.jtk-dialog-content ul{width:100%;padding-left:0}.jtk-dialog-content label{cursor:pointer;font-weight:inherit}.jtk-dialog-overlay input,.jtk-dialog-overlay textarea{background-color:#fff;border:1px solid #ccc;color:#333;font-size:14px;font-style:normal;outline:0;padding:6px 4px;margin-right:6px}.jtk-dialog-overlay input:focus,.jtk-dialog-overlay textarea:focus{background-color:#cbeae1;border:1px solid #83b8a8;color:#333;font-size:14px;font-style:normal;outline:0}.jtk-draw-skeleton{position:absolute;left:0;right:0;top:0;bottom:0;outline:2px solid #84acb3;opacity:.8}.jtk-draw-handle{position:absolute;width:7px;height:7px;background-color:#84acb3}.jtk-draw-handle-tl{left:0;top:0;cursor:nw-resize}.jtk-draw-handle-tr{right:0;top:0;cursor:ne-resize}.jtk-draw-handle-bl{left:0;bottom:0;cursor:sw-resize}.jtk-draw-handle-br{bottom:0;right:0;cursor:se-resize}.jtk-draw-drag{display:none;position:absolute;left:50%;top:50%;margin-left:-10px;margin-top:-10px;width:20px;height:20px;background-color:#84acb3;cursor:move}.jtk-drag-select-defeat *{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}
.cm-s-mdn-like.CodeMirror{color:#999;background-color:#fff}.cm-s-mdn-like .CodeMirror-line::selection,.cm-s-mdn-like .CodeMirror-line>span::selection,.cm-s-mdn-like .CodeMirror-line>span>span::selection,.cm-s-mdn-like div.CodeMirror-selected{background:#cfc}.cm-s-mdn-like .CodeMirror-line::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span>span::-moz-selection{background:#cfc}.cm-s-mdn-like .CodeMirror-gutters{background:#f8f8f8;border-left:6px solid rgba(0,83,159,.65);color:#333}.cm-s-mdn-like .CodeMirror-linenumber{color:#aaa;padding-left:8px}.cm-s-mdn-like .CodeMirror-cursor{border-left:2px solid #222}.cm-s-mdn-like .cm-keyword{color:#6262FF}.cm-s-mdn-like .cm-atom{color:#F90}.cm-s-mdn-like .cm-number{color:#ca7841}.cm-s-mdn-like .cm-def{color:#8DA6CE}.cm-s-mdn-like span.cm-tag,.cm-s-mdn-like span.cm-variable-2{color:#690}.cm-s-mdn-like .cm-variable,.cm-s-mdn-like span.cm-def,.cm-s-mdn-like span.cm-variable-3{color:#07a}.cm-s-mdn-like .cm-property{color:#905}.cm-s-mdn-like .cm-qualifier{color:#690}.cm-s-mdn-like .cm-operator{color:#cda869}.cm-s-mdn-like .cm-comment{color:#777;font-weight:400}.cm-s-mdn-like .cm-string{color:#07a;font-style:italic}.cm-s-mdn-like .cm-string-2{color:#bd6b18}.cm-s-mdn-like .cm-meta{color:#000}.cm-s-mdn-like .cm-builtin{color:#9B7536}.cm-s-mdn-like .cm-tag{color:#997643}.cm-s-mdn-like .cm-attribute{color:#d6bb6d}.cm-s-mdn-like .cm-header{color:#FF6400}.cm-s-mdn-like .cm-hr{color:#AEAEAE}.cm-s-mdn-like .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-mdn-like .cm-error{border-bottom:1px solid red}div.cm-s-mdn-like .CodeMirror-activeline-background{background:#efefff}div.cm-s-mdn-like span.CodeMirror-matchingbracket{outline:grey solid 1px;color:inherit}.cm-s-mdn-like.CodeMirror{background-image:url(/~/codemirror/5.20.0/theme/mdn-like.min.css)}
.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}
此差异已折叠。
此差异已折叠。
此差异已折叠。
/*
* 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.
*/
Not found
\ 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.
*/
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
此差异已折叠。
/*
* 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.
*/
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1554803141579'); /* IE9 */
src: url('iconfont.eot?t=1554803141579#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAACsMAAsAAAAAUgAAACq6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCNegqBgSToRgE2AiQDgkQLgSQABCAFhG0HiDIbNERFRoWNAyAE75Eogo1DCDIYR0UpH0tm/98SNBsbdD5T0xoHbDou6ERaYRVRZLe+gkEwyKxJRVvzhHWohjqOCgkRHBXTKfxd1HqW2y71tUm1g5Gu4T9xG7eTUQ5JiqZ4RLo1extIcpfWqGk0ASUQqjWBUF9KFQEFXiDaQYwBfQVUqopgh7dEUZo+lle+gOUtNfyjX5rB8s1GRL90cpXTmvYo1DOS7QAvMSQRLIHhkP2xfltS7W9mFOQFThYIEu/jd28gBgdDd9mmuyACxnA3V29YCURNREoiJkr6bdi8ufqlnP5rwCNr8kcXMb3ZTL+JJdcWPKkunEYqqFRwqcDl5jcCoAF8x83zfO4ATyAhjaO0rQXvR3ff2k98FheZFdRfF72rt6UgkQShU7/ACrKfW73DnlpH0ax/79zbe4EJQ7gh4Q8JK0S6yQmhZhCmoglvwKwImzCGvuLnVW2rZFOc0Gxqjm5qHZZjZWJkGv/7kmN9fcuxpBxY0hUrXfYVSU7Aut7NlBytj6VuUpwDOzTrGjY9G7VupW8wjWwb2wrw/P9ay4tL14fekjYkJJHazF/9I5hLE41V/XRC6TQyqVbUiWikNACDgaXYbtf1Pz+W0x41IzUaUXpABJ/+9lqPMdcf5K+F8wELldfaOIFwHRggACDBEwIBGeLmZgEDaECfDwEAWr7EWAyMkgo0TgIBI+vc8pI0jNrACRhEM2EFgB3s50cvIAQxAAhwwkDrppXFloDuZ7D/hWsdjBTUHI1T15+G1UtRhGkUUzTZ2l84XJSWphWpPHx/igv+8rhfovHFoUes16hJs5Zs2LLrUoYiFcyqNdlmt1OGXLFsx/XQGfmQxanL8VzJ/PV7sP9yOAKhhxnX/tjxw9nzVsqnK6y63YC39xG//SY6XuDxTZL+8ZPnW/b3beVb26reu99b5z/JA2UK9Jg3p8uGNSVGDRi0rk+VIecHF5v2G1WoVGhFhyKTWgybUW/BiD2t7paNOZxw2q9ZtzbtLhdV29ag1KxxtYodlbtqcjxlVa+TaZ123O6qUWfJlrPrm3sFpQDLq6Ho13zqXuAKZQR5JIWAHoJhntBgjtChizBhg5CwRigoISwYJWwYIBwYJFxYJzzoI3yoIgIYIkI4FxEciBguxBU2iRvsizs0Eg+oIJ5QSXygkPjBCpkCHcQfisg0S93RALSQYBgmITBDtFBPwiw4JxxghETAHomEVhIFdzIDlslsGCNJcCjpMEEy4FQKoZ8UQTOpgG5ihjZSDe2kyTKGsw0stjntANVkJ2yTXdBAdkMpGYBZcgrGyRDUkitQTD6FI/kCyokNruQRNJEncCw/wxSxwyrPaujleQGceF4I0zwvhk6e62CH5+Nw6/kK7PJ8DWp44Xok/R6EJf7/Blv8/x3O/P8Drv3/E278/2uTe3i4P/MTCp40B51Dmwp/sH4lCpPOAkW/0CqfLFKudK5gvFiBkrsuA//az08vVKVQuizRxaBLrnZ1L3bxWvGnS5SpYIqnkuk6pSoxbkG9s0Bxn2pMu1ifL1aqUsHgEjqBTzXklaxCVVmURmnJpXCAF/pMikTKK0fkUeP6YH4W1/l8dh7ndDPXZ6F8kkPOSKRXQjRnvIa5eo5h5LO0D3KurQzQeL60oGDcuPEFeVyHPMiZC8r1WRG+BpdM4FGNw0g6RiQuGS3QtOwoa8+J8yGuEpWeyuaIXG/g/Bou9LyT55fRtAIwcbpUuYG7y0iNTijIwynsvDyN9leqp00jevxEDbZPkGXnE8WsSgkHe3w/PpiIsgqQoboODLSXInqZB5VsPa+A5EZk0YhhvmxeLW6atVx5e4W0ZN7Bx/I1PKCWOaBR1dCA4fLTVAoBiPTLS3l3OkYbsgbzLW6q+DCQRzT9Mq4P/hZKXXPVylBvmjHSWbKMsaRziu93VtxWnaxylmurLAOvkOzUkMJhTT9anjFCMqET2xT6gFPHVnxoYMsJDMmQibE2VzcrV7HdyAgwkXdU9ZGeMWw9YVga1An4oVcAkGk/6mmn9ozLSftHSRvahx3k9A3deHnEOTpO2jjXfH7NpD+DaxIuBCJSQt23FA6MHJEs1fA84XQD9FiVh8OBRb8YlyLCV9ELFUDPRyEGbgTZRCeEj1Adq4VkAANI5claRAS7bOjdQHGfGxyyuWYWCikwE/zAOcoMnFMJhzeM9S5iGdQYcX5pp6DeE5reGSFw8LdCxHoiGrz0MGLoghHcN2/Ey68DULtfHRZMNksCmgxMG3GJi4TYR+tDlXv+SKguqOk9kca7w1iHiBp6VzAaqvVXIZEBINL+C6VwDImzJOMS4fbwhz5OXcuQONQYPKQ/eiugQakZQAwHtj2TQEd4PQ74s4SJcXUFMt+U+b8Ukc3tMPZ8IrQn02XpbKF2VjX+3MYZ+LUAtfzWyb3ySz5ZH9aNTn+EOEFURkfjKVupqLEM9fIKoDpImWUy7aAjnmByxj2Qpd20hlnwbGxEEFmEe6Zy8iGoLiUAKQ1Lgeb0Rn45bt+3Sm5gBIQ8bg5H2zW4d/8lbwoxkPLMSFi8oTNCTY0fUtsN9k+FR4+ksP3emlM81Zu7X09AfarHI+Tzuep+PWatqrtFZGfMkhpru2d3L0uMhZpX48RJjGwcnixW9RkZb1c/KKV6Mp6uf2xKuqrJR7rYkrcKmR0gCqj2MtqXGC4U47tGOpfOkAy1bGVSJ+jjGYPwzAoIqUys2Qv6WKw77F0F5i91dp8eKpSbEhApc8XxKadWHHLIzVOo8wSeCPrEsswUTBr0iCkAIKaEXJLt4SGyPDoBN3X0LWQsDbJtpQuGrUKpqoaU4rVMEuemBHHbksOc2Ifri4DC8Oj4Gj2TW/mqBJ2oj/zA5NXBLkWBjqeCFU3E7QGOCUfRUggtmkVCfBF0V8I0FtsuF+KBAUUc4UZG4NPLhrYeqFDdMYAVUSXUJ2fFUCivh6T8FGlljwJEWqpM5pQ6+YavBuDkPcxbmizmDIdMAXpZU6+ZSNle8qjjjKIjWr0TESY2v79ThaYhV08X/YEZGJHyOkXgUXBd8tyUSFqt+ZRA32wRsFyRoIy5BcPzkUnZBRsUIYqAa+xWCNH6OfSg56b73VDdY+wPaxsmxj2yHpssslOKZJq+pY5Atb9TUVD4aDO+/hMyR8iYzK/+S78mMcbvtv3BzLrGaqO0HXg3DZSmgAos8liBTCExayvixYhf2e/G6b3x1wq8TVKXj5gE20sEg5erQF3Uqd/8lvjF9iefFAIfR2WSrMCiYSkBMUg1Wp9qAxJfB/Qh3F7EbXchIvavBLgqZPcp/qhpjlt2+upKPvAj+nDXNVW2tB7T/WGLEbvJfD7oRZlN3WoZuGvYkjYyzdcytnK9IUZspgx9ER+9HCB2lguK01OtW19UUk9s6dFyQpHipuuqVfFhiGE9zrreWziVNG9+fYAkEQ43zlxApA0ZGNLy1ZAWyFDaCLYRvAXAyQ6G2H6SPIaE2DTV9nri+3FUvyh/qIqItiLy5Dou3rCHWbuw264JQKT36jZKYXPpqTzy8s95wD4p7xnBPZ+FQvOv+10fjGLDR09Y42OAhDVWBjdqhLsCsLgnrL2PZGHvwaAtG0jBmd3EgJF44iJXkkly4QVTvf+Knw1Oz0XghnUkcKn9AHvYaI6C5F9J0Cu/jGu/rdRB7aiq0fVW6r3F+rGSU7w99Uodhd11cFMb54gnSG9p8dalJ/eyVlHtCDbjWt1oIVx6Sp+xUNJVu/hgpkBPo4hM24NW3DAOZNr0v9OOECoKgRovFw6eIhmaLHQyVQ1Q7/VCADA6Y0wy0Fa9nCBOpwUe6Z9SJnnoJxBYRnOwZSFwgRj7cfTpqZsCq1y3Lhsj8ZWWHGJ8FJeN+yalhCp8zGlaHwuwhsEwNhC0FiV3ORUya5ahMLDP+PmXYgqxxhoT0jayI8spVwki6GMtttm6HahK+0dy4SPdX3Lb6PhteeWA8VYRkqtbxH0WlPkRD3e7uoVnM12tSw1Nu8VahqxQQS0n8NwBMoW9XoXUSf/wrhr0bGzJ/tAjn1FiqcdyAnfQK2Y4y1VI+2nnBlv1bAdnGp57MKBka+EmjxQn3CXOfJWhWKE4ZVgRJrzIEScMRdtgYmXxq2XPUNUoPVdxHFJ15Pm8jSwUkV8NY/iZCfGVohlemS2rG+0vGfUplFAvBi9dF5imQHD+9t77obAbyLev5UMKfOGOW48UneflVfu88Y6rSi5VnVImDRjXukwAHKLi4oGy5Yg+DId1vfhM0f3heCzR6RzDGaPq+996i0Pj2T+1r1O+giLwMzBAQoh8ezcffurNPDctZ/l1l6rZF3L6mW4+w64+vxWBHXggCbK/XxMVjljTNXvRqUS3vjRWyxKj4Wi18xhZVpeRcacGx7weW2pYR+ohnoo0r4ajQX3ryyPiWYzWvXubAFkCS8O7L+DT5Cmlvr2yv97ZjCWXP77KMjkCu11VMdOpOq4b9iZ8ZKhQyXIjqsPa8+IJrSmBYT+bpso8NV4yNEFKIchEgcqihSYpF+j+L4BJacph0gpFxmOnRScpTid6DgtPCGg55CUuAwVn1ASJK1IOiUolnoQVoY284BKVdGNLLW9ZQOFv84a0Vbz31QFwlb041PQO1evH+OlpNIhOaMUAQL8Gze922rfrxkOgwvUUX3hR63z5lZoyrGM6iYuRpBUmCb8lv2YEYsnfmIbfj/ksvnzr16apTNlKpqiflexTnngXMjcsY5TlkdtlaAMsnc77djtySB/Ug/MAvTIUXHPkUMEf0lM0REUYAS8GwJri/euvfID7Ns4EMov5VZZ3IRhC8AakHzlLQEL85M3dkh/ccPl91C/1WEVnSHIIPTrelVV0vlknls07YlNDxjA+pFAb1jv6+HmxEExuGG/j583Wj7Kr1OMabI3u5O+rRVuZISWgfG6ZdxR60e6xm0oeV8lqLXBxGm0M6GavdB8wAmCBTnbJuOvEg+4JR3o8i3FpRHyvYZzlhrrPtVYAzhBxJmtDS1JeQtQlQYdgGgmTldMRhEQt3LP5apG8jytNwtOWVGed54aqvVdqus7pWaWLFjChjWOhYMp68Eyig56XMomJgOhJwCtAFooALViPKl/oIg1rK7ca5LwyYq6NSR1z1Bo2VVxz/NJn4upKaQtNI2VCHqVN+GMK0Cst7SJZzJGR95/F0qyAGIl4WHUknxd/bkewYak7euBnwWX2b7nI5iS9Kp4UR4uOCV/jbKUXMm3EId7tnmSfQ7SUXFTRGqcpYrC+ABc7SbeS5TYC6OPUJVLvgktSY8abAcHGcg3eYjsDXSsvSQc4iQeLmJwwJ7RMRuALYL+cPpkM3nkRxYROEsqL+jilk6m3tEAdoFI/34cr3irFSuvuhwGZ71qkXMYMdrUtksOBcxoJc+QmHCku1i7WMP9b8HriXFgKh2DQoWTASbHSUSzhX6xQMByP4VUSORkHUpK1nosjq1dI6PXpIad3zHJ7Y1wyX7eiRn+bRRmbUnf6NpGVkr5fn8ArOVz5rdrYk+p+dTxwydK799S1+pgaoMXCxnUvLx0ZhIBdr4wIBy+RQ9pgjMo+XWb85ta/1hgxBHY6v/x4/e7z/WmnTpoIiEkIfD76HwC0dDIoiyrPCoeGNKETA2xyGeDbyekegkA670wDlAhV7VjioOBz0UMh2TeGCnUHy0QPEGlmjWGx+VVDpTST0y/mpWP3jLQ0sdcXqAb39R0bvVQbs1MdEzjAe+AsdjwTGp19ubHLCWlZiU6Fi8WmioVWFT7pmhPIjaiAW8aNvAhi4h6MuMoU7x4ahhjzKZsxP6jfC26zz2CzVNwNUcm1OHEcoijq8bOYrXiw9GECwURgewdHGQf9M3JRJB7hQeT9imlYwwhQspH6fGajcu44/CH3hip0I7qXaJC4zfgs+Q13xvuA9oEF++NdRiPZwFN9qZll3L8TgGZ36zH7/3Lb9zDR5Y/2JHt2ydkliv2H1jQr/Pv/ycBF/5/809HU8SVqYzOXPLFmx5Hq3On7zj95TSin6uiOVTcsm/57mv6E9UNvVH9nW/8Qe4zBXiYsUxmFoBCSPdhmw2zz6t02Ww+tm2azBfXYbOQ/VRKH1Lzmu9go4UqaYrYp0ni2WeqQVN0RUOCSLbukdrj2Va7JEXDwU47KXcB+ZnRkd7hBCH8Bse7o0XVTIBZAQ9P+I2sYuU7BPBpvtCqYGfxQr9Jp/g7mhWu4He+5eXMPIcS28B6YHMpJViR5VlZ6JimSTyjmer5VuTpJnqw4IRDkN3qi31c9oUj2TKqsTPL0c8okE+vCysrC6tqNemJdWDsXMs84fn4FHIw8RNkt31ns5CHSTn1HEevQ54dWOQtOpGIoMYYWD9EPHXfG4knkQ41bTlrGqfcOzZQPRP0wvY5j4K7i7uW9u3mhXN+73jwWdiUerXp0rbsibiiv25vby6mLVuR5fTjRzPG94y0h1ZVYzvvOdE7zxIdeLDQMw+4YGxN6CnygCVoP7bsRHvjH31DFQlRjU0OVVCBrrCh//GOVjE+H8CPnfCJG0i/4RswLS5CW1gZO+E9t3zhJMwhLhAba5Ma6qcyJgLZSaUJsoHeEUlyhSbb6T5SXlE/4W5N1xTRlARAQLlT7Rth8ZEZoheF8wPeN48526bjU7hzZi8aL7MslNYdMr2GYmobONfTxqxsiImR2aa3ULqspYoaHy8a992Oc/pJuhx5G6eO5EF9H2kQjzLrAeFSKznvWMUdENrIOoovmmskRJh19f2/H4wIe/TnQRtIhhhENOxIDObxztsOCMlJCLDLDQt5JEHKbs6B5kmJQNgOwks+N/TrD2KZvMzKcmWXt+vYyZpDTXZ0+bcjJmTYs0YutNIjkc0tL+7ndAiNEIKOALjCiLzmaB3/6dSxY+CmOJ21iGxlPBaV7pI2ysIxF/nCGb4ltFksbKia9HRocIrS1+bAcLOXOnx44fSrXmHLWNRiCQcQq/a4Ev22xiR9YblkeoClQYOYStHUbsYRzDj049q3lS9B/w2zdtmQu9OtPRJ/Q94OD6qY9fDhshO4CfzVs+2kXvnEDQ9g1AdK48MeoqFlNQyS6HG/lq9QhZVqVUmWNI7XhWjJu5CWrtFtJlcAab9luS36EXxmh7byYlpDg5LSltKgS5L/6nKW9fEnLq595OX4Wn8Hj462fHX95hga7E6EiXaYHbzob2OTzKUiZObMoDi1cAHFqeeHCODTaF69mNzrvcSrfGJ66IQ7CVaumFaLaGlSECqtOIQEQflTmGb9kSeuso0btM6u1a9b2JUtbZx4FArqX6fKMW7xH0eTzYyoCPhRCGKFE0OzTLJDATHX0Ht+y4EyxgzQsg9afbbaNjE4Gm7mfDtfisOTHjH4Gh3Gbsc72wCh+JTbLRscewDvCLCd71baPgNFP58g+8qwpsiFGbwlnJwM2jNnMnmm0PVhXAeFUhIsHMp+8WMf4SMahdzKuv0MVtFc8CO+MPSgaCN3fdFF2yTh1gbIR55jETg0c7YowhwVeu2SMHKC6LONCyMMyIAn5usUm4UQ7blJiI0Gr6u2bgTuEg8IOPKNP1CFKuLwa93734dGs0eGNj6ZDmCDq6AzrD9cbSpY6yrPKHdL+a0navFl3iwaL7gZgykYqSZskuFYbOU4pqXHxFpOMD8gXUVmofCXKJGIuC6Fr1UoiE+GBZSEA4buXdKdnBdHeipbxpe2CFahnOWrn+/GJZe2tywkABRb04idPaH20XpBeD6EL9+K+Fu4FpunTLLp0fTo0PEyPTq963Yd/+IHWT+sbpA8QunAf7rf3jzYSg4NEXr1p8HwjbsLnzzfXeH6w8GBadBocLHk/uHQ6sXR761IkxHeNWDo9uPT9pUEbL6EqjspDxSFM2wZWuxwdJTF5eleJroBEKYuNyQgI6LM/pK6gpNjATwh0Xd5Qsdp12wBh+sdMoqqNlyD0yBkI51Uka/Yff0HPKn+5MGgh7hS91PSJAPeLXoj6cTju0+T+ImcX+Yn6RfmJkXmuUfbTP1bKE6vNksaGpirJRDe12gTOjWKQQOjO0+7dddF9fH7f4d/tHkYPVdclrOm4HAdGFBIePvTQpN6wRRuPzAYi+oZ5LAF21uqIPXz+nuPdzQJ2i/XTkby8MtGY0GhcHHPOiVxrsxmFYyI43nAwJlQT/1Fa1qySvAVZvKz8bFYtMSRei8xN05d6RQakig0++6Lvuf43oOOrp02/JdjCUBa9bZhliO0IL86MX+I3c1qmLCFwIOwTT+G5OKFPSK7CMD0orTWzZH4TbIv6rKjJea9zU1HcadKlpK39eKVU9um409nUXvgkP6PGxLavtfsN+//8M8tZuiwQ2jBvhaQ89o8/m+KHX7/WscZfv+lz13p0bh0m7eLxtgtt42I7exdpJ/lpbPfWunFPneKyXsleraP+BLnnrOPGzcKPBRNMu8DOnPjVlbctfct8Pa2YLKb1Z2uLaKd+d5sgAy01o3kov9ycgdzzG1fmQCHasVG6eDLFCAkoo7g8ERVn8CTN4i18fvBHfOfi2EwuFZPpXRvbyck3VWagRKgsFQ67h+zM3DwwCFXoMyzey3G+lh9yFUz+J7RGrdJ2QmKVjBF0Nhh2GnMa5mJg7C/aU77fPBQ6GHvo/G5fX61Raf6K0eRrOpQaL03UuOaFZt8ZzfsaCEYfUzZqhiut7fbpa8w75K3TNJZVamXRdAYdvoMNM3S3NetDw1mXc4RG06xSQ6ZpGak54rE/jGlcl2HImZ3qJDUM3TQYMlIcuRmQmAia9xldmrURAiNoBF+1FOhnLPQMFbQcaSKdFMq7Y2STZZOliRy7q1Q4kU0BMyyFua25hbyHUpt0E8zI1y/nlEjGpIR0TOIktRURRTbpYCQ1QnIoq9hKcpgjW0kbc9EHogcUh7SZI0wOKQRoOAIfajWTXhNek5qkMP+waPwuJ2nsuK93Lj9XJKgd4g8x+at59bimuoa3WJOYGpA6M9U/1cWn1793TW9A7+g61EkNWHTWL8nD7JGY5pFkvuS0xBcmyS9xaHHOUgMqKEAGyQX5vo7y89HnIb8AQh//LzDtvlsVV6Xda2iwJuYIvBwad80rLMhJHN5r2KutNlTf3W0SKCaxO3YoBGt2W6tjqrX7DI3WpBwBtsvFJr0cSdZGwz6tMG/dvQaso/1J55XUK5Zv2/MpmxTxqpyPq6RmbaOksb9MteVNVN1F0tfOE3cS4EterIt6s0VgOpETrDVLqz4uE8QHbZ7yvDY3QblTtZgv/DYHJfDLhsyy8vETa/k3itx0kRm/sCnyaGXZRWTmoTJ+wtl+L0hfyj6vZy4qK0MpzF0Aq1FbsC4uTizaRBfFRGITFDEMLaM/wN0ap6sbH8ccDfPg+Bet+MIF3Iq3X7jYSmwnLl70fVsvXhAsrq+nHFIH1eUsh8zBqm/gog3vHpzjeH35j3SXaBe+dg3vQitN/UV+SE/narnUla635HkNKIcwvfuuiQKxbMgEOXkN/2hdV6jMsHQ9KvIz9aOVeNe1a7vKuQZuLDfGMwaJhrkB1oXcWY2MdeMePPmzfV09molVU26MjS2fsoqLd1y6tKNrzir/62NjBf6r5vA1IBxZLBy+O5+D5rHlnARD1eF2bi3ioHeClpnOt6QO5t6sD++jezHnBL+sI2ppwzu5+aktUFVY/B64y3+wYWlqS37uO/XLYA/zdrnj5begltTzpq8Xd0P1tmmv7UP/ekbmVxyu1bPD0/rmryNH78r3y60XP/wqE4LPvg4nT/YJVP8lJ2AYqWUr26zCEXIlOSK0Fnmg9wyzM9JjZl+E9xS1ONOfSPYwtaAv42aN4GA1UtMY2AsQylSMxM38CR34Pz+YuXe9WybEEnzQE11lHUt9V/7xux8oQx1cSE93OAz8iJ9/XuGX11HW1RWbsl7yhjU3ZnIr/BQ3c4SHYhAPCRDCdIKIZkzFC+ZZ42d9Cc0eJiLZn8hU1gzAgGFWRrph9gAcUJhx8mycIjfXok15Gr94gVM4PQHStCLrqCrazeC+11fVu5WVukW7G/ben5u+tExQiP50ZmDE7J82CRKbOC/ocdB8cSd150viAO765pujWKhyuOsH+tPkzGL7re9avrtVsODdQ82HDhQU3P625dvbHXhgoHngXafPpgVNm5rq531zgkLeMA2aYbh26l1PJcU67kbI608FfG4Ad0w+EQiB3HPnuFJ7kF0aA18BDv9ztIkJGoVzC2A1atMcxqOjGMLhCZDGOb4uXhxm7Yw9yytTlk6cnShVlnGnh5SXbg1WzQPks21qc2kbVmzzBsxfuxa5sGLVWaO1vPv9+kZssBpiLmepsjmdCg5nhMNeoRHGa/c9puzUArZgNG1UxZnOUY1uoOxiO1WnshHRhE2VG73/xeQYhKd9H+vMcY6r2FD4VUXOso5PYuXfvom9d/2+mPkxv58hvn/9k+w3t4NiP+lYFlf3VeqKijhnjiR79YrUrzbFLZdMBt16nXP5VHo//+OLjsa9/kYedi8we/VXhRtaAkdN000zyYyVsjhqbsaa1FWjWrNesH4T+wPYsG3yOvHFTqXg/8ADqvLPTTNHY7jLJIhLf29+dVbSKa8D5T1PuSoPNfdMsxPBUZm28AxyhQuVazlNupgY3SODPAY0sfkh+cO+vuf6royQDNYimeeUB4fsCZk/DsBbIRkhP22Fkf/SKytV9oWmoytXnmeNycZY5686a8UOkXn/IaWK5sZT4DHKLHKI29bPjJqD6MC6D7T1rydpEat8K2bg9suftBNC9fXA7TN9Vy0zGyZjqs4G1kE87cjDMehkuyyKnj4vNWDHIbksys39QJ7WmBsdtcglyj2CH7kstucuyopBw7cNGVH8CHdrpGRnzcD1Bm6LD6GSo60fOek96Wnp1al+2KrUjLQMECYMWiZlk9Tg6DCrhDU8+ks08og1KZ2cdmTIyzOgX4y6TWQoQTF5+RmWVtYrqf1062m79BXrAmuS9RPLLrMjYxLOCKNxFW8fykfV64h8IebyEbR161CIvvaCDbFowQKUQtyyx0IcFCxAEGLnSLoOIb4tBIBYGKCtwoWxnH5O1qt6ege3w7n+lYHbyYkFBz6Gv/vOF45ROkb9eFw1m41bL15sxULUiVYC2QjZkishvznwZU+ILmTOWq1OO8fkHyjMtHiQzNqp1WDAB+/fP4gP4Xv38UE0YoD1U8nwa3Lhu2ism4lTpwgKmxdAmlayE6qr2TxXYPXZl8EVsWexkCv/YWbzXXkVU02FVFPRsqHF/a0Cs5dZEFyNL2/lmdVm3j291vJnC6eF8Chjm5n5BcPcxqs1M4aX2GzMYckDMW/HJF8oacYt7dnz42FuhDyEkYfraRJpJRfvwkh443nMxUxcP+OOB4PhQS/3KKd7MDo8mEwWaj3KGZe0X0Rqv2hiVoYeKPthm5eYyOgv/+9q1Of3U5osVXS0KnuhUeezVQsxGB2jyuIqpnWnoiVLUKpQgZ+mNSgG5uXwj1wi551oUwkJnJ2HVLfzdKDATp3oagFO+NioqzoR47enEvXNiPKGvepzzIN3FOTKzvRJMyPDc+GROHsPwd3r1enFzVWCIE9RpoebRaXEqMQX6nfvOGOnKPuZHZ/w7+S+CGzbcdrOouynd1y2Uyx7YD3bws2UYlS/mShBRZvrSwg/frY6h++nRznZKOP6nBzuK3jZ1Arz897f/XjZ6mxBVmd2DpNNAcwiVL/p//GSTZveo+VHKswvKlaDpl1j/000uPDJWw3nMtXvL34r76vdu5tYzno/kVXkq3dmV0GEICeq+Onqq1dXPzXq7sTncHCs77GWtLSWY0TsRmPMVU1rMzKQH5hvL3nVMydwInAOI0ty3+4X8Ld8NeNc1Tm3+X4dcHDpXp/GHbPK53S6d45JqqXB5fshMsRLvoyZXtxUK+VLnttMFtj6U/gbQ3d4+ZIS7cZWbU3JIi6+SFtj3/hj3nYYgu0aVm5XDsO7T70KH/7ii8PYgqsJfHguUdPXV4trcH8fUTO1qjDzNahQiBWFRBGxsYYoBIJvUcJEdjaXm5WlQ69zKbk8KxscE2vZmdLD9IL+zurt/doF9qTQs7TxcVoKZxdAmmruDZb1ENVO4YYwozkqalgxzBtS3o2KjIryXOhj1VDU9L+uIXRXmYkSAKuCYzE4df30pFLENcu+4kkQ1ywRb56iqkqnRaz9+M4dvF+owE/TZXk/+vk1uvBcmsI8XaNYepULYhHr88thRs29ex2uWte+p0+bXZuT9NF8h/heoLdb7dbx9GmHK34aualdm+FqsTbCHn2lU+xctv6D5zcG37H4WN4ZvPH8g/XLdip0lpVEEMi54fL1g6cMrl/esL3m4sCff6869cff38j2zdxXDB/moieznvzlld/Gdxl05bsy2OCC2IzB/EQWuAArkcGHs8olAd99F3Bwqdfm08iEd1+7thtTlgAL1T1peFKhsvKDWnOGWhRcdj/gfcUoh2SRHDcOxaI4W+FyxHNyHnIJu17STtOGX57GZ94rKTVtL75zG+8TKrLX68Zl8JzZTRubGaA5XTcter1/RKP4SfreM4vVtVbnBNyKW4larL6/V/9Y0pC43n/TiussB+t/lkP2inrcR7Xh+KrnMmIUNcjeRV500ezp/z5YW+BUVBqzV/Em+AIHr11cgsZWhrEd/ImVASFQTl3Fd+TUQdzCGUnIWEoko6RSY/rKL4MbsOWK6Bi+YMsKNjfV5Ux1bsF59gU5G+3ORxME21eyeW48dhIYS1EyJJeWJKPM6NyCwdxcqHVkty/NrnFP/Scdl/+yrgZ0cKnmEgpzamp10hyXb7vg0Dk2toZ0jhhN3zkO0NfUllfR6eZyusxSV5Ovke1wrnJUSaRVvgW7VDodWpFKzVcf5SGTCeUR882meYirVah5R5KTmeR+VYvXIy1HO+HHvV+6FP5ZmV8knoN4jDY5d66r69wTJkIUTNkdhtFgx/ymGscL7awlNXEF8RrA8YetmGLRluS/3sbKRd87ilUY9s25FnoIFyW2Y47xm3ps8iStJU6WfrcZkzx9G/E9UeufMvNbB2blLhPRQfKBY9gn+admzEheoFdxDHk4luSpA8su2RVjAdDsMUoTdmJhW2I3FpPvdH52HwAAvI4YsYH8haUMYjQR1/o0WrD3nL5nq/GXRp3I72NjYtxmJCUH3ocRGEdxAI9u1438ARLZN7BLAeBaDNouogGsb6Vid8iM+QogWme8ohur9pdO4ACHA4CGiFgZo4b4lYw3EZd8Q74D3hZxDa/M8QE9jgtjkajHTo94j36BM+dcTOgdoMd0NP61CJOsoVXjWuMWWQy5sXmSwhqxhCEGxnHsxWi17vO+0z023aQL+R54nxlAbGURkey4x5MCY8SS59p0YTV9r5yyAWyKPOP6YtG5wxrChnokG/Phfb+t/1r9C7kzf2dQ/+kd+eZ+y3XW4nDYMQEMIIB2IYD3cNtpVQ5opVUfg6DTT38bXI9gllPw00aHgx1EvNPgfs67SpcjqvS4ChAApMNfuEDHCQAgkwsA7wT3CmDM764Yre6aUfKvhAA6eAgGBnh5aNGB4gQUhIozMGCOkBAA8a9TIITVgAHRmADgD/UzQcCDU0IABy4JBh6MeGjRNnECCYyLM/AQFhJykPAbFPigndmfiKDosnyVUSFcCuv+c+Uv9BYgnoMs5x/Gjkay6WhSlVr8HhljHw263s9Uy6yM0mTvZgeHIUjWRqmx0FGl2r4Yj8u2NkaFNBv7ExEUXZav7temQrjcs+7Xfvpf6C1A5Kz1cO1/GDt6/Nl0NEGw7ymj1qqLt+v9TIlWZtcVozTZO6JhSEqSte21aix0VElY7Ysx2VqJpaPxpeZrTz9866T/FxL1M7eEVFRNN0zLdlzPxycgJCImISXjwpUbdx48ySkoqah58ebDl58p/AUINNU0QTSChdAKFSZchEhRppthpllmm0PnpVdee/MXwefLex989MlnX3z1zXc//PRrVecBrmlJ5oGS7lAOlLpm74AG3TFYEk+Tijhhv+uLVc985lmbBLKieslQO2O4aR9WVBPWhjvVa3C3nHWlIAC4qGx6tiSdaQWIoBypOTB1Yb9AOlwND6H5dbUy77oK2+GOj0wLBaGwGYxP0sGVAWukPU/WILw0O151cRjo5oQYZTH4fyKtWHbvOWeaDi8nq427sh3I5Mmt93FaKZvum5trH9wMe3boCVxpKR2KHPEHHLD30qQD9xYcBNz+xy1FHl4WD75c0tCLQbEb6fGwLcoFRhlwoH2rRg2Xhgc6Ep/LQxMTylDbpbh5XxNjyAHPWAM5xNrxz6aRmRaC2E73S7uraTAeDltDxYaFtKtU3TcJHa+GOwMeRnDuypLgykfLx1zf2DRcB6sEoNyxpFOM9YQMguVi1WC7rqiBY1uxBvp0d7mj5aSsORyk3UibQ1JXUgE5OuNp8Iqxtxy1PdixdqvOJm8uiY+bQA8i00PWkQdhDOcI+GS4I+Lwt0Yr1CJu99qXrotNSQUnO/8AKbNE/XI5nRUmC8v5zys99dpP2oIn9vcBS72qcA6iBx86Pgh0L1aLFDsdDJWdGvF4S+SAdOUVTnwrFyZxde2wnuxP+AeQHGn3y/f++/AsLtxN2QAAAA==') format('woff2'),
url('iconfont.woff?t=1554803141579') format('woff'),
url('iconfont.ttf?t=1554803141579') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
url('iconfont.svg?t=1554803141579#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-bianjixiugai:before {
content: "\e601";
}
.icon-shibai:before {
content: "\e626";
}
.icon-dengdai:before {
content: "\e62a";
}
.icon-shuaxin1:before {
content: "\e6c2";
}
.icon-qidong:before {
content: "\e60b";
}
.icon-gantt:before {
content: "\e694";
}
.icon-gongzuoliuchengtu:before {
content: "\e600";
}
.icon-chenggongyijiejue:before {
content: "\e6d4";
}
.icon-home:before {
content: "\e61d";
}
.icon-fuzhi:before {
content: "\e61e";
}
.icon-shanchu1:before {
content: "\e611";
}
.icon-xitongcaozuorizhi:before {
content: "\e691";
}
.icon-dingwei:before {
content: "\e7c4";
}
.icon-yunxingzhong:before {
content: "\e6bb";
}
.icon-shezhishedingpeizhichilun:before {
content: "\e80f";
}
.icon-zhiyuanshuaxin9:before {
content: "\e633";
}
.icon-tishi2:before {
content: "\e693";
}
.icon-one-line-arrow:before {
content: "\e61c";
}
.icon-quanping:before {
content: "\e6e0";
}
.icon-quanping1:before {
content: "\e660";
}
.icon-shanchu:before {
content: "\e630";
}
.icon-yonghu:before {
content: "\e638";
}
.icon-ai06:before {
content: "\e677";
}
.icon-ai05:before {
content: "\e679";
}
.icon-yonghu1:before {
content: "\e629";
}
.icon-wenjianjia:before {
content: "\e768";
}
.icon-chenggong:before {
content: "\e607";
}
.icon-anquan:before {
content: "\e671";
}
.icon-shuaxin:before {
content: "\e602";
}
.icon-wendangxiugai:before {
content: "\e723";
}
.icon-download:before {
content: "\e610";
}
.icon-ITjiankong:before {
content: "\e65f";
}
.icon-icon-xiugai:before {
content: "\e60d";
}
.icon-remove:before {
content: "\e60e";
}
.icon-paibanguanli:before {
content: "\e612";
}
.icon-shezhi-xue:before {
content: "\e631";
}
.icon-tianjia-xue:before {
content: "\e636";
}
.icon-tuichufffpx:before {
content: "\e60c";
}
.icon-icon_jinzhi:before {
content: "\e63e";
}
.icon-jiazaizhong:before {
content: "\e6af";
}
.icon-gou1:before {
content: "\e651";
}
.icon-shalou:before {
content: "\e62e";
}
.icon-stop:before {
content: "\e6e6";
}
.icon-timer:before {
content: "\e75e";
}
.icon-jiantou-copy:before {
content: "\e632";
}
.icon-tingzhi:before {
content: "\e6ae";
}
.icon-yunsuan-dengyu:before {
content: "\e604";
}
.icon-bianji:before {
content: "\e603";
}
.icon-xiangmuguanli:before {
content: "\e635";
}
.icon-yilaiguanxi:before {
content: "\e68c";
}
.icon-erji-xiaxianjilu:before {
content: "\eab6";
}
.icon-daima:before {
content: "\e63b";
}
.icon-wendangxiazai1:before {
content: "\e628";
}
.icon-lishi:before {
content: "\e6ee";
}
.icon-fangda:before {
content: "\e60a";
}
.icon-suoxiao:before {
content: "\e60f";
}
.icon-daohang:before {
content: "\e609";
}
.icon-shijianguanli:before {
content: "\e61a";
}
.icon-shujuku:before {
content: "\eef4";
}
.icon-tiaoduzhongxin:before {
content: "\e692";
}
.icon-shubiaozhizhen:before {
content: "\e781";
}
.icon-yuandian:before {
content: "\e7c2";
}
.icon--Tree-Structure:before {
content: "\e637";
}
.icon-xia:before {
content: "\e61b";
}
.icon-zanting:before {
content: "\e614";
}
.icon-yonghu3:before {
content: "\e64a";
}
.icon-shanchu2:before {
content: "\e6ce";
}
.icon-guanbi:before {
content: "\e6e2";
}
.icon-cuowuguanbishibai:before {
content: "\e75d";
}
.icon-icon_paging_left:before {
content: "\e652";
}
.icon-icon_paging_left-copy:before {
content: "\eef5";
}
.icon-rizhishezhi:before {
content: "\e613";
}
.icon-icon-test:before {
content: "\e615";
}
.icon-zanting1:before {
content: "\e688";
}
.icon-shijianfenlei:before {
content: "\e6dd";
}
.icon-erji-xiaxianjilu-copy:before {
content: "\eef6";
}
.icon-tiaoduzhongxin-copy:before {
content: "\eef7";
}
.icon-juxingkaobei:before {
content: "\e7a5";
}
.icon-LOGO-:before {
content: "\e639";
}
.icon-jiantou-copy-copy:before {
content: "\eef8";
}
此差异已折叠。
此差异已折叠。
......@@ -17,7 +17,7 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import $ from 'jquery'
// import $ from 'jquery'
import Vue from 'vue'
import App from './App'
import router from './router'
......@@ -32,6 +32,10 @@ import 'ans-ui/lib/ans-ui.min.css'
import ans from 'ans-ui/lib/ans-ui.min'
import en_US from 'ans-ui/lib/locale/en' // eslint-disable-line
import 'sass/conf/home/index.scss'
import'bootstrap/dist/css/bootstrap.min.css'
import'bootstrap/dist/js/bootstrap.min.js'
import 'canvg/dist/browser/canvg.min.js'
// Component internationalization
let useOpt = i18n.globalScope.LOCALE === 'en_US' ? { locale: en_US } : {}
......
......@@ -30,31 +30,31 @@ const toolOper = (dagThis) => {
return [
{
code: 'pointer',
icon: '',
icon: 'ans-icon-pointer',
disable: disabled,
desc: `${i18n.$t('Drag Nodes and Selected Items')}`
},
{
code: 'line',
icon: '',
icon: 'ans-icon-slash',
disable: disabled,
desc: `${i18n.$t('Select Line Connection')}`
},
{
code: 'remove',
icon: '',
icon: 'ans-icon-trash',
disable: disabled,
desc: `${i18n.$t('Delete selected lines or nodes')}`
},
{
code: 'download',
icon: '',
icon: 'ans-icon-download',
disable: !!dagThis.type,
desc: `${i18n.$t('Download')}`
},
{
code: 'screen',
icon: '',
icon: 'ans-icon-max',
disable: disabled,
desc: `${i18n.$t('Full Screen')}`
}
......@@ -151,84 +151,84 @@ let tasksState = {
id: 0,
desc: `${i18n.$t('Submitted successfully')}`,
color: '#A9A9A9',
icoUnicode: '',
icoUnicode: 'ans-icon-dot-circle',
isSpin: false
},
'RUNNING_EXEUTION': {
id: 1,
desc: `${i18n.$t('Executing')}`,
color: '#0097e0',
icoUnicode: '',
icoUnicode: 'ans-icon-gear',
isSpin: true
},
'READY_PAUSE': {
id: 2,
desc: `${i18n.$t('Ready to pause')}`,
color: '#07b1a3',
icoUnicode: '',
icoUnicode: 'ans-icon-pause-solid',
isSpin: false
},
'PAUSE': {
id: 3,
desc: `${i18n.$t('Pause')}`,
color: '#057c72',
icoUnicode: '',
icoUnicode: 'ans-icon-pause',
isSpin: false
},
'READY_STOP': {
id: 4,
desc: `${i18n.$t('Ready to stop')}`,
color: '#FE0402',
icoUnicode: '',
icoUnicode: 'ans-icon-coin',
isSpin: false
},
'STOP': {
id: 5,
desc: `${i18n.$t('Stop')}`,
color: '#e90101',
icoUnicode: '',
icoUnicode: 'ans-icon-stop',
isSpin: false
},
'FAILURE': {
id: 6,
desc: `${i18n.$t('failed')}`,
color: '#000000',
icoUnicode: '',
icoUnicode: 'ans-icon-fail-empty',
isSpin: false
},
'SUCCESS': {
id: 7,
desc: `${i18n.$t('success')}`,
color: '#33cc00',
icoUnicode: '',
icoUnicode: 'ans-icon-success-empty',
isSpin: false
},
'NEED_FAULT_TOLERANCE': {
id: 8,
desc: `${i18n.$t('Need fault tolerance')}`,
color: '#FF8C00',
icoUnicode: '',
icoUnicode: 'ans-icon-pen',
isSpin: false
},
'KILL': {
id: 9,
desc: `${i18n.$t('kill')}`,
color: '#a70202',
icoUnicode: '',
icoUnicode: 'ans-icon-minus-circle-empty',
isSpin: false
},
'WAITTING_THREAD': {
id: 10,
desc: `${i18n.$t('Waiting for thread')}`,
color: '#912eed',
icoUnicode: '',
icoUnicode: 'ans-icon-sand-clock',
isSpin: false
},
'WAITTING_DEPEND': {
id: 11,
desc: `${i18n.$t('Waiting for dependence')}`,
color: '#5101be',
icoUnicode: '',
icoUnicode: 'ans-icon-dependence',
isSpin: false
}
}
......
......@@ -91,22 +91,232 @@ Dag.prototype.toolbarEvent = function ({ item, code, is }) {
/**
* Echo data display
*/
Dag.prototype.backfill = function () {
jsPlumb.ready(() => {
JSP.init({
dag: this.dag,
instance: this.instance
Dag.prototype.backfill = function (arg) {
if(arg) {
let locationsValue = store.state.dag.locations
let locationsValue1 = store.state.dag.locations
let locationsValue2 = store.state.dag.locations
let arr = []
for (let i in locationsValue1) {
let objs = new Object();
objs.id = i
arr.push(Object.assign(objs,locationsValue1[i])); //Attributes
}
let tmp = []
for(let i in locationsValue2) {
if(locationsValue2[i].targetarr !='' && locationsValue2[i].targetarr.split(',').length>1) {
tmp.push(locationsValue2[i])
}
}
function copy (array) {
let newArray = []
for(let item of array) {
newArray.push(item);
}
return newArray;
}
let newArr = copy(arr)
function getNewArr() {
for(let i= 0; i<newArr.length; i++) {
if(newArr[i].targetarr !='' && newArr[i].targetarr.split(',').length>1) {
newArr[i].targetarr = newArr[i].targetarr.split(',').shift()
}
}
return newArr
}
getNewArr()
/**
* @description Transform flat data into a tree structure
* @param {Array} arr Flat data
* @param {String} pidStr targetarr key name
* @param {String} idStr id key name
* @param {String} childrenStr children key name
*/
function fommat({arrayList, pidStr = 'targetarr', idStr = 'id', childrenStr = 'children'}) {
let listOjb = {}; // Used to store objects of the form {key: obj}
let treeList = []; // An array to store the final tree structure data
// Transform the data into {key: obj} format, which is convenient for the following data processing
for (let i = 0; i < arrayList.length; i++) {
listOjb[arrayList[i][idStr]] = arrayList[i]
}
// Format data based on pid
for (let j = 0; j < arrayList.length; j++) {
// Determine if the parent exists
// let haveParent = arrayList[j].targetarr.split(',').length>1?listOjb[arrayList[j].targetarr.split(',')[0]]:listOjb[arrayList[j][pidStr]]
let haveParent = listOjb[arrayList[j][pidStr]]
if (haveParent) {
// If there is no parent children field, create a children field
!haveParent[childrenStr] && (haveParent[childrenStr] = [])
// Insert child in parent
haveParent[childrenStr].push(arrayList[j])
} else {
// If there is no parent, insert directly into the outermost layer
treeList.push(arrayList[j])
}
}
return treeList
}
let datas = fommat({arrayList: newArr,pidStr: 'targetarr'})
// Count the number of leaf nodes
function getLeafCountTree(json) {
if(!json.children) {
json.colspan = 1;
return 1;
} else {
let leafCount = 0;
for(let i = 0 ; i < json.children.length ; i++){
leafCount = leafCount + getLeafCountTree(json.children[i]);
}
json.colspan = leafCount;
return leafCount;
}
}
// Number of tree node levels
let countTree = getLeafCountTree(datas[0])
function getMaxFloor(treeData) {
let floor = 0
let v = this
let max = 0
function each (data, floor) {
data.forEach(e => {
e.floor = floor
e.x=floor*170
if (floor > max) {
max = floor
}
if (e.children) {
each(e.children, floor + 1)
}
})
}
each(treeData,1)
return max
}
getMaxFloor(datas)
// The last child of each node
let lastchildren = [];
forxh(datas);
function forxh(list) {
for (let i = 0; i < list.length; i++) {
let chlist = list[i];
if (chlist.children) {
forxh(chlist.children);
} else {
lastchildren.push(chlist);
}
}
}
// Get all parent nodes above the leaf node
function treeFindPath (tree, func, path,n) {
if (!tree) return []
for (const data of tree) {
path.push(data.name)
if (func(data)) return path
if (data.children) {
const findChildren = treeFindPath(data.children, func, path,n)
if (findChildren.length) return findChildren
}
path.pop()
}
return []
}
function toLine(data){
return data.reduce((arr, {id, name, targetarr, x, y, children = []}) =>
arr.concat([{id, name, targetarr, x, y}], toLine(children)), [])
return result;
}
let listarr = toLine(datas);
let listarrs = toLine(datas)
let dataObject = {}
for(let i = 0; i<listarrs.length; i++) {
delete(listarrs[i].id)
}
for(let a = 0; a<listarr.length; a++) {
dataObject[listarr[a].id] = listarrs[a]
}
// Comparison function
function createComparisonFunction(propertyName) {
return function (object1,object2) {
let value1 = object1[propertyName];
let value2 = object2[propertyName];
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
};
}
lastchildren = lastchildren.sort(createComparisonFunction('x'))
// Coordinate value of each leaf node
for(let a = 0; a<lastchildren.length; a++) {
dataObject[lastchildren[a].id].y = (a+1)*120
}
for(let i =0 ; i<lastchildren.length; i++) {
let node = treeFindPath(datas, data=> data.targetarr===lastchildren[i].targetarr,[],i+1)
for(let j = 0; j<node.length; j++) {
for(let k= 0; k<listarrs.length; k++) {
if(node[j] == listarrs[k].name) {
listarrs[k].y = (i+1)*120
}
}
}
}
for(let i = 0; i<tmp.length; i++) {
for(let objs in dataObject) {
if(tmp[i].name == dataObject[objs].name) {
dataObject[objs].targetarr = tmp[i].targetarr
}
}
}
for(let a = 0; a<lastchildren.length; a++) {
dataObject[lastchildren[a].id].y = (a+1)*120
}
if(countTree>1) {
dataObject[Object.keys(locationsValue1)[0]].y = (countTree/2)*120+50
}
locationsValue = dataObject
jsPlumb.ready(() => {
JSP.init({
dag: this.dag,
instance: this.instance
})
// Backfill
JSP.jspBackfill({
// connects
connects: _.cloneDeep(store.state.dag.connects),
// Node location information
locations: _.cloneDeep(locationsValue),
// Node data
largeJson: _.cloneDeep(store.state.dag.tasks)
})
})
// Backfill
JSP.jspBackfill({
// connects
connects: _.cloneDeep(store.state.dag.connects),
// Node location information
locations: _.cloneDeep(store.state.dag.locations),
// Node data
largeJson: _.cloneDeep(store.state.dag.tasks)
} else {
jsPlumb.ready(() => {
JSP.init({
dag: this.dag,
instance: this.instance
})
// Backfill
JSP.jspBackfill({
// connects
connects: _.cloneDeep(store.state.dag.connects),
// Node location information
locations: _.cloneDeep(store.state.dag.locations),
// Node data
largeJson: _.cloneDeep(store.state.dag.tasks)
})
})
})
}
}
/**
......
......@@ -22,6 +22,7 @@
<div class="bar-box roundedRect jtk-draggable jtk-droppable jtk-endpoint-anchor jtk-connected"
:class="v === dagBarId ? 'active' : ''"
:id="v"
:key="v"
v-for="(item,v) in tasksTypeList"
@mousedown="_getDagId(v)">
<div data-toggle="tooltip" :title="item.description">
......@@ -42,7 +43,7 @@
size="xsmall"
:disabled="$route.name !== 'projects-instance-details'"
@click="_toggleView"
icon="fa fa-code">
icon="ans-icon-code">
</x-button>
<x-button
style="vertical-align: middle;"
......@@ -53,11 +54,11 @@
size="xsmall"
:disabled="$route.name !== 'projects-instance-details'"
@click="_toggleParam"
icon="fa fa-chevron-circle-right">
icon="ans-icon-arrow-circle-right">
</x-button>
<span class="name">{{name}}</span>
&nbsp;
<span v-if="name" class="copy-name" @click="_copyName" :data-clipboard-text="name"><i class="iconfont" data-container="body" data-toggle="tooltip" title="复制名称" >&#xe61e;</i></span>
<span v-if="name" class="copy-name" @click="_copyName" :data-clipboard-text="name"><i class="ans-icon-copy" data-container="body" data-toggle="tooltip" :title="$t('Copy name')" ></i></span>
</div>
<div class="save-btn">
<div class="operation" style="vertical-align: middle;">
......@@ -65,8 +66,9 @@
v-for="(item,$index) in toolOperList"
:class="_operationClass(item)"
:id="item.code"
:key="$index"
@click="_ckOperation(item,$event)">
<i class="iconfont" v-html="item.icon" data-toggle="tooltip" :title="item.description" ></i>
<i :class="item.icon" data-toggle="tooltip" :title="item.description" ></i>
</a>
</div>
<x-button
......@@ -74,7 +76,7 @@
:title="$t('Refresh DAG status')"
data-container="body"
style="vertical-align: middle;"
icon="fa fa-refresh"
icon="ans-icon-refresh"
type="primary"
:loading="isRefresh"
v-if="type === 'instance'"
......@@ -86,7 +88,7 @@
style="vertical-align: middle;"
type="primary"
size="xsmall"
icon="fa fa-reply"
icon="ans-icon-play"
@click="_rtNodesDag" >
{{$t('Return_1')}}
</x-button>
......@@ -96,7 +98,7 @@
size="xsmall"
:loading="spinnerLoading"
@click="_saveChart"
icon="fa fa-save"
icon="ans-icon-save"
>
{{spinnerLoading ? 'Loading...' : $t('Save')}}
</x-button>
......@@ -142,7 +144,8 @@
isRtTasks: false,
isRefresh: false,
isLoading: false,
taskId: null
taskId: null,
arg: false,
}
},
mixins: [disabledState],
......@@ -153,9 +156,44 @@
methods: {
...mapActions('dag', ['saveDAGchart', 'updateInstance', 'updateDefinition', 'getTaskState']),
...mapMutations('dag', ['addTasks', 'resetParams', 'setIsEditDag', 'setName']),
init () {
// DAG automatic layout
dagAutomaticLayout() {
$('#canvas').html('')
// Destroy round robin
Dag.init({
dag: this,
instance: jsPlumb.getInstance({
Endpoint: [
'Dot', { radius: 1, cssClass: 'dot-style' }
],
Connector: 'Straight',
PaintStyle: { lineWidth: 2, stroke: '#456' }, // Connection style
ConnectionOverlays: [
[
'Arrow',
{
location: 1,
id: 'arrow',
length: 12,
foldback: 0.8
}
]
],
Container: 'canvas'
})
})
if (this.tasks.length) {
Dag.backfill(true)
} else {
Dag.create()
}
},
init (args) {
if (this.tasks.length) {
Dag.backfill()
Dag.backfill(args)
// Process instances can view status
if (this.type === 'instance') {
this._getTaskState(false).then(res => {})
......@@ -211,7 +249,7 @@
let state = dom.find('.state-p')
dom.attr('data-state-id', v1.stateId)
dom.attr('data-dependent-result', v1.dependentResult || '')
state.append(`<b class="iconfont ${v1.isSpin ? 'fa fa-spin' : ''}" style="color:${v1.color}" data-toggle="tooltip" data-html="true" data-container="body">${v1.icoUnicode}</b>`)
state.append(`<b class="${v1.icoUnicode} ${v1.isSpin ? 'as as-spin' : ''}" style="color:${v1.color}" data-toggle="tooltip" data-html="true" data-container="body"></b>`)
state.find('b').attr('title', titleTpl(v2, v1.desc))
}
})
......@@ -513,7 +551,7 @@
})
},
mounted () {
this.init()
this.init(this.arg)
},
beforeDestroy () {
this.resetParams()
......
......@@ -32,7 +32,7 @@
:value="selectedModel === null ? '0' : selectedModel.value"
style="width: 100%;"
@on-click-icon.stop="_ckIcon">
<i slot="suffix" class="fa fa-times-circle" style="font-size: 15px;cursor: pointer;" v-show="!isIconState"></i>
<i slot="suffix" class="ans-icon-fail-solid" style="font-size: 15px;cursor: pointer;" v-show="!isIconState"></i>
<i slot="suffix" class="ans-icon-arrow-down" style="font-size: 12px;" v-show="isIconState"></i>
</x-input>
<x-option
......
......@@ -49,7 +49,7 @@
</div>
<div class="cont-box">
<label class="label-box">
<x-input v-model="interval" style="width: 128px;" :disabled="isDetails" maxlength="9">
<x-input v-model="interval" style="width: 200px;" :disabled="isDetails" maxlength="9">
<span slot="append">{{$t('Minute')}}</span>
</x-input>
</label>
......
......@@ -35,7 +35,7 @@
font-size: 14px;
color: #0097e0;
margin-left: 10px;
i.iconfont {
i.ansicon {
font-size: 18px;
vertical-align: middle;
}
......
......@@ -16,15 +16,15 @@
*/
<template>
<div class="form-model-model" v-clickoutside="_handleClose">
<div class="title-box">
<div class="title-box">
<span class="name">{{$t('Current node settings')}}</span>
<span class="go-subtask">
<!-- Component can't pop up box to do component processing -->
<m-log :item="backfillItem">
<template slot="history"><a href="javascript:" @click="_seeHistory" ><i class="iconfont">&#xe6ee;</i><em>{{$t('View history')}}</em></a></template>
<template slot="log"><a href="javascript:"><i class="iconfont">&#xe691;</i><em>{{$t('View log')}}</em></a></template>
<template slot="history"><a href="javascript:" @click="_seeHistory" ><i class="ansicon ans-icon-timer"></i><em>{{$t('View history')}}</em></a></template>
<template slot="log"><a href="javascript:"><i class="ansicon ans-icon-log"></i><em>{{$t('View log')}}</em></a></template>
</m-log>
<a href="javascript:" @click="_goSubProcess" v-if="_isGoSubProcess"><i class="iconfont">&#xe600;</i><em>{{$t('Enter this child node')}}</em></a>
<a href="javascript:" @click="_goSubProcess" v-if="_isGoSubProcess"><i class="ansicon ans-icon-node"></i><em>{{$t('Enter this child node')}}</em></a>
</span>
</div>
<div class="content-box" v-if="isContentBox">
......@@ -282,7 +282,7 @@
* Click external to close the current component
*/
_handleClose () {
this.close()
// this.close()
},
/**
* Jump to task instance
......@@ -369,7 +369,6 @@
}
$(`#${this.id}`).find('span').text(this.name)
// Store the corresponding node data structure
this.$emit('addTaskInfo', {
item: {
......@@ -455,7 +454,23 @@
this.description = o.description
this.maxRetryTimes = o.maxRetryTimes
this.retryInterval = o.retryInterval
this.workerGroupId = o.workerGroupId
// If the workergroup has been deleted, set the default workergroup
var hasMatch = false;
for (let i = 0; i < this.store.state.security.workerGroupsListAll.length; i++) {
var workerGroupId = this.store.state.security.workerGroupsListAll[i].id
if (o.workerGroupId == workerGroupId) {
hasMatch = true;
break;
}
}
if(!hasMatch){
this.workerGroupId = -1
}else{
this.workerGroupId = o.workerGroupId
}
}
}
this.isContentBox = true
......
......@@ -29,16 +29,16 @@
<span>{{$t('View log')}}</span>
<div class="full-screen">
<a href="javascript:" @click="_downloadLog" data-container="body" data-toggle="tooltip" :title="$t('Download Log')">
<i class="iconfont" style="font-size: 20px">&#xe610;</i>
<i class="ans-icon-download" style="font-size: 20px"></i>
</a>
<a href="javascript:" class="refresh-log" :class="loading ? 'active' :''" @click="!loading && _refreshLog()" data-container="body" data-toggle="tooltip" :title="$t('Refresh Log')">
<i class="fa iconfont">&#xe602;</i>
<i class="ans-icon-refresh"></i>
</a>
<a href="javascript:" @click="_screenOpen" v-show="!isScreen" data-container="body" data-toggle="tooltip" :title="$t('Enter full screen')">
<i class="iconfont">&#xe6e0;</i>
<i class="ans-icon-max"></i>
</a>
<a href="javascript:" @click="_screenClose" v-show="isScreen" data-container="body" data-toggle="tooltip" :title="$t('Cancel full screen')">
<i class="iconfont">&#xe660;</i>
<i class="ans-icon-min"></i>
</a>
</div>
</div>
......
......@@ -209,11 +209,11 @@ const typeList = [
*/
const sqlTypeList = [
{
id: 0,
id: '0',
code: `${i18n.$t('Query')}`
},
{
id: 1,
id: '1',
code: `${i18n.$t('Non Query')}`
}
]
......
......@@ -35,7 +35,7 @@
<x-option
v-for="city in datasourceList"
:key="city.id"
:value="city"
:value="city.id"
:label="city.code">
</x-option>
</x-select>
......@@ -56,7 +56,7 @@
// Data source type(List)
typeList: [],
// data source
datasource: {},
datasource: '',
// data source(List)
datasourceList: []
}
......@@ -77,7 +77,7 @@
}
this.$emit('on-dsData', {
type: this.type,
datasource: this.datasource.id
datasource: this.datasource
})
return true
},
......@@ -104,10 +104,10 @@
_handleTypeChanged ({ value }) {
this.type = value
this._getDatasourceData().then(res => {
this.datasource = this.datasourceList.length && this.datasourceList[0] || {}
this.datasource = this.datasourceList.length && this.datasourceList[0].id || ''
this.$emit('on-dsData', {
type: this.type,
datasource: this.datasource.id
datasource: this.datasource
})
})
}
......@@ -129,11 +129,11 @@
this._getDatasourceData().then(res => {
if (_.isEmpty(this.data)) {
this.$nextTick(() => {
this.datasource = this.datasourceList[0]
this.datasource = this.datasourceList[0].id
})
} else {
this.$nextTick(() => {
this.datasource = _.filter(this.datasourceList, v => v.id === this.data.datasource)[0]
this.datasource = this.data.datasource
})
}
this.$emit('on-dsData', {
......
......@@ -39,17 +39,17 @@
</x-select>
<template v-if="isInstance">
<span class="instance-state">
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'SUCCESS'" data-toggle="tooltip" data-container="body" :title="$t('success')">&#xe607;</i>
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'WAITING'" data-toggle="tooltip" data-container="body" :title="$t('waiting')">&#xe62a;</i>
<i class="iconfont" :class="'icon-' + el.state" v-if="el.state === 'FAILED'" data-toggle="tooltip" data-container="body" :title="$t('failed')">&#xe626;</i>
<i class="iconfont ans-icon-success-solid" :class="'icon-' + el.state" v-if="el.state === 'SUCCESS'" data-toggle="tooltip" data-container="body" :title="$t('success')"></i>
<i class="iconfont ans-icon-clock" :class="'icon-' + el.state" v-if="el.state === 'WAITING'" data-toggle="tooltip" data-container="body" :title="$t('waiting')"></i>
<i class="iconfont ans-icon-fail-solid" :class="'icon-' + el.state" v-if="el.state === 'FAILED'" data-toggle="tooltip" data-container="body" :title="$t('failed')"></i>
</span>
</template>
<span class="operation">
<a href="javascript:" class="delete" @click="!isDetails && _remove($index)">
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('delete')" >&#xe611;</i>
<i class="ans-icon-trash" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('delete')" ></i>
</a>
<a href="javascript:" class="add" @click="!isDetails && _add()" v-if="$index === (dependItemList.length - 1)">
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" data-container="body" :title="$t('Add')"></i>
</a>
</span>
</div>
......
......@@ -52,18 +52,18 @@
</x-input>
<span class="lt-add">
<a href="javascript:" style="color:red;" @click="!isDetails && _removeUdp($index)" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" >&#xe611;</i>
<i class="ans-icon-trash" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" ></i>
</a>
</span>
<span class="add" v-if="$index === (httpParamsList.length - 1)">
<a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
<span class="add-dp" v-if="!httpParamsList.length">
<a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
......@@ -219,10 +219,10 @@
a {
color: #000;
.iconfont {
font-size: 18px;
font-size: 16px;
vertical-align: middle;
display: inline-block;
margin-top: 1px;
margin-top: -5px;
}
}
}
......
......@@ -25,7 +25,7 @@
type="text"
v-model="localParamsList[$index].prop"
:placeholder="$t('prop(required)')"
maxlength="64"
maxlength="256"
@on-blur="_verifProp()"
:style="inputStyle">
</x-input>
......@@ -60,24 +60,24 @@
type="text"
v-model="localParamsList[$index].value"
:placeholder="$t('value(optional)')"
maxlength="64"
maxlength="256"
@on-blur="_handleValue()"
:style="inputStyle">
</x-input>
<span class="lt-add">
<a href="javascript:" style="color:red;" @click="!isDetails && _removeUdp($index)" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" >&#xe611;</i>
<i class="ans-icon-trash" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" ></i>
</a>
</span>
<span class="add" v-if="$index === (localParamsList.length - 1)">
<a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
<span class="add-dp" v-if="!localParamsList.length">
<a href="javascript:" @click="!isDetails && _addUdp()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
......@@ -222,10 +222,10 @@
a {
color: #000;
.iconfont {
font-size: 18px;
font-size: 16px;
vertical-align: middle;
display: inline-block;
margin-top: 1px;
margin-top: -5px;
}
}
}
......
......@@ -24,7 +24,7 @@
<x-option
v-for="city in sqlTypeList"
:key="city.id"
:value="city"
:value="city.id"
:label="city.code">
</x-option>
</x-select>
......@@ -41,29 +41,30 @@
// sql(List)
sqlTypeList: sqlTypeList,
// sql
sqlTypeId: {}
sqlTypeId: '0'
}
},
mixins: [disabledState],
props: {
sqlType: Number
sqlType: String
},
methods: {
/**
* return sqlType
*/
_handleSqlTypeChanged (val) {
this.$emit('on-sqlType', val.value.id)
this.$emit('on-sqlType', val.value)
}
},
watch: {
},
created () {
this.$nextTick(() => {
if (this.sqlType !== null) {
this.sqlTypeId = _.filter(this.sqlTypeList, v => v.id === this.sqlType)[0]
console.log(this.sqlType)
if (this.sqlType != 0) {
this.sqlTypeId = this.sqlType
} else {
this.sqlTypeId = this.sqlTypeList[0]
this.sqlTypeId = this.sqlTypeList[0].id
}
})
},
......
......@@ -32,18 +32,18 @@
</x-input>
<span class="lt-add">
<a href="javascript:" style="color:red;" @click="!isDetails && _removeStatement($index)" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" >&#xe611;</i>
<i class="ans-icon-trash" :class="_isDetails" data-toggle="tooltip" :title="$t('delete')" ></i>
</a>
</span>
<span class="add" v-if="$index === (localStatementList.length - 1)">
<a href="javascript:" @click="!isDetails && _addStatement()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
<span class="add" v-if="!localStatementList.length">
<a href="javascript:" @click="!isDetails && _addStatement()" >
<i class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">&#xe636;</i>
<i class="iconfont ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</span>
</div>
......@@ -149,10 +149,10 @@
.add {
a {
.iconfont {
font-size: 18px;
font-size: 16px;
vertical-align: middle;
display: inline-block;
margin-top: 1px;
margin-top: -5px;
}
}
}
......
......@@ -23,7 +23,7 @@
<x-option
v-for="city in udfsList"
:key="city.id"
:value="city"
:value="city.id"
:label="city.code">
</x-option>
</x-select>
......
......@@ -23,12 +23,8 @@
<a href="javascript:"
@click="!isDetails && _addDep()"
class="add-dep">
<i v-if="!isLoading" class="iconfont" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')">
&#xe636;
</i>
<i v-if="isLoading" class="iconfont fa fa-spin" data-toggle="tooltip" :title="$t('Add')">
&#xe6af;
</i>
<i v-if="!isLoading" class="ans-icon-increase" :class="_isDetails" data-toggle="tooltip" :title="$t('Add')"></i>
<i v-if="isLoading" class="ans-icon-spinner2 as as-spin" data-toggle="tooltip" :title="$t('Add')"></i>
</a>
</div>
<div class="dep-box">
......@@ -44,13 +40,12 @@
@click="!isDetails && _setRelation($index)">
{{el.relation === 'AND' ? $t('and') : $t('or')}}
</span>
<i class="iconfont dep-delete"
<i class="ans-icon-trash dep-delete"
data-toggle="tooltip"
data-container="body"
:class="_isDetails"
@click="!isDetails && _deleteDep($index)"
:title="$t('delete')" >
&#xe611;
</i>
<m-depend-item-list
:dependTaskList='dependTaskList'
......
......@@ -98,7 +98,7 @@
</span>
</div>
<div class="clearfix list">
<span class="sp1">{{$t('jobManagerMemory')}}</span>
<span class="sp1" style="word-break:break-all">{{$t('jobManagerMemory')}}</span>
<span class="sp2">
<x-input
:disabled="isDetails"
......
......@@ -60,7 +60,7 @@
<div slot="text">{{$t('Http Check Condition')}}</div>
<div slot="content">
<x-select
style="width: 150px;"
style="width: 230px;"
v-model="httpCheckCondition"
:disabled="isDetails">
<x-option
......@@ -101,6 +101,7 @@
<script>
import _ from 'lodash'
import i18n from '@/module/i18n'
import cookie from '@/module/util/cookie'
import mLocalParams from './_source/localParams'
import mHttpParams from './_source/httpParams'
import mListBox from './_source/listBox'
......@@ -116,7 +117,7 @@
httpMethod: 'GET',
httpMethodList: [{ code: 'GET' }, { code: 'POST' }, { code: 'HEAD' }, { code: 'PUT' }, { code: 'DELETE' }],
httpCheckCondition: 'STATUS_CODE_DEFAULT',
httpCheckConditionList: [{ code: 'STATUS_CODE_DEFAULT',value:'默认响应码200' }, { code: 'STATUS_CODE_CUSTOM',value:'自定义响应码' }, { code: 'BODY_CONTAINS',value:'内容包含' }, { code: 'BODY_NOT_CONTAINS',value:'内容不包含' }]
httpCheckConditionList: cookie.get('language') == 'en_US'? [{ code: 'STATUS_CODE_DEFAULT',value:'Default response code 200' }, { code: 'STATUS_CODE_CUSTOM',value:'Custom response code' }, { code: 'BODY_CONTAINS',value:'Content includes' }, { code: 'BODY_NOT_CONTAINS',value:'Content does not contain' }]:[{ code: 'STATUS_CODE_DEFAULT',value:'默认响应码200' }, { code: 'STATUS_CODE_CUSTOM',value:'自定义响应码' }, { code: 'BODY_CONTAINS',value:'内容包含' }, { code: 'BODY_NOT_CONTAINS',value:'内容不包含' }]
}
},
props: {
......
......@@ -32,6 +32,22 @@
</x-select>
</div>
</m-list-box>
<m-list-box>
<div slot="text">{{$t('Spark Version')}}</div>
<div slot="content">
<x-select
style="width: 130px;"
v-model="sparkVersion"
:disabled="isDetails">
<x-option
v-for="city in sparkVersionList"
:key="city.code"
:value="city.code"
:label="city.code">
</x-option>
</x-select>
</div>
</m-list-box>
<m-list-box v-if="programType !== 'PYTHON'">
<div slot="text">{{$t('Main class')}}</div>
<div slot="content">
......@@ -224,7 +240,11 @@
// Program type
programType: 'SCALA',
// Program type(List)
programTypeList: [{ code: 'JAVA' }, { code: 'SCALA' }, { code: 'PYTHON' }]
programTypeList: [{ code: 'JAVA' }, { code: 'SCALA' }, { code: 'PYTHON' }],
// Spark version
sparkVersion: 'SPARK2',
// Spark version(LIst)
sparkVersionList: [{ code: 'SPARK2' }, { code: 'SPARK1' }]
}
},
props: {
......@@ -318,7 +338,8 @@
executorCores: this.executorCores,
mainArgs: this.mainArgs,
others: this.others,
programType: this.programType
programType: this.programType,
sparkVersion: this.sparkVersion
})
return true
},
......@@ -366,6 +387,7 @@
this.mainArgs = o.params.mainArgs || ''
this.others = o.params.others
this.programType = o.params.programType || 'SCALA'
this.sparkVersion = o.params.sparkVersion || 'SPARK2'
// backfill resourceList
let resourceList = o.params.resourceList || []
......
......@@ -35,7 +35,7 @@
:sql-type="sqlType">
</m-sql-type>
</div>
<div v-if="!sqlType" style="display: inline-block;padding-left: 10px;margin-top: 2px;">
<div v-if="sqlType==0" style="display: inline-block;padding-left: 10px;margin-top: 2px;">
<x-checkbox-group v-model="showType">
<x-checkbox :label="'TABLE'" :disabled="isDetails">{{$t('Table')}}</x-checkbox>
<x-checkbox :label="'ATTACHMENT'" :disabled="isDetails">{{$t('Attachment')}}</x-checkbox>
......@@ -43,7 +43,7 @@
</div>
</div>
</m-list-box>
<template v-if="!sqlType">
<template v-if="sqlType==0">
<m-list-box>
<div slot="text"><b class='requiredIcon'>*</b>{{$t('Title')}}</div>
<div slot="content">
......@@ -167,7 +167,7 @@
// UDF function
udfs: '',
// Sql type
sqlType: 0,
sqlType: '0',
// Email title
title: '',
// Form/attachment
......@@ -256,11 +256,11 @@
return false
}
// receivers Subcomponent verification
if (!this.sqlType && !this.$refs.refEmail._manualEmail()) {
if (this.sqlType==0 && !this.$refs.refEmail._manualEmail()) {
return false
}
// receiversCc Subcomponent verification
if (!this.sqlType && !this.$refs.refCc._manualEmail()) {
if (this.sqlType==0 && !this.$refs.refCc._manualEmail()) {
return false
}
// udfs Subcomponent verification Verification only if the data type is HIVE
......@@ -356,10 +356,10 @@
watch: {
// Listening to sqlType
sqlType (val) {
if (val) {
if (val==0) {
this.showType = []
}
if (val !== 0) {
if (val != 0) {
this.title = ''
this.receivers = []
this.receiversCc = []
......
import $ from 'jquery'
import d3 from 'd3'
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
......
......@@ -14,9 +14,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import 'jquery-ui/ui/widgets/draggable'
import 'jquery-ui/ui/widgets/droppable'
import 'jquery-ui/ui/widgets/resizable'
import Vue from 'vue'
import $ from 'jquery'
import _ from 'lodash'
import i18n from '@/module/i18n'
import { jsPlumb } from 'jsplumb'
......@@ -25,6 +26,7 @@ import store from '@/conf/home/store'
import router from '@/conf/home/router'
import Permissions from '@/module/permissions'
import { uuid, findComponentDownward } from '@/module/util/'
import {
tasksAll,
rtTasksTpl,
......@@ -264,10 +266,10 @@ JSP.prototype.tasksContextmenu = function (event) {
let isTwo = store.state.dag.isDetails
let html = [
`<a href="javascript:" id="startRunning" class="${isOne ? '' : 'disbled'}"><i class="iconfont">&#xe60b;</i><span>${i18n.$t('Start')}</span></a>`,
`<a href="javascript:" id="editNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe601;</i><span>${i18n.$t('Edit')}</span></a>`,
`<a href="javascript:" id="copyNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe61e;</i><span>${i18n.$t('Copy')}</span></a>`,
`<a href="javascript:" id="removeNodes" class="${isTwo ? 'disbled' : ''}"><i class="iconfont">&#xe611;</i><span>${i18n.$t('Delete')}</span></a>`
`<a href="javascript:" id="startRunning" class="${isOne ? '' : 'disbled'}"><i class="ans-icon-play"></i><span>${i18n.$t('Start')}</span></a>`,
`<a href="javascript:" id="editNodes" class="${isTwo ? 'disbled' : ''}"><i class="ans-icon-edit"></i><span>${i18n.$t('Edit')}</span></a>`,
`<a href="javascript:" id="copyNodes" class="${isTwo ? 'disbled' : ''}"><i class="ans-icon-copy"></i><span>${i18n.$t('Copy')}</span></a>`,
`<a href="javascript:" id="removeNodes" class="${isTwo ? 'disbled' : ''}"><i class="ans-icon-trash"></i><span>${i18n.$t('Delete')}</span></a>`
]
let operationHtml = () => {
......@@ -583,10 +585,10 @@ JSP.prototype.copyNodes = function ($id) {
JSP.prototype.handleEventScreen = function ({ item, is }) {
let screenOpen = true
if (is) {
item.icon = '&#xe660;'
item.icon = 'ans-icon-min'
screenOpen = true
} else {
item.icon = '&#xe6e0;'
item.icon = 'ans-icon-max'
screenOpen = false
}
let $mainLayoutModel = $('.main-layout-model')
......
......@@ -16,7 +16,6 @@
*/
import _ from 'lodash'
import $ from 'jquery'
import i18n from '@/module/i18n'
import store from '@/conf/home/store'
......@@ -38,7 +37,7 @@ const saveTargetarr = (valId, domId) => {
}
const rtBantpl = () => {
return `<i class="iconfont" data-toggle="tooltip" data-html="true" data-container="body" data-placement="left" title="${i18n.$t('Prohibition execution')}">&#xe63e;</i>`
return `<i class="ans-icon-forbidden" data-toggle="tooltip" data-html="true" data-container="body" data-placement="left" title="${i18n.$t('Prohibition execution')}"></i>`
}
/**
......
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册