Loader: bool() on pymysql bit(1) bytes is always true - isinstallable and isshopfloor imported as 1 for every row; route through _truthy_bit. The employee source DB is now optional (shopdb-only imports). Frontend: under a subpath mount the 401 interceptor stored the browser path (mount base included) as the login redirect and the router applied its base again (/ops/ops). New stripBase() keeps redirects base-free. tools/export-github.sh automates the publication flow: prune + scrub + commit into ~/projects/shopdb-flask-pub and emit a transfer bundle.
26 lines
1.1 KiB
JavaScript
26 lines
1.1 KiB
JavaScript
// Single source for the app's mount path. Vite injects import.meta.env.BASE_URL
|
|
// from the build-time `base` (default '/', or e.g. '/ops/' for a subpath IIS
|
|
// mount). Every root-absolute URL to a Flask-served asset or route must go
|
|
// through withBase() so it resolves under the mount instead of the server root.
|
|
export const BASE_URL = import.meta.env.BASE_URL
|
|
|
|
// Prefix a root-absolute path (e.g. '/ge-aerospace-logo.svg', '/api', '/tv')
|
|
// with the mount base. Leaves full URLs (http, data:) untouched.
|
|
export function withBase(path) {
|
|
if (!path) return path
|
|
if (/^([a-z]+:)?\/\//i.test(path) || path.startsWith('data:')) return path
|
|
return BASE_URL + String(path).replace(/^\//, '')
|
|
}
|
|
|
|
// Inverse of withBase: turn a browser pathname (which includes the mount
|
|
// base, e.g. '/ops/computers') into a router path ('/computers'). Router
|
|
// navigation already applies the base; feeding it an un-stripped pathname
|
|
// double-prefixes ('/ops/ops/...').
|
|
export function stripBase(path) {
|
|
if (!path) return path
|
|
if (BASE_URL !== '/' && path.startsWith(BASE_URL)) {
|
|
return '/' + path.slice(BASE_URL.length)
|
|
}
|
|
return path
|
|
}
|