Skip to content

Commit 78c0ec4

Browse files
feat: add dev dashboard (#140)
1 parent 52088a6 commit 78c0ec4

File tree

3 files changed

+308
-1
lines changed

3 files changed

+308
-1
lines changed

dist/dev.html

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>LizardByte | Developer Dashboard</title>
5+
<meta charset="utf-8" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
7+
<meta name="description" content="Developer Dashboard for LizardByte projects" />
8+
<meta name="author" content="" />
9+
10+
<!-- Open Graph/Twitter metadata -->
11+
<meta property="og:site_name" content="LizardByte" />
12+
<meta property="og:title" content="LizardByte | Developer Dashboard" />
13+
<meta property="og:type" content="website" />
14+
<meta property="og:image" content="https://app.lizardbyte.dev/assets/images/og-image.png" />
15+
<meta property="og:url" content="https://app.lizardbyte.dev/dev" />
16+
<meta property="og:description" content="Overview of LizardByte's GitHub projects." />
17+
<meta property="og:locale" content="en-US" />
18+
<meta property="twitter:card" content="summary_large_image" />
19+
<meta property="og:twitter_site" content="@lizardbytedev" />
20+
<meta property="og:twitter_site:id" content="@lizardbytedev" />
21+
<meta property="og:twitter_creator" content="@lizardbytedev" />
22+
<meta property="og:twitter_creator:id" content="@lizardbytedev" />
23+
<meta property="twitter:image" content="https://app.lizardbyte.dev/assets/images/og-image.png" />
24+
25+
<!-- Favicon-->
26+
<link rel="icon" type="image/x-icon" href="assets/images/favicon.ico" />
27+
<!-- FontAwesome-->
28+
<link href="node_modules/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet" />
29+
<!-- Bootstrap theme-->
30+
<link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
31+
<!-- Custom css-->
32+
<link href="css/custom.css" rel="stylesheet" />
33+
<!-- Custom logos-->
34+
<link href="css/logos.css" rel="stylesheet" />
35+
36+
<script src="node_modules/jquery/dist/jquery.min.js"></script>
37+
<script src="node_modules/@popperjs/core/dist/umd/popper.min.js"></script>
38+
39+
<!-- Crowdin widget -->
40+
<script src="js/crowdin.js"></script>
41+
<script src="js/crowdin_web_widget.js"></script>
42+
</head>
43+
<body class="d-flex flex-column h-100 bg-dark-gray">
44+
<main class="flex-shrink-0">
45+
<!-- Navigation-->
46+
<nav id="nav-container"></nav>
47+
48+
<!-- Projects section-->
49+
<section class="py-5 offset-anchor" id="Projects">
50+
<div class="container my-5">
51+
<div class="row gx-5 justify-content-center">
52+
<div class="col-lg-8 col-xl-6">
53+
<div class="text-center text-white">
54+
<h2 class="fw-bolder pb-4">Projects</h2>
55+
</div>
56+
</div>
57+
</div>
58+
<div class="row gx-5" id="dashboard-container"></div>
59+
</div>
60+
</section>
61+
62+
</main>
63+
<!-- Footer-->
64+
<footer class="bg-dark py-4 mt-auto" id="footer-container"></footer>
65+
<!-- Bootstrap core JS-->
66+
<script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
67+
68+
<!-- Get navbar -->
69+
<script src="js/navbar.js"></script>
70+
<!-- Get footer -->
71+
<script src="js/footer.js"></script>
72+
<!-- Discord WidgetBot -->
73+
<script src="js/discord.js"></script>
74+
<!-- Get project details -->
75+
<script src="js/dev_dashboard.js"></script>
76+
</body>
77+
</html>

dist/js/dev_dashboard.js

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
// projects section script
2+
3+
// load external scripts
4+
$.getScript('https://app.lizardbyte.dev/js/ranking_sorter.js')
5+
6+
7+
// get project container
8+
container = document.getElementById("dashboard-container")
9+
let org_name = "LizardByte"
10+
let base_url = `https://app.${org_name.toLowerCase()}.dev`
11+
let cache_repo = "uno"
12+
13+
14+
$(document).ready(function(){
15+
// Set cache = false for all jquery ajax requests.
16+
$.ajaxSetup({
17+
cache: false,
18+
});
19+
});
20+
21+
22+
// create project cards
23+
$(document).ready(function(){
24+
// get readthedocs projects
25+
let readthedocs = []
26+
$.ajax({
27+
url: `${base_url}/${cache_repo}/readthedocs/projects.json`,
28+
type: "GET",
29+
dataType: "json",
30+
success: function (data) {
31+
for (let item in data) {
32+
readthedocs.push(data[item])
33+
}
34+
}
35+
});
36+
37+
$.ajax({
38+
url: `${base_url}/${cache_repo}/github/repos.json`,
39+
type: "GET",
40+
dataType:"json",
41+
success: function (result) {
42+
let sorted = result
43+
44+
// create a table of all repos
45+
let table = document.createElement("table")
46+
table.className = "table table-dark table-sm table-striped table-hover table-bordered table-responsive"
47+
table.id = "repo-table"
48+
container.appendChild(table)
49+
50+
// create table head
51+
let table_head = document.createElement("thead")
52+
table.appendChild(table_head)
53+
54+
let table_head_row = document.createElement("tr")
55+
table_head.appendChild(table_head_row)
56+
57+
// table body
58+
let table_body = document.createElement("tbody")
59+
table_body.className = "table-group-divider"
60+
table.appendChild(table_body)
61+
62+
let table_columns = [
63+
"Banner",
64+
"Name",
65+
"Description",
66+
"Stars",
67+
"Forks",
68+
"Open Issues & Pulls",
69+
"Master Default",
70+
"Languages",
71+
"License",
72+
"Docs",
73+
"Code Coverage",
74+
"Archived",
75+
"Created",
76+
"Last Updated",
77+
]
78+
79+
for (let column in table_columns) {
80+
let table_head_name = document.createElement("th")
81+
table_head_name.scope = "col"
82+
table_head_name.textContent = table_columns[column]
83+
table_head_row.appendChild(table_head_name)
84+
}
85+
86+
for(let repo in sorted) {
87+
// get language data
88+
let language_data = document.createElement("div")
89+
language_data.className = "align-items-center"
90+
$.ajax({
91+
url: `${base_url}/${cache_repo}/github/languages/${sorted[repo]['name']}.json`,
92+
async: false,
93+
type: "GET",
94+
dataType: "json",
95+
success: function (languages) {
96+
for (let language in languages) {
97+
let language_file = encodeURIComponent(`${language}.svg`)
98+
99+
let language_icon = document.createElement("img")
100+
language_icon.className = "language-logo crowdin-ignore"
101+
language_icon.src = `${base_url}/${cache_repo}/language-icons/${language_file}`
102+
language_icon.alt = language
103+
language_icon.title = language
104+
language_data.append(language_icon)
105+
}
106+
}
107+
})
108+
109+
// code coverage data
110+
let code_coverage = document.createElement("i")
111+
code_coverage.className = "fa-fw fa-solid fa-times-circle text-danger"
112+
let column_code_coverage_class = "table-danger"
113+
$.ajax({
114+
url: `${base_url}/${cache_repo}/codecov/${sorted[repo]['name']}.json`,
115+
async: false,
116+
type: "GET",
117+
dataType: "json",
118+
success: function (coverage) {
119+
// if defined and not null... prevent errors
120+
if (coverage['totals'] !== undefined && coverage['totals'] !== null) {
121+
if (coverage['totals']['coverage'] !== null) {
122+
code_coverage = coverage['totals']['coverage']
123+
if (code_coverage >= 80) {
124+
column_code_coverage_class = "table-success"
125+
} else if (code_coverage >= 40) {
126+
column_code_coverage_class = "table-warning"
127+
}
128+
}
129+
}
130+
}
131+
})
132+
133+
let docs_link = document.createElement("i")
134+
docs_link.className = "fa-fw fa-solid fa-times-circle text-danger"
135+
for (let docs in readthedocs) {
136+
let docs_repo = readthedocs[docs]['repository']['url'];
137+
docs_repo = docs_repo.toLowerCase();
138+
139+
let project_repo = sorted[repo]['clone_url'];
140+
project_repo = project_repo.toLowerCase();
141+
142+
if (docs_repo === project_repo) {
143+
docs_link = document.createElement("a")
144+
docs_link.href = readthedocs[docs]['urls']['documentation']
145+
docs_link.target = "_blank"
146+
147+
let docs_link_image = document.createElement("i")
148+
docs_link_image.className = "fa-fw fa-solid fa-check-circle text-success"
149+
docs_link.prepend(docs_link_image)
150+
}
151+
}
152+
153+
// add each repo to the table
154+
let table_row = document.createElement("tr")
155+
table_row.className = "table-dark"
156+
table_body.appendChild(table_row)
157+
158+
// add the banner image to the table
159+
let table_data_image = document.createElement("td")
160+
table_row.appendChild(table_data_image)
161+
let table_data_image_src = document.createElement("img")
162+
table_data_image_src.className = "card-img-top rounded-0"
163+
table_data_image_src.src = `${base_url}/${cache_repo}/github/openGraphImages/${sorted[repo]['name']}_624x312.png`
164+
table_data_image_src.alt = ""
165+
table_data_image.append(table_data_image_src)
166+
167+
// default branch is master
168+
let default_branch_data = document.createElement("i")
169+
if (sorted[repo]['default_branch'] === "master") {
170+
default_branch_data.className = "fa-fw fa-solid fa-check-circle text-success"
171+
} else {
172+
default_branch_data.className = "fa-fw fa-solid fa-times-circle text-danger"
173+
}
174+
175+
// get license data
176+
// if blank use font awesome red X circle icon
177+
let license_data = document.createElement("i")
178+
license_data.className = "fa-fw fa-solid fa-times-circle text-danger"
179+
if (sorted[repo]['license'] != null) {
180+
license_data = document.createElement("a")
181+
license_data.className = "text-white"
182+
license_data.href = sorted[repo]['license']['url']
183+
license_data.target = "_blank"
184+
license_data.textContent = sorted[repo]['license']['spdx_id']
185+
}
186+
187+
// archived data
188+
let archived_data = ""
189+
if (sorted[repo]['archived'] === true) {
190+
archived_data = document.createElement("i")
191+
archived_data.className = "fa-fw fa-solid fa-warning text-warning"
192+
}
193+
194+
// convert dates
195+
let created_at = sorted[repo]['created_at']
196+
let updated_at = sorted[repo]['updated_at']
197+
let created_at_date = new Date(created_at)
198+
let updated_at_date = new Date(updated_at)
199+
200+
let table_data = {
201+
"image": table_data_image,
202+
"name": sorted[repo]['name'],
203+
"description": sorted[repo]['description'],
204+
"stargazers_count": sorted[repo]['stargazers_count'],
205+
"forks": sorted[repo]['forks'],
206+
"open_issues": sorted[repo]['open_issues'],
207+
"default_branch": default_branch_data,
208+
"language": language_data,
209+
"license": license_data,
210+
"readthedocs": docs_link,
211+
"code_coverage": code_coverage,
212+
"archived": archived_data,
213+
"created_at": created_at_date.toLocaleDateString(),
214+
"updated_at": updated_at_date.toLocaleDateString(),
215+
}
216+
217+
for (let data in table_data) {
218+
let table_data_name = document.createElement("td")
219+
if (data === "code_coverage") {
220+
table_data_name.className = column_code_coverage_class
221+
} else {
222+
table_data_name.className = "table-dark"
223+
}
224+
table_data_name.append(table_data[data])
225+
table_row.appendChild(table_data_name)
226+
}
227+
}
228+
}
229+
});
230+
});

dist/js/projects.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ $(document).ready(function(){
3939
type: "GET",
4040
dataType:"json",
4141
success: function (result) {
42-
let sorted = result.sort(rankingSorter("stargazers_count", "name"));
42+
let sorted = result.sort(rankingSorter("stargazers_count", "name"))
4343

4444
for(let repo in sorted) {
4545
if (sorted[repo]['archived'] === false && sorted[repo]['description'] !== null && sorted[repo]['fork'] === false) {

0 commit comments

Comments
 (0)