mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
3aaf729692
19 changed files with 1699 additions and 793 deletions
|
@ -24,6 +24,12 @@ define(function (require) {
|
|||
this._state = state;
|
||||
this._courier = courier;
|
||||
|
||||
// before newListener to prevent unnecessary "emit" when added
|
||||
this.on('removeListener', function onRemoveListener() {
|
||||
if (EventEmitter.listenerCount(this, 'results') > 0) return;
|
||||
courier._closeDataSource(this);
|
||||
});
|
||||
|
||||
this.on('newListener', function (name, listener) {
|
||||
if (name !== 'results') return;
|
||||
|
||||
|
@ -43,11 +49,6 @@ define(function (require) {
|
|||
}
|
||||
});
|
||||
|
||||
this.on('removeListener', function onRemoveListener() {
|
||||
if (EventEmitter.listenerCount(this, 'results') > 0) return;
|
||||
courier._closeDataSource(this);
|
||||
});
|
||||
|
||||
this.extend = function () {
|
||||
return courier
|
||||
.createSource(this._getType())
|
||||
|
|
|
@ -54,11 +54,11 @@ define(function (require) {
|
|||
});
|
||||
|
||||
cacheFieldsToObject(dataSource, fields);
|
||||
callback(err, fields);
|
||||
callback(err, self.getFieldsFromObject(dataSource));
|
||||
});
|
||||
} else {
|
||||
cacheFieldsToObject(dataSource, fields);
|
||||
callback(err, fields);
|
||||
callback(err, self.getFieldsFromObject(dataSource));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -141,8 +141,15 @@ define(function (require) {
|
|||
_.each(index.mappings, function (type) {
|
||||
_.each(type, function (field, name) {
|
||||
if (_.size(field.mapping) === 0 || name[0] === '_') return;
|
||||
if (!_.isUndefined(fields[name]) && fields[name].type !== field.mapping[_.keys(field.mapping)[0]].type)
|
||||
|
||||
var mapping = field.mapping[_.keys(field.mapping)[0]];
|
||||
mapping.type = castMappingType(mapping.type);
|
||||
|
||||
if (fields[name]) {
|
||||
if (fields[name].type === mapping.type) return;
|
||||
return courier._error(new Error.MappingConflict(name));
|
||||
}
|
||||
|
||||
fields[name] = field.mapping[_.keys(field.mapping)[0]];
|
||||
});
|
||||
});
|
||||
|
@ -181,6 +188,33 @@ define(function (require) {
|
|||
return !_.isUndefined(mappings[dataSource._state.index]) ? true : false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Accepts a mapping type, and converts it into it's js equivilent
|
||||
* @param {String} type - the type from the mapping's 'type' field
|
||||
* @return {String} - the most specific type that we care for
|
||||
*/
|
||||
var castMappingType = function (type) {
|
||||
switch (type) {
|
||||
case 'float':
|
||||
case 'double':
|
||||
case 'integer':
|
||||
case 'long':
|
||||
case 'short':
|
||||
case 'byte':
|
||||
case 'token_count':
|
||||
return 'number';
|
||||
case 'date':
|
||||
case 'boolean':
|
||||
case 'ip':
|
||||
case 'attachment':
|
||||
case 'geo_point':
|
||||
case 'geo_shape':
|
||||
return type;
|
||||
default: // including 'string'
|
||||
return 'string';
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Clears mapping caches from elasticsearch and from local object
|
||||
* @param {dataSource} dataSource
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
<script src="kibana/require.config.js"></script>
|
||||
<script>require(['kibana'], function () {});</script>
|
||||
<link rel="stylesheet" href="kibana/styles/main.css" >
|
||||
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||
</head>
|
||||
<body ng-controller="kibana">
|
||||
<div class="content">
|
||||
|
|
15
src/kibana/apps/discover/field_chooser.html
Normal file
15
src/kibana/apps/discover/field_chooser.html
Normal file
|
@ -0,0 +1,15 @@
|
|||
<ul>
|
||||
<li ng-repeat="field in fields">
|
||||
<span ng-click="toggle(field.name)">
|
||||
<i
|
||||
class="fa"
|
||||
ng-class="{
|
||||
'fa-check-square': !field.hidden,
|
||||
'fa-square-o': field.hidden
|
||||
}">
|
||||
</i>
|
||||
{{field.name}}
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<small class="pull-right"><a ng-click="refresh()">refresh field list</a></small>
|
16
src/kibana/apps/discover/field_chooser.js
Normal file
16
src/kibana/apps/discover/field_chooser.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
define(function (require) {
|
||||
var app = require('angular').module('app/discover');
|
||||
var html = require('text!./field_chooser.html');
|
||||
|
||||
app.directive('discFieldChooser', function () {
|
||||
return {
|
||||
restrict: 'E',
|
||||
scope: {
|
||||
fields: '=',
|
||||
toggle: '=',
|
||||
refresh: '='
|
||||
},
|
||||
template: html
|
||||
};
|
||||
});
|
||||
});
|
|
@ -1,43 +1,39 @@
|
|||
<div ng-controller="discover">
|
||||
<h1>Discover</h1>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2">Index</label>
|
||||
<div class="col-sm-10">
|
||||
<input class="form-control" ng-model="index">
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="form-group">
|
||||
<label class="control-label col-sm-3">Repeat Interval</label>
|
||||
<div class="col-sm-9">
|
||||
<select
|
||||
<nav class="navbar navbar-default navbar-static-top subnav">
|
||||
<form class="navbar-form navbar-left form-inline" role="search" ng-submit="fetch()">
|
||||
<label class="control-label">Index</label>
|
||||
<input class="form-control" ng-model="index">
|
||||
<label class="control-label" for="size">Query</label>
|
||||
<input type="text" class="form-control" ng-model="query" placeholder="search">
|
||||
<label class="control-label" for="size">Limit</label>
|
||||
<select
|
||||
class="form-control"
|
||||
ng-model="interval"
|
||||
ng-options="i.display for i in intervalOptions">
|
||||
name="size"
|
||||
ng-model="size"
|
||||
ng-options="size.display for size in sizeOptions">
|
||||
</select>
|
||||
</div>
|
||||
</div> -->
|
||||
<form class="form-group" ng-submit="reset()">
|
||||
<label class="control-label col-sm-2">Query</label>
|
||||
<div class="col-sm-10">
|
||||
<div class="input-group">
|
||||
<input class="form-control" ng-model="query" >
|
||||
<span class="input-group-btn">
|
||||
<button type="button" class="btn" ng-click="reset()">
|
||||
<i class="glyphicon glyphicon-search"></i>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<label class="control-label" for="sort">Sort</label>
|
||||
<select
|
||||
class="form-control"
|
||||
name="sort"
|
||||
ng-model="sort"
|
||||
ng-options="field.name for field in fields">
|
||||
</select>
|
||||
<button type="submit" class="btn btn-default">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</form>
|
||||
</nav>
|
||||
<div class="row">
|
||||
<div class="col-md-10">
|
||||
<kbn-table rows="rows" columns="columns"></kbn-table>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<disc-field-chooser
|
||||
fields="fields"
|
||||
toggle="toggleField"
|
||||
refresh="refreshFieldList">
|
||||
</disc-field-chooser>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label class="control-label col-sm-2">Limit</label>
|
||||
<select
|
||||
class="form-control"
|
||||
ng-model="size"
|
||||
ng-options="size.display for size in sizeOptions">
|
||||
</select>
|
||||
</div>
|
||||
<kbn-table rows="rows" columns="columns"></kbn-table>
|
||||
</div>
|
|
@ -1,11 +1,12 @@
|
|||
define(function (require) {
|
||||
define(function (require, module, exports) {
|
||||
var angular = require('angular');
|
||||
var _ = require('lodash');
|
||||
|
||||
require('directives/table');
|
||||
require('css!./styles/main.css');
|
||||
require('./field_chooser');
|
||||
require('services/saved_searches');
|
||||
|
||||
var app = angular.module('app/discover', []);
|
||||
var app = angular.module('app/discover');
|
||||
|
||||
var sizeOptions = [
|
||||
{ display: '30', val: 30 },
|
||||
|
@ -13,7 +14,7 @@ define(function (require) {
|
|||
{ display: '80', val: 80 },
|
||||
{ display: '125', val: 125 },
|
||||
{ display: '250', val: 250 },
|
||||
{ display: 'Unlimited', val: null },
|
||||
{ display: '500', val: 500 }
|
||||
];
|
||||
|
||||
var intervalOptions = [
|
||||
|
@ -25,20 +26,19 @@ define(function (require) {
|
|||
{ display: 'Yearly', val: 'yearly' }
|
||||
];
|
||||
|
||||
app.controller('discover', function ($scope, courier, config) {
|
||||
var source = courier.rootSearchSource.extend()
|
||||
.size(30)
|
||||
.$scope($scope)
|
||||
.on('results', function (res) {
|
||||
if (!$scope.fields) getFields();
|
||||
$scope.rows = res.hits.hits;
|
||||
});
|
||||
app.controller('discover', function ($scope, config, $q, $routeParams, savedSearches, courier) {
|
||||
var source;
|
||||
if ($routeParams.id) {
|
||||
source = savedSearches.get($routeParams.id);
|
||||
} else {
|
||||
source = savedSearches.create();
|
||||
}
|
||||
|
||||
// stores the complete list of fields
|
||||
$scope.fields = [];
|
||||
$scope.fields = null;
|
||||
|
||||
// stores the fields we want to fetch
|
||||
$scope.columns = [];
|
||||
$scope.columns = null;
|
||||
|
||||
// At what interval are your index patterns
|
||||
$scope.intervalOptions = intervalOptions;
|
||||
|
@ -48,56 +48,128 @@ define(function (require) {
|
|||
$scope.sizeOptions = sizeOptions;
|
||||
$scope.size = $scope.sizeOptions[0];
|
||||
|
||||
// watch the discover.defaultIndex config value for changes
|
||||
// the index that will be
|
||||
config.$watch('discover.defaultIndex', function (val) {
|
||||
if (!val) {
|
||||
config.set('discover.defaultIndex', '_all');
|
||||
return;
|
||||
if (!val) return config.set('discover.defaultIndex', '_all');
|
||||
if (!$scope.index) {
|
||||
$scope.index = val;
|
||||
$scope.fetch();
|
||||
}
|
||||
// only set if datasource doesn't have an index
|
||||
if (!source.get('index')) $scope.index = val;
|
||||
});
|
||||
|
||||
$scope.$watch('index', function (val) {
|
||||
// set the index on the data source
|
||||
source.index(val);
|
||||
// clear the columns and fields, then refetch when we so a search
|
||||
$scope.columns = $scope.fields = null;
|
||||
});
|
||||
source
|
||||
.size(30)
|
||||
.$scope($scope)
|
||||
.inherits(courier.rootSearchSource)
|
||||
.on('results', function (res) {
|
||||
if (!$scope.fields) getFields();
|
||||
$scope.rows = res.hits.hits;
|
||||
});
|
||||
|
||||
$scope.$watch('query', function (query) {
|
||||
if (query) {
|
||||
source.query({
|
||||
$scope.fetch = function () {
|
||||
if (!$scope.fields) getFields();
|
||||
source
|
||||
.size($scope.size.val)
|
||||
.query(!$scope.query ? null : {
|
||||
query_string: {
|
||||
query: query
|
||||
query: $scope.query
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// clear the query
|
||||
source.query(null);
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$watch('size', function (selectedSize) {
|
||||
source.size(selectedSize.val);
|
||||
});
|
||||
|
||||
$scope.reset = function () {
|
||||
// the check happens only when the results come in; prevents a race condition
|
||||
// if (!$scope.fields) getFields();
|
||||
courier.abort();
|
||||
courier.fetch();
|
||||
};
|
||||
|
||||
function getFields() {
|
||||
source.getFields(function (err, fields) {
|
||||
$scope.fields = fields;
|
||||
$scope.columns = _.keys(fields);
|
||||
source.source({
|
||||
})
|
||||
.source(!$scope.columns ? null : {
|
||||
include: $scope.columns
|
||||
});
|
||||
|
||||
if ($scope.sort) {
|
||||
var sort = {};
|
||||
sort[$scope.sort.name] = 'asc';
|
||||
source.sort(sort);
|
||||
}
|
||||
|
||||
if ($scope.index !== source.get('index')) {
|
||||
// set the index on the data source
|
||||
source.index($scope.index);
|
||||
// clear the columns and fields, then refetch when we so a search
|
||||
$scope.columns = $scope.fields = null;
|
||||
}
|
||||
|
||||
// fetch just this datasource
|
||||
source.fetch();
|
||||
};
|
||||
|
||||
var activeGetFields;
|
||||
function getFields() {
|
||||
var defer = $q.defer();
|
||||
|
||||
if (!source.get('index')) {
|
||||
// Without an index there is nothing to do here.
|
||||
defer.resolve();
|
||||
return defer.promise;
|
||||
}
|
||||
|
||||
if (activeGetFields) {
|
||||
activeGetFields.then(function () {
|
||||
defer.resolve();
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var currentState = _.transform($scope.fields || [], function (current, field) {
|
||||
current[field.name] = {
|
||||
hidden: field.hidden
|
||||
};
|
||||
}, {});
|
||||
|
||||
source
|
||||
.getFields()
|
||||
.then(function (fields) {
|
||||
$scope.fields = [];
|
||||
$scope.columns = [];
|
||||
|
||||
_(fields)
|
||||
.keys()
|
||||
.sort()
|
||||
.each(function (name) {
|
||||
var field = fields[name];
|
||||
field.name = name;
|
||||
_.defaults(field, currentState[name]);
|
||||
|
||||
if (!field.hidden) $scope.columns.push(name);
|
||||
$scope.fields.push(field);
|
||||
});
|
||||
|
||||
defer.resolve();
|
||||
}, defer.reject);
|
||||
|
||||
return defer.promise.then(function () {
|
||||
activeGetFields = null;
|
||||
});
|
||||
}
|
||||
|
||||
$scope.toggleField = function (name) {
|
||||
var field = _.find($scope.fields, { name: name });
|
||||
|
||||
// toggle the hidden property
|
||||
field.hidden = !field.hidden;
|
||||
|
||||
// collect column names for non-hidden fields and sort
|
||||
$scope.columns = _.transform($scope.fields, function (cols, field) {
|
||||
if (!field.hidden) cols.push(field.name);
|
||||
}, []).sort();
|
||||
|
||||
// if we are just removing a field, no reason to refetch
|
||||
if (!field.hidden) {
|
||||
$scope.fetch();
|
||||
}
|
||||
};
|
||||
|
||||
$scope.refreshFieldList = function () {
|
||||
source.clearFieldCache(function () {
|
||||
getFields(function () {
|
||||
$scope.fetch();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.$emit('application.load');
|
||||
});
|
||||
});
|
|
@ -9,15 +9,11 @@ define(function (require) {
|
|||
angular
|
||||
.module('kibana/controllers')
|
||||
.controller('kibana', function ($scope, courier, configFile) {
|
||||
setTimeout(function () {
|
||||
courier.start();
|
||||
}, 15);
|
||||
|
||||
$scope.apps = configFile.apps;
|
||||
$scope.activeApp = '';
|
||||
|
||||
$scope.$on('$routeChangeSuccess', function () {
|
||||
if (courier.running()) courier.fetch();
|
||||
$scope.$on('application.load', function () {
|
||||
courier.start();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -14,12 +14,6 @@ define(function (require) {
|
|||
* <kbn-table results="queryResult"></kbn-table>
|
||||
* ```
|
||||
*/
|
||||
|
||||
var defaults = {
|
||||
columns: [],
|
||||
rows: []
|
||||
};
|
||||
|
||||
module.directive('kbnTable', function () {
|
||||
return {
|
||||
restrict: 'E',
|
||||
|
@ -28,23 +22,28 @@ define(function (require) {
|
|||
columns: '=',
|
||||
rows: '='
|
||||
},
|
||||
controller: function ($scope) {
|
||||
_.defaults($scope, defaults);
|
||||
link: function (scope, element, attrs) {
|
||||
scope.$watch('rows', render);
|
||||
scope.$watch('columns', render);
|
||||
|
||||
$scope.makeRowHtml = function (row) {
|
||||
var html = '<tr>';
|
||||
_.each($scope.columns, function (col) {
|
||||
html += '<td>';
|
||||
if (row[col] !== void 0) {
|
||||
html += row[col];
|
||||
} else {
|
||||
html += row._source[col];
|
||||
}
|
||||
html += '</td>';
|
||||
function render() {
|
||||
var $body = element.find('tbody').empty();
|
||||
|
||||
if (!scope.rows || scope.rows.length === 0) return;
|
||||
if (!scope.columns || scope.columns.length === 0) return;
|
||||
|
||||
_.each(scope.rows, function (row) {
|
||||
var tr = document.createElement('tr');
|
||||
|
||||
_.each(scope.columns, function (name) {
|
||||
var td = document.createElement('td');
|
||||
td.innerText = row._source[name] || row[name] || '';
|
||||
tr.appendChild(td);
|
||||
});
|
||||
|
||||
$body.append(tr);
|
||||
});
|
||||
html += '</tr>';
|
||||
return html;
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -29,8 +29,9 @@ define(function (require) {
|
|||
return 'app/' + app.id;
|
||||
}));
|
||||
|
||||
// create empty modules for all of the kibana and app modules
|
||||
requiredAgularModules.forEach(function (name) {
|
||||
if (name.indexOf('kibana/') === 0) angular.module(name, []);
|
||||
if (/^(kibana|app)\//.test(name)) angular.module(name, []);
|
||||
});
|
||||
|
||||
kibana.requires = requiredAgularModules;
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
<table class="table">
|
||||
<thead>
|
||||
<th ng-repeat="col in columns">{{col}}</th>
|
||||
<th ng-repeat="name in columns">{{name}}</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="row in rows">
|
||||
<td ng-repeat="col in columns">
|
||||
{{row._source[col] || row[col]}}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody></tbody>
|
||||
</table>
|
|
@ -1,6 +1,7 @@
|
|||
define(function (require) {
|
||||
var angular = require('angular');
|
||||
var Courier = require('courier/courier');
|
||||
var DataSource = require('courier/data_source/data_source');
|
||||
var DocSource = require('courier/data_source/doc');
|
||||
var errors = require('courier/errors');
|
||||
var configFile = require('../../config');
|
||||
|
@ -13,6 +14,10 @@ define(function (require) {
|
|||
.service('courier', function (es, $rootScope, promises) {
|
||||
if (courier) return courier;
|
||||
|
||||
promises.playNice(DataSource.prototype, [
|
||||
'getFields'
|
||||
]);
|
||||
|
||||
promises.playNice(DocSource.prototype, [
|
||||
'doUpdate',
|
||||
'doIndex'
|
||||
|
|
43
src/kibana/services/saved_searches.js
Normal file
43
src/kibana/services/saved_searches.js
Normal file
|
@ -0,0 +1,43 @@
|
|||
define(function (require) {
|
||||
|
||||
var module = require('angular').module('kibana/services');
|
||||
|
||||
module.service('savedSearches', function (courier, configFile, $q) {
|
||||
this.get = function (id) {
|
||||
var docLoaded = id ? false : true;
|
||||
var doc = courier.createSource('doc')
|
||||
.index(configFile.kibanaIndex)
|
||||
.type('saved_searches')
|
||||
.id(id)
|
||||
.on('results', function (doc) {
|
||||
search.set(doc._source.state);
|
||||
|
||||
// set the
|
||||
id = doc._id;
|
||||
if (!docLoaded) {
|
||||
docLoaded = true;
|
||||
search.enable();
|
||||
}
|
||||
});
|
||||
|
||||
var search = courier.createSource('search');
|
||||
search.save = function () {
|
||||
var defer = $q.defer();
|
||||
|
||||
doc.doIndex({
|
||||
state: search.toJSON()
|
||||
}, function (err, id) {
|
||||
if (err) return defer.reject(err);
|
||||
defer.resolve();
|
||||
});
|
||||
|
||||
return defer.promise;
|
||||
};
|
||||
|
||||
if (!docLoaded) search.disableFetch();
|
||||
return search;
|
||||
};
|
||||
|
||||
this.create = this.get;
|
||||
});
|
||||
});
|
|
@ -1,55 +1,54 @@
|
|||
@bs-less-dir: "../../bower_components/bootstrap/less";
|
||||
|
||||
// Core variables and mixins
|
||||
@import "../../bower_components/bootstrap/less/variables.less";
|
||||
|
||||
@icon-font-path: "../../bower_components/bootstrap/fonts/";
|
||||
|
||||
@import "../../bower_components/bootstrap/less/mixins.less";
|
||||
@import "@{bs-less-dir}/variables.less";
|
||||
@import "@{bs-less-dir}/mixins.less";
|
||||
|
||||
// Reset
|
||||
@import "../../bower_components/bootstrap/less/normalize.less";
|
||||
@import "../../bower_components/bootstrap/less/print.less";
|
||||
@import "@{bs-less-dir}/normalize.less";
|
||||
@import "@{bs-less-dir}/print.less";
|
||||
|
||||
// Core CSS
|
||||
@import "../../bower_components/bootstrap/less/scaffolding.less";
|
||||
@import "../../bower_components/bootstrap/less/type.less";
|
||||
@import "../../bower_components/bootstrap/less/code.less";
|
||||
@import "../../bower_components/bootstrap/less/grid.less";
|
||||
@import "../../bower_components/bootstrap/less/tables.less";
|
||||
@import "../../bower_components/bootstrap/less/forms.less";
|
||||
@import "../../bower_components/bootstrap/less/buttons.less";
|
||||
@import "@{bs-less-dir}/scaffolding.less";
|
||||
@import "@{bs-less-dir}/type.less";
|
||||
@import "@{bs-less-dir}/code.less";
|
||||
@import "@{bs-less-dir}/grid.less";
|
||||
@import "@{bs-less-dir}/tables.less";
|
||||
@import "@{bs-less-dir}/forms.less";
|
||||
@import "@{bs-less-dir}/buttons.less";
|
||||
|
||||
// Components
|
||||
@import "../../bower_components/bootstrap/less/component-animations.less";
|
||||
@import "../../bower_components/bootstrap/less/glyphicons.less";
|
||||
@import "../../bower_components/bootstrap/less/dropdowns.less";
|
||||
@import "../../bower_components/bootstrap/less/button-groups.less";
|
||||
@import "../../bower_components/bootstrap/less/input-groups.less";
|
||||
@import "../../bower_components/bootstrap/less/navs.less";
|
||||
@import "../../bower_components/bootstrap/less/navbar.less";
|
||||
@import "../../bower_components/bootstrap/less/breadcrumbs.less";
|
||||
@import "../../bower_components/bootstrap/less/pagination.less";
|
||||
@import "../../bower_components/bootstrap/less/pager.less";
|
||||
@import "../../bower_components/bootstrap/less/labels.less";
|
||||
@import "../../bower_components/bootstrap/less/badges.less";
|
||||
@import "../../bower_components/bootstrap/less/jumbotron.less";
|
||||
@import "../../bower_components/bootstrap/less/thumbnails.less";
|
||||
@import "../../bower_components/bootstrap/less/alerts.less";
|
||||
@import "../../bower_components/bootstrap/less/progress-bars.less";
|
||||
@import "../../bower_components/bootstrap/less/media.less";
|
||||
@import "../../bower_components/bootstrap/less/list-group.less";
|
||||
@import "../../bower_components/bootstrap/less/panels.less";
|
||||
@import "../../bower_components/bootstrap/less/wells.less";
|
||||
@import "../../bower_components/bootstrap/less/close.less";
|
||||
@import "@{bs-less-dir}/component-animations.less";
|
||||
// @import "@{bs-less-dir}/glyphicons.less";
|
||||
@import "@{bs-less-dir}/dropdowns.less";
|
||||
@import "@{bs-less-dir}/button-groups.less";
|
||||
@import "@{bs-less-dir}/input-groups.less";
|
||||
@import "@{bs-less-dir}/navs.less";
|
||||
@import "@{bs-less-dir}/navbar.less";
|
||||
@import "@{bs-less-dir}/breadcrumbs.less";
|
||||
@import "@{bs-less-dir}/pagination.less";
|
||||
@import "@{bs-less-dir}/pager.less";
|
||||
@import "@{bs-less-dir}/labels.less";
|
||||
@import "@{bs-less-dir}/badges.less";
|
||||
@import "@{bs-less-dir}/jumbotron.less";
|
||||
@import "@{bs-less-dir}/thumbnails.less";
|
||||
@import "@{bs-less-dir}/alerts.less";
|
||||
@import "@{bs-less-dir}/progress-bars.less";
|
||||
@import "@{bs-less-dir}/media.less";
|
||||
@import "@{bs-less-dir}/list-group.less";
|
||||
@import "@{bs-less-dir}/panels.less";
|
||||
@import "@{bs-less-dir}/wells.less";
|
||||
@import "@{bs-less-dir}/close.less";
|
||||
|
||||
// Components w/ JavaScript
|
||||
@import "../../bower_components/bootstrap/less/modals.less";
|
||||
@import "../../bower_components/bootstrap/less/tooltip.less";
|
||||
@import "../../bower_components/bootstrap/less/popovers.less";
|
||||
@import "../../bower_components/bootstrap/less/carousel.less";
|
||||
@import "@{bs-less-dir}/modals.less";
|
||||
@import "@{bs-less-dir}/tooltip.less";
|
||||
@import "@{bs-less-dir}/popovers.less";
|
||||
@import "@{bs-less-dir}/carousel.less";
|
||||
|
||||
// Utility classes
|
||||
@import "../../bower_components/bootstrap/less/utilities.less";
|
||||
@import "../../bower_components/bootstrap/less/responsive-utilities.less";
|
||||
@import "@{bs-less-dir}/utilities.less";
|
||||
@import "@{bs-less-dir}/responsive-utilities.less";
|
||||
|
||||
// automatically include the theme file
|
||||
@import "../../bower_components/bootstrap/less/theme.less";
|
||||
@import "@{bs-less-dir}/theme.less";
|
File diff suppressed because it is too large
Load diff
|
@ -1,5 +1,10 @@
|
|||
@import "../../bower_components/font-awesome/less/font-awesome.less";
|
||||
|
||||
// custom bootstrap build
|
||||
@import "./_bootstrap.less";
|
||||
|
||||
@fa-font-path: "../../bower_components/font-awesome/fonts";
|
||||
|
||||
body {
|
||||
margin: 0px;
|
||||
}
|
||||
|
@ -30,4 +35,8 @@ body div.content {
|
|||
|
||||
.navbar {
|
||||
margin-bottom: 0px!important;
|
||||
}
|
||||
|
||||
[ng-click] {
|
||||
cursor: pointer;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue