Spaces:
Running
Running
Commit
•
4625bc6
1
Parent(s):
59e613b
Improvement
Browse files- index.html +45 -25
index.html
CHANGED
@@ -40,7 +40,7 @@
|
|
40 |
|
41 |
.grid-container {
|
42 |
display: grid;
|
43 |
-
grid-template-columns: repeat(
|
44 |
grid-gap: 10px;
|
45 |
margin-top: 3.5rem;
|
46 |
margin-left: 3.5rem;
|
@@ -71,53 +71,62 @@
|
|
71 |
|
72 |
Alpine.data("themesData", () => ({
|
73 |
async init() {
|
74 |
-
const data = await this.getThemes(this.page, this.sort, this.
|
75 |
-
this.themes = data.
|
76 |
-
console.log(this.themes);
|
77 |
this.totalPages = data.totalPages;
|
78 |
-
console.log(this.totalPages);
|
79 |
},
|
80 |
themes: [],
|
81 |
filter: "all",
|
82 |
sort: "likes",
|
83 |
page: 1,
|
84 |
totalPages: -1,
|
|
|
85 |
buttonClass(attr, filter) {
|
86 |
if (this[attr] === filter) {
|
87 |
return "bg-black dark:bg-white shadow-lg text-white dark:text-black hover:bg-black hover:text-white";
|
88 |
}
|
89 |
return "text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800";
|
90 |
},
|
91 |
-
async
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
},
|
98 |
-
async getThemes(page, sort,
|
|
|
99 |
const res = await fetch(
|
100 |
-
|
101 |
);
|
102 |
const data = await res.json();
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
|
|
|
|
107 |
|
108 |
-
|
109 |
|
110 |
return {
|
111 |
-
pageThemes,
|
112 |
-
totalPages: Math.floor(
|
113 |
};
|
114 |
},
|
115 |
async nextPage() {
|
116 |
if (this.page < this.totalPages) {
|
117 |
this.page += 1;
|
118 |
-
const data = await this.getThemes(this.page, this.
|
119 |
-
this.themes = this.themes.concat(data.
|
120 |
-
|
121 |
}
|
122 |
},
|
123 |
}));
|
@@ -139,18 +148,29 @@
|
|
139 |
<button
|
140 |
:class="buttonClass('sort', 'likes')"
|
141 |
class="text-gray-600 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800 px-2 md:px-3 py-1 rounded-full"
|
142 |
-
@click="
|
143 |
>
|
144 |
Most Likes
|
145 |
</button>
|
146 |
<button
|
147 |
:class="buttonClass('sort', 'recent')"
|
148 |
class="text-gray-600 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800 px-2 md:px-3 py-1 rounded-full"
|
149 |
-
@click="
|
150 |
>
|
151 |
Recent
|
152 |
</button>
|
153 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
</div>
|
155 |
</section>
|
156 |
<div class="grid-container">
|
|
|
40 |
|
41 |
.grid-container {
|
42 |
display: grid;
|
43 |
+
grid-template-columns: repeat(3, minmax(300px, 1fr));
|
44 |
grid-gap: 10px;
|
45 |
margin-top: 3.5rem;
|
46 |
margin-left: 3.5rem;
|
|
|
71 |
|
72 |
Alpine.data("themesData", () => ({
|
73 |
async init() {
|
74 |
+
const data = await this.getThemes(this.page, this.sort, this.useTestData);
|
75 |
+
this.themes = data.themes;
|
|
|
76 |
this.totalPages = data.totalPages;
|
|
|
77 |
},
|
78 |
themes: [],
|
79 |
filter: "all",
|
80 |
sort: "likes",
|
81 |
page: 1,
|
82 |
totalPages: -1,
|
83 |
+
useTestData: false,
|
84 |
buttonClass(attr, filter) {
|
85 |
if (this[attr] === filter) {
|
86 |
return "bg-black dark:bg-white shadow-lg text-white dark:text-black hover:bg-black hover:text-white";
|
87 |
}
|
88 |
return "text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800";
|
89 |
},
|
90 |
+
async switchData() {
|
91 |
+
this.page = 1;
|
92 |
+
this.useTestData = !this.useTestData;
|
93 |
+
const data = await this.getThemes(this.page, this.sort, this.useTestData);
|
94 |
+
this.themes = data.themes;
|
95 |
+
this.totalPages = data.totalPages;
|
96 |
+
},
|
97 |
+
async sortThemes(sort) {
|
98 |
+
this.sort = sort;
|
99 |
+
this.page = 1;
|
100 |
+
const data = await this.getThemes(this.page, this.sort, this.useTestData);
|
101 |
+
this.themes = data.themes;
|
102 |
+
this.totalPages = data.totalPages;
|
103 |
},
|
104 |
+
async getThemes(page, sort, useTestData) {
|
105 |
+
const filename = useTestData ? "test_data.json" : "subdomains.json"
|
106 |
const res = await fetch(
|
107 |
+
`https://huggingface.co/datasets/freddyaboulton/gradio-theme-subdomains/resolve/main/${filename}`
|
108 |
);
|
109 |
const data = await res.json();
|
110 |
+
if(sort === 'likes') {
|
111 |
+
data.sort((a, b) => (b.likes - a.likes));
|
112 |
+
}else {
|
113 |
+
data.sort((a, b) => (new Date(b.lastModified) - new Date(a.lastModified)));
|
114 |
+
}
|
115 |
+
const pageThemes = data.slice((page - 1) * 30, page * 30);
|
116 |
|
117 |
+
console.log(pageThemes);
|
118 |
|
119 |
return {
|
120 |
+
themes: pageThemes,
|
121 |
+
totalPages: Math.floor(data.length + 30 - 1, 30)
|
122 |
};
|
123 |
},
|
124 |
async nextPage() {
|
125 |
if (this.page < this.totalPages) {
|
126 |
this.page += 1;
|
127 |
+
const data = await this.getThemes(this.page, this.filter, this.useTestData);
|
128 |
+
this.themes = this.themes.concat(data.themes);
|
129 |
+
this.totalPages = data.totalPages;
|
130 |
}
|
131 |
},
|
132 |
}));
|
|
|
148 |
<button
|
149 |
:class="buttonClass('sort', 'likes')"
|
150 |
class="text-gray-600 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800 px-2 md:px-3 py-1 rounded-full"
|
151 |
+
@click="sortThemes('likes')"
|
152 |
>
|
153 |
Most Likes
|
154 |
</button>
|
155 |
<button
|
156 |
:class="buttonClass('sort', 'recent')"
|
157 |
class="text-gray-600 hover:bg-gray-200 dark:hover:bg-gray-500 hover:text-gray-800 px-2 md:px-3 py-1 rounded-full"
|
158 |
+
@click="sortThemes('recent')"
|
159 |
>
|
160 |
Recent
|
161 |
</button>
|
162 |
</div>
|
163 |
+
<div class="flex gap-0">
|
164 |
+
<input type="checkbox" @click="switchData()" class="rounded">
|
165 |
+
<span class="md:px-3 py-1 dark:text-white text-gray-400 ml-0">Use Test Data</span>
|
166 |
+
<!-- <button
|
167 |
+
:class="buttonClass('useTestData', false)"
|
168 |
+
class="px-2 md:px-3 py-1 rounded-full"
|
169 |
+
@click="switchData()"
|
170 |
+
>
|
171 |
+
Use Test Data
|
172 |
+
</button> -->
|
173 |
+
</div>
|
174 |
</div>
|
175 |
</section>
|
176 |
<div class="grid-container">
|