- InlineField on monthly row price (dblclick) + annual row monthly base
price. Saves via Service Subscription.monthly_price → mirrored back
into the UI row's actual_price; drops an audit line on the customer
timeline.
- Delete button (confirm dialog, v-if=can('delete_records')) on both
monthly + annual rows. Uses deleteDoc + local splice + invalidates
location + section caches.
- display_order custom Int field on Service Subscription, persisted in
10-step increments on drag reorder (so manual inserts have room to
squeeze between without a full re-number pass). loadSubscriptions
sorts by display_order first so the dispatcher-controlled order
survives a page reload and can drive invoice print ordering later.
- Rebate rows nested visually: 32px indent + arrow glyph + lighter
red background + smaller type + inherited red color on the inline
price input. Matches the invoice PDF grouping dispatchers expect.
161 lines
2.7 KiB
JavaScript
161 lines
2.7 KiB
JavaScript
/* eslint-disable */
|
|
/**
|
|
* THIS FILE IS GENERATED AUTOMATICALLY.
|
|
* DO NOT EDIT.
|
|
*
|
|
* You are probably looking on adding startup/initialization code.
|
|
* Use "quasar new boot <name>" and add it there.
|
|
* One boot file per concern. Then reference the file(s) in quasar.config.js > boot:
|
|
* boot: ['file', ...] // do not add ".js" extension to it.
|
|
*
|
|
* Boot files are your "main.js"
|
|
**/
|
|
|
|
|
|
import { createApp } from 'vue'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import '@quasar/extras/material-icons/material-icons.css'
|
|
|
|
|
|
|
|
|
|
// We load Quasar stylesheet file
|
|
import 'quasar/dist/quasar.css'
|
|
|
|
|
|
|
|
|
|
import 'src/css/app.scss'
|
|
|
|
import 'src/css/tech.scss'
|
|
|
|
|
|
import createQuasarApp from './app.js'
|
|
import quasarUserOptions from './quasar-user-options.js'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const publicPath = `/`
|
|
|
|
async function start ({
|
|
app,
|
|
router
|
|
|
|
}, bootFiles) {
|
|
|
|
|
|
|
|
let hasRedirected = false
|
|
const getRedirectUrl = url => {
|
|
try { return router.resolve(url).href }
|
|
catch (err) {}
|
|
|
|
return Object(url) === url
|
|
? null
|
|
: url
|
|
}
|
|
const redirect = url => {
|
|
hasRedirected = true
|
|
|
|
if (typeof url === 'string' && /^https?:\/\//.test(url)) {
|
|
window.location.href = url
|
|
return
|
|
}
|
|
|
|
const href = getRedirectUrl(url)
|
|
|
|
// continue if we didn't fail to resolve the url
|
|
if (href !== null) {
|
|
window.location.href = href
|
|
window.location.reload()
|
|
}
|
|
}
|
|
|
|
const urlPath = window.location.href.replace(window.location.origin, '')
|
|
|
|
for (let i = 0; hasRedirected === false && i < bootFiles.length; i++) {
|
|
try {
|
|
await bootFiles[i]({
|
|
app,
|
|
router,
|
|
|
|
ssrContext: null,
|
|
redirect,
|
|
urlPath,
|
|
publicPath
|
|
})
|
|
}
|
|
catch (err) {
|
|
if (err && err.url) {
|
|
redirect(err.url)
|
|
return
|
|
}
|
|
|
|
console.error('[Quasar] boot error:', err)
|
|
return
|
|
}
|
|
}
|
|
|
|
if (hasRedirected === true) {
|
|
return
|
|
}
|
|
|
|
|
|
app.use(router)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.mount('#q-app')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
createQuasarApp(createApp, quasarUserOptions)
|
|
|
|
.then(app => {
|
|
// eventually remove this when Cordova/Capacitor/Electron support becomes old
|
|
const [ method, mapFn ] = Promise.allSettled !== void 0
|
|
? [
|
|
'allSettled',
|
|
bootFiles => bootFiles.map(result => {
|
|
if (result.status === 'rejected') {
|
|
console.error('[Quasar] boot error:', result.reason)
|
|
return
|
|
}
|
|
return result.value.default
|
|
})
|
|
]
|
|
: [
|
|
'all',
|
|
bootFiles => bootFiles.map(entry => entry.default)
|
|
]
|
|
|
|
return Promise[ method ]([
|
|
|
|
import('boot/pinia')
|
|
|
|
]).then(bootFiles => {
|
|
const boot = mapFn(bootFiles).filter(entry => typeof entry === 'function')
|
|
start(app, boot)
|
|
})
|
|
})
|
|
|