Each API index page now displays data from an `api-list.json` file found locally to that page. This lets us have different API lists for TS, JS and Dart.
66 lines
2.8 KiB
JavaScript
66 lines
2.8 KiB
JavaScript
angularIO.directive('apiList', function () {
|
|
return {
|
|
restrict: 'E',
|
|
template:
|
|
'<div ng-cloak="ng-cloak" class="banner">' +
|
|
' <dl class="api-key">' +
|
|
' <dt>Display:</dt>' +
|
|
' <dd ng-repeat="apiType in $ctrl.apiTypes" ng-class="{ active: $ctrl.apiType === apiType }" ng-click="$ctrl.setType(apiType)" class="{{apiType.cssClass}}">{{apiType.title}}</dd>' +
|
|
' </dl>' +
|
|
' <input placeholder="Filter" ng-model="$ctrl.apiFilter" class="api-filter">' +
|
|
'</div>' +
|
|
'<article class="l-content-small grid-fluid docs-content">' +
|
|
' <div ng-repeat="section in $ctrl.filteredSections" ng-cloak="ng-cloak">' +
|
|
' <h3>{{ section.title }}</h3>' +
|
|
' <ul class="api-list">' +
|
|
' <li ng-repeat="item in section.items" class="api-item">' +
|
|
' <a ng-href="{{ item.path }}"><span class="symbol {{ item.docType }}"></span>{{ item.title }}</a>' +
|
|
' </li>' +
|
|
' </ul>' +
|
|
' </div>' +
|
|
'</article>',
|
|
controllerAs: '$ctrl',
|
|
controller: function($scope, $attrs, $http) {
|
|
var $ctrl = this;
|
|
|
|
$ctrl.apiType = null;
|
|
$ctrl.apiFilter = '';
|
|
$ctrl.filteredSections = [];
|
|
|
|
$ctrl.setType = function (type) {
|
|
if (type === $ctrl.apiType) $ctrl.apiType = null;
|
|
else $ctrl.apiType = type;
|
|
};
|
|
|
|
$http.get($attrs.src).then(function(response) {
|
|
$ctrl.sections = response.data;
|
|
});
|
|
|
|
$ctrl.apiTypes = [
|
|
{ cssClass: 'directive', title: 'Directive', matches: ['directive'] },
|
|
{ cssClass: 'class', title: 'Class', matches: ['class'] },
|
|
{ cssClass: 'interface', title: 'Interface', matches: ['interface'] },
|
|
{ cssClass: 'function', title: 'function', matches: ['function'] },
|
|
{ cssClass: 'const', title: 'Const or Enum', matches: ['const', 'enum'] },
|
|
{ cssClass: 'var', title: 'Variable', matches: ['var', 'let'] }
|
|
];
|
|
|
|
$scope.$watchGroup(
|
|
[function() { return $ctrl.apiFilter}, function() { return $ctrl.apiType; }, function() { return $ctrl.sections; }],
|
|
function(filter, type, sections) {
|
|
$ctrl.filteredSections.length = 0;
|
|
angular.forEach($ctrl.sections, function(section, title) {
|
|
var filteredItems = section.filter(function(item) {
|
|
var matchesDocType = !$ctrl.apiType || $ctrl.apiType.matches.indexOf(item.docType) !== -1;
|
|
var matchesTitle = $ctrl.apiFilter == '' || item.title.toLowerCase().indexOf($ctrl.apiFilter.toLowerCase()) !== -1;
|
|
return matchesDocType && matchesTitle;
|
|
});
|
|
if (filteredItems.length) {
|
|
$ctrl.filteredSections.push({ title: title, items: filteredItems });
|
|
}
|
|
});
|
|
}
|
|
);
|
|
}
|
|
};
|
|
}); |