forked from angular/angular.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi-list.js
95 lines (86 loc) · 4.02 KB
/
api-list.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
angularIO.directive('apiList', function () {
var API_FILTER_KEY = 'apiFilter';
var API_TYPE_KEY = 'apiType';
return {
restrict: 'E',
template:
'<div ng-cloak="ng-cloak" class="banner">' +
' <dl class="api-key">' +
' <dt>Display:</dt>' +
' <dd ng-class="{ active: !$ctrl.apiType }" ng-click="$ctrl.apiType = null">All</dd>' +
' <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, $location) {
var $ctrl = this;
$ctrl.apiTypes = [
{ cssClass: 'directive', title: 'Directive', matches: ['directive'] },
{ cssClass: 'decorator', title: 'Decorator', matches: ['decorator'] },
{ 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'] }
];
$ctrl.apiFilter = getApiFilterFromLocation();
$ctrl.apiType = getApiTypeFromLocation();
$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;
});
$scope.$watchGroup(
[function() { return $ctrl.apiFilter}, function() { return $ctrl.apiType; }, function() { return $ctrl.sections; }],
function() {
var apiFilter = ($ctrl.apiFilter || '').toLowerCase();
$location.search(API_FILTER_KEY, apiFilter || null);
$location.search(API_TYPE_KEY, $ctrl.apiType && $ctrl.apiType.title || null);
$ctrl.filteredSections.length = 0;
angular.forEach($ctrl.sections, function(section, title) {
var matchesModule = $ctrl.apiFilter === '' || $ctrl.apiFilter === null || title.toLowerCase().indexOf($ctrl.apiFilter.toLowerCase()) !== -1;
var filteredItems = section.filter(function(item) {
var matchesDocType = !$ctrl.apiType || $ctrl.apiType.matches.indexOf(item.docType) !== -1;
var matchesTitle = !apiFilter || item.title.toLowerCase().indexOf(apiFilter) !== -1;
return matchesDocType && (matchesTitle || matchesModule);
});
if (filteredItems.length) {
$ctrl.filteredSections.push({ title: title, items: filteredItems });
}
});
}
);
function getApiFilterFromLocation() {
return $location.search()[API_FILTER_KEY] || null;
}
function getApiTypeFromLocation() {
var apiFilter = $location.search()[API_TYPE_KEY];
if (!apiFilter) {
return null;
} else if (!$ctrl.apiFilter || $ctrl.apiFilter.title != apiFilter) {
for(var i = 0, ii = $ctrl.apiTypes.length; i < ii; i++) {
if ($ctrl.apiTypes[i].title == apiFilter) {
return $ctrl.apiTypes[i];
}
}
}
// If we get here then the apiType query didn't match any apiTypes
$location.search(API_TYPE_KEY, null);
}
}
};
});