mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
sort icons by how much they are used, #3784
This commit is contained in:
parent
2d7b5e4aa2
commit
d354c91d7c
@ -11175,6 +11175,22 @@ const icons = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function getIconClass(icon) {
|
||||||
|
if (icon.type_of_icon === 'LOGO') {
|
||||||
|
return `bxl-${icon.name}`;
|
||||||
|
}
|
||||||
|
else if (icon.type_of_icon === 'SOLID') {
|
||||||
|
return `bxs-${icon.name}`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return `bx-${icon.name}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const icon of icons) {
|
||||||
|
icon.className = getIconClass(icon);
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
categories,
|
categories,
|
||||||
icons
|
icons
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import NoteContextAwareWidget from "./note_context_aware_widget.js";
|
import NoteContextAwareWidget from "./note_context_aware_widget.js";
|
||||||
import attributeService from "../services/attributes.js";
|
import attributeService from "../services/attributes.js";
|
||||||
|
import server from "../services/server.js";
|
||||||
|
|
||||||
const TPL = `
|
const TPL = `
|
||||||
<div class="note-icon-widget dropdown">
|
<div class="note-icon-widget dropdown">
|
||||||
@ -147,6 +148,8 @@ export default class NoteIconWidget extends NoteContextAwareWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async renderDropdown(categoryId, search) {
|
async renderDropdown(categoryId, search) {
|
||||||
|
const iconToCountPromise = this.getIconToCountMap();
|
||||||
|
|
||||||
this.$iconList.empty();
|
this.$iconList.empty();
|
||||||
|
|
||||||
if (this.getIconLabels().length > 0) {
|
if (this.getIconLabels().length > 0) {
|
||||||
@ -165,41 +168,50 @@ export default class NoteIconWidget extends NoteContextAwareWidget {
|
|||||||
|
|
||||||
search = search?.trim()?.toLowerCase();
|
search = search?.trim()?.toLowerCase();
|
||||||
|
|
||||||
for (const icon of icons) {
|
const filteredIcons = icons.filter(icon => {
|
||||||
if (categoryId && icon.category_id !== categoryId) {
|
if (categoryId && icon.category_id !== categoryId) {
|
||||||
continue;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (search) {
|
if (search) {
|
||||||
if (!icon.name.includes(search) && !icon.term?.find(t => t.includes(search))) {
|
if (!icon.name.includes(search) && !icon.term?.find(t => t.includes(search))) {
|
||||||
continue;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$iconList.append(
|
return true;
|
||||||
$('<span>')
|
});
|
||||||
.addClass(this.getIconClass(icon))
|
|
||||||
.attr("title", icon.name)
|
const iconToCount = await iconToCountPromise;
|
||||||
);
|
|
||||||
|
filteredIcons.sort((a, b) => {
|
||||||
|
const countA = iconToCount[a.className] || 0;
|
||||||
|
const countB = iconToCount[b.className] || 0;
|
||||||
|
|
||||||
|
return countB - countA;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const icon of filteredIcons) {
|
||||||
|
this.$iconList.append(this.renderIcon(icon));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$iconSearch.focus();
|
this.$iconSearch.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getIconToCountMap() {
|
||||||
|
const {iconClassToCountMap} = await server.get('other/icon-usage');
|
||||||
|
|
||||||
|
return iconClassToCountMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderIcon(icon) {
|
||||||
|
return $('<span>')
|
||||||
|
.addClass("bx " + icon.className)
|
||||||
|
.attr("title", icon.name);
|
||||||
|
}
|
||||||
|
|
||||||
getIconLabels() {
|
getIconLabels() {
|
||||||
return this.note.getOwnedLabels()
|
return this.note.getOwnedLabels()
|
||||||
.filter(label => ['workspaceIconClass', 'iconClass'].includes(label.name));
|
.filter(label => ['workspaceIconClass', 'iconClass'].includes(label.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
getIconClass(icon) {
|
|
||||||
if (icon.type_of_icon === 'LOGO') {
|
|
||||||
return `bx bxl-${icon.name}`;
|
|
||||||
}
|
|
||||||
else if (icon.type_of_icon === 'SOLID') {
|
|
||||||
return `bx bxs-${icon.name}`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return `bx bx-${icon.name}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
29
src/routes/api/other.js
Normal file
29
src/routes/api/other.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
const becca = require("../../becca/becca");
|
||||||
|
|
||||||
|
function getIconUsage() {
|
||||||
|
const iconClassToCountMap = {};
|
||||||
|
|
||||||
|
for (const {value: iconClass, noteId} of becca.findAttributes('label', 'iconClass')) {
|
||||||
|
if (noteId.startsWith("_")) {
|
||||||
|
continue; // ignore icons of "system" notes since they were not set by the user
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!iconClass?.trim()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const clazz of iconClass.trim().split(/\s+/)) {
|
||||||
|
if (clazz === 'bx') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconClassToCountMap[clazz] = (iconClassToCountMap[clazz] || 0) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { iconClassToCountMap };
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getIconUsage
|
||||||
|
};
|
@ -56,6 +56,7 @@ const backendLogRoute = require('./api/backend_log');
|
|||||||
const statsRoute = require('./api/stats');
|
const statsRoute = require('./api/stats');
|
||||||
const fontsRoute = require('./api/fonts');
|
const fontsRoute = require('./api/fonts');
|
||||||
const etapiTokensApiRoutes = require('./api/etapi_tokens');
|
const etapiTokensApiRoutes = require('./api/etapi_tokens');
|
||||||
|
const otherRoute = require('./api/other');
|
||||||
const shareRoutes = require('../share/routes');
|
const shareRoutes = require('../share/routes');
|
||||||
const etapiAuthRoutes = require('../etapi/auth');
|
const etapiAuthRoutes = require('../etapi/auth');
|
||||||
const etapiAppInfoRoutes = require('../etapi/app_info');
|
const etapiAppInfoRoutes = require('../etapi/app_info');
|
||||||
@ -298,6 +299,7 @@ function register(app) {
|
|||||||
apiRoute(POST, '/api/delete-notes-preview', notesApiRoute.getDeleteNotesPreview);
|
apiRoute(POST, '/api/delete-notes-preview', notesApiRoute.getDeleteNotesPreview);
|
||||||
|
|
||||||
route(GET, '/api/fonts', [auth.checkApiAuthOrElectron], fontsRoute.getFontCss);
|
route(GET, '/api/fonts', [auth.checkApiAuthOrElectron], fontsRoute.getFontCss);
|
||||||
|
apiRoute(GET, '/api/other/icon-usage', otherRoute.getIconUsage);
|
||||||
|
|
||||||
apiRoute(GET, '/api/etapi-tokens', etapiTokensApiRoutes.getTokens);
|
apiRoute(GET, '/api/etapi-tokens', etapiTokensApiRoutes.getTokens);
|
||||||
apiRoute(POST, '/api/etapi-tokens', etapiTokensApiRoutes.createToken);
|
apiRoute(POST, '/api/etapi-tokens', etapiTokensApiRoutes.createToken);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user