All checks were successful
Build and Deploy Nuxt / build (push) Successful in 1m20s
55 lines
1.7 KiB
JavaScript
55 lines
1.7 KiB
JavaScript
import { ref } from 'vue';
|
|
|
|
const actions = ref([]);
|
|
|
|
function register(action) {
|
|
if (!action.id || !action.execute) {
|
|
console.warn('[ActionRegistry] Action missing id or execute:', action);
|
|
return;
|
|
}
|
|
|
|
const existingIndex = actions.value.findIndex(a => a.id === action.id);
|
|
if (existingIndex !== -1) {
|
|
actions.value[existingIndex] = action;
|
|
} else {
|
|
actions.value.push(action);
|
|
}
|
|
}
|
|
|
|
function unregister(id) {
|
|
actions.value = actions.value.filter(a => a.id !== id);
|
|
}
|
|
|
|
function search(query) {
|
|
if (!query || query.trim() === '') return [];
|
|
|
|
const q = query.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().trim();
|
|
if (q === '') return [];
|
|
|
|
return actions.value.filter(action => {
|
|
if (typeof action.isActive === 'function' && !action.isActive()) {
|
|
return false;
|
|
}
|
|
const label = (action.label || '').normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
|
|
const description = (action.description || '').normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase();
|
|
return label.includes(q) || description.includes(q);
|
|
}).sort((a, b) => {
|
|
const aLabel = (a.label || '').toLowerCase();
|
|
const bLabel = (b.label || '').toLowerCase();
|
|
const qLower = q;
|
|
const aStarts = aLabel.startsWith(qLower) ? 0 : 1;
|
|
const bStarts = bLabel.startsWith(qLower) ? 0 : 1;
|
|
return aStarts - bStarts || aLabel.localeCompare(bLabel);
|
|
});
|
|
}
|
|
|
|
function execute(id, params = {}) {
|
|
const action = actions.value.find(a => a.id === id);
|
|
if (action && action.execute) {
|
|
action.execute(params);
|
|
}
|
|
}
|
|
|
|
export { register, unregister, search, execute };
|
|
export default { register, unregister, search, execute };
|