Skip to content

Commit 615e9c4

Browse files
committed
Improve plugin page
The displayed version is always the most recent, and expanded views give a link to the plugin website if it exists.
1 parent f0ab3d3 commit 615e9c4

1 file changed

Lines changed: 110 additions & 53 deletions

File tree

micro_files/plugin-search.js

Lines changed: 110 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,64 +3,111 @@
33
var searchResults = [];
44
var pluginData;
55

6+
function versionCompare(v1, v2, options) {
7+
var lexicographical = options && options.lexicographical,
8+
zeroExtend = options && options.zeroExtend,
9+
v1parts = v1.split('.'),
10+
v2parts = v2.split('.');
11+
12+
function isValidPart(x) {
13+
return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x);
14+
}
15+
16+
if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
17+
return NaN;
18+
}
19+
20+
if (zeroExtend) {
21+
while (v1parts.length < v2parts.length) v1parts.push("0");
22+
while (v2parts.length < v1parts.length) v2parts.push("0");
23+
}
24+
25+
if (!lexicographical) {
26+
v1parts = v1parts.map(Number);
27+
v2parts = v2parts.map(Number);
28+
}
29+
30+
for (var i = 0; i < v1parts.length; ++i) {
31+
if (v2parts.length == i) {
32+
return 1;
33+
}
34+
35+
if (v1parts[i] == v2parts[i]) {
36+
continue;
37+
}
38+
else if (v1parts[i] > v2parts[i]) {
39+
return 1;
40+
}
41+
else {
42+
return -1;
43+
}
44+
}
45+
46+
if (v1parts.length != v2parts.length) {
47+
return -1;
48+
}
49+
50+
return 0;
51+
}
52+
653
function fetchData() {
7-
fetch('https://raw.githubusercontent.com/micro-editor/plugin-channel/master/channel.json').then(function (response) {
8-
return response.text().then(function (text) {
9-
// Remove Comments
10-
var rawdata = text.replace(/[/s][\/]\B.+/g, "");
11-
console.log(rawdata);
12-
// Parse Data
13-
var channel = JSON.parse(rawdata);
14-
pluginData = [];
15-
channel.forEach(function (item) {
16-
fetch(item).then(function (response) {
17-
return response.json().then(function (json) {
18-
pluginData.push(json[0]);
19-
console.log(json[0]);
20-
search(true);
21-
});
22-
});
23-
});
24-
});
54+
fetch('https://raw.githubusercontent.com/micro-editor/plugin-channel/master/channel.json').then(function (response) {
55+
return response.text().then(function (text) {
56+
// Remove Comments
57+
var rawdata = text.replace(/[/s][\/]\B.+/g, "");
58+
console.log(rawdata);
59+
// Parse Data
60+
var channel = JSON.parse(rawdata);
61+
pluginData = [];
62+
channel.forEach(function (item) {
63+
fetch(item).then(function (response) {
64+
return response.json().then(function (json) {
65+
pluginData.push(json[0]);
66+
console.log(json[0]);
67+
search(true);
68+
});
69+
});
70+
});
71+
});
2572
});
2673
}
2774

2875
function search(collapse) {
29-
switch (document.querySelector('input[name="searchby"]:checked').value) {
30-
case 'Name':
31-
console.log('Search by Name');
32-
searchResults = pluginData.filter(function (item) {
33-
return item.Name.includes(document.getElementById('keyword').value);
34-
});
35-
console.log(searchResults);
36-
showResults(searchResults, collapse);
37-
break;
38-
case 'Description':
39-
console.log('Search by Description');
40-
searchResults = pluginData.filter(function (item) {
41-
return item.Description.includes(document.getElementById('keyword').value);
42-
});
43-
console.log(searchResults);
44-
showResults(searchResults, collapse);
45-
break;
46-
case 'Tags':
47-
console.log('Search by Tags');
48-
searchResults = pluginData.filter(function (item) {
49-
return item.Tags.includes(document.getElementById('keyword').value);
50-
});
51-
console.log(searchResults);
52-
showResults(searchResults, collapse);
53-
break;
54-
}
76+
switch (document.querySelector('input[name="searchby"]:checked').value) {
77+
case 'Name':
78+
console.log('Search by Name');
79+
searchResults = pluginData.filter(function (item) {
80+
return item.Name.includes(document.getElementById('keyword').value);
81+
});
82+
console.log(searchResults);
83+
showResults(searchResults, collapse);
84+
break;
85+
case 'Description':
86+
console.log('Search by Description');
87+
searchResults = pluginData.filter(function (item) {
88+
return item.Description.includes(document.getElementById('keyword').value);
89+
});
90+
console.log(searchResults);
91+
showResults(searchResults, collapse);
92+
break;
93+
case 'Tags':
94+
console.log('Search by Tags');
95+
searchResults = pluginData.filter(function (item) {
96+
return item.Tags.includes(document.getElementById('keyword').value);
97+
});
98+
console.log(searchResults);
99+
showResults(searchResults, collapse);
100+
break;
101+
}
55102
}
56103

57104
function showResults(results, collapsed) {
58-
var table = document.getElementById('results');
59-
table.innerHTML = '';
60-
var collapseStr = "panel-collapse collapse";
61-
if (!collapsed) {
62-
collapseStr += " in";
63-
}
105+
var table = document.getElementById('results');
106+
table.innerHTML = '';
107+
var collapseStr = "panel-collapse collapse";
108+
if (!collapsed) {
109+
collapseStr += " in";
110+
}
64111

65112
function separate_with_commas(tar_array) {
66113
let results = "";
@@ -74,7 +121,7 @@ function showResults(results, collapsed) {
74121
return results;
75122
}
76123

77-
results.forEach(function (item) {
124+
results.forEach(function (item) {
78125
// The displayed tag(s)
79126
let display_item_tag = separate_with_commas(item.Tags);
80127
// The displayed version(s)
@@ -83,6 +130,7 @@ function showResults(results, collapsed) {
83130
let display_item_require = '';
84131
let current_requires = [];
85132
let requires_len = 0;
133+
let latestVers = "0.0.0"
86134

87135
// Handle multiple versions in repo.json
88136
for (let i = 0; i < item.Versions.length; i++) {
@@ -114,6 +162,10 @@ function showResults(results, collapsed) {
114162
// Linebreak so we display them below eachother
115163
display_item_require += '\n';
116164
}
165+
166+
if (versionCompare(latestVers, item.Versions[i].Version) < 0) {
167+
latestVers = item.Versions[i].Version;
168+
}
117169
}
118170

119171
// If there's only a single version, don't show the "All versions: " thing
@@ -124,6 +176,11 @@ function showResults(results, collapsed) {
124176
display_item_allversions += '</p>';
125177
}
126178

127-
table.innerHTML += '<div class="panel panel-default">\n <div class="panel-heading" role="tab" id="h-' + item.Name + '">\n <h4 class="panel-title">\n <a role="button" data-toggle="collapse" data-parent="#results"\n href="#c-' + item.Name + '" aria-controls="c-' + item.Name + '">\n ' + item.Name + ' ' + item.Versions[item.Versions.length - 1].Version + '\n </a>\n </h4>\n </div>\n <div id="c-' + item.Name + '" class="' + collapseStr + '" role="tabpanel" aria-labelledby="h-' + item.Name + '">\n <div class="panel-body">\n <p>' + item.Description + '</p>\n <p><span class="glyphicon glyphicon-tags" aria-hidden="true"></span> ' + display_item_tag + display_item_allversions + display_item_require + '</p>\n <p>To install this plugin, open micro from your CLI,\n press [Crtl + E] then run the command line below.\n Once you are done, restart micro.</p>\n <div class="well">&gt; plugin install ' + item.Name + '</div>\n </div>\n </div>\n </div>';
128-
});
179+
var website = "";
180+
if (item.Website != undefined) {
181+
website = '<a href="' + item.Website + '">' + item.Website + '</a><br>';
182+
}
183+
184+
table.innerHTML += '<div class="panel panel-default">\n <div class="panel-heading" role="tab" id="h-' + item.Name + '">\n <h4 class="panel-title">\n <a role="button" data-toggle="collapse" data-parent="#results"\n href="#c-' + item.Name + '" aria-controls="c-' + item.Name + '">\n ' + item.Name + ' ' + latestVers + '\n </a>\n </h4>\n </div>\n <div id="c-' + item.Name + '" class="' + collapseStr + '" role="tabpanel" aria-labelledby="h-' + item.Name + '">\n <div class="panel-body">\n <p>' + item.Description + '</p>\n' + website + '\n <p><span class="glyphicon glyphicon-tags" aria-hidden="true"></span> ' + display_item_tag + display_item_allversions + display_item_require + '</p>\n <p>To install this plugin, run the following command from your CLI</p>\n <div class="well"$ micro -plugin install ' + item.Name + '</div>\n </div>\n </div>\n </div>';
185+
});
129186
}

0 commit comments

Comments
 (0)