ttabs-svelte
Version:
A flexible layout management system with draggable, resizable tiles and tabs for Svelte applications. Like in VSCode
55 lines (54 loc) • 1.94 kB
JavaScript
import { defaultValidator } from './default-validator';
import { LayoutValidationError } from './validation-types';
/**
* Creates a validation middleware instance
* @param ttabs The ttabs instance to validate
* @param validators Custom validators to add
* @param defaultLayoutCreator Function to create a default layout
* @returns A validation middleware instance
*/
export function createValidationMiddleware(ttabs, validators = [], defaultLayoutCreator) {
return {
validators,
defaultLayoutCreator,
errorHandlers: [],
validate(ttabs) {
try {
// Always run the default validator first
defaultValidator(ttabs);
// Then run custom validators
for (const validator of this.validators) {
validator(ttabs);
}
return true;
}
catch (error) {
if (error instanceof LayoutValidationError) {
// Notify error handlers
this.errorHandlers.forEach(handler => {
handler(error);
});
console.warn(`Layout validation failed: ${error.message} (${error.code})`);
// Reset to default layout
this.resetToDefault(ttabs);
return false;
}
// Re-throw other errors
throw error;
}
},
resetToDefault(ttabs) {
// Clear existing tiles
ttabs.resetTiles();
// Create a root grid first
ttabs.addGrid();
// Apply default layout if provided
if (this.defaultLayoutCreator) {
this.defaultLayoutCreator(ttabs);
}
},
addErrorHandler(handler) {
this.errorHandlers.push(handler);
}
};
}