diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f5dd392..0000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -/build/ -/config/ -/dist/ -/static/ -/*.js - -src/common/fork/* - diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 8547c3a..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,67 +0,0 @@ -// https://eslint.org/docs/user-guide/configuring - -module.exports = { - root: true, - parser: 'babel-eslint', - parserOptions: { - sourceType: 'module' - }, - env: { - browser: true, - }, - // https://github.com/standard/standard/blob/master/docs/RULES-en.md - extends: 'standard', - // required to lint *.vue files - plugins: [ - 'html' - ], - // add your custom rules here - 'rules': { - // allow paren-less arrow functions - 'arrow-parens': 0, - // allow async-await - 'generator-star-spacing': 0, - // allow debugger during development - 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, - - //ignore the paren check before function. - 'space-before-function-paren': [0, 'always'], - //ignore the space before block. - 'space-before-blocks': [0, 'always'], - //ignore the empty line check. - 'no-multiple-empty-lines': [0, {'max': 2}], - //semicolon or no semicolon is ok. - 'semi': [0, 'always'], - //ignore the space before or after => - 'arrow-spacing': 0, - //the type of quotes - 'quotes': [0, 'single'], - //block can be padded by blank lines - 'padded-blocks': 0, - //comma spacing before or after. - 'comma-spacing': 0, - //key spacing. - 'key-spacing': [0, {'beforeColon': false, 'afterColon': true}], - //trailing spaces - 'no-trailing-spaces': 0, - //spaced comment - 'spaced-comment': 0, - //keyword-spacing - 'keyword-spacing': 0, - 'space-in-parens': 0, - 'no-extend-native': 0, - 'no-useless-escape': 0, - 'no-unused-vars': 0, - 'no-undef': 0, - 'no-tabs': 0, - 'indent': 0, - 'no-multi-spaces': 0, - 'eol-last': 0, - 'no-template-curly-in-string': 0, - 'no-mixed-spaces-and-tabs': 0, - 'handle-callback-err': 0, - "import/no-webpack-loader-syntax": "off", - 'object-curly-spacing': 0, - 'comma-dangle': 0 - } -} diff --git a/.gitignore b/.gitignore index 021d684..0934130 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc .DS_Store -node_modules/ -/dist/ +.env.local +.env.development.local +.env.test.local +.env.production.local + npm-debug.log* -yarn.lock yarn-debug.log* yarn-error.log* +yarn.lock # Editor directories and files .idea @@ -13,3 +30,6 @@ yarn-error.log* *.ntvs* *.njsproj *.sln +draft.html + +report.*.json diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index d8e7eb7..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,27 +0,0 @@ -# 蓝眼云盘 - -2018-04-12 -tank-1.0.3 -1. 添加了多文件同时上传的功能. -2. 开发情况下有可能上传的文件路径没有权限,添加了更多提示. - -2018-01-19 -tank-1.0.2 -1. 修复了下载时无法估算文件大小的bug,header头重添加了Content-Type. [#2](https://github.com/eyebluecn/tank/issues/2) -2. 修复了移动端样式混乱的问题.[#3](https://github.com/eyebluecn/tank/issues/3) -3. 修复了文夹层数无上限的bug. [#4](https://github.com/eyebluecn/tank/issues/4) -4. 修复了文件夹自己移动到自己后就全部消失的bug. [#8](https://github.com/eyebluecn/tank/issues/8) -5. 统一不能删除用户,但是可以禁用或者启用用户. [#9](https://github.com/eyebluecn/tank/issues/9) - - -2018-01-12 -tank-1.0.1 -1. 修复面包屑回退的bug [#1](https://github.com/eyebluecn/tank/issues/1) -2. 修复移动文件时,可能移到其他人的文件夹下的bug -3. 新增404页面 -4. 移除掉一些没用的代码 - - -2018-01-01 -tank-1.0.0 -完成基本核心功能 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index c3060d9..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 蓝眼 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index c2ca977..64e343e 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,44 @@ -![蓝眼云盘logo](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/logo.png) +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). -# 蓝眼云盘前端 +## Available Scripts -##### [在线Demo](http://tank.eyeblue.cn) (体验账号: demo 密码:123456) +In the project directory, you can run: -##### [配套后端tank](https://github.com/eyebluecn/tank) +### `yarn start` -### 简介 -蓝眼云盘是前后端彻底分离的项目,本项目主要为后端提供静态资源文件。更多关于蓝眼云盘的介绍,请参考[蓝眼云盘后端](https://github.com/eyebluecn/tank) +Runs the app in the development mode.
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser. -如果您觉得蓝眼云盘对您有帮助,请不要吝惜您的star :smile: +The page will reload if you make edits.
+You will also see any lint errors in the console. -### 技术栈 +### `yarn test` -vue2.0 + vue-router + vuex + vue-resource + webpack + es6 + less +Launches the test runner in the interactive watch mode.
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +### `yarn build` -### 运行 +Builds the app for production to the `build` folder.
+It correctly bundles React in production mode and optimizes the build for the best performance. -``` -npm install +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! -npm run serve -``` +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. -### 打包 +### `yarn eject` -``` -npm run build -``` - 打包的结果在`dist`文件夹下,将该文件夹下的内容放置在[后端tank](https://github.com/eyebluecn/tank)的`build/html`文件夹下即可。 +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. -### 配套后端 -此项目有配套后端项目,对golang感兴趣的同学可以猛戳 [配套后端tank](https://github.com/eyebluecn/tank) +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. -### 总结 -1、 蓝眼的宗旨是专注于开源精致而优雅的软件,所以在代码的构建过程中我们不停地思考与迭代,追求最优质的代码。 +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. -2、 蓝眼云盘前端代码的构建完全面向对象,可扩展能力强,涉及多用户,多权限功能。 - -3、 蓝眼云盘后端采用了更贴近底层golang语言,更加适用于文件传输类的软件,速度更快,用户体验更好。 +## Learn More -### Contribution +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). -感谢所有蓝眼云盘的贡献者 [@zicla](https://github.com/zicla),[@seaheart](https://github.com/seaheart),@heying,[@hxsherry](https://github.com/hxsherry) - -如果您也想参与进来,请尽情的fork, star, post issue, pull requests - -### 软件截图 - -#### PC端截图 - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/tank0.png) - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/tank1.png) - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/tank2.png) - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/tank3.png) - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/tank4.png) - -#### 手机端截图 - -![](https://raw.githubusercontent.com/eyebluecn/tank/master/build/doc/img/mobile.png) - -### License - -[MIT](http://opensource.org/licenses/MIT) - -Copyright (c) 2017-present, eyeblue.cn +To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 649b152..0000000 --- a/babel.config.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - presets: [ - '@vue/app', - ], - plugins: [ - [ - "component", - { - "libraryName": "element-ui", - "styleLibraryName": "theme-chalk" - } - ] - ] -} diff --git a/doc/vue-config.md b/doc/vue-config.md deleted file mode 100644 index 52794ec..0000000 --- a/doc/vue-config.md +++ /dev/null @@ -1,33 +0,0 @@ -## change default port to 6015 -create file `vue.config.js` next to `package.json` -```js -module.exports = { - devServer: { - port: 6015 - } -} -``` - -## Add less support - -npm install -D less-loader less - -## Add http proxy - -``` -module.exports = { - devServer: { - proxy: { - '/api': { - //target: 'https://tank.eyeblue.cn', - target: 'http://127.0.0.1:6010', - changeOrigin: true, - pathRewrite: { - '^/api': '/api' - } - } - } - } -} -``` - diff --git a/package.json b/package.json index e058601..4691d9f 100644 --- a/package.json +++ b/package.json @@ -1,80 +1,39 @@ { - "name": "EyeblueTank", - "version": "3.0.5", + "name": "tank-front", + "version": "0.1.0", "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" - }, "dependencies": { - "animate.css": "^3.7.0", - "babel-polyfill": "^6.26.0", - "bootstrap": "^3.4.1", - "clipboard": "^2.0.4", - "core-js": "^2.6.5", - "echarts": "^4.2.1", - "element-ui": "^2.8.2", - "enquire.js": "^2.1.6", - "font-awesome": "^4.7.0", - "icheck": "^1.0.2", - "jquery": "^3.4.1", - "js-cookie": "^2.2.0", - "perfect-scrollbar": "^1.4.0", - "swiper": "^4.5.0", - "velocity-animate": "^1.5.2", - "vue": "^2.6.10", - "vue-echarts": "^4.0.2", - "vue-i18n": "^8.11.2", - "vue-multiselect": "^2.1.6", - "vue-nprogress": "^0.1.5", - "vue-resource": "^1.5.1", - "vue-router": "^3.0.6", - "vuex": "^3.1.1", - "vuex-router-sync": "^5.0.0", - "x-photoswipe": "^4.1.3-rc.1" + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "@types/jest": "^24.0.0", + "@types/node": "^12.0.0", + "@types/react": "^16.9.0", + "@types/react-dom": "^16.9.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-scripts": "3.4.1", + "typescript": "~3.7.2" }, - "devDependencies": { - "@vue/cli-plugin-babel": "^3.7.0", - "@vue/cli-plugin-eslint": "^3.7.0", - "@vue/cli-service": "^3.7.0", - "@vue/eslint-config-standard": "^4.0.0", - "babel-eslint": "^10.0.1", - "babel-plugin-component": "^1.1.1", - "eslint": "^5.16.0", - "eslint-config-standard": "^12.0.0", - "eslint-plugin-html": "^5.0.5", - "eslint-plugin-import": "^2.17.2", - "eslint-plugin-node": "^9.0.1", - "eslint-plugin-promise": "^4.1.1", - "eslint-plugin-standard": "^4.0.0", - "eslint-plugin-vue": "^5.0.0", - "less": "^3.9.0", - "less-loader": "^5.0.0", - "vue-template-compiler": "^2.5.21" + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" }, "eslintConfig": { - "root": true, - "env": { - "node": true - }, - "extends": [ - "plugin:vue/essential", - "eslint:recommended", - "@vue/standard" + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" ], - "rules": {}, - "parserOptions": { - "parser": "babel-eslint" - } - }, - "postcss": { - "plugins": { - "autoprefixer": {} - } - }, - "browserslist": [ - "> 1%", - "last 2 versions" - ] + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } } diff --git a/public/favicon.ico b/public/favicon.ico index 11db608..bcd5dfd 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html index 28b31e9..aa069f2 100644 --- a/public/index.html +++ b/public/index.html @@ -1,17 +1,43 @@ - - - - - EyeblueTank + + + + + + + + + + React App - -
- + +
+ diff --git a/public/logo192.png b/public/logo192.png new file mode 100644 index 0000000..fc44b0a Binary files /dev/null and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png new file mode 100644 index 0000000..a4e47a6 Binary files /dev/null and b/public/logo512.png differ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..74b5e05 --- /dev/null +++ b/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/src/App.test.tsx b/src/App.test.tsx new file mode 100644 index 0000000..4db7ebc --- /dev/null +++ b/src/App.test.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + const { getByText } = render(); + const linkElement = getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..a53698a --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import logo from './logo.svg'; +import './App.css'; + +function App() { + return ( +
+
+ logo +

+ Edit src/App.tsx and save to reload. +

+ + Learn React + +
+
+ ); +} + +export default App; diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index 0da933e..0000000 --- a/src/App.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - diff --git a/src/assets/css/app.less b/src/assets/css/app.less deleted file mode 100644 index fff006d..0000000 --- a/src/assets/css/app.less +++ /dev/null @@ -1,169 +0,0 @@ -//global css. -//Include font-awesome -//Include what we need in bootstrap. -@import "bootstrap/bootstrap.less"; -@import "inspinia/style.less"; -//Animated -@import "~animate.css/animate.min.css"; -//element-ui -@import "~element-ui/lib/theme-chalk/index.css"; -//使用自定义的主题 -@import "global/border.less"; -@import "global/button.less"; -@import "global/color.less"; -@import "global/font.less"; -@import "global/layout.less"; -@import "global/miscellaneous.less"; -@import "global/responsive.less"; - -//h2被污染了 -.el-notification__title { - margin-top: 0; -} - -.el-dialog__wrapper { - .el-dialog__body { - padding: 0 20px 20px 20px; - } -} - -//手机端的弹出框太大了 -@media (max-width: 768px) { - .el-message-box__wrapper { - .el-message-box { - width: 90%; - } - } - - .el-dialog__wrapper { - .el-dialog { - width: 90%; - } - } - -} - - -html, body { - font-family: "微软雅黑", Microsoft YaHei, "Helvetica Neue", Helvetica, Arial, sans-serif, "open sans"; - font-size: 13px; - color: @text-color; - background-color: white; - - img { - max-width: 100%; - } - -} - -//列表单元格的样式。 -.nb-app { - - //media-body下的p字体大小 - .media-body { - p { - font-size: 13px; - } - } - - .cell-title { - font-size: 17px; - color: @app-color-title; - .one-line; - - a { - font-size: 17px; - color: @app-color-title; - - &:hover { - color: @brand-primary; - } - } - } - - .cell-content { - font-size: 12px; - color: @app-color-title; - letter-spacing: 0; - line-height: 18px; - } - - .cell-description { - font-size: 12px; - color: @app-color-content; - letter-spacing: 0; - line-height: 24px; - } - -} - -//超链接颜色. -a { - color: @brand-primary; - - &:hover, &:focus { - color: @brand-info; - } -} - -//段落统一样式 -p { - color: #333; - font-size: 15px; - padding: 0; -} - -//每个页面导航处样式 -.pedia-navigation { - margin-bottom: 10px; - border-bottom: 1px solid #E6E6E6; - position: relative; - - .item { - font-size: 16px; - color: #778195; - margin-top: 15px; - margin-right: 20px; - display: inline-block; - box-sizing: content-box; - line-height: 30px; - - &:hover, &.is-link-active, &.active { - color: @brand-primary; - - border-bottom: 2px solid @brand-primary; - } - } - - .tool { - position: absolute; - right: 0; - bottom: 5px; - display: inline-block; - } -} - -//markdown中默认图片剧中 -p { - > img { - text-align: center; - } -} - -//列表页中展开的标准样式 -.form-info { - margin-bottom: 10px; - - > span:first-child:not(.label) { - width: 150px; - color: #99a9bf; - font-size: 15px; - font-weight: bold; - } - - > span:last-child:not(.label) { - font-size: 15px; - } -} - - diff --git a/src/assets/css/bootstrap/bootstrap.less b/src/assets/css/bootstrap/bootstrap.less deleted file mode 100644 index 1d1850a..0000000 --- a/src/assets/css/bootstrap/bootstrap.less +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -// Core variables and mixins -@import "../global/variables.less"; - - - -@import "~bootstrap/less/mixins.less"; -// Reset and dependencies -@import "~bootstrap/less/normalize.less"; -@import "~bootstrap/less/print.less"; -//We DO NOT use bootstrap's icon. We use font-awesome -//@import "~bootstrap/less/glyphicons.less"; -// Core CSS -@import "~bootstrap/less/scaffolding.less"; -@import "~bootstrap/less/type.less"; -@import "~bootstrap/less/code.less"; -@import "~bootstrap/less/grid.less"; -@import "~bootstrap/less/tables.less"; -@import "~bootstrap/less/forms.less"; -@import "~bootstrap/less/buttons.less"; -// Components -@import "~bootstrap/less/component-animations.less"; -@import "~bootstrap/less/dropdowns.less"; -@import "~bootstrap/less/button-groups.less"; -@import "~bootstrap/less/input-groups.less"; -@import "~bootstrap/less/navs.less"; -@import "~bootstrap/less/navbar.less"; -@import "~bootstrap/less/breadcrumbs.less"; -@import "~bootstrap/less/pagination.less"; -@import "~bootstrap/less/pager.less"; -@import "~bootstrap/less/labels.less"; -@import "~bootstrap/less/badges.less"; -@import "~bootstrap/less/jumbotron.less"; -@import "~bootstrap/less/thumbnails.less"; -@import "~bootstrap/less/alerts.less"; -@import "~bootstrap/less/progress-bars.less"; -@import "~bootstrap/less/media.less"; -@import "~bootstrap/less/list-group.less"; -@import "~bootstrap/less/panels.less"; -@import "~bootstrap/less/responsive-embed.less"; -@import "~bootstrap/less/wells.less"; -@import "~bootstrap/less/close.less"; -// Components w/ JavaScript -@import "~bootstrap/less/modals.less"; -@import "~bootstrap/less/tooltip.less"; -@import "~bootstrap/less/popovers.less"; -@import "~bootstrap/less/carousel.less"; -// Utility classes -@import "~bootstrap/less/utilities.less"; -@import "~bootstrap/less/responsive-utilities.less"; diff --git a/src/assets/css/bootstrap/variables.less b/src/assets/css/bootstrap/variables.less deleted file mode 100644 index 4099711..0000000 --- a/src/assets/css/bootstrap/variables.less +++ /dev/null @@ -1,872 +0,0 @@ -// -// Variables -// -------------------------------------------------- - - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - -@gray-base: #000; -@gray-darker: lighten(@gray-base, 13.5%); // #222 -@gray-dark: lighten(@gray-base, 20%); // #333 -@gray: lighten(@gray-base, 33.5%); // #555 -@gray-light: lighten(@gray-base, 46.7%); // #777 -@gray-lighter: lighten(@gray-base, 93.5%); // #eee - -//zhengxianqian Theme. -@brand-primary: #23B7E5; -@brand-success: #1ab394; -@brand-info: #5EC1C5; -@brand-warning: #FEC62E; -@brand-danger: #FE8768; -@brand-gray: #c2c2c2; -@brand-laxative: #B3EE3A; - - -//== Scaffolding -// -//## Settings for some of the most global styles. - -//** Background color for ``. -@body-bg: #fff; -//** Global text color on ``. -@text-color: @gray-dark; - -//** Global textual link color. -@link-color: @brand-primary; -//** Link hover color set via `darken()` function. -@link-hover-color: darken(@link-color, 15%); -//** Link hover decoration. -@link-hover-decoration: underline; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; -@font-family-serif: Georgia, "Times New Roman", Times, serif; -//** Default monospace fonts for ``, ``, and `
`.
-@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
-@font-family-base:        @font-family-sans-serif;
-
-@font-size-base:          14px;
-@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
-@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
-
-@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
-@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
-@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
-@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
-@font-size-h5:            @font-size-base;
-@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-@line-height-base:        1.428571429; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
-
-//** By default, this inherits from the ``.
-@headings-font-family:    inherit;
-@headings-font-weight:    500;
-@headings-line-height:    1.1;
-@headings-color:          inherit;
-
-
-//== Iconography
-//
-//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-//** Load fonts from this directory.
-@icon-font-path:          "../fonts/";
-//** File name for all font files.
-@icon-font-name:          "glyphicons-halflings-regular";
-//** Element ID within SVG icon file.
-@icon-font-svg-id:        "glyphicons_halflingsregular";
-
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-@padding-base-vertical:     6px;
-@padding-base-horizontal:   12px;
-
-@padding-large-vertical:    10px;
-@padding-large-horizontal:  16px;
-
-@padding-small-vertical:    5px;
-@padding-small-horizontal:  10px;
-
-@padding-xs-vertical:       1px;
-@padding-xs-horizontal:     5px;
-
-@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
-@line-height-small:         1.5;
-
-@border-radius-base:        4px;
-@border-radius-large:       6px;
-@border-radius-small:       3px;
-
-//** Global color for active items (e.g., navs or dropdowns).
-@component-active-color:    #fff;
-//** Global background color for active items (e.g., navs or dropdowns).
-@component-active-bg:       @brand-primary;
-
-//** Width of the `border` for generating carets that indicate dropdowns.
-@caret-width-base:          4px;
-//** Carets increase slightly in size for larger components.
-@caret-width-large:         5px;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for ``s and ``s.
-@table-cell-padding:            8px;
-//** Padding for cells in `.table-condensed`.
-@table-condensed-cell-padding:  5px;
-
-//** Default background color used for all tables.
-@table-bg:                      transparent;
-//** Background color used for `.table-striped`.
-@table-bg-accent:               #f9f9f9;
-//** Background color used for `.table-hover`.
-@table-bg-hover:                #f5f5f5;
-@table-bg-active:               @table-bg-hover;
-
-//** Border color for table and cell borders.
-@table-border-color:            #ddd;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-@btn-font-weight:                normal;
-
-@btn-default-color:              #333;
-@btn-default-bg:                 #fff;
-@btn-default-border:             #ccc;
-
-@btn-primary-color:              #fff;
-@btn-primary-bg:                 @brand-primary;
-@btn-primary-border:             darken(@btn-primary-bg, 5%);
-
-@btn-success-color:              #fff;
-@btn-success-bg:                 @brand-success;
-@btn-success-border:             darken(@btn-success-bg, 5%);
-
-@btn-info-color:                 #fff;
-@btn-info-bg:                    @brand-info;
-@btn-info-border:                darken(@btn-info-bg, 5%);
-
-@btn-warning-color:              #fff;
-@btn-warning-bg:                 @brand-warning;
-@btn-warning-border:             darken(@btn-warning-bg, 5%);
-
-@btn-danger-color:               #fff;
-@btn-danger-bg:                  @brand-danger;
-@btn-danger-border:              darken(@btn-danger-bg, 5%);
-
-@btn-link-disabled-color:        @gray-light;
-
-// Allows for customizing button radius independently from global border radius
-@btn-border-radius-base:         @border-radius-base;
-@btn-border-radius-large:        @border-radius-large;
-@btn-border-radius-small:        @border-radius-small;
-
-
-//== Forms
-//
-//##
-
-//** `` background color
-@input-bg:                       #fff;
-//** `` background color
-@input-bg-disabled:              @gray-lighter;
-
-//** Text color for ``s
-@input-color:                    @gray;
-//** `` border color
-@input-border:                   #ccc;
-
-// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
-//** Default `.form-control` border radius
-// This has no effect on ``s in CSS.
-@input-border-radius:            @border-radius-base;
-//** Large `.form-control` border radius
-@input-border-radius-large:      @border-radius-large;
-//** Small `.form-control` border radius
-@input-border-radius-small:      @border-radius-small;
-
-//** Border color for inputs on focus
-@input-border-focus:             #66afe9;
-
-//** Placeholder text color
-@input-color-placeholder:        #999;
-
-//** Default `.form-control` height
-@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
-//** Large `.form-control` height
-@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
-//** Small `.form-control` height
-@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
-
-//** `.form-group` margin
-@form-group-margin-bottom:       15px;
-
-@legend-color:                   @gray-dark;
-@legend-border-color:            #e5e5e5;
-
-//** Background color for textual input addons
-@input-group-addon-bg:           @gray-lighter;
-//** Border color for textual input addons
-@input-group-addon-border-color: @input-border;
-
-//** Disabled cursor for form controls and buttons.
-@cursor-disabled:                not-allowed;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-@dropdown-bg:                    #fff;
-//** Dropdown menu `border-color`.
-@dropdown-border:                rgba(0,0,0,.15);
-//** Dropdown menu `border-color` **for IE8**.
-@dropdown-fallback-border:       #ccc;
-//** Divider color for between dropdown items.
-@dropdown-divider-bg:            #e5e5e5;
-
-//** Dropdown link text color.
-@dropdown-link-color:            @gray-dark;
-//** Hover color for dropdown links.
-@dropdown-link-hover-color:      darken(@gray-dark, 5%);
-//** Hover background for dropdown links.
-@dropdown-link-hover-bg:         #f5f5f5;
-
-//** Active dropdown menu item text color.
-@dropdown-link-active-color:     @component-active-color;
-//** Active dropdown menu item background color.
-@dropdown-link-active-bg:        @component-active-bg;
-
-//** Disabled dropdown menu item background color.
-@dropdown-link-disabled-color:   @gray-light;
-
-//** Text color for headers within dropdown menus.
-@dropdown-header-color:          @gray-light;
-
-//** Deprecated `@dropdown-caret-color` as of v3.1.0
-@dropdown-caret-color:           #000;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-@zindex-navbar:            1000;
-@zindex-dropdown:          1000;
-@zindex-popover:           1060;
-@zindex-tooltip:           1070;
-@zindex-navbar-fixed:      1030;
-@zindex-modal-background:  1040;
-@zindex-modal:             1050;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-//** Deprecated `@screen-xs` as of v3.0.1
-@screen-xs:                  480px;
-//** Deprecated `@screen-xs-min` as of v3.2.0
-@screen-xs-min:              @screen-xs;
-//** Deprecated `@screen-phone` as of v3.0.1
-@screen-phone:               @screen-xs-min;
-
-// Small screen / tablet
-//** Deprecated `@screen-sm` as of v3.0.1
-@screen-sm:                  768px;
-@screen-sm-min:              @screen-sm;
-//** Deprecated `@screen-tablet` as of v3.0.1
-@screen-tablet:              @screen-sm-min;
-
-// Medium screen / desktop
-//** Deprecated `@screen-md` as of v3.0.1
-@screen-md:                  992px;
-@screen-md-min:              @screen-md;
-//** Deprecated `@screen-desktop` as of v3.0.1
-@screen-desktop:             @screen-md-min;
-
-// Large screen / wide desktop
-//** Deprecated `@screen-lg` as of v3.0.1
-@screen-lg:                  1200px;
-@screen-lg-min:              @screen-lg;
-//** Deprecated `@screen-lg-desktop` as of v3.0.1
-@screen-lg-desktop:          @screen-lg-min;
-
-// So media queries don't overlap when required, provide a maximum
-@screen-xs-max:              (@screen-sm-min - 1);
-@screen-sm-max:              (@screen-md-min - 1);
-@screen-md-max:              (@screen-lg-min - 1);
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-@grid-columns:              12;
-//** Padding between columns. Gets divided in half for the left and right.
-@grid-gutter-width:         30px;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-@grid-float-breakpoint:     @screen-sm-min;
-//** Point at which the navbar begins collapsing.
-@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-@container-tablet:             (720px + @grid-gutter-width);
-//** For `@screen-sm-min` and up.
-@container-sm:                 @container-tablet;
-
-// Medium screen / desktop
-@container-desktop:            (940px + @grid-gutter-width);
-//** For `@screen-md-min` and up.
-@container-md:                 @container-desktop;
-
-// Large screen / wide desktop
-@container-large-desktop:      (1140px + @grid-gutter-width);
-//** For `@screen-lg-min` and up.
-@container-lg:                 @container-large-desktop;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-@navbar-height:                    50px;
-@navbar-margin-bottom:             @line-height-computed;
-@navbar-border-radius:             @border-radius-base;
-@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
-@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
-@navbar-collapse-max-height:       340px;
-
-@navbar-default-color:             #777;
-@navbar-default-bg:                #f8f8f8;
-@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
-
-// Navbar links
-@navbar-default-link-color:                #777;
-@navbar-default-link-hover-color:          #333;
-@navbar-default-link-hover-bg:             transparent;
-@navbar-default-link-active-color:         #555;
-@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
-@navbar-default-link-disabled-color:       #ccc;
-@navbar-default-link-disabled-bg:          transparent;
-
-// Navbar brand label
-@navbar-default-brand-color:               @navbar-default-link-color;
-@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
-@navbar-default-brand-hover-bg:            transparent;
-
-// Navbar toggle
-@navbar-default-toggle-hover-bg:           #ddd;
-@navbar-default-toggle-icon-bar-bg:        #888;
-@navbar-default-toggle-border-color:       #ddd;
-
-
-//=== Inverted navbar
-// Reset inverted navbar basics
-@navbar-inverse-color:                      lighten(@gray-light, 15%);
-@navbar-inverse-bg:                         #222;
-@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
-
-// Inverted navbar links
-@navbar-inverse-link-color:                 lighten(@gray-light, 15%);
-@navbar-inverse-link-hover-color:           #fff;
-@navbar-inverse-link-hover-bg:              transparent;
-@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
-@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
-@navbar-inverse-link-disabled-color:        #444;
-@navbar-inverse-link-disabled-bg:           transparent;
-
-// Inverted navbar brand label
-@navbar-inverse-brand-color:                @navbar-inverse-link-color;
-@navbar-inverse-brand-hover-color:          #fff;
-@navbar-inverse-brand-hover-bg:             transparent;
-
-// Inverted navbar toggle
-@navbar-inverse-toggle-hover-bg:            #333;
-@navbar-inverse-toggle-icon-bar-bg:         #fff;
-@navbar-inverse-toggle-border-color:        #333;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-@nav-link-padding:                          10px 15px;
-@nav-link-hover-bg:                         @gray-lighter;
-
-@nav-disabled-link-color:                   @gray-light;
-@nav-disabled-link-hover-color:             @gray-light;
-
-//== Tabs
-@nav-tabs-border-color:                     #ddd;
-
-@nav-tabs-link-hover-border-color:          @gray-lighter;
-
-@nav-tabs-active-link-hover-bg:             @body-bg;
-@nav-tabs-active-link-hover-color:          @gray;
-@nav-tabs-active-link-hover-border-color:   #ddd;
-
-@nav-tabs-justified-link-border-color:            #ddd;
-@nav-tabs-justified-active-link-border-color:     @body-bg;
-
-//== Pills
-@nav-pills-border-radius:                   @border-radius-base;
-@nav-pills-active-link-hover-bg:            @component-active-bg;
-@nav-pills-active-link-hover-color:         @component-active-color;
-
-
-//== Pagination
-//
-//##
-
-@pagination-color:                     @link-color;
-@pagination-bg:                        #fff;
-@pagination-border:                    #ddd;
-
-@pagination-hover-color:               @link-hover-color;
-@pagination-hover-bg:                  @gray-lighter;
-@pagination-hover-border:              #ddd;
-
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 @brand-primary;
-@pagination-active-border:             @brand-primary;
-
-@pagination-disabled-color:            @gray-light;
-@pagination-disabled-bg:               #fff;
-@pagination-disabled-border:           #ddd;
-
-
-//== Pager
-//
-//##
-
-@pager-bg:                             @pagination-bg;
-@pager-border:                         @pagination-border;
-@pager-border-radius:                  15px;
-
-@pager-hover-bg:                       @pagination-hover-bg;
-
-@pager-active-bg:                      @pagination-active-bg;
-@pager-active-color:                   @pagination-active-color;
-
-@pager-disabled-color:                 @pagination-disabled-color;
-
-
-//== Jumbotron
-//
-//##
-
-@jumbotron-padding:              30px;
-@jumbotron-color:                inherit;
-@jumbotron-bg:                   @gray-lighter;
-@jumbotron-heading-color:        inherit;
-@jumbotron-font-size:            ceil((@font-size-base * 1.5));
-@jumbotron-heading-font-size:    ceil((@font-size-base * 4.5));
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-@state-success-text:             #3c763d;
-@state-success-bg:               #dff0d8;
-@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
-
-@state-info-text:                #31708f;
-@state-info-bg:                  #d9edf7;
-@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
-
-@state-warning-text:             #8a6d3b;
-@state-warning-bg:               #fcf8e3;
-@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
-
-@state-danger-text:              #a94442;
-@state-danger-bg:                #f2dede;
-@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-@tooltip-max-width:           200px;
-//** Tooltip text color
-@tooltip-color:               #fff;
-//** Tooltip background color
-@tooltip-bg:                  #000;
-@tooltip-opacity:             .9;
-
-//** Tooltip arrow width
-@tooltip-arrow-width:         5px;
-//** Tooltip arrow color
-@tooltip-arrow-color:         @tooltip-bg;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-@popover-bg:                          #fff;
-//** Popover maximum width
-@popover-max-width:                   276px;
-//** Popover border color
-@popover-border-color:                rgba(0,0,0,.2);
-//** Popover fallback border color
-@popover-fallback-border-color:       #ccc;
-
-//** Popover title background color
-@popover-title-bg:                    darken(@popover-bg, 3%);
-
-//** Popover arrow width
-@popover-arrow-width:                 10px;
-//** Popover arrow color
-@popover-arrow-color:                 @popover-bg;
-
-//** Popover outer arrow width
-@popover-arrow-outer-width:           (@popover-arrow-width + 1);
-//** Popover outer arrow color
-@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
-//** Popover outer arrow fallback color
-@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-@label-default-bg:            @gray-light;
-//** Primary label background color
-@label-primary-bg:            @brand-primary;
-//** Success label background color
-@label-success-bg:            @brand-success;
-//** Info label background color
-@label-info-bg:               @brand-info;
-//** Warning label background color
-@label-warning-bg:            @brand-warning;
-//** Danger label background color
-@label-danger-bg:             @brand-danger;
-
-//** Default label text color
-@label-color:                 #fff;
-//** Default text color of a linked label
-@label-link-hover-color:      #fff;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-@modal-inner-padding:         15px;
-
-//** Padding applied to the modal title
-@modal-title-padding:         15px;
-//** Modal title line-height
-@modal-title-line-height:     @line-height-base;
-
-//** Background color of modal content area
-@modal-content-bg:                             #fff;
-//** Modal content border color
-@modal-content-border-color:                   rgba(0,0,0,.2);
-//** Modal content border color **for IE8**
-@modal-content-fallback-border-color:          #999;
-
-//** Modal backdrop background color
-@modal-backdrop-bg:           #000;
-//** Modal backdrop opacity
-@modal-backdrop-opacity:      .5;
-//** Modal header border color
-@modal-header-border-color:   #e5e5e5;
-//** Modal footer border color
-@modal-footer-border-color:   @modal-header-border-color;
-
-@modal-lg:                    900px;
-@modal-md:                    600px;
-@modal-sm:                    300px;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-@alert-padding:               15px;
-@alert-border-radius:         @border-radius-base;
-@alert-link-font-weight:      bold;
-
-@alert-success-bg:            @state-success-bg;
-@alert-success-text:          @state-success-text;
-@alert-success-border:        @state-success-border;
-
-@alert-info-bg:               @state-info-bg;
-@alert-info-text:             @state-info-text;
-@alert-info-border:           @state-info-border;
-
-@alert-warning-bg:            @state-warning-bg;
-@alert-warning-text:          @state-warning-text;
-@alert-warning-border:        @state-warning-border;
-
-@alert-danger-bg:             @state-danger-bg;
-@alert-danger-text:           @state-danger-text;
-@alert-danger-border:         @state-danger-border;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-@progress-bg:                 #f5f5f5;
-//** Progress bar text color
-@progress-bar-color:          #fff;
-//** Variable for setting rounded corners on progress bar.
-@progress-border-radius:      @border-radius-base;
-
-//** Default progress bar color
-@progress-bar-bg:             @brand-primary;
-//** Success progress bar color
-@progress-bar-success-bg:     @brand-success;
-//** Warning progress bar color
-@progress-bar-warning-bg:     @brand-warning;
-//** Danger progress bar color
-@progress-bar-danger-bg:      @brand-danger;
-//** Info progress bar color
-@progress-bar-info-bg:        @brand-info;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-@list-group-bg:                 #fff;
-//** `.list-group-item` border color
-@list-group-border:             #ddd;
-//** List group border radius
-@list-group-border-radius:      @border-radius-base;
-
-//** Background color of single list items on hover
-@list-group-hover-bg:           #f5f5f5;
-//** Text color of active list items
-@list-group-active-color:       @component-active-color;
-//** Background color of active list items
-@list-group-active-bg:          @component-active-bg;
-//** Border color of active list elements
-@list-group-active-border:      @list-group-active-bg;
-//** Text color for content within active list items
-@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
-
-//** Text color of disabled list items
-@list-group-disabled-color:      @gray-light;
-//** Background color of disabled list items
-@list-group-disabled-bg:         @gray-lighter;
-//** Text color for content within disabled list items
-@list-group-disabled-text-color: @list-group-disabled-color;
-
-@list-group-link-color:         #555;
-@list-group-link-hover-color:   @list-group-link-color;
-@list-group-link-heading-color: #333;
-
-
-//== Panels
-//
-//##
-
-@panel-bg:                    #fff;
-@panel-body-padding:          15px;
-@panel-heading-padding:       10px 15px;
-@panel-footer-padding:        @panel-heading-padding;
-@panel-border-radius:         @border-radius-base;
-
-//** Border color for elements within panels
-@panel-inner-border:          #ddd;
-@panel-footer-bg:             #f5f5f5;
-
-@panel-default-text:          @gray-dark;
-@panel-default-border:        #ddd;
-@panel-default-heading-bg:    #f5f5f5;
-
-@panel-primary-text:          #fff;
-@panel-primary-border:        @brand-primary;
-@panel-primary-heading-bg:    @brand-primary;
-
-@panel-success-text:          @state-success-text;
-@panel-success-border:        @state-success-border;
-@panel-success-heading-bg:    @state-success-bg;
-
-@panel-info-text:             @state-info-text;
-@panel-info-border:           @state-info-border;
-@panel-info-heading-bg:       @state-info-bg;
-
-@panel-warning-text:          @state-warning-text;
-@panel-warning-border:        @state-warning-border;
-@panel-warning-heading-bg:    @state-warning-bg;
-
-@panel-danger-text:           @state-danger-text;
-@panel-danger-border:         @state-danger-border;
-@panel-danger-heading-bg:     @state-danger-bg;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-@thumbnail-padding:           4px;
-//** Thumbnail background color
-@thumbnail-bg:                @body-bg;
-//** Thumbnail border color
-@thumbnail-border:            #ddd;
-//** Thumbnail border radius
-@thumbnail-border-radius:     @border-radius-base;
-
-//** Custom text color for thumbnail captions
-@thumbnail-caption-color:     @text-color;
-//** Padding around the thumbnail caption
-@thumbnail-caption-padding:   9px;
-
-
-//== Wells
-//
-//##
-
-@well-bg:                     #f5f5f5;
-@well-border:                 darken(@well-bg, 7%);
-
-
-//== Badges
-//
-//##
-
-@badge-color:                 #fff;
-//** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
-@badge-bg:                    @gray-light;
-
-//** Badge text color in active nav link
-@badge-active-color:          @link-color;
-//** Badge background color in active nav link
-@badge-active-bg:             #fff;
-
-@badge-font-weight:           bold;
-@badge-line-height:           1;
-@badge-border-radius:         10px;
-
-
-//== Breadcrumbs
-//
-//##
-
-@breadcrumb-padding-vertical:   8px;
-@breadcrumb-padding-horizontal: 15px;
-//** Breadcrumb background color
-@breadcrumb-bg:                 #f5f5f5;
-//** Breadcrumb text color
-@breadcrumb-color:              #ccc;
-//** Text color of current page in the breadcrumb
-@breadcrumb-active-color:       @gray-light;
-//** Textual separator for between breadcrumb elements
-@breadcrumb-separator:          "/";
-
-
-//== Carousel
-//
-//##
-
-@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
-
-@carousel-control-color:                      #fff;
-@carousel-control-width:                      15%;
-@carousel-control-opacity:                    .5;
-@carousel-control-font-size:                  20px;
-
-@carousel-indicator-active-bg:                #fff;
-@carousel-indicator-border-color:             #fff;
-
-@carousel-caption-color:                      #fff;
-
-
-//== Close
-//
-//##
-
-@close-font-weight:           bold;
-@close-color:                 #000;
-@close-text-shadow:           0 1px 0 #fff;
-
-
-//== Code
-//
-//##
-
-@code-color:                  #c7254e;
-@code-bg:                     #f9f2f4;
-
-@kbd-color:                   #fff;
-@kbd-bg:                      #333;
-
-@pre-bg:                      #f5f5f5;
-@pre-color:                   @gray-dark;
-@pre-border-color:            #ccc;
-@pre-scrollable-max-height:   340px;
-
-
-//== Type
-//
-//##
-
-//** Horizontal offset for forms and lists.
-@component-offset-horizontal: 180px;
-//** Text muted color
-@text-muted:                  @gray-light;
-//** Abbreviations and acronyms border color
-@abbr-border-color:           @gray-light;
-//** Headings small color
-@headings-small-color:        @gray-light;
-//** Blockquote small color
-@blockquote-small-color:      @gray-light;
-//** Blockquote font size
-@blockquote-font-size:        (@font-size-base * 1.25);
-//** Blockquote border color
-@blockquote-border-color:     @gray-lighter;
-//** Page header border color
-@page-header-border-color:    @gray-lighter;
-//** Width of horizontal description list titles
-@dl-horizontal-offset:        @component-offset-horizontal;
-//** Point at which .dl-horizontal becomes horizontal
-@dl-horizontal-breakpoint:    @grid-float-breakpoint;
-//** Horizontal line color.
-@hr-border:                   @gray-lighter;
diff --git a/src/assets/css/global/animation.less b/src/assets/css/global/animation.less
deleted file mode 100644
index e69de29..0000000
diff --git a/src/assets/css/global/border.less b/src/assets/css/global/border.less
deleted file mode 100644
index 97bcae3..0000000
--- a/src/assets/css/global/border.less
+++ /dev/null
@@ -1,41 +0,0 @@
-@import "variables";
-
-#radius {
-  .border-radius(@from,@end,@step) {
-    .mX(@f,@e,@s) when (@e >= @f) {
-      .border-radius-@{e} {
-        -webkit-border-radius: @e*1px;
-        -moz-border-radius: @e*1px;
-        border-radius: @e*1px;
-      }
-      .br@{e} {
-        -webkit-border-radius: @e*1px;
-        -moz-border-radius: @e*1px;
-        border-radius: @e*1px;
-      }
-
-      .mX(@f, @e - @s, @s);
-    }
-    .mX(@from, @end, @step);
-  }
-
-}
-
-#radius > .border-radius(1, 10, 1);
-
-.border-dash {
-  border: 1px dashed #ccc;
-}
-
-.border {
-  border: 1px solid #eee;
-}
-
-.border-danger {
-  border: 1px solid @brand-danger;
-}
-
-.border-bottom {
-  border-bottom: 1px solid #eee;
-}
-
diff --git a/src/assets/css/global/button.less b/src/assets/css/global/button.less
deleted file mode 100644
index c1b3ad0..0000000
--- a/src/assets/css/global/button.less
+++ /dev/null
@@ -1,31 +0,0 @@
-
-.btn-action {
-	margin: 0 3px;
-	display: inline-block;
-	opacity: 0.85;
-	-webkit-transition: all 0.1s;
-	-o-transition: all 0.1s;
-	transition: all 0.1s;
-	cursor: pointer;
-
-	&:hover {
-		text-decoration: none;
-		opacity: 1;
-		-moz-transform: scale(1.2);
-		-webkit-transform: scale(1.2);
-		-o-transform: scale(1.2);
-		-ms-transform: scale(1.2);
-		transform: scale(1.2);
-	}
-}
-
-//编辑区域按钮,鼠标一上去按钮变大
-.action-buttons {
-	a {
-		.btn-action;
-	}
-}
-
-.cursor {
-	cursor: pointer;
-}
diff --git a/src/assets/css/global/color.less b/src/assets/css/global/color.less
deleted file mode 100644
index 6fa3b6b..0000000
--- a/src/assets/css/global/color.less
+++ /dev/null
@@ -1,358 +0,0 @@
-@import "./variables.less";
-
-.bg-primary {
-	background-color: @brand-primary;
-	color: white;
-}
-
-.bg-success {
-	background-color: @brand-success;
-	color: white;
-}
-
-.bg-info {
-	background-color: @brand-info;
-	color: white;
-}
-
-.bg-warning {
-	background-color: @brand-warning;
-	color: white;
-}
-
-.bg-danger {
-	background-color: @brand-danger;
-	color: white;
-}
-
-.bg-gray {
-	background-color: @brand-gray;
-	color: white;
-}
-
-.bg-laxative {
-	background-color: @brand-laxative;
-	color: white;
-}
-
-.text-primary {
-	color: @brand-primary;
-}
-
-.bg-navy {
-	background-color: #001F3F;
-}
-
-.bg-blue {
-	background-color: #0074D9;
-}
-
-.bg-aqua {
-	background-color: #7FDBFF;
-}
-
-.bg-aliceblue {
-	background-color: aliceblue;
-}
-
-.bg-pink {
-	background-color: pink;
-}
-
-.bg-azure {
-	background-color: azure;
-}
-
-.bg-teal {
-	background-color: #39CCCC;
-}
-
-.bg-olive {
-	background-color: #3D9970;
-}
-
-.bg-green {
-	background-color: #2ECC40;
-}
-
-.bg-lime {
-	background-color: #01FF70;
-}
-
-.bg-yellow {
-	background-color: #FFDC00;
-}
-
-.bg-pink {
-	color: pink;
-}
-
-.bg-orange {
-	background-color: #FF851B;
-}
-
-.bg-red {
-	background-color: #FF4136;
-}
-
-.bg-fuchsia {
-	background-color: #F012BE;
-}
-
-.bg-purple {
-	background-color: #B10DC9;
-}
-
-.bg-maroon {
-	background-color: #85144B;
-}
-
-.bg-white {
-	background-color: #FFFFFF;
-}
-
-.bg-gray {
-	background-color: #AAAAAA;
-}
-
-.bg-silver {
-	background-color: #DDDDDD;
-}
-
-.bg-silver-white {
-	background-color: #EEEEEE;
-}
-
-.bg-black {
-	background-color: #111111;
-}
-
-.bg-111 {
-	background-color: #111
-}
-
-.bg-222 {
-	background-color: #222
-}
-
-.bg-333 {
-	background-color: #333
-}
-
-.bg-444 {
-	background-color: #444
-}
-
-.bg-555 {
-	background-color: #555
-}
-
-.bg-666 {
-	background-color: #666
-}
-
-.bg-777 {
-	background-color: #777
-}
-
-.bg-888 {
-	background-color: #888
-}
-
-.bg-999 {
-	background-color: #999
-}
-
-.bg-aaa {
-	background-color: #aaa
-}
-
-.bg-bbb {
-	background-color: #bbb
-}
-
-.bg-ccc {
-	background-color: #ccc
-}
-
-.bg-ddd {
-	background-color: #ddd
-}
-
-.bg-eee {
-	background-color: #eee
-}
-
-/* Colors */
-.navy {
-	color: #001F3F;
-}
-
-.blue {
-	color: #0074D9;
-}
-
-.aqua {
-	color: #7FDBFF;
-}
-
-.teal {
-	color: #39CCCC;
-}
-
-.olive {
-	color: #3D9970;
-}
-
-.green {
-	color: #2ECC40;
-}
-
-.lime {
-	color: #01FF70;
-}
-
-.yellow {
-	color: #FFDC00;
-}
-
-.pink {
-	color: pink;
-}
-
-.orange {
-	color: #FF851B;
-}
-
-.red {
-	color: #FF4136;
-}
-
-.fuchsia {
-	color: #F012BE;
-}
-
-.purple {
-	color: #B10DC9;
-}
-
-.maroon {
-	color: #85144B;
-}
-
-.white {
-	color: #FFFFFF;
-}
-
-.silver {
-	color: #DDDDDD;
-}
-
-.gray {
-	color: #AAAAAA;
-}
-
-.black {
-	color: #111111;
-}
-
-.color-111 {
-	color: #111
-}
-
-.color-222 {
-	color: #222
-}
-
-.color-333 {
-	color: #333
-}
-
-.color-444 {
-	color: #444
-}
-
-.color-555 {
-	color: #555
-}
-
-.color-666 {
-	color: #666
-}
-
-.color-777 {
-	color: #777
-}
-
-.color-888 {
-	color: #888
-}
-
-.color-999 {
-	color: #999
-}
-
-.color-aaa {
-	color: #aaa
-}
-
-.color-bbb {
-	color: #bbb
-}
-
-.color-ccc {
-	color: #ccc
-}
-
-.color-ddd {
-	color: #ddd
-}
-
-.color-eee {
-	color: #eee
-}
-
-.color-text {
-	color: #660E7A;
-}
-
-.color-doc {
-	color: #295496;
-}
-
-.color-xls {
-	color: #1E6C41;
-}
-
-.color-ppt {
-	color: #D04324;
-}
-
-.color-pdf {
-	color: #E40B0B;
-}
-
-.color-audio {
-	color: #5bc0de;
-}
-
-.color-video {
-	color: #5cb85c;
-}
-
-.color-image {
-	color: #0074D9;
-}
-
-.color-archive {
-	color: #4437f2;
-}
-
-.color-light-active {
-	color: #ffc60c;
-}
-
-.color-light-inactive {
-	color: #ccc;
-}
-
diff --git a/src/assets/css/global/font.less b/src/assets/css/global/font.less
deleted file mode 100644
index 114ce52..0000000
--- a/src/assets/css/global/font.less
+++ /dev/null
@@ -1,38 +0,0 @@
-#font{
-  .f(@from,@end,@step){
-    .mX(@f,@e,@s) when (@e >= @f){
-      .f@{e}{
-        font-size:@e*1px!important;
-      }
-      .mX(@f,@e - @s,@s);
-    }
-    .mX(@from,@end,@step);
-  }
-
-}
-
-#font > .f(10,80,1);
-
-#font{
-  .ln(@from,@end,@step){
-    .mX(@f,@e,@s) when (@e >= @f){
-      .ln@{e}{
-        line-height:@e*1px!important;
-      }
-      .mX(@f,@e - @s,@s);
-    }
-    .mX(@from,@end,@step);
-  }
-
-}
-
-#font > .ln(10,100,1);
-
-
-
-.bold{
-  font-weight:bold;
-}
-.italic{
-  font-style:italic;
-}
diff --git a/src/assets/css/global/layout.less b/src/assets/css/global/layout.less
deleted file mode 100644
index d210494..0000000
--- a/src/assets/css/global/layout.less
+++ /dev/null
@@ -1,132 +0,0 @@
-#layout{
-  .margin(@from,@end,@step){
-    .mX(@f,@e,@s) when (@e >= @f){
-      .m@{e}{
-        margin:@e*1px;
-      }
-      .mt@{e}{
-        margin-top:@e*1px;
-      }
-      .mr@{e}{
-        margin-right:@e*1px;
-      }
-      .mb@{e}{
-        margin-bottom: @e*1px;
-      }
-      .ml@{e}{
-        margin-left: @e*1px;
-      }
-      .mv@{e}{
-        margin-top: @e*1px;
-        margin-bottom: @e*1px;
-      }
-      .mh@{e}{
-        margin-left: @e*1px;
-        margin-right: @e*1px*1px;
-      }
-      .mX(@f,@e - @s,@s);
-    }
-    .mX(@from,@end,@step);
-  }
-  .padding(@from,@end,@step){
-    .pX(@f,@e,@s) when (@e >= @f){
-      .p@{e}{
-        padding:@e*1px;
-      }
-      .pt@{e}{
-        padding-top:@e*1px;
-      }
-      .pr@{e}{
-        padding-right:@e*1px;
-      }
-      .pb@{e}{
-        padding-bottom: @e*1px;
-      }
-      .pl@{e}{
-        padding-left: @e*1px;
-      }
-      .pv@{e}{
-        padding-top: @e*1px;
-        padding-bottom: @e*1px;
-      }
-      .ph@{e}{
-        padding-left: @e*1px;
-        padding-right: @e*1px;
-      }
-      .pX(@f,@e - @s,@s);
-    }
-    .pX(@from,@end,@step);
-  }
-  .width(@from,@end,@step){
-    .wX(@f,@e,@s) when (@e >= @f){
-      .w@{e}{
-        width:@e*1px;
-      }
-      .w@{e}m{
-        max-width:@e*1px;
-      }
-      .w@{e}n{
-        min-width:@e*1px;
-      }
-      .w@{e}i{
-        width:@e*1px!important;
-      }
-      .wX(@f,@e - @s,@s);
-    }
-    .wX(@from,@end,@step);
-  }
-  .height(@from,@end,@step){
-    .hX(@f,@e,@s) when (@e >= @f){
-      .h@{e}{
-        height:@e*1px;
-      }
-      .lh@{e}{
-        line-height:@e*1px;
-      }
-      .h@{e}m{
-        max-height:@e*1px;
-      }
-      .h@{e}n{
-        min-height:@e*1px;
-      }
-      .h@{e}i{
-        height:@e*1px!important;
-      }
-      .hX(@f,@e - @s,@s);
-    }
-    .hX(@from,@end,@step);
-  }
-}
-
-.wp20{
-  width:20%;
-}
-.wp25{
-  width:25%;
-}
-.wp33{
-  width:33%;
-}
-.wp100{
-  width:100%;
-}
-.wp50{
-  width:50%;
-}
-.hp100{
-  height:100%;
-}
-.hp50{
-  height: 50%;
-}
-
-#layout > .margin(20,200,5);
-#layout > .margin(0,19,1);
-#layout > .padding(20,200,5);
-#layout > .padding(0,19,1);
-#layout > .width(20,400,10);
-#layout > .width(0,19,1);
-#layout > .height(20,400,10);
-#layout > .height(0,19,1);
-
-
diff --git a/src/assets/css/global/miscellaneous.less b/src/assets/css/global/miscellaneous.less
deleted file mode 100644
index 815c21f..0000000
--- a/src/assets/css/global/miscellaneous.less
+++ /dev/null
@@ -1,75 +0,0 @@
-.compulsory {
-  &:before {
-    content: "*";
-    color: red;
-  }
-}
-
-.limit-hints {
-  font-size: 10px;
-  color: #aaaaaa;
-  float: right;
-}
-
-.hover-underline {
-
-  cursor: pointer;
-
-  &:hover {
-    text-decoration: underline;
-  }
-
-}
-
-.btn-file {
-  overflow: hidden;
-  position: relative;
-  vertical-align: middle;
-  cursor: pointer;
-
-  > input {
-    position: absolute;
-    top: 0;
-    right: 0;
-    margin: 0;
-    opacity: 0;
-    filter: alpha(opacity=0);
-    font-size: 23px;
-    height: 100%;
-    width: 100%;
-    direction: ltr;
-    cursor: pointer;
-  }
-}
-
-.list-text-restriction {
-  display: -webkit-box;
-  -webkit-box-orient: vertical;
-  overflow: hidden;
-  position: relative;
-  line-height: 17px;
-  max-height: 51px;
-  -webkit-line-clamp: 3;
-  text-overflow: ellipsis;
-}
-
-.one-line {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.inline-block {
-  display: inline-block;
-}
-
-.overflow-hidden {
-  overflow: hidden;
-}
-
-.tank-box {
-  background-color: white;
-  box-shadow: 0 0 5px rgba(0, 0, 0, .2);
-  border-radius: 5px;
-  padding: 20px 15px 10px 15px;
-}
diff --git a/src/assets/css/global/responsive.less b/src/assets/css/global/responsive.less
deleted file mode 100644
index 2d1966e..0000000
--- a/src/assets/css/global/responsive.less
+++ /dev/null
@@ -1,36 +0,0 @@
-@media (min-width: 992px) {
-  .visible-mobile {
-    display: none !important;
-  }
-
-  .visible-pc {
-    display: block !important;
-  }
-}
-
-@media (max-width: 992px) {
-  .visible-mobile {
-    display: block !important;
-  }
-
-  .visible-pc {
-    display: none !important;
-  }
-}
-
-//浏览器滚动条样式
-.thin-scrollbar {
-  ::-webkit-scrollbar {
-    width: 3px;
-    height: 3px;
-  }
-
-  ::-webkit-scrollbar-track {
-    background: transparent;
-  }
-
-  ::-webkit-scrollbar-thumb {
-    background: rgba(0, 0, 0, 0.3);
-  }
-
-}
diff --git a/src/assets/css/global/variables.less b/src/assets/css/global/variables.less
deleted file mode 100644
index 86b7670..0000000
--- a/src/assets/css/global/variables.less
+++ /dev/null
@@ -1,99 +0,0 @@
-@import "../bootstrap/variables.less";
-//Bootstrap Theme.
-//@brand-primary:         darken(#428bca, 6.5%); // #337ab7
-//@brand-success:         #5cb85c;
-//@brand-info:            #5bc0de;
-//@brand-warning:         #f0ad4e;
-//@brand-danger:          #d9534f;
-//@brand-gray: #c2c2c2;
-
-//Angulr Theme.
-//@brand-primary:         #7266ba;
-//@brand-info:            #23b7e5;
-//@brand-success:         #27c24c;
-//@brand-warning:         #fad733;
-//@brand-danger:          #f05050;
-//@brand-light:           #edf1f2;
-//@brand-dark:            #3a3f51;
-//@brand-black:           #1c2b36;
-//@brand-gray:            #c2c2c2;
-//@brand-laxative:        #B3EE3A;
-
-//Inspina Theme.
-//@brand-primary: #1ab394;
-//@brand-success: #1c84c6;
-//@brand-info: #23c6c8;
-//@brand-warning: #f8ac59;
-//@brand-danger: #ED5565;
-//@brand-gray: #c2c2c2;
-//@brand-laxative: #B3EE3A;
-
-
-//zhengxianqian Theme.
-//@brand-primary: #23B7E5;
-@brand-primary: #006699;
-@brand-success: #1ab394;
-@brand-info: #5EC1C5;
-@brand-warning: #FEC62E;
-@brand-danger: #FE8768;
-@brand-gray: #c2c2c2;
-@brand-laxative: #B3EE3A;
-
-
-@navy: @brand-primary; // Primary color
-@dark-gray: @brand-gray; // Default color
-@blue: @brand-success; // Success color
-@lazur: @brand-info; // Info color
-@yellow: @brand-warning; // Warrning color
-@red: @brand-danger; // Danger color
-@green: @brand-laxative; // Danger color
-
-@gray-base: #000;
-@gray-darker: lighten(@gray-base, 13.5%); // #222
-@gray-dark: lighten(@gray-base, 20%); // #333
-@gray: lighten(@gray-base, 33.5%); // #555
-@gray-light: lighten(@gray-base, 46.7%); // #777
-@gray-lighter: lighten(@gray-base, 93.5%); // #eee
-
-// Various colors
-@text-color: #676a6c; // Body text
-@gray: #f3f3f4; // Background wrapper color
-@light-gray: #D1DADE; // Default label, badget
-@label-badget-color: #5E5E5E;
-@light-blue: #f3f6fb;
-
-// Spiner color and margin
-@spin-color: @navy;
-@spin-margin: 0 auto;
-
-// IBOX colors ( default panel colors)
-@border-color: #e7eaec; // IBox border
-@ibox-title-bg: #ffffff; // IBox Background header
-@ibox-content-bg: #ffffff; // IBox Background content
-
-//Sidebar width
-@sidebar-width: 170px;
-
-// Boxed layout width
-@boxed-width: 1200px;
-
-//Border radius for buttons
-@btn-border-radius: 3px;
-
-//Navigation
-@nav-bg: #2F4050;
-@nav-text-color: #a7b1c2;
-
-
-@top-navigation-height: 45px;
-
-@app-color-title: #474747;
-@app-color-content: #8A8A8A;
-
-//上方导航栏高度
-@frame-header-height: 80px;
-
-//下方蓝眼云盘高度
-@power-footer-height: 40px;
-
-
diff --git a/src/assets/css/inspinia/badgets_labels.less b/src/assets/css/inspinia/badgets_labels.less
deleted file mode 100644
index 137eaaf..0000000
--- a/src/assets/css/inspinia/badgets_labels.less
+++ /dev/null
@@ -1,72 +0,0 @@
-
-.label {
-  background-color: @light-gray;
-  color: @label-badget-color;
-  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  font-size: 10px;
-  font-weight: 600;
-  padding: 3px 8px;
-  text-shadow: none;
-}
-
-.badge {
-  background-color: @light-gray;
-  color: @label-badget-color;
-  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  padding-bottom: 4px;
-  padding-left: 6px;
-  padding-right: 6px;
-  text-shadow: none;
-}
-
-.label-primary, .badge-primary {
-  background-color: @navy;
-  color: #FFFFFF;
-}
-
-.label-success, .badge-success {
-  background-color: @blue;
-  color: #FFFFFF;
-}
-
-.label-warning, .badge-warning {
-  background-color: @yellow;
-  color: #FFFFFF;
-}
-
-.label-warning-light, .badge-warning-light {
-  background-color: @yellow;
-  color: #ffffff;
-}
-
-.label-danger, .badge-danger {
-  background-color: @red;
-  color: #FFFFFF;
-}
-
-.label-info, .badge-info {
-  background-color: @lazur;
-  color: #FFFFFF;
-}
-
-.label-inverse, .badge-inverse {
-  background-color: #262626;
-  color: #FFFFFF;
-}
-
-.label-laxative, .badge-laxative {
-  background-color: @green;
-  color: #FFFFFF;
-}
-
-.label-white, .badge-white {
-  background-color: #FFFFFF;
-  color: #5E5E5E;
-}
-
-.label-white, .badge-disable {
-  background-color: #2A2E36;
-  color: #8B91A0;
-}
diff --git a/src/assets/css/inspinia/base.less b/src/assets/css/inspinia/base.less
deleted file mode 100644
index e62dfdf..0000000
--- a/src/assets/css/inspinia/base.less
+++ /dev/null
@@ -1,1283 +0,0 @@
-
-.block {
-	display: block;
-}
-
-.clear {
-	display: block;
-	overflow: hidden;
-}
-
-a {
-	cursor: pointer;
-}
-
-a:hover, a:focus {
-	text-decoration: none;
-}
-
-.border-bottom {
-	border-bottom: 1px solid @border-color !important;
-}
-
-.font-bold {
-	font-weight: 600;
-}
-
-.font-noraml {
-	font-weight: 400;
-}
-
-.text-uppercase {
-	text-transform: uppercase;
-}
-
-.font-italic {
-	font-style: italic;
-}
-
-.b-r {
-	border-right: 1px solid @border-color;
-}
-
-.hr-line-dashed {
-	border-top: 1px dashed @border-color;
-	color: #ffffff;
-	background-color: #ffffff;
-	height: 1px;
-	margin: 20px 0;
-}
-
-.hr-line-solid {
-	border-bottom: 1px solid @border-color;
-	background-color: rgba(0, 0, 0, 0);
-	border-style: solid !important;
-	margin-top: 15px;
-	margin-bottom: 15px;
-}
-
-/* GALLERY */
-.gallery > .row > div {
-	margin-bottom: 15px;
-}
-
-.fancybox img {
-	margin-bottom: 5px;
-	/* Only for demo */
-	width: 24%;
-}
-
-/* Summernote text editor  */
-.note-editor {
-	height: auto !important;
-	//min-height: 300px;
-}
-
-.note-editor.fullscreen {
-	z-index: 2050;
-}
-
-.note-editor.note-frame.fullscreen {
-	z-index: 2020;
-}
-
-.note-editor.note-frame {
-	border: none;
-}
-
-.note-editor.panel {
-	margin-bottom: 0;
-}
-
-/* MODAL */
-.modal-content {
-	background-clip: padding-box;
-	background-color: #FFFFFF;
-	border: 1px solid rgba(0, 0, 0, 0);
-	border-radius: 4px;
-	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-	outline: 0 none;
-	position: relative;
-}
-
-.modal-dialog {
-	z-index: 2200;
-}
-
-.modal-body {
-	padding: 20px 30px 30px 30px;
-}
-
-.inmodal .modal-body {
-	background: #f8fafb;
-}
-
-.inmodal .modal-header {
-	padding: 30px 15px;
-	text-align: center;
-}
-
-.animated.modal.fade .modal-dialog {
-	-webkit-transform: none;
-	-ms-transform: none;
-	-o-transform: none;
-	transform: none;
-}
-
-.inmodal .modal-title {
-	font-size: 26px;
-}
-
-.inmodal .modal-icon {
-	font-size: 84px;
-	color: #e2e3e3;
-}
-
-.modal-footer {
-	margin-top: 0;
-}
-
-
-.title-action {
-	text-align: right;
-	padding-top: 30px;
-}
-
-.ibox-content h1, .ibox-content h2, .ibox-content h3, .ibox-content h4, .ibox-content h5,
-.ibox-title h1, .ibox-title h2, .ibox-title h3, .ibox-title h4, .ibox-title h5 {
-	margin-top: 5px;
-}
-
-ul.unstyled, ol.unstyled {
-	list-style: none outside none;
-	margin-left: 0;
-}
-
-.big-icon {
-	font-size: 160px !important;
-	color: #e5e6e7;
-}
-
-/* FOOTER */
-
-.footer {
-
-	background: none repeat scroll 0 0 white;
-	border-top: 1px solid @border-color;
-	bottom: 0;
-	left: 0;
-	padding: 10px 20px;
-	position: absolute;
-	right: 0;
-}
-
-.footer.fixed_full {
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	right: 0;
-	z-index: 1000;
-	padding: 10px 20px;
-	background: white;
-	border-top: 1px solid @border-color;
-}
-
-.footer.fixed {
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	right: 0;
-	z-index: 1000;
-	padding: 10px 20px;
-	background: white;
-	border-top: 1px solid @border-color;
-	margin-left: @sidebar-width;
-}
-
-#body.mini-navbar .footer.fixed {
-	margin: 0 0 0 70px;
-}
-
-/* PANELS */
-
-.page-heading {
-	border-top: 0;
-	padding: 0 10px 20px 10px;
-}
-
-.panel-heading h1, .panel-heading h2 {
-	margin-bottom: 5px;
-}
-
-/* TABLES */
-
-.table-bordered {
-	border: 1px solid #EBEBEB;
-}
-
-.table-bordered > thead > tr > th, .table-bordered > thead > tr > td {
-	background-color: #F5F5F6;
-	border-bottom-width: 1px;
-}
-
-.table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td {
-	border: 1px solid #e7e7e7;
-}
-
-.table > thead > tr > th {
-	border-bottom: 1px solid #DDDDDD;
-	vertical-align: bottom;
-}
-
-.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
-	border-top: 1px solid @border-color;
-	line-height: 1.42857;
-	padding: 8px;
-	vertical-align: top;
-}
-
-/* PANELS */
-
-.panel.blank-panel {
-	background: none;
-	margin: 0;
-}
-
-.blank-panel .panel-heading {
-	padding-bottom: 0;
-}
-
-.nav-tabs > li > a {
-	color: #A7B1C2;
-	font-weight: 600;
-	padding: 10px 20px 10px 25px;
-}
-
-.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
-	background-color: #e6e6e6;
-	color: @text-color;
-}
-
-.ui-tab .tab-content {
-	padding: 20px 0;
-}
-
-/* GLOBAL  */
-
-.no-padding {
-	padding: 0 !important;
-}
-
-.no-borders {
-	border: none !important;
-}
-
-.no-margins {
-	margin: 0 !important;
-}
-
-.no-top-border {
-	border-top: 0 !important;
-}
-
-.ibox-content.text-box {
-	padding-bottom: 0;
-	padding-top: 15px;
-}
-
-.border-left-right {
-	border-left: 1px solid @border-color;
-	border-right: 1px solid @border-color;
-}
-
-.border-top-bottom {
-	border-top: 1px solid @border-color;
-	border-bottom: 1px solid @border-color;
-}
-
-.border-left {
-	border-left: 1px solid @border-color;
-}
-
-.border-right {
-	border-right: 1px solid @border-color;
-}
-
-.border-top {
-	border-top: 1px solid @border-color;
-}
-
-.border-bottom {
-	border-bottom: 1px solid @border-color;
-}
-
-.border-size-sm {
-	border-width: 3px;
-}
-
-.border-size-md {
-	border-width: 6px;
-}
-
-.border-size-lg {
-	border-width: 9px;
-}
-
-.border-size-xl {
-	border-width: 12px;
-}
-
-.full-width {
-	width: 100% !important;
-}
-
-.link-block {
-	font-size: 12px;
-	padding: 10px;
-}
-
-.link-block a {
-	font-size: 10px;
-	color: inherit;
-
-}
-
-#body.mini-navbar .branding {
-	display: none;
-}
-
-img.circle-border {
-	border: 6px solid #FFFFFF;
-	border-radius: 50%;
-}
-
-.branding {
-	float: left;
-	color: #FFFFFF;
-	font-size: 18px;
-	font-weight: 600;
-	padding: 17px 20px;
-	text-align: center;
-	background-color: @navy;
-}
-
-.login-panel {
-	margin-top: 25%;
-}
-
-.icons-box h3 {
-	margin-top: 10px;
-	margin-bottom: 10px;
-}
-
-.icons-box .infont a i {
-	font-size: 25px;
-	display: block;
-	color: @text-color;
-}
-
-.icons-box .infont a {
-	color: #a6a8a9;
-}
-
-.icons-box .infont a {
-	padding: 10px;
-
-	margin: 1px;
-	display: block;
-}
-
-.ui-draggable .ibox-title {
-	cursor: move;
-}
-
-.breadcrumb {
-	background-color: #ffffff;
-	padding: 0;
-	margin-bottom: 0;
-}
-
-.breadcrumb > li a {
-	color: inherit;
-}
-
-.breadcrumb > .active {
-	color: inherit;
-}
-
-code {
-	background-color: #F9F2F4;
-	border-radius: 4px;
-	color: #ca4440;
-	font-size: 90%;
-	padding: 2px 4px;
-	white-space: nowrap;
-}
-
-.ibox {
-	clear: both;
-	margin-bottom: 25px;
-	margin-top: 0;
-	padding: 0;
-}
-
-.ibox.collapsed .ibox-content {
-	display: none;
-}
-
-.ibox.collapsed .fa.fa-chevron-up:before {
-	content: "\f078";
-}
-
-.ibox.collapsed .fa.fa-chevron-down:before {
-	content: "\f077";
-}
-
-.ibox:after, .ibox:before {
-	display: table;
-}
-
-.ibox-title {
-	-moz-border-bottom-colors: none;
-	-moz-border-left-colors: none;
-	-moz-border-right-colors: none;
-	-moz-border-top-colors: none;
-	background-color: @ibox-title-bg;
-	border-color: @border-color;
-	border-image: none;
-	border-style: solid solid none;
-	border-width: 2px 0 0;
-	color: inherit;
-	margin-bottom: 0;
-	padding: 15px 15px 7px;
-	min-height: 48px;
-}
-
-.ibox-content {
-	background-color: @ibox-content-bg;
-	color: inherit;
-	padding: 15px 20px 20px 20px;
-
-	border-color: @border-color;
-	border-image: none;
-	border-style: solid solid none;
-	border-width: 1px 0;
-}
-
-.ibox-footer {
-	color: inherit;
-	border-top: 1px solid @border-color;
-	font-size: 90%;
-	background: #ffffff;
-	padding: 10px 15px;
-}
-
-table.table-mail tr td {
-	padding: 12px;
-}
-
-.table-mail .check-mail {
-	padding-left: 20px;
-}
-
-.table-mail .mail-date {
-	padding-right: 20px;
-}
-
-.star-mail, .check-mail {
-	width: 40px;
-}
-
-.unread td a, .unread td {
-	font-weight: 600;
-	color: inherit;
-}
-
-.read td a, .read td {
-	font-weight: normal;
-	color: inherit;
-}
-
-.unread td {
-	background-color: #f9f8f8;
-}
-
-.ibox-content {
-	clear: both;
-}
-
-.ibox-heading {
-	background-color: #f3f6fb;
-	border-bottom: none;
-}
-
-.ibox-heading h3 {
-	font-weight: 200;
-	font-size: 24px;
-}
-
-.ibox-title h5 {
-	display: inline-block;
-	font-size: 14px;
-	margin: 0 0 7px;
-	padding: 0;
-	text-overflow: ellipsis;
-	float: left;
-}
-
-.ibox-title .label {
-	float: left;
-	margin-left: 4px;
-}
-
-.ibox-tools {
-	display: block;
-	float: none;
-	margin-top: 0;
-	position: relative;
-	padding: 0;
-	text-align: right;
-}
-
-.ibox-tools a {
-	cursor: pointer;
-	margin-left: 5px;
-	color: #c4c4c4;
-}
-
-.ibox-tools a.btn-primary {
-	color: #fff;
-}
-
-.ibox-tools .dropdown-menu > li > a {
-	padding: 4px 10px;
-	font-size: 12px;
-}
-
-.ibox .ibox-tools.open > .dropdown-menu {
-	left: auto;
-	right: 0;
-}
-
-/* BACKGROUNDS */
-
-.gray-bg, .bg-muted {
-	background-color: @gray;
-}
-
-.white-bg, .bg-white {
-	background-color: #ffffff;
-}
-
-.navy-bg, .bg-success {
-	background-color: @navy;
-	color: #ffffff;
-}
-
-.blue-bg, .bg-primary {
-	background-color: @blue;
-	color: #ffffff;
-}
-
-.lazur-bg, .bg-info {
-	background-color: @lazur;
-	color: #ffffff;
-}
-
-.yellow-bg, .bg-warning {
-	background-color: @yellow;
-	color: #ffffff;
-}
-
-.red-bg, .bg-danger {
-	background-color: @red;
-	color: #ffffff;
-}
-
-.black-bg, .bg-black {
-	background-color: #262626;
-}
-
-.panel-primary {
-	border-color: @navy;
-}
-
-.panel-primary > .panel-heading {
-	background-color: @navy;
-	border-color: @navy;
-}
-
-.panel-success {
-	border-color: @blue;
-}
-
-.panel-success > .panel-heading {
-	background-color: @blue;
-	border-color: @blue;
-	color: #ffffff;
-}
-
-.panel-info {
-	border-color: @lazur;
-}
-
-.panel-info > .panel-heading {
-	background-color: @lazur;
-	border-color: @lazur;
-	color: #ffffff;
-}
-
-.panel-warning {
-	border-color: @yellow;
-}
-
-.panel-warning > .panel-heading {
-	background-color: @yellow;
-	border-color: @yellow;
-	color: #ffffff;
-}
-
-.panel-danger {
-	border-color: @red;
-}
-
-.panel-danger > .panel-heading {
-	background-color: @red;
-	border-color: @red;
-	color: #ffffff;
-}
-
-.progress-bar {
-	background-color: @navy;
-}
-
-.progress-small, .progress-small .progress-bar {
-	height: 10px;
-}
-
-.progress-small, .progress-mini {
-	margin-top: 5px;
-}
-
-.progress-mini, .progress-mini .progress-bar {
-	height: 5px;
-	margin-bottom: 0;
-}
-
-.progress-bar-navy-light {
-	background-color: #3dc7ab;
-}
-
-.progress-bar-success {
-	background-color: @blue;
-}
-
-.progress-bar-info {
-	background-color: @lazur;
-}
-
-.progress-bar-warning {
-	background-color: @yellow;
-}
-
-.progress-bar-danger {
-	background-color: @red;
-}
-
-.panel-title {
-	font-size: inherit;
-}
-
-.jumbotron {
-	border-radius: 6px;
-	padding: 40px;
-}
-
-.jumbotron h1 {
-	margin-top: 0;
-}
-
-/* COLORS */
-
-.text-navy {
-	color: @navy;
-}
-
-.text-primary {
-	color: inherit;
-}
-
-.text-success {
-	color: @blue;
-}
-
-.text-info {
-	color: @lazur;
-}
-
-.text-warning {
-	color: @yellow;
-}
-
-.text-danger {
-	color: @red;
-}
-
-.text-muted {
-	color: #888888;
-}
-
-.text-white {
-	color: #ffffff;
-}
-
-.simple_tag {
-	background-color: #f3f3f4;
-	border: 1px solid #e7eaec;
-	border-radius: 2px;
-	color: inherit;
-	font-size: 10px;
-	margin-right: 5px;
-	margin-top: 5px;
-	padding: 5px 12px;
-	display: inline-block;
-}
-
-.img-shadow {
-	-webkit-box-shadow: 0 0 3px 0 rgba(145, 145, 145, 1);
-	-moz-box-shadow: 0 0 3px 0 rgba(145, 145, 145, 1);
-	box-shadow: 0 0 3px 0 rgba(145, 145, 145, 1);
-}
-
-/* For handle diferent bg color in AngularJS version */
-.dashboards\.dashboard_2 nav.navbar,
-.dashboards\.dashboard_3 nav.navbar,
-.mailbox\.inbox nav.navbar,
-.mailbox\.email_view nav.navbar,
-.mailbox\.email_compose nav.navbar,
-.dashboards\.dashboard_4_1 nav.navbar,
-.metrics nav.navbar, .metrics\.index nav.navbar,
-.dashboards\.dashboard_5 nav.navbar {
-	background: #fff;
-}
-
-/* For handle diferent bg color in MVC version */
-.Dashboard_2 .navbar.navbar-static-top,
-.Dashboard_3 .navbar.navbar-static-top,
-.Dashboard_4_1 .navbar.navbar-static-top,
-.ComposeEmail .navbar.navbar-static-top,
-.EmailView .navbar.navbar-static-top,
-.Inbox .navbar.navbar-static-top,
-.Metrics .navbar.navbar-static-top,
-.Dashboard_5 .navbar.navbar-static-top {
-	background: #fff;
-}
-
-
-/* FULL HEIGHT */
-
-.full-height {
-	height: 100%;
-}
-
-.fh-breadcrumb {
-	height: calc(~"100% - 196px");
-	margin: 0 -15px;
-	position: relative
-}
-
-.fh-no-breadcrumb {
-	height: calc(~"100% - 99px");
-	margin: 0 -15px;
-	position: relative
-}
-
-.fh-column {
-	background: #fff;
-	height: 100%;
-	width: 240px;
-	float: left
-}
-
-.modal-backdrop {
-	z-index: 2040 !important;
-}
-
-.modal {
-	z-index: 2050 !important;
-}
-
-.spiner-example {
-	height: 200px;
-	padding-top: 70px;
-}
-
-/* MARGINS & PADDINGS */
-
-.p-xxs {
-	padding: 5px;
-}
-
-.p-xs {
-	padding: 10px;
-}
-
-.p-sm {
-	padding: 15px;
-}
-
-.p-m {
-	padding: 20px;
-}
-
-.p-md {
-	padding: 25px;
-}
-
-.p-lg {
-	padding: 30px;
-}
-
-.p-xl {
-	padding: 40px;
-}
-
-.p-w-xs {
-	padding: 0 10px;
-}
-
-.p-w-sm {
-	padding: 0 15px;
-
-}
-
-.p-w-m {
-	padding: 0 20px;
-
-}
-
-.p-w-md {
-	padding: 0 25px;
-
-}
-
-.p-w-lg {
-	padding: 0 30px;
-
-}
-
-.p-w-xl {
-	padding: 0 40px;
-
-}
-
-.p-h-xs {
-	padding: 10px 0;
-}
-
-.p-h-sm {
-	padding: 15px 0;
-
-}
-
-.p-h-m {
-	padding: 20px 0;
-
-}
-
-.p-h-md {
-	padding: 25px 0;
-
-}
-
-.p-h-lg {
-	padding: 30px 0;
-
-}
-
-.p-h-xl {
-	padding: 40px 0;
-
-}
-
-.m-xxs {
-	margin: 2px 4px;
-}
-
-.m-xs {
-	margin: 5px;
-}
-
-.m-sm {
-	margin: 10px;
-}
-
-.m-md {
-	margin: 20px;
-}
-
-.m-lg {
-	margin: 30px;
-}
-
-.m-xl {
-	margin: 50px;
-}
-
-.m-n {
-	margin: 0 !important;
-}
-
-.m-l-none {
-	margin-left: 0;
-}
-
-.m-l-xs {
-	margin-left: 5px;
-}
-
-.m-l-sm {
-	margin-left: 10px;
-}
-
-.m-l {
-	margin-left: 15px;
-}
-
-.m-l-md {
-	margin-left: 20px;
-}
-
-.m-l-lg {
-	margin-left: 30px;
-}
-
-.m-l-xl {
-	margin-left: 40px;
-}
-
-.m-l-n-xxs {
-	margin-left: -1px;
-}
-
-.m-l-n-xs {
-	margin-left: -5px;
-}
-
-.m-l-n-sm {
-	margin-left: -10px;
-}
-
-.m-l-n {
-	margin-left: -15px;
-}
-
-.m-l-n-md {
-	margin-left: -20px;
-}
-
-.m-l-n-lg {
-	margin-left: -30px;
-}
-
-.m-l-n-xl {
-	margin-left: -40px;
-}
-
-.m-t-none {
-	margin-top: 0;
-}
-
-.m-t-xxs {
-	margin-top: 1px;
-}
-
-.m-t-xs {
-	margin-top: 5px;
-}
-
-.m-t-sm {
-	margin-top: 10px;
-}
-
-.m-t {
-	margin-top: 15px;
-}
-
-.m-t-md {
-	margin-top: 20px;
-}
-
-.m-t-lg {
-	margin-top: 30px;
-}
-
-.m-t-xl {
-	margin-top: 40px;
-}
-
-.m-t-n-xxs {
-	margin-top: -1px;
-}
-
-.m-t-n-xs {
-	margin-top: -5px;
-}
-
-.m-t-n-sm {
-	margin-top: -10px;
-}
-
-.m-t-n {
-	margin-top: -15px;
-}
-
-.m-t-n-md {
-	margin-top: -20px;
-}
-
-.m-t-n-lg {
-	margin-top: -30px;
-}
-
-.m-t-n-xl {
-	margin-top: -40px;
-}
-
-.m-r-none {
-	margin-right: 0;
-}
-
-.m-r-xxs {
-	margin-right: 1px;
-}
-
-.m-r-xs {
-	margin-right: 5px;
-}
-
-.m-r-sm {
-	margin-right: 10px;
-}
-
-.m-r {
-	margin-right: 15px;
-}
-
-.m-r-md {
-	margin-right: 20px;
-}
-
-.m-r-lg {
-	margin-right: 30px;
-}
-
-.m-r-xl {
-	margin-right: 40px;
-}
-
-.m-r-n-xxs {
-	margin-right: -1px;
-}
-
-.m-r-n-xs {
-	margin-right: -5px;
-}
-
-.m-r-n-sm {
-	margin-right: -10px;
-}
-
-.m-r-n {
-	margin-right: -15px;
-}
-
-.m-r-n-md {
-	margin-right: -20px;
-}
-
-.m-r-n-lg {
-	margin-right: -30px;
-}
-
-.m-r-n-xl {
-	margin-right: -40px;
-}
-
-.m-b-none {
-	margin-bottom: 0;
-}
-
-.m-b-xxs {
-	margin-bottom: 1px;
-}
-
-.m-b-xs {
-	margin-bottom: 5px;
-}
-
-.m-b-sm {
-	margin-bottom: 10px;
-}
-
-.m-b {
-	margin-bottom: 15px;
-}
-
-.m-b-md {
-	margin-bottom: 20px;
-}
-
-.m-b-lg {
-	margin-bottom: 30px;
-}
-
-.m-b-xl {
-	margin-bottom: 40px;
-}
-
-.m-b-n-xxs {
-	margin-bottom: -1px;
-}
-
-.m-b-n-xs {
-	margin-bottom: -5px;
-}
-
-.m-b-n-sm {
-	margin-bottom: -10px;
-}
-
-.m-b-n {
-	margin-bottom: -15px;
-}
-
-.m-b-n-md {
-	margin-bottom: -20px;
-}
-
-.m-b-n-lg {
-	margin-bottom: -30px;
-}
-
-.m-b-n-xl {
-	margin-bottom: -40px;
-}
-
-.space-15 {
-	margin: 15px 0;
-}
-
-.space-20 {
-	margin: 20px 0;
-}
-
-.space-25 {
-	margin: 25px 0;
-}
-
-.space-30 {
-	margin: 30px 0;
-}
-
-// IMAGES SIZE
-
-.img-sm {
-	width: 40px;
-	height: 40px;
-}
-
-.img-md {
-	width: 64px;
-	height: 64px;
-}
-
-.img-lg {
-	width: 96px;
-	height: 96px;
-}
-
-.img-blg {
-	width: 150px;
-	height: 150px;
-}
-
-
-// BORDER RADIUS
-
-.b-r-xs {
-	-webkit-border-radius: 1px;
-	-moz-border-radius: 1px;
-	border-radius: 1px;
-}
-
-.b-r-sm {
-	-webkit-border-radius: 3px;
-	-moz-border-radius: 3px;
-	border-radius: 3px;
-}
-
-.b-r-md {
-	-webkit-border-radius: 6px;
-	-moz-border-radius: 6px;
-	border-radius: 6px;
-}
-
-.b-r-lg {
-	-webkit-border-radius: 12px;
-	-moz-border-radius: 12px;
-	border-radius: 12px;
-}
-
-.b-r-xl {
-	-webkit-border-radius: 24px;
-	-moz-border-radius: 24px;
-	border-radius: 24px;
-}
-
-// Fullscreen functions
-
-.fullscreen-ibox-mode .animated {
-	animation: none;
-}
-
-#body.fullscreen-ibox-mode {
-	overflow-y: hidden;
-}
-
-.ibox.fullscreen {
-	z-index: 2030;
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	overflow: auto;
-	margin-bottom: 0;
-}
-
-.ibox.fullscreen .collapse-link {
-	display: none;
-}
-
-.ibox.fullscreen .ibox-content {
-	min-height: calc(~"100% - 48px");
-}
-
-// Bootstrap issue in 3.3.0 with modal https://github.com/twbs/bootstrap/issues/9855
-// Fix
-#body.modal-open {
-	padding-right: inherit !important;
-}
-
-// Fix for modal backdrop with animate.css
-#body.modal-open .animated {
-	animation-fill-mode: initial;
-	z-index: inherit
-}
-
-// Remove animation on fullscreen video
-
-.fullscreen-video .animated {
-	animation: none;
-}
diff --git a/src/assets/css/inspinia/buttons.less b/src/assets/css/inspinia/buttons.less
deleted file mode 100644
index b0c6867..0000000
--- a/src/assets/css/inspinia/buttons.less
+++ /dev/null
@@ -1,309 +0,0 @@
-
-.btn {
-  border-radius: @btn-border-radius;
-}
-
-.float-e-margins .btn {
-  margin-bottom: 5px;
-}
-
-.btn-w-m {
-  min-width: 120px;
-}
-
-.btn-primary.btn-outline {
-  color: @navy;
-}
-
-.btn-success.btn-outline {
-  color: @blue;
-}
-
-.btn-info.btn-outline {
-  color: @lazur;
-}
-
-.btn-warning.btn-outline {
-  color: @yellow;
-}
-
-.btn-danger.btn-outline {
-  color: @red;
-}
-
-.btn-primary.btn-outline:hover,
-.btn-success.btn-outline:hover,
-.btn-info.btn-outline:hover,
-.btn-warning.btn-outline:hover,
-.btn-danger.btn-outline:hover {
-  color: #fff;
-}
-
-.btn-primary {
-  background-color: @navy;
-  border-color: @navy;
-  color: #FFFFFF;
-}
-
-.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary, .btn-primary:active:focus, .btn-primary:active:hover, .btn-primary.active:hover, .btn-primary.active:focus {
-  background-color: darken(@navy, 3%);
-  border-color: darken(@navy, 3%);
-  color: #FFFFFF;
-}
-
-.btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary {
-  background-image: none;
-}
-
-.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary.active[disabled], fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active {
-  background-color: lighten(@navy, 4%);
-  border-color: lighten(@navy, 4%);
-}
-
-.btn-success {
-  background-color: @blue;
-  border-color: @blue;
-  color: #FFFFFF;
-}
-
-.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success, .btn-success:active:focus, .btn-success:active:hover, .btn-success.active:hover, .btn-success.active:focus {
-  background-color: darken(@blue, 3%);
-  border-color: darken(@blue, 3%);
-  color: #FFFFFF;
-}
-
-.btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success {
-  background-image: none;
-}
-
-.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success.active[disabled], fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active {
-  background-color: lighten(@blue, 4%);
-  border-color: lighten(@blue, 4%);
-}
-
-.btn-info {
-  background-color: @lazur;
-  border-color: @lazur;
-  color: #FFFFFF;
-}
-
-.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info, .btn-info:active:focus, .btn-info:active:hover, .btn-info.active:hover, .btn-info.active:focus {
-  background-color: darken(@lazur, 3%);
-  border-color: darken(@lazur, 3%);
-  color: #FFFFFF;
-}
-
-.btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info {
-  background-image: none;
-}
-
-.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info.active[disabled], fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active {
-  background-color: lighten(@lazur, 4%);
-  border-color: lighten(@lazur, 4%);
-}
-
-.btn-default {
-  color: inherit;
-  background: white;
-  border: 1px solid @border-color;
-}
-
-.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default, .btn-default:active:focus, .btn-default:active:hover, .btn-default.active:hover, .btn-default.active:focus {
-  color: inherit;
-  border: 1px solid #d2d2d2;
-}
-
-.btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
-}
-
-.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default.active[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active {
-  color: #cacaca;
-}
-
-.btn-warning {
-  background-color: @yellow;
-  border-color: @yellow;
-  color: #FFFFFF;
-}
-
-.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning, .btn-warning:active:focus, .btn-warning:active:hover, .btn-warning.active:hover, .btn-warning.active:focus {
-  background-color: darken(@yellow, 3%);
-  border-color: darken(@yellow, 3%);
-  color: #FFFFFF;
-}
-
-.btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning {
-  background-image: none;
-}
-
-.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning.active[disabled], fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active {
-  background-color: lighten(@yellow, 4%);
-  border-color: lighten(@yellow, 4%);
-}
-
-.btn-danger {
-  background-color: @red;
-  border-color: @red;
-  color: #FFFFFF;
-}
-
-.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger, .btn-danger:active:focus, .btn-danger:active:hover, .btn-danger.active:hover, .btn-danger.active:focus {
-  background-color: darken(@red, 3%);
-  border-color: darken(@red, 3%);
-  color: #FFFFFF;
-}
-
-.btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger {
-  background-image: none;
-}
-
-.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger.active[disabled], fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active {
-  background-color: lighten(@red, 4%);
-  border-color: lighten(@red, 4%);
-}
-
-.btn-link {
-  color: inherit;
-}
-
-.btn-link:hover, .btn-link:focus, .btn-link:active, .btn-link.active, .open .dropdown-toggle.btn-link {
-  color: @navy;
-  text-decoration: none;
-}
-
-.btn-link:active, .btn-link.active, .open .dropdown-toggle.btn-link {
-  background-image: none;
-}
-
-.btn-link.disabled, .btn-link.disabled:hover, .btn-link.disabled:focus, .btn-link.disabled:active, .btn-link.disabled.active, .btn-link[disabled], .btn-link[disabled]:hover, .btn-link[disabled]:focus, .btn-link[disabled]:active, .btn-link.active[disabled], fieldset[disabled] .btn-link, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus, fieldset[disabled] .btn-link:active, fieldset[disabled] .btn-link.active {
-  color: #cacaca;
-}
-
-.btn-white {
-  color: inherit;
-  background: white;
-  border: 1px solid @border-color;
-}
-
-.btn-white:hover, .btn-white:focus, .btn-white:active, .btn-white.active, .open .dropdown-toggle.btn-white, .btn-white:active:focus, .btn-white:active:hover, .btn-white.active:hover, .btn-white.active:focus {
-  color: inherit;
-  border: 1px solid #d2d2d2;
-}
-
-.btn-white:active, .btn-white.active {
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
-}
-
-.btn-white:active, .btn-white.active, .open .dropdown-toggle.btn-white {
-  background-image: none;
-}
-
-.btn-white.disabled, .btn-white.disabled:hover, .btn-white.disabled:focus, .btn-white.disabled:active, .btn-white.disabled.active, .btn-white[disabled], .btn-white[disabled]:hover, .btn-white[disabled]:focus, .btn-white[disabled]:active, .btn-white.active[disabled], fieldset[disabled] .btn-white, fieldset[disabled] .btn-white:hover, fieldset[disabled] .btn-white:focus, fieldset[disabled] .btn-white:active, fieldset[disabled] .btn-white.active {
-  color: #cacaca;
-}
-
-.form-control, .form-control:focus, .has-error .form-control:focus, .has-success .form-control:focus, .has-warning .form-control:focus, .navbar-collapse, .navbar-form, .navbar-form-custom .form-control:focus, .navbar-form-custom .form-control:hover, .open .btn.dropdown-toggle, .panel, .popover, .progress, .progress-bar {
-  box-shadow: none;
-}
-
-.btn-outline {
-  color: inherit;
-  background-color: transparent;
-  transition: all .5s;
-}
-
-.btn-rounded {
-  border-radius: 50px;
-}
-
-.btn-large-dim {
-  width: 90px;
-  height: 90px;
-  font-size: 42px;
-}
-
-button.dim {
-  display: inline-block;
-  text-decoration: none;
-  text-transform: uppercase;
-  text-align: center;
-  padding-top: 6px;
-  margin-right: 10px;
-  position: relative;
-  cursor: pointer;
-  border-radius: 5px;
-  font-weight: 600;
-  margin-bottom: 20px !important;
-}
-
-button.dim:active {
-  top: 3px;
-}
-
-button.btn-primary.dim {
-  box-shadow: inset 0 0 0 darken(@navy, 6%), 0 5px 0 0 darken(@navy, 6%), 0 10px 5px #999;
-}
-
-button.btn-primary.dim:active {
-  box-shadow: inset 0 0 0 darken(@navy, 6%), 0 2px 0 0 darken(@navy, 6%), 0 5px 3px #999;
-}
-
-button.btn-default.dim {
-  box-shadow: inset 0 0 0 darken(@dark-gray, 6%), 0 5px 0 0 darken(@dark-gray, 6%), 0 10px 5px #999;
-}
-
-button.btn-default.dim:active {
-  box-shadow: inset 0 0 0 darken(@dark-gray, 6%), 0 2px 0 0 darken(@dark-gray, 6%), 0 5px 3px #999;
-}
-
-button.btn-warning.dim {
-  box-shadow: inset 0 0 0 darken(@yellow, 6%), 0 5px 0 0 darken(@yellow, 6%), 0 10px 5px #999;
-}
-
-button.btn-warning.dim:active {
-  box-shadow: inset 0 0 0 darken(@yellow, 6%), 0 2px 0 0 darken(@yellow, 6%), 0 5px 3px #999;
-}
-
-button.btn-info.dim {
-  box-shadow: inset 0 0 0 darken(@lazur, 6%), 0 5px 0 0 darken(@lazur, 6%), 0 10px 5px #999;
-}
-
-button.btn-info.dim:active {
-  box-shadow: inset 0 0 0 darken(@lazur, 6%), 0 2px 0 0 darken(@lazur, 6%), 0 5px 3px #999;
-}
-
-button.btn-success.dim {
-  box-shadow: inset 0 0 0 darken(@blue, 6%), 0 5px 0 0 darken(@blue, 6%), 0 10px 5px #999;
-}
-
-button.btn-success.dim:active {
-  box-shadow: inset 0 0 0 darken(@blue, 6%), 0 2px 0 0 darken(@blue, 6%), 0 5px 3px #999;
-}
-
-button.btn-danger.dim {
-  box-shadow: inset 0 0 0 darken(@red, 6%), 0 5px 0 0 darken(@red, 6%), 0 10px 5px #999;
-}
-
-button.btn-danger.dim:active {
-  box-shadow: inset 0 0 0 darken(@red, 6%), 0 2px 0 0 darken(@red, 6%), 0 5px 3px #999;
-}
-
-button.dim:before {
-  font-size: 50px;
-  line-height: 1em;
-  font-weight: normal;
-  color: #fff;
-  display: block;
-  padding-top: 10px;
-
-}
-
-button.dim:active:before {
-  top: 7px;
-  font-size: 50px;
-}
-
-.btn:focus {
-  outline: none !important;
-}
diff --git a/src/assets/css/inspinia/chat.less b/src/assets/css/inspinia/chat.less
deleted file mode 100644
index 0941739..0000000
--- a/src/assets/css/inspinia/chat.less
+++ /dev/null
@@ -1,119 +0,0 @@
-#small-chat {
-  position: fixed;
-  bottom: 20px;
-  right: 20px;
-  z-index: 100;
-}
-
-#small-chat .badge {
-  position: absolute;
-  top: -3px;
-  right: -4px;
-}
-
-.open-small-chat {
-  height: 38px;
-  width: 38px;
-  display: block;
-  background: #1ab394;
-  padding: 9px 8px;
-  text-align: center;
-  color: #fff;
-  border-radius: 50%;
-}
-
-.open-small-chat:hover {
-  color: white;
-  background: #1ab394;
-}
-
-.small-chat-box {
-  display: none;
-  position: fixed;
-  bottom: 20px;
-  right: 75px;
-  background: #fff;
-  border: 1px solid @border-color;
-  width: 230px;
-  height: 320px;
-  border-radius: 4px;
-}
-
-.small-chat-box.ng-small-chat {
-  display: block;
-}
-
-
-.small-chat-box.active {
-  display: block;
-}
-
-.small-chat-box {
-
-  .heading {
-    background: @nav-bg;
-    padding: 8px 15px;
-    font-weight: bold;
-    color: #fff;
-  }
-
-  .chat-date {
-    opacity: 0.6;
-    font-size: 10px;
-    font-weight: normal;
-  }
-
-  .content {
-    padding: 15px 15px;
-
-    .author-name {
-      font-weight: bold;
-      margin-bottom: 3px;
-      font-size: 11px;
-    }
-
-    > div {
-      padding-bottom: 20px;
-    }
-
-    .chat-message {
-      padding: 5px 10px;
-      border-radius: 6px;
-      font-size: 11px;
-      line-height: 14px;
-      max-width: 80%;
-      background: #f3f3f4;
-      margin-bottom: 10px;
-    }
-
-    .chat-message.active {
-      background: #1ab394;
-      color: #fff;
-    }
-
-    .left {
-      text-align: left;
-      clear: both;
-
-      .chat-message {
-        float: left;
-      }
-    }
-
-    .right {
-      text-align: right;
-      clear: both;
-
-      .chat-message {
-        float: right;
-      }
-
-    }
-
-  }
-
-  .form-chat {
-    padding: 10px 10px;
-  }
-
-}
\ No newline at end of file
diff --git a/src/assets/css/inspinia/elements.less b/src/assets/css/inspinia/elements.less
deleted file mode 100644
index 328cd5a..0000000
--- a/src/assets/css/inspinia/elements.less
+++ /dev/null
@@ -1,2471 +0,0 @@
-/* TOOGLE SWICH */
-
-.onoffswitch {
-  position: relative;
-  width: 64px;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-}
-
-.onoffswitch-checkbox {
-  display: none;
-}
-
-.onoffswitch-label {
-  display: block;
-  overflow: hidden;
-  cursor: pointer;
-  border: 2px solid @navy;
-  border-radius: 2px;
-}
-
-.onoffswitch-inner {
-  width: 200%;
-  margin-left: -100%;
-  -moz-transition: margin 0.3s ease-in 0s;
-  -webkit-transition: margin 0.3s ease-in 0s;
-  -o-transition: margin 0.3s ease-in 0s;
-  transition: margin 0.3s ease-in 0s;
-}
-
-.onoffswitch-inner:before, .onoffswitch-inner:after {
-  float: left;
-  width: 50%;
-  height: 20px;
-  padding: 0;
-  line-height: 20px;
-  font-size: 12px;
-  color: white;
-  font-family: Trebuchet, Arial, sans-serif;
-  font-weight: bold;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.onoffswitch-inner:before {
-  content: "ON";
-  padding-left: 10px;
-  background-color: @navy;
-  color: #FFFFFF;
-}
-
-.onoffswitch-inner:after {
-  content: "OFF";
-  padding-right: 10px;
-  background-color: #FFFFFF;
-  color: #999999;
-  text-align: right;
-}
-
-.onoffswitch-switch {
-  width: 20px;
-  margin: 0;
-  background: #FFFFFF;
-  border: 2px solid @navy;
-  border-radius: 2px;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  right: 44px;
-  -moz-transition: all 0.3s ease-in 0s;
-  -webkit-transition: all 0.3s ease-in 0s;
-  -o-transition: all 0.3s ease-in 0s;
-  transition: all 0.3s ease-in 0s;
-}
-
-.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
-  margin-left: 0;
-}
-
-.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
-  right: 0;
-}
-
-.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner:before {
-  background-color: #919191;
-}
-
-.onoffswitch-checkbox:disabled + .onoffswitch-label,
-.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-switch{
-  border-color: #919191;
-}
-
-/* CHOSEN PLUGIN */
-
-.chosen-container-single .chosen-single {
-  background: #ffffff;
-  box-shadow: none;
-  -moz-box-sizing: border-box;
-  border-radius: 2px;
-  cursor: text;
-  height: auto !important;
-  margin: 0;
-  min-height: 30px;
-  overflow: hidden;
-  padding: 4px 12px;
-  position: relative;
-  width: 100%;
-}
-
-.chosen-container-multi .chosen-choices li.search-choice {
-  background: #f1f1f1;
-  border: 1px solid #e5e6e7;
-  border-radius: 2px;
-  box-shadow: none;
-  color: #333333;
-  cursor: default;
-  line-height: 13px;
-  margin: 3px 0 3px 5px;
-  padding: 3px 20px 3px 5px;
-  position: relative;
-}
-
-/* Tags Input Plugin */
-
-.bootstrap-tagsinput {
-  border: 1px solid #e5e6e7;
-  box-shadow: none;
-}
-
-/* PAGINATIN */
-
-.pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus {
-  background-color: #f4f4f4;
-  border-color: #DDDDDD;
-  color: inherit;
-  cursor: default;
-  z-index: 2;
-}
-
-.pagination > li > a, .pagination > li > span {
-  background-color: #FFFFFF;
-  border: 1px solid #DDDDDD;
-  color: inherit;
-  float: left;
-  line-height: 1.42857;
-  margin-left: -1px;
-  padding: 4px 10px;
-  position: relative;
-  text-decoration: none;
-}
-
-/* TOOLTIPS */
-
-.tooltip-inner {
-  background-color: #2F4050;
-}
-
-.tooltip.top .tooltip-arrow {
-  border-top-color: #2F4050;
-}
-
-.tooltip.right .tooltip-arrow {
-  border-right-color: #2F4050;
-}
-
-.tooltip.bottom .tooltip-arrow {
-  border-bottom-color: #2F4050;
-}
-
-.tooltip.left .tooltip-arrow {
-  border-left-color: #2F4050;
-}
-
-/* EASY PIE CHART*/
-
-.easypiechart {
-  position: relative;
-  text-align: center;
-}
-
-.easypiechart .h2 {
-  margin-left: 10px;
-  margin-top: 10px;
-  display: inline-block;
-}
-
-.easypiechart canvas {
-  top: 0;
-  left: 0;
-}
-
-.easypiechart .easypie-text {
-  line-height: 1;
-  position: absolute;
-  top: 33px;
-  width: 100%;
-  z-index: 1;
-}
-
-.easypiechart img {
-  margin-top: -4px;
-}
-
-.jqstooltip {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-/* FULLCALENDAR */
-
-.fc-state-default {
-  background-color: #ffffff;
-  background-image: none;
-  background-repeat: repeat-x;
-  box-shadow: none;
-  color: #333333;
-  text-shadow: none;
-}
-
-.fc-state-default {
-  border: 1px solid;
-}
-
-.fc-button {
-  color: inherit;
-  border: 1px solid @border-color;
-  cursor: pointer;
-  display: inline-block;
-  height: 1.9em;
-  line-height: 1.9em;
-  overflow: hidden;
-  padding: 0 0.6em;
-  position: relative;
-  white-space: nowrap;
-}
-
-.fc-state-active {
-  background-color: @navy;
-  border-color: @navy;
-  color: #ffffff;
-}
-
-.fc-header-title h2 {
-  font-size: 16px;
-  font-weight: 600;
-  color: inherit;
-}
-
-.fc-content .fc-widget-header, .fc-content .fc-widget-content {
-  border-color: @border-color;
-  font-weight: normal;
-}
-
-.fc-border-separate tbody {
-  background-color: #F8F8F8;
-}
-
-.fc-state-highlight {
-  background: none repeat scroll 0 0 #FCF8E3;
-}
-
-.external-event {
-  padding: 5px 10px;
-  border-radius: 2px;
-  cursor: pointer;
-  margin-bottom: 5px;
-}
-
-.fc-ltr .fc-event-hori.fc-event-end, .fc-rtl .fc-event-hori.fc-event-start {
-  border-radius: 2px;
-}
-
-.fc-event,
-.fc-agenda .fc-event-time,
-.fc-event a {
-  padding: 4px 6px;
-  background-color: @navy; /* background color */
-  border-color: @navy; /* border color */
-}
-
-.fc-event-time, .fc-event-title {
-  color: #717171;
-  padding: 0 1px;
-}
-
-.ui-calendar .fc-event-time, .ui-calendar .fc-event-title {
-  color: #fff;
-}
-
-/* Chat */
-.chat-activity-list .chat-element {
-  border-bottom: 1px solid @border-color;
-}
-
-.chat-element:first-child {
-  margin-top: 0;
-}
-
-.chat-element {
-  padding-bottom: 15px;
-}
-
-.chat-element, .chat-element .media {
-  margin-top: 15px;
-}
-
-.chat-element, .media-body {
-  overflow: hidden;
-}
-
-.media-body {
-  display: block;
-  width: auto;
-}
-
-.chat-element > .pull-left {
-  margin-right: 10px;
-}
-
-.chat-element img.img-circle, .dropdown-messages-box img.img-circle {
-  width: 38px;
-  height: 38px;
-}
-
-.chat-element .well {
-  border: 1px solid @border-color;
-  box-shadow: none;
-  margin-top: 10px;
-  margin-bottom: 5px;
-  padding: 10px 20px;
-  font-size: 11px;
-  line-height: 16px;
-}
-
-.chat-element .actions {
-  margin-top: 10px;
-}
-
-.chat-element .photos {
-  margin: 10px 0;
-
-}
-
-.right.chat-element > .pull-right {
-  margin-left: 10px;
-}
-
-.chat-photo {
-  max-height: 180px;
-  border-radius: 4px;
-  overflow: hidden;
-  margin-right: 10px;
-  margin-bottom: 10px;
-}
-
-.chat {
-  margin: 0;
-  padding: 0;
-  list-style: none;
-}
-
-.chat li {
-  margin-bottom: 10px;
-  padding-bottom: 5px;
-  border-bottom: 1px dotted #B3A9A9;
-}
-
-.chat li.left .chat-body {
-  margin-left: 60px;
-}
-
-.chat li.right .chat-body {
-  margin-right: 60px;
-}
-
-.chat li .chat-body p {
-  margin: 0;
-  color: #777777;
-}
-
-.panel .slidedown .glyphicon,
-.chat .glyphicon {
-  margin-right: 5px;
-}
-
-.chat-panel .panel-body {
-  height: 350px;
-  overflow-y: scroll;
-}
-
-/* LIST GROUP */
-
-a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus {
-  background-color: @navy;
-  border-color: @navy;
-  color: #FFFFFF;
-  z-index: 2;
-}
-
-.list-group-item-heading {
-  margin-top: 10px;
-}
-
-.list-group-item-text {
-  margin: 0 0 10px;
-  color: inherit;
-  font-size: 12px;
-  line-height: inherit;
-}
-
-.no-padding .list-group-item {
-  border-left: none;
-  border-right: none;
-  border-bottom: none;
-}
-
-.no-padding .list-group-item:first-child {
-  border-left: none;
-  border-right: none;
-  border-bottom: none;
-  border-top: none;
-}
-
-.no-padding .list-group {
-  margin-bottom: 0;
-}
-
-.list-group-item {
-  background-color: inherit;
-  border: 1px solid @border-color;
-  display: block;
-  margin-bottom: -1px;
-  padding: 10px 15px;
-  position: relative;
-}
-
-.elements-list .list-group-item {
-  border-left: none;
-  border-right: none;
-  padding: 15px 25px;
-
-}
-
-.elements-list .list-group-item:first-child {
-  border-left: none;
-  border-right: none;
-  border-top: none !important;
-}
-
-.elements-list .list-group {
-  margin-bottom: 0;
-}
-
-.elements-list a {
-  color: inherit;
-}
-
-.elements-list .list-group-item.active,
-.elements-list .list-group-item:hover {
-  background: #f3f3f4;
-  color: inherit;
-  border-color: #e7eaec;
-  /*border-bottom: 1px solid #e7eaec;*/
-  /*border-top: 1px solid #e7eaec;*/
-  border-radius: 0;
-}
-
-.elements-list li.active {
-  transition: none;
-}
-
-.element-detail-box {
-  padding: 25px;
-}
-
-/* FLOT CHART  */
-
-.flot-chart {
-  display: block;
-  height: 200px;
-}
-
-.widget .flot-chart.dashboard-chart {
-  display: block;
-  height: 120px;
-  margin-top: 40px;
-}
-
-.flot-chart.dashboard-chart {
-  display: block;
-  height: 180px;
-  margin-top: 40px;
-}
-
-.flot-chart-content {
-  width: 100%;
-  height: 100%;
-}
-
-.flot-chart-pie-content {
-  width: 200px;
-  height: 200px;
-  margin: auto;
-}
-
-.jqstooltip {
-  position: absolute;
-  display: block;
-  left: 0;
-  top: 0;
-  visibility: hidden;
-  background: rgb(43, 48, 58);
-  background-color: rgba(43, 48, 58, 0.8);
-  color: white;
-  text-align: left;
-  white-space: nowrap;
-  z-index: 10000;
-  padding: 5px 5px 5px 5px;
-  min-height: 22px;
-  border-radius: 3px;
-}
-
-.jqsfield {
-  color: white;
-  text-align: left;
-}
-
-.fh-150 {
-  height: 150px;
-}
-
-.fh-200 {
-  height: 200px;
-}
-
-.h-150 {
-  min-height: 150px;
-}
-
-.h-200 {
-  min-height: 200px;
-}
-
-.h-300 {
-  min-height: 300px;
-}
-
-.w-150 {
-  min-width: 150px;
-}
-
-.w-200 {
-  min-width: 200px;
-}
-
-.w-300 {
-  min-width: 300px;
-}
-
-.legendLabel {
-  padding-left: 5px;
-}
-
-.stat-list li:first-child {
-  margin-top: 0;
-}
-
-.stat-list {
-  list-style: none;
-  padding: 0;
-  margin: 0;
-}
-
-.stat-percent {
-  float: right;
-}
-
-.stat-list li {
-  margin-top: 15px;
-  position: relative;
-}
-
-/* DATATABLES */
-
-table.dataTable thead .sorting,
-table.dataTable thead .sorting_asc:after,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting_asc_disabled,
-table.dataTable thead .sorting_desc_disabled {
-  background: transparent;
-}
-
-.dataTables_wrapper {
-  padding-bottom: 30px;
-}
-
-.dataTables_length {
-  float: left;
-}
-
-.dataTables_filter label {
-  margin-right: 5px;
-}
-
-.html5buttons {
-  float: right;
-}
-
-.html5buttons a {
-  border: 1px solid #e7eaec;
-  background: #fff;
-  color: #676a6c;
-  box-shadow: none;
-  padding: 6px 8px;
-  font-size: 12px;
-
-  &:hover, &:focus:active {
-    background-color: #eee;
-    color: inherit;
-    border-color: #d2d2d2;
-  }
-}
-
-div.dt-button-info {
-  z-index: 100;
-}
-
-@media (max-width: 768px) {
-  .html5buttons {
-    float: none;
-    margin-top: 10px;
-  }
-
-  .dataTables_length {
-    float: none;
-  }
-}
-
-/* CIRCLE */
-
-.img-circle {
-  border-radius: 50%;
-	width: 80px;
-	height: 80px;
-}
-
-.btn-circle {
-  width: 30px;
-  height: 30px;
-  padding: 6px 0;
-  border-radius: 15px;
-  text-align: center;
-  font-size: 12px;
-  line-height: 1.428571429;
-}
-
-.btn-circle.btn-lg {
-  background-color:blue;
-  width: 50px;
-  height: 50px;
-  padding: 10px 16px;
-  border-radius: 25px;
-  font-size: 18px;
-  line-height: 1.33;
-}
-
-.btn-circle.btn-xl {
-  width: 70px;
-  height: 70px;
-  padding: 10px 16px;
-  border-radius: 35px;
-  font-size: 24px;
-  line-height: 1.33;
-}
-
-.show-grid [class^="col-"] {
-  padding-top: 10px;
-  padding-bottom: 10px;
-  border: 1px solid #ddd;
-  background-color: #eee !important;
-}
-
-.show-grid {
-  margin: 15px 0;
-}
-
-/* ANIMATION */
-
-.css-animation-box h1 {
-  font-size: 44px;
-}
-
-.animation-efect-links a {
-  padding: 4px 6px;
-  font-size: 12px;
-}
-
-#animation_box {
-  background-color: #f9f8f8;
-  border-radius: 16px;
-  width: 80%;
-  margin: 0 auto;
-  padding-top: 80px;
-}
-
-.animation-text-box {
-  position: absolute;
-  margin-top: 40px;
-  left: 50%;
-  margin-left: -100px;
-  width: 200px;
-}
-
-.animation-text-info {
-  position: absolute;
-  margin-top: -60px;
-  left: 50%;
-  margin-left: -100px;
-  width: 200px;
-  font-size: 10px;
-}
-
-.animation-text-box h2 {
-  font-size: 54px;
-  font-weight: 600;
-  margin-bottom: 5px;
-}
-
-.animation-text-box p {
-  font-size: 12px;
-  text-transform: uppercase;
-}
-
-
-/* WIDGETS */
-
-.widget {
-  border-radius: 5px;
-  padding: 15px 20px;
-  margin-bottom: 10px;
-  margin-top: 10px;
-}
-
-.widget.style1 h2 {
-  font-size: 30px;
-}
-
-.widget h2, .widget h3 {
-  margin-top: 5px;
-  margin-bottom: 0;
-}
-
-.widget-text-box {
-  padding: 20px;
-  border: 1px solid @border-color;
-  background: #ffffff;
-}
-
-.widget-head-color-box {
-  border-radius: 5px 5px 0 0;
-  margin-top: 10px;
-
-}
-
-.widget .flot-chart {
-  height: 100px;
-}
-
-.vertical-align div {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.vertical-align h2, .vertical-align h3 {
-  margin: 0;
-}
-
-.todo-list {
-  list-style: none outside none;
-  margin: 0;
-  padding: 0;
-  font-size: 14px;
-}
-
-.todo-list.small-list {
-  font-size: 12px;
-}
-
-.todo-list.small-list > li {
-  background: @gray;
-  border-left: none;
-  border-right: none;
-  border-radius: 4px;
-  color: inherit;
-  margin-bottom: 2px;
-  padding: 6px 6px 6px 12px;
-}
-
-.todo-list.small-list .btn-xs, .todo-list.small-list .btn-group-xs > .btn {
-  border-radius: 5px;
-  font-size: 10px;
-  line-height: 1.5;
-  padding: 1px 2px 1px 5px;
-}
-
-.todo-list > li {
-  background: @gray;
-  border-left: 6px solid @border-color;
-  border-right: 6px solid @border-color;
-  border-radius: 4px;
-  color: inherit;
-  margin-bottom: 2px;
-  padding: 10px;
-}
-
-.todo-list .handle {
-  cursor: move;
-  display: inline-block;
-  font-size: 16px;
-  margin: 0 5px;
-}
-
-.todo-list > li .label {
-  font-size: 9px;
-  margin-left: 10px;
-}
-
-.check-link {
-  font-size: 16px;
-}
-
-.todo-completed {
-  text-decoration: line-through;
-}
-
-.geo-statistic h1 {
-  font-size: 36px;
-  margin-bottom: 0;
-}
-
-.glyphicon.fa {
-  font-family: "FontAwesome";
-}
-
-/* INPUTS */
-.inline {
-  display: inline-block !important;
-}
-
-.input-s-sm {
-  width: 120px;
-}
-
-.input-s {
-  width: 200px;
-}
-
-.input-s-lg {
-  width: 250px;
-}
-
-.i-checks {
-  padding-left: 0;
-}
-
-.form-control, .single-line {
-  background-color: #FFFFFF;
-  background-image: none;
-  border: 1px solid #e5e6e7;
-  border-radius: 1px;
-  color: inherit;
-  display: block;
-  padding: 6px 12px;
-  transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
-  width: 100%;
-  font-size: 14px
-}
-
-.form-control:focus, .single-line:focus {
-  border-color: @navy !important;
-}
-
-.has-success .form-control {
-  border-color: @navy;
-}
-
-.has-warning .form-control {
-  border-color: @yellow;
-}
-
-.has-error .form-control {
-  border-color: @red;
-}
-
-.has-success .control-label {
-  color: @navy;
-}
-
-.has-warning .control-label {
-  color: @yellow;
-}
-
-.has-error .control-label {
-  color: @red;
-}
-
-.input-group-addon {
-  background-color: #fff;
-  border: 1px solid #E5E6E7;
-  border-radius: 1px;
-  color: inherit;
-  font-size: 14px;
-  font-weight: 400;
-  line-height: 1;
-  padding: 6px 12px;
-  text-align: center;
-}
-
-.spinner-buttons.input-group-btn .btn-xs {
-  line-height: 1.13;
-}
-
-.spinner-buttons.input-group-btn {
-  width: 20%;
-}
-
-.noUi-connect {
-  background: none repeat scroll 0 0 @navy;
-  box-shadow: none;
-}
-
-.slider_red .noUi-connect {
-  background: none repeat scroll 0 0 @red;
-  box-shadow: none;
-}
-
-/* UI Sortable */
-
-.ui-sortable .ibox-title {
-  cursor: move;
-}
-
-.ui-sortable-placeholder {
-  border: 1px dashed #cecece !important;
-  visibility: visible !important;
-  background: #e7eaec;
-}
-
-.ibox.ui-sortable-placeholder {
-  margin: 0 0 23px !important;
-}
-
-/* SWITCHES */
-.onoffswitch {
-  position: relative;
-  width: 54px;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-}
-
-.onoffswitch-checkbox {
-  display: none;
-}
-
-.onoffswitch-label {
-  display: block;
-  overflow: hidden;
-  cursor: pointer;
-  border: 2px solid #1AB394;
-  border-radius: 3px;
-}
-
-.onoffswitch-inner {
-  display: block;
-  width: 200%;
-  margin-left: -100%;
-  -moz-transition: margin 0.3s ease-in 0s;
-  -webkit-transition: margin 0.3s ease-in 0s;
-  -o-transition: margin 0.3s ease-in 0s;
-  transition: margin 0.3s ease-in 0s;
-}
-
-.onoffswitch-inner:before, .onoffswitch-inner:after {
-  display: block;
-  float: left;
-  width: 50%;
-  height: 16px;
-  padding: 0;
-  line-height: 16px;
-  font-size: 10px;
-  color: white;
-  font-family: Trebuchet, Arial, sans-serif;
-  font-weight: bold;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.onoffswitch-inner:before {
-  content: "ON";
-  padding-left: 7px;
-  background-color: #1AB394;
-  color: #FFFFFF;
-}
-
-.onoffswitch-inner:after {
-  content: "OFF";
-  padding-right: 7px;
-  background-color: #FFFFFF;
-  color: #919191;
-  text-align: right;
-}
-
-.onoffswitch-switch {
-  display: block;
-  width: 18px;
-  margin: 0;
-  background: #FFFFFF;
-  border: 2px solid #1AB394;
-  border-radius: 3px;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  right: 36px;
-  -moz-transition: all 0.3s ease-in 0s;
-  -webkit-transition: all 0.3s ease-in 0s;
-  -o-transition: all 0.3s ease-in 0s;
-  transition: all 0.3s ease-in 0s;
-}
-
-.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
-  margin-left: 0;
-}
-
-.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
-  right: 0;
-}
-
-/* jqGrid */
-
-.ui-jqgrid {
-  -moz-box-sizing: content-box;
-}
-
-.ui-jqgrid-btable {
-  border-collapse: separate;
-}
-
-.ui-jqgrid-htable {
-  border-collapse: separate;
-}
-
-.ui-jqgrid-titlebar {
-  height: 40px;
-  line-height: 15px;
-  color: #676a6c;
-  background-color: #F9F9F9;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.ui-jqgrid .ui-jqgrid-title {
-  float: left;
-  margin: 1.1em 1em 0.2em;
-}
-
-.ui-jqgrid .ui-jqgrid-titlebar {
-  position: relative;
-  border-left: 0 solid;
-  border-right: 0 solid;
-  border-top: 0 solid;
-}
-
-.ui-widget-header {
-  background: none;
-  background-image: none;
-  background-color: #f5f5f6;
-  text-transform: uppercase;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.ui-jqgrid tr.ui-row-ltr td {
-  border-right-color: inherit;
-  border-right-style: solid;
-  border-right-width: 1px;
-  text-align: left;
-  border-color: #DDDDDD;
-  background-color: inherit;
-}
-
-.ui-search-toolbar input[type="text"] {
-  font-size: 12px;
-  height: 15px;
-  border: 1px solid #CCCCCC;
-  border-radius: 0;
-}
-
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default {
-  background: #F9F9F9;
-  border: 1px solid #DDDDDD;
-  line-height: 15px;
-  font-weight: bold;
-  color: #676a6c;
-  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.ui-widget-content {
-  box-sizing: content-box;
-}
-
-.ui-icon-triangle-1-n {
-  background-position: 1px -16px;
-}
-
-.ui-jqgrid tr.ui-search-toolbar th {
-  border-top-width: 0 !important;
-  border-top-color: inherit !important;
-  border-top-style: ridge !important
-}
-
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus {
-  background: #f5f5f5;
-  border-collapse: separate;
-}
-
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {
-  background: #f2fbff;
-}
-
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active {
-  border: 1px solid #dddddd;
-  background: #ffffff;
-  font-weight: normal;
-  color: #212121;
-}
-
-.ui-jqgrid .ui-pg-input {
-  font-size: inherit;
-  width: 50px;
-  border: 1px solid #CCCCCC;
-  height: 15px;
-}
-
-.ui-jqgrid .ui-pg-selbox {
-  display: block;
-  font-size: 1em;
-  height: 25px;
-  line-height: 18px;
-  margin: 0;
-  width: auto;
-}
-
-.ui-jqgrid .ui-pager-control {
-  position: relative;
-}
-
-.ui-jqgrid .ui-jqgrid-pager {
-  height: 32px;
-  position: relative;
-}
-
-.ui-pg-table .navtable .ui-corner-all {
-  border-radius: 0;
-}
-
-.ui-jqgrid .ui-pg-button:hover {
-  padding: 1px;
-  border: 0;
-}
-
-.ui-jqgrid .loading {
-  position: absolute;
-  top: 45%;
-  left: 45%;
-  width: auto;
-  height: auto;
-  z-index: 101;
-  padding: 6px;
-  margin: 5px;
-  text-align: center;
-  font-weight: bold;
-  display: none;
-  border-width: 2px !important;
-  font-size: 11px;
-}
-
-.ui-jqgrid .form-control {
-  height: 10px;
-  width: auto;
-  display: inline;
-  padding: 10px 12px;
-}
-
-.ui-jqgrid-pager {
-  height: 32px;
-}
-
-.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl {
-  border-top-left-radius: 0;
-}
-
-.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {
-  border-top-right-radius: 0;
-}
-
-.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl {
-  border-bottom-left-radius: 0;
-}
-
-.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br {
-  border-bottom-right-radius: 0;
-}
-
-.ui-widget-content {
-  border: 1px solid #ddd;
-}
-
-.ui-jqgrid .ui-jqgrid-titlebar {
-  padding: 0;
-}
-
-.ui-jqgrid .ui-jqgrid-titlebar {
-  border-bottom: 1px solid #ddd;
-}
-
-.ui-jqgrid tr.jqgrow td {
-  padding: 6px;
-}
-
-.ui-jqdialog .ui-jqdialog-titlebar {
-  padding: 10px 10px;
-
-}
-
-.ui-jqdialog .ui-jqdialog-title {
-  float: none !important;
-}
-
-.ui-jqdialog > .ui-resizable-se {
-  position: absolute;
-}
-
-/* Nestable list */
-
-.dd {
-  position: relative;
-  display: block;
-  margin: 0;
-  padding: 0;
-  list-style: none;
-  font-size: 13px;
-  line-height: 20px;
-}
-
-.dd-list {
-  display: block;
-  position: relative;
-  margin: 0;
-  padding: 0;
-  list-style: none;
-}
-
-.dd-list .dd-list {
-  padding-left: 30px;
-}
-
-.dd-collapsed .dd-list {
-  display: none;
-}
-
-.dd-item,
-.dd-empty,
-.dd-placeholder {
-  display: block;
-  position: relative;
-  margin: 0;
-  padding: 0;
-  min-height: 20px;
-  font-size: 13px;
-  line-height: 20px;
-}
-
-.dd-handle {
-  display: block;
-  margin: 5px 0;
-  padding: 5px 10px;
-  color: #333;
-  text-decoration: none;
-  border: 1px solid #e7eaec;
-  background: #f5f5f5;
-  -webkit-border-radius: 3px;
-  border-radius: 3px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-.dd-handle span {
-  font-weight: bold;
-}
-
-.dd-handle:hover {
-  background: #f0f0f0;
-  cursor: pointer;
-  font-weight: bold;
-}
-
-.dd-item > button {
-  display: block;
-  position: relative;
-  cursor: pointer;
-  float: left;
-  width: 25px;
-  height: 20px;
-  margin: 5px 0;
-  padding: 0;
-  text-indent: 100%;
-  white-space: nowrap;
-  overflow: hidden;
-  border: 0;
-  background: transparent;
-  font-size: 12px;
-  line-height: 1;
-  text-align: center;
-  font-weight: bold;
-}
-
-.dd-item > button:before {
-  content: '+';
-  display: block;
-  position: absolute;
-  width: 100%;
-  text-align: center;
-  text-indent: 0;
-}
-
-.dd-item > button[data-action="collapse"]:before {
-  content: '-';
-}
-
-#nestable2 .dd-item > button {
-  font-family: FontAwesome;
-  height: 34px;
-  width: 33px;
-  color: #c1c1c1;
-
-}
-
-#nestable2 .dd-item > button:before {
-  content: "\f067";
-}
-
-#nestable2 .dd-item > button[data-action="collapse"]:before {
-  content: "\f068";
-}
-
-.dd-placeholder,
-.dd-empty {
-  margin: 5px 0;
-  padding: 0;
-  min-height: 30px;
-  background: #f2fbff;
-  border: 1px dashed #b6bcbf;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-.dd-empty {
-  border: 1px dashed #bbb;
-  min-height: 100px;
-  background-color: #e5e5e5;
-  background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
-  background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
-  background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff);
-  background-size: 60px 60px;
-  background-position: 0 0, 30px 30px;
-}
-
-.dd-dragel {
-  position: absolute;
-  z-index: 9999;
-  pointer-events: none;
-}
-
-.dd-dragel > .dd-item .dd-handle {
-  margin-top: 0;
-}
-
-.dd-dragel .dd-handle {
-  -webkit-box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
-  box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, .1);
-}
-
-/**
-* Nestable Extras
-*/
-.nestable-lists {
-  display: block;
-  clear: both;
-  padding: 30px 0;
-  width: 100%;
-  border: 0;
-  border-top: 2px solid #ddd;
-  border-bottom: 2px solid #ddd;
-}
-
-#nestable-menu {
-  padding: 0;
-  margin: 10px 0 20px 0;
-}
-
-#nestable-output,
-#nestable2-output {
-  width: 100%;
-  font-size: 0.75em;
-  line-height: 1.333333em;
-  font-family: open sans, lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
-  padding: 5px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-#nestable2 .dd-handle {
-  color: inherit;
-  border: 1px dashed #e7eaec;
-  background: #f3f3f4;
-  padding: 10px;
-}
-
-#nestable2 .dd-handle:hover {
-  /*background: #bbb;*/
-}
-
-#nestable2 span.label {
-  margin-right: 10px;
-}
-
-#nestable-output,
-#nestable2-output {
-  font-size: 12px;
-  padding: 25px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-}
-
-/* CodeMirror */
-.CodeMirror {
-  border: 1px solid #eee;
-  height: auto;
-}
-
-.CodeMirror-scroll {
-  overflow-y: hidden;
-  overflow-x: auto;
-}
-
-/* Google Maps */
-.google-map {
-  height: 300px;
-}
-
-/* Validation */
-label.error {
-  color: #cc5965;
-  display: inline-block;
-  margin-left: 5px;
-}
-
-.form-control.error {
-  border: 1px dotted #cc5965;
-}
-
-/* ngGrid */
-.gridStyle {
-  border: 1px solid rgb(212, 212, 212);
-  width: 100%;
-  height: 400px
-}
-
-.gridStyle2 {
-  border: 1px solid rgb(212, 212, 212);
-  width: 500px;
-  height: 300px;
-}
-
-.ngH eaderCell {
-  border-right: none;
-  border-bottom: 1px solid #e7eaec;
-}
-
-.ngCell {
-  border-right: none;
-}
-
-.ngTopPanel {
-  background: #F5F5F6;
-}
-
-.ngRow.even {
-  background: #f9f9f9;
-}
-
-.ngRow.selected {
-  background: #EBF2F1;
-}
-
-.ngRow {
-  border-bottom: 1px solid #e7eaec;
-}
-
-.ngCell {
-  background-color: transparent;
-}
-
-.ngHeaderCell {
-  border-right: none;
-}
-
-/* Toastr custom style */
-
-#toast-container > .toast {
-  background-image: none !important;
-}
-
-#toast-container > .toast:before {
-  position: fixed;
-  font-family: FontAwesome;
-  font-size: 24px;
-  line-height: 24px;
-  float: left;
-  color: #FFF;
-  padding-right: 0.5em;
-  margin: auto 0.5em auto -1.5em;
-}
-
-#toast-container > .toast-warning:before {
-  content: "\f0e7";
-}
-
-#toast-container > .toast-error:before {
-  content: "\f071";
-}
-
-#toast-container > .toast-info:before {
-  content: "\f005";
-}
-
-#toast-container > .toast-success:before {
-  content: "\f00C";
-}
-
-#toast-container > div {
-  -moz-box-shadow: 0 0 3px #999;
-  -webkit-box-shadow: 0 0 3px #999;
-  box-shadow: 0 0 3px #999;
-  opacity: .9;
-  -ms-filter: alpha(Opacity=90);
-  filter: alpha(opacity=90)
-}
-
-#toast-container > :hover {
-  -moz-box-shadow: 0 0 4px #999;
-  -webkit-box-shadow: 0 0 4px #999;
-  box-shadow: 0 0 4px #999;
-  opacity: 1;
-  -ms-filter: alpha(Opacity=100);
-  filter: alpha(opacity=100);
-  cursor: pointer
-}
-
-.toast {
-  background-color: @navy
-}
-
-.toast-success {
-  background-color: @navy
-}
-
-.toast-error {
-  background-color: @red
-}
-
-.toast-info {
-  background-color: @lazur
-}
-
-.toast-warning {
-  background-color: @yellow
-}
-
-.toast-top-full-width {
-  margin-top: 20px;
-}
-
-.toast-bottom-full-width {
-  margin-bottom: 20px;
-}
-
-/* Notifie */
-.cg-notify-message.inspinia-notify {
-  background: #fff;
-  padding: 0;
-  box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
-  -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
-  -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.2);
-  border: none;
-  margin-top: 30px;
-  color: inherit;
-}
-
-.inspinia-notify.alert-warning {
-  border-left: 6px solid @yellow;
-}
-
-.inspinia-notify.alert-success {
-  border-left: 6px solid @blue;
-}
-
-.inspinia-notify.alert-danger {
-  border-left: 6px solid @red;
-}
-
-.inspinia-notify.alert-info {
-  border-left: 6px solid @navy;
-}
-
-/* Image cropper style */
-.img-container, .img-preview {
-  overflow: hidden;
-  text-align: center;
-  width: 100%;
-}
-
-.img-preview-sm {
-  height: 130px;
-  width: 200px;
-}
-
-/* Forum styles  */
-.forum-post-container .media {
-  margin: 10px 10px 10px 10px;
-  padding: 20px 10px 20px 10px;
-  border-bottom: 1px solid #f1f1f1;
-}
-
-.forum-avatar {
-  float: left;
-  margin-right: 20px;
-  text-align: center;
-  width: 110px;
-}
-
-.forum-avatar .img-circle {
-  height: 48px;
-  width: 48px;
-}
-
-.author-info {
-  color: #676a6c;
-  font-size: 11px;
-  margin-top: 5px;
-  text-align: center;
-}
-
-.forum-post-info {
-  padding: 9px 12px 6px 12px;
-  background: #f9f9f9;
-  border: 1px solid #f1f1f1;
-}
-
-.media-body > .media {
-  background: #f9f9f9;
-  border-radius: 3px;
-  border: 1px solid #f1f1f1;
-}
-
-.forum-post-container .media-body .photos {
-  margin: 10px 0;
-}
-
-.forum-photo {
-  max-width: 140px;
-  border-radius: 3px;
-
-}
-
-.media-body > .media .forum-avatar {
-  width: 70px;
-  margin-right: 10px;
-}
-
-.media-body > .media .forum-avatar .img-circle {
-  height: 38px;
-  width: 38px;
-}
-
-.mid-icon {
-  font-size: 66px;
-}
-
-.forum-item {
-  margin: 10px 0;
-  padding: 10px 0 20px;
-  border-bottom: 1px solid #f1f1f1;
-}
-
-.views-number {
-  font-size: 24px;
-  line-height: 18px;
-  font-weight: 400;
-}
-
-.forum-container, .forum-post-container {
-  padding: 30px !important;
-}
-
-.forum-item small {
-  color: #999;
-}
-
-.forum-item .forum-sub-title {
-  color: #999;
-  margin-left: 50px;
-}
-
-.forum-title {
-  margin: 15px 0 15px 0;
-}
-
-.forum-info {
-  text-align: center;
-}
-
-.forum-desc {
-  color: #999;
-}
-
-.forum-icon {
-  float: left;
-  width: 30px;
-  margin-right: 20px;
-  text-align: center;
-}
-
-a.forum-item-title {
-  color: inherit;
-  display: block;
-  font-size: 18px;
-  font-weight: 600;
-}
-
-a.forum-item-title:hover {
-  color: inherit;
-}
-
-.forum-icon .fa {
-
-  font-size: 30px;
-  margin-top: 8px;
-  color: #9b9b9b;
-}
-
-.forum-item.active .fa {
-  color: @navy;
-}
-
-.forum-item.active a.forum-item-title {
-  color: @navy;
-}
-
-@media (max-width: 992px) {
-
-  .forum-info {
-    margin: 15px 0 10px 0;
-
-    /* Comment this is you want to show forum info in small devices */
-    display: none;
-  }
-
-  .forum-desc {
-    float: none !important;
-  }
-
-}
-
-/* New Timeline style */
-
-.vertical-container {
-  /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */
-  width: 90%;
-  max-width: 1170px;
-  margin: 0 auto;
-}
-
-.vertical-container::after {
-  /* clearfix */
-  content: '';
-  display: table;
-  clear: both;
-}
-
-#vertical-timeline {
-  position: relative;
-  padding: 0;
-  margin-top: 2em;
-  margin-bottom: 2em;
-}
-
-#vertical-timeline::before {
-  content: '';
-  position: absolute;
-  top: 0;
-  left: 18px;
-  height: 100%;
-  width: 4px;
-  background: #f1f1f1;
-}
-
-.vertical-timeline-content .btn {
-  float: right;
-}
-
-#vertical-timeline.light-timeline:before {
-  background: #e7eaec;
-}
-
-.dark-timeline .vertical-timeline-content:before {
-  border-color: transparent #f5f5f5 transparent transparent;
-}
-
-.dark-timeline.center-orientation .vertical-timeline-content:before {
-  border-color: transparent transparent transparent #f5f5f5;
-}
-
-.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,
-.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {
-  border-color: transparent #f5f5f5 transparent transparent;
-}
-
-.dark-timeline .vertical-timeline-content,
-.dark-timeline.center-orientation .vertical-timeline-content {
-  background: #f5f5f5;
-}
-
-@media only screen and (min-width: 1170px) {
-  #vertical-timeline.center-orientation {
-    margin-top: 3em;
-    margin-bottom: 3em;
-  }
-
-  #vertical-timeline.center-orientation:before {
-    left: 50%;
-    margin-left: -2px;
-  }
-}
-
-@media only screen and (max-width: 1170px) {
-  .center-orientation.dark-timeline .vertical-timeline-content:before {
-    border-color: transparent #f5f5f5 transparent transparent;
-  }
-}
-
-.vertical-timeline-block {
-  position: relative;
-  margin: 2em 0;
-}
-
-.vertical-timeline-block:after {
-  content: "";
-  display: table;
-  clear: both;
-}
-
-.vertical-timeline-block:first-child {
-  margin-top: 0;
-}
-
-.vertical-timeline-block:last-child {
-  margin-bottom: 0;
-}
-
-@media only screen and (min-width: 1170px) {
-  .center-orientation .vertical-timeline-block {
-    margin: 4em 0;
-  }
-
-  .center-orientation .vertical-timeline-block:first-child {
-    margin-top: 0;
-  }
-
-  .center-orientation .vertical-timeline-block:last-child {
-    margin-bottom: 0;
-  }
-}
-
-.vertical-timeline-icon {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 40px;
-  height: 40px;
-  border-radius: 50%;
-  font-size: 16px;
-  border: 3px solid #f1f1f1;
-  text-align: center;
-}
-
-.vertical-timeline-icon i {
-  display: block;
-  width: 24px;
-  height: 24px;
-  position: relative;
-  left: 50%;
-  top: 50%;
-  margin-left: -12px;
-  margin-top: -9px;
-}
-
-@media only screen and (min-width: 1170px) {
-  .center-orientation .vertical-timeline-icon {
-    width: 50px;
-    height: 50px;
-    left: 50%;
-    margin-left: -25px;
-    -webkit-transform: translateZ(0);
-    -webkit-backface-visibility: hidden;
-    font-size: 19px;
-  }
-
-  .center-orientation .vertical-timeline-icon i {
-    margin-left: -12px;
-    margin-top: -10px;
-  }
-
-  .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {
-    visibility: hidden;
-  }
-}
-
-.vertical-timeline-content {
-  position: relative;
-  margin-left: 60px;
-  background: white;
-  border-radius: 0.25em;
-  padding: 1em;
-}
-
-.vertical-timeline-content:after {
-  content: "";
-  display: table;
-  clear: both;
-}
-
-.vertical-timeline-content h2 {
-  font-weight: 400;
-  margin-top: 4px;
-}
-
-.vertical-timeline-content p {
-  margin: 1em 0;
-  line-height: 1.6;
-}
-
-.vertical-timeline-content .vertical-date {
-  float: left;
-  font-weight: 500;
-}
-
-.vertical-date small {
-  color: @navy;
-  font-weight: 400;
-}
-
-.vertical-timeline-content::before {
-  content: '';
-  position: absolute;
-  top: 16px;
-  right: 100%;
-  height: 0;
-  width: 0;
-  border: 7px solid transparent;
-  border-right: 7px solid white;
-}
-
-@media only screen and (min-width: 768px) {
-  .vertical-timeline-content h2 {
-    font-size: 18px;
-  }
-
-  .vertical-timeline-content p {
-    font-size: 13px;
-  }
-
-}
-
-@media only screen and (min-width: 1170px) {
-  .center-orientation .vertical-timeline-content {
-    margin-left: 0;
-    padding: 1.6em;
-    width: 45%;
-  }
-
-  .center-orientation .vertical-timeline-content::before {
-    top: 24px;
-    left: 100%;
-    border-color: transparent;
-    border-left-color: white;
-  }
-
-  .center-orientation .vertical-timeline-content .btn {
-    float: left;
-  }
-
-  .center-orientation .vertical-timeline-content .vertical-date {
-    position: absolute;
-    width: 100%;
-    left: 122%;
-    top: 2px;
-    font-size: 14px;
-  }
-
-  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {
-    float: right;
-  }
-
-  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {
-    top: 24px;
-    left: auto;
-    right: 100%;
-    border-color: transparent;
-    border-right-color: white;
-  }
-
-  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {
-    float: right;
-  }
-
-  .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {
-    left: auto;
-    right: 122%;
-    text-align: right;
-  }
-
-  .center-orientation .cssanimations .vertical-timeline-content.is-hidden {
-    visibility: hidden;
-  }
-}
-
-/* Tabs */
-
-.tabs-container {
-
-  .panel-body {
-    background: #fff;
-    border: 1px solid @border-color;
-    border-radius: 2px;
-    padding: 20px;
-    position: relative;
-  }
-
-  .nav-tabs > li.active > a,
-  .nav-tabs > li.active > a:hover,
-  .nav-tabs > li.active > a:focus {
-    border: 1px solid @border-color;
-    border-bottom-color: transparent;
-    background-color: #fff;
-  }
-
-  .nav-tabs > li {
-    float: left;
-    margin-bottom: -1px;
-  }
-
-  .tab-pane .panel-body {
-    border-top: none;
-  }
-
-  .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
-    border: 1px solid @border-color;
-    border-bottom-color: transparent;
-  }
-
-  .nav-tabs {
-    border-bottom: 1px solid @border-color;
-  }
-
-  .tab-pane .panel-body {
-    border-top: none;
-  }
-
-  .tabs-left .tab-pane .panel-body, .tabs-right .tab-pane .panel-body {
-    border-top: 1px solid @border-color;
-  }
-
-  .nav-tabs > li a:hover {
-    background: transparent;
-    border-color: transparent;
-  }
-
-  .tabs-below > .nav-tabs,
-  .tabs-right > .nav-tabs,
-  .tabs-left > .nav-tabs {
-    border-bottom: 0;
-  }
-
-  .tabs-left .panel-body {
-    position: static;
-  }
-
-  .tabs-left > .nav-tabs, .tabs-right > .nav-tabs {
-    width: 20%;
-  }
-
-  .tabs-left .panel-body {
-    width: 80%;
-    margin-left: 20%;
-  }
-
-  .tabs-right .panel-body {
-    width: 80%;
-    margin-right: 20%;
-  }
-
-  .tab-content > .tab-pane,
-  .pill-content > .pill-pane {
-    display: none;
-  }
-
-  .tab-content > .active,
-  .pill-content > .active {
-    display: block;
-  }
-
-  .tabs-below > .nav-tabs {
-    border-top: 1px solid @border-color;
-  }
-
-  .tabs-below > .nav-tabs > li {
-    margin-top: -1px;
-    margin-bottom: 0;
-  }
-
-  .tabs-below > .nav-tabs > li > a {
-    -webkit-border-radius: 0 0 4px 4px;
-    -moz-border-radius: 0 0 4px 4px;
-    border-radius: 0 0 4px 4px;
-  }
-
-  .tabs-below > .nav-tabs > li > a:hover,
-  .tabs-below > .nav-tabs > li > a:focus {
-    border-top-color: @border-color;
-    border-bottom-color: transparent;
-  }
-
-  .tabs-left > .nav-tabs > li,
-  .tabs-right > .nav-tabs > li {
-    float: none;
-  }
-
-  .tabs-left > .nav-tabs > li > a,
-  .tabs-right > .nav-tabs > li > a {
-    min-width: 74px;
-    margin-right: 0;
-    margin-bottom: 3px;
-  }
-
-  .tabs-left > .nav-tabs {
-    float: left;
-    margin-right: 19px;
-  }
-
-  .tabs-left > .nav-tabs > li > a {
-    margin-right: -1px;
-    -webkit-border-radius: 4px 0 0 4px;
-    -moz-border-radius: 4px 0 0 4px;
-    border-radius: 4px 0 0 4px;
-  }
-
-  .tabs-left > .nav-tabs .active > a,
-  .tabs-left > .nav-tabs .active > a:hover,
-  .tabs-left > .nav-tabs .active > a:focus {
-    border-color: @border-color transparent @border-color @border-color;
-    *border-right-color: #ffffff;
-  }
-
-  .tabs-right > .nav-tabs {
-    float: right;
-    margin-left: 19px;
-  }
-
-  .tabs-right > .nav-tabs > li > a {
-    margin-left: -1px;
-    -webkit-border-radius: 0 4px 4px 0;
-    -moz-border-radius: 0 4px 4px 0;
-    border-radius: 0 4px 4px 0;
-  }
-
-  .tabs-right > .nav-tabs .active > a,
-  .tabs-right > .nav-tabs .active > a:hover,
-  .tabs-right > .nav-tabs .active > a:focus {
-    border-color: @border-color @border-color @border-color transparent;
-    *border-left-color: #ffffff;
-    z-index: 1;
-  }
-
-}
-
-@media (max-width: 767px) {
-  .tabs-container .nav-tabs > li {
-    float: none !important;
-  }
-
-  .tabs-container .nav-tabs > li.active > a {
-    border-bottom: 1px solid #e7eaec !important;
-    margin: 0;
-  }
-}
-
-/* jsvectormap */
-.jvectormap-container {
-  width: 100%;
-  height: 100%;
-  position: relative;
-  overflow: hidden;
-}
-
-.jvectormap-tip {
-  position: absolute;
-  display: none;
-  border: solid 1px #CDCDCD;
-  border-radius: 3px;
-  background: #292929;
-  color: white;
-  font-family: sans-serif, Verdana;
-  font-size: smaller;
-  padding: 5px;
-}
-
-.jvectormap-zoomin, .jvectormap-zoomout, .jvectormap-goback {
-  position: absolute;
-  left: 10px;
-  border-radius: 3px;
-  background: @navy;
-  padding: 3px;
-  color: white;
-  cursor: pointer;
-  line-height: 10px;
-  text-align: center;
-  box-sizing: content-box;
-}
-
-.jvectormap-zoomin, .jvectormap-zoomout {
-  width: 10px;
-  height: 10px;
-}
-
-.jvectormap-zoomin {
-  top: 10px;
-}
-
-.jvectormap-zoomout {
-  top: 30px;
-}
-
-.jvectormap-goback {
-  bottom: 10px;
-  z-index: 1000;
-  padding: 6px;
-}
-
-.jvectormap-spinner {
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  background: center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==);
-}
-
-.jvectormap-legend-title {
-  font-weight: bold;
-  font-size: 14px;
-  text-align: center;
-}
-
-.jvectormap-legend-cnt {
-  position: absolute;
-}
-
-.jvectormap-legend-cnt-h {
-  bottom: 0;
-  right: 0;
-}
-
-.jvectormap-legend-cnt-v {
-  top: 0;
-  right: 0;
-}
-
-.jvectormap-legend {
-  background: black;
-  color: white;
-  border-radius: 3px;
-}
-
-.jvectormap-legend-cnt-h .jvectormap-legend {
-  float: left;
-  margin: 0 10px 10px 0;
-  padding: 3px 3px 1px 3px;
-}
-
-.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick {
-  float: left;
-}
-
-.jvectormap-legend-cnt-v .jvectormap-legend {
-  margin: 10px 10px 0 0;
-  padding: 3px;
-}
-
-.jvectormap-legend-cnt-h .jvectormap-legend-tick {
-  width: 40px;
-}
-
-.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample {
-  height: 15px;
-}
-
-.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample {
-  height: 20px;
-  width: 20px;
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.jvectormap-legend-tick-text {
-  font-size: 12px;
-}
-
-.jvectormap-legend-cnt-h .jvectormap-legend-tick-text {
-  text-align: center;
-}
-
-.jvectormap-legend-cnt-v .jvectormap-legend-tick-text {
-  display: inline-block;
-  vertical-align: middle;
-  line-height: 20px;
-  padding-left: 3px;
-}
-
-/*Slick Carousel */
-
-.slick-prev:before,
-.slick-next:before {
-  color: @navy !important;
-}
-
-/* Payments */
-
-.payment-card {
-  background: #ffffff;
-  padding: 20px;
-  margin-bottom: 25px;
-  border: 1px solid @border-color;
-}
-
-.payment-icon-big {
-  font-size: 60px;
-  color: @light-gray;
-}
-
-.payments-method.panel-group .panel + .panel {
-  margin-top: -1px;
-}
-
-.payments-method .panel-heading {
-  padding: 15px;
-}
-
-.payments-method .panel {
-  border-radius: 0;
-}
-
-.payments-method .panel-heading h5 {
-  margin-bottom: 5px;
-}
-
-.payments-method .panel-heading i {
-  font-size: 26px;
-}
-
-/* Select2 custom styles */
-
-.select2-container--default .select2-selection--single,
-.select2-container--default .select2-selection--multiple {
-  border-color: @border-color;
-}
-
-/* Tour */
-
-.tour-tour .btn.btn-default {
-  background-color: #ffffff;
-  border: 1px solid #d2d2d2;
-  color: inherit;
-}
-
-.tour-step-backdrop {
-  z-index: 2101;
-}
-
-.tour-backdrop {
-  z-index: 2100;
-  opacity: .7;
-}
-
-.popover[class*=tour-] {
-  z-index: 2100;
-}
-
-#body.tour-open .animated {
-  animation-fill-mode: initial;
-}
-
-
-/* Resizable */
-
-.resizable-panels .ibox {
-  clear:none;
-  margin: 10px;
-  float: left;
-  overflow:hidden;
-  min-height: 150px;
-  min-width: 150px;
-}
-
-.resizable-panels .ibox .ibox-content {
-  height: calc(~"100% - 49px");
-}
-.ui-resizable-helper {
-  background: rgba(211,211,211,0.4)
-
-}
-
-/* Wizard step fix */
-.wizard > .content > .body {
-  position: relative
-}
-
-/* PDF js style */
-
-.pdf-toolbar {
-  max-width: 600px;
-  margin: 0 auto;
-}
-
-/* Dropzone */
-
-.dropzone {
-  min-height: 140px;
-  border: 1px dashed @navy;
-  background: white;
-  padding: 20px 20px;
-
-  .dz-message {
-    font-size: 16px;
-
-  }
-}
diff --git a/src/assets/css/inspinia/mixins.less b/src/assets/css/inspinia/mixins.less
deleted file mode 100644
index da0c9e8..0000000
--- a/src/assets/css/inspinia/mixins.less
+++ /dev/null
@@ -1,15 +0,0 @@
-.border-radius (@radius: 3px) {
-  -webkit-border-radius: @radius;
-  -moz-border-radius: @radius;
-  border-radius: @radius;
-
-  -moz-background-clip: padding;
-  -webkit-background-clip: padding-box;
-  background-clip: padding-box;
-}
-
-.opacity (@opacity: 0.5) {
-  -webkit-opacity: @opacity;
-  -moz-opacity: @opacity;
-  opacity: @opacity;
-}
\ No newline at end of file
diff --git a/src/assets/css/inspinia/pages.less b/src/assets/css/inspinia/pages.less
deleted file mode 100644
index 3bd2b3a..0000000
--- a/src/assets/css/inspinia/pages.less
+++ /dev/null
@@ -1,1358 +0,0 @@
-/* SEARCH PAGE */
-
-.search-form {
-  margin-top: 10px;
-}
-
-.search-result h3 {
-  margin-bottom: 0;
-  color: #1E0FBE;
-}
-
-.search-result .search-link {
-  color: #006621;
-}
-
-.search-result p {
-  font-size: 12px;
-  margin-top: 5px;
-}
-
-/* CONTACTS */
-
-.contact-box {
-  background-color: #ffffff;
-  border: 1px solid @border-color;
-  padding: 20px;
-  margin-bottom: 20px;
-}
-
-.contact-box > a {
-  color: inherit;
-}
-
-.contact-box.center-version {
-
-  border: 1px solid @border-color;
-  padding: 0;
-}
-
-.contact-box.center-version > a {
-  display: block;
-  background-color: #ffffff;
-  padding: 20px;
-  text-align: center;
-}
-
-.contact-box.center-version > a img {
-  width: 80px;
-  height: 80px;
-  margin-top: 10px;
-  margin-bottom: 10px;
-}
-
-.contact-box.center-version address {
-  margin-bottom: 0;
-}
-
-.contact-box .contact-box-footer {
-  text-align: center;
-  background-color: #ffffff;
-  border-top: 1px solid @border-color;
-  padding: 15px 20px;
-}
-
-/* INVOICE */
-
-.invoice-table tbody > tr > td:last-child, .invoice-table tbody > tr > td:nth-child(4), .invoice-table tbody > tr > td:nth-child(3), .invoice-table tbody > tr > td:nth-child(2) {
-  text-align: right;
-}
-
-.invoice-table thead > tr > th:last-child, .invoice-table thead > tr > th:nth-child(4), .invoice-table thead > tr > th:nth-child(3), .invoice-table thead > tr > th:nth-child(2) {
-  text-align: right;
-}
-
-.invoice-total > tbody > tr > td:first-child {
-  text-align: right;
-}
-
-.invoice-total > tbody > tr > td {
-  border: 0 none;
-}
-
-.invoice-total > tbody > tr > td:last-child {
-  border-bottom: 1px solid #DDDDDD;
-  text-align: right;
-  width: 15%;
-}
-
-/* ERROR & LOGIN & LOCKSCREEN*/
-
-.middle-box {
-  max-width: 400px;
-  z-index: 100;
-  margin: 0 auto;
-  padding-top: 40px;
-}
-
-.lockscreen.middle-box {
-  width: 200px;
-  padding-top: 110px;
-}
-
-.loginscreen.middle-box {
-  width: 300px;
-}
-
-.loginColumns {
-  max-width: 800px;
-  margin: 0 auto;
-  padding: 100px 20px 20px 20px;
-}
-
-.passwordBox {
-  max-width: 460px;
-  margin: 0 auto;
-  padding: 100px 20px 20px 20px;
-}
-
-.logo-name {
-  color: #e6e6e6;
-  font-size: 180px;
-  font-weight: 800;
-  letter-spacing: -10px;
-  margin-bottom: 0;
-}
-
-.middle-box h1 {
-  font-size: 170px;
-}
-
-.wrapper .middle-box {
-  margin-top: 140px;
-}
-
-.lock-word {
-  z-index: 10;
-  position: absolute;
-  top: 110px;
-  left: 50%;
-  margin-left: -470px;
-}
-
-.lock-word span {
-  font-size: 100px;
-  font-weight: 600;
-  color: #e9e9e9;
-  display: inline-block;
-}
-
-.lock-word .first-word {
-  margin-right: 160px;
-}
-
-/* DASBOARD */
-
-.dashboard-header {
-  border-top: 0;
-  padding: 20px 20px 20px 20px;
-}
-
-.dashboard-header h2 {
-  margin-top: 10px;
-  font-size: 26px;
-}
-
-.fist-item {
-  border-top: none !important;
-}
-
-.statistic-box {
-  margin-top: 40px;
-
-}
-
-.dashboard-header .list-group-item span.label {
-  margin-right: 10px;
-}
-
-.list-group.clear-list .list-group-item {
-  border-top: 1px solid @border-color;
-  border-bottom: 0;
-  border-right: 0;
-  border-left: 0;
-  padding: 10px 0;
-}
-
-ul.clear-list:first-child {
-  border-top: none !important;
-}
-
-/* Intimeline */
-
-.timeline-item .date i {
-  position: absolute;
-  top: 0;
-  right: 0;
-  padding: 5px;
-  width: 30px;
-  text-align: center;
-  border-top: 1px solid @border-color;
-  border-bottom: 1px solid @border-color;
-  border-left: 1px solid @border-color;
-  background: #f8f8f8;
-}
-
-.timeline-item .date {
-  text-align: right;
-  width: 110px;
-  position: relative;
-  padding-top: 30px;
-}
-
-.timeline-item .content {
-  border-left: 1px solid @border-color;
-  border-top: 1px solid @border-color;
-  padding-top: 10px;
-  min-height: 100px;
-}
-
-.timeline-item .content:hover {
-  background: #f6f6f6;
-}
-
-/* PIN BOARD */
-ul.notes li, ul.tag-list li {
-  list-style: none;
-}
-
-ul.notes li h4 {
-  margin-top: 20px;
-  font-size: 16px;
-}
-
-ul.notes li div {
-  text-decoration: none;
-  color: #000;
-  background: #ffc;
-  display: block;
-  height: 140px;
-  width: 140px;
-  padding: 1em;
-  position: relative;
-}
-
-ul.notes li div small {
-  position: absolute;
-  top: 5px;
-  right: 5px;
-  font-size: 10px
-}
-
-ul.notes li div a {
-  position: absolute;
-  right: 10px;
-  bottom: 10px;
-  color: inherit;
-}
-
-ul.notes li {
-  margin: 10px 40px 50px 0;
-  float: left;
-}
-
-ul.notes li div p {
-  font-size: 12px;
-}
-
-ul.notes li div {
-  text-decoration: none;
-  color: #000;
-  background: #ffc;
-  display: block;
-  height: 140px;
-  width: 140px;
-  padding: 1em;
-  /* Firefox */
-  -moz-box-shadow: 5px 5px 2px rgba(33, 33, 33, 1);
-  /* Safari+Chrome */
-  -webkit-box-shadow: 5px 5px 2px rgba(33, 33, 33, .7);
-  /* Opera */
-  box-shadow: 5px 5px 2px rgba(33, 33, 33, .7);
-}
-
-ul.notes li div {
-  -webkit-transform: rotate(-6deg);
-  -o-transform: rotate(-6deg);
-  -moz-transform: rotate(-6deg);
-}
-
-ul.notes li:nth-child(even) div {
-  -o-transform: rotate(4deg);
-  -webkit-transform: rotate(4deg);
-  -moz-transform: rotate(4deg);
-  position: relative;
-  top: 5px;
-}
-
-ul.notes li:nth-child(3n) div {
-  -o-transform: rotate(-3deg);
-  -webkit-transform: rotate(-3deg);
-  -moz-transform: rotate(-3deg);
-  position: relative;
-  top: -5px;
-}
-
-ul.notes li:nth-child(5n) div {
-  -o-transform: rotate(5deg);
-  -webkit-transform: rotate(5deg);
-  -moz-transform: rotate(5deg);
-  position: relative;
-  top: -10px;
-}
-
-ul.notes li div:hover, ul.notes li div:focus {
-
-  -webkit-transform: scale(1.1);
-  -moz-transform: scale(1.1);
-  -o-transform: scale(1.1);
-  position: relative;
-  z-index: 5;
-}
-
-ul.notes li div {
-  text-decoration: none;
-  color: #000;
-  background: #ffc;
-  display: block;
-  height: 210px;
-  width: 210px;
-  padding: 1em;
-  -moz-box-shadow: 5px 5px 7px rgba(33, 33, 33, 1);
-  -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);
-  box-shadow: 5px 5px 7px rgba(33, 33, 33, .7);
-  -moz-transition: -moz-transform .15s linear;
-  -o-transition: -o-transform .15s linear;
-  -webkit-transition: -webkit-transform .15s linear;
-}
-
-/* FILE MANAGER */
-
-.file-box {
-  float: left;
-  width: 220px;
-}
-
-.file-manager h5 {
-  text-transform: uppercase;
-}
-
-.file-manager {
-  list-style: none outside none;
-  margin: 0;
-  padding: 0;
-}
-
-.folder-list li a {
-  color: #666666;
-  display: block;
-  padding: 5px 0;
-}
-
-.folder-list li {
-  border-bottom: 1px solid @border-color;
-  display: block;
-}
-
-.folder-list li i {
-  margin-right: 8px;
-  color: #3d4d5d;
-}
-
-.category-list li a {
-  color: #666666;
-  display: block;
-  padding: 5px 0;
-}
-
-.category-list li {
-  display: block;
-}
-
-.category-list li i {
-  margin-right: 8px;
-  color: #3d4d5d;
-}
-
-.category-list li a .text-navy {
-  color: @navy;
-}
-
-.category-list li a .text-primary {
-  color: @blue;
-}
-
-.category-list li a .text-info {
-  color: @lazur;
-}
-
-.category-list li a .text-danger {
-  color: #EF5352;
-}
-
-.category-list li a .text-warning {
-  color: #F8AC59;
-}
-
-.file-manager h5.tag-title {
-  margin-top: 20px;
-}
-
-.tag-list li {
-  float: left;
-}
-
-.tag-list li a {
-  font-size: 10px;
-  background-color: @gray;
-  padding: 5px 12px;
-  color: inherit;
-  border-radius: 2px;
-  border: 1px solid @border-color;
-  margin-right: 5px;
-  margin-top: 5px;
-  display: block;
-}
-
-.file {
-  border: 1px solid @border-color;
-  padding: 0;
-  background-color: #ffffff;
-  position: relative;
-  margin-bottom: 20px;
-  margin-right: 20px;
-}
-
-.file-manager .hr-line-dashed {
-  margin: 15px 0;
-}
-
-.file .icon, .file .image {
-  height: 100px;
-  overflow: hidden;
-}
-
-.file .icon {
-  padding: 15px 10px;
-  text-align: center;
-}
-
-.file-control {
-  color: inherit;
-  font-size: 11px;
-  margin-right: 10px;
-}
-
-.file-control.active {
-  text-decoration: underline;
-}
-
-.file .icon i {
-  font-size: 70px;
-  color: #dadada;
-}
-
-.file .file-name {
-  padding: 10px;
-  background-color: #f8f8f8;
-  border-top: 1px solid @border-color;
-}
-
-.file-name small {
-  color: @text-color;
-}
-
-.corner {
-  position: absolute;
-  display: inline-block;
-  width: 0;
-  height: 0;
-  line-height: 0;
-  border: 0.6em solid transparent;
-  border-right: 0.6em solid #f1f1f1;
-  border-bottom: 0.6em solid #f1f1f1;
-  right: 0em;
-  bottom: 0em
-}
-
-a.compose-mail {
-  padding: 8px 10px;
-}
-
-.mail-search {
-  max-width: 300px;
-}
-
-/* PROFILE */
-
-.profile-content {
-  border-top: none !important;
-}
-
-.profile-stats {
-  margin-right: 10px;
-}
-
-.profile-image {
-  width: 120px;
-  float: left;
-}
-
-.profile-image img {
-  width: 96px;
-  height: 96px;
-}
-
-.profile-info {
-  margin-left: 120px;
-}
-
-.feed-activity-list .feed-element {
-  border-bottom: 1px solid @border-color;
-}
-
-.feed-element:first-child {
-  margin-top: 0;
-}
-
-.feed-element {
-  padding-bottom: 15px;
-}
-
-.feed-element, .feed-element .media {
-  margin-top: 15px;
-}
-
-.feed-element, .media-body {
-  overflow: hidden;
-}
-
-.feed-element > .pull-left {
-  margin-right: 10px;
-}
-
-.feed-element img.img-circle, .dropdown-messages-box img.img-circle {
-  width: 38px;
-  height: 38px;
-}
-
-.feed-element .well {
-  border: 1px solid @border-color;
-  box-shadow: none;
-  margin-top: 10px;
-  margin-bottom: 5px;
-  padding: 10px 20px;
-  font-size: 11px;
-  line-height: 16px;
-}
-
-.feed-element .actions {
-  margin-top: 10px;
-}
-
-.feed-element .photos {
-  margin: 10px 0;
-
-}
-
-.feed-photo {
-  max-height: 180px;
-  border-radius: 4px;
-  overflow: hidden;
-  margin-right: 10px;
-  margin-bottom: 10px;
-}
-
-.file-list li {
-  padding: 5px 10px;
-  font-size: 11px;
-  border-radius: 2px;
-  border: 1px solid @border-color;
-  margin-bottom: 5px;
-
-}
-
-.file-list li a {
-  color: inherit;
-}
-
-.file-list li a:hover {
-  color: @navy;
-}
-
-.user-friends img {
-  width: 42px;
-  height: 42px;
-  margin-bottom: 5px;
-  margin-right: 5px;
-
-}
-
-/* MAILBOX */
-
-.mail-box {
-  background-color: #ffffff;
-  border: 1px solid @border-color;
-  border-top: 0;
-  padding: 0;
-  margin-bottom: 20px;
-}
-
-.mail-box-header {
-  background-color: #ffffff;
-  border: 1px solid @border-color;
-  border-bottom: 0;
-  padding: 30px 20px 20px 20px;
-}
-
-.mail-box-header h2 {
-  margin-top: 0;
-}
-
-.mailbox-content .tag-list li a {
-  background: #ffffff;
-}
-
-.mail-body {
-  border-top: 1px solid @border-color;
-  padding: 20px;
-}
-
-.mail-text {
-  border-top: 1px solid @border-color;
-}
-
-.mail-text .note-toolbar {
-  padding: 10px 15px;
-}
-
-.mail-body .form-group {
-  margin-bottom: 5px;
-}
-
-.mail-text .note-editor .note-toolbar {
-  background-color: #F9F8F8;
-}
-
-.mail-attachment {
-  border-top: 1px solid @border-color;
-  padding: 20px;
-  font-size: 12px;
-}
-
-.mailbox-content {
-  background: none;
-  border: none;
-  padding: 10px;
-}
-
-.mail-ontact {
-  width: 23%;
-}
-
-/* PROJECTS */
-.project-people, .project-actions {
-  text-align: right;
-  vertical-align: middle;
-}
-
-dd.project-people {
-  text-align: left;
-  margin-top: 5px;
-}
-
-.project-people img {
-  width: 32px;
-  height: 32px;
-}
-
-.project-title a {
-  font-size: 14px;
-  color: @text-color;
-  font-weight: 600;
-}
-
-.project-list table tr td {
-  border-top: none;
-  border-bottom: 1px solid @border-color;
-  padding: 15px 10px;
-  vertical-align: middle;
-}
-
-.project-manager .tag-list li a {
-  font-size: 10px;
-  background-color: white;
-  padding: 5px 12px;
-  color: inherit;
-  border-radius: 2px;
-  border: 1px solid @border-color;
-  margin-right: 5px;
-  margin-top: 5px;
-  display: block;
-}
-
-.project-files li a {
-  font-size: 11px;
-  color: @text-color;
-  margin-left: 10px;
-  line-height: 22px;
-}
-
-/* FAQ */
-
-.faq-item {
-  padding: 20px;
-  margin-bottom: 2px;
-  background: #fff;
-}
-
-.faq-question {
-  font-size: 18px;
-  font-weight: 600;
-  color: @navy;
-  display: block;
-}
-
-.faq-question:hover {
-  color: darken(@navy, 5%);
-}
-
-.faq-answer {
-  margin-top: 10px;
-  background: @gray;
-  border: 1px solid @border-color;
-  border-radius: 3px;
-  padding: 15px;
-}
-
-.faq-item .tag-item {
-  background: @gray;
-  padding: 2px 6px;
-  font-size: 10px;
-  text-transform: uppercase;
-}
-
-/* Chat view */
-.message-input {
-  height: 90px !important;
-}
-
-.chat-avatar {
-  white: 36px;
-  height: 36px;
-  float: left;
-  margin-right: 10px;
-}
-
-.chat-user-name {
-  padding: 10px;
-}
-
-.chat-user {
-  padding: 8px 10px;
-  border-bottom: 1px solid #e7eaec;
-}
-
-.chat-user a {
-  color: inherit;
-}
-
-.chat-view {
-  z-index: 20012;
-}
-
-.chat-users, .chat-statistic {
-  margin-left: -30px;
-}
-
-@media (max-width: 992px) {
-  .chat-users, .chat-statistic {
-    margin-left: 0;
-  }
-}
-
-.chat-view .ibox-content {
-  padding: 0;
-}
-
-.chat-message {
-  padding: 10px 20px;
-}
-
-.message-avatar {
-  height: 48px;
-  width: 48px;
-  border: 1px solid #e7eaec;
-  border-radius: 4px;
-  margin-top: 1px;
-}
-
-.chat-discussion .chat-message.left .message-avatar {
-  float: left;
-  margin-right: 10px;
-}
-
-.chat-discussion .chat-message.right .message-avatar {
-  float: right;
-  margin-left: 10px;
-}
-
-.message {
-  background-color: #fff;
-  border: 1px solid #e7eaec;
-  text-align: left;
-  display: block;
-  padding: 10px 20px;
-  position: relative;
-  border-radius: 4px;
-}
-
-.chat-discussion .chat-message.left .message-date {
-  float: right;
-}
-
-.chat-discussion .chat-message.right .message-date {
-  float: left;
-}
-
-.chat-discussion .chat-message.left .message {
-  text-align: left;
-  margin-left: 55px;
-}
-
-.chat-discussion .chat-message.right .message {
-  text-align: right;
-  margin-right: 55px;
-}
-
-.message-date {
-  font-size: 10px;
-  color: #888888;
-}
-
-.message-content {
-  display: block;
-}
-
-.chat-discussion {
-  background: #eee;
-  padding: 15px;
-  height: 400px;
-  overflow-y: auto;
-}
-
-.chat-users {
-  overflow-y: auto;
-  height: 400px;
-}
-
-.chat-message-form .form-group {
-  margin-bottom: 0;
-}
-
-/* jsTree */
-.jstree-open > .jstree-anchor > .fa-folder:before {
-  content: "\f07c";
-}
-
-.jstree-default .jstree-icon.none {
-  width: 0;
-}
-
-/* CLIENTS */
-
-.clients-list {
-  margin-top: 20px;
-}
-
-.clients-list .tab-pane {
-  position: relative;
-  height: 600px;
-}
-
-.client-detail {
-  position: relative;
-  height: 620px;
-}
-
-.clients-list table tr td {
-  height: 46px;
-  vertical-align: middle;
-  border: none;
-}
-
-.client-link {
-  font-weight: 600;
-  color: inherit;
-}
-
-.client-link:hover {
-  color: inherit;
-}
-
-.client-avatar {
-  width: 42px;
-}
-
-.client-avatar img {
-  width: 28px;
-  height: 28px;
-  border-radius: 50%;
-}
-
-.contact-type {
-  width: 20px;
-  color: lighten(@text-color, 35%);
-}
-
-.client-status {
-  text-align: left;
-}
-
-.client-detail .vertical-timeline-content p {
-  margin: 0;
-}
-
-.client-detail .vertical-timeline-icon.gray-bg {
-  color: lighten(@text-color, 25px);
-}
-
-.clients-list {
-  .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
-    border-bottom: 1px solid #fff;
-  }
-}
-
-/* BLOG ARTICLE */
-.blog h2 {
-  font-weight: 700;
-}
-
-.blog h5 {
-  margin: 0 0 5px 0;
-}
-
-.blog .btn {
-  margin: 0 0 5px 0;
-}
-
-.article h1 {
-  font-size: 48px;
-  font-weight: 700;
-  color: #2F4050;
-}
-
-.article p {
-  font-size: 15px;
-  line-height: 26px;
-}
-
-.article-title {
-  text-align: center;
-  margin: 40px 0 100px 0;
-}
-
-.article .ibox-content {
-  padding: 40px;
-}
-
-/* ISSUE TRACKER */
-
-.issue-tracker .btn-link {
-  color: @navy;
-}
-
-table.issue-tracker tbody tr td {
-  vertical-align: middle;
-  height: 50px;
-}
-
-.issue-info {
-  width: 50%;
-}
-
-.issue-info a {
-  font-weight: 600;
-  color: @text-color;
-}
-
-.issue-info small {
-  display: block;
-}
-
-/* TEAMS */
-.team-members {
-  margin: 10px 0;
-}
-
-.team-members img.img-circle {
-  width: 42px;
-  height: 42px;
-  margin-bottom: 5px;
-}
-
-/* AGILE BOARD */
-
-.sortable-list {
-  padding: 10px 0;
-}
-
-.agile-list {
-  list-style: none;
-  margin: 0;
-}
-
-.agile-list li {
-
-  background: #FAFAFB;
-  border: 1px solid #e7eaec;
-  margin: 0 0 10px 0;
-  padding: 10px;
-  border-radius: 2px;
-}
-
-.agile-list li:hover {
-  cursor: pointer;
-  background: #fff;
-}
-
-.agile-list li.warning-element {
-  border-left: 3px solid @yellow;
-}
-
-.agile-list li.danger-element {
-  border-left: 3px solid @red;
-}
-
-.agile-list li.info-element {
-  border-left: 3px solid @blue;
-}
-
-.agile-list li.success-element {
-  border-left: 3px solid @navy;
-}
-
-.agile-detail {
-  margin-top: 5px;
-  font-size: 12px;
-}
-
-/* DIFF */
-ins {
-  background-color: #c6ffc6;
-  text-decoration: none;
-}
-
-del {
-  background-color: #ffc6c6;
-}
-
-/* E-commerce */
-.product-box {
-  padding: 0;
-
-  border: 1px solid @border-color;
-}
-
-.product-box:hover,
-.product-box.active {
-  border: 1px solid transparent;
-  -webkit-box-shadow: 0 3px 7px 0 rgba(168, 168, 168, 1);
-  -moz-box-shadow: 0 3px 7px 0 rgba(168, 168, 168, 1);
-  box-shadow: 0 3px 7px 0 rgba(168, 168, 168, 1);
-}
-
-.product-imitation {
-  text-align: center;
-  padding: 90px 0;
-  background-color: lighten(@gray, 2%);
-  color: darken(@gray, 20%);
-  font-weight: 600;
-}
-
-.cart-product-imitation {
-  text-align: center;
-  padding-top: 30px;
-  height: 80px;
-  width: 80px;
-  background-color: lighten(@gray, 2%);
-}
-
-.product-imitation.xl {
-  padding: 120px 0;
-}
-
-.product-desc {
-  padding: 20px;
-  position: relative;
-}
-
-.ecommerce .tag-list {
-  padding: 0;
-}
-
-.ecommerce .fa-star {
-  color: @light-gray;
-}
-
-.ecommerce .fa-star.active {
-  color: @yellow;
-}
-
-.ecommerce .note-editor {
-  border: 1px solid @border-color;
-}
-
-table.shoping-cart-table {
-  margin-bottom: 0;
-
-  tr td {
-    border: none;
-    text-align: right;
-  }
-
-  tr td.desc, tr td:first-child {
-    text-align: left;
-  }
-
-  tr td:last-child {
-    width: 80px;
-  }
-
-}
-
-.product-name {
-  font-size: 16px;
-  font-weight: 600;
-  color: @text-color;
-  display: block;
-  margin: 2px 0 5px 0;
-}
-
-.product-name:hover,
-.product-name:focus {
-  color: @navy;
-}
-
-.product-price {
-  font-size: 14px;
-  font-weight: 600;
-  color: #ffffff;
-  background-color: @navy;
-  padding: 6px 12px;
-
-  position: absolute;
-  top: -32px;
-  right: 0;
-}
-
-.product-detail .ibox-content {
-  padding: 30px 30px 50px 30px;
-}
-
-.image-imitation {
-  background-color: lighten(@gray, 2%);
-  text-align: center;
-  padding: 200px 0;
-
-}
-
-.product-main-price small {
-  font-size: 10px;
-
-}
-
-.product-images {
-  margin: 0 20px;
-}
-
-/* Social feed */
-.social-feed-separated .social-feed-box {
-  margin-left: 62px;
-}
-
-.social-feed-separated .social-avatar {
-  float: left;
-  padding: 0;
-}
-
-.social-feed-separated .social-avatar img {
-  width: 52px;
-  height: 52px;
-  border: 1px solid #e7eaec;
-}
-
-.social-feed-separated .social-feed-box .social-avatar {
-  padding: 15px 15px 0 15px;
-  float: none;
-}
-
-.social-feed-box {
-  /*padding: 15px;*/
-  border: 1px solid #e7eaec;
-  background: #fff;
-  margin-bottom: 15px;
-}
-
-.article .social-feed-box {
-  margin-bottom: 0;
-  border-bottom: none;
-}
-
-.article .social-feed-box:last-child {
-  margin-bottom: 0;
-  border-bottom: 1px solid @border-color;
-}
-
-.article .social-feed-box p {
-  font-size: 13px;
-  line-height: 18px;
-}
-
-.social-action {
-  margin: 15px;
-}
-
-.social-avatar {
-  padding: 15px 15px 0 15px;
-}
-
-.social-comment .social-comment {
-  margin-left: 45px;
-}
-
-.social-avatar img {
-  height: 40px;
-  width: 40px;
-  margin-right: 10px;
-}
-
-.social-avatar .media-body a {
-  font-size: 14px;
-  display: block;
-}
-
-.social-body {
-  padding: 15px;
-}
-
-.social-body img {
-  margin-bottom: 10px;
-}
-
-.social-footer {
-  border-top: 1px solid #e7eaec;
-  padding: 10px 15px;
-  background: #f9f9f9;
-}
-
-.social-footer .social-comment img {
-  width: 32px;
-  margin-right: 10px;
-}
-
-.social-comment:first-child {
-  margin-top: 0;
-}
-
-.social-comment {
-  margin-top: 15px;
-}
-
-.social-comment textarea {
-  font-size: 12px;
-}
-
-/* Vote list */
-
-.vote-item {
-  padding: 20px 25px;
-  background: #ffffff;
-  border-top: 1px solid @border-color;
-}
-
-.vote-item:last-child {
-  border-bottom: 1px solid @border-color;
-}
-
-.vote-item:hover {
-  background: lighten(@gray, 3%);
-}
-
-.vote-actions {
-  float: left;
-  width: 30px;
-  margin-right: 15px;
-  text-align: center;
-
-}
-
-.vote-actions a {
-  color: @navy;
-  font-weight: 600;
-}
-
-.vote-actions {
-  font-weight: 600;
-}
-
-.vote-title {
-  display: block;
-  color: inherit;
-  font-size: 18px;
-  font-weight: 600;
-  margin-top: 5px;
-  margin-bottom: 2px;
-}
-
-.vote-title:hover, .vote-title:focus {
-  color: inherit;
-}
-
-.vote-info, .vote-title {
-  margin-left: 45px;
-}
-
-.vote-info, .vote-info a {
-  color: lighten(@text-color, 30%);
-  font-size: 12px;
-}
-
-.vote-info a {
-  margin-right: 10px;
-}
-
-.vote-info a:hover {
-  color: @navy;
-}
-
-.vote-icon {
-  text-align: right;
-  font-size: 38px;
-  display: block;
-  color: lighten(@text-color, 50%);
-}
-
-.vote-icon.active {
-  color: @navy;
-}
-
-
-.lightBoxGallery {
-  text-align: center
-}
-
-.lightBoxGallery img {
-  margin: 5px
-}
-
diff --git a/src/assets/css/inspinia/sidebar.less b/src/assets/css/inspinia/sidebar.less
deleted file mode 100644
index 1c9250c..0000000
--- a/src/assets/css/inspinia/sidebar.less
+++ /dev/null
@@ -1,191 +0,0 @@
-.sidebard-panel {
-  width: 220px;
-  background: darken(@gray, 3%);
-  padding: 10px 20px;
-  position: absolute;
-  right: 0;
-}
-
-.sidebard-panel .feed-element img.img-circle {
-  width: 32px;
-  height: 32px;
-}
-
-.sidebard-panel .feed-element, .media-body, .sidebard-panel p {
-  font-size: 12px;
-}
-
-.sidebard-panel .feed-element {
-  margin-top: 20px;
-  padding-bottom: 0;
-}
-
-.sidebard-panel .list-group {
-  margin-bottom: 10px;
-}
-
-.sidebard-panel .list-group .list-group-item {
-  padding: 5px 0;
-  font-size: 12px;
-  border: 0;
-}
-
-.sidebar-content .wrapper, .wrapper.sidebar-content {
-  padding-right: 230px !important;
-}
-
-// Right sidebar
-
-#right-sidebar {
-  background-color: #fff;
-  border-left: 1px solid #e7eaec;
-  border-top: 1px solid #e7eaec;
-  overflow: hidden;
-  position: fixed;
-  top: 60px;
-  width: 260px !important;
-  z-index: 1009;
-  bottom: 0;
-  right: -260px;
-}
-
-#right-sidebar.sidebar-open {
-  right: 0;
-}
-
-#right-sidebar.sidebar-open.sidebar-top {
-  top: 0;
-  border-top: none;
-}
-
-.sidebar-container {
-
-  ul.nav-tabs {
-    border: none;
-  }
-
-  ul.nav-tabs.navs-4 li {
-    width: 25%;
-  }
-  ul.nav-tabs.navs-3 li {
-    width: 33.3333%;
-  }
-  ul.nav-tabs.navs-2 li {
-    width: 50%;
-  }
-
-  ul.nav-tabs li {
-    border: none;
-  }
-
-  ul.nav-tabs li a {
-    border: none;
-    padding: 12px 10px;
-    margin: 0;
-    border-radius: 0;
-    background: @nav-bg;
-    color: #fff;
-    text-align: center;
-
-    border-right: 1px solid lighten(@nav-bg, 2%);
-  }
-
-  ul.nav-tabs li.active a {
-    border: none;
-    background: #f9f9f9;
-    color: @text-color;
-    font-weight: bold;
-
-  }
-
-  .nav-tabs > li.active > a:hover,
-  .nav-tabs > li.active > a:focus {
-
-    border: none;
-
-  }
-
-  ul.sidebar-list {
-    margin: 0;
-    padding: 0;
-  }
-
-  ul.sidebar-list li {
-    border-bottom: 1px solid @border-color;
-    padding: 15px 20px;
-    list-style: none;
-
-    font-size: 12px;
-  }
-
-  ul.sidebar-list li:nth-child(2n+2) {
-    //    background: #f9f9f9;
-  }
-
-  .sidebar-message:nth-child(2n+2) {
-    background: #f9f9f9;
-  }
-
-  ul.sidebar-list li a {
-    text-decoration: none;
-    color: inherit;
-  }
-
-  .sidebar-content {
-    padding: 15px 20px;
-    font-size: 12px;
-  }
-
-  .date-item {
-
-  }
-
-  .sidebar-title {
-    background: #f9f9f9;
-    padding: 20px;
-    border-bottom: 1px solid @border-color;
-
-    h3 {
-      margin-bottom: 3px;
-      padding-left: 2px;
-    }
-  }
-
-  .tab-content {
-
-    h4 {
-      margin-bottom: 5px;
-    }
-
-  }
-
-  .sidebar-message > a > .pull-left {
-    margin-right: 10px;
-  }
-
-  .sidebar-message > a {
-    text-decoration: none;
-    color: inherit;
-  }
-
-  .sidebar-message {
-    padding: 15px 20px;
-  }
-
-  .sidebar-message:hover {
-    //    background: #f9f9f9;
-  }
-
-  .sidebar-message .message-avatar {
-    height: 38px;
-    width: 38px;
-    border-radius: 50%;
-  }
-
-  .setings-item {
-    padding: 15px 20px;
-    border-bottom: 1px solid @border-color;
-  }
-
-}
-
diff --git a/src/assets/css/inspinia/spinners.less b/src/assets/css/inspinia/spinners.less
deleted file mode 100644
index 8b49257..0000000
--- a/src/assets/css/inspinia/spinners.less
+++ /dev/null
@@ -1,997 +0,0 @@
-/*
- *  Usage:
- *
- *    
- * - */ - -.sk-spinner-rotating-plane.sk-spinner { - width: 30px; - height: 30px; - background-color: @spin-color; - margin: @spin-margin; - -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out; - animation: sk-rotatePlane 1.2s infinite ease-in-out; -} - -@-webkit-keyframes sk-rotatePlane { - 0% { - -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); - transform: perspective(120px) rotateX(0deg) rotateY(0deg); - } - - 50% { - -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); - transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); - } - - 100% { - -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - } -} - -@keyframes sk-rotatePlane { - 0% { - -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); - transform: perspective(120px) rotateX(0deg) rotateY(0deg); - } - - 50% { - -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); - transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); - } - - 100% { - -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- * - */ -.sk-spinner-double-bounce.sk-spinner { - width: 40px; - height: 40px; - position: relative; - margin: @spin-margin; -} - -.sk-spinner-double-bounce .sk-double-bounce1, .sk-spinner-double-bounce .sk-double-bounce2 { - width: 100%; - height: 100%; - border-radius: 50%; - background-color: @spin-color; - opacity: 0.6; - position: absolute; - top: 0; - left: 0; - -webkit-animation: sk-doubleBounce 2s infinite ease-in-out; - animation: sk-doubleBounce 2s infinite ease-in-out; -} - -.sk-spinner-double-bounce .sk-double-bounce2 { - -webkit-animation-delay: -1s; - animation-delay: -1s; -} - -@-webkit-keyframes sk-doubleBounce { - 0%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 50% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes sk-doubleBounce { - 0%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 50% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- *
- *
- *
- * - */ -.sk-spinner-wave.sk-spinner { - margin: @spin-margin; - width: 50px; - height: 30px; - text-align: center; - font-size: 10px; -} - -.sk-spinner-wave div { - background-color: @spin-color; - height: 100%; - width: 6px; - display: inline-block; - -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out; - animation: sk-waveStretchDelay 1.2s infinite ease-in-out; -} - -.sk-spinner-wave .sk-rect2 { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.sk-spinner-wave .sk-rect3 { - -webkit-animation-delay: -1s; - animation-delay: -1s; -} - -.sk-spinner-wave .sk-rect4 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.sk-spinner-wave .sk-rect5 { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -@-webkit-keyframes sk-waveStretchDelay { - 0%, 40%, 100% { - -webkit-transform: scaleY(0.4); - transform: scaleY(0.4); - } - - 20% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - } -} - -@keyframes sk-waveStretchDelay { - 0%, 40%, 100% { - -webkit-transform: scaleY(0.4); - transform: scaleY(0.4); - } - - 20% { - -webkit-transform: scaleY(1); - transform: scaleY(1); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- * - */ -.sk-spinner-wandering-cubes.sk-spinner { - margin: @spin-margin; - width: 32px; - height: 32px; - position: relative; -} - -.sk-spinner-wandering-cubes .sk-cube1, .sk-spinner-wandering-cubes .sk-cube2 { - background-color: @spin-color; - width: 10px; - height: 10px; - position: absolute; - top: 0; - left: 0; - -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out; - animation: sk-wanderingCubeMove 1.8s infinite ease-in-out; -} - -.sk-spinner-wandering-cubes .sk-cube2 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -@-webkit-keyframes sk-wanderingCubeMove { - 25% { - -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); - transform: translateX(42px) rotate(-90deg) scale(0.5); - } - - 50% { - /* Hack to make FF rotate in the right direction */ - -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); - transform: translateX(42px) translateY(42px) rotate(-179deg); - } - - 50.1% { - -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); - transform: translateX(42px) translateY(42px) rotate(-180deg); - } - - 75% { - -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); - transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); - } - - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } -} - -@keyframes sk-wanderingCubeMove { - 25% { - -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); - transform: translateX(42px) rotate(-90deg) scale(0.5); - } - - 50% { - /* Hack to make FF rotate in the right direction */ - -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); - transform: translateX(42px) translateY(42px) rotate(-179deg); - } - - 50.1% { - -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); - transform: translateX(42px) translateY(42px) rotate(-180deg); - } - - 75% { - -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); - transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); - } - - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } -} - -/* - * Usage: - * - *
- * - */ -.sk-spinner-pulse.sk-spinner { - width: 40px; - height: 40px; - margin: @spin-margin; - background-color: @spin-color; - border-radius: 100%; - -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out; - animation: sk-pulseScaleOut 1s infinite ease-in-out; -} - -@-webkit-keyframes sk-pulseScaleOut { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0; - } -} - -@keyframes sk-pulseScaleOut { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - opacity: 0; - } -} - -/* - * Usage: - * - *
- *
- *
- *
- * - */ -.sk-spinner-chasing-dots.sk-spinner { - margin: @spin-margin; - width: 40px; - height: 40px; - position: relative; - text-align: center; - -webkit-animation: sk-chasingDotsRotate 2s infinite linear; - animation: sk-chasingDotsRotate 2s infinite linear; -} - -.sk-spinner-chasing-dots .sk-dot1, .sk-spinner-chasing-dots .sk-dot2 { - width: 60%; - height: 60%; - display: inline-block; - position: absolute; - top: 0; - background-color: @spin-color; - border-radius: 100%; - -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out; - animation: sk-chasingDotsBounce 2s infinite ease-in-out; -} - -.sk-spinner-chasing-dots .sk-dot2 { - top: auto; - bottom: 0; - -webkit-animation-delay: -1s; - animation-delay: -1s; -} - -@-webkit-keyframes sk-chasingDotsRotate { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes sk-chasingDotsRotate { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@-webkit-keyframes sk-chasingDotsBounce { - 0%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 50% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes sk-chasingDotsBounce { - 0%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 50% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- *
- * - */ -.sk-spinner-three-bounce.sk-spinner { - margin: @spin-margin; - width: 70px; - text-align: center; -} - -.sk-spinner-three-bounce div { - width: 18px; - height: 18px; - background-color: @spin-color; - border-radius: 100%; - display: inline-block; - -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out; - animation: sk-threeBounceDelay 1.4s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.sk-spinner-three-bounce .sk-bounce1 { - -webkit-animation-delay: -0.32s; - animation-delay: -0.32s; -} - -.sk-spinner-three-bounce .sk-bounce2 { - -webkit-animation-delay: -0.16s; - animation-delay: -0.16s; -} - -@-webkit-keyframes sk-threeBounceDelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes sk-threeBounceDelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * - */ -.sk-spinner-circle.sk-spinner { - margin: @spin-margin; - width: 22px; - height: 22px; - position: relative; -} - -.sk-spinner-circle .sk-circle { - width: 100%; - height: 100%; - position: absolute; - left: 0; - top: 0; -} - -.sk-spinner-circle .sk-circle:before { - content: ''; - display: block; - margin: @spin-margin; - width: 20%; - height: 20%; - background-color: @spin-color; - border-radius: 100%; - -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out; - animation: sk-circleBounceDelay 1.2s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.sk-spinner-circle .sk-circle2 { - -webkit-transform: rotate(30deg); - -ms-transform: rotate(30deg); - transform: rotate(30deg); -} - -.sk-spinner-circle .sk-circle3 { - -webkit-transform: rotate(60deg); - -ms-transform: rotate(60deg); - transform: rotate(60deg); -} - -.sk-spinner-circle .sk-circle4 { - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} - -.sk-spinner-circle .sk-circle5 { - -webkit-transform: rotate(120deg); - -ms-transform: rotate(120deg); - transform: rotate(120deg); -} - -.sk-spinner-circle .sk-circle6 { - -webkit-transform: rotate(150deg); - -ms-transform: rotate(150deg); - transform: rotate(150deg); -} - -.sk-spinner-circle .sk-circle7 { - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} - -.sk-spinner-circle .sk-circle8 { - -webkit-transform: rotate(210deg); - -ms-transform: rotate(210deg); - transform: rotate(210deg); -} - -.sk-spinner-circle .sk-circle9 { - -webkit-transform: rotate(240deg); - -ms-transform: rotate(240deg); - transform: rotate(240deg); -} - -.sk-spinner-circle .sk-circle10 { - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} - -.sk-spinner-circle .sk-circle11 { - -webkit-transform: rotate(300deg); - -ms-transform: rotate(300deg); - transform: rotate(300deg); -} - -.sk-spinner-circle .sk-circle12 { - -webkit-transform: rotate(330deg); - -ms-transform: rotate(330deg); - transform: rotate(330deg); -} - -.sk-spinner-circle .sk-circle2:before { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.sk-spinner-circle .sk-circle3:before { - -webkit-animation-delay: -1s; - animation-delay: -1s; -} - -.sk-spinner-circle .sk-circle4:before { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.sk-spinner-circle .sk-circle5:before { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -.sk-spinner-circle .sk-circle6:before { - -webkit-animation-delay: -0.7s; - animation-delay: -0.7s; -} - -.sk-spinner-circle .sk-circle7:before { - -webkit-animation-delay: -0.6s; - animation-delay: -0.6s; -} - -.sk-spinner-circle .sk-circle8:before { - -webkit-animation-delay: -0.5s; - animation-delay: -0.5s; -} - -.sk-spinner-circle .sk-circle9:before { - -webkit-animation-delay: -0.4s; - animation-delay: -0.4s; -} - -.sk-spinner-circle .sk-circle10:before { - -webkit-animation-delay: -0.3s; - animation-delay: -0.3s; -} - -.sk-spinner-circle .sk-circle11:before { - -webkit-animation-delay: -0.2s; - animation-delay: -0.2s; -} - -.sk-spinner-circle .sk-circle12:before { - -webkit-animation-delay: -0.1s; - animation-delay: -0.1s; -} - -@-webkit-keyframes sk-circleBounceDelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes sk-circleBounceDelay { - 0%, 80%, 100% { - -webkit-transform: scale(0); - transform: scale(0); - } - - 40% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * - */ -.sk-spinner-cube-grid { - /* - * Spinner positions - * 1 2 3 - * 4 5 6 - * 7 8 9 - */ -} - -.sk-spinner-cube-grid.sk-spinner { - width: 30px; - height: 30px; - margin: @spin-margin; -} - -.sk-spinner-cube-grid .sk-cube { - width: 33%; - height: 33%; - background-color: @spin-color; - float: left; - -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; - animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(1) { - -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(2) { - -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(3) { - -webkit-animation-delay: 0.4s; - animation-delay: 0.4s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(4) { - -webkit-animation-delay: 0.1s; - animation-delay: 0.1s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(5) { - -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(6) { - -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(7) { - -webkit-animation-delay: 0s; - animation-delay: 0s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(8) { - -webkit-animation-delay: 0.1s; - animation-delay: 0.1s; -} - -.sk-spinner-cube-grid .sk-cube:nth-child(9) { - -webkit-animation-delay: 0.2s; - animation-delay: 0.2s; -} - -@-webkit-keyframes sk-cubeGridScaleDelay { - 0%, 70%, 100% { - -webkit-transform: scale3D(1, 1, 1); - transform: scale3D(1, 1, 1); - } - - 35% { - -webkit-transform: scale3D(0, 0, 1); - transform: scale3D(0, 0, 1); - } -} - -@keyframes sk-cubeGridScaleDelay { - 0%, 70%, 100% { - -webkit-transform: scale3D(1, 1, 1); - transform: scale3D(1, 1, 1); - } - - 35% { - -webkit-transform: scale3D(0, 0, 1); - transform: scale3D(0, 0, 1); - } -} - -/* - * Usage: - * - *
- * - *
- * - */ -.sk-spinner-wordpress.sk-spinner { - background-color: @spin-color; - width: 30px; - height: 30px; - border-radius: 30px; - position: relative; - margin: @spin-margin; - -webkit-animation: sk-innerCircle 1s linear infinite; - animation: sk-innerCircle 1s linear infinite; -} - -.sk-spinner-wordpress .sk-inner-circle { - display: block; - background-color: #fff; - width: 8px; - height: 8px; - position: absolute; - border-radius: 8px; - top: 5px; - left: 5px; -} - -@-webkit-keyframes sk-innerCircle { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes sk-innerCircle { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -/* - * Usage: - * - *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * - */ -.sk-spinner-fading-circle.sk-spinner { - margin: @spin-margin; - width: 22px; - height: 22px; - position: relative; -} - -.sk-spinner-fading-circle .sk-circle { - width: 100%; - height: 100%; - position: absolute; - left: 0; - top: 0; -} - -.sk-spinner-fading-circle .sk-circle:before { - content: ''; - display: block; - margin: @spin-margin; - width: 18%; - height: 18%; - background-color: @spin-color; - border-radius: 100%; - -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out; - animation: sk-circleFadeDelay 1.2s infinite ease-in-out; - /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.sk-spinner-fading-circle .sk-circle2 { - -webkit-transform: rotate(30deg); - -ms-transform: rotate(30deg); - transform: rotate(30deg); -} - -.sk-spinner-fading-circle .sk-circle3 { - -webkit-transform: rotate(60deg); - -ms-transform: rotate(60deg); - transform: rotate(60deg); -} - -.sk-spinner-fading-circle .sk-circle4 { - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} - -.sk-spinner-fading-circle .sk-circle5 { - -webkit-transform: rotate(120deg); - -ms-transform: rotate(120deg); - transform: rotate(120deg); -} - -.sk-spinner-fading-circle .sk-circle6 { - -webkit-transform: rotate(150deg); - -ms-transform: rotate(150deg); - transform: rotate(150deg); -} - -.sk-spinner-fading-circle .sk-circle7 { - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} - -.sk-spinner-fading-circle .sk-circle8 { - -webkit-transform: rotate(210deg); - -ms-transform: rotate(210deg); - transform: rotate(210deg); -} - -.sk-spinner-fading-circle .sk-circle9 { - -webkit-transform: rotate(240deg); - -ms-transform: rotate(240deg); - transform: rotate(240deg); -} - -.sk-spinner-fading-circle .sk-circle10 { - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} - -.sk-spinner-fading-circle .sk-circle11 { - -webkit-transform: rotate(300deg); - -ms-transform: rotate(300deg); - transform: rotate(300deg); -} - -.sk-spinner-fading-circle .sk-circle12 { - -webkit-transform: rotate(330deg); - -ms-transform: rotate(330deg); - transform: rotate(330deg); -} - -.sk-spinner-fading-circle .sk-circle2:before { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.sk-spinner-fading-circle .sk-circle3:before { - -webkit-animation-delay: -1s; - animation-delay: -1s; -} - -.sk-spinner-fading-circle .sk-circle4:before { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.sk-spinner-fading-circle .sk-circle5:before { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -.sk-spinner-fading-circle .sk-circle6:before { - -webkit-animation-delay: -0.7s; - animation-delay: -0.7s; -} - -.sk-spinner-fading-circle .sk-circle7:before { - -webkit-animation-delay: -0.6s; - animation-delay: -0.6s; -} - -.sk-spinner-fading-circle .sk-circle8:before { - -webkit-animation-delay: -0.5s; - animation-delay: -0.5s; -} - -.sk-spinner-fading-circle .sk-circle9:before { - -webkit-animation-delay: -0.4s; - animation-delay: -0.4s; -} - -.sk-spinner-fading-circle .sk-circle10:before { - -webkit-animation-delay: -0.3s; - animation-delay: -0.3s; -} - -.sk-spinner-fading-circle .sk-circle11:before { - -webkit-animation-delay: -0.2s; - animation-delay: -0.2s; -} - -.sk-spinner-fading-circle .sk-circle12:before { - -webkit-animation-delay: -0.1s; - animation-delay: -0.1s; -} - -@-webkit-keyframes sk-circleFadeDelay { - 0%, 39%, 100% { - opacity: 0; - } - - 40% { - opacity: 1; - } -} - -@keyframes sk-circleFadeDelay { - 0%, 39%, 100% { - opacity: 0; - } - - 40% { - opacity: 1; - } -} - diff --git a/src/assets/css/inspinia/style.less b/src/assets/css/inspinia/style.less deleted file mode 100644 index 9520119..0000000 --- a/src/assets/css/inspinia/style.less +++ /dev/null @@ -1,31 +0,0 @@ -/* - * - * INSPINIA - Responsive Admin Theme - * version 2.6.2 - * -*/ -// Variables, Mixins -@import "../global/variables.less"; -@import "mixins.less"; -// INSPINIA Theme Elements -@import "typography.less"; -@import "buttons.less"; -@import "badgets_labels.less"; -@import "elements.less"; -@import "sidebar.less"; -@import "base.less"; -@import "pages.less"; -@import "chat.less"; -@import "spinners.less"; - - - - - - - - - - - - diff --git a/src/assets/css/inspinia/typography.less b/src/assets/css/inspinia/typography.less deleted file mode 100644 index d2b51af..0000000 --- a/src/assets/css/inspinia/typography.less +++ /dev/null @@ -1,32 +0,0 @@ -h1, h2, h3, h4, h5, h6 { - font-weight: 100; -} - -h1 { - font-size: 30px; -} - -h2 { - font-size: 24px; -} - -h3 { - font-size: 16px; -} - -h4 { - font-size: 14px; -} - -h5 { - font-size: 12px; -} - -h6 { - font-size: 10px; -} - -h3, h4, h5 { - margin-top: 5px; - font-weight: 600; -} \ No newline at end of file diff --git a/src/assets/css/mixin/bootstrap-variables.less b/src/assets/css/mixin/bootstrap-variables.less deleted file mode 100644 index 93d27c1..0000000 --- a/src/assets/css/mixin/bootstrap-variables.less +++ /dev/null @@ -1 +0,0 @@ -@import "~bootstrap/less/variables.less"; \ No newline at end of file diff --git a/src/assets/img/avatar.png b/src/assets/img/avatar.png deleted file mode 100644 index 222f0b4..0000000 Binary files a/src/assets/img/avatar.png and /dev/null differ diff --git a/src/assets/img/error.png b/src/assets/img/error.png deleted file mode 100644 index 97f79c9..0000000 Binary files a/src/assets/img/error.png and /dev/null differ diff --git a/src/assets/img/eyeblue.png b/src/assets/img/eyeblue.png deleted file mode 100644 index e5bdc2c..0000000 Binary files a/src/assets/img/eyeblue.png and /dev/null differ diff --git a/src/assets/img/favicon.ico b/src/assets/img/favicon.ico deleted file mode 100644 index 11db608..0000000 Binary files a/src/assets/img/favicon.ico and /dev/null differ diff --git a/src/assets/img/file/alien.svg b/src/assets/img/file/alien.svg deleted file mode 100644 index 0c4e1cc..0000000 --- a/src/assets/img/file/alien.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/img/file/archive.svg b/src/assets/img/file/archive.svg deleted file mode 100644 index e4cc6ae..0000000 --- a/src/assets/img/file/archive.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/audio.svg b/src/assets/img/file/audio.svg deleted file mode 100644 index 61d679d..0000000 --- a/src/assets/img/file/audio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/doc.svg b/src/assets/img/file/doc.svg deleted file mode 100644 index 5f0c6a6..0000000 --- a/src/assets/img/file/doc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/file.svg b/src/assets/img/file/file.svg deleted file mode 100644 index 90cfac4..0000000 --- a/src/assets/img/file/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/folder.svg b/src/assets/img/file/folder.svg deleted file mode 100644 index 7556f2a..0000000 --- a/src/assets/img/file/folder.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/img/file/image.svg b/src/assets/img/file/image.svg deleted file mode 100644 index ae44150..0000000 --- a/src/assets/img/file/image.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/pdf.svg b/src/assets/img/file/pdf.svg deleted file mode 100644 index 8eb62e6..0000000 --- a/src/assets/img/file/pdf.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/ppt.svg b/src/assets/img/file/ppt.svg deleted file mode 100644 index 91e8b70..0000000 --- a/src/assets/img/file/ppt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/psd.svg b/src/assets/img/file/psd.svg deleted file mode 100644 index d2d7499..0000000 --- a/src/assets/img/file/psd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/text.svg b/src/assets/img/file/text.svg deleted file mode 100644 index 74e9b0b..0000000 --- a/src/assets/img/file/text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/video.svg b/src/assets/img/file/video.svg deleted file mode 100644 index cba33b3..0000000 --- a/src/assets/img/file/video.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/file/xls.svg b/src/assets/img/file/xls.svg deleted file mode 100644 index 1f08d9f..0000000 --- a/src/assets/img/file/xls.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png deleted file mode 100644 index 2dfe1ae..0000000 Binary files a/src/assets/img/logo.png and /dev/null differ diff --git a/src/assets/img/success.svg b/src/assets/img/success.svg deleted file mode 100644 index d5336e0..0000000 --- a/src/assets/img/success.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/img/upload.png b/src/assets/img/upload.png deleted file mode 100644 index d6fe75b..0000000 Binary files a/src/assets/img/upload.png and /dev/null differ diff --git a/src/common/directive/directive.js b/src/common/directive/directive.js deleted file mode 100644 index 2880d31..0000000 --- a/src/common/directive/directive.js +++ /dev/null @@ -1,15 +0,0 @@ -import Vue from 'vue' -import $ from 'jquery' - -//用于表单验证的指令 -Vue.directive('validator', { - update: function (el, binding, vnode) { - if (binding.value && binding.value !== binding.oldValue) { - //先删除之前的,再寻求添加新的 - $(el).find('.validate').children().removeClass('border-danger').next('div').remove() - $(el).find('.validate').children().addClass('border-danger').parent().append('
' + binding.value + '
') - } else if (!binding.value) { - $(el).find('.validate').children().removeClass('border-danger').next('div').remove() - } - } -}) diff --git a/src/common/filter/index.js b/src/common/filter/index.js deleted file mode 100644 index 3bf7f18..0000000 --- a/src/common/filter/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import * as numberFilters from './number' -import * as timeFilters from './time' -import * as strFilters from './str' - - -export default {...numberFilters, ...timeFilters, ...strFilters} - - diff --git a/src/common/filter/number.js b/src/common/filter/number.js deleted file mode 100644 index 6223d97..0000000 --- a/src/common/filter/number.js +++ /dev/null @@ -1,13 +0,0 @@ -export function twoDigital(num) { - - if (num) { - if (parseInt(num) === num) { - return num; - } else { - return num.toFixed(2); - } - } else { - return num; - } - -} diff --git a/src/common/filter/str.js b/src/common/filter/str.js deleted file mode 100644 index 16224f3..0000000 --- a/src/common/filter/str.js +++ /dev/null @@ -1,132 +0,0 @@ -export function startWith(str, prefix) { - if (typeof prefix === 'undefined' || prefix === null || prefix === '' || typeof str === 'undefined' || str === null || str.length === 0 || prefix.length > str.length) { - return false - } - - return str.substr(0, prefix.length) === prefix -} - -export function endWith(str, suffix) { - if (suffix === null || suffix === '' || str === null || str.length === 0 || suffix.length > str.length) { - return false - } - - return str.substring(str.length - suffix.length) === suffix -} - -//获取文件后缀名 -export function getExtension(filename) { - - if (!filename) { - return '' - } - - let index1 = filename.lastIndexOf('.') - if (index1 === -1) { - return '' - } - let index2 = filename.length - return filename.substring(index1, index2) -} - -//一个字符串包含子字符串 -export function containStr(father, child) { - - if (father === null || father === '') { - return false - } - return father.indexOf(child) !== -1 -} - -//把一个大小转变成方便读的格式 -//human readable file size -export function humanFileSize(bytes, si = false) { - let thresh = si ? 1000 : 1024 - if (Math.abs(bytes) < thresh) { - return bytes + ' B' - } - let units = si - ? ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] - : ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] - let u = -1 - do { - bytes /= thresh - ++u - } while (Math.abs(bytes) >= thresh && u < units.length - 1) - return bytes.toFixed(1) + ' ' + units[u] -} - -//把数字转换成中文大写金额 -export function numberCapital(num) { - let strOutput = '' - let strUnit = '仟佰拾亿仟佰拾万仟佰拾元角分' - num += '00' - let intPos = num.indexOf('.') - if (intPos >= 0) { - - num = num.substring(0, intPos) + num.substr(intPos + 1, 2) - } - strUnit = strUnit.substr(strUnit.length - num.length) - for (let i = 0; i < num.length; i++) { - - strOutput += '零壹贰叁肆伍陆柒捌玖'.substr(num.substr(i, 1), 1) + strUnit.substr(i, 1) - } - return strOutput.replace(/零角零分$/, '整').replace(/零[仟佰拾]/g, '零').replace(/零{2,}/g, '零').replace(/零([亿|万])/g, '$1').replace(/零+元/, '元').replace(/亿零{0,3}万/, '亿').replace(/^元/, '零元') -} - -//转换成首字母小写的驼峰法 -export function lowerCamel(str) { - - if (!str) { - console.error('不能转换空的驼峰字符串。') - return str - } - - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function (letter, index) { - return index === 0 ? letter.toLowerCase() : letter.toUpperCase() - }).replace(/\s+/g, '') -} - -//转换成全部小写的使用 /分隔的字符串. 比如uploadToken会得到 /upload/token -export function lowerSlash(str) { - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function (letter, index) { - return '/' + letter.toLowerCase() - }).replace(/\s+/g, '') -} - -/* - 名词变复数归纳总结 - 1.一般情况下,在名词后加“s”或“es”. - 2.以s,sh,ch,x结尾的名字,在名词后直接加“es”. - 3.以o结尾的名字,有两种情况: - 1)有生命的名词,在名词后加“es”. - 如:tomato-tomatoes potato-potatoes - 2)无生命的名字,在名字后加“s”. - 如:photo-photos radio-radios - 注意:使用java一律采用加“s”的策略 - 4.以辅音字母+y结尾的名词,将y改变为i,再加-es. - 元音字母+y结尾的名词则直接加s - */ -export function toPlural(singular) { - - if (!singular) { - console.error('不能转换空字符为复数形式。') - return singular - } - let length = singular.length - //一个字母的直接加个s. - if (length === 1) { - return singular + 's' - } - - let lastChar = singular[length - 1] - let lastSecondChar = singular[length - 2] - if (lastChar === 's' || lastChar === 'x' || (lastChar === 'h' && (lastSecondChar === 's' || lastSecondChar === 'c'))) { - return singular + 'es' - } else if (lastChar === 'y' && (lastSecondChar !== 'a' && lastSecondChar !== 'e' && lastSecondChar !== 'i' && lastSecondChar !== 'o' && lastSecondChar !== 'u')) { - return singular.substring(0, length - 1) + 'ies' - } else { - return singular + 's' - } - -} diff --git a/src/common/filter/time.js b/src/common/filter/time.js deleted file mode 100644 index 2ccbe17..0000000 --- a/src/common/filter/time.js +++ /dev/null @@ -1,379 +0,0 @@ -//定义一个转换器 -/** * 对Date的扩展,将 Date 转化为指定格式的String * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) - 可以用 1-2 个占位符 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) * eg: * (new - Date()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423 - * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04 - * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04 - * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04 - * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 - */ -if (!Date.prototype.format) { - Date.prototype.format = function (fmt) { - let o = { - 'M+': this.getMonth() + 1, //月份 - 'd+': this.getDate(), //日 - 'h+': this.getHours() % 12 === 0 ? 12 : this.getHours() % 12, //小时 - 'H+': this.getHours(), //小时 - 'm+': this.getMinutes(), //分 - 's+': this.getSeconds(), //秒 - 'q+': Math.floor((this.getMonth() + 3) / 3), //季度 - 'S': this.getMilliseconds() //毫秒 - } - let week = { - '0': '/u65e5', - '1': '/u4e00', - '2': '/u4e8c', - '3': '/u4e09', - '4': '/u56db', - '5': '/u4e94', - '6': '/u516d' - } - if (/(y+)/.test(fmt)) { - fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)) - } - if (/(E+)/.test(fmt)) { - fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '/u661f/u671f' : '/u5468') : '') + week[this.getDay() + '']) - } - for (let k in o) { - if (new RegExp('(' + k + ')').test(fmt)) { - fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) - } - } - return fmt - } -} - -if (!Date.prototype.setISO8601) { - Date.prototype.setISO8601 = function (string) { - let regexp = '([0-9]{4})(-([0-9]{2})(-([0-9]{2})' + - '(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?' + - '(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?' - if (string) { - let d = string.match(new RegExp(regexp)) - let offset = 0 - let date = new Date(d[1], 0, 1) - - if (d[3]) { - date.setMonth(d[3] - 1) - } - if (d[5]) { - date.setDate(d[5]) - } - if (d[7]) { - date.setHours(d[7]) - } - if (d[8]) { - date.setMinutes(d[8]) - } - if (d[10]) { - date.setSeconds(d[10]) - } - if (d[12]) { - date.setMilliseconds(Number('0.' + d[12]) * 1000) - } - if (d[14]) { - offset = (Number(d[16]) * 60) + Number(d[17]) - offset *= ((d[15] === '-') ? 1 : -1) - } - offset -= date.getTimezoneOffset() - let time = (Number(date) + (offset * 60 * 1000)) - this.setTime(Number(time)) - } - } -} - -//将js的时间对象,转换成yyyy-MM-dd格式的字符串 -export function simpleDate (d, fallback = null) { - if (d instanceof Date) { - return d.format('yyyy-MM-dd') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成MM-dd格式的字符串 -export function simpleMiniDate (d, fallback = null) { - if (d instanceof Date) { - return d.format('MM-dd') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成yyyy-MM-dd HH:mm:ss格式的字符串 -export function simpleDateTime (d, fallback = null) { - if (d instanceof Date) { - return d.format('yyyy-MM-dd HH:mm:ss') - } else if (d === null) { - return fallback - } else { - console.error('Time format error:' + d) - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成yyyy-MM-dd HH:mm格式的字符串 -export function simpleDateHourMinute (d, fallback = null) { - if (d instanceof Date) { - return d.format('yyyy-MM-dd HH:mm') - } else if (d === null) { - return fallback - } else { - console.error('Time format error:' + d) - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成HH:mm:ss格式的字符串 -export function simpleTime (d, fallback = null) { - - if (d instanceof Date) { - return d.format('HH:mm:ss') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成HH:mm格式的字符串 -export function simpleMinute (d, fallback = null) { - - if (d instanceof Date) { - return d.format('HH:mm') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成dd格式的字符串 -export function simpleDay (d, fallback = null) { - - if (d instanceof Date) { - return d.format('dd') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成yyyy-MM格式的字符串 -export function simpleYearAndMonth (d, fallback = null) { - - if (d instanceof Date) { - return d.format('yyyy-MM') - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将js的时间对象,转换成人性化的时间。当天:15:34 2017-04-03 -export function humanTime (d, fallback = null) { - - let now = new Date() - if (d instanceof Date) { - - if (now.toDateString() === d.toDateString()) { - return d.format('HH:mm') - } else { - return d.format('yyyy-MM-dd') - } - } else if (d === null) { - return fallback - } else { - return 'Invalid Date:' + d - } -} - -//将时间戳转换成易读的格式 -export function unixTimeStamp2simpleDate (timestamp) { - - if ((typeof timestamp) === 'number') { - let unixTimestamp = new Date(timestamp) - - return unixTimestamp.format('yyyy-MM-dd') - - } else { - - return 'Invalid timestamp' - - } -} - -//将时间戳转换成易读的格式 -export function unixTimeStamp2simpleDateTime (timestamp) { - - if ((typeof timestamp) === 'number') { - - let unixTimestamp = new Date(timestamp) - - return unixTimestamp.format('yyyy-MM-dd HH:mm') - - } else { - - return 'Invalid timestamp' - - } -} - -//将java时间字符串转换成易读的格式 -export function str2simpleDate (str) { - if (!str) { - return 'Invalid time' - } - - let d = new Date() - d.setISO8601(str) - - return d.format('yyyy-MM-dd') - -} - -//将java时间字符串转换成易读的格式 -export function str2simpleDateTime (str) { - - if (!str) { - return 'Invalid time' - } - - let d = new Date() - d.setISO8601(str) - return d.format('yyyy-MM-dd HH:mm') - -} - -//将java时间字符串转换成易读的格式 -export function str2DateTime (str) { - - if (!str) { - return 'Invalid time' - } - - let d = new Date() - d.setISO8601(str) - return d.format('yyyy-MM-dd HH:mm:ss') - -} - -//将java时间字符串转化成js date -export function str2Date (str) { - if (!str) { - return null - } - - if (str instanceof Date) { - return str - } - - //尝试转换时间戳 - if (typeof str === 'number') { - return new Date(str) - } - //尝试转换yyyy-MM-dd HH:mm:ss 这种格式 - if (str.length === 19) { - return new Date(Date.parse(str.replace(/-/g, '/'))) - } - - //尝试转换yyyy-MM-dd这种格式 - if (str.length === 10) { - return new Date(str) - } - - let d = new Date() - try { - d.setISO8601(str) - return d - } catch (e) { - console.error('error date format:' + str) - return null - } - -} - -//将时间戳转换成易读的格式 -export function str2simpleTime (str) { - - if (!str) { - return 'Invalid time' - } - let d = new Date() - d.setISO8601(str) - return d.format('HH:mm') -} - -//将时间戳转换成毫秒形式 -export function str2timeStamp (str) { - - if (!str) { - return 'Invalid time' - } - let d = new Date() - d.setISO8601(str) - return d.getTime() -} - -//将日期转换成相对于今天的星期几。昨天,明天,今天 -export function date2Weekday (date) { - let today = new Date() - let dateYear = date.getFullYear() - let dateMonth = date.getMonth() - let dateDate = date.getDate() - let todayYear = today.getFullYear() - let todayMonth = today.getMonth() - let todayDate = today.getDate() - if (dateYear === todayYear && dateMonth === todayMonth && Math.abs(dateDate - todayDate) <= 1) { - if (dateDate === todayDate) { - return '今天' - } else if (dateDate === (todayDate + 1)) { - return '明天' - } else if (dateDate === (todayDate - 1)) { - return '昨天' - } - } else { - if (date.getDay() === 0) { - return '星期日' - } else if (date.getDay() === 1) { - return '星期一' - } else if (date.getDay() === 2) { - return '星期二' - } else if (date.getDay() === 3) { - return '星期三' - } else if (date.getDay() === 4) { - return '星期四' - } else if (date.getDay() === 5) { - return '星期五' - } else if (date.getDay() === 6) { - return '星期六' - } - } -} - -//返回前一天的日期 -export function preDay (date) { - return new Date(date.getTime() - 24 * 60 * 60 * 1000) -} - -//返回后一天的日期 -export function nextDay (date) { - return new Date(date.getTime() + 24 * 60 * 60 * 1000) -} - -//这个是为了兼容pdf预览时pebble的过滤器。 -export function date (d, format) { - - if (d instanceof Date) { - return d.format(format) - } else { - return '' - } - -} diff --git a/src/common/fork/icheck/blue.css b/src/common/fork/icheck/blue.css deleted file mode 100644 index c290097..0000000 --- a/src/common/fork/icheck/blue.css +++ /dev/null @@ -1,59 +0,0 @@ -/* iCheck plugin Minimal skin, blue ------------------------------------ */ -.icheckbox_minimal-blue, -.iradio_minimal-blue { - display: inline-block; - *display: inline; - vertical-align: middle; - margin: 0; - padding: 0; - width: 18px; - height: 18px; - background: url(blue.png) no-repeat; - border: none; - cursor: pointer; -} - -.icheckbox_minimal-blue { - background-position: 0 0; -} - .icheckbox_minimal-blue.hover { - background-position: -20px 0; - } - .icheckbox_minimal-blue.checked { - background-position: -40px 0; - } - .icheckbox_minimal-blue.disabled { - background-position: -60px 0; - cursor: default; - } - .icheckbox_minimal-blue.checked.disabled { - background-position: -80px 0; - } - -.iradio_minimal-blue { - background-position: -100px 0; -} - .iradio_minimal-blue.hover { - background-position: -120px 0; - } - .iradio_minimal-blue.checked { - background-position: -140px 0; - } - .iradio_minimal-blue.disabled { - background-position: -160px 0; - cursor: default; - } - .iradio_minimal-blue.checked.disabled { - background-position: -180px 0; - } - -/* HiDPI support */ -@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { - .icheckbox_minimal-blue, - .iradio_minimal-blue { - background-image: url(blue@2x.png); - -webkit-background-size: 200px 20px; - background-size: 200px 20px; - } -} \ No newline at end of file diff --git a/src/common/fork/icheck/blue.png b/src/common/fork/icheck/blue.png deleted file mode 100644 index 8c42422..0000000 Binary files a/src/common/fork/icheck/blue.png and /dev/null differ diff --git a/src/common/fork/icheck/blue@2x.png b/src/common/fork/icheck/blue@2x.png deleted file mode 100644 index bca845c..0000000 Binary files a/src/common/fork/icheck/blue@2x.png and /dev/null differ diff --git a/src/common/fork/icheck/icheck-vue.js b/src/common/fork/icheck/icheck-vue.js deleted file mode 100644 index 396c635..0000000 --- a/src/common/fork/icheck/icheck-vue.js +++ /dev/null @@ -1,510 +0,0 @@ -/*! - * iCheck v1.0.2, http://git.io/arlzeA - * =================================== - * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization - * - * (c) 2013 Damir Sultanov, http://fronteed.com - * MIT Licensed - */ - -export default function iCheck($) { - - // Cached vars - var _iCheck = 'iCheck', - _iCheckHelper = _iCheck + '-helper', - _checkbox = 'checkbox', - _radio = 'radio', - _checked = 'checked', - _unchecked = 'un' + _checked, - _disabled = 'disabled', - _determinate = 'determinate', - _indeterminate = 'in' + _determinate, - _update = 'update', - _type = 'type', - _click = 'click', - _touch = 'touchbegin.i touchend.i', - _add = 'addClass', - _remove = 'removeClass', - _callback = 'trigger', - _label = 'label', - _cursor = 'cursor', - _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent); - - // Plugin init - $.fn[_iCheck] = function (options, fire) { - - // Walker - var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]', - stack = $(), - walker = function (object) { - object.each(function () { - var self = $(this); - - if (self.is(handle)) { - stack = stack.add(self); - } else { - stack = stack.add(self.find(handle)); - } - }); - }; - - // Check if we should operate with some method - if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) { - - // Normalize method's name - options = options.toLowerCase(); - - // Find checkboxes and radio buttons - walker(this); - - return stack.each(function () { - var self = $(this); - - if (options == 'destroy') { - tidy(self, 'ifDestroyed'); - } else { - operate(self, true, options); - } - - // Fire method's callback - if ($.isFunction(fire)) { - fire(); - } - }); - - // Customization - } else if (typeof options == 'object' || !options) { - - // Check if any options were passed - var settings = $.extend({ - checkedClass: _checked, - disabledClass: _disabled, - indeterminateClass: _indeterminate, - labelHover: true - }, options), - - selector = settings.handle, - hoverClass = settings.hoverClass || 'hover', - focusClass = settings.focusClass || 'focus', - activeClass = settings.activeClass || 'active', - labelHover = !!settings.labelHover, - labelHoverClass = settings.labelHoverClass || 'hover', - - // Setup clickable area - area = ('' + settings.increaseArea).replace('%', '') | 0; - - // Selector limit - if (selector == _checkbox || selector == _radio) { - handle = 'input[type="' + selector + '"]'; - } - - // Clickable area limit - if (area < -50) { - area = -50; - } - - // Walk around the selector - walker(this); - - return stack.each(function () { - var self = $(this); - - // If already customized - tidy(self); - - var node = this, - id = node.id, - - // Layer styles - offset = -area + '%', - size = 100 + (area * 2) + '%', - layer = { - position: 'absolute', - top: offset, - left: offset, - display: 'block', - width: size, - height: size, - margin: 0, - padding: 0, - background: '#fff', - border: 0, - opacity: 0 - }, - - // Choose how to hide input - hide = _mobile ? { - position: 'absolute', - visibility: 'hidden' - } : area ? layer : { - position: 'absolute', - opacity: 0 - }, - - // Get proper class - className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio, - - // Find assigned labels - label = $(_label + '[for="' + id + '"]').add(self.closest(_label)), - - // Check ARIA option - aria = !!settings.aria, - - // Set ARIA placeholder - ariaID = _iCheck + '-' + Math.random().toString(36).substr(2, 6), - - // Parent & helper - parent = '
')[_callback]('ifCreated').parent().append(settings.insert); - - // Layer addition - helper = $('').css(layer).appendTo(parent); - - // Finalize customization - self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide); - !!settings.inheritClass && parent[_add](node.className || ''); - !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id); - parent.css('position') == 'static' && parent.css('position', 'relative'); - operate(self, true, _update); - - // Label events - if (label.length) { - label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function (event) { - var type = event[_type], - item = $(this); - - // Do nothing if input is disabled - if (!node[_disabled]) { - - // Click - if (type == _click) { - if ($(event.target).is('a')) { - return; - } - operate(self, false, true); - - // Hover state - } else if (labelHover) { - - // mouseout|touchend - if (/ut|nd/.test(type)) { - parent[_remove](hoverClass); - item[_remove](labelHoverClass); - } else { - parent[_add](hoverClass); - item[_add](labelHoverClass); - } - } - - if (_mobile) { - event.stopPropagation(); - } else { - return false; - } - } - }); - } - - // Input events - self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function (event) { - var type = event[_type], - key = event.keyCode; - - // Click - if (type == _click) { - return false; - - // Keydown - } else if (type == 'keydown' && key == 32) { - if (!(node[_type] == _radio && node[_checked])) { - if (node[_checked]) { - off(self, _checked); - } else { - on(self, _checked); - } - } - - return false; - - // Keyup - } else if (type == 'keyup' && node[_type] == _radio) { - !node[_checked] && on(self, _checked); - - // Focus/blur - } else if (/us|ur/.test(type)) { - parent[type == 'blur' ? _remove : _add](focusClass); - } - }); - - // Helper events - helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function (event) { - var type = event[_type], - - // mousedown|mouseup - toggle = /wn|up/.test(type) ? activeClass : hoverClass; - - // Do nothing if input is disabled - if (!node[_disabled]) { - - // Click - if (type == _click) { - operate(self, false, true); - - // Active and hover states - } else { - - // State is on - if (/wn|er|in/.test(type)) { - - // mousedown|mouseover|touchbegin - parent[_add](toggle); - - // State is off - } else { - parent[_remove](toggle + ' ' + activeClass); - } - - // Label hover - if (label.length && labelHover && toggle == hoverClass) { - - // mouseout|touchend - label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass); - } - } - - if (_mobile) { - event.stopPropagation(); - } else { - return false; - } - } - }); - }); - } else { - return this; - } - }; - - // Do something with inputs - function operate(input, direct, method) { - var node = input[0], - state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked, - active = method == _update ? { - checked: node[_checked], - disabled: node[_disabled], - indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false' - } : node[state]; - - // Check, disable or indeterminate - if (/^(ch|di|in)/.test(method) && !active) { - on(input, state); - - // Uncheck, enable or determinate - } else if (/^(un|en|de)/.test(method) && active) { - off(input, state); - - // Update - } else if (method == _update) { - - // Handle states - for (var each in active) { - if (active[each]) { - on(input, each, true); - } else { - off(input, each, true); - } - } - - } else if (!direct || method == 'toggle') { - - // Helper or label was clicked - if (!direct) { - input[_callback]('ifClicked'); - } - - // Toggle checked state - if (active) { - if (node[_type] !== _radio) { - off(input, state); - } - } else { - on(input, state); - } - } - } - - // Add checked, disabled or indeterminate state - function on(input, state, keep) { - var node = input[0], - parent = input.parent(), - checked = state == _checked, - indeterminate = state == _indeterminate, - disabled = state == _disabled, - callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', - regular = option(input, callback + capitalize(node[_type])), - specific = option(input, state + capitalize(node[_type])); - - // Prevent unnecessary actions - if (node[state] !== true) { - - // Toggle assigned radio buttons - if (!keep && state == _checked && node[_type] == _radio && node.name) { - var form = input.closest('form'), - inputs = 'input[name="' + node.name + '"]'; - - inputs = form.length ? form.find(inputs) : $(inputs); - - inputs.each(function () { - if (this !== node && $(this).data(_iCheck)) { - off($(this), state); - } - }); - } - - // Indeterminate state - if (indeterminate) { - - // Add indeterminate state - node[state] = true; - - // Remove checked state - if (node[_checked]) { - off(input, _checked, 'force'); - } - - // Checked or disabled state - } else { - - // Add checked or disabled state - if (!keep) { - node[state] = true; - } - - // Remove indeterminate state - if (checked && node[_indeterminate]) { - off(input, _indeterminate, false); - } - } - - // Trigger callbacks - callbacks(input, checked, state, keep); - } - - // Add proper cursor - if (node[_disabled] && !!option(input, _cursor, true)) { - parent.find('.' + _iCheckHelper).css(_cursor, 'default'); - } - - // Add state class - parent[_add](specific || option(input, state) || ''); - - // Set ARIA attribute - if (!!parent.attr('role') && !indeterminate) { - parent.attr('aria-' + (disabled ? _disabled : _checked), 'true'); - } - - // Remove regular state class - parent[_remove](regular || option(input, callback) || ''); - } - - // Remove checked, disabled or indeterminate state - function off(input, state, keep) { - var node = input[0], - parent = input.parent(), - checked = state == _checked, - indeterminate = state == _indeterminate, - disabled = state == _disabled, - callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', - regular = option(input, callback + capitalize(node[_type])), - specific = option(input, state + capitalize(node[_type])); - - // Prevent unnecessary actions - if (node[state] !== false) { - - // Toggle state - if (indeterminate || !keep || keep == 'force') { - node[state] = false; - } - - // Trigger callbacks - callbacks(input, checked, callback, keep); - } - - // Add proper cursor - if (!node[_disabled] && !!option(input, _cursor, true)) { - parent.find('.' + _iCheckHelper).css(_cursor, 'pointer'); - } - - // Remove state class - parent[_remove](specific || option(input, state) || ''); - - // Set ARIA attribute - if (!!parent.attr('role') && !indeterminate) { - parent.attr('aria-' + (disabled ? _disabled : _checked), 'false'); - } - - // Add regular state class - parent[_add](regular || option(input, callback) || ''); - } - - // Remove all traces - function tidy(input, callback) { - if (input.data(_iCheck)) { - - // Remove everything except input - input.parent().html(input.attr('style', input.data(_iCheck).s || '')); - - // Callback - if (callback) { - input[_callback](callback); - } - - // Unbind events - input.off('.i').unwrap(); - $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i'); - } - } - - // Get some option - function option(input, state, regular) { - if (input.data(_iCheck)) { - return input.data(_iCheck).o[state + (regular ? '' : 'Class')]; - } - } - - // Capitalize some string - function capitalize(string) { - return string.charAt(0).toUpperCase() + string.slice(1); - } - - // Executable handlers - function callbacks(input, checked, callback, keep) { - if (!keep) { - if (checked) { - input[_callback]('ifToggled'); - } - - input[_callback]('ifChanged')[_callback]('if' + capitalize(callback)); - } - } -} - diff --git a/src/common/i18n/index.js b/src/common/i18n/index.js deleted file mode 100644 index 677c434..0000000 --- a/src/common/i18n/index.js +++ /dev/null @@ -1,567 +0,0 @@ -// 准备翻译的语言环境信息 -let i18nMessage = { - en: { - eyeblueTank: "EyeblueTank", - dashboard: { - totalInvokeNum: 'Total PV', - weekRate: 'Week', - dayRate: 'Day', - yesterdayInvoke: 'Yesterday PV', - totalUV: 'Total UV', - yesterdayUV: 'Yesterday UV', - totalMatterNum: 'Total file num', - yesterdayMatterNum: 'Yesterday File Num', - totalFileSize: 'Total File Size', - yesterdayMatterSize: 'Yesterday File Size', - recentDayInvokeUV: 'Recent {0} days PV/UV', - downloadMatterTop10: 'File download TOP10', - activeIpTop10: 'Active IP TOP10', - loading: 'loading...', - date: 'Date', - num: 'Num' - }, - install: { - configMysql: "Config MySQL", - port: "Port", - schema: "Schema", - mysqlConnectionPass: "Connect MySQL Ok", - testMysqlConnection: "Tes MySQL Connection", - notice: "Notice", - mysqlNotice1: "If Mysql and EyeblueTank installed on the same server, Host is 127.0.0.1", - mysqlNotice2: "Your mysql account must have access to create table, or the second step will fail.", - validateMysqlFirst: "Please test the mysql connection firstly.", - preStep: "Pre Step", - nextStep: "Next Step", - createTable: "Craete Tables", - installed: "Installed", - installedButMissing: "Installed, but missing fields", - toBeInstalled: "To be installed", - allFields: "All fields", - missingFields: "Missing fields", - tableNotice: "'Create Tables' will trigger the following actions:", - tableNotice1: "If a table not exist, create it.", - tableNotice2: "If a table exist and no fields missing, nothing will do on this table.", - tableNotice3: "If a table exist but some fields is missing, it will add the missing fields.", - tableNotice4: "If a table exist and some fields not necessary, nothing will do on this table.", - oneKeyCreate: "Create Tables", - createFinish: "Finish Creating Tables", - createTableSuccess: "Create tables successfully", - crateTableFirst: "Please click 'Create Tables'", - setAdministrator: "Config Administrator", - detectAdministrator: "Detect the following administrators:", - useOrCreateAdministrator: "You can validate one of them, or you can create a new one.", - validateAdministrator: "Validate administrator", - createAdministrator: "Create administrator", - administratorUsername: "username", - administratorPassword: "password", - administratorRePassword: "Enter administrator password again", - usernameRule: "EyeblueTank will use username as directory name, so only lowercase letter and number and _ is permitted.", - congratulationInstall: "Congratulations, install successfully!", - configAdminFirst: "Please config administrator first.", - createAdminSuccess: "Create administrator successfully!", - validateAdminSuccess: "Validate administrator successfully!", - enterHome: "Click to enter home", - charset: "Charset", - }, - layout: { - allFiles: "Files", - myShare: "My Share", - setting: "Setting", - dashboard: "Dashboard", - users: "Users", - logout: "Logout", - about: "About", - install: "Install", - dragMouseUp: "Put file here~" - }, - matter: { - file: "File", - directory: "Directory", - rename: "Rename", - download: "Download", - delete: "Delete", - more: "More", - share: "Share", - close: "Close", - size: "Size", - preview: "Preview", - move: "Move", - upload: "Upload", - create: "Create", - createTime: "Create Time", - updateTime: "Update Time", - root: "Root", - fillInPicLink: "Fill in Picture Link", - rePick: "Re Choose", - chooseImage: "Choose Image", - uploadMode: "Upload Mode", - fillMode: "Fill Mode", - sizeExceedLimit: "File size exceed limit {0}>{1}", - setPublic: "Set as public", - setPrivate: "Set as private", - copyLink: "Copy Link", - enterName: "Please enter name", - publicFileEveryoneCanVisit: "Public file, anyone can access", - fileDetail: "File info", - expire: "Expire", - copyLinkAndCode: "Copy link and code", - uploaded: "Uploaded", - speed: "Speed", - fileInfo: "File basic info", - fileName: "Filename", - path: "Path", - copyPath: "Copy path", - publicOrPrivate: "Public or private", - privateInfo: "Private file, only self or auth user can download", - publicInfo: "Public file, anyone can download", - downloadTimes: "Download times", - operations: "Operation", - oneTimeLink: "One time link", - oneTimeLinkInfo: "One time link will expire after downloading, click to copy", - imageCache: "Image cache", - searchFile: "Search file", - noContentYet: "No content under this directory yet", - allFiles: "All Files", - newDirectory: "New directory", - notChoose: "Not choose any file", - exceed1000: "Exceed file limit 1000" - }, - router: { - allFiles: "All Files", - fileDetail: "File Detail", - login: "Login", - autoLogin: "Auto Login", - register: "Register", - users: "Users", - userDetail: "User Detail", - changePassword: "Change password", - editUser: "Edit User", - createUser: "Create User", - shareDetail: "Share Detail", - myShare: "My Share", - dashboard: "Dashboard", - install: "Install", - setting: "Setting" - }, - preference: { - websiteName: "Website Name", - logo: "Logo", - logoSquare: "Logo will be cropped to square size", - onlyAllowIco: "Only .ico allowed", - copyright: "Copyright (support html)", - extraInfo: "Extra info (support html)", - zipMaxNumLimit: "Zip download max num limit", - zipMaxSizeLimit: "Zip download max size limit(B)", - current: "Current", - noLimit: "No limit", - userDefaultSizeLimit: "User default size limit(B) ", - docLink: "Document Link", - tankDocLink: "https://tank-doc.eyeblue.cn", - allowRegister: "Allow register", - systemCleanup: "System Cleanup", - systemCleanupDescription: "This operation will cleanup everything except administrators' data", - systemCleanupPrompt: "This operation will cleanup everything except administrators' account data, please input login password.", - officeUrl: "Office Preview Url", - }, - share: { - shareDetail: "Share Detail", - shareTime: "Share Time", - expireTime: "Expire Time", - noExpire: "Never Expire", - expired: "Expired", - copyLinkAndCode: "Copy Link And Code", - shareSuccess: "Share Successfully", - sharer: "Share Person", - link: "Link", - copyLink: "Copy Link", - code: "Code", - copyCode: "Copy Code", - copySuccess: "Copy Successfully", - more: "More", - cancelShare: "Cancel Share", - getLink: "Get Link", - allFiles: "All Files", - noContent: "No content in this directory", - enterCode: "Please enter code", - getFiles: "Get Files", - codeError: "Code Error", - cancelPrompt: "This operation will cancel sharing forever, continue?", - hour: "1 Hour", - day: "1 Day", - week: "1 Week", - month: "1 Month", - year: "1 Year", - infinity: "Forever", - }, - user: { - redirecting: "Redirecting...", - oldPassword: "Old Password", - newPassword: "New Password", - confirmNewPassword: "Confirm New Password", - cannotBeNull: "Cannot be null!", - passwordNotSame: "Old and new password not same!", - role: "Role", - singleFileSizeLimit: "Single File Limit", - totalFileSizeLimit: "Total Space Limit", - current: "Current", - noLimit: "No Limit", - totalFileSize: "Used Space", - status: "Status", - lastLoginIp: "Last Login Ip", - lastLoginTime: "Last Login Time", - resetPassword: "Reset Password", - transfiguration: "Transfiguration", - changePassword: "Edit Password", - enterPassword: "Enter Password", - profile: "Profile", - avatar: "Avatar", - username: "Username", - password: "Password", - confirmPassword: "Confirm Password", - disabled: "Disabled", - disableUser: "Disable this user", - activeUser: "Active this user", - welcomeLogin: "Welcome Login", - logining: "Login...", - login: "Login", - toToRegister: "Go To Register", - welcomeRegister: "Welcome Register", - registering: "Login...", - register: "Register", - goToLogin: "Go To Login", - roleGuest: "Guest", - roleUser: "User", - roleAdministrator: "Administrator", - statusActive: "Ok", - statusDisabled: "Disabled", - webdavLink: "WebDAV Link", - docLink: "Document Link", - }, - model: { - usernameRule: "only lowercase letter and number and _ is permitted.", - passwordRule: "Password must have more than 6 chars", - linkCodeText: "Link:{0} Code:{1}", - copyLinkCodeSuccess: "Copy Link and Code successfully", - transfigurationPromptText: "Transfiguration Prompt", - transfigurationPrompt: "You will login as this user.Please visit this link in other browser, if in current browser, you will logout.{0}", - }, - plugin: { - cannotPreview: "Cannot Preview", - emptyHintDefault: "No Items", - everyPage: "Every Page", - items: "Items", - total: "Total", - clickRefresh: "Click To Refresh", - }, - selectAll: "All", - edit: "Edit", - createTime: "Create Time", - download: "Download", - close: "Close", - required: "Required", - cancel: "Cancel", - delete: "Delete", - actionCanNotRevertConfirm: "This action cannot be reverted, confirm?", - prompt: "Prompt", - confirm: "Confirm", - copy: "Copy", - showMore: "Show More", - username: "Username", - password: "Password", - submit: "Submit", - save: "Save", - create: "Create", - finish: "Finish", - operationSuccess: "Operation success", - notFound: "404 Not Found", - login: "Login", - logout: "Logout", - yes: "Yes", - no: "No", - all: "All", - refresh: "refresh", - }, - zh: { - eyeblueTank: "蓝眼云盘", - dashboard: { - totalInvokeNum: '总PV', - weekRate: '周环比', - dayRate: '日环比', - yesterdayInvoke: '昨日PV', - totalUV: '总UV', - yesterdayUV: '昨日UV', - totalMatterNum: '总文件数', - yesterdayMatterNum: '昨日文件数', - totalFileSize: '文件总大小', - yesterdayMatterSize: '昨日文件大小', - recentDayInvokeUV: '最近{0}日PV/UV', - downloadMatterTop10: '文件下载量TOP10', - activeIpTop10: '活跃IP TOP10', - loading: '加载中…', - date: '日期', - num: '数量' - }, - install: { - configMysql: "配置MySQL", - port: "端口", - schema: "库名", - mysqlConnectionPass: "MySQL连接测试通过", - testMysqlConnection: "测试MySQL连接", - notice: "注意", - mysqlNotice1: "如果数据库和蓝眼云盘安装在同一台服务器,Host可以直接填写 127.0.0.1。", - mysqlNotice2: "数据库账户的权限要求要能够创建表,否则第二步\"创建表\"操作会出错", - validateMysqlFirst: "请首先验证数据库连接", - preStep: "上一步", - nextStep: "下一步", - createTable: "创建表", - installed: "已安装", - installedButMissing: "已安装,字段缺失", - toBeInstalled: "待安装", - allFields: "所有字段", - missingFields: "缺失字段", - tableNotice: "点击\"一键建表\"后会按照以下逻辑执行操作:", - tableNotice1: "如果某表不存在,则直接创建表。", - tableNotice2: "如果某表存在并且字段齐全,那么不会对该表做任何操作。", - tableNotice3: "如果某表存在但是部分字段缺失,那么会在该表中增加缺失字段。", - tableNotice4: "如果表中有多余的字段(多余字段即不是蓝眼云盘需要的字段),不会做删除处理,而会维持原样。", - oneKeyCreate: "一键建表", - createFinish: "建表完成", - createTableSuccess: "建表成功", - crateTableFirst: "请首先点击'一键建表'", - setAdministrator: "设置管理员", - detectAdministrator: "检测到系统中已经存在有以下管理员:", - useOrCreateAdministrator: "你可以使用其中一位管理员的用户名和密码进行验证,或者创建一位新的管理员账户", - validateAdministrator: "验证管理员账户", - createAdministrator: "创建管理员账户", - administratorUsername: "创建管理员账户", - administratorPassword: "管理员密码", - administratorRePassword: "再次输入密码", - usernameRule: "由于用户名将作为文件上传的目录,因此只允许字母数字以及\"_\"。", - congratulationInstall: "恭喜,安装成功!", - configAdminFirst: "请首先配置管理员信息!", - createAdminSuccess: "创建管理员成功!", - validateAdminSuccess: "验证管理员成功!", - enterHome: "点击进入首页", - charset: "编码", - }, - layout: { - allFiles: "所有文件", - myShare: "我的分享", - setting: "网站设置", - dashboard: "监控统计", - users: "用户列表", - logout: "退出登录", - about: "关于", - install: "安装网站", - dragMouseUp: "可以松手啦~" - }, - matter: { - file: "文件", - directory: "文件夹", - rename: "重命名", - download: "下载", - delete: "删除", - more: "更多", - share: "分享", - close: "关闭", - size: "大小", - preview: "预览", - move: "移动", - upload: "上传", - create: "新建", - createTime: "创建日期", - updateTime: "修改日期", - root: "根目录", - fillInPicLink: "请填写图片链接", - rePick: "重新选择", - chooseImage: "选择图片", - uploadMode: "上传模式", - fillMode: "填写模式", - sizeExceedLimit: "文件大小超过了限制{0}>{1}", - setPublic: "设置为公有文件", - setPrivate: "设置为私有文件", - copyLink: "复制下载链接", - enterName: "请输入名称", - publicFileEveryoneCanVisit: "公有文件,任何人可以访问", - fileDetail: "文件详情", - expire: "有效期", - copyLinkAndCode: "复制链接+提取码", - uploaded: "已上传", - speed: "速度", - fileInfo: "文件基本信息", - fileName: "文件名", - path: "路径", - copyPath: "复制路径", - publicOrPrivate: "文件公开性", - privateInfo: "私有文件,只有自己或者授权的用户可以下载", - publicInfo: "公有文件,任何人可以通过链接下载", - downloadTimes: "下载次数", - operations: "操作", - oneTimeLink: "一次性链接", - oneTimeLinkInfo: "使用一次性链接下载后链接立即失效,可以分享这个链接给朋友,点击复制", - imageCache: "图片缓存", - searchFile: "搜索文件", - noContentYet: "该目录下暂无任何内容", - allFiles: "全部文件", - newDirectory: "新建文件夹", - notChoose: "没有选择文件", - exceed1000: "最多只能同时选取1000个文件" - }, - router: { - allFiles: "全部文件", - fileDetail: "文件详情", - login: "登录", - autoLogin: "自动登录", - register: "注册", - users: "用户列表", - userDetail: "用户详情", - changePassword: "修改密码", - editUser: "编辑用户", - createUser: "创建用户", - shareDetail: "分享详情", - myShare: "我的分享", - dashboard: "监控统计", - install: "安装网站", - setting: "网站设置" - }, - preference: { - websiteName: "网站名称", - logo: "Logo", - logoSquare: "logo请使用正方形图片,否则在显示时会裁剪成正方形", - onlyAllowIco: "只允许上传.ico图标", - copyright: "版权信息(支持html)", - extraInfo: "备案信息(支持html)", - zipMaxNumLimit: "zip下载数量限制", - zipMaxSizeLimit: "zip下载大小限制(B)", - current: "当前值", - noLimit: "无限制", - userDefaultSizeLimit: "用户默认总大小限制(B) ", - docLink: "文档链接", - tankDocLink: "https://tank-doc.eyeblue.cn/zh", - allowRegister: "允许自主注册", - systemCleanup: "重置系统", - systemCleanupDescription: "重置系统将清空除管理员账号外所有数据", - systemCleanupPrompt: "重置系统将清空除管理员账号外所有数据,事关重大,请输入登录密码", - officeUrl: "Office预览链接", - }, - share: { - shareDetail: "分享详情", - shareTime: "分享时间", - expireTime: "失效时间", - noExpire: "永久有效", - expired: "已过期", - copyLinkAndCode: "复制链接+提取码", - shareSuccess: "分享成功", - sharer: "分享者", - link: "链接", - copyLink: "复制链接", - code: "提取码", - copyCode: "复制提取码", - copySuccess: "复制成功", - more: "更多", - cancelShare: "取消分享", - getLink: "获取链接", - allFiles: "全部文件", - noContent: "该目录下暂无任何内容", - enterCode: "请输入提取码", - getFiles: "提取文件", - codeError: "提取码错误", - cancelPrompt: "此操作将永久取消该分享, 是否继续?", - hour: "1小时", - day: "1天", - week: "1周", - month: "1个月", - year: "1年", - infinity: "永远有效", - }, - user: { - redirecting: "正在转跳...", - oldPassword: "旧密码", - newPassword: "新密码", - confirmNewPassword: "确认新密码", - cannotBeNull: "不能为空!", - passwordNotSame: "两次输入不一致!", - role: "角色", - singleFileSizeLimit: "单文件限制", - totalFileSizeLimit: "总空间限制", - current: "当前值", - noLimit: "无限制", - totalFileSize: "已使用空间", - status: "状态", - lastLoginIp: "上次登录IP", - lastLoginTime: "上次登录时间", - resetPassword: "重置密码", - transfiguration: "变身", - changePassword: "修改密码", - enterPassword: "输入新密码", - profile: "个人详情", - avatar: "头像", - username: "用户名", - password: "密码", - confirmPassword: "确认密码", - disabled: "已禁用", - disableUser: "禁用该用户", - activeUser: "激活该用户", - welcomeLogin: "欢迎登录", - logining: "正在登录...", - login: "登录", - toToRegister: "立即注册", - welcomeRegister: "欢迎注册", - registering: "正在登录...", - register: "登录", - goToLogin: "前往登录", - roleGuest: "游客", - roleUser: "注册用户", - roleAdministrator: "管理员", - statusActive: "正常", - statusDisabled: "禁用", - webdavLink: "WebDAV 地址", - docLink: "文档链接", - }, - model: { - usernameRule: "用户名只能包含字母,数字和\"_\"", - passwordRule: "密码长度至少为6位", - linkCodeText: "链接:{0} 提取码:{1}", - copyLinkCodeSuccess: "复制链接提取码成功", - transfigurationPromptText: "变身提示", - transfigurationPrompt: "您将使用该用户的身份登录。请复制以下链接到其他浏览器访问,在当前浏览器访问会导致当前用户登录信息失效。{0}", - }, - plugin: { - cannotPreview: "无法预览", - emptyHintDefault: "没有符合条件的项目", - everyPage: "每页", - items: "条", - total: "共", - clickRefresh: "点击刷新", - }, - selectAll: "全选", - edit: "修改", - createTime: "创建时间", - download: "下载", - close: "关闭", - required: "必填", - cancel: "取消", - delete: "删除", - actionCanNotRevertConfirm: "此操作不可撤回, 是否继续?", - prompt: "提示", - confirm: "确定", - copy: "复制", - showMore: "显示更多", - username: "用户名", - password: "密码", - submit: "提交", - save: "保存", - create: "创建", - finish: "完成", - operationSuccess: "操作成功", - notFound: "404 页面找不到", - login: "登录", - logout: "退出", - yes: "是", - no: "否", - all: "所有", - refresh: "刷新", - - } -} -export default i18nMessage diff --git a/src/common/util/BrowserUtil.js b/src/common/util/BrowserUtil.js deleted file mode 100644 index 6d359e2..0000000 --- a/src/common/util/BrowserUtil.js +++ /dev/null @@ -1,14 +0,0 @@ -export default class BrowserUtil { - - //只支持zh和en - static browserLang() { - let lang = navigator.language || navigator.userLanguage;//常规浏览器语言和IE浏览器 - lang = lang.substr(0, 2);//截取lang前2位字符 - if (lang === "zh") { - return "zh" - } else { - return "en" - } - } - -} diff --git a/src/common/util/FileUtil.js b/src/common/util/FileUtil.js deleted file mode 100644 index 7bc5d70..0000000 --- a/src/common/util/FileUtil.js +++ /dev/null @@ -1,88 +0,0 @@ -import {getMimeType} from "./MimeUtil"; -import {endWith, getExtension, startWith} from "../filter/str"; - -export default class FileUtil { - - - static isImage(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'image'); - } - - static isPdf(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'application/pdf'); - } - - static isText(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'text'); - } - - static isDoc(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'application/msword') || startWith(mimeType, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); - } - - static isPpt(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'application/vnd.ms-powerpoint') || startWith(mimeType, 'application/vnd.openxmlformats-officedocument.presentationml.presentation'); - } - - static isXls(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'application/vnd.ms-excel') || startWith(mimeType, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - } - - static isAudio(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'audio'); - } - - static isVideo(name) { - let mimeType = getMimeType(name) - return startWith(mimeType, 'video'); - } - - static isPsd(name) { - let extension = getExtension(name) - return extension === '.psd'; - } - - /** - * 根据名字获取对应的图标。imageIcon传值了,那么图片格式采用imageIcon - * @param name - * @param idDir - */ - static getIcon(name, idDir = false) { - - if (idDir) { - return require("../../assets/img/file/folder.svg") - } - - if (FileUtil.isPdf(name)) { - return require("../../assets/img/file/pdf.svg") - } else if (FileUtil.isDoc(name)) { - return require("../../assets/img/file/doc.svg") - } else if (FileUtil.isPpt(name)) { - return require("../../assets/img/file/ppt.svg") - } else if (FileUtil.isXls(name)) { - return require("../../assets/img/file/xls.svg") - } else if (FileUtil.isAudio(name)) { - return require("../../assets/img/file/audio.svg") - } else if (FileUtil.isVideo(name) || getExtension(name) === ".mkv") { - return require("../../assets/img/file/video.svg") - } else if (FileUtil.isText(name)) { - return require("../../assets/img/file/text.svg") - } else if (FileUtil.isPsd(name)) { - return require("../../assets/img/file/psd.svg") - } else if (FileUtil.isImage(name)) { - return require("../../assets/img/file/image.svg") - } else if (endWith(name, 'zip') || endWith(name, 'rar') || endWith(name, '7z') || endWith(name, 'tar') || endWith(name, 'tar') || endWith(name, 'gz')) { - return require("../../assets/img/file/archive.svg") - } else { - return require("../../assets/img/file/file.svg") - } - - } -} diff --git a/src/common/util/ImageUtil.js b/src/common/util/ImageUtil.js deleted file mode 100644 index 1b27d5b..0000000 --- a/src/common/util/ImageUtil.js +++ /dev/null @@ -1,55 +0,0 @@ -//应用的占位图片,到处都要用到。 生成网址:http://png-pixel.com/ -//rgb(240,240,240) -import NumberUtil from "./NumberUtil"; -import {getExtension} from "./MimeUtil"; - -export var IMAGE_PLACEHOLDER_10_10 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAEUlEQVR42mP88J8BAzAOZUEAoc4TYb5Mv7IAAAAASUVORK5CYII="; - -export var IMAGE_PLACEHOLDER_20_7 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAQAAACiwqWzAAAAEklEQVR42mP88J+BKMA4IhUCAJ1VDZFobOQaAAAAAElFTkSuQmCC"; - -export var IMAGE_PLACEHOLDER_4_3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAQAAAAe/WZNAAAAEElEQVR42mP88J8BDBgxGABf8QXRk11CBwAAAABJRU5ErkJggg=="; - -export var IMAGE_PLACEHOLDER_16_9 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAQAAACRI2S5AAAAEklEQVR42mP88J8BL2AcVQAGACSgEXHKPyH/AAAAAElFTkSuQmCC"; - -export var IMAGE_PLACEHOLDER_2_1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAQAAAAeXLZtAAAAE0lEQVR42mP88J+BKMA4qpC+CgH2ThNhpeSxLAAAAABJRU5ErkJggg=="; - - -/** - * 统一处理图片url。 - * @param url 原图片路径 - * @param origin 是否使用原图,一般在查看图片详情的时候使用 - * @param width 如果origin=false 裁剪的宽度 - * @param height 如果origin=false 裁剪的高度 - * @returns - */ -export function handleImageUrl(url = null, origin = false, width = 200, height = 200) { - if (url) { - if (origin) { - return url; - } else { - //目前支持这几种格式的处理。 jpg jpeg png tif tiff bmp gif - let supportExtensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp", ".gif"]; - let extension = getExtension(url); - if (supportExtensions.indexOf(extension) === -1) { - return url; - } else { - return url + "?ir=fill_" + width + "_" + height - } - } - } else { - if (NumberUtil.fractionEqual(1, 1, width, height)) { - return IMAGE_PLACEHOLDER_10_10; - } else if (NumberUtil.fractionEqual(20, 7, width, height)) { - return IMAGE_PLACEHOLDER_20_7; - } else if (NumberUtil.fractionEqual(4, 3, width, height)) { - return IMAGE_PLACEHOLDER_4_3; - } else if (NumberUtil.fractionEqual(16, 9, width, height)) { - return IMAGE_PLACEHOLDER_16_9; - } else if (NumberUtil.fractionEqual(2, 1, width, height)) { - return IMAGE_PLACEHOLDER_2_1; - } else { - return IMAGE_PLACEHOLDER_10_10; - } - - } -} diff --git a/src/common/util/JsonUtils.js b/src/common/util/JsonUtils.js deleted file mode 100644 index d2c3020..0000000 --- a/src/common/util/JsonUtils.js +++ /dev/null @@ -1,21 +0,0 @@ -//将一个json字符串转换成 json 数组 -export function parseList(str) { - if (!str) { - return [] - } - if (str instanceof Array) { - return str; - } - try { - let list = JSON.parse(str); - if (list instanceof Array) { - return list; - } else { - console.error("不能将" + str + "转换成数组"); - return []; - } - } catch (e) { - console.error("不能将" + str + "转换成JSON"); - return []; - } -} diff --git a/src/common/util/MimeUtil.js b/src/common/util/MimeUtil.js deleted file mode 100644 index 2b98a4b..0000000 --- a/src/common/util/MimeUtil.js +++ /dev/null @@ -1,639 +0,0 @@ -let MimeUtil = { - '.323': 'text/h323', - '.3g2': 'video/3gpp2', - '.3gp': 'video/3gpp', - '.3gp2': 'video/3gpp2', - '.3gpp': 'video/3gpp', - '.7z': 'application/x-7z-compressed', - '.aa': 'audio/audible', - '.AAC': 'audio/aac', - '.aaf': 'application/octet-stream', - '.aax': 'audio/vnd.audible.aax', - '.ac3': 'audio/ac3', - '.aca': 'application/octet-stream', - '.accda': 'application/msaccess.addin', - '.accdb': 'application/msaccess', - '.accdc': 'application/msaccess.cab', - '.accde': 'application/msaccess', - '.accdr': 'application/msaccess.runtime', - '.accdt': 'application/msaccess', - '.accdw': 'application/msaccess.webapplication', - '.accft': 'application/msaccess.ftemplate', - '.acx': 'application/internet-property-stream', - '.AddIn': 'text/xml', - '.ade': 'application/msaccess', - '.adobebridge': 'application/x-bridge-url', - '.adp': 'application/msaccess', - '.ADT': 'audio/vnd.dlna.adts', - '.ADTS': 'audio/aac', - '.afm': 'application/octet-stream', - '.ai': 'application/postscript', - '.aif': 'audio/aiff', - '.aifc': 'audio/aiff', - '.aiff': 'audio/aiff', - '.air': 'application/vnd.adobe.air-application-installer-package+zip', - '.amc': 'application/mpeg', - '.anx': 'application/annodex', - '.apk': 'application/vnd.android.package-archive', - '.application': 'application/x-ms-application', - '.art': 'image/x-jg', - '.asa': 'application/xml', - '.asax': 'application/xml', - '.ascx': 'application/xml', - '.asd': 'application/octet-stream', - '.asf': 'video/x-ms-asf', - '.ashx': 'application/xml', - '.asi': 'application/octet-stream', - '.asm': 'text/plain', - '.asmx': 'application/xml', - '.aspx': 'application/xml', - '.asr': 'video/x-ms-asf', - '.asx': 'video/x-ms-asf', - '.atom': 'application/atom+xml', - '.au': 'audio/basic', - '.avi': 'video/x-msvideo', - '.axa': 'audio/annodex', - '.axs': 'application/olescript', - '.axv': 'video/annodex', - '.bas': 'text/plain', - '.bat': 'text/plain', - '.bcpio': 'application/x-bcpio', - '.bin': 'application/octet-stream', - '.bmp': 'image/bmp', - '.c': 'text/plain', - '.cab': 'application/octet-stream', - '.caf': 'audio/x-caf', - '.calx': 'application/vnd.ms-office.calx', - '.cat': 'application/vnd.ms-pki.seccat', - '.cc': 'text/plain', - '.cd': 'text/plain', - '.cdda': 'audio/aiff', - '.cdf': 'application/x-cdf', - '.cer': 'application/x-x509-ca-cert', - '.cfg': 'text/plain', - '.chm': 'application/octet-stream', - '.class': 'application/x-java-applet', - '.clp': 'application/x-msclip', - '.cmd': 'text/plain', - '.cmx': 'image/x-cmx', - '.cnf': 'text/plain', - '.cod': 'image/cis-cod', - '.config': 'application/xml', - '.contact': 'text/x-ms-contact', - '.coverage': 'application/xml', - '.cpio': 'application/x-cpio', - '.cpp': 'text/plain', - '.crd': 'application/x-mscardfile', - '.crl': 'application/pkix-crl', - '.crt': 'application/x-x509-ca-cert', - '.cs': 'text/plain', - '.csdproj': 'text/plain', - '.csh': 'application/x-csh', - '.csproj': 'text/plain', - '.css': 'text/css', - '.csv': 'application/csv', - '.cur': 'application/octet-stream', - '.cxx': 'text/plain', - '.dat': 'application/octet-stream', - '.datasource': 'application/xml', - '.dbproj': 'text/plain', - '.dcr': 'application/x-director', - '.def': 'text/plain', - '.deploy': 'application/octet-stream', - '.der': 'application/x-x509-ca-cert', - '.dgml': 'application/xml', - '.dib': 'image/bmp', - '.dif': 'video/x-dv', - '.dir': 'application/x-director', - '.disco': 'text/xml', - '.divx': 'video/divx', - '.dll': 'application/x-msdownload', - '.dll.config': 'text/xml', - '.dlm': 'text/dlm', - '.doc': 'application/msword', - '.docm': 'application/vnd.ms-word.document.macroEnabled.12', - '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - '.dot': 'application/msword', - '.dotm': 'application/vnd.ms-word.template.macroEnabled.12', - '.dotx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - '.dsp': 'application/octet-stream', - '.dsw': 'text/plain', - '.dtd': 'text/xml', - '.dtsConfig': 'text/xml', - '.dv': 'video/x-dv', - '.dvi': 'application/x-dvi', - '.dwf': 'drawing/x-dwf', - '.dwg': 'application/acad', - '.dwp': 'application/octet-stream', - '.dxf': 'application/x-dxf', - '.dxr': 'application/x-director', - '.eml': 'message/rfc822', - '.emz': 'application/octet-stream', - '.eot': 'application/vnd.ms-fontobject', - '.eps': 'application/postscript', - '.etl': 'application/etl', - '.etx': 'text/x-setext', - '.evy': 'application/envoy', - '.exe': 'application/octet-stream', - '.exe.config': 'text/xml', - '.fdf': 'application/vnd.fdf', - '.fif': 'application/fractals', - '.filters': 'application/xml', - '.fla': 'application/octet-stream', - '.flac': 'audio/flac', - '.flr': 'x-world/x-vrml', - '.flv': 'video/x-flv', - '.fsscript': 'application/fsharp-script', - '.fsx': 'application/fsharp-script', - '.generictest': 'application/xml', - '.gif': 'image/gif', - '.gpx': 'application/gpx+xml', - '.group': 'text/x-ms-group', - '.gradle': 'text/plain', - '.gsm': 'audio/x-gsm', - '.gtar': 'application/x-gtar', - '.gz': 'application/x-gzip', - '.h': 'text/plain', - '.hdf': 'application/x-hdf', - '.hdml': 'text/x-hdml', - '.hhc': 'application/x-oleobject', - '.hhk': 'application/octet-stream', - '.hhp': 'application/octet-stream', - '.hlp': 'application/winhlp', - '.hpp': 'text/plain', - '.hqx': 'application/mac-binhex40', - '.hta': 'application/hta', - '.htc': 'text/x-component', - '.htm': 'text/html', - '.html': 'text/html', - '.htt': 'text/webviewhtml', - '.hxa': 'application/xml', - '.hxc': 'application/xml', - '.hxd': 'application/octet-stream', - '.hxe': 'application/xml', - '.hxf': 'application/xml', - '.hxh': 'application/octet-stream', - '.hxi': 'application/octet-stream', - '.hxk': 'application/xml', - '.hxq': 'application/octet-stream', - '.hxr': 'application/octet-stream', - '.hxs': 'application/octet-stream', - '.hxt': 'text/html', - '.hxv': 'application/xml', - '.hxw': 'application/octet-stream', - '.hxx': 'text/plain', - '.i': 'text/plain', - '.ico': 'image/x-icon', - '.ics': 'application/octet-stream', - '.idl': 'text/plain', - '.ief': 'image/ief', - '.iii': 'application/x-iphone', - '.inc': 'text/plain', - '.inf': 'application/octet-stream', - '.ini': 'text/plain', - '.inl': 'text/plain', - '.ins': 'application/x-internet-signup', - '.ipa': 'application/x-itunes-ipa', - '.ipg': 'application/x-itunes-ipg', - '.ipproj': 'text/plain', - '.ipsw': 'application/x-itunes-ipsw', - '.iqy': 'text/x-ms-iqy', - '.isp': 'application/x-internet-signup', - '.ite': 'application/x-itunes-ite', - '.itlp': 'application/x-itunes-itlp', - '.itms': 'application/x-itunes-itms', - '.itpc': 'application/x-itunes-itpc', - '.IVF': 'video/x-ivf', - '.jar': 'application/java-archive', - '.java': 'text/plain', - '.jck': 'application/liquidmotion', - '.jcz': 'application/liquidmotion', - '.jfif': 'image/pjpeg', - '.jnlp': 'application/x-java-jnlp-file', - '.jpb': 'application/octet-stream', - '.jpe': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.jpg': 'image/jpeg', - '.js': 'text/plain', - '.json': 'application/json', - '.jsx': 'text/jscript', - '.jsxbin': 'text/plain', - '.latex': 'application/x-latex', - '.less': 'text/plain', - '.library-ms': 'application/windows-library+xml', - '.lit': 'application/x-ms-reader', - '.loadtest': 'application/xml', - '.lpk': 'application/octet-stream', - '.lsf': 'video/x-la-asf', - '.lst': 'text/plain', - '.lsx': 'video/x-la-asf', - '.lzh': 'application/octet-stream', - '.m13': 'application/x-msmediaview', - '.m14': 'application/x-msmediaview', - '.m1v': 'video/mpeg', - '.m2t': 'video/vnd.dlna.mpeg-tts', - '.m2ts': 'video/vnd.dlna.mpeg-tts', - '.m2v': 'video/mpeg', - '.m3u': 'audio/x-mpegurl', - '.m3u8': 'audio/x-mpegurl', - '.m4a': 'audio/m4a', - '.m4b': 'audio/m4b', - '.m4p': 'audio/m4p', - '.m4r': 'audio/x-m4r', - '.m4v': 'video/x-m4v', - '.mac': 'image/x-macpaint', - '.mak': 'text/plain', - '.man': 'application/x-troff-man', - '.manifest': 'application/x-ms-manifest', - '.map': 'text/plain', - '.master': 'application/xml', - '.mbox': 'application/mbox', - '.md': 'text/plain', - '.mda': 'application/msaccess', - '.mdb': 'application/x-msaccess', - '.mde': 'application/msaccess', - '.mdp': 'application/octet-stream', - '.me': 'application/x-troff-me', - '.mfp': 'application/x-shockwave-flash', - '.mht': 'message/rfc822', - '.mhtml': 'message/rfc822', - '.mid': 'audio/mid', - '.midi': 'audio/mid', - '.mix': 'application/octet-stream', - '.mk': 'text/plain', - '.mmf': 'application/x-smaf', - '.mno': 'text/xml', - '.mny': 'application/x-msmoney', - '.mod': 'video/mpeg', - '.mov': 'video/quicktime', - '.movie': 'video/x-sgi-movie', - '.mp2': 'video/mpeg', - '.mp2v': 'video/mpeg', - '.mp3': 'audio/mpeg', - '.mp4': 'video/mp4', - '.mp4v': 'video/mp4', - '.mpa': 'video/mpeg', - '.mpe': 'video/mpeg', - '.mpeg': 'video/mpeg', - '.mpf': 'application/vnd.ms-mediapackage', - '.mpg': 'video/mpeg', - '.mpp': 'application/vnd.ms-project', - '.mpv2': 'video/mpeg', - '.mqv': 'video/quicktime', - '.ms': 'application/x-troff-ms', - '.msg': 'application/vnd.ms-outlook', - '.msi': 'application/octet-stream', - '.mso': 'application/octet-stream', - '.mts': 'video/vnd.dlna.mpeg-tts', - '.mtx': 'application/xml', - '.mvb': 'application/x-msmediaview', - '.mvc': 'application/x-miva-compiled', - '.mxp': 'application/x-mmxp', - '.nc': 'application/x-netcdf', - '.nsc': 'video/x-ms-asf', - '.nws': 'message/rfc822', - '.ocx': 'application/octet-stream', - '.oda': 'application/oda', - '.odb': 'application/vnd.oasis.opendocument.database', - '.odc': 'application/vnd.oasis.opendocument.chart', - '.odf': 'application/vnd.oasis.opendocument.formula', - '.odg': 'application/vnd.oasis.opendocument.graphics', - '.odh': 'text/plain', - '.odi': 'application/vnd.oasis.opendocument.image', - '.odl': 'text/plain', - '.odm': 'application/vnd.oasis.opendocument.text-master', - '.odp': 'application/vnd.oasis.opendocument.presentation', - '.ods': 'application/vnd.oasis.opendocument.spreadsheet', - '.odt': 'application/vnd.oasis.opendocument.text', - '.oga': 'audio/ogg', - '.ogg': 'audio/ogg', - '.ogv': 'video/ogg', - '.ogx': 'application/ogg', - '.one': 'application/onenote', - '.onea': 'application/onenote', - '.onepkg': 'application/onenote', - '.onetmp': 'application/onenote', - '.onetoc': 'application/onenote', - '.onetoc2': 'application/onenote', - '.opus': 'audio/ogg', - '.orderedtest': 'application/xml', - '.osdx': 'application/opensearchdescription+xml', - '.otf': 'application/font-sfnt', - '.otg': 'application/vnd.oasis.opendocument.graphics-template', - '.oth': 'application/vnd.oasis.opendocument.text-web', - '.otp': 'application/vnd.oasis.opendocument.presentation-template', - '.ots': 'application/vnd.oasis.opendocument.spreadsheet-template', - '.ott': 'application/vnd.oasis.opendocument.text-template', - '.oxt': 'application/vnd.openofficeorg.extension', - '.p10': 'application/pkcs10', - '.p12': 'application/x-pkcs12', - '.p7b': 'application/x-pkcs7-certificates', - '.p7c': 'application/pkcs7-mime', - '.p7m': 'application/pkcs7-mime', - '.p7r': 'application/x-pkcs7-certreqresp', - '.p7s': 'application/pkcs7-signature', - '.pbm': 'image/x-portable-bitmap', - '.pcast': 'application/x-podcast', - '.pct': 'image/pict', - '.pcx': 'application/octet-stream', - '.pcz': 'application/octet-stream', - '.pdf': 'application/pdf', - '.pfb': 'application/octet-stream', - '.pfm': 'application/octet-stream', - '.pfx': 'application/x-pkcs12', - '.pgm': 'image/x-portable-graymap', - '.pic': 'image/pict', - '.pict': 'image/pict', - '.pkgdef': 'text/plain', - '.pkgundef': 'text/plain', - '.pko': 'application/vnd.ms-pki.pko', - '.pls': 'audio/scpls', - '.pma': 'application/x-perfmon', - '.pmc': 'application/x-perfmon', - '.pml': 'application/x-perfmon', - '.pmr': 'application/x-perfmon', - '.pmw': 'application/x-perfmon', - '.png': 'image/png', - '.pnm': 'image/x-portable-anymap', - '.pnt': 'image/x-macpaint', - '.pntg': 'image/x-macpaint', - '.pnz': 'image/png', - '.pot': 'application/vnd.ms-powerpoint', - '.potm': 'application/vnd.ms-powerpoint.template.macroEnabled.12', - '.potx': 'application/vnd.openxmlformats-officedocument.presentationml.template', - '.ppa': 'application/vnd.ms-powerpoint', - '.ppam': 'application/vnd.ms-powerpoint.addin.macroEnabled.12', - '.ppm': 'image/x-portable-pixmap', - '.pps': 'application/vnd.ms-powerpoint', - '.ppsm': 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', - '.ppsx': 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - '.ppt': 'application/vnd.ms-powerpoint', - '.pptm': 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', - '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - '.prf': 'application/pics-rules', - '.prm': 'application/octet-stream', - '.prx': 'application/octet-stream', - '.ps': 'application/postscript', - '.psc1': 'application/PowerShell', - '.psd': 'application/octet-stream', - '.psess': 'application/xml', - '.psm': 'application/octet-stream', - '.psp': 'application/octet-stream', - '.pst': 'application/vnd.ms-outlook', - '.pub': 'application/x-mspublisher', - '.py': 'text/plain', - '.pwz': 'application/vnd.ms-powerpoint', - '.qht': 'text/x-html-insertion', - '.qhtm': 'text/x-html-insertion', - '.qt': 'video/quicktime', - '.qti': 'image/x-quicktime', - '.qtif': 'image/x-quicktime', - '.qtl': 'application/x-quicktimeplayer', - '.qxd': 'application/octet-stream', - '.ra': 'audio/x-pn-realaudio', - '.ram': 'audio/x-pn-realaudio', - '.rar': 'application/x-rar-compressed', - '.ras': 'image/x-cmu-raster', - '.rat': 'application/rat-file', - '.rc': 'text/plain', - '.rc2': 'text/plain', - '.rct': 'text/plain', - '.rdlc': 'application/xml', - '.reg': 'text/plain', - '.resx': 'application/xml', - '.rf': 'image/vnd.rn-realflash', - '.rgb': 'image/x-rgb', - '.rgs': 'text/plain', - '.rm': 'application/vnd.rn-realmedia', - '.rmi': 'audio/mid', - '.rmp': 'application/vnd.rn-rn_music_package', - '.roff': 'application/x-troff', - '.rpm': 'audio/x-pn-realaudio-plugin', - '.rqy': 'text/x-ms-rqy', - '.rtf': 'application/rtf', - '.rtx': 'text/richtext', - '.rvt': 'application/octet-stream', - '.ruleset': 'application/xml', - '.s': 'text/plain', - '.safariextz': 'application/x-safari-safariextz', - '.scd': 'application/x-msschedule', - '.scr': 'text/plain', - '.sct': 'text/scriptlet', - '.sd2': 'audio/x-sd2', - '.sdp': 'application/sdp', - '.sea': 'application/octet-stream', - '.searchConnector-ms': 'application/windows-search-connector+xml', - '.setpay': 'application/set-payment-initiation', - '.setreg': 'application/set-registration-initiation', - '.settings': 'application/xml', - '.sgimb': 'application/x-sgimb', - '.sgml': 'text/sgml', - '.sh': 'text/plain', - '.shar': 'application/x-shar', - '.shtml': 'text/html', - '.sit': 'application/x-stuffit', - '.sitemap': 'application/xml', - '.skin': 'application/xml', - '.skp': 'application/x-koan', - '.sldm': 'application/vnd.ms-powerpoint.slide.macroEnabled.12', - '.sldx': 'application/vnd.openxmlformats-officedocument.presentationml.slide', - '.slk': 'application/vnd.ms-excel', - '.sln': 'text/plain', - '.slupkg-ms': 'application/x-ms-license', - '.smd': 'audio/x-smd', - '.smi': 'application/octet-stream', - '.smx': 'audio/x-smd', - '.smz': 'audio/x-smd', - '.snd': 'audio/basic', - '.snippet': 'application/xml', - '.snp': 'application/octet-stream', - '.sol': 'text/plain', - '.sor': 'text/plain', - '.spc': 'application/x-pkcs7-certificates', - '.spl': 'application/futuresplash', - '.spx': 'audio/ogg', - '.sql': 'text/plain', - '.src': 'application/x-wais-source', - '.srf': 'text/plain', - '.SSISDeploymentManifest': 'text/xml', - '.ssm': 'application/streamingmedia', - '.sst': 'application/vnd.ms-pki.certstore', - '.stl': 'application/vnd.ms-pki.stl', - '.sv4cpio': 'application/x-sv4cpio', - '.sv4crc': 'application/x-sv4crc', - '.svc': 'application/xml', - '.svg': 'image/svg+xml', - '.swf': 'application/x-shockwave-flash', - '.step': 'application/step', - '.stp': 'application/step', - '.t': 'application/x-troff', - '.tar': 'application/x-tar', - '.tcl': 'application/x-tcl', - '.testrunconfig': 'application/xml', - '.testsettings': 'application/xml', - '.tex': 'application/x-tex', - '.texi': 'application/x-texinfo', - '.texinfo': 'application/x-texinfo', - '.tgz': 'application/x-compressed', - '.thmx': 'application/vnd.ms-officetheme', - '.thn': 'application/octet-stream', - '.tif': 'image/tiff', - '.tiff': 'image/tiff', - '.tlh': 'text/plain', - '.tli': 'text/plain', - '.toc': 'application/octet-stream', - '.tr': 'application/x-troff', - '.trm': 'application/x-msterminal', - '.trx': 'application/xml', - '.ts': 'video/vnd.dlna.mpeg-tts', - '.tsv': 'text/tab-separated-values', - '.ttf': 'application/font-sfnt', - '.tts': 'video/vnd.dlna.mpeg-tts', - '.txt': 'text/plain', - '.u32': 'application/octet-stream', - '.uls': 'text/iuls', - '.user': 'text/plain', - '.ustar': 'application/x-ustar', - '.vb': 'text/plain', - '.vbdproj': 'text/plain', - '.vbk': 'video/mpeg', - '.vbproj': 'text/plain', - '.vbs': 'text/vbscript', - '.vcf': 'text/x-vcard', - '.vcproj': 'application/xml', - '.vcs': 'text/plain', - '.vcxproj': 'application/xml', - '.vddproj': 'text/plain', - '.vdp': 'text/plain', - '.vdproj': 'text/plain', - '.vdx': 'application/vnd.ms-visio.viewer', - '.vml': 'text/xml', - '.vscontent': 'application/xml', - '.vsct': 'text/xml', - '.vsd': 'application/vnd.visio', - '.vsi': 'application/ms-vsi', - '.vsix': 'application/vsix', - '.vsixlangpack': 'text/xml', - '.vsixmanifest': 'text/xml', - '.vsmdi': 'application/xml', - '.vspscc': 'text/plain', - '.vss': 'application/vnd.visio', - '.vsscc': 'text/plain', - '.vssettings': 'text/xml', - '.vssscc': 'text/plain', - '.vst': 'application/vnd.visio', - '.vstemplate': 'text/xml', - '.vsto': 'application/x-ms-vsto', - '.vsw': 'application/vnd.visio', - '.vsx': 'application/vnd.visio', - '.vtx': 'application/vnd.visio', - '.wav': 'audio/wav', - '.wave': 'audio/wav', - '.wax': 'audio/x-ms-wax', - '.wbk': 'application/msword', - '.wbmp': 'image/vnd.wap.wbmp', - '.wcm': 'application/vnd.ms-works', - '.wdb': 'application/vnd.ms-works', - '.wdp': 'image/vnd.ms-photo', - '.webarchive': 'application/x-safari-webarchive', - '.webm': 'video/webm', - '.webp': 'image/webp', /* https"://en.wikipedia.org/wiki/WebP */ - '.webtest': 'application/xml', - '.wiq': 'application/xml', - '.wiz': 'application/msword', - '.wks': 'application/vnd.ms-works', - '.WLMP': 'application/wlmoviemaker', - '.wlpginstall': 'application/x-wlpg-detect', - '.wlpginstall3': 'application/x-wlpg3-detect', - '.wm': 'video/x-ms-wm', - '.wma': 'audio/x-ms-wma', - '.wmd': 'application/x-ms-wmd', - '.wmf': 'application/x-msmetafile', - '.wml': 'text/vnd.wap.wml', - '.wmlc': 'application/vnd.wap.wmlc', - '.wmls': 'text/vnd.wap.wmlscript', - '.wmlsc': 'application/vnd.wap.wmlscriptc', - '.wmp': 'video/x-ms-wmp', - '.wmv': 'video/x-ms-wmv', - '.wmx': 'video/x-ms-wmx', - '.wmz': 'application/x-ms-wmz', - '.woff': 'application/font-woff', - '.wpl': 'application/vnd.ms-wpl', - '.wps': 'application/vnd.ms-works', - '.wri': 'application/x-mswrite', - '.wrl': 'x-world/x-vrml', - '.wrz': 'x-world/x-vrml', - '.wsc': 'text/scriptlet', - '.wsdl': 'text/xml', - '.wvx': 'video/x-ms-wvx', - '.x': 'application/directx', - '.xaf': 'x-world/x-vrml', - '.xaml': 'application/xaml+xml', - '.xap': 'application/x-silverlight-app', - '.xbap': 'application/x-ms-xbap', - '.xbm': 'image/x-xbitmap', - '.xdr': 'text/plain', - '.xht': 'application/xhtml+xml', - '.xhtml': 'application/xhtml+xml', - '.xla': 'application/vnd.ms-excel', - '.xlam': 'application/vnd.ms-excel.addin.macroEnabled.12', - '.xlc': 'application/vnd.ms-excel', - '.xld': 'application/vnd.ms-excel', - '.xlk': 'application/vnd.ms-excel', - '.xll': 'application/vnd.ms-excel', - '.xlm': 'application/vnd.ms-excel', - '.xls': 'application/vnd.ms-excel', - '.xlsb': 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - '.xlsm': 'application/vnd.ms-excel.sheet.macroEnabled.12', - '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - '.xlt': 'application/vnd.ms-excel', - '.xltm': 'application/vnd.ms-excel.template.macroEnabled.12', - '.xltx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - '.xlw': 'application/vnd.ms-excel', - '.xml': 'text/xml', - '.xmp': 'application/octet-stream', - '.xmta': 'application/xml', - '.xof': 'x-world/x-vrml', - '.XOML': 'text/plain', - '.xpm': 'image/x-xpixmap', - '.xps': 'application/vnd.ms-xpsdocument', - '.xrm-ms': 'text/xml', - '.xsc': 'application/xml', - '.xsd': 'text/xml', - '.xsf': 'text/xml', - '.xsl': 'text/xml', - '.xslt': 'text/xml', - '.xsn': 'application/octet-stream', - '.xss': 'application/xml', - '.xspf': 'application/xspf+xml', - '.xtp': 'application/octet-stream', - '.xwd': 'image/x-xwindowdump', - '.z': 'application/x-compress', - '.zip': 'application/zip' -} - -//根据一个文件名,获取其后缀名(一律使用小写),如果没有后缀名,那么返回"" -export function getExtension(filename) { - - if (filename == null) { - return ""; - } - let dotIndex = filename.lastIndexOf("."); - if (dotIndex === -1) { - return ""; - } else { - return filename.substring(dotIndex).toLowerCase(); - } -} - -//根据一个文件名(带后缀的),获取对应的文件类型。 -export function getMimeType(filename) { - let extension = getExtension(filename); - if (MimeUtil[extension]) { - return MimeUtil[extension]; - } else { - return "application/octet-stream"; - } -} - -export {MimeUtil} diff --git a/src/common/util/NumberUtil.js b/src/common/util/NumberUtil.js deleted file mode 100644 index 5546957..0000000 --- a/src/common/util/NumberUtil.js +++ /dev/null @@ -1,23 +0,0 @@ -export default class NumberUtil { - - //求最大公约数 - static gcd(a, b) { - return b ? NumberUtil.gcd(b, a % b) : a; - }; - - //约分 numerator:分子 denominator:分母 - static reduce(numerator, denominator) { - - let maxFactor = NumberUtil.gcd(numerator, denominator); - return [numerator / maxFactor, denominator / maxFactor]; - } - - //比较两个分数是否相等 - static fractionEqual(numerator1, denominator1, numerator2, denominator2) { - let fraction1 = NumberUtil.reduce(numerator1, denominator1); - let fraction2 = NumberUtil.reduce(numerator2, denominator2); - - return fraction1[0] === fraction2[0] && fraction1[1] === fraction2[1]; - } - -} diff --git a/src/common/util/Utils.js b/src/common/util/Utils.js deleted file mode 100644 index d666309..0000000 --- a/src/common/util/Utils.js +++ /dev/null @@ -1,207 +0,0 @@ -//check whether an obj is number. -import {startWith} from "../filter/str"; - -export function isInteger(obj) { - return typeof obj === 'number' && obj % 1 === 0 -} - -export function isAndroid() { - let u = navigator.memberAgent; - - - //android终端 - return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; - -} - -export function isIOS() { - let u = navigator.memberAgent; - - //ios终端 - return !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); -} - - -//判断当前是否是微信浏览器 -export function isWeixinBrowser() { - let ua = navigator.userAgent.toLowerCase(); - if (ua) { - if (ua.toLowerCase().indexOf("micromessenger") !== -1) { - return true; - } - } -} - -//判断当前是否是往测试数据库写内容 -export function isProductionEnv() { - let host = window.location.host; - return startWith(host, "erhua.howimetmrright.com"); -} - -//check whether an obj is empty -export function isEmptyObject(obj) { - - for (let key in obj) { - return false; - } - return true -} - - -//两个id是否相等 -export function isIdEqual(id1, id2) { - - return (id1 + "") === (id2 + ""); - - -} - -export function isLocalStorageNameSupported() { - let testKey = 'test'; - let storage = window.localStorage; - try { - storage.setItem(testKey, '1'); - storage.removeItem(testKey); - return true; - } catch (error) { - return false; - } -} - - -export function readLocalStorage(key) { - if (isLocalStorageNameSupported()) { - return window.localStorage[key]; - } else { - console.error("not support localStorage."); - return null; - } -} - -export function saveToLocalStorage(key, content) { - if (isLocalStorageNameSupported()) { - window.localStorage[key] = content; - } else { - console.error("not support localStorage."); - } -} - -export function removeLocalStorage(key) { - if (isLocalStorageNameSupported()) { - window.localStorage.removeItem(key); - } else { - console.error("not support localStorage."); - } -} - - -//获取一个function的名字 -export function functionName(func) { - // Match: - // - ^ the beginning of the string - // - function the word 'function' - // - \s+ at least some white space - // - ([\w\$]+) capture one or more valid JavaScript identifier characters - // - \s* optionally followed by white space (in theory there won't be any here, - // so if performance is an issue this can be omitted[1] - // - \( followed by an opening brace - // - let result = /^function\s+([\w\$]+)\s*\(/.exec(func.toString()) - - return result ? result[1] : '' // for an anonymous function there won't be a match -} - -/* -高亮部分文字 - -DEMO: -document.getElementById("setSelection").onmousedown = function() { - var input = document.getElementById("i"); - setInputSelection(input, 4, 7); - return false; -}; - - - - */ -export function setInputSelection(input, startPos, endPos) { - input.focus(); - if (typeof input.selectionStart !== "undefined") { - input.selectionStart = startPos; - input.selectionEnd = endPos; - } else if (document.selection && document.selection.createRange) { - // IE branch - input.select(); - let range = document.selection.createRange(); - range.collapse(true); - range.moveEnd("character", endPos); - range.moveStart("character", startPos); - range.select(); - } -} - -//在字符串a后面追加字符串b -export function appendString(a, b, seperator = "") { - - if (a === null || typeof a !== "string") { - return b; - } else { - return a + seperator + b; - } -} - -//获取当前的host -export function currentHost() { - return window.location.protocol + "//" + window.location.host; -} - - -//调用某个函数,安全的调用 -export function safeCallback(callback) { - if (typeof callback === "function") { - return callback - } else { - return function () { - } - } -} - -//https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser -// Opera 8.0+ -export function isOpera() { - return (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; - -} - -// Firefox 1.0+ -export function isFirefox() { - return typeof InstallTrigger !== 'undefined'; -} - -// Safari 3.0+ "[object HTMLElementConstructor]" -export function isSafari() { - return /constructor/i.test(window.HTMLElement) || (function (p) { - return p.toString() === "[object SafariRemoteNotification]"; - })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification)); - -} - -// Internet Explorer 6-11 -export function isIE() { - return /*@cc_on!@*/false || !!document.documentMode; -} - -// Edge 20+ -export function isEdge() { - return !isIE() && !!window.StyleMedia; -} - -// Chrome 1+ -export function isChrome() { - return !!window.chrome && !!window.chrome.webstore; -} - -// Blink engine detection -export function isBlink() { - return (isChrome() || isOpera()) && !!window.CSS; -} diff --git a/src/components/CreateSaveButton.vue b/src/components/CreateSaveButton.vue deleted file mode 100644 index 39ca529..0000000 --- a/src/components/CreateSaveButton.vue +++ /dev/null @@ -1,68 +0,0 @@ - - diff --git a/src/components/LoadingFrame.vue b/src/components/LoadingFrame.vue deleted file mode 100644 index fb5ae91..0000000 --- a/src/components/LoadingFrame.vue +++ /dev/null @@ -1,39 +0,0 @@ - - diff --git a/src/components/NbBtnDropdown.vue b/src/components/NbBtnDropdown.vue deleted file mode 100644 index c877d2c..0000000 --- a/src/components/NbBtnDropdown.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/NbCheckbox.vue b/src/components/NbCheckbox.vue deleted file mode 100644 index d2df692..0000000 --- a/src/components/NbCheckbox.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - diff --git a/src/components/NbExpanding.vue b/src/components/NbExpanding.vue deleted file mode 100644 index 109821a..0000000 --- a/src/components/NbExpanding.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - diff --git a/src/components/NbPager.vue b/src/components/NbPager.vue deleted file mode 100644 index 63b9e0c..0000000 --- a/src/components/NbPager.vue +++ /dev/null @@ -1,251 +0,0 @@ - - - diff --git a/src/components/NbRadio.vue b/src/components/NbRadio.vue deleted file mode 100644 index 5aa6adc..0000000 --- a/src/components/NbRadio.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - diff --git a/src/components/NbSlidePanel.vue b/src/components/NbSlidePanel.vue deleted file mode 100644 index 2cdd441..0000000 --- a/src/components/NbSlidePanel.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - diff --git a/src/components/NbSwitcher.vue b/src/components/NbSwitcher.vue deleted file mode 100644 index 358d0b2..0000000 --- a/src/components/NbSwitcher.vue +++ /dev/null @@ -1,268 +0,0 @@ - - - - - diff --git a/src/components/copy/CopyPlguinLayout.vue b/src/components/copy/CopyPlguinLayout.vue deleted file mode 100644 index 737f0db..0000000 --- a/src/components/copy/CopyPlguinLayout.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/src/components/copy/CopyPlugin.js b/src/components/copy/CopyPlugin.js deleted file mode 100644 index 2813623..0000000 --- a/src/components/copy/CopyPlugin.js +++ /dev/null @@ -1,32 +0,0 @@ -import CopyPlguinLayout from "./CopyPlguinLayout" - -export default class CopyPlugin { - - constructor() { - this.$vm = null; - } - - install(Vue, options) { - - const CopyPlguinComponent = Vue.extend(CopyPlguinLayout) - if (!this.$vm) { - this.$vm = new CopyPlguinComponent({ - el: document.createElement('div'), - propsData: {} - }) - document.body.appendChild(this.$vm.$el) - } - - Vue.$copyPlguin = this; - - Vue.mixin({ - created: function () { - this.$copyPlguin = Vue.$copyPlguin - } - }) - } - - copy(text, successCallback) { - this.$vm.copy(text, successCallback); - } -} diff --git a/src/components/filter/NbFilter.vue b/src/components/filter/NbFilter.vue deleted file mode 100644 index 4e5ae33..0000000 --- a/src/components/filter/NbFilter.vue +++ /dev/null @@ -1,268 +0,0 @@ - - - diff --git a/src/components/filter/NbFilterCheck.vue b/src/components/filter/NbFilterCheck.vue deleted file mode 100644 index f56f719..0000000 --- a/src/components/filter/NbFilterCheck.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/src/components/filter/NbFilterDate.vue b/src/components/filter/NbFilterDate.vue deleted file mode 100644 index f99e9da..0000000 --- a/src/components/filter/NbFilterDate.vue +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - diff --git a/src/components/filter/NbFilterDateTime.vue b/src/components/filter/NbFilterDateTime.vue deleted file mode 100644 index 13e6782..0000000 --- a/src/components/filter/NbFilterDateTime.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - diff --git a/src/components/filter/NbFilterHttpInputSelection.vue b/src/components/filter/NbFilterHttpInputSelection.vue deleted file mode 100644 index 8a3f7bf..0000000 --- a/src/components/filter/NbFilterHttpInputSelection.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - diff --git a/src/components/filter/NbFilterHttpSelection.vue b/src/components/filter/NbFilterHttpSelection.vue deleted file mode 100644 index abfe87d..0000000 --- a/src/components/filter/NbFilterHttpSelection.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/src/components/filter/NbFilterMultiSelection.vue b/src/components/filter/NbFilterMultiSelection.vue deleted file mode 100644 index b0c0ecf..0000000 --- a/src/components/filter/NbFilterMultiSelection.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - diff --git a/src/components/filter/NbFilterSelection.vue b/src/components/filter/NbFilterSelection.vue deleted file mode 100644 index 1fb768d..0000000 --- a/src/components/filter/NbFilterSelection.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - diff --git a/src/components/filter/NbFilterSort.vue b/src/components/filter/NbFilterSort.vue deleted file mode 100644 index 3312ab6..0000000 --- a/src/components/filter/NbFilterSort.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - diff --git a/src/components/filter/NbPlainFilter.vue b/src/components/filter/NbPlainFilter.vue deleted file mode 100644 index 31c5117..0000000 --- a/src/components/filter/NbPlainFilter.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - diff --git a/src/components/photoswipe/PhotoSwipeLayout.vue b/src/components/photoswipe/PhotoSwipeLayout.vue deleted file mode 100644 index 8c4ec00..0000000 --- a/src/components/photoswipe/PhotoSwipeLayout.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/src/components/photoswipe/PhotoSwipePlugin.js b/src/components/photoswipe/PhotoSwipePlugin.js deleted file mode 100644 index 5fb0da5..0000000 --- a/src/components/photoswipe/PhotoSwipePlugin.js +++ /dev/null @@ -1,149 +0,0 @@ -import PhotoSwipeLayout from "./PhotoSwipeLayout"; -import PhotoSwipe from 'x-photoswipe/dist/photoswipe' -import PhotoSwipeUIDefault from 'x-photoswipe/dist/photoswipe-ui-default' -//PhotoSwipe的样式 -import "x-photoswipe/dist/photoswipe.css"; -import "x-photoswipe/dist/default-skin/default-skin.css"; - -/** - * - * 图片预览控件,主要提供给H5端使用。 - */ -export default class PhotoSwipePlugin { - - constructor() { - - - this.$vm = null; - - //核心 - this.photoSwipe = null; - - } - - - install(Vue, options) { - - const PhotoSwipePluginComponent = Vue.extend(PhotoSwipeLayout) - if (!this.$vm) { - this.$vm = new PhotoSwipePluginComponent({ - el: document.createElement('div'), - propsData: {} - }) - document.body.appendChild(this.$vm.$el) - } - - Vue.$photoSwipePlugin = this; - - Vue.mixin({ - created: function () { - this.$photoSwipePlugin = Vue.$photoSwipePlugin - } - }) - } - - //展示一张图片 - showSinglePhoto(url, width = 0, height = 0) { - - let that = this; - let items = [{ - src: url, - w: width, - h: height - }]; - - let options = { - //不需要历史纪录 - history: false, - //不需要全屏按钮 - fullscreenEl: false, - //不需要分享按钮 - shareEl: false, - //点击不要让控制按钮消失 - tapToToggleControls: false, - //当前从第0张展示。 - index: 0 - }; - this.photoSwipe = new PhotoSwipe(this.$vm.$el, PhotoSwipeUIDefault, items, options); - - this.photoSwipe.listen('gettingData', function (index, item) { - if (!item.w || !item.h || item.w < 1 || item.h < 1) { - const img = new Image() - img.onload = function () { - item.w = this.width - item.h = this.height - that.photoSwipe.updateSize(true) - } - img.src = item.src - } - }) - this.photoSwipe.init(); - - this.photoSwipe.listen('close', () => { - }) - this.photoSwipe.listen('afterChange', (a, b) => { - }) - } - - //展示一系列图片 - showMultiPhoto(urls = [], index = 0) { - - let that = this; - let items = []; - urls.forEach((url) => { - items.push({ - src: url, - w: 0, - h: 0 - }) - }) - - let options = { - //不需要历史纪录 - history: false, - //不需要全屏按钮 - fullscreenEl: false, - //不需要分享按钮 - shareEl: false, - //点击不要让控制按钮消失 - tapToToggleControls: false, - //当前从第0张展示。 - index: index - }; - this.photoSwipe = new PhotoSwipe(this.$vm.$el, PhotoSwipeUIDefault, items, options); - - this.photoSwipe.listen('gettingData', function (index, item) { - if (!item.w || !item.h || item.w < 1 || item.h < 1) { - const img = new Image() - img.onload = function () { - item.w = this.width - item.h = this.height - that.photoSwipe.updateSize(true) - } - img.src = item.src - } - }) - this.photoSwipe.init(); - - this.photoSwipe.listen('close', () => { - //photoSwipe事件:close - }) - this.photoSwipe.listen('afterChange', (a, b) => { - //photoSwipe事件:afterChange - }) - } - - - //展示一张图片。 - showPhoto(url) { - this.showSinglePhoto(url); - } - - - //展示一系列图片 - showPhotos(urls, index = 0) { - this.showMultiPhoto(urls, index); - } - -} - diff --git a/src/components/previewer/Previewer.js b/src/components/previewer/Previewer.js deleted file mode 100644 index f8a30bb..0000000 --- a/src/components/previewer/Previewer.js +++ /dev/null @@ -1,49 +0,0 @@ -import PreviewerLayout from "./PreviewerLayout" - -export default class Previewer { - - constructor() { - this.$vm = null; - } - - install(Vue, options) { - - const PreviewerComponent = Vue.extend(PreviewerLayout) - if (!this.$vm) { - this.$vm = new PreviewerComponent({ - el: document.createElement('div'), - propsData: {} - }) - document.body.appendChild(this.$vm.$el) - } - - Vue.$previewer = this; - - Vue.mixin({ - created: function () { - this.$previewer = Vue.$previewer - } - }) - } - - previewPdf(name, url, size) { - this.$vm.previewPdf(name, url, size); - } - - previewText(name, url, size) { - this.$vm.previewText(name, url, size); - } - - previewOffice(name, url, size) { - this.$vm.previewOffice(name, url, size); - } - - previewAudio(name, url, size) { - this.$vm.previewAudio(name, url, size); - } - - previewVideo(name, url, size) { - this.$vm.previewVideo(name, url, size); - } - -} diff --git a/src/components/previewer/PreviewerLayout.vue b/src/components/previewer/PreviewerLayout.vue deleted file mode 100644 index 7c01170..0000000 --- a/src/components/previewer/PreviewerLayout.vue +++ /dev/null @@ -1,189 +0,0 @@ - - - - - diff --git a/src/components/previewer/panels/AudioPanel.vue b/src/components/previewer/panels/AudioPanel.vue deleted file mode 100644 index 96ebb22..0000000 --- a/src/components/previewer/panels/AudioPanel.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - diff --git a/src/components/previewer/panels/OfficePanel.vue b/src/components/previewer/panels/OfficePanel.vue deleted file mode 100644 index 2702deb..0000000 --- a/src/components/previewer/panels/OfficePanel.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - diff --git a/src/components/previewer/panels/PdfPanel.vue b/src/components/previewer/panels/PdfPanel.vue deleted file mode 100644 index 2751f1c..0000000 --- a/src/components/previewer/panels/PdfPanel.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - - - diff --git a/src/components/previewer/panels/TextPanel.vue b/src/components/previewer/panels/TextPanel.vue deleted file mode 100644 index 4ec391d..0000000 --- a/src/components/previewer/panels/TextPanel.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - diff --git a/src/components/previewer/panels/VideoPanel.vue b/src/components/previewer/panels/VideoPanel.vue deleted file mode 100644 index 380ea92..0000000 --- a/src/components/previewer/panels/VideoPanel.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..f5185c1 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './index.css'; +import App from './App'; +import * as serviceWorker from './serviceWorker'; + +ReactDOM.render( + + + , + document.getElementById('root') +); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: https://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/src/logo.svg b/src/logo.svg new file mode 100644 index 0000000..6b60c10 --- /dev/null +++ b/src/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main.js b/src/main.js deleted file mode 100644 index 4358f27..0000000 --- a/src/main.js +++ /dev/null @@ -1,74 +0,0 @@ -//For IE Exception. -import "babel-polyfill"; - -//custom directive. -import "./common/directive/directive" - -//自定义文本框插件 -import CopyPlugin from "./components/copy/CopyPlugin"; -import PhotoSwipePlugin from "./components/photoswipe/PhotoSwipePlugin"; -import Previewer from "./components/previewer/Previewer"; - -import Vue from 'vue' -import VueI18n from 'vue-i18n' -import App from './App.vue' -import store from './vuex' - -import router from './router' -import {sync} from 'vuex-router-sync' -import VueResource from 'vue-resource' -import NProgress from 'vue-nprogress' -import filters from './common/filter' -import i18nMessage from "./common/i18n" -import BrowserUtil from "./common/util/BrowserUtil"; - -import { Tabs, TabPane, DatePicker, Dialog, Message, MessageBox } from 'element-ui'; - -Vue.use(Tabs); -Vue.use(TabPane); -Vue.use(Dialog); -Vue.use(DatePicker); -Vue.prototype.$msgbox = MessageBox; -Vue.prototype.$alert = MessageBox.alert; -Vue.prototype.$confirm = MessageBox.confirm; -Vue.prototype.$prompt = MessageBox.prompt; -Vue.prototype.$message = Message; - -//expose to global. -Vue.store = store; -//expose to global. -Vue.router = router; -sync(store, router) -Vue.use(VueResource) -Vue.use(NProgress) - - -//使用自定义插件 -Vue.use(new CopyPlugin()) -Vue.use(new PhotoSwipePlugin()) -Vue.use(new Previewer()) - -// register global utility filters. -Object.keys(filters).forEach(key => { - Vue.filter(key, filters[key]) -}) - -Vue.use(VueI18n) - -// 通过选项创建 VueI18n 实例 -const i18n = new VueI18n({ - locale: Vue.store.state.lang, // 设置地区 - messages: i18nMessage // 设置地区信息 -}) -Vue.i18n = i18n - - -const nprogress = new NProgress({parent: '.nprogress-container'}) - -new Vue({ - nprogress, - i18n, - store, - router, - render: h => h(App), -}).$mount('#app') diff --git a/src/model/base/Base.js b/src/model/base/Base.js deleted file mode 100644 index 3daf46c..0000000 --- a/src/model/base/Base.js +++ /dev/null @@ -1,376 +0,0 @@ -import $ from 'jquery' -import Vue from 'vue' -import {Message} from 'element-ui' -import {lowerCamel, lowerSlash, startWith, toPlural} from '../../common/filter/str' -import {str2Date} from '../../common/filter/time' -import {functionName} from "../../common/util/Utils"; -import {parseList} from "../../common/util/JsonUtils"; -import {ResultCode} from "./ResultCode"; - -export default class Base { - - constructor(args) { - - //错误信息提示。 - this.errorMessage = null - //是否处于编辑状态。区别于展示和编辑。 - this.editMode = false - //是否处于创建状态。区别于创建和编辑。 - this.createMode = false - - this.loading = false - - //加载详情时的loading,这是一种特殊的loading状态,只有详情加载好了,我们才展示整个页面,在LoadingFrame中有用到 - this.detailLoading = false - } - - render(obj) { - if (obj) { - $.extend(this, obj) - } - } - - //如果自己仅仅是作为一个列表中的属性渲染的话,那么我们只关心个别关键词段。 - //比如在SpaceApply中SpaceSeats,这个如果使用render的话,那么页面加载速度将非常慢。 - simpleRender(obj) { - this.render(obj) - } - - /** - * 根据一个类型,渲染出对应的数组。 - * @param json 字符串或者数组对象。 - * @param Clazz 需要渲染的目标对象 - * @returns {*} - */ - static assignList(json, Clazz) { - - let target = [] - - let arr = [] - - if (json instanceof String) { - - arr = parseList(json); - - } else if (json instanceof Array) { - arr = json - } else { - - console.error("Src must be string or array", json) - return target - } - - //如果我们要转换成字符串的数组形式,那么this[field]应该是一个字符串才对。 - if (Clazz === String) { - return arr - } - - if (!Clazz || !(Clazz.prototype instanceof Base)) { - console.error("Class must be Base subclass ") - return target - } - - for (let i = 0; i < arr.length; i++) { - let bean = arr[i] - - let clazz = new Clazz() - - clazz.render(bean) - - target.push(clazz) - } - - return target - } - - - /** - * - * @param field 字段名 - * @param Clazz 类型名 - * @param simpleRender 是否使用极简的渲染方式。 - */ - renderList(field, Clazz, simpleRender = true) { - - //如果我们要转换成字符串的数组形式,那么this[field]应该是一个字符串才对。 - if (Clazz === String) { - this[field] = parseList(this[field]); - return - } - - //下面就是转换实体数组了。 - let beans = this[field] - if (!beans) { - //服务器返回这个字段为空 维持构造函数中的默认值(一般而言是一个[]) - this[field] = (new this.constructor())[field] - return - } - - if (!Clazz) { - return - } - - this[field] = [] - - for (let i = 0; i < beans.length; i++) { - let bean = beans[i] - let clazz = new Clazz() - - if (simpleRender) { - clazz.simpleRender(bean) - } else { - clazz.render(bean) - } - - this[field].push(clazz) - } - } - - //直接render出一个Entity. field字段名,Clazz类名。 - renderEntity(field, Clazz) { - - let obj = this[field] - if (!obj) { - if (Clazz) { - let EntityClazz = this.constructor - obj = (new EntityClazz())[field] - - } else { - return - } - } - - if (Clazz === Date) { - - this[field] = str2Date(obj) - } else if (Clazz.prototype instanceof Base) { - - //可能此处的该项属性做了特殊处理的。 - //1024*1024 以及 "图片尺寸不超过1M"用let bean = new Clazz(); 就无法反映出来。因为父类render的时候已经将avatar给变成了Object. - let bean = (new this.constructor())[field] - if (!bean) { - bean = new Clazz() - } - - if (obj !== null) { - bean.render(obj) - this[field] = bean - } - - } else { - console.error('调用错误!') - } - - } - - //we provide a default error handing method. handle with specific errorCallback. - defaultErrorHandler(response, errorCallback) { - - let msg = this.getErrorMessage(response) - - if (typeof errorCallback === 'function') { - errorCallback(msg, response) - } else { - Message.error({ - message: msg, - center: true - }) - } - } - - //专门捕捉没有登录这种错误。return true -> 有错误(已经处理掉了) false -> 没错误 (什么都没干) - specialErrorHandler(response) { - - let temp = response['data'] - if (temp !== null && typeof temp === 'object') { - if (temp['code'] === ResultCode.LOGIN) { - - //如果当前本身就是登录页面,自然没有必要提示 - if (Vue.store.state.route.path === "/user/login") { - return true - } - //这个问题不能报的太频繁,比如一个页面请求了两个接口,两个接口都报没有登录。 - if ((new Date().getTime()) - Vue.store.state.lastLoginErrorTimestamp < 3000) { - return true - } else { - Vue.store.state.lastLoginErrorTimestamp = (new Date().getTime()); - } - - - Message.error({ - message: '您已退出,请登录后再访问。' - }) - - //做一次退出。 - Vue.store.state.user.innerLogout() - - Vue.router.push({ - path: "/user/login", - query: {redirect: Vue.store.state.route.fullPath} - }) - - return true - - } else if (temp['code'] === ResultCode.NOT_INSTALLED) { - - //做一次退出。 - Vue.store.state.user.innerLogout() - - Vue.store.state.installed = false - Vue.router.push("/install/index") - return true - - } - } - - return false - - } - - - - //get errorMessage from response and wrap the value to this.errorMessage. - getErrorMessage(response) { - - let msg = '服务器出错,请稍后再试!' - - if (response === null) { - msg = '出错啦,请稍后重试!' - } else if (typeof response === 'string') { - msg = response - } else if (response['msg']) { - msg = response['msg'] - } else if (response['message']) { - msg = response['message'] - } else { - let temp = response['data'] - if (temp !== null && typeof temp === 'object') { - if (temp['message']) { - msg = temp['message'] - } else if (temp['msg']) { - msg = temp['msg'] - } else { - if (temp['error'] && temp['error']['message']) { - msg = temp['error']['message'] - } - } - } - } - this.errorMessage = msg - return msg - } - - //Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback); - //opts中可以传递一些特殊的选项。具体参考:https://github.com/pagekit/vue-resource/blob/develop/docs/http.md - httpGet(url, params = {}, successCallback, errorCallback, opts = {}) { - - let that = this - - let options = $.extend({}, opts) - options['params'] = params - - this.loading = true - Vue.http.get(url, options).then(function (response) { - - that.loading = false; - (typeof successCallback === 'function') && successCallback(response) - - }, function (response) { - - that.loading = false - - console.error(response) - //错误信息一律存放在自己的errorMessage中,user httpLogout将显得不灵活了 - //that.errorMessage = that.getErrorMessage(response) - - //对于没有登录的错误直接跳转到登录页面 - if (that.specialErrorHandler(response)) { - return - } - - //有传入错误处理方法,就按你的执行 - if (typeof errorCallback === 'function') { - errorCallback(that.getErrorMessage(response), response) - } else { - //没有传入错误处理的方法就采用默认处理方法:toast弹出该错误信息。 - that.defaultErrorHandler(response) - } - - }) - - } - - //Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback); - //url is something like this: /article/detail/1 - //opts中可以传递一些特殊的选项。具体参考:https://github.com/pagekit/vue-resource/blob/develop/docs/http.md - httpPost(url, params, successCallback, errorCallback, opts = {}) { - let that = this - - - let options = $.extend({}, opts) - - //options["emulateJSON"] = !(params instanceof FormData); - - //Post请求临时使用json的方式。 - options['emulateJSON'] = true - - this.loading = true - Vue.http.post(url, params, options).then(function (response) { - that.loading = false - - typeof successCallback === 'function' && successCallback(response) - - }, function (response) { - that.loading = false - - console.error(response) - //错误信息一律存放在自己的errorMessage中,user httpLogout将显得不灵活了 - //that.errorMessage = that.getErrorMessage(response) - - //对于没有登录的错误直接跳转到登录页面 - if (that.specialErrorHandler(response)) { - return - } - - //有传入错误处理方法,就按你的执行 - if (typeof errorCallback === 'function') { - errorCallback(that.getErrorMessage(response), response) - } else { - //没有传入错误处理的方法就采用默认处理方法:toast弹出该错误信息。 - that.defaultErrorHandler(response) - } - - }) - - } - - //获取到当前类的单数标签。比如 Project便得到 project - getTAG() { - - let className = this.constructor.name - - //IE无法直接通过this.constructor.name获取到相应名称 - if (!className) { - className = functionName(this.constructor) - } - - return lowerCamel(className) - } - - //获取到当前实体的url前缀。 - getUrlPrefix() { - return "/api" + lowerSlash(this.getTAG()) - } - - //调用某个函数,如果函数有问题,那么打印出来。 - safeCallback(callback) { - if (typeof callback === "function") { - return callback - } else { - return function () { - } - } - } - - -} diff --git a/src/model/base/BaseEntity.js b/src/model/base/BaseEntity.js deleted file mode 100644 index 9c3a960..0000000 --- a/src/model/base/BaseEntity.js +++ /dev/null @@ -1,265 +0,0 @@ -import Base from './Base' -import Filter from './Filter' -import {MessageBox, Message} from 'element-ui' -import Schema from 'async-validator' -import {FilterType} from "./FilterType"; - -export default class BaseEntity extends Base { - - constructor(args) { - super(args) - this.uuid = null - this.sort = null - this.createTime = null - this.updateTime = null - - //表单验证专用 - this.validatorSchema = null - } - - //This is just a intermedia method. - render(obj) { - super.render(obj) - this.renderEntity('createTime', Date) - this.renderEntity('updateTime', Date) - - } - - //获取过滤器,必须每次动态生成,否则会造成filter逻辑混乱。 - getFilters() { - return [ - new Filter(FilterType.SORT, 'Sort', 'orderSort'), - new Filter(FilterType.SORT, 'Sort UpdateTime', 'orderUpdateTime'), - new Filter(FilterType.SORT, 'Sort CreateTime', 'orderCreateTime') - ] - }; - - //获取表单的验证规则 - getSchema() { - - return null - - } - - -//该实体目前是否能够编辑 - canEdit() { - console.error('canEdit: you should override this base method.') - } - -//该实体目前是否能够删除 - canDel() { - console.error('canDel: you should override this base method.') - } - - getForm() { - console.error('getForm: you should override this base method.') - } - - /*validate () { - console.error('validate: you should override this base method.') - }*/ - - validate(validatorSchema = this.validatorSchema) { - let valid = true - let that = this - let schema = validatorSchema - if (!schema) { - return true - } - - let validateArr = Object.keys(schema) //遍历规则的key值 - let validateObj = {} - validateArr.forEach(function (i) { - validateObj[i] = that[i] - schema[i].error = null - }) - let descriptor = {} - validateArr.forEach(function (i) { - descriptor[i] = schema[i].rules - }) - - new Schema(descriptor).validate(validateObj, (errors, fields) => { - - if (errors) { - errors.forEach(function (i) { - schema[i.field].error = i.message - }) - valid = false - } - }) - - return valid - } - - //common http detail methods. - httpDetail(successCallback, errorCallback) { - - let that = this - if (!this.uuid) { - - this.errorMessage = 'No uuid error' - - this.defaultErrorHandler(this.errorMessage, errorCallback) - - return - } - - let url = this.getUrlDetail(this.uuid) - - if (!url) { - return - } - - this.detailLoading = true - - this.httpGet(url, {}, function (response) { - that.detailLoading = false - that.editMode = true - - that.render(response.data.data) - - that.safeCallback(successCallback)(response) - - }, function (response) { - - that.detailLoading = false - - if (typeof errorCallback === 'function') { - errorCallback() - } else { - //没有传入错误处理的方法就采用默认处理方法:toast弹出该错误信息。 - that.defaultErrorHandler(response) - } - }) - - } - - httpSave(successCallback, errorCallback) { - - let that = this - - let url = this.getUrlCreate() - if (this.uuid) { - url = this.getUrlEdit() - } - - if (!this.validate()) { - - that.defaultErrorHandler(this.errorMessage, errorCallback) - return - } - - this.httpPost(url, this.getForm(), function (response) { - - that.render(response.data.data) - - that.safeCallback(successCallback)(response) - - }, errorCallback) - - } - - httpDelete(successCallback, errorCallback) { - - let that = this - if (!this.uuid) { - - this.errorMessage = 'no uuid. cannot delete' - that.defaultErrorHandler(this.errorMessage, errorCallback) - - return - } - - let url = this.getUrlDelete(this.uuid) - - if (!url) { - return - } - - this.httpPost(url, {}, function (response) { - - that.safeCallback(successCallback)(response) - - }, errorCallback) - - } - - httpSort(uuid1, sort1, uuid2, sort2, successCallback, failureCallback) { - - let that = this - - if (!uuid1 || !uuid2 || !(sort1 === 0 || sort1) || !(sort2 === 0 || sort2)) { - - this.errorMessage = 'params error' - that.defaultErrorHandler(this.errorMessage, failureCallback) - - return - } - - let url = this.getUrlSort() - - if (!url) { - - that.defaultErrorHandler(this.errorMessage, failureCallback) - return - } - - let params = { - uuid1: uuid1, - sort1: sort1, - uuid2: uuid2, - sort2: sort2 - } - - this.httpPost(url, params, successCallback, failureCallback) - } - - - getUrlCreate() { - let prefix = this.getUrlPrefix() - - return prefix + '/create' - } - - getUrlDelete(uuid = null) { - let prefix = this.getUrlPrefix() - - if (uuid === null) { - return prefix + '/delete?uuid={uuid}' - } else { - return prefix + '/delete?uuid=' + uuid - } - } - - getUrlEdit() { - let prefix = this.getUrlPrefix() - - return prefix + '/edit' - } - - getUrlDetail(uuid = null) { - let prefix = this.getUrlPrefix() - - if (uuid === null) { - return prefix + '/detail?uuid={uuid}' - } else { - return prefix + '/detail?uuid=' + uuid - } - - } - - getUrlPage() { - let prefix = this.getUrlPrefix() - - return prefix + '/page' - } - - getUrlSort() { - let prefix = this.getUrlPrefix() - - return prefix + '/sort' - } - -} - diff --git a/src/model/base/Filter.js b/src/model/base/Filter.js deleted file mode 100644 index 2863242..0000000 --- a/src/model/base/Filter.js +++ /dev/null @@ -1,153 +0,0 @@ -/** - * 在列表页面中,筛选就需要这个类。 - * - */ -import BaseEntity from './BaseEntity' -import {isEmptyObject} from '../../common/util/Utils' -import {FilterType} from "./FilterType"; -import {simpleDate, simpleDateTime} from "../../common/filter/time"; - -export default class Filter { - - constructor(type, name, key, options, Clazz, visible = true) { - if (!type || !name || !key) { - console.error('Filter params error!' + type + ' ' + name + ' ' + key) - return - } - - //类别 搜索框,排序,下拉框 - this.type = type - //显示名称,一般中文 - this.name = name - //提交参数时的键值 - this.key = key - //对于搜索框 -> 字符串 排序 -> ASC/DESC/null 下拉框 -> OK/ERROR/RUNNING等 - this.value = null - - //对于下拉框,当前活跃的。 - this.active = -1 - - this.options = options - - this.Clazz = Clazz - - //是否可见。有些时候我们希望Filter不显示,但是同时又具有筛选的功能。 - this.visible = visible - - //HTTP_SELECTION的过滤条件。 - this.initFilter = {} - - if (type === FilterType.SELECTION) { - if (!options || !(options instanceof Array)) { - console.error('Filter SELECTION 的 options必须指定,并且为数组,同时必须包含name和value键值(style可选)!') - - } - } else if (type === FilterType.MULTI_SELECTION) { - if (!options || !(options instanceof Array)) { - console.error('Filter MULTI_SELECTION 的 options必须指定,并且为数组,同时必须包含name和value键值(style可选)!') - - } else { - this.value = [] - } - } else if (type === FilterType.HTTP_SELECTION) { - if (!Clazz || !(Clazz.prototype instanceof BaseEntity)) { - console.error('Clazz必须指定,并且为BaseEntity的子类!') - - } - } - - } - - isEmpty() { - - if (this.type === FilterType.MULTI_SELECTION) { - return isEmptyObject(this.value) - } else if (this.type === FilterType.CHECK) { - return this.value === null - } else { - return !this.value - } - }; - - reset() { - this.value = null - this.active = -1 - }; - - putValue(value) { - if (value === null) { - this.value = null - return - } - - if (this.type === FilterType.MULTI_SELECTION) { - - let draftArray = null - if (value instanceof Array) { - draftArray = value - } else { - draftArray = value.split(',') - } - let arr = [] - for (let i = 0; i < draftArray.length; i++) { - let item = draftArray[i] - - //验证值是否落在options中。 - for (let j = 0; j < this.options.length; j++) { - let opt = this.options[j] - if (opt.value === item) { - //保证唯一性 - if (arr.indexOf(item) === -1) { - arr.push(item) - } - break - } - } - } - this.value = arr - } else if (this.type === FilterType.SELECTION) { - - for (let j = 0; j < this.options.length; j++) { - - let opt = this.options[j] - if (opt.value === value) { - this.value = value - this.active = j - } - - } - } else { - this.value = value - } - - }; - - //把filter中的value装填到params中,供params去进行http请求。 - getParam() { - - if (this.type === FilterType.MULTI_SELECTION) { - if (this.value && this.value.length) { - return this.value.toString() - } else { - return null - } - } else if (this.type === FilterType.DATE_TIME_SELECTION) { - if (this.value instanceof Date) { - return simpleDateTime(this.value) - } else { - return this.value - } - } else if (this.type === FilterType.DATE_SELECTION) { - if (this.value instanceof Date) { - return simpleDate(this.value) - } else { - return this.value - } - } else { - return this.value - } - - }; - -} - diff --git a/src/model/base/FilterType.js b/src/model/base/FilterType.js deleted file mode 100644 index fe0faa2..0000000 --- a/src/model/base/FilterType.js +++ /dev/null @@ -1,23 +0,0 @@ -let FilterType = { - //用于boolean筛选 - CHECK: 'CHECK', - //用于文本输入筛选 - INPUT: 'INPUT', - //用于排序字段筛选 - SORT: 'SORT', - //用于有限的状态筛选 - SELECTION: 'SELECTION', - //用于从有限的状态中选出多项,比如:status = RUNNING or status = STOP - MULTI_SELECTION: 'MULTI_SELECTION', - //用于Pager筛选。要求一页能够展示完的那种。 - HTTP_SELECTION: 'HTTP_SELECTION', - //用于输入框从远程筛选。 - HTTP_INPUT_SELECTION: 'HTTP_INPUT_SELECTION', - //用于按照时间筛选,生成的时间格式是 yyyy-MM-dd HH:mm:ss - DATE_TIME_SELECTION: 'DATE_TIME_SELECTION', - //用于按照日期筛选,生成的时间格式是 yyyy-MM-dd - DATE_SELECTION: 'DATE_SELECTION' - -} - -export {FilterType} diff --git a/src/model/base/Pager.js b/src/model/base/Pager.js deleted file mode 100644 index dc03279..0000000 --- a/src/model/base/Pager.js +++ /dev/null @@ -1,339 +0,0 @@ -import Base from './Base' -import Vue from 'vue' -import $ from 'jquery' -import {isInteger} from '../../common/util/Utils' -import Filter from "./Filter"; -import {FilterType} from "./FilterType"; - -export default class Pager extends Base { - - static MAX_PAGE_SIZE = 100 - - constructor(Clazz, pageSize = 10, page = 0) { - super() - - this.page = page - this.pageSize = pageSize - this.totalItems = 0 - this.totalPages = 0 - this.data = [] - - //this field means whether add filter query to the URL. - this.history = null - - //供nb-pager使用的 - this.offset = 3 - - //是否去服务器请求过。主要用来判断hasMore. - this.hasRequested = false - - //list attributes. - if (Clazz && (Clazz.prototype instanceof Base)) { - this.Clazz = Clazz - - //考虑兼容模式,允许自定义URL_PAGE. - let urlPage = Clazz.prototype.URL_PAGE - if (!urlPage) { - urlPage = Clazz.prototype.getUrlPage() - } - if (urlPage) { - this.URL_PAGE = urlPage - } else { - console.error('The Clazz MUST define a prototype named \'URL_PAGE\'') - } - - if (Clazz.prototype.getFilters) { - - //这个地方的Filter不能用同一个,会出问题的。 - this.filters = Clazz.prototype.getFilters() - - } else { - console.error('The Clazz MUST define a prototype method named \'getFilters\'') - } - - } else { - console.error('You MUST specify a Clazz extended Base', Clazz) - } - - } - - //hasMore - hasMore() { - - if (this.hasRequested) { - - return this.totalPages > this.page + 1; - - } else { - return true - } - - } - - //重置Filter。 - resetFilter() { - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - filter.reset() - } - }; - - //重置Filter。 - resetSortFilters() { - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.type === FilterType.SORT) { - filter.reset() - } - } - }; - - //手动设置过滤器的值 - setFilterValue(key, value) { - if (!this.filters || !this.filters.length) { - return - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.key === key) { - filter.putValue(value) - } - } - }; - - //根据key来删除某个Filter - removeFilter(key) { - if (!this.filters || !this.filters.length) { - return - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.key === key) { - this.filters.splice(i, 1) - break - } - } - }; - - //隐藏某个Filter,实际上我们可以根据这个filter来筛选,只不过不出现在NbFilter中而已。 - showFilter(key, visible = true) { - if (!this.filters || !this.filters.length) { - return - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.key === key) { - filter.visible = visible - break - } - } - }; - - showAllFilter(visible = true) { - if (!this.filters || !this.filters.length) { - return - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - filter.visible = visible - } - } - - //根据一个key来获取某个filter - getFilter(key) { - if (!this.filters || !this.filters.length) { - return null - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.key === key) { - return filter - } - } - }; - - //获取当前进行sort的那个filter - getCurrentSortFilter() { - if (!this.filters || !this.filters.length) { - return null - } - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - if (filter.type === FilterType.SORT && !filter.isEmpty()) { - return filter - } - } - return null - } - - //根据一个key来获取某个filter - getFilterValue(key) { - let filter = this.getFilter(key) - if (!filter) { - return null - } else { - return filter.getParam() - } - - }; - - //获取所有的filter参数,键值对形式 - getParams() { - - let params = { - page: this.page, - pageSize: this.pageSize - } - if (!this.filters || !this.filters.length) { - return params - } - - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - - if (filter.getParam() !== null && filter.getParam() !== '') { - params[filter.key] = filter.getParam() - } - } - - return params; - }; - - //获取当前pager中的list - getList() { - return this.data - } - - isEmpty() { - if (!this.data) { - return true - } - return this.data.length === 0 - - } - - //该方法是在地址栏添加上query参数,参数就是filters中的key和value. - //同时地址栏上有的参数也会自动读取到filters中去 - //因此,启用该方法后返回时可以停留在之前的页码中。 - enableHistory() { - this.history = true - - let query = Vue.store.state.route.query - - if (typeof query.page !== 'undefined') { - this.page = parseInt(query.page) - } - if (typeof query.pageSize !== 'undefined') { - this.pageSize = parseInt(query.pageSize) - } - - if (!isInteger(this.page)) { - this.page = 0 - } - if (!isInteger(this.pageSize)) { - this.pageSize = 10 - } - - //try to fill the filters by query. - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - - if (typeof query[filter.key] !== 'undefined') { - - let value = query[filter.key] - //check类型的要转成boolean. - if (filter.type === FilterType.CHECK) { - if (value === 'true') { - value = true - } else if (value === 'false') { - value = false - } else { - value = null - } - } - filter.putValue(value) - - } - - } - } - - //you can specify the page url here. - httpCustomPage(url, params, successCallback, errorCallback) { - let that = this - this.loading = true - this.errorMessage = null - - if (this.history) { - history.replaceState({}, '', Vue.store.state.route.path + '?' + $.param(params)) - } - - //是否请求过的标志位变更。 - this.hasRequested = true - this.httpGet(url, params, function (response) { - that.loading = false - - that.render(response.data.data) - - that.safeCallback(successCallback)(response) - - }, errorCallback) - - }; - - //use default filters as parameters.. - httpFastPage(successCallback, errorCallback) { - - if (!isInteger(this.page)) { - this.page = 0 - } - - if (!isInteger(this.pageSize)) { - this.pageSize = 10 - } - - let params = { - page: this.page, - pageSize: this.pageSize - } - - for (let i = 0; i < this.filters.length; i++) { - let filter = this.filters[i] - - if (filter.getParam() !== null && filter.getParam() !== '') { - params[filter.key] = filter.getParam() - } - } - - - this.httpCustomPage(this.URL_PAGE, params, successCallback, errorCallback) - - }; - - //use default url_page. - httpPage(params, successCallback, errorCallback) { - - this.httpCustomPage(this.URL_PAGE, params, successCallback, errorCallback) - - }; - - render(obj) { - - super.render(obj) - this.renderList('data', this.Clazz) - - } - - //清空data中的数据。 - clear() { - this.data.splice(0, this.data.length) - this.page = 0 - this.totalItems = 0 - this.totalPages = 0 - } - -} - - - - diff --git a/src/model/base/ResultCode.js b/src/model/base/ResultCode.js deleted file mode 100644 index 3b0f5e2..0000000 --- a/src/model/base/ResultCode.js +++ /dev/null @@ -1,80 +0,0 @@ -let ResultCode = { - - OK: "OK", - BAD_REQUEST: "BAD_REQUEST", - NEED_SHARE_CODE: "NEED_SHARE_CODE", - SHARE_CODE_ERROR: "SHARE_CODE_ERROR", - LOGIN: "LOGIN", - USER_DISABLED: "USER_DISABLED", - UNAUTHORIZED: "UNAUTHORIZED", - NOT_FOUND: "NOT_FOUND", - RANGE_NOT_SATISFIABLE: "RANGE_NOT_SATISFIABLE", - NOT_INSTALLED: "NOT_INSTALLED", - SERVER: "SERVER", - UNKNOWN: "UNKNOWN", - -} - -let ResultCodeMap = { - - OK: { - name: "成功", - value: "OK" - }, - BAD_REQUEST: { - name: "请求不合法", - value: "BAD_REQUEST" - }, - NEED_SHARE_CODE: { - name: "提取码必填", - value: "NEED_SHARE_CODE" - }, - SHARE_CODE_ERROR: { - name: "提取码错误", - value: "SHARE_CODE_ERROR" - }, - LOGIN: { - name: "未登录,禁止访问", - value: "LOGIN" - }, - USER_DISABLED: { - name: "用户被禁用", - value: "LOGIN" - }, - UNAUTHORIZED: { - name: "没有权限,禁止访问", - value: "UNAUTHORIZED" - }, - NOT_FOUND: { - name: "内容不存在", - value: "NOT_FOUND" - }, - RANGE_NOT_SATISFIABLE: { - name: "范围错误", - value: "RANGE_NOT_SATISFIABLE" - }, - NOT_INSTALLED: { - name: "尚未安装", - value: "NOT_INSTALLED" - }, - SERVER: { - name: "服务器未知错误", - value: "SERVER" - }, - - UNKNOWN: { - name: "服务器未知错误", - value: "UNKNOWN" - } - - -} - -let ResultCodeList = []; -for (let key in ResultCodeMap) { - if (ResultCodeMap.hasOwnProperty(key)) { - ResultCodeList.push(ResultCodeMap[key]); - } -} - -export {ResultCode, ResultCodeMap, ResultCodeList}; diff --git a/src/model/base/SortDirection.js b/src/model/base/SortDirection.js deleted file mode 100644 index 6a31c17..0000000 --- a/src/model/base/SortDirection.js +++ /dev/null @@ -1,6 +0,0 @@ -let SortDirection = { - ASC: 'ASC', - DESC: 'DESC' -} - -export {SortDirection} diff --git a/src/model/dashboard/Dashboard.js b/src/model/dashboard/Dashboard.js deleted file mode 100644 index cf045c9..0000000 --- a/src/model/dashboard/Dashboard.js +++ /dev/null @@ -1,47 +0,0 @@ -import BaseEntity from '../base/BaseEntity' -import Filter from "../base/Filter"; -import {FilterType} from "../base/FilterType"; -import {lowerSlash} from "../../common/filter/str"; - -export default class Dashboard extends BaseEntity { - - static URL_ACTIVE_IP_TOP10 = "/api/dashboard/active/ip/top10" - - constructor(args) { - super(args) - - this.invokeNum = 0; - this.totalInvokeNum = 0; - this.uv = 0; - this.totalUv = 0; - this.matterNum = 0; - this.totalMatterNum = 0; - this.fileSize = 0; - this.totalFileSize = 0; - this.avgCost = 0; - this.dt = 0; - } - - //获取到当前实体的url前缀。 - getUrlPrefix() { - return "/api/dashboard" - } - - render(obj) { - super.render(obj) - - } - - getFilters() { - return [ - ...super.getFilters(), - new Filter(FilterType.SORT, 'Sort Dt', 'orderDt') - ] - } - - httpActiveIpTop10(successCallback, errorCallback) { - let that = this - this.httpPost(Dashboard.URL_ACTIVE_IP_TOP10, {}, successCallback, errorCallback) - } - -} diff --git a/src/model/download/token/DownloadToken.js b/src/model/download/token/DownloadToken.js deleted file mode 100644 index d12d935..0000000 --- a/src/model/download/token/DownloadToken.js +++ /dev/null @@ -1,46 +0,0 @@ -import BaseEntity from '../../base/BaseEntity' -import Filter from "../../base/Filter"; -import {FilterType} from "../../base/FilterType"; -import {simpleDateTime} from "../../../common/filter/time"; - -export default class DownloadToken extends BaseEntity { - - static URL_FETCH_DOWNLOAD_TOKEN = "/api/alien/fetch/download/token" - - constructor(args) { - super(args) - this.userUuid = null - this.matterUuid = null - this.expireTime = null - this.ip = null - } - getUrlPrefix() { - return "/api/download/token" - } - - render(obj) { - super.render(obj) - this.renderEntity("expireTime", Date) - } - - getFilters() { - return [ - ...super.getFilters() - ] - } - - httpFetchDownloadToken(matterUuid, successCallback, errorCallback) { - let that = this - let date = new Date(new Date().getTime() + 10 * 60 * 1000) - - let form = { - expireTime: simpleDateTime(date), - matterUuid - } - this.httpPost(DownloadToken.URL_FETCH_DOWNLOAD_TOKEN, form, function (response) { - that.render(response.data.data) - that.safeCallback(successCallback)(response) - }, errorCallback) - } - -} diff --git a/src/model/image/cache/ImageCache.js b/src/model/image/cache/ImageCache.js deleted file mode 100644 index 08ef2d6..0000000 --- a/src/model/image/cache/ImageCache.js +++ /dev/null @@ -1,70 +0,0 @@ -import BaseEntity from '../../base/BaseEntity' -import Filter from '../../base/Filter' -import {FilterType} from "../../base/FilterType"; -import User from "../../user/User"; -import Matter from "../../matter/Matter"; - -export default class ImageCache extends BaseEntity { - - static URL_DELETE_BATCH = '/api/image/cache/delete/batch' - - constructor(args) { - super(args) - - this.name = null; - this.userUuid = null; - this.matterUuid = null; - this.matterName = null; - this.mode = null; - this.md5 = null; - this.size = 0; - this.path = 0; - - /* - 这部分是辅助UI的字段信息 - */ - //作为勾选变量 - this.check = false - - this.user = new User() - this.matter = new Matter() - } - getUrlPrefix() { - return "/api/image/cache" - } - render(obj) { - super.render(obj) - - } - - getFilters() { - return [ - ...super.getFilters(), - new Filter(FilterType.INPUT, 'User Uuid', 'userUuid', null, null, false), - new Filter(FilterType.INPUT, 'File Uuid', 'matterUuid', null, null, false) - ] - } - - getForm() { - return { - uuid: this.uuid ? this.uuid : null - } - } - - getResizeUrl() { - return '/api/alien/preview/' + this.matterUuid + '/' + this.matterName + "?ir=" + this.mode - } - - getOriginUrl() { - return '/api/alien/download/' + this.matterUuid + '/' + this.matterName - } - - - httpDeleteBatch(uuids, successCallback, errorCallback) { - this.httpPost(ImageCache.URL_DELETE_BATCH, {'uuids': uuids}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - -} diff --git a/src/model/install/Install.js b/src/model/install/Install.js deleted file mode 100644 index 2313105..0000000 --- a/src/model/install/Install.js +++ /dev/null @@ -1,294 +0,0 @@ -import BaseEntity from '../base/BaseEntity' -import Vue from "vue" - -export default class Install extends BaseEntity { - - static URL_VERIFY = '/api/install/verify' - static URL_TABLE_INFO_LIST = '/api/install/table/info/list' - static URL_ADMIN_LIST = '/api/install/admin/list' - static URL_CREATE_TABLE = '/api/install/create/table' - static URL_CREATE_ADMIN = '/api/install/create/admin' - static URL_VALIDATE_ADMIN = '/api/install/validate/admin' - static URL_FINISH = '/api/install/finish' - - constructor(args) { - super(args) - - //数据库名 - this.mysqlPort = 3306 - this.mysqlHost = "127.0.0.1" - this.mysqlSchema = "tank" - this.mysqlUsername = "tank" - this.mysqlPassword = null - this.mysqlCharset = "utf8" - - //管理员用户名 - this.adminUsername = null - this.adminPassword = null - this.adminRepassword = null - - //表元信息 - this.tableInfoList = [] - - //管理员列表 - this.adminList = [] - - //数据库连接是否可用 - this.verified = false - //管理员配置完毕 - this.adminConfigured = false - - - this.validatorSchema = { - mysqlPort: { - rules: [{required: true, message: 'MySQL required'}], - error: null - }, - mysqlHost: { - rules: [{required: true, message: 'MySQL Host required'}], - error: null - }, - mysqlSchema: { - rules: [{required: true, message: 'MySQL schema required'}], - error: null - }, - mysqlUsername: { - rules: [{required: true, message: 'MySQL username required'}], - error: null - }, - mysqlPassword: { - rules: [{required: true, message: 'MySQL password required'}], - error: null - } - - } - - this.adminValidatorSchema = { - adminUsername: { - rules: [ - {required: true, message: 'Username required'}, - { - type: 'string', - pattern: /^[0-9a-zA-Z_]+$/, - message: Vue.i18n.t("model.usernameRule") - }], - error: null - }, - adminPassword: { - rules: [ - {required: true, message: 'Password required'}, - {min: 6, message: Vue.i18n.t("model.passwordRule")} - ], - error: null - }, - adminRepassword: { - rules: [ - {required: true, message: 'Password required'}, - {min: 6, message: Vue.i18n.t("model.passwordRule")} - ], - error: null - } - - } - - } - - getUrlPrefix() { - return "/api/install" - } - render(obj) { - super.render(obj) - } - - getForm() { - return { - mysqlPort: this.mysqlPort, - mysqlHost: this.mysqlHost, - mysqlSchema: this.mysqlSchema, - mysqlUsername: this.mysqlUsername, - mysqlPassword: this.mysqlPassword, - mysqlCharset: this.mysqlCharset, - } - } - - validate(validatorSchema = this.validatorSchema) { - return super.validate(validatorSchema) - } - - //表创建完毕 - tableCreated() { - if (!this.tableInfoList || this.tableInfoList.length === 0) { - return false - } - for (let i = 0; i < this.tableInfoList.length; i++) { - let tableInfo = this.tableInfoList[i] - if (!tableInfo.tableExist) { - return false - } - - if (tableInfo.tableExist && tableInfo.missingFields.length !== 0) { - return false - } - } - - return true; - } - - - httpVerify(successCallback, errorCallback) { - let that = this - - if (!this.validate()) { - this.defaultErrorHandler("Validate error", errorCallback) - return - } - - this.httpPost(Install.URL_VERIFY, this.getForm(), function (response) { - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - httpTableInfoList(successCallback, errorCallback) { - let that = this - - if (!this.verified) { - this.defaultErrorHandler("Please verify mysql first", errorCallback) - return - } - - this.httpPost(Install.URL_TABLE_INFO_LIST, this.getForm(), function (response) { - - that.tableInfoList.splice(0, that.tableInfoList.length); - that.tableInfoList.push(...response.data.data) - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - httpCreateTable(successCallback, errorCallback) { - let that = this - - if (!this.verified) { - this.defaultErrorHandler("Please verify mysql first", errorCallback) - return - } - - this.httpPost(Install.URL_CREATE_TABLE, this.getForm(), function (response) { - - that.tableInfoList.splice(0, that.tableInfoList.length); - that.tableInfoList.push(...response.data.data) - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - //获取管理员列表 - httpAdminList(successCallback, errorCallback) { - let that = this - - if (!this.tableCreated()) { - this.defaultErrorHandler("Please verify create table first", errorCallback) - return - } - - - let form = this.getForm() - - - this.httpPost(Install.URL_ADMIN_LIST, form, function (response) { - - - that.adminList.splice(0, that.adminList.length); - that.adminList.push(...response.data.data) - - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - - httpCreateAdmin(successCallback, errorCallback) { - let that = this - - if (!this.tableCreated()) { - this.defaultErrorHandler("Please verify create table first", errorCallback) - return - } - - - if (!this.validate(that.adminValidatorSchema)) { - this.defaultErrorHandler("Validate error", errorCallback) - return - } - - - if (this.adminPassword !== this.adminRepassword) { - this.defaultErrorHandler("password not same", errorCallback) - return - } - - - let form = this.getForm() - form["adminUsername"] = this.adminUsername - form["adminPassword"] = this.adminPassword - - - this.httpPost(Install.URL_CREATE_ADMIN, form, function (response) { - - that.adminConfigured = true - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - - //验证管理员账号 - httpValidateAdmin(successCallback, errorCallback) { - let that = this - - if (!this.tableCreated()) { - this.defaultErrorHandler("Please verify create table first", errorCallback) - return - } - - if (!this.adminUsername || !this.adminPassword) { - this.defaultErrorHandler("username and password required", errorCallback) - return - } - - let form = this.getForm() - form["adminUsername"] = this.adminUsername - form["adminPassword"] = this.adminPassword - - - this.httpPost(Install.URL_VALIDATE_ADMIN, form, function (response) { - - that.adminConfigured = true - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - - //完成安装过程 - httpFinish(successCallback, errorCallback) { - let that = this - - - let form = this.getForm() - - this.httpPost(Install.URL_FINISH, form, function (response) { - - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - -} diff --git a/src/model/matter/Matter.js b/src/model/matter/Matter.js deleted file mode 100644 index 6667109..0000000 --- a/src/model/matter/Matter.js +++ /dev/null @@ -1,478 +0,0 @@ -import BaseEntity from '../base/BaseEntity' -import Filter from '../base/Filter' -import {Message} from 'element-ui' -import {getMimeType} from '../../common/util/MimeUtil' -import {containStr, endWith, getExtension, startWith} from '../../common/filter/str' -import User from '../user/User' -import Vue from "vue" -import {FilterType} from "../base/FilterType"; -import {handleImageUrl} from "../../common/util/ImageUtil"; -import {currentHost} from "../../common/util/Utils"; -import DownloadToken from "../download/token/DownloadToken"; -import FileUtil from "../../common/util/FileUtil"; - -export default class Matter extends BaseEntity { - - static URL_MATTER_CREATE_DIRECTORY = '/api/matter/create/directory' - static URL_MATTER_DELETE = '/api/matter/delete' - static URL_MATTER_DELETE_BATCH = '/api/matter/delete/batch' - static URL_MATTER_RENAME = '/api/matter/rename' - static URL_CHANGE_PRIVACY = '/api/matter/change/privacy' - static URL_MATTER_MOVE = '/api/matter/move' - static URL_MATTER_DOWNLOAD = '/api/matter/download' - static URL_MATTER_UPLOAD = '/api/matter/upload' - static URL_MATTER_ZIP = '/api/matter/zip' - - static MATTER_ROOT = "root" - - constructor(args) { - super(args) - this.puuid = null - this.userUuid = null - this.dir = false - this.alien = false - this.name = null - this.md5 = null - this.size = 0 - this.privacy = true - this.path = null - this.times = 0; - - this.parent = null; - - /* - 这部分是辅助UI的字段信息 - */ - //作为勾选变量 - this.check = false - - //允许用户选择的文件类型 - this.filter = "*" - //本地字段 - //给用户的提示文字 - this.uploadHint = null - //浏览器中选择好的原生file,未作任何处理。 - this.file = null - //当前上传进度的数值 0-1之间 - this.progress = 0 - //实时上传速度 byte/s - this.speed = 0 - - - } - - getFilters() { - return [ - ...super.getFilters(), - new Filter(FilterType.INPUT, '父级菜单uuid', 'puuid', null, null, false), - new Filter(FilterType.INPUT, '用户', 'userUuid', null, User, false), - new Filter(FilterType.INPUT, '关键字', 'name'), - new Filter(FilterType.CHECK, '文件夹', 'dir'), - new Filter(FilterType.CHECK, '应用数据', 'alien'), - new Filter(FilterType.SORT, '文件夹', 'orderDir'), - new Filter(FilterType.SORT, '下载次数', 'orderTimes'), - new Filter(FilterType.SORT, '大小', 'orderSize'), - new Filter(FilterType.SORT, '名称', 'orderName'), - new Filter(FilterType.INPUT, '后缀名', 'extensions'), - new Filter(FilterType.INPUT, '分享uuid', 'shareUuid'), - new Filter(FilterType.INPUT, '提取码', 'shareCode'), - new Filter(FilterType.INPUT, '分享根目录', 'shareRootUuid') - ] - } - - getUrlPrefix() { - return "/api/matter" - } - - render(obj) { - super.render(obj) - super.renderEntity("parent", Matter) - } - - - isImage() { - return FileUtil.isImage(this.name) - } - - - isPdf() { - return FileUtil.isPdf(this.name) - } - - isText() { - return FileUtil.isText(this.name) - } - - isDoc() { - return FileUtil.isDoc(this.name) - } - - isPpt() { - return FileUtil.isPpt(this.name) - } - - isXls() { - return FileUtil.isXls(this.name) - } - - isAudio() { - return FileUtil.isAudio(this.name) - } - - isVideo() { - return FileUtil.isVideo(this.name) - } - - isPsd() { - return FileUtil.isPsd(this.name) - } - - getIcon() { - if (FileUtil.isImage(this.name)) { - return handleImageUrl(this.getPreviewUrl(), false, 100, 100) - } else { - return FileUtil.getIcon(this.name, this.dir) - } - } - - //下载文件 - download(downloadUrl = null) { - if (!downloadUrl) { - downloadUrl = this.getDownloadUrl() - } - window.open(downloadUrl) - } - - //下载zip包 - downloadZip(uuidsString) { - window.open(currentHost() + Matter.URL_MATTER_ZIP + "?uuids=" + uuidsString) - } - - //预览文件 在分享的预览中才主动传入previewUrl. - preview(previewUrl = null) { - let that = this; - - let shareMode = true - if (previewUrl) { - shareMode = true - } else { - shareMode = false - previewUrl = that.getPreviewUrl() - } - - if (that.isImage()) { - - Vue.$photoSwipePlugin.showPhoto(previewUrl) - - } else if (that.isPdf()) { - - Vue.$previewer.previewPdf(that.name, previewUrl, that.size) - - } else if (that.isDoc() || that.isPpt() || that.isXls()) { - - //如果是分享中的预览,直接就可以公有访问。 - if (shareMode) { - Vue.$previewer.previewOffice(that.name, previewUrl, that.size) - } else { - - //如果是共有文件 office文件的预览请求一次性链接。 - if (this.privacy) { - - let downloadToken = new DownloadToken() - downloadToken.httpFetchDownloadToken(that.uuid, function () { - Vue.$previewer.previewOffice(that.name, that.getPreviewUrl(downloadToken.uuid), that.size) - }) - } else { - Vue.$previewer.previewOffice(that.name, previewUrl, that.size) - } - } - - - } else if (that.isText()) { - - Vue.$previewer.previewText(that.name, previewUrl, that.size) - - } else if (that.isAudio()) { - - Vue.$previewer.previewAudio(that.name, previewUrl, that.size) - - } else if (that.isVideo()) { - - Vue.$previewer.previewVideo(that.name, previewUrl, that.size) - - } else { - window.open(this.getPreviewUrl()) - } - } - - - httpCreateDirectory(successCallback, errorCallback) { - let that = this - let form = {'userUuid': that.userUuid, 'name': that.name, 'puuid': that.puuid} - - this.httpPost(Matter.URL_MATTER_CREATE_DIRECTORY, form, function (response) { - that.render(response.data.data) - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - httpDelete(successCallback, errorCallback) { - this.httpPost(Matter.URL_MATTER_DELETE, {'uuid': this.uuid}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpDeleteBatch(uuids, successCallback, errorCallback) { - this.httpPost(Matter.URL_MATTER_DELETE_BATCH, {'uuids': uuids}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpRename(name, successCallback, errorCallback) { - let that = this - this.httpPost(Matter.URL_MATTER_RENAME, {'uuid': this.uuid, 'name': name}, function (response) { - that.render(response.data.data) - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpChangePrivacy(privacy, successCallback, errorCallback) { - let that = this - this.httpPost(Matter.URL_CHANGE_PRIVACY, {'uuid': this.uuid, 'privacy': privacy}, function (response) { - that.privacy = privacy - if (typeof successCallback === "function") { - successCallback(response) - } else { - Message.success(response.data.msg) - } - }, errorCallback) - } - - httpMove(srcUuids, destUuid, successCallback, errorCallback) { - let form = {'srcUuids': srcUuids} - if (destUuid) { - form.destUuid = destUuid - } else { - form.destUuid = 'root' - } - this.httpPost(Matter.URL_MATTER_MOVE, form, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - /* - 以下是和上传相关的内容。 - */ - - //从file中装填metaData - validate() { - - if (!this.file) { - this.errorMessage = '请选择上传文件' - return false - } - - this.name = this.file.name - if (!this.name) { - this.errorMessage = '请选择上传文件' - return false - } - - this.size = this.file.size - - this.errorMessage = null - return true - - } - - //验证过滤器有没有误填写,这个方法主要给开发者使用。 - validateFilter() { - - let filter = this.filter - if (filter === null || filter === '') { - this.errorMessage = '过滤器设置错误,请检查-1' - console.error('过滤器设置错误,请检查.-1') - return false - } - if (filter !== '*') { - let regex1 = /^(image|audio|video|text)(\|(image|audio|video|text))*$/g - let regex2 = /^(\.[\w]+)(\|\.[\w]+)*$/ - // 测试几种特殊类型 image|audio|video|text - - if (!regex1.test(filter)) { - //测试后缀名 - if (!regex2.test(filter)) { - this.errorMessage = '过滤器设置错误,请检查-2' - console.error('过滤器设置错误,请检查.-2') - return false - } - } - } - - //validate privacy - let privacy = this.privacy - if (privacy !== true) { - if (privacy !== false) { - this.errorMessage = 'privacy属性为Boolean类型' - console.error('privacy属性为Boolean类型.') - return false - } - } - - return true - } - - //验证用户上传的文件是否符合过滤器 - validateFileType() { - if (!this.filter) { - this.errorMessage = '该过滤条件有问题' - return false - } - if (this.filter === '*') { - this.errorMessage = null - return true - } - - let type = getMimeType(this.name) - let extension = getExtension(this.name) - let simpleType = type.substring(0, type.indexOf('/')) - - //专门解决android微信浏览器中名字乱命名的bug. - if (startWith(this.name, 'image%3A')) { - extension = 'jpg' - simpleType = 'image' - } else if (startWith(this.name, 'video%3A')) { - extension = 'mp4' - simpleType = 'video' - } else if (startWith(this.name, 'audio%3A')) { - extension = 'mp3' - simpleType = 'audio' - } - - if (containStr(this.filter, extension)) { - this.errorMessage = null - return true - } - - if (simpleType) { - if (containStr(this.filter, simpleType)) { - this.errorMessage = null - return true - } - } - this.errorMessage = '您上传的文件格式不符合要求' - return false - } - - - //文件上传 - httpUpload(successCallback, failureCallback) { - - let that = this - - //验证是否装填好 - if (!this.validate()) { - return - } - - //验证用户填写的过滤条件是否正确 - if (!this.validateFilter()) { - return - } - - //验证是否满足过滤器 - if (!this.validateFileType()) { - return - } - - //(兼容性:chrome,ff,IE9及以上) - let formData = new FormData() - - formData.append('userUuid', that.userUuid) - formData.append('puuid', that.puuid) - formData.append('file', that.file) - formData.append('alien', that.alien) - formData.append('privacy', that.privacy) - - - //闭包 - let lastTimeStamp = new Date().getTime() - let lastSize = 0 - that.httpPost(Matter.URL_MATTER_UPLOAD, formData, function (response) { - - that.uuid = response.data.data.uuid - - if (typeof successCallback === "function") { - successCallback() - } - - }, function (response) { - - - that.errorMessage = '上传出错,请稍后重试' - that.clear() - - that.defaultErrorHandler(response, failureCallback) - - }, { - progress: function (event) { - - //上传进度。 - that.progress = event.loaded / event.total - - let currentTime = (new Date()).getTime(); - let deltaTime = currentTime - lastTimeStamp; - - - //每2s计算一次速度 - if (deltaTime > 1000) { - lastTimeStamp = currentTime; - - let currentSize = event.loaded; - let deltaSize = currentSize - lastSize; - lastSize = currentSize; - - - that.speed = (deltaSize / (deltaTime / 1000)).toFixed(0); - } - - } - }) - - } - - //清除文件 - clear() { - - //filter,privacy不变 - let matter = new Matter() - matter.filter = this.filter - matter.privacy = this.privacy - matter.errorMessage = this.errorMessage - matter.uploadHint = this.uploadHint - this.render(matter) - - } - - getDownloadUrl(downloadTokenUuid = null) { - return currentHost() + '/api/alien/download/' + this.uuid + '/' + this.name + (downloadTokenUuid ? '?downloadTokenUuid=' + downloadTokenUuid : '') - } - - getPreviewUrl(downloadTokenUuid = null) { - return currentHost() + '/api/alien/preview/' + this.uuid + '/' + this.name + (downloadTokenUuid ? '?downloadTokenUuid=' + downloadTokenUuid : '') - } - - getShareDownloadUrl(shareUuid, shareCode, shareRootUuid) { - return currentHost() + '/api/alien/download/' + this.uuid + '/' + this.name + '?shareUuid=' + shareUuid + "&shareCode=" + shareCode + "&shareRootUuid=" + shareRootUuid - } - - getSharePreviewUrl(shareUuid, shareCode, shareRootUuid) { - return currentHost() + '/api/alien/preview/' + this.uuid + '/' + this.name + '?shareUuid=' + shareUuid + "&shareCode=" + shareCode + "&shareRootUuid=" + shareRootUuid - } - - -} diff --git a/src/model/preference/Preference.js b/src/model/preference/Preference.js deleted file mode 100644 index 4f3e1fe..0000000 --- a/src/model/preference/Preference.js +++ /dev/null @@ -1,110 +0,0 @@ -import BaseEntity from '../base/BaseEntity' - -export default class Preference extends BaseEntity { - - static URL_API_PREFERENCE_FETCH = '/api/preference/fetch' - static URL_API_SYSTEM_CLEANUP = '/api/preference/system/cleanup' - - constructor(args) { - super(args) - //网站名称 - this.name = null - - //logo - this.logoUrl = null - this.faviconUrl = null - - //版权信息 - this.copyright = null - this.record = null - - //大小限制 - this.downloadDirMaxSize = -1 - //文件数量 - this.downloadDirMaxNum = -1 - //用户默认总大小限制 - this.defaultTotalSizeLimit = -1 - //是否允许自主注册 - this.allowRegister = false - //Office预览链接 - this.officeUrl = null - //后台版本 - this.version = null - - this.validatorSchema = { - name: { - rules: [{required: true, message: '网站名称必填'}], - error: null - } - } - } - - getUrlPrefix() { - return "/api/preference" - } - - render(obj) { - super.render(obj) - } - - - getForm() { - return { - name: this.name, - logoUrl: this.logoUrl, - faviconUrl: this.faviconUrl, - copyright: this.copyright, - record: this.record, - downloadDirMaxNum: this.downloadDirMaxNum, - downloadDirMaxSize: this.downloadDirMaxSize, - defaultTotalSizeLimit: this.defaultTotalSizeLimit, - allowRegister: this.allowRegister, - officeUrl: this.officeUrl - } - } - - validate() { - return super.validate() - } - - - //修改title和favicon - updateTitleAndFavicon() { - - if (this.faviconUrl) { - //修改favicon - let link = document.querySelector("link[rel*='icon']") || document.createElement('link'); - link.type = 'image/x-icon'; - link.rel = 'shortcut icon'; - link.href = this.faviconUrl; - document.getElementsByTagName('head')[0].appendChild(link); - } - - document.title = this.name - - } - - - httpFetch(successCallback, errorCallback) { - let that = this - this.httpPost(Preference.URL_API_PREFERENCE_FETCH, {}, function (response) { - that.render(response.data.data) - - that.updateTitleAndFavicon() - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - httpSystemCleanup(password, successCallback, errorCallback) { - let that = this - this.httpPost(Preference.URL_API_SYSTEM_CLEANUP, {password}, function (response) { - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - -} diff --git a/src/model/share/Share.js b/src/model/share/Share.js deleted file mode 100644 index 6a92fc5..0000000 --- a/src/model/share/Share.js +++ /dev/null @@ -1,178 +0,0 @@ -import BaseEntity from '../base/BaseEntity' -import {ShareType} from "./ShareType"; -import {simpleDateTime} from "../../common/filter/time"; -import {ShareExpireOption, ShareExpireOptionMap} from "./ShareExpireOption"; -import FileUtil from "../../common/util/FileUtil"; -import Matter from "../matter/Matter"; -import {currentHost} from "../../common/util/Utils"; -import Vue from "vue" -import {Message, MessageBox} from 'element-ui' - - -export default class Share extends BaseEntity { - - static URL_CREATE = '/api/share/create' - static URL_BROWSE = '/api/share/browse' - static URL_DELETE_BATCH = '/api/share/delete/batch' - static URL_ZIP = '/api/share/zip' - - constructor(args) { - super(args) - - this.name = null - this.shareType = ShareType.MIX - this.userUuid = 0; - this.username = null; - this.downloadTimes = 0; - this.code = null; - this.expireInfinity = false; - this.expireTime = null; - - //当前正在查看的文件夹 - this.dirMatter = new Matter() - //当前share对应的matters - this.matters = [] - - //当前分享正在查看的根目录。前端辅助字段。 - this.rootUuid = Matter.MATTER_ROOT - - //本地临时字段 - this.expireOption = ShareExpireOption.MONTH - - - } - getUrlPrefix() { - return "/api/share" - } - - render(obj) { - super.render(obj) - - this.renderEntity("expireTime", Date) - this.renderEntity("dirMatter", Matter) - this.renderList("matters", Matter) - - - } - - getFilters() { - return [ - ...super.getFilters() - ] - } - - getForm() { - return { - name: this.name, - uuid: this.uuid ? this.uuid : null - } - } - - getIcon() { - if (this.shareType === ShareType.MIX) { - return require("../../assets/img/file/archive.svg") - } else { - return FileUtil.getIcon(this.name, this.shareType === ShareType.DIRECTORY) - } - - } - - getLink() { - return currentHost() + '/share/detail/' + this.uuid; - } - - hasExpired() { - if (this.expireInfinity) { - return false - } else { - if (this.expireTime) { - return this.expireTime < new Date().getTime(); - } else { - return false - } - - } - } - - copyLinkAndCode() { - let that = this; - let text = Vue.i18n.t("model.linkCodeText", [that.getLink(), that.code]) - Vue.$copyPlguin.copy(text, function () { - Message.success({ - message: Vue.i18n.t("model.copyLinkCodeSuccess"), - center: true - }) - }) - } - - //获取过期时间 - getExpireTime() { - let delta = ShareExpireOptionMap[this.expireOption].deltaMillisecond - let now = new Date() - return new Date(now.getTime() + delta) - } - - - //下载zip包 - downloadZip(puuid) { - window.open(currentHost() + Share.URL_ZIP + "?shareUuid=" + this.uuid + "&code=" + this.code + "&puuid=" + puuid + "&rootUuid=" + this.rootUuid) - } - - - //创建一个分享.matterUuids要求为数组,expireTime要求为时间对象 - httpCreate(matterUuids, successCallback, errorCallback) { - let that = this - - let form = { - matterUuids: matterUuids.toString(), - expireInfinity: this.expireOption === ShareExpireOption.INFINITY, - expireTime: simpleDateTime(this.getExpireTime()) - } - - this.httpPost(Share.URL_CREATE, form, function (response) { - - that.render(response.data.data) - - that.safeCallback(successCallback)() - - }, errorCallback) - } - - httpDeleteBatch(uuids, successCallback, errorCallback) { - this.httpPost(Share.URL_DELETE_BATCH, {'uuids': uuids}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpBrowse(puuid, rootUuid, successCallback, errorCallback) { - let that = this - - let form = { - puuid, - rootUuid, - shareUuid: this.uuid, - code: this.code - } - - that.detailLoading = true - this.httpPost(Share.URL_BROWSE, form, function (response) { - - that.render(response.data.data) - - that.detailLoading = false - - typeof successCallback === 'function' && successCallback(response) - - }, function (errorMessage, response) { - - that.detailLoading = false - - typeof errorCallback === 'function' && errorCallback(errorMessage, response) - - - }) - } - - -} diff --git a/src/model/share/ShareExpireOption.js b/src/model/share/ShareExpireOption.js deleted file mode 100644 index 8788976..0000000 --- a/src/model/share/ShareExpireOption.js +++ /dev/null @@ -1,50 +0,0 @@ -let ShareExpireOption = { - HOUR: 'HOUR', - DAY: 'DAY', - WEEK: 'WEEK', - MONTH: 'MONTH', - YEAR: 'YEAR', - INFINITY: 'INFINITY' -} - -let ShareExpireOptionMap = { - HOUR: { - name: 'share.hour', - value: 'HOUR', - deltaMillisecond: 60 * 60 * 1000 - }, - DAY: { - name: 'share.day', - value: 'DAY', - deltaMillisecond: 24 * 60 * 60 * 1000 - }, - WEEK: { - name: 'share.week', - value: 'WEEK', - deltaMillisecond: 7 * 24 * 60 * 60 * 1000 - }, - MONTH: { - name: 'share.month', - value: 'MONTH', - deltaMillisecond: 30 * 24 * 60 * 60 * 1000 - }, - YEAR: { - name: 'share.year', - value: 'YEAR', - deltaMillisecond: 365 * 24 * 60 * 60 * 1000 - }, - INFINITY: { - name: 'share.infinity', - value: 'INFINITY', - deltaMillisecond: 0 - } -} - -let ShareExpireOptionList = []; -for (let key in ShareExpireOptionMap) { - if (ShareExpireOptionMap.hasOwnProperty(key)) { - ShareExpireOptionList.push(ShareExpireOptionMap[key]); - } -} - -export {ShareExpireOption, ShareExpireOptionMap, ShareExpireOptionList} diff --git a/src/model/share/ShareType.js b/src/model/share/ShareType.js deleted file mode 100644 index 16bc6b6..0000000 --- a/src/model/share/ShareType.js +++ /dev/null @@ -1,30 +0,0 @@ -let ShareType = { - FILE: 'FILE', - DIRECTORY: 'DIRECTORY', - MIX: 'MIX' -} - -let ShareTypeMap = { - FILE: { - name: '文件', - value: 'FILE' - }, - DIRECTORY: { - name: '文件夹', - value: 'DIRECTORY' - }, - MIX: { - name: '混合', - value: 'MIX' - } -} - - -let ShareTypeList = []; -for (let key in ShareTypeMap) { - if (ShareTypeMap.hasOwnProperty(key)) { - ShareTypeList.push(ShareTypeMap[key]); - } -} - -export {ShareType, ShareTypeMap, ShareTypeList} diff --git a/src/model/user/User.js b/src/model/user/User.js deleted file mode 100644 index 6dc8286..0000000 --- a/src/model/user/User.js +++ /dev/null @@ -1,306 +0,0 @@ -import BaseEntity from '../base/BaseEntity' -import Filter from '../base/Filter' -import {currentHost, readLocalStorage, removeLocalStorage, saveToLocalStorage} from "../../common/util/Utils"; - -import {UserRole} from "./UserRole"; -import {UserStatus, UserStatusList} from "./UserStatus"; -import {FilterType} from "../base/FilterType"; -import {handleImageUrl} from "../../common/util/ImageUtil"; -import {MessageBox, Message} from 'element-ui' -import Vue from "vue" - -let defaultAvatarPath = require("../../assets/img/avatar.png") - -export default class User extends BaseEntity { - - static LOCAL_STORAGE_KEY = "user"; - - static URL_LOGIN = '/api/user/login' - static URL_AUTHENTICATION_LOGIN = '/api/user/authentication/login' - static URL_REGISTER = '/api/user/register' - static URL_LOGOUT = '/api/user/logout' - static URL_USER_CHANGE_PASSWORD = '/api/user/change/password' - static URL_USER_RESET_PASSWORD = '/api/user/reset/password' - static URL_USER_TOGGLE_STATUS = '/api/user/toggle/status' - static URL_USER_TRANSFIGURATION = '/api/user/transfiguration' - - constructor(args) { - super(args) - this.role = UserRole.GUEST - this.username = null - this.password = null - this.avatarUrl = null - this.lastIp = null - this.lastTime = null - //默认大小限制100Mb. - this.sizeLimit = 104857600 - this.totalSize = 0 - this.totalSizeLimit = -1 - this.status = UserStatus.OK - - //local fields - this.isLogin = false - - this.validatorSchema = { - username: { - rules: [ - {required: true, message: 'username required'}, - { - type: 'string', - pattern: /^[0-9a-zA-Z_]+$/, - message: "only lowercase letter and number and _ is permitted." - }], - error: null - } - } - } - - getAvatarUrl() { - if (this.avatarUrl) { - return handleImageUrl(this.avatarUrl) - } else { - return defaultAvatarPath - } - } - - getUrlPrefix() { - return "/api/user" - } - - render(obj) { - super.render(obj) - this.renderEntity('lastTime', Date) - } - - getFilters() { - return [ - ...super.getFilters(), - new Filter(FilterType.INPUT, '用户', 'username', null, User, false), - new Filter(FilterType.INPUT, '手机号', 'phone', null, null, false), - new Filter(FilterType.SELECTION, '状态', 'status', UserStatusList), - new Filter(FilterType.SORT, '最新更新时间', 'orderLastTime') - ] - } - - //将用户信息存储在本地。 - renderFromLocalStorage() { - - try { - let userString = readLocalStorage(User.LOCAL_STORAGE_KEY) - - if (userString) { - let json = JSON.parse(userString) - this.render(json) - - } - - } catch (e) { - removeLocalStorage(User.LOCAL_STORAGE_KEY) - } - } - - //将用户信息存储在本地。 - saveToLocalStorage(rawUserObject = null) { - - //有可能rawUserObject直接就是一个user对象,那么我们需要删掉一些无用的信息。 - delete rawUserObject['validatorSchema'] - delete rawUserObject['userProfile'] - delete rawUserObject['avatar'] - - saveToLocalStorage(User.LOCAL_STORAGE_KEY, JSON.stringify(rawUserObject)) - } - - //清除本地的user信息 - clearLocalStorage() { - - removeLocalStorage(User.LOCAL_STORAGE_KEY) - } - - //更新本地持久化了的个别字段。 - updateLocalStorage(opt = {}) { - try { - let userString = readLocalStorage(User.LOCAL_STORAGE_KEY) - - if (userString) { - let json = JSON.parse(userString) - $.extend(json, opt) - - saveToLocalStorage(User.LOCAL_STORAGE_KEY, JSON.stringify(json)) - } - - } catch (e) { - removeLocalStorage(User.LOCAL_STORAGE_KEY) - } - } - - getForm() { - let form = { - username: this.username, - password: this.password, - role: this.role, - avatarUrl: this.avatarUrl, - sizeLimit: this.sizeLimit, - totalSizeLimit: this.totalSizeLimit, - uuid: this.uuid ? this.uuid : null - } - - return form - } - - validate() { - - return super.validate() - } - - //local logout. - innerLogout() { - - this.render(new User()) - - removeLocalStorage(this.getTAG()) - - } - - - transfiguration() { - let that = this - this.httpTransfiguration(function (authentication) { - let textToCopy = currentHost() + "/user/authentication/" + authentication - MessageBox.confirm(Vue.i18n.t("model.transfigurationPrompt", [textToCopy]), Vue.i18n.t("model.transfigurationPromptText"), { - confirmButtonText: Vue.i18n.t("copy"), - cancelButtonText: Vue.i18n.t("cancel"), - type: 'info' - }).then(function () { - - Vue.$copyPlguin.copy(textToCopy, function () { - Message.success({ - message: Vue.i18n.t("operationSuccess"), - center: true - }) - }) - }, - function () { - } - ) - }); - } - - innerLogin(response) { - let that = this - this.errorMessage = null - this.render(response.data.data) - this.isLogin = true - - //登录成功后去本地保存一下用户的简单信息,方便下次自动填入个别字段。 - this.saveToLocalStorage(response.data.data) - - } - - httpLogin(username, password, successCallback, errorCallback) { - - let that = this - - if (!username) { - this.errorMessage = 'username required' - return false - } - - if (!password) { - this.errorMessage = 'password required' - return false - } - - let form = {username, password} - - this.httpPost(User.URL_LOGIN, form, function (response) { - - that.innerLogin(response) - - that.safeCallback(successCallback)(response) - - }, errorCallback) - } - - httpRegister(username, password, rePassword, successCallback, errorCallback) { - - let that = this - - if (!username) { - this.errorMessage = 'username required' - return - } - - if (!password) { - this.errorMessage = 'password required' - return - } - - if (rePassword !== password) { - this.errorMessage = 'new and old password not same' - return - } - - let form = {username, password} - - this.httpPost(User.URL_REGISTER, form, function (response) { - that.innerLogin(response) - that.safeCallback(successCallback)(response) - }, errorCallback) - } - - httpLogout(successCallback, errorCallback) { - - let that = this - - that.innerLogout() - - this.httpPost(User.URL_LOGOUT, {}, function (response) { - - that.safeCallback(successCallback)(response) - }, errorCallback) - } - - httpUserChangePassword(oldPassword, newPassword, successCallback, errorCallback) { - let that = this - this.httpPost(User.URL_USER_CHANGE_PASSWORD, { - 'oldPassword': oldPassword, - 'newPassword': newPassword - }, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - httpUserResetPassword(password, successCallback, errorCallback) { - this.httpPost(User.URL_USER_RESET_PASSWORD, {'userUuid': this.uuid, 'password': password}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpToggleStatus(successCallback, errorCallback) { - let that = this - this.httpPost(User.URL_USER_TOGGLE_STATUS, {'uuid': this.uuid}, function (response) { - typeof successCallback === 'function' && successCallback(response) - }, errorCallback) - } - - - httpAuthenticationLogin(authentication, successCallback, errorCallback) { - let that = this - let form = {authentication} - this.httpPost(User.URL_AUTHENTICATION_LOGIN, form, function (response) { - that.innerLogin(response) - that.safeCallback(successCallback)(response) - }, errorCallback) - } - - - httpTransfiguration(successCallback, errorCallback) { - let that = this - let form = {'uuid': this.uuid} - this.httpPost(User.URL_USER_TRANSFIGURATION, form, function (response) { - that.safeCallback(successCallback)(response.data.msg) - }, errorCallback) - } - -} diff --git a/src/model/user/UserRole.js b/src/model/user/UserRole.js deleted file mode 100644 index 69216ac..0000000 --- a/src/model/user/UserRole.js +++ /dev/null @@ -1,33 +0,0 @@ -let UserRole = { - GUEST: 'GUEST', - USER: 'USER', - ADMINISTRATOR: 'ADMINISTRATOR' -} - -let UserRoleMap = { - GUEST: { - name: 'user.roleGuest', - value: 'GUEST', - style: "warning", - }, - USER: { - name: 'user.roleUser', - value: 'USER', - style: "primary", - }, - ADMINISTRATOR: { - name: 'user.roleAdministrator', - value: 'ADMINISTRATOR', - style: "success", - } -} - - -let UserRoleList = []; -for (let key in UserRoleMap) { - if (UserRoleMap.hasOwnProperty(key)) { - UserRoleList.push(UserRoleMap[key]); - } -} - -export {UserRole, UserRoleMap, UserRoleList} diff --git a/src/model/user/UserStatus.js b/src/model/user/UserStatus.js deleted file mode 100644 index 852ce52..0000000 --- a/src/model/user/UserStatus.js +++ /dev/null @@ -1,27 +0,0 @@ -let UserStatus = { - OK: 'OK', - DISABLED: 'DISABLED' -} - -let UserStatusMap = { - OK: { - name: 'user.statusActive', - value: 'OK', - style: 'primary' - }, - DISABLED: { - name: 'user.statusDisabled', - value: 'DISABLED', - style: 'danger' - } -} - - -let UserStatusList = []; -for (let key in UserStatusMap) { - if (UserStatusMap.hasOwnProperty(key)) { - UserStatusList.push(UserStatusMap[key]); - } -} - -export {UserStatus, UserStatusMap, UserStatusList} diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/router/index.js b/src/router/index.js deleted file mode 100644 index 6c13222..0000000 --- a/src/router/index.js +++ /dev/null @@ -1,324 +0,0 @@ -import Vue from 'vue' -import Router from 'vue-router' -import ByFrameView from '../views/Frame.vue' -import ShareList from '../views/share/List' -import ShareDetail from '../views/share/Detail' -import MatterList from '../views/matter/List' -import MatterDetail from '../views/matter/Detail' -import UserLogin from '../views/user/Login' -import UserAuthentication from '../views/user/Authentication' -import UserRegister from '../views/user/Register' -import UserList from '../views/user/List' -import UserDetail from '../views/user/Detail' -import UserChangePassword from '../views/user/ChangePassword' -import UserEdit from '../views/user/Edit' -import DashboardIndex from '../views/dashboard/Index' -import PreferenceIndex from '../views/preference/Index' -import InstallIndex from '../views/install/Index' -import PreferenceEdit from '../views/preference/Edit' -import NotFound from '../views/layout/NotFound' -import store from '../vuex' - -Vue.use(Router) - -const router = new Router({ - mode: 'history', - linkActiveClass: 'is-link-active', - scrollBehavior: () => ({y: 0}), - routes: [ - { - path: '/', - component: ByFrameView, - children: [ - { - path: '', - name: 'MatterList', - component: MatterList, - meta: { - //here is i18n key - title: 'router.allFiles', - requiresAuth: true, - breadcrumbs: [ - { - name: 'MatterList', - title: 'router.allFiles' - } - ] - } - }, - { - path: 'matter/detail/:uuid', - name: 'MatterDetail', - component: MatterDetail, - meta: { - title: 'router.fileDetail', - requiresAuth: true, - breadcrumbs: [ - { - name: 'MatterList', - title: 'router.allFiles' - }, - { - name: 'MatterDetail', - title: 'router.fileDetail' - } - ] - } - }, - { - path: 'user/login', - name: 'UserLogin', - component: UserLogin, - meta: { - title: 'router.login', - requiresAuth: false, - breadcrumbs: [] - } - }, - { - path: 'user/authentication/:authentication', - name: 'UserAuthentication', - component: UserAuthentication, - meta: { - title: 'router.autoLogin', - requiresAuth: false, - breadcrumbs: [] - } - }, - { - path: 'user/register', - name: 'UserRegister', - component: UserRegister, - meta: { - title: 'router.register', - requiresAuth: false, - breadcrumbs: [] - } - }, - { - path: 'user/list', - name: 'UserList', - component: UserList, - meta: { - title: 'router.users', - requiresAuth: true, - breadcrumbs: [ - { - name: 'UserList', - title: 'router.users' - } - ] - } - }, - { - path: 'user/detail/:uuid', - name: 'UserDetail', - component: UserDetail, - meta: { - title: 'router.userDetail', - requiresAuth: true, - breadcrumbs: [ - { - name: 'UserList', - title: 'router.users' - }, - { - name: 'UserDetail', - title: 'router.userDetail' - } - ] - } - }, - { - path: 'user/change/password', - name: 'UserChangePassword', - component: UserChangePassword, - meta: { - title: 'router.changePassword', - requiresAuth: true, - breadcrumbs: [ - { - name: 'UserChangePassword', - title: 'router.changePassword' - } - ] - } - }, - { - path: 'user/create', - name: 'UserCreate', - component: UserEdit, - meta: { - title: 'router.createUser', - requiresAuth: true, - breadcrumbs: [ - { - name: 'UserList', - title: 'router.users' - }, - { - name: 'UserCreate', - title: 'router.createUser' - } - ] - } - }, - - { - path: 'user/edit/:uuid', - name: 'UserEdit', - component: UserEdit, - meta: { - title: 'router.editUser', - requiresAuth: true, - breadcrumbs: [ - { - name: 'UserList', - title: 'router.users' - }, - { - name: 'UserEdit', - title: 'router.editUser' - } - ] - } - }, - - { - path: 'share/detail/:uuid', - name: 'ShareDetail', - component: ShareDetail, - meta: { - title: 'router.shareDetail', - requiresAuth: false, - breadcrumbs: [] - } - }, - { - path: 'share/list', - name: 'ShareList', - component: ShareList, - meta: { - title: 'router.myShare', - requiresAuth: true, - breadcrumbs: [ - { - name: 'ShareList', - title: 'router.myShare' - } - ] - } - }, - { - path: 'dashboard/index', - name: 'DashboardIndex', - component: DashboardIndex, - meta: { - title: 'router.dashboard', - requiresAuth: true, - breadcrumbs: [ - { - name: 'DashboardIndex', - title: 'router.dashboard' - } - ] - } - }, - - { - path: 'install/index', - name: 'InstallIndex', - component: InstallIndex, - meta: { - title: 'router.install', - requiresAuth: false, - breadcrumbs: [ - { - name: 'InstallIndex', - title: 'router.install' - } - ] - } - }, - - { - path: 'preference', - name: 'PreferenceIndex', - component: PreferenceIndex, - meta: { - title: 'router.setting', - requiresAuth: true, - breadcrumbs: [ - { - name: 'PreferenceIndex', - title: 'router.setting' - } - ] - } - }, - - { - path: 'preference/edit', - name: 'PreferenceEdit', - component: PreferenceEdit, - meta: { - title: 'router.setting', - requiresAuth: true, - breadcrumbs: [ - { - name: 'PreferenceIndex', - title: 'router.setting' - }, - { - name: 'PreferenceEdit', - title: 'router.setting' - } - ] - } - }, - //未被上面处理的route被视为404 - { - path: '*', - component: NotFound, - meta: {requiresAuth: false} - } - ] - } - ] -}) - -//装填面包屑 -function fillBreadcrumbs(to) { - //清空数组 - store.state.breadcrumbs.splice(0, store.state.breadcrumbs.length); - if (to.meta.breadcrumbs) { - //追加一个数组 - store.state.breadcrumbs.push.apply(store.state.breadcrumbs, to.meta.breadcrumbs) - } -} - -//add global interceptor. -router.beforeEach((to, from, next) => { - - //handle auth feature. - if (to.matched.some(record => record.meta.requiresAuth)) { - // this route requires auth, check if logged in - // if not, redirect to login page. - if (store.state.user.role === 'GUEST') { - next({ - path: '/user/login', - query: {redirect: to.fullPath} - }) - } else { - - fillBreadcrumbs(to); - next() - } - } else { - - fillBreadcrumbs(to); - next() - } -}) - -export default router diff --git a/src/serviceWorker.ts b/src/serviceWorker.ts new file mode 100644 index 0000000..b09523f --- /dev/null +++ b/src/serviceWorker.ts @@ -0,0 +1,149 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.0/8 are considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +type Config = { + onSuccess?: (registration: ServiceWorkerRegistration) => void; + onUpdate?: (registration: ServiceWorkerRegistration) => void; +}; + +export function register(config?: Config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL( + process.env.PUBLIC_URL, + window.location.href + ); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit https://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl: string, config?: Config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl: string, config?: Config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl, { + headers: { 'Service-Worker': 'script' } + }) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready + .then(registration => { + registration.unregister(); + }) + .catch(error => { + console.error(error.message); + }); + } +} diff --git a/src/setupTests.ts b/src/setupTests.ts new file mode 100644 index 0000000..74b1a27 --- /dev/null +++ b/src/setupTests.ts @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; diff --git a/src/views/Frame.vue b/src/views/Frame.vue deleted file mode 100644 index 6dbcda6..0000000 --- a/src/views/Frame.vue +++ /dev/null @@ -1,175 +0,0 @@ - - - - - diff --git a/src/views/dashboard/Index.vue b/src/views/dashboard/Index.vue deleted file mode 100644 index d1a6ea4..0000000 --- a/src/views/dashboard/Index.vue +++ /dev/null @@ -1,516 +0,0 @@ - - - - - diff --git a/src/views/dashboard/theme.json b/src/views/dashboard/theme.json deleted file mode 100644 index e2a8d98..0000000 --- a/src/views/dashboard/theme.json +++ /dev/null @@ -1,474 +0,0 @@ -{ - "color": [ - "#006699", - "#1ab394", - "#7bd9a5" - ], - "backgroundColor": "rgba(0,0,0,0)", - "textStyle": {}, - "title": { - "textStyle": { - "color": "#666666" - }, - "subtextStyle": { - "color": "#999999" - } - }, - "line": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "3" - } - }, - "symbolSize": "10", - "symbol": "emptyCircle", - "smooth": true - }, - "radar": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "3" - } - }, - "symbolSize": "10", - "symbol": "emptyCircle", - "smooth": true - }, - "bar": { - "itemStyle": { - "normal": { - "barBorderWidth": "0", - "barBorderColor": "#444444" - }, - "emphasis": { - "barBorderWidth": "0", - "barBorderColor": "#444444" - } - } - }, - "pie": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "scatter": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "boxplot": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "parallel": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "sankey": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "funnel": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "gauge": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - }, - "emphasis": { - "borderWidth": "0", - "borderColor": "#444444" - } - } - }, - "candlestick": { - "itemStyle": { - "normal": { - "color": "#d0648a", - "color0": "#ffffff", - "borderColor": "#d0648a", - "borderColor0": "#22c3aa", - "borderWidth": 1 - } - } - }, - "graph": { - "itemStyle": { - "normal": { - "borderWidth": "0", - "borderColor": "#444444" - } - }, - "lineStyle": { - "normal": { - "width": 1, - "color": "#aaa" - } - }, - "symbolSize": "10", - "symbol": "emptyCircle", - "smooth": true, - "color": [ - "#4ea397", - "#22c3aa", - "#7bd9a5" - ], - "label": { - "normal": { - "textStyle": { - "color": "#ffffff" - } - } - } - }, - "map": { - "itemStyle": { - "normal": { - "areaColor": "#eeeeee", - "borderColor": "#999999", - "borderWidth": "0.5" - }, - "emphasis": { - "areaColor": "rgba(34,195,170,0.25)", - "borderColor": "#22c3aa", - "borderWidth": "0.5" - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#28544e" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(52,158,142)" - } - } - } - }, - "geo": { - "itemStyle": { - "normal": { - "areaColor": "#eeeeee", - "borderColor": "#999999", - "borderWidth": "0.5" - }, - "emphasis": { - "areaColor": "rgba(34,195,170,0.25)", - "borderColor": "#22c3aa", - "borderWidth": "0.5" - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#28544e" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(52,158,142)" - } - } - } - }, - "categoryAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.3)", - "rgba(200,200,200,0.3)" - ] - } - } - }, - "valueAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.3)", - "rgba(200,200,200,0.3)" - ] - } - } - }, - "logAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.3)", - "rgba(200,200,200,0.3)" - ] - } - } - }, - "timeAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.3)", - "rgba(200,200,200,0.3)" - ] - } - } - }, - "toolbox": { - "iconStyle": { - "normal": { - "borderColor": "#aaaaaa" - }, - "emphasis": { - "borderColor": "#666" - } - } - }, - "legend": { - "textStyle": { - "color": "#999999" - } - }, - "tooltip": { - "axisPointer": { - "lineStyle": { - "color": "#ccc", - "width": 1 - }, - "crossStyle": { - "color": "#ccc", - "width": 1 - } - } - }, - "timeline": { - "lineStyle": { - "color": "#349e8e", - "width": 1 - }, - "itemStyle": { - "normal": { - "color": "#349e8e", - "borderWidth": "1" - }, - "emphasis": { - "color": "#57e8d2" - } - }, - "controlStyle": { - "normal": { - "color": "#349e8e", - "borderColor": "#349e8e", - "borderWidth": "0" - } - }, - "checkpointStyle": { - "color": "#22c3aa", - "borderColor": "rgba(34,195,170,0.25)" - }, - "label": { - "normal": { - "textStyle": { - "color": "#349e8e" - } - } - } - }, - "visualMap": { - "color": [ - "#d0648a", - "#22c3aa", - "rgba(123,217,165,0.2)" - ] - }, - "dataZoom": { - "backgroundColor": "#fff", - "dataBackgroundColor": "#dedede", - "fillerColor": "rgba(34,195,170,0.25)", - "handleColor": "#dddddd", - "handleSize": "100%", - "textStyle": { - "color": "#999" - } - }, - "markPoint": { - "label": { - "normal": { - "textStyle": { - "color": "#ffffff" - } - }, - "emphasis": { - "textStyle": { - "color": "#ffffff" - } - } - } - } -} diff --git a/src/views/dashboard/widget/RatePanel.vue b/src/views/dashboard/widget/RatePanel.vue deleted file mode 100644 index 09f5d19..0000000 --- a/src/views/dashboard/widget/RatePanel.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/src/views/install/Index.vue b/src/views/install/Index.vue deleted file mode 100644 index f2c30e2..0000000 --- a/src/views/install/Index.vue +++ /dev/null @@ -1,495 +0,0 @@ - - - - diff --git a/src/views/layout/BottomNavigation.vue b/src/views/layout/BottomNavigation.vue deleted file mode 100644 index 5881690..0000000 --- a/src/views/layout/BottomNavigation.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/src/views/layout/DragObscure.vue b/src/views/layout/DragObscure.vue deleted file mode 100644 index 97b4aef..0000000 --- a/src/views/layout/DragObscure.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/src/views/layout/NotFound.vue b/src/views/layout/NotFound.vue deleted file mode 100644 index 41df2ac..0000000 --- a/src/views/layout/NotFound.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/src/views/layout/SideNavigation.vue b/src/views/layout/SideNavigation.vue deleted file mode 100644 index df9e465..0000000 --- a/src/views/layout/SideNavigation.vue +++ /dev/null @@ -1,310 +0,0 @@ - - - - diff --git a/src/views/layout/TopNavigation.vue b/src/views/layout/TopNavigation.vue deleted file mode 100644 index 98a3581..0000000 --- a/src/views/layout/TopNavigation.vue +++ /dev/null @@ -1,177 +0,0 @@ - - - - - diff --git a/src/views/matter/Detail.vue b/src/views/matter/Detail.vue deleted file mode 100644 index ed7562b..0000000 --- a/src/views/matter/Detail.vue +++ /dev/null @@ -1,204 +0,0 @@ - - - - - diff --git a/src/views/matter/List.vue b/src/views/matter/List.vue deleted file mode 100644 index 6b74b35..0000000 --- a/src/views/matter/List.vue +++ /dev/null @@ -1,556 +0,0 @@ - - - diff --git a/src/views/matter/widget/Director.js b/src/views/matter/widget/Director.js deleted file mode 100644 index 5adce6f..0000000 --- a/src/views/matter/widget/Director.js +++ /dev/null @@ -1,16 +0,0 @@ -//导演类,用户来让整个工作有序进行 -export default class Director { - constructor(args) { - //正在重命名 - this.renameMode = false - //正在创建新文件夹 - this.createMode = false - //正在移动文件 - this.moveMode = false - } - - isEditing() { - return this.renameMode || this.createMode || this.moveMode - } - -} diff --git a/src/views/matter/widget/FolderTree.vue b/src/views/matter/widget/FolderTree.vue deleted file mode 100644 index 554e6bf..0000000 --- a/src/views/matter/widget/FolderTree.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - - - diff --git a/src/views/matter/widget/MatterImage.vue b/src/views/matter/widget/MatterImage.vue deleted file mode 100644 index 6d74df4..0000000 --- a/src/views/matter/widget/MatterImage.vue +++ /dev/null @@ -1,145 +0,0 @@ - - - diff --git a/src/views/matter/widget/MatterPanel.vue b/src/views/matter/widget/MatterPanel.vue deleted file mode 100644 index 039e371..0000000 --- a/src/views/matter/widget/MatterPanel.vue +++ /dev/null @@ -1,449 +0,0 @@ - - - diff --git a/src/views/matter/widget/MoveBatchPanel.vue b/src/views/matter/widget/MoveBatchPanel.vue deleted file mode 100644 index 1c7955e..0000000 --- a/src/views/matter/widget/MoveBatchPanel.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/src/views/matter/widget/ShareOperationPanel.vue b/src/views/matter/widget/ShareOperationPanel.vue deleted file mode 100644 index 6f0f08e..0000000 --- a/src/views/matter/widget/ShareOperationPanel.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/src/views/matter/widget/UploadMatterPanel.vue b/src/views/matter/widget/UploadMatterPanel.vue deleted file mode 100644 index beb545a..0000000 --- a/src/views/matter/widget/UploadMatterPanel.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - diff --git a/src/views/matter/widget/imageCache/ImageCacheList.vue b/src/views/matter/widget/imageCache/ImageCacheList.vue deleted file mode 100644 index 42a9606..0000000 --- a/src/views/matter/widget/imageCache/ImageCacheList.vue +++ /dev/null @@ -1,167 +0,0 @@ - - - - - diff --git a/src/views/matter/widget/imageCache/ImageCachePanel.vue b/src/views/matter/widget/imageCache/ImageCachePanel.vue deleted file mode 100644 index 727e25e..0000000 --- a/src/views/matter/widget/imageCache/ImageCachePanel.vue +++ /dev/null @@ -1,273 +0,0 @@ - - - diff --git a/src/views/preference/Edit.vue b/src/views/preference/Edit.vue deleted file mode 100644 index 9b55972..0000000 --- a/src/views/preference/Edit.vue +++ /dev/null @@ -1,165 +0,0 @@ - - - - - diff --git a/src/views/preference/Index.vue b/src/views/preference/Index.vue deleted file mode 100644 index a48f17d..0000000 --- a/src/views/preference/Index.vue +++ /dev/null @@ -1,155 +0,0 @@ - - - - - diff --git a/src/views/share/Detail.vue b/src/views/share/Detail.vue deleted file mode 100644 index d1a24b5..0000000 --- a/src/views/share/Detail.vue +++ /dev/null @@ -1,360 +0,0 @@ - - - - - diff --git a/src/views/share/List.vue b/src/views/share/List.vue deleted file mode 100644 index 81d57c0..0000000 --- a/src/views/share/List.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/src/views/share/widget/ShareBar.vue b/src/views/share/widget/ShareBar.vue deleted file mode 100644 index b316d77..0000000 --- a/src/views/share/widget/ShareBar.vue +++ /dev/null @@ -1,291 +0,0 @@ - - - diff --git a/src/views/share/widget/ShareDialogPanel.vue b/src/views/share/widget/ShareDialogPanel.vue deleted file mode 100644 index 872473c..0000000 --- a/src/views/share/widget/ShareDialogPanel.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - diff --git a/src/views/share/widget/ShareMatterBar.vue b/src/views/share/widget/ShareMatterBar.vue deleted file mode 100644 index 33318a7..0000000 --- a/src/views/share/widget/ShareMatterBar.vue +++ /dev/null @@ -1,270 +0,0 @@ - - - diff --git a/src/views/user/Authentication.vue b/src/views/user/Authentication.vue deleted file mode 100644 index d83ee4a..0000000 --- a/src/views/user/Authentication.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - diff --git a/src/views/user/ChangePassword.vue b/src/views/user/ChangePassword.vue deleted file mode 100644 index a4a1cc0..0000000 --- a/src/views/user/ChangePassword.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - diff --git a/src/views/user/Detail.vue b/src/views/user/Detail.vue deleted file mode 100644 index 77cfb62..0000000 --- a/src/views/user/Detail.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - diff --git a/src/views/user/Edit.vue b/src/views/user/Edit.vue deleted file mode 100644 index 2d5b411..0000000 --- a/src/views/user/Edit.vue +++ /dev/null @@ -1,189 +0,0 @@ - - - - - diff --git a/src/views/user/List.vue b/src/views/user/List.vue deleted file mode 100644 index 563eb19..0000000 --- a/src/views/user/List.vue +++ /dev/null @@ -1,172 +0,0 @@ - - - - - diff --git a/src/views/user/Login.vue b/src/views/user/Login.vue deleted file mode 100644 index 27fcad3..0000000 --- a/src/views/user/Login.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - diff --git a/src/views/user/Register.vue b/src/views/user/Register.vue deleted file mode 100644 index a3dd517..0000000 --- a/src/views/user/Register.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - diff --git a/src/views/user/feature/FeatureType.js b/src/views/user/feature/FeatureType.js deleted file mode 100644 index 17739e6..0000000 --- a/src/views/user/feature/FeatureType.js +++ /dev/null @@ -1,38 +0,0 @@ -let FeatureType = { - PUBLIC: 'PUBLIC', - USER_MANAGE: 'USER_MANAGE', - USER_MINE: 'USER_MINE', - OTHER: 'OTHER' -} - -let FeatureTypeMap = { - PUBLIC: { - name: '公共接口', - value: 'PUBLIC', - style: 'info' - }, - USER_MANAGE: { - name: '管理用户', - value: 'USER_MANAGE', - style: 'info' - }, - USER_MINE: { - name: '查看自己资料', - value: 'USER_MINE', - style: 'info' - }, - OTHER: { - name: '其他', - value: 'OTHER', - style: 'info' - } -} - -let FeatureTypeList = []; -for (let key in FeatureTypeMap) { - if (FeatureTypeMap.hasOwnProperty(key)) { - FeatureTypeList.push(FeatureTypeMap[key]); - } -} - -export { FeatureType, FeatureTypeMap, FeatureTypeList } \ No newline at end of file diff --git a/src/vuex/index.js b/src/vuex/index.js deleted file mode 100644 index e3f0298..0000000 --- a/src/vuex/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' -import User from "../model/user/User"; -import Preference from '../model/preference/Preference' -import BrowserUtil from "../common/util/BrowserUtil"; -import Cookies from "js-cookie" - -Vue.use(Vuex) - -let user = new User() -user.renderFromLocalStorage() - -let lang = BrowserUtil.browserLang() -let localLang = Cookies.get("_lang"); -if (localLang === "zh" || localLang === "en") { - lang = localLang -} - -const state = { - config: { - mobile: false, - showDrawer: true - }, - //当前版本信息。 - versionName: '3.0.6', - //当前用户,即使没有登录依然有游客的用户在。 - user, - breadcrumbs: [], - //全局正在上传的文件 - uploadMatters: [], - //当前接受上传的那个Matter List.vue实例 - uploadListInstance: null, - - //网站是否已经安装好 - installed: true, - - //当前的语言 - lang: lang, - - //网站设置 - preference: new Preference(), - //上次报没有登录错误的时间戳,用于控制登录提示框的个数不能太频繁。 - lastLoginErrorTimestamp: 0 - -} - -const getters = { - getConfig(state) { - return state.config - } -} - -const mutations = {} - -const actions = {} - -export default new Vuex.Store({ - state, - getters, - mutations, - actions -}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f2850b7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react" + }, + "include": [ + "src" + ] +} diff --git a/vue.config.js b/vue.config.js deleted file mode 100644 index 9caea52..0000000 --- a/vue.config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - publicPath: "/", - assetsDir: "static", - devServer: { - port: 6015, - proxy: { - '/api': { - //target: 'https://tank.eyeblue.cn', - target: 'http://127.0.0.1:6010', - changeOrigin: true, - pathRewrite: { - '^/api': '/api' - } - } - } - }, - lintOnSave: false, - transpileDependencies: [ - 'vue-echarts', - 'resize-detector' - ] -} -