.eg-grid-scroll > .row { margin-left: 0; margin-right: 0; }
.eg-grid-header-row { font-weight: bold; }
.eg-grid div.row {border-bottom: 2px solid #ddd}
+ .eg-grid-header-cell, .eg-grid-content-cell { overflow: hidden }
.eg-grid-content-row:nth-child(even) {background-color: rgb(248, 248, 248);}
- .eg-grid-content-column { overflow: hidden }
+
+
+ /* yanked from Bootstrap docs CSS */
+ .eg-grid-content-row.selected {
+ border: 1px solid rgba(86,61,124,.2);
+ background-color: rgba(86,61,124,.15);
+ color: rgb(51, 51, 51);
+ }
</style>
<div class="container-fluid eg-grid" ng-class="{'eg-grid-scroll' : isScroll}">
<!-- column header -->
<div class="row eg-grid-header-row">
<div class="col-md-1 eg-grid-header-cell">
+ <div class="col-md-6">[% l('#') %]</div>
<div class="col-md-6">
- <input type='checkbox'/>
+ <a href='javascript:;'
+ ng-click="dataList.toggleSelectAll()">✓</a>
</div>
- <div class="col-md-6">#</div>
</div>
- <div ng-repeat="columnGroup in dataList.groupedColumns">
- <div class="col-md-1 eg-grid-header-cell">
- <div ng-repeat="column in columnGroup">
- <div class="eg-grid-content-column"
- ng-class="{'col-md-6' : columnGroup.length > 1}">
- <a href="javascript:;"
- ng-click="sortOn(column.name)">{{column.label}}</a>
- </div>
- </div>
+ <div ng-repeat="column in dataList.allColumns">
+ <div ng-show="dataList.displayColumns[column.name]"
+ class="col-md-1 eg-grid-header-cell">
+ <a href="javascript:;"
+ ng-click="sortOn(column.name)">{{column.label}}</a>
</div>
</div>
</div>
<!-- data rows -->
<div class="row eg-grid-content-row"
- ng-repeat="item in dataList.items">
+ ng-repeat="item in dataList.items"
+ ng-click="applyRowSelection($event, item)"
+ ng-class="{'selected' : itemIsSelected(item)}">
+
<div class="col-md-1 eg-grid-content-cell">
+ <div class="col-md-6">{{$index + 1 + dataList.pageOffset}}</div>
<div class="col-md-6">
- <input type='checkbox'/>
+ <span ng-if="itemIsSelected(item)">✓</span>
</div>
- <div class="col-md-6">{{$index + 1}}</div>
</div>
- <div ng-repeat="columnGroup in dataList.groupedColumns">
- <div class="col-md-1 eg-grid-header-cell">
- <div ng-repeat="column in columnGroup">
- <div class="eg-grid-content-column"
- ng-class="{'col-md-6' : columnGroup.length > 1}">
- {{dataList.fieldValue(item, column.name) | egGridvalueFilter:column}}
- </div>
- </div>
- </div>
- </div>
-
- <!--
- <div class="col-md-1 eg-grid-content-cell"
- ng-repeat="column in dataList.allColumns"
- ng-show="dataList.displayColumns[column.name]">
- <div ng-class="{'col-md-6' : column.shared}">
- {{dataList.fieldValue(item, column.name) | egGridvalueFilter:column}}
+ <div ng-repeat="column in dataList.allColumns">
+ <div class="col-md-1 eg-grid-content-cell"
+ ng-show="dataList.displayColumns[column.name]">
+ {{dataList.fieldValue(item, column.name) | egGridvalueFilter:column}}
</div>
</div>
- -->
</div>
</div>
// if true, use the scroll CSS to force a vertical height
// and scroll bar
- isScroll : '='
+ isScroll : '=',
+
+ // field whose value is unique and may be used for item
+ // reference / lookup. This will usually be someting like
+ // "id". This is not needed when using autoFields, since
+ // we can determine the primary key directly from the IDL.
+ idField : '@'
},
link : function(scope, element, attrs) {
controller : function($scope, $timeout, egIDL, egAuth, egNet, egList) { // TODO: reqs list
var self = this;
- // if we stick w/ Bootstrap grids for display, we're
- // limited to 12 visible columns at a time.
- //this.maxFieldCount = 12;
+ // If we stick w/ Bootstrap grids for display, we're
+ // limited to (currently) 12 visible columns at a time.
+ // One of those is occupied by the shared ow count /
+ // selector column
this.maxFieldCount = 11;
$scope.dataList = egList.create();
*/
this.addColumn = function(fieldSpec) {
- /*
if (Object.keys($scope.dataList.displayColumns).length
>= self.maxFieldCount) {
fieldSpec.display = false;
}
- */
var field = {
name : fieldSpec.name,
this.compileAutoFields = function() {
if ($scope.dataList.allColumns.length) return;
+ $scope.idField = $scope.idField ||
+ egIDL.classes[$scope.idlClass].pkey;
+
angular.forEach(
egIDL.classes[$scope.idlClass].fields.sort(
function(a, b) { return a.name < b.name ? -1 : 1 }),
return new_field;
}
- // EXPERIMENT
- this.applyColumnLayout = function() {
- var cols = $scope.dataList.allColumns;
- var overflow = 2 * (cols.length - this.maxFieldCount);
- var groupedColumns = [];
-
- current_bunch = [];
- angular.forEach(cols, function(col, idx) {
- current_bunch.push(col);
- if (idx < overflow - 1 || current_bunch.length > 1) {
- groupedColumns.push(current_bunch);
- current_bunch = [];
- }
- });
-
- $scope.dataList.groupedColumns = groupedColumns;
- }
-
/**
* For stock grids, makes a flattened_search call to retrieve
* the requested values.
*/
$scope.fetchData = function() {
$scope.dataList.resetPageData();
- self.applyColumnLayout();
if (self.dataFetcher)
return self.dataFetcher();
if ($scope.autoFields)
self.compileAutoFields();
+ $scope.dataList.indexField = $scope.idField;
+
var queryFields = {}
angular.forEach($scope.dataList.allColumns, function(field) {
if ($scope.dataList.displayColumns[field.name])
$scope.dataList.items.push(item);
});
}
+
+ $scope.applyRowSelection = function($event, item) {
+ var index = $scope.dataList.indexValue(item);
+ if ($event.ctrlKey || $event.metaKey /* mac command */) {
+ $scope.dataList.toggleOneSelection(index);
+ } else {
+ $scope.dataList.selectOne(index);
+ }
+ }
+
+ $scope.itemIsSelected = function(item) {
+ return $scope.dataList.selected[
+ $scope.dataList.indexValue(item)
+ ];
+ }
}
};
})