Ship the Tech Tools plugin that the previous export silently dropped
This commit is contained in:
67
plugins/tools/frontend/tools.js
Normal file
67
plugins/tools/frontend/tools.js
Normal file
@@ -0,0 +1,67 @@
|
||||
// The Tech Tools catalog.
|
||||
//
|
||||
// This is the ONLY place a tool has to be declared. Adding one is: write the
|
||||
// view, add a route in routes.js, add an entry here. The index page groups by
|
||||
// category and searches over name + description + keywords.
|
||||
//
|
||||
// Fields:
|
||||
// id - stable slug, also the key the index uses
|
||||
// name - card title
|
||||
// description - one line, says what it does, not how
|
||||
// category - group heading on the index
|
||||
// route - path to open
|
||||
// standalone - true when the route lives OUTSIDE AppLayout (print pages),
|
||||
// so the index opens it as a normal link rather than a
|
||||
// router-link and the user keeps this tab
|
||||
// keywords - extra search terms someone might type instead of the name
|
||||
export const TOOLS = [
|
||||
{
|
||||
id: 'code-generator',
|
||||
name: 'Barcode / QR Generator',
|
||||
description: 'Make QR or CODE128 labels from typed text, a URL, or a CSV, sized for your label stock.',
|
||||
category: 'labels',
|
||||
route: '/tools/codes',
|
||||
standalone: true,
|
||||
keywords: ['qr', 'barcode', 'code128', 'label', 'zebra', 'sticker', 'csv', 'print'],
|
||||
},
|
||||
]
|
||||
|
||||
export const CATEGORY_LABELS = {
|
||||
labels: 'Labels & Printing',
|
||||
convert: 'Conversion',
|
||||
network: 'Network',
|
||||
}
|
||||
|
||||
export function categoryLabel(category) {
|
||||
return CATEGORY_LABELS[category] || category
|
||||
}
|
||||
|
||||
// Tools matching a search string, or all of them when the box is empty.
|
||||
export function searchTools(query) {
|
||||
const needle = (query || '').trim().toLowerCase()
|
||||
if (!needle) return TOOLS
|
||||
return TOOLS.filter(tool => {
|
||||
const haystack = [tool.name, tool.description, ...(tool.keywords || [])]
|
||||
.join(' ')
|
||||
.toLowerCase()
|
||||
return haystack.includes(needle)
|
||||
})
|
||||
}
|
||||
|
||||
// Tools grouped for the index, categories in CATEGORY_LABELS order so the
|
||||
// page does not reshuffle as tools are added.
|
||||
export function groupTools(query) {
|
||||
const matched = searchTools(query)
|
||||
const order = Object.keys(CATEGORY_LABELS)
|
||||
const seen = [...new Set(matched.map(tool => tool.category))]
|
||||
seen.sort((a, b) => {
|
||||
const ai = order.indexOf(a)
|
||||
const bi = order.indexOf(b)
|
||||
return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi)
|
||||
})
|
||||
return seen.map(category => ({
|
||||
category,
|
||||
label: categoryLabel(category),
|
||||
tools: matched.filter(tool => tool.category === category),
|
||||
}))
|
||||
}
|
||||
Reference in New Issue
Block a user