Merge branch 'master' into master

This commit is contained in:
xidedix
2018-03-30 11:57:19 +02:00
committed by GitHub
720 changed files with 39807 additions and 1722 deletions
+34 -1
View File
@@ -1,12 +1,45 @@
## [vue](./README.md) version `changelog` ## [vue](./README.md) version `changelog`
##### `v1.0.11`
- refactor: project directory structure
- update: vuejs-templates/webpack to `1.3.1`
- update: vue to `2.5.13`
- chore: dependencies update
##### `v1.0.10`
- fix: `className` -> `class`
- refactor: `<b-input-group-prepend>`
- refactor: `<b-input-group-append>`
- refactor: `<b-input-group-text>`
- refactor: remove `<b-input-group-button>`
- test: initial `Dashboard` unit test added
- update: bootstrap-vue to `2.0.0-rc.1`
- chore: dependencies update
###### `v1.0.9`
- refactor: Sidebar structure
- test: initial e2e test added
- chore: dependencies update
###### `v1.0.8`
- update: vue to `2.5.13`
- update: Bootstrap to `4.0.0-beta.3`
- update: bootstrap-vue to `1.4.0`
- chore: dependencies update
- refactor: `<b-table>` use the prop `responsive="sm"` instead of `class="table-responsive-sm"`
- fix: `Vue warn:` Do not use built-in or reserved HTML elements as component id: (header, aside, footer, table)
- feature: some Bootstrap4 components added
- temp tweaks(b4 beta3): `InputGroupAddon` and `InputGroupButton`
- refactor(checkboxes, radios, labels): temp tweaks
- feat: mobile sidebar link click closes the sidebar [#18](https://github.com/mrholek/CoreUI-Vue/pull/18)
###### `v1.0.6` ###### `v1.0.6`
- refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components - refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components
- fix: Cards.vue: change `variant="accent-` to `class="card-accent-` - fix: Cards.vue: change `variant="accent-` to `class="card-accent-`
- refactor: Modal's ok-button variants - refactor: Modal's ok-button variants
- refactor: forms with validation feedback - refactor: forms with validation feedback
- update: bootstrap-vue to `1.1.0` - update: bootstrap-vue to `1.1.0`
- update: to vue: `2.5.6` - update: vue to `2.5.6`
###### `v1.0.5` ###### `v1.0.5`
- update: bootstrap-vue to `1.0.x` - update: bootstrap-vue to `1.0.x`
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2017 creativeLabs Łukasz Holeczek. Copyright (c) 2018 creativeLabs Łukasz Holeczek.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+3 -2
View File
@@ -2,9 +2,9 @@
### Check out our Vue Admin Templates and support CoreUI Development ### Check out our Vue Admin Templates and support CoreUI Development
[![Bootstrap Admin Templates Bundle](https://genesisui.com/img/bundle2.png)](https://genesisui.com/bundle.html?support=1) [![Bootstrap Admin Templates Bundle](https://genesisui.com/img/bundle2.png)](https://genesisui.com/admin-templates/vuejs/prime/?support=1)
[Check out Bootstrap Admin Templates Bundle](https://genesisui.com/bundle.html?support=1) [Check out Bootstrap Admin Templates Bundle](https://genesisui.com/admin-templates/vuejs/prime/?support=1)
This is Vue.js version of our Bootstrap 4 admin template [CoreUI](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template). This is Vue.js version of our Bootstrap 4 admin template [CoreUI](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template).
@@ -47,6 +47,7 @@ CoreUI includes 6 Version for Angular 4, AngularJS, React.js, Vue.js, Static HTM
* [HTML5 Static Version](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template). * [HTML5 Static Version](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template).
* [React.js Version](https://github.com/mrholek/CoreUI-React). * [React.js Version](https://github.com/mrholek/CoreUI-React).
* [Vue.js Version](https://github.com/mrholek/CoreUI-Vue). * [Vue.js Version](https://github.com/mrholek/CoreUI-Vue).
* [ASP.NET Core 2 MVC Version](https://github.com/mrholek/CoreUI-NET)
## Bugs and feature requests ## Bugs and feature requests
+8 -4
View File
@@ -1,14 +1,18 @@
{ {
"presets": [ "presets": [
["env", { "modules": false }], ["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 9"]
}
}],
"stage-2" "stage-2"
], ],
"plugins": ["transform-runtime"], "plugins": ["transform-vue-jsx", "transform-runtime"],
"comments": false,
"env": { "env": {
"test": { "test": {
"presets": ["env", "stage-2"], "presets": ["env", "stage-2"],
"plugins": [ "istanbul" ] "plugins": ["transform-vue-jsx", "istanbul"]
} }
} }
} }
+6 -2
View File
@@ -1,2 +1,6 @@
build/*.js /build/
config/*.js /config/
/dist/
/*.js
/test/unit/coverage/
/test/e2e/specs
+13 -11
View File
@@ -1,27 +1,29 @@
// http://eslint.org/docs/user-guide/configuring // https://eslint.org/docs/user-guide/configuring
module.exports = { module.exports = {
root: true, root: true,
parser: 'babel-eslint',
parserOptions: { parserOptions: {
sourceType: 'module' parser: 'babel-eslint'
}, },
env: { env: {
browser: true, browser: true,
}, },
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style extends: [
extends: 'standard', // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files // required to lint *.vue files
plugins: [ plugins: [
'html' 'vue'
], ],
// add your custom rules here // add your custom rules here
'rules': { rules: {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await // allow async-await
'generator-star-spacing': 0, 'generator-star-spacing': 'off',
// allow debugger during development // allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
} }
} }
+11 -3
View File
@@ -1,9 +1,17 @@
.DS_Store .DS_Store
node_modules/ node_modules/
dist/ /dist/
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
test/unit/coverage /test/unit/coverage/
test/e2e/reports /test/e2e/reports/
selenium-debug.log selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
+3 -1
View File
@@ -2,7 +2,9 @@
module.exports = { module.exports = {
"plugins": { "plugins": {
// to edit target browsers: use "browserlist" field in package.json "postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {} "autoprefixer": {}
} }
} }
+34 -1
View File
@@ -1,12 +1,45 @@
## [vue](./README.md) version `changelog` ## [vue](./README.md) version `changelog`
##### `v1.0.11`
- refactor: project directory structure
- update: vuejs-templates/webpack to `1.3.1`
- update: vue to `2.5.13`
- chore: dependencies update
##### `v1.0.10`
- fix: `className` -> `class`
- refactor: `<b-input-group-prepend>`
- refactor: `<b-input-group-append>`
- refactor: `<b-input-group-text>`
- refactor: remove `<b-input-group-button>`
- test: initial `Dashboard` unit test added
- update: bootstrap-vue to `2.0.0-rc.1`
- chore: dependencies update
###### `v1.0.9`
- refactor: Sidebar structure
- test: initial e2e test added
- chore: dependencies update
###### `v1.0.8`
- update: vue to `2.5.13`
- update: Bootstrap to `4.0.0-beta.3`
- update: bootstrap-vue to `1.4.0`
- chore: dependencies update
- refactor: `<b-table>` use the prop `responsive="sm"` instead of `class="table-responsive-sm"`
- fix: `Vue warn:` Do not use built-in or reserved HTML elements as component id: (header, aside, footer, table)
- feature: some Bootstrap4 components added
- temp tweaks(b4 beta3): `InputGroupAddon` and `InputGroupButton`
- refactor(checkboxes, radios, labels): temp tweaks
- feat: mobile sidebar link click closes the sidebar [#18](https://github.com/mrholek/CoreUI-Vue/pull/18)
###### `v1.0.6` ###### `v1.0.6`
- refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components - refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components
- fix: Cards.vue: change `variant="accent-` to `class="card-accent-` - fix: Cards.vue: change `variant="accent-` to `class="card-accent-`
- refactor: Modal's ok-button variants - refactor: Modal's ok-button variants
- refactor: forms with validation feedback - refactor: forms with validation feedback
- update: bootstrap-vue to `1.1.0` - update: bootstrap-vue to `1.1.0`
- update: to vue: `2.5.6` - update: vue to `2.5.6`
###### `v1.0.5` ###### `v1.0.5`
- update: bootstrap-vue to `1.0.x` - update: bootstrap-vue to `1.0.x`
+3 -3
View File
@@ -1,6 +1,6 @@
# core-ui # CoreUI Vue
> Open Source Admin Template > CoreUI Vue Open Source Bootsrtap 4 Admin Template
## Build Setup ## Build Setup
@@ -27,4 +27,4 @@ npm run e2e
npm test npm test
``` ```
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
+16 -10
View File
@@ -1,31 +1,37 @@
'use strict'
require('./check-versions')() require('./check-versions')()
process.env.NODE_ENV = 'production' process.env.NODE_ENV = 'production'
var ora = require('ora') const ora = require('ora')
var rm = require('rimraf') const rm = require('rimraf')
var path = require('path') const path = require('path')
var chalk = require('chalk') const chalk = require('chalk')
var webpack = require('webpack') const webpack = require('webpack')
var config = require('../config') const config = require('../config')
var webpackConfig = require('./webpack.prod.conf') const webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...') const spinner = ora('building for production...')
spinner.start() spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err if (err) throw err
webpack(webpackConfig, function (err, stats) { webpack(webpackConfig, (err, stats) => {
spinner.stop() spinner.stop()
if (err) throw err if (err) throw err
process.stdout.write(stats.toString({ process.stdout.write(stats.toString({
colors: true, colors: true,
modules: false, modules: false,
children: false, children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false, chunks: false,
chunkModules: false chunkModules: false
}) + '\n\n') }) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n')) console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow( console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' + ' Tip: built files are meant to be served over an HTTP server.\n' +
+17 -11
View File
@@ -1,17 +1,19 @@
var chalk = require('chalk') 'use strict'
var semver = require('semver') const chalk = require('chalk')
var packageConfig = require('../package.json') const semver = require('semver')
var shell = require('shelljs') const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) { function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim() return require('child_process').execSync(cmd).toString().trim()
} }
var versionRequirements = [ const versionRequirements = [
{ {
name: 'node', name: 'node',
currentVersion: semver.clean(process.version), currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node versionRequirement: packageConfig.engines.node
}, }
] ]
if (shell.which('npm')) { if (shell.which('npm')) {
@@ -23,9 +25,11 @@ if (shell.which('npm')) {
} }
module.exports = function () { module.exports = function () {
var warnings = [] const warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i] for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' + warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' + chalk.red(mod.currentVersion) + ' should be ' +
@@ -38,10 +42,12 @@ module.exports = function () {
console.log('') console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:')) console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log() console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i] for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning) console.log(' ' + warning)
} }
console.log() console.log()
process.exit(1) process.exit(1)
} }
-9
View File
@@ -1,9 +0,0 @@
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
-91
View File
@@ -1,91 +0,0 @@
require('./check-versions')()
var config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf')
: require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port
var _resolve
var readyPromise = new Promise(resolve => {
_resolve = resolve
})
console.log('> Starting dev server...')
devMiddleware.waitUntilValid(() => {
console.log('> Listening at ' + uri + '\n')
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
_resolve()
})
var server = app.listen(port)
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}
+42 -13
View File
@@ -1,29 +1,38 @@
var path = require('path') 'use strict'
var config = require('../config') const path = require('path')
var ExtractTextPlugin = require('extract-text-webpack-plugin') const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) { exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production' const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory ? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory : config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path) return path.posix.join(assetsSubDirectory, _path)
} }
exports.cssLoaders = function (options) { exports.cssLoaders = function (options) {
options = options || {} options = options || {}
var cssLoader = { const cssLoader = {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
minimize: process.env.NODE_ENV === 'production', sourceMap: options.sourceMap
sourceMap: options.sourceMap, }
alias: { '../img': '../static/img' } }
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
} }
} }
// generate loader string to be used with extract text plugin // generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) { function generateLoaders (loader, loaderOptions) {
var loaders = [cssLoader] const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) { if (loader) {
loaders.push({ loaders.push({
loader: loader + '-loader', loader: loader + '-loader',
@@ -59,14 +68,34 @@ exports.cssLoaders = function (options) {
// Generate loaders for standalone style files (outside of .vue) // Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) { exports.styleLoaders = function (options) {
var output = [] const output = []
var loaders = exports.cssLoaders(options) const loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension] for (const extension in loaders) {
const loader = loaders[extension]
output.push({ output.push({
test: new RegExp('\\.' + extension + '$'), test: new RegExp('\\.' + extension + '$'),
use: loader use: loader
}) })
} }
return output return output
} }
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
+17 -7
View File
@@ -1,12 +1,22 @@
var utils = require('./utils') 'use strict'
var config = require('../config') const utils = require('./utils')
var isProduction = process.env.NODE_ENV === 'production' const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = { module.exports = {
loaders: utils.cssLoaders({ loaders: utils.cssLoaders({
sourceMap: isProduction sourceMap: sourceMapEnabled,
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction extract: isProduction
}) }),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
} }
+46 -27
View File
@@ -1,13 +1,26 @@
var path = require('path') 'use strict'
var utils = require('./utils') const path = require('path')
var config = require('../config') const utils = require('./utils')
var vueLoaderConfig = require('./vue-loader.conf') const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) { function resolve (dir) {
return path.join(__dirname, '..', dir) return path.join(__dirname, '..', dir)
} }
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = { module.exports = {
context: path.resolve(__dirname, '../'),
entry: { entry: {
app: './src/main.js' app: './src/main.js'
}, },
@@ -22,20 +35,12 @@ module.exports = {
extensions: ['.js', '.vue', '.json'], extensions: ['.js', '.vue', '.json'],
alias: { alias: {
'vue$': 'vue/dist/vue.esm.js', 'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src') '@': resolve('src'),
} }
}, },
module: { module: {
rules: [ rules: [
{ ...(config.dev.useEslint ? [createLintingRule()] : []),
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter')
}
},
{ {
test: /\.vue$/, test: /\.vue$/,
loader: 'vue-loader', loader: 'vue-loader',
@@ -44,30 +49,44 @@ module.exports = {
{ {
test: /\.js$/, test: /\.js$/,
loader: 'babel-loader', loader: 'babel-loader',
include: [resolve('src'), resolve('test')] include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
}, },
{ {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: { loader: 'url-loader',
loader: 'file-loader',
options: { options: {
name: '[name].[hash:7].[ext]', limit: 10000,
publicPath: '../../', name: utils.assetsPath('img/[name].[hash:7].[ext]')
outputPath: utils.assetsPath('img/')
}
} }
}, },
{ {
test: /\.(woff2?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
use: { loader: 'url-loader',
loader: 'file-loader',
options: { options: {
name: '[name].[hash:7].[ext]', limit: 10000,
publicPath: '../../', name: utils.assetsPath('media/[name].[hash:7].[ext]')
outputPath: utils.assetsPath('fonts/')
} }
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
} }
} }
] ]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
} }
} }
+70 -20
View File
@@ -1,30 +1,55 @@
var path = require('path') 'use strict'
var utils = require('./utils') const utils = require('./utils')
var webpack = require('webpack') const webpack = require('webpack')
var config = require('../config') const config = require('../config')
var merge = require('webpack-merge') const merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf') const path = require('path')
var CopyWebpackPlugin = require('copy-webpack-plugin') const baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
// add hot-reload related code to entry chunks const HOST = process.env.HOST
Object.keys(baseWebpackConfig.entry).forEach(function (name) { const PORT = process.env.PORT && Number(process.env.PORT)
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, { const devWebpackConfig = merge(baseWebpackConfig, {
module: { module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
}, },
// cheap-module-eval-source-map is faster for development // cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map', devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [ plugins: [
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': config.dev.env 'process.env': require('../config/dev.env')
}), }),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(), new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(), new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin // https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
@@ -32,14 +57,39 @@ module.exports = merge(baseWebpackConfig, {
template: 'index.html', template: 'index.html',
inject: true inject: true
}), }),
new FriendlyErrorsPlugin(),
// copy custom static assets // copy custom static assets
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ {
from: path.resolve(__dirname, '../static'), from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory, to: config.dev.assetsSubDirectory,
ignore: ['.*'] ignore: ['.*']
} }
]) ])
] ]
}) })
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
+50 -25
View File
@@ -1,26 +1,29 @@
var path = require('path') 'use strict'
var utils = require('./utils') const path = require('path')
var webpack = require('webpack') const utils = require('./utils')
var config = require('../config') const webpack = require('webpack')
var merge = require('webpack-merge') const config = require('../config')
var baseWebpackConfig = require('./webpack.base.conf') const merge = require('webpack-merge')
var CopyWebpackPlugin = require('copy-webpack-plugin') const baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin')
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
var env = process.env.NODE_ENV === 'testing' const env = process.env.NODE_ENV === 'testing'
? require('../config/test.env') ? require('../config/test.env')
: config.build.env : require('../config/prod.env')
var webpackConfig = merge(baseWebpackConfig, { const webpackConfig = merge(baseWebpackConfig, {
module: { module: {
rules: utils.styleLoaders({ rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap, sourceMap: config.build.productionSourceMap,
extract: true extract: true,
usePostCSS: true
}) })
}, },
devtool: config.build.productionSourceMap ? '#source-map' : false, devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: { output: {
path: config.build.assetsRoot, path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'), filename: utils.assetsPath('js/[name].[chunkhash].js'),
@@ -31,22 +34,30 @@ var webpackConfig = merge(baseWebpackConfig, {
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env': env 'process.env': env
}), }),
new webpack.optimize.UglifyJsPlugin({ new UglifyJsPlugin({
uglifyOptions: {
compress: { compress: {
warnings: false warnings: false
}
}, },
sourceMap: true sourceMap: config.build.productionSourceMap,
parallel: true
}), }),
// extract css into its own file // extract css into its own file
new ExtractTextPlugin({ new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css') filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}), }),
// Compress extracted CSS. We are using this plugin so that possible // Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped. // duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({ new OptimizeCSSPlugin({
cssProcessorOptions: { cssProcessorOptions: config.build.productionSourceMap
safe: true ? { safe: true, map: { inline: false } }
} : { safe: true }
}), }),
// generate dist index.html with correct asset hash for caching. // generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html // you can customize output by editing /index.html
@@ -67,10 +78,14 @@ var webpackConfig = merge(baseWebpackConfig, {
// necessary to consistently work with multiple chunks via CommonsChunkPlugin // necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency' chunksSortMode: 'dependency'
}), }),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file // split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({ new webpack.optimize.CommonsChunkPlugin({
name: 'vendor', name: 'vendor',
minChunks: function (module, count) { minChunks (module) {
// any required modules inside node_modules are extracted to vendor // any required modules inside node_modules are extracted to vendor
return ( return (
module.resource && module.resource &&
@@ -85,8 +100,18 @@ var webpackConfig = merge(baseWebpackConfig, {
// prevent vendor hash from being updated whenever app bundle is updated // prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({ new webpack.optimize.CommonsChunkPlugin({
name: 'manifest', name: 'manifest',
chunks: ['vendor'] minChunks: Infinity
}), }),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets // copy custom static assets
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ {
@@ -99,7 +124,7 @@ var webpackConfig = merge(baseWebpackConfig, {
}) })
if (config.build.productionGzip) { if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin') const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push( webpackConfig.plugins.push(
new CompressionWebpackPlugin({ new CompressionWebpackPlugin({
@@ -117,7 +142,7 @@ if (config.build.productionGzip) {
} }
if (config.build.bundleAnalyzerReport) { if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin()) webpackConfig.plugins.push(new BundleAnalyzerPlugin())
} }
+6 -5
View File
@@ -1,11 +1,12 @@
'use strict'
// This is the webpack config used for unit tests. // This is the webpack config used for unit tests.
var utils = require('./utils') const utils = require('./utils')
var webpack = require('webpack') const webpack = require('webpack')
var merge = require('webpack-merge') const merge = require('webpack-merge')
var baseConfig = require('./webpack.base.conf') const baseWebpackConfig = require('./webpack.base.conf')
var webpackConfig = merge(baseConfig, { const webpackConfig = merge(baseWebpackConfig, {
// use inline sourcemap for karma-sourcemap-loader // use inline sourcemap for karma-sourcemap-loader
module: { module: {
rules: utils.styleLoaders() rules: utils.styleLoaders()
+3 -2
View File
@@ -1,5 +1,6 @@
var merge = require('webpack-merge') 'use strict'
var prodEnv = require('./prod.env') const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, { module.exports = merge(prodEnv, {
NODE_ENV: '"development"' NODE_ENV: '"development"'
+55 -17
View File
@@ -1,38 +1,76 @@
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation. // see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
const path = require('path')
module.exports = { module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: { build: {
env: require('./prod.env'), // Template for index.html
index: path.resolve(__dirname, '../dist/index.html'), index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'), assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: './', assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: true, productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as // Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you. // Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to: // Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin // npm install --save-dev compression-webpack-plugin
productionGzip: false, productionGzip: false,
productionGzipExtensions: ['js', 'css'], productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to // Run the build command with an extra argument to
// View the bundle analyzer report after build finishes: // View the bundle analyzer report after build finishes:
// `npm run build --report` // `npm run build --report`
// Set to `true` or `false` to always turn it on or off // Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
} }
} }
+1
View File
@@ -1,3 +1,4 @@
'use strict'
module.exports = { module.exports = {
NODE_ENV: '"production"' NODE_ENV: '"production"'
} }
+3 -2
View File
@@ -1,5 +1,6 @@
var merge = require('webpack-merge') 'use strict'
var devEnv = require('./dev.env') const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, { module.exports = merge(devEnv, {
NODE_ENV: '"testing"' NODE_ENV: '"testing"'
+1
View File
@@ -5,6 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>CoreUI - Open Source Bootstrap Admin Template</title> <title>CoreUI - Open Source Bootstrap Admin Template</title>
<link rel="shortcut icon" href="/static/img/favicon.png">
</head> </head>
<!-- BODY options, add following classes to body to change options <!-- BODY options, add following classes to body to change options
+16909
View File
File diff suppressed because it is too large Load Diff
+91 -80
View File
@@ -1,102 +1,113 @@
{ {
"name": "@coreui/vue", "name": "@coreui/vue",
"version": "1.0.6", "version": "1.0.11",
"description": "Open Source Bootstrap Admin Template", "description": "CoreUI Vue Open Source Bootstrap 4 Admin Template",
"author": "Łukasz Holeczek", "author": "Łukasz Holeczek",
"homepage": "http://coreui.io", "homepage": "http://coreui.io",
"copyright": "Copyright 2017 creativeLabs Łukasz Holeczek", "copyright": "Copyright 2018 creativeLabs Łukasz Holeczek",
"license": "MIT", "license": "MIT",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "node build/dev-server.js", "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "node build/dev-server.js", "start": "npm run dev",
"build": "node build/build.js",
"unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run", "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
"e2e": "node test/e2e/runner.js", "e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e", "test": "npm run unit && npm run e2e",
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
"build": "node build/build.js"
}, },
"dependencies": { "dependencies": {
"bootstrap": "4.0.0-beta.2", "bootstrap": "4.0.0",
"bootstrap-vue": "1.1.0", "bootstrap-vue": "2.0.0-rc.1",
"chart.js": "2.7.1", "chart.js": "^2.7.2",
"flag-icon-css": "^3.0.0",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"simple-line-icons": "^2.4.1", "simple-line-icons": "^2.4.1",
"vue": "2.5.6", "vue": "2.5.13",
"vue-chartjs": "3.0.2", "vue-chartjs": "^3.3.1",
"vue-router": "3.0.1" "vue-router": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "7.1.6", "autoprefixer": "7.2.5",
"babel-core": "6.26.0", "babel-core": "6.26.0",
"babel-eslint": "8.0.2", "babel-eslint": "8.2.2",
"babel-loader": "7.1.2", "babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-plugin-transform-runtime": "6.23.0", "babel-loader": "^7.1.4",
"babel-preset-env": "1.6.1", "babel-plugin-istanbul": "^4.1.5",
"babel-preset-stage-2": "6.24.1", "babel-plugin-syntax-jsx": "^6.18.0",
"babel-register": "6.26.0", "babel-plugin-transform-runtime": "^6.23.0",
"chalk": "2.3.0", "babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.6.1",
"babel-preset-stage-2": "^6.24.1",
"babel-register": "^6.26.0",
"chai": "^4.1.2",
"chalk": "^2.3.2",
"chromedriver": "^2.27.2",
"copy-webpack-plugin": "^4.5.1",
"cross-env": "^5.0.1",
"cross-spawn": "^5.0.1",
"connect-history-api-fallback": "1.5.0", "connect-history-api-fallback": "1.5.0",
"copy-webpack-plugin": "4.2.1", "css-loader": "^0.28.11",
"css-loader": "0.28.7", "eslint": "^4.19.1",
"eslint": "4.11.0", "eslint-config-standard": "^11.0.0",
"eslint-friendly-formatter": "3.0.0", "eslint-friendly-formatter": "^4.0.0",
"eslint-loader": "1.9.0", "eslint-loader": "^2.0.0",
"eslint-plugin-html": "4.0.0", "eslint-plugin-import": "^2.9.0",
"eslint-plugin-import": "2.8.0", "eslint-plugin-html": "^4.0.2",
"eslint-plugin-node": "5.2.1", "eslint-plugin-node": "^6.0.1",
"eslint-config-standard": "10.2.1", "eslint-plugin-promise": "^3.7.0",
"eslint-plugin-promise": "3.6.0", "eslint-plugin-standard": "^3.0.1",
"eslint-plugin-standard": "3.0.1", "eslint-plugin-vue": "^4.4.0",
"eventsource-polyfill": "0.9.6", "extract-text-webpack-plugin": "^3.0.2",
"express": "4.16.2", "file-loader": "^1.1.11",
"extract-text-webpack-plugin": "3.0.2", "friendly-errors-webpack-plugin": "^1.6.1",
"file-loader": "1.1.5", "html-webpack-plugin": "^2.30.1",
"friendly-errors-webpack-plugin": "1.6.1", "inject-loader": "^3.0.1",
"html-webpack-plugin": "2.30.1", "karma": "^2.0.0",
"http-proxy-middleware": "0.17.4", "karma-coverage": "^1.1.1",
"webpack-bundle-analyzer": "2.9.1", "karma-mocha": "^1.3.0",
"cross-env": "5.1.1", "karma-phantomjs-launcher": "^1.0.4",
"karma": "1.7.1", "karma-phantomjs-shim": "^1.5.0",
"karma-coverage": "1.1.1", "karma-sinon-chai": "^1.3.3",
"karma-mocha": "1.3.0", "karma-sourcemap-loader": "^0.3.7",
"karma-phantomjs-launcher": "1.0.4", "karma-spec-reporter": "^0.0.32",
"karma-phantomjs-shim": "1.5.0", "karma-webpack": "^2.0.9",
"karma-sinon-chai": "1.3.3", "lolex": "2.3.2",
"karma-sourcemap-loader": "0.3.7", "mocha": "^5.0.5",
"karma-spec-reporter": "0.0.31", "nightwatch": "^0.9.20",
"karma-webpack": "2.0.6", "node-notifier": "^5.2.1",
"lolex": "2.3.0", "optimize-css-assets-webpack-plugin": "^3.2.0",
"mocha": "4.0.1", "ora": "^1.2.0",
"chai": "4.1.2",
"sinon": "4.1.2",
"sinon-chai": "2.14.0",
"inject-loader": "3.0.1",
"babel-plugin-istanbul": "4.1.5",
"phantomjs-prebuilt": "^2.1.16", "phantomjs-prebuilt": "^2.1.16",
"chromedriver": "2.33.2", "portfinder": "^1.0.13",
"cross-spawn": "5.1.0", "postcss-import": "^11.1.0",
"nightwatch": "0.9.16", "postcss-loader": "^2.1.3",
"selenium-server": "3.7.1", "postcss-url": "^7.3.1",
"semver": "5.4.1", "rimraf": "^2.6.2",
"shelljs": "0.7.8", "selenium-server": "^3.11.0",
"opn": "5.1.0", "semver": "^5.5.0",
"optimize-css-assets-webpack-plugin": "3.2.0", "shelljs": "^0.8.1",
"ora": "1.3.0", "sinon": "^4.4.9",
"rimraf": "2.6.2", "sinon-chai": "^3.0.0",
"url-loader": "0.6.2", "uglifyjs-webpack-plugin": "^1.2.4",
"vue-loader": "13.5.0", "url-loader": "^1.0.1",
"vue-style-loader": "3.0.3", "vue-loader": "^14.2.2",
"vue-template-compiler": "2.5.6", "vue-style-loader": "^4.1.0",
"webpack": "3.8.1", "vue-template-compiler": "2.5.13",
"webpack-dev-middleware": "1.12.0", "webpack": "^3.11.0",
"webpack-hot-middleware": "2.20.0", "webpack-bundle-analyzer": "^2.11.1",
"webpack-merge": "4.1.1", "webpack-dev-server": "^2.11.2",
"node-sass": "4.7.1", "webpack-merge": "^4.1.2",
"sass-loader": "6.0.6" "node-sass": "^4.8.3",
"sass-loader": "^6.0.7"
}, },
"engines": { "engines": {
"node": ">= 6.4.0", "node": ">= 8.9.4",
"npm": ">= 5.0.0" "npm": ">= 5.6.0"
} },
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 9"
]
} }
+14 -8
View File
@@ -9,14 +9,20 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
// Import Font Awesome Icons Set /* Import Font Awesome Icons Set */
$fa-font-path: '~font-awesome/fonts/'; $fa-font-path: '~font-awesome/fonts/';
@import '~font-awesome/css/font-awesome.min.css'; @import '~font-awesome/scss/font-awesome.scss';
// Import Simple Line Icons Set /* Import Simple Line Icons Set */
$simple-line-font-path: '~simple-line-icons/fonts/'; $simple-line-font-path: '~simple-line-icons/fonts/';
@import '~simple-line-icons/css/simple-line-icons.css'; @import '~simple-line-icons/scss/simple-line-icons.scss';
// Import Bootstrap Vue Styles </style>
@import '~bootstrap-vue/dist/bootstrap-vue.css'; <style>
// Import Main styles for this application /* Import Flag Icons Set */
@import './scss/style'; @import 'flag-icon-css/css/flag-icon.min.css';
/* Import Bootstrap Vue Styles */
@import 'bootstrap-vue/dist/bootstrap-vue.css';
</style>
<style lang="scss">
// Import Main styles for this application
@import './assets/scss/style';
</style> </style>
+132 -20
View File
@@ -11,7 +11,7 @@ export default {
}, },
{ {
title: true, title: true,
name: 'UI elements', name: 'Theme',
class: '', class: '',
wrapper: { wrapper: {
element: '', element: '',
@@ -19,44 +19,125 @@ export default {
} }
}, },
{ {
name: 'Colors',
url: '/theme/colors',
icon: 'icon-drop'
},
{
name: 'Typography',
url: '/theme/typography',
icon: 'icon-pencil'
},
{
title: true,
name: 'Components', name: 'Components',
url: '/components', class: '',
wrapper: {
element: '',
attributes: {}
}
},
{
name: 'Base',
url: '/base',
icon: 'icon-puzzle', icon: 'icon-puzzle',
children: [ children: [
{ {
name: 'Buttons', name: 'Breadcrumbs',
url: '/components/buttons', url: '/base/breadcrumbs',
icon: 'icon-puzzle'
},
{
name: 'Social Buttons',
url: '/components/social-buttons',
icon: 'icon-puzzle' icon: 'icon-puzzle'
}, },
{ {
name: 'Cards', name: 'Cards',
url: '/components/cards', url: '/base/cards',
icon: 'icon-puzzle'
},
{
name: 'Carousels',
url: '/base/carousels',
icon: 'icon-puzzle'
},
{
name: 'Collapses',
url: '/base/collapses',
icon: 'icon-puzzle' icon: 'icon-puzzle'
}, },
{ {
name: 'Forms', name: 'Forms',
url: '/components/forms', url: '/base/forms',
icon: 'icon-puzzle' icon: 'icon-puzzle'
}, },
{ {
name: 'Modals', name: 'Jumbotrons',
url: '/components/modals', url: '/base/jumbotrons',
icon: 'icon-puzzle'
},
{
name: 'List Groups',
url: '/base/list-groups',
icon: 'icon-puzzle'
},
{
name: 'Navs',
url: '/base/navs',
icon: 'icon-puzzle'
},
{
name: 'Paginations',
url: '/base/paginations',
icon: 'icon-puzzle'
},
{
name: 'Popovers',
url: '/base/popovers',
icon: 'icon-puzzle'
},
{
name: 'Progress Bars',
url: '/base/progress-bars',
icon: 'icon-puzzle' icon: 'icon-puzzle'
}, },
{ {
name: 'Switches', name: 'Switches',
url: '/components/switches', url: '/base/switches',
icon: 'icon-puzzle' icon: 'icon-puzzle'
}, },
{ {
name: 'Tables', name: 'Tables',
url: '/components/tables', url: '/base/tables',
icon: 'icon-puzzle' icon: 'icon-puzzle'
},
{
name: 'Tooltips',
url: '/base/tooltips',
icon: 'icon-puzzle'
}
]
},
{
name: 'Buttons',
url: '/buttons',
icon: 'icon-cursor',
children: [
{
name: 'Standard Buttons',
url: '/buttons/standard-buttons',
icon: 'icon-cursor'
},
{
name: 'Button Groups',
url: '/buttons/button-groups',
icon: 'icon-cursor'
},
{
name: 'Dropdowns',
url: '/buttons/dropdowns',
icon: 'icon-cursor'
},
{
name: 'Social Buttons',
url: '/buttons/social-buttons',
icon: 'icon-cursor'
} }
] ]
}, },
@@ -65,6 +146,15 @@ export default {
url: '/icons', url: '/icons',
icon: 'icon-star', icon: 'icon-star',
children: [ children: [
{
name: 'Flags',
url: '/icons/flags',
icon: 'icon-star',
badge: {
variant: 'success',
text: 'NEW'
}
},
{ {
name: 'Font Awesome', name: 'Font Awesome',
url: '/icons/font-awesome', url: '/icons/font-awesome',
@@ -81,6 +171,33 @@ export default {
} }
] ]
}, },
{
name: 'Charts',
url: '/charts',
icon: 'icon-pie-chart'
},
{
name: 'Notifications',
url: '/notifications',
icon: 'icon-bell',
children: [
{
name: 'Alerts',
url: '/notifications/alerts',
icon: 'icon-bell'
},
{
name: 'Badges',
url: '/notifications/badges',
icon: 'icon-bell'
},
{
name: 'Modals',
url: '/notifications/modals',
icon: 'icon-bell'
}
]
},
{ {
name: 'Widgets', name: 'Widgets',
url: '/widgets', url: '/widgets',
@@ -90,11 +207,6 @@ export default {
text: 'NEW' text: 'NEW'
} }
}, },
{
name: 'Charts',
url: '/charts',
icon: 'icon-pie-chart'
},
{ {
divider: true divider: true
}, },
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

@@ -51,7 +51,28 @@ $theme-colors: (
warning: $yellow, warning: $yellow,
danger: $red, danger: $red,
light: $gray-100, light: $gray-100,
dark: $gray-800 dark: $gray-800,
blue: $blue,
indigo: $indigo,
purple: $purple,
pink: $pink,
red: $red,
orange: $orange,
yellow: $yellow,
green: $green,
teal: $teal,
cyan: $cyan,
gray-100: $gray-100,
gray-200: $gray-200,
gray-300: $gray-300,
gray-400: $gray-400,
gray-500: $gray-500,
gray-600: $gray-600,
gray-700: $gray-700,
gray-800: $gray-800,
gray-900: $gray-900
); );
// Options // Options
@@ -2,15 +2,6 @@ button {
cursor: pointer; cursor: pointer;
} }
.btn {
.badge {
position: absolute;
top: 2px;
right: 6px;
font-size: 9px;
}
}
.btn-transparent { .btn-transparent {
color: #fff; color: #fff;
background-color: transparent; background-color: transparent;
@@ -20,7 +20,7 @@
.card-header { .card-header {
.icon-bg { .icon-bg {
display: inline-body; display: inline-block;
padding: $card-spacer-y $card-spacer-x !important; padding: $card-spacer-y $card-spacer-x !important;
margin-top: -$card-spacer-y; margin-top: -$card-spacer-y;
margin-right: $card-spacer-x; margin-right: $card-spacer-x;
@@ -135,12 +135,12 @@
} }
[class^="icon-"], [class*=" icon-"] { [class^="icon-"], [class*=" icon-"] {
display: inline-body; display: inline-block;
vertical-align: middle; vertical-align: middle;
} }
i { i {
display: inline-body; display: inline-block;
transition: .4s; transition: .4s;
} }
@@ -153,7 +153,7 @@
width: 230px; width: 230px;
margin: 6px; margin: 6px;
.input-group-addon { .input-group-prepend, .input-group-append {
background: #fff; background: #fff;
} }
@@ -1,6 +1,5 @@
.input-group-addon, .input-group-prepend,
.input-group-btn { .input-group-append {
min-width: 40px;
white-space: nowrap; white-space: nowrap;
vertical-align: middle; // Match the inputs vertical-align: middle; // Match the inputs
} }
@@ -129,6 +129,9 @@ app-root {
} }
} }
} }
.sidebar-minimizer {
display: none;
}
} }
.sidebar-minimized { .sidebar-minimized {
@@ -1,6 +1,9 @@
.nav-tabs { .nav-tabs {
.nav-link { .nav-link {
color: $gray-600; color: $gray-600;
&:hover {
cursor: pointer;
}
&.active { &.active {
color: $gray-800; color: $gray-800;
background: #fff; background: #fff;
@@ -207,7 +207,7 @@
border-radius: $border-radius; border-radius: $border-radius;
} }
> .nav-dropdown-items { > .nav-dropdown-items {
max-height: 1000px; max-height: 1500px;
} }
.nav-link { .nav-link {
@@ -48,7 +48,7 @@ $navbar-border: (
) !default; ) !default;
$navbar-brand-width: 155px !default; $navbar-brand-width: 155px !default;
$navbar-brand-bg: #fff !default; $navbar-brand-bg: #fff !default;
$navbar-brand-logo: url('../img/logo.png') !default; $navbar-brand-logo: url('/static/img/logo.png') !default;
$navbar-brand-logo-size: 70px auto !default; $navbar-brand-logo-size: 70px auto !default;
$navbar-brand-border: ( $navbar-brand-border: (
bottom: ( bottom: (
@@ -60,7 +60,7 @@ $navbar-brand-border: (
$navbar-brand-minimized-width: 50px !default; $navbar-brand-minimized-width: 50px !default;
$navbar-brand-minimized-bg: $navbar-brand-bg !default; $navbar-brand-minimized-bg: $navbar-brand-bg !default;
$navbar-brand-minimized-logo: url('../img/logo-symbol.png') !default; $navbar-brand-minimized-logo: url('/static/img/logo-symbol.png') !default;
$navbar-brand-minimized-logo-size: 24px !default; $navbar-brand-minimized-logo-size: 24px !default;
$navbar-brand-minimized-border: $navbar-brand-border !default; $navbar-brand-minimized-border: $navbar-brand-border !default;
@@ -1,8 +1,8 @@
/*! /*!
* CoreUI - Open Source Bootstrap Admin Template * CoreUI - Open Source Bootstrap Admin Template
* @version v1.0.6 * @version v1.0.11
* @link http://coreui.io * @link http://coreui.io
* Copyright (c) 2017 creativeLabs Łukasz Holeczek * Copyright (c) 2018 creativeLabs Łukasz Holeczek
* @license MIT * @license MIT
*/ */
@@ -10,7 +10,7 @@
@import "bootstrap-variables"; @import "bootstrap-variables";
// Import Bootstrap source files // Import Bootstrap source files
@import "node_modules/bootstrap/scss/bootstrap"; @import "~bootstrap/scss/bootstrap";
// Override core variables // Override core variables
@import "core-variables"; @import "core-variables";
+1 -1
View File
@@ -222,7 +222,7 @@
import Callout from './Callout' import Callout from './Callout'
import cSwitch from './Switch' import cSwitch from './Switch'
export default { export default {
name: 'aside', name: 'c-aside',
components: { components: {
Callout, Callout,
cSwitch cSwitch
@@ -1,6 +1,6 @@
<template> <template>
<ol class="breadcrumb"> <ol class="breadcrumb">
<li class="breadcrumb-item" v-for="(item, index) in list"> <li class="breadcrumb-item" :key="index" v-for="(item, index) in list">
<span class="active" v-if="isLast(index)">{{ showName(item) }}</span> <span class="active" v-if="isLast(index)">{{ showName(item) }}</span>
<router-link :to="item" v-else>{{ showName(item) }}</router-link> <router-link :to="item" v-else>{{ showName(item) }}</router-link>
</li> </li>
+2 -2
View File
@@ -1,11 +1,11 @@
<template> <template>
<footer class="app-footer"> <footer class="app-footer">
<span><a href="http://coreui.io">CoreUI</a> &copy; 2017 creativeLabs.</span> <span><a href="http://coreui.io">CoreUI</a> &copy; 2018 creativeLabs.</span>
<span class="ml-auto">Powered by <a href="http://coreui.io">CoreUI</a></span> <span class="ml-auto">Powered by <a href="http://coreui.io">CoreUI</a></span>
</footer> </footer>
</template> </template>
<script> <script>
export default { export default {
name: 'footer' name: 'c-footer'
} }
</script> </script>
@@ -31,10 +31,10 @@
</header> </header>
</template> </template>
<script> <script>
import HeaderDropdown from './HeaderDropdown.vue' import HeaderDropdown from './HeaderDropdown.vue'
export default { export default {
name: 'header', name: 'c-header',
components: { components: {
HeaderDropdown HeaderDropdown
}, },
@@ -56,5 +56,5 @@
document.body.classList.toggle('aside-menu-hidden') document.body.classList.toggle('aside-menu-hidden')
} }
} }
} }
</script> </script>
@@ -11,7 +11,7 @@
<b-dropdown-header tag="div" class="text-center"><strong>Settings</strong></b-dropdown-header> <b-dropdown-header tag="div" class="text-center"><strong>Settings</strong></b-dropdown-header>
<b-dropdown-item><i class="fa fa-user"></i> Profile</b-dropdown-item> <b-dropdown-item><i class="fa fa-user"></i> Profile</b-dropdown-item>
<b-dropdown-item><i class="fa fa-wrench"></i> Settings</b-dropdown-item> <b-dropdown-item><i class="fa fa-wrench"></i> Settings</b-dropdown-item>
<b-dropdown-item><i class="fa fa-usd"></i> Payments<b-badge variant="default">{{itemsCount}}</b-badge></b-dropdown-item> <b-dropdown-item><i class="fa fa-usd"></i> Payments<b-badge variant="secondary">{{itemsCount}}</b-badge></b-dropdown-item>
<b-dropdown-item><i class="fa fa-file"></i> Projects<b-badge variant="primary">{{itemsCount}}</b-badge></b-dropdown-item> <b-dropdown-item><i class="fa fa-file"></i> Projects<b-badge variant="primary">{{itemsCount}}</b-badge></b-dropdown-item>
<b-dropdown-divider></b-dropdown-divider> <b-dropdown-divider></b-dropdown-divider>
<b-dropdown-item><i class="fa fa-shield"></i> Lock Account</b-dropdown-item> <b-dropdown-item><i class="fa fa-shield"></i> Lock Account</b-dropdown-item>
@@ -19,11 +19,10 @@
</b-nav-item-dropdown> </b-nav-item-dropdown>
</template> </template>
<script> <script>
export default { export default {
name: 'header-dropdown', name: 'header-dropdown',
data: () => { data: () => {
return { itemsCount: 42 } return { itemsCount: 42 }
} }
} }
</script> </script>
@@ -7,26 +7,29 @@
<ul class="nav"> <ul class="nav">
<template v-for="(item, index) in navItems"> <template v-for="(item, index) in navItems">
<template v-if="item.title"> <template v-if="item.title">
<SidebarNavTitle :name="item.name" :classes="item.class" :wrapper="item.wrapper"/> <SidebarNavTitle :key="index" :name="item.name" :classes="item.class" :wrapper="item.wrapper"/>
</template> </template>
<template v-else-if="item.divider"> <template v-else-if="item.divider">
<SidebarNavDivider :classes="item.class"/> <SidebarNavDivider :key="index" :classes="item.class"/>
</template>
<template v-else-if="item.label">
<SidebarNavLabel :key="index" :name="item.name" :url="item.url" :icon="item.icon" :label="item.label" :classes="item.class"/>
</template> </template>
<template v-else> <template v-else>
<template v-if="item.children"> <template v-if="item.children">
<!-- First level dropdown --> <!-- First level dropdown -->
<SidebarNavDropdown :name="item.name" :url="item.url" :icon="item.icon"> <SidebarNavDropdown :key="index" :name="item.name" :url="item.url" :icon="item.icon">
<template v-for="(childL1, index) in item.children"> <template v-for="(childL1, index1) in item.children">
<template v-if="childL1.children"> <template v-if="childL1.children">
<!-- Second level dropdown --> <!-- Second level dropdown -->
<SidebarNavDropdown :name="childL1.name" :url="childL1.url" :icon="childL1.icon"> <SidebarNavDropdown :key="index1" :name="childL1.name" :url="childL1.url" :icon="childL1.icon">
<li class="nav-item" v-for="(childL2, index) in childL1.children"> <li class="nav-item" :key="index2" v-for="(childL2, index2) in childL1.children">
<SidebarNavLink :name="childL2.name" :url="childL2.url" :icon="childL2.icon" :badge="childL2.badge" :variant="item.variant"/> <SidebarNavLink :name="childL2.name" :url="childL2.url" :icon="childL2.icon" :badge="childL2.badge" :variant="item.variant"/>
</li> </li>
</SidebarNavDropdown> </SidebarNavDropdown>
</template> </template>
<template v-else> <template v-else>
<SidebarNavItem :classes="item.class"> <SidebarNavItem :key="index1" :classes="item.class">
<SidebarNavLink :name="childL1.name" :url="childL1.url" :icon="childL1.icon" :badge="childL1.badge" :variant="item.variant"/> <SidebarNavLink :name="childL1.name" :url="childL1.url" :icon="childL1.icon" :badge="childL1.badge" :variant="item.variant"/>
</SidebarNavItem> </SidebarNavItem>
</template> </template>
@@ -34,7 +37,7 @@
</SidebarNavDropdown> </SidebarNavDropdown>
</template> </template>
<template v-else> <template v-else>
<SidebarNavItem :classes="item.class"> <SidebarNavItem :key="index" :classes="item.class">
<SidebarNavLink :name="item.name" :url="item.url" :icon="item.icon" :badge="item.badge" :variant="item.variant"/> <SidebarNavLink :name="item.name" :url="item.url" :icon="item.icon" :badge="item.badge" :variant="item.variant"/>
</SidebarNavItem> </SidebarNavItem>
</template> </template>
@@ -57,6 +60,7 @@ import SidebarNavDropdown from './SidebarNavDropdown'
import SidebarNavLink from './SidebarNavLink' import SidebarNavLink from './SidebarNavLink'
import SidebarNavTitle from './SidebarNavTitle' import SidebarNavTitle from './SidebarNavTitle'
import SidebarNavItem from './SidebarNavItem' import SidebarNavItem from './SidebarNavItem'
import SidebarNavLabel from './SidebarNavLabel'
export default { export default {
name: 'sidebar', name: 'sidebar',
props: { props: {
@@ -75,7 +79,8 @@ export default {
SidebarNavDropdown, SidebarNavDropdown,
SidebarNavLink, SidebarNavLink,
SidebarNavTitle, SidebarNavTitle,
SidebarNavItem SidebarNavItem,
SidebarNavLabel
}, },
methods: { methods: {
handleClick (e) { handleClick (e) {
@@ -1,4 +1,5 @@
<template> <template>
<div></div>
<!-- <div class="sidebar-footer"></div> --> <!-- <div class="sidebar-footer"></div> -->
</template> </template>
<script> <script>
@@ -1,4 +1,5 @@
<template> <template>
<div></div>
<!-- <div class="sidebar-form"></div> --> <!-- <div class="sidebar-form"></div> -->
</template> </template>
<script> <script>
@@ -1,4 +1,5 @@
<template> <template>
<div></div>
<!-- <div class="sidebar-header"></div> --> <!-- <div class="sidebar-header"></div> -->
</template> </template>
<script> <script>
@@ -0,0 +1,26 @@
<template>
<li :class="classList"></li>
</template>
<script>
export default {
name: 'sidebar-nav-divider',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'divider',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
@@ -0,0 +1,35 @@
<template>
<li :class="classList" @click="hideMobile">
<slot></slot>
</li>
</template>
<script>
export default {
name: 'sidebar-nav-item',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-item',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
},
methods: {
hideMobile () {
if (document.body.classList.contains('sidebar-mobile-show')) {
document.body.classList.toggle('sidebar-mobile-show')
}
}
}
}
</script>
@@ -0,0 +1,59 @@
<template>
<SidebarNavItem :classes="classList.navItem">
<a :class="classList.navLink" :href="url"><i :class="classList.icon"></i> {{name}}</a>
</SidebarNavItem>
</template>
<script>
import SidebarNavItem from './SidebarNavItem'
import SidebarNavLink from './SidebarNavLink'
export default {
name: 'sidebar-nav-label',
components: {
SidebarNavItem,
SidebarNavLink
},
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: '#'
},
icon: {
type: String,
default: 'fa fa-circle'
},
classes: {
type: String,
default: ''
},
label: {
type: Object,
required: true,
default: () => {}
}
},
computed: {
classList () {
const classes = {
navItem: ['hidden-cn', ...this.getClasses(this.classes)].join(' '),
navLink: 'nav-label',
icon: [
this.icon ? this.icon : 'fa fa-circle',
this.label.variant ? `text-${this.label.variant}` : '',
this.label.class ? this.label.class : ''
].join(' ')
}
return classes
}
},
methods: {
getClasses (classes) {
return classes ? classes.split(' ') : []
}
}
}
</script>
@@ -0,0 +1,68 @@
<template>
<div v-if="isExternalLink">
<a :href="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</a>
</div>
<div v-else>
<router-link :to="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</router-link>
</div>
</template>
<script>
export default {
name: 'sidebar-nav-link',
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
},
badge: {
type: Object,
default: () => {}
},
variant: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-link',
this.linkVariant,
...this.itemClasses
]
},
linkVariant () {
return this.variant ? `nav-link-${this.variant}` : ''
},
itemClasses () {
return this.classes ? this.classes.split(' ') : []
},
isExternalLink () {
if (this.url.substring(0, 4) === 'http') {
return true
} else {
return false
}
}
}
}
</script>
@@ -0,0 +1,42 @@
<template>
<li :class="classList">
<template v-if="wrapper && wrapper.element">
<component v-bind:is="wrapper.element" v-bind="wrapper.attributes">
{{name}}
</component>
</template>
<template v-else>
{{name}}
</template>
</li>
</template>
<script>
export default {
props: {
name: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
},
wrapper: {
type: Object,
default: () => {}
}
},
computed: {
classList () {
return [
'nav-title',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
@@ -1,26 +0,0 @@
<template>
<li :class="classList"></li>
</template>
<script>
export default {
name: 'sidebar-nav-divider',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'divider',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
@@ -1,28 +0,0 @@
<template>
<li :class="classList">
<slot></slot>
</li>
</template>
<script>
export default {
name: 'sidebar-nav-item',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-item',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
@@ -1,68 +0,0 @@
<template>
<div v-if="isExternalLink">
<a :href="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</a>
</div>
<div v-else>
<router-link :to="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</router-link>
</div>
</template>
<script>
export default {
name: 'sidebar-nav-link',
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
},
badge: {
type: Object,
default: () => {}
},
variant: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-link',
this.linkVariant,
...this.itemClasses
]
},
linkVariant () {
return this.variant ? `nav-link-${this.variant}` : ''
},
itemClasses () {
return this.classes ? this.classes.split(' ') : []
},
isExternalLink () {
if (this.url.substring(0, 4) === 'http') {
return true
} else {
return false
}
}
}
}
</script>
@@ -1,42 +0,0 @@
<template>
<li :class="classList">
<template v-if="wrapper && wrapper.element">
<component v-bind:is="wrapper.element" v-bind="wrapper.attributes">
{{name}}
</component>
</template>
<template v-else>
{{name}}
</template>
</li>
</template>
<script>
export default {
props: {
name: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
},
wrapper: {
type: Object,
default: () => {}
}
},
computed: {
classList () {
return [
'nav-title',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
+2 -2
View File
@@ -2,8 +2,8 @@ import Aside from './Aside.vue'
import Breadcrumb from './Breadcrumb.vue' import Breadcrumb from './Breadcrumb.vue'
import Callout from './Callout.vue' import Callout from './Callout.vue'
import Footer from './Footer.vue' import Footer from './Footer.vue'
import Header from './Header.vue' import Header from './Header/Header.vue'
import Sidebar from './Sidebar.vue' import Sidebar from './Sidebar/Sidebar.vue'
import Switch from './Switch.vue' import Switch from './Switch.vue'
export { export {
+169 -25
View File
@@ -6,22 +6,46 @@ import Full from '@/containers/Full'
// Views // Views
import Dashboard from '@/views/Dashboard' import Dashboard from '@/views/Dashboard'
import Colors from '@/views/theme/Colors'
import Typography from '@/views/theme/Typography'
import Charts from '@/views/Charts' import Charts from '@/views/Charts'
import Widgets from '@/views/Widgets' import Widgets from '@/views/Widgets'
// Views - Components // Views - Components
import Buttons from '@/views/components/Buttons' import Cards from '@/views/base/Cards'
import SocialButtons from '@/views/components/SocialButtons' import Forms from '@/views/base/Forms'
import Cards from '@/views/components/Cards' import Switches from '@/views/base/Switches'
import Forms from '@/views/components/Forms' import Tables from '@/views/base/Tables'
import Modals from '@/views/components/Modals' import Breadcrumbs from '@/views/base/Breadcrumbs'
import Switches from '@/views/components/Switches' import Carousels from '@/views/base/Carousels'
import Tables from '@/views/components/Tables' import Collapses from '@/views/base/Collapses'
import Jumbotrons from '@/views/base/Jumbotrons'
import ListGroups from '@/views/base/ListGroups'
import Navs from '@/views/base/Navs'
import Navbars from '@/views/base/Navbars'
import Paginations from '@/views/base/Paginations'
import Popovers from '@/views/base/Popovers'
import ProgressBars from '@/views/base/ProgressBars'
import Tooltips from '@/views/base/Tooltips'
// Views - Buttons
import StandardButtons from '@/views/buttons/StandardButtons'
import ButtonGroups from '@/views/buttons/ButtonGroups'
import Dropdowns from '@/views/buttons/Dropdowns'
import SocialButtons from '@/views/buttons/SocialButtons'
// Views - Icons // Views - Icons
import Flags from '@/views/icons/Flags'
import FontAwesome from '@/views/icons/FontAwesome' import FontAwesome from '@/views/icons/FontAwesome'
import SimpleLineIcons from '@/views/icons/SimpleLineIcons' import SimpleLineIcons from '@/views/icons/SimpleLineIcons'
// Views - Notifications
import Alerts from '@/views/notifications/Alerts'
import Badges from '@/views/notifications/Badges'
import Modals from '@/views/notifications/Modals'
// Views - Pages // Views - Pages
import Page404 from '@/views/pages/Page404' import Page404 from '@/views/pages/Page404'
import Page500 from '@/views/pages/Page500' import Page500 from '@/views/pages/Page500'
@@ -46,6 +70,26 @@ export default new Router({
name: 'Dashboard', name: 'Dashboard',
component: Dashboard component: Dashboard
}, },
{
path: 'theme',
redirect: '/theme/colors',
name: 'Theme',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'colors',
name: 'Colors',
component: Colors
},
{
path: 'typography',
name: 'Typography',
component: Typography
}
]
},
{ {
path: 'charts', path: 'charts',
name: 'Charts', name: 'Charts',
@@ -57,23 +101,13 @@ export default new Router({
component: Widgets component: Widgets
}, },
{ {
path: 'components', path: 'base',
redirect: '/components/buttons', redirect: '/base/cards',
name: 'Components', name: 'Base',
component: { component: {
render (c) { return c('router-view') } render (c) { return c('router-view') }
}, },
children: [ children: [
{
path: 'buttons',
name: 'Buttons',
component: Buttons
},
{
path: 'social-buttons',
name: 'Social Buttons',
component: SocialButtons
},
{ {
path: 'cards', path: 'cards',
name: 'Cards', name: 'Cards',
@@ -84,11 +118,6 @@ export default new Router({
name: 'Forms', name: 'Forms',
component: Forms component: Forms
}, },
{
path: 'modals',
name: 'Modals',
component: Modals
},
{ {
path: 'switches', path: 'switches',
name: 'Switches', name: 'Switches',
@@ -98,6 +127,91 @@ export default new Router({
path: 'tables', path: 'tables',
name: 'Tables', name: 'Tables',
component: Tables component: Tables
},
{
path: 'breadcrumbs',
name: 'Breadcrumbs',
component: Breadcrumbs
},
{
path: 'carousels',
name: 'Carousels',
component: Carousels
},
{
path: 'collapses',
name: 'Collapses',
component: Collapses
},
{
path: 'jumbotrons',
name: 'Jumbotrons',
component: Jumbotrons
},
{
path: 'list-groups',
name: 'List Groups',
component: ListGroups
},
{
path: 'navs',
name: 'Navs',
component: Navs
},
{
path: 'navbars',
name: 'Navbars',
component: Navbars
},
{
path: 'paginations',
name: 'Paginations',
component: Paginations
},
{
path: 'popovers',
name: 'Popovers',
component: Popovers
},
{
path: 'progress-bars',
name: 'Progress Bars',
component: ProgressBars
},
{
path: 'tooltips',
name: 'Tooltips',
component: Tooltips
}
]
},
{
path: 'buttons',
redirect: '/buttons/buttons',
name: 'Buttons',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'standard-buttons',
name: 'Standard Buttons',
component: StandardButtons
},
{
path: 'button-groups',
name: 'Button Groups',
component: ButtonGroups
},
{
path: 'dropdowns',
name: 'Dropdowns',
component: Dropdowns
},
{
path: 'social-buttons',
name: 'Social Buttons',
component: SocialButtons
} }
] ]
}, },
@@ -109,6 +223,11 @@ export default new Router({
render (c) { return c('router-view') } render (c) { return c('router-view') }
}, },
children: [ children: [
{
path: 'flags',
name: 'Flags',
component: Flags
},
{ {
path: 'font-awesome', path: 'font-awesome',
name: 'Font Awesome', name: 'Font Awesome',
@@ -120,6 +239,31 @@ export default new Router({
component: SimpleLineIcons component: SimpleLineIcons
} }
] ]
},
{
path: 'notifications',
redirect: '/notifications/alerts',
name: 'Notifications',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'alerts',
name: 'Alerts',
component: Alerts
},
{
path: 'badges',
name: 'Badges',
component: Badges
},
{
path: 'modals',
name: 'Modals',
component: Modals
}
]
} }
] ]
}, },
+21 -20
View File
@@ -78,17 +78,17 @@
<b-card> <b-card>
<b-row> <b-row>
<b-col sm="5"> <b-col sm="5">
<h4 class="card-title mb-0">Traffic</h4> <h4 id="traffic" class="card-title mb-0">Traffic</h4>
<div class="small text-muted">November 2016</div> <div class="small text-muted">November 2017</div>
</b-col> </b-col>
<b-col sm="7" class="d-none d-md-block"> <b-col sm="7" class="d-none d-md-block">
<b-button type="button" variant="primary" class="float-right"><i class="icon-cloud-download"></i></b-button> <b-button type="button" variant="primary" class="float-right"><i class="icon-cloud-download"></i></b-button>
<b-button-toolbar class="float-right" aria-label="Toolbar with button groups"> <b-button-toolbar class="float-right" aria-label="Toolbar with buttons group">
<b-button-group class="mr-3" aria-label="First group"> <b-form-radio-group class="mr-3" id="radiosBtn" buttons button-variant="outline-secondary" v-model="selected" name="radiosBtn">
<b-button variant="outline-secondary">Day</b-button> <b-form-radio class="mx-0" value="Day">Day</b-form-radio>
<b-button variant="outline-secondary" :pressed="true">Month</b-button> <b-form-radio class="mx-0" value="Month">Month</b-form-radio>
<b-button variant="outline-secondary">Year</b-button> <b-form-radio class="mx-0" value="Year">Year</b-form-radio>
</b-button-group> </b-form-radio-group>
</b-button-toolbar> </b-button-toolbar>
</b-col> </b-col>
</b-row> </b-row>
@@ -497,11 +497,7 @@
</b-col> </b-col>
</b-row> </b-row>
<br/> <br/>
<b-table class="table-outline table-responsive-sm mb-0" hover <b-table class="mb-0 table-outline" responsive="sm" hover :items="tableItems" :fields="tableFields" head-variant="light">
:items="tableItems"
:fields="tableFields"
head-variant="light"
>
<div slot="avatar" class="avatar" slot-scope="item"> <div slot="avatar" class="avatar" slot-scope="item">
<img :src="item.value.url" class="img-avatar" alt=""> <img :src="item.value.url" class="img-avatar" alt="">
<span class="avatar-status" v-bind:class="{ 'bg-success': item.value.status == 'success', 'bg-warning': item.value.status == 'warning', 'bg-danger': item.value.status == 'danger', 'bg-secondary': item.value.status == '' }"></span> <span class="avatar-status" v-bind:class="{ 'bg-success': item.value.status == 'success', 'bg-warning': item.value.status == 'warning', 'bg-danger': item.value.status == 'danger', 'bg-secondary': item.value.status == '' }"></span>
@@ -515,7 +511,8 @@
</span> | Registered: {{item.value.registered}} </span> | Registered: {{item.value.registered}}
</div> </div>
</div> </div>
<img slot="country" slot-scope="item" :src="item.value.flag" :alt="item.value.name" style="height:24px;"> <i slot="country" class="h4 mb-0" :class="flag(item.value.flag)" slot-scope="item" :title="item.value.flag" :id="item.value.flag"></i>
<i class="flag-icon flag-icon-pw h1" title="pw" id="pw"></i>
<div slot="usage" slot-scope="item"> <div slot="usage" slot-scope="item">
<div class="clearfix"> <div class="clearfix">
<div class="float-left"> <div class="float-left">
@@ -563,11 +560,12 @@ export default {
}, },
data: function () { data: function () {
return { return {
selected: 'Month',
tableItems: [ tableItems: [
{ {
avatar: { url: 'static/img/avatars/1.jpg', status: 'success' }, avatar: { url: 'static/img/avatars/1.jpg', status: 'success' },
user: { name: 'Yiorgos Avraamu', new: true, registered: 'Jan 1, 2015' }, user: { name: 'Yiorgos Avraamu', new: true, registered: 'Jan 1, 2015' },
country: { name: 'USA', flag: 'static/img/flags/USA.png' }, country: { name: 'USA', flag: 'us' },
usage: { value: 50, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 50, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Mastercard', icon: 'fa fa-cc-mastercard' }, payment: { name: 'Mastercard', icon: 'fa fa-cc-mastercard' },
activity: '10 sec ago' activity: '10 sec ago'
@@ -575,7 +573,7 @@ export default {
{ {
avatar: { url: 'static/img/avatars/2.jpg', status: 'danger' }, avatar: { url: 'static/img/avatars/2.jpg', status: 'danger' },
user: { name: 'Avram Tarasios', new: false, registered: 'Jan 1, 2015' }, user: { name: 'Avram Tarasios', new: false, registered: 'Jan 1, 2015' },
country: { name: 'Brazil', flag: 'static/img/flags/Brazil.png' }, country: { name: 'Brazil', flag: 'br' },
usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Visa', icon: 'fa fa-cc-visa' }, payment: { name: 'Visa', icon: 'fa fa-cc-visa' },
activity: '5 minutes ago' activity: '5 minutes ago'
@@ -583,7 +581,7 @@ export default {
{ {
avatar: { url: 'static/img/avatars/3.jpg', status: 'warning' }, avatar: { url: 'static/img/avatars/3.jpg', status: 'warning' },
user: { name: 'Quintin Ed', new: true, registered: 'Jan 1, 2015' }, user: { name: 'Quintin Ed', new: true, registered: 'Jan 1, 2015' },
country: { name: 'India', flag: 'static/img/flags/India.png' }, country: { name: 'India', flag: 'in' },
usage: { value: 74, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 74, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Stripe', icon: 'fa fa-cc-stripe' }, payment: { name: 'Stripe', icon: 'fa fa-cc-stripe' },
activity: '1 hour ago' activity: '1 hour ago'
@@ -591,7 +589,7 @@ export default {
{ {
avatar: { url: 'static/img/avatars/4.jpg', status: '' }, avatar: { url: 'static/img/avatars/4.jpg', status: '' },
user: { name: 'Enéas Kwadwo', new: true, registered: 'Jan 1, 2015' }, user: { name: 'Enéas Kwadwo', new: true, registered: 'Jan 1, 2015' },
country: { name: 'France', flag: 'static/img/flags/France.png' }, country: { name: 'France', flag: 'fr' },
usage: { value: 98, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 98, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'PayPal', icon: 'fa fa-paypal' }, payment: { name: 'PayPal', icon: 'fa fa-paypal' },
activity: 'Last month' activity: 'Last month'
@@ -599,7 +597,7 @@ export default {
{ {
avatar: { url: 'static/img/avatars/5.jpg', status: 'success' }, avatar: { url: 'static/img/avatars/5.jpg', status: 'success' },
user: { name: 'Agapetus Tadeáš', new: true, registered: 'Jan 1, 2015' }, user: { name: 'Agapetus Tadeáš', new: true, registered: 'Jan 1, 2015' },
country: { name: 'Spain', flag: 'static/img/flags/Spain.png' }, country: { name: 'Spain', flag: 'es' },
usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Google Wallet', icon: 'fa fa-google-wallet' }, payment: { name: 'Google Wallet', icon: 'fa fa-google-wallet' },
activity: 'Last week' activity: 'Last week'
@@ -607,7 +605,7 @@ export default {
{ {
avatar: { url: 'static/img/avatars/6.jpg', status: 'danger' }, avatar: { url: 'static/img/avatars/6.jpg', status: 'danger' },
user: { name: 'Friderik Dávid', new: true, registered: 'Jan 1, 2015' }, user: { name: 'Friderik Dávid', new: true, registered: 'Jan 1, 2015' },
country: { name: 'Poland', flag: 'static/img/flags/Poland.png' }, country: { name: 'Poland', flag: 'pl' },
usage: { value: 43, period: 'Jun 11, 2015 - Jul 10, 2015' }, usage: { value: 43, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Amex', icon: 'fa fa-cc-amex' }, payment: { name: 'Amex', icon: 'fa fa-cc-amex' },
activity: 'Last week' activity: 'Last week'
@@ -651,6 +649,9 @@ export default {
$variant = 'danger' $variant = 'danger'
} }
return $variant return $variant
},
flag (value) {
return 'flag-icon flag-icon-' + value
} }
} }
} }
+1 -1
View File
@@ -390,7 +390,7 @@
</div> </div>
<div class="h4 mb-0">972</div> <div class="h4 mb-0">972</div>
<small class="text-muted text-uppercase font-weight-bold">Comments</small> <small class="text-muted text-uppercase font-weight-bold">Comments</small>
<b-progress height={} class="progress-xs mt-3 mb-0"variant="info" :value="25"/> <b-progress height={} class="progress-xs mt-3 mb-0" variant="info" :value="25"/>
</b-card> </b-card>
</b-col> </b-col>
</b-row><!--/.row--> </b-row><!--/.row-->
@@ -0,0 +1,41 @@
<template>
<div class="wrapper">
<div class="animated fadeIn">
<b-row>
<b-col cols="12">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Bootstrap Breadcrumb</strong>
<div class="card-actions">
<a href="https://bootstrap-vue.js.org/docs/components/breadcrumb" target="_blank"><small class="text-muted">docs</small></a>
</div>
</div>
<b-breadcrumb :items="items"/>
</b-card>
</b-col>
</b-row>
</div>
</div>
</template>
<script>
export default {
name: 'breadcrumbs',
data () {
return {
items: [{
text: 'Admin',
href: '#'
}, {
text: 'Manage',
href: '#'
}, {
text: 'Library',
active: true
}]
}
}
}
</script>
@@ -0,0 +1,93 @@
<template>
<div class="wrapper">
<div class="animated fadeIn">
<b-row>
<b-col cols="12">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Bootstrap Carousel</strong>
<div class="card-actions">
<a href="https://bootstrap-vue.js.org/docs/components/carousel" target="_blank"><small class="text-muted">docs</small></a>
</div>
</div>
<div>
<b-carousel id="carousel1"
style="text-shadow: 1px 1px 2px #333;"
controls
indicators
background="#ababab"
:interval="4000"
img-width="1024"
img-height="480"
v-model="slide"
@sliding-start="onSlideStart"
@sliding-end="onSlideEnd"
>
<!-- Text slides with image -->
<b-carousel-slide caption="First slide"
text="Nulla vitae elit libero, a pharetra augue mollis interdum."
img-src="https://lorempixel.com/1024/480/technics/2/"
></b-carousel-slide>
<!-- Slides with custom text -->
<b-carousel-slide img-src="https://lorempixel.com/1024/480/technics/4/">
<h1>Hello world!</h1>
</b-carousel-slide>
<!-- Slides with image only -->
<b-carousel-slide img-src="https://lorempixel.com/1024/480/technics/8/">
</b-carousel-slide>
<!-- Slides with img slot -->
<!-- Note the classes .d-block and .img-fluid to prevent browser default image alignment -->
<b-carousel-slide>
<img slot="img" class="d-block img-fluid w-100" width="1024" height="480"
src="https://lorempixel.com/1024/480/technics/5/" alt="image slot">
</b-carousel-slide>
<!-- Slide with blank fluid image to maintain slide aspect ratio -->
<b-carousel-slide caption="Blank Image" img-blank img-alt="Blank image">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
eros felis, tincidunt a tincidunt eget, convallis vel est. Ut pellentesque
ut lacus vel interdum.
</p>
</b-carousel-slide>
</b-carousel>
<p class="mt-4">
Slide #: {{ slide }}<br>
Sliding: {{ sliding }}
</p>
</div>
</b-card>
</b-col>
</b-row>
</div>
</div>
</template>
<script>
export default {
name: 'carousels',
data () {
return {
slide: 0,
sliding: null
}
},
methods: {
onSlideStart (slide) {
this.sliding = true
},
onSlideEnd (slide) {
this.sliding = false
}
}
}
</script>

Some files were not shown because too many files have changed in this diff Show More