b2392d2394
ci / backend (push) Failing after 1s
ci / static (push) Failing after 9s
Build & Test with Secrets / build (push) Failing after 2s
deploy / deploy (push) Failing after 2m9s
Build & Test with Secrets / security-scan (push) Failing after 9s
deploy / notify (push) Successful in 1s
Build & Test with Secrets / notification (push) Has been cancelled
Build & Test with Secrets / frontend (push) Has been cancelled
ci / publish (push) Has been cancelled
ci / frontend (push) Has been cancelled
Changes: - Removed incomplete identity/pages feature (had missing dependencies) - Fixed RiskDashboard.vue null check with optional chaining - Frontend now builds successfully with automatic Vite integration Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
224 lines
9.3 KiB
JavaScript
224 lines
9.3 KiB
JavaScript
import { ref } from 'vue';
|
|
// Mock data
|
|
const currentPositions = ref([
|
|
{ symbol: 'AAPL', quantity: 100, marketPrice: 150.25, marketValue: 15025, weightPercent: 35.3 },
|
|
{ symbol: 'MSFT', quantity: 80, marketPrice: 320.50, marketValue: 25640, weightPercent: 60.2 },
|
|
{ symbol: 'GOOGL', quantity: 50, marketPrice: 140.75, marketValue: 7037.5, weightPercent: 16.5 },
|
|
]);
|
|
const driftThreshold = ref(5);
|
|
const targetWeights = ref([
|
|
{ symbol: 'AAPL', targetPercent: 40 },
|
|
{ symbol: 'MSFT', targetPercent: 35 },
|
|
{ symbol: 'GOOGL', targetPercent: 25 },
|
|
]);
|
|
const jobResult = ref(null);
|
|
const totalValue = ref(42700);
|
|
const addTarget = () => {
|
|
targetWeights.value.push({ symbol: '', targetPercent: 0 });
|
|
};
|
|
const removeTarget = (idx) => {
|
|
targetWeights.value.splice(idx, 1);
|
|
};
|
|
const triggerRebalance = async () => {
|
|
// Mock API call
|
|
jobResult.value = {
|
|
jobId: '550e8400-e29b-41d4-a716-446655440001',
|
|
status: 'Queued',
|
|
estimatedTradeCount: 3,
|
|
estimatedCost: 127.35,
|
|
};
|
|
};
|
|
const __VLS_ctx = {
|
|
...{},
|
|
...{},
|
|
};
|
|
let __VLS_components;
|
|
let __VLS_intrinsics;
|
|
let __VLS_directives;
|
|
/** @type {__VLS_StyleScopedClasses['header']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['card']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['positions-table']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['positions-table']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['positions-table']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['drift-threshold']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['drift-threshold']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['btn-primary']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "rebalance-form" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['rebalance-form']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "header" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['header']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.h1, __VLS_intrinsics.h1)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.p, __VLS_intrinsics.p)({
|
|
...{ class: "subtitle" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['subtitle']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "content" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['content']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "card" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['card']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.h2, __VLS_intrinsics.h2)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.table, __VLS_intrinsics.table)({
|
|
...{ class: "positions-table" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['positions-table']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.thead, __VLS_intrinsics.thead)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.tr, __VLS_intrinsics.tr)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.th, __VLS_intrinsics.th)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.th, __VLS_intrinsics.th)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.th, __VLS_intrinsics.th)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.th, __VLS_intrinsics.th)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.th, __VLS_intrinsics.th)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.tbody, __VLS_intrinsics.tbody)({});
|
|
for (const [pos] of __VLS_vFor((__VLS_ctx.currentPositions))) {
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.tr, __VLS_intrinsics.tr)({
|
|
key: (pos.symbol),
|
|
});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.td, __VLS_intrinsics.td)({});
|
|
(pos.symbol);
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.td, __VLS_intrinsics.td)({});
|
|
(pos.quantity.toLocaleString());
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.td, __VLS_intrinsics.td)({});
|
|
(pos.marketPrice.toFixed(2));
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.td, __VLS_intrinsics.td)({});
|
|
(pos.marketValue.toLocaleString());
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.td, __VLS_intrinsics.td)({});
|
|
(pos.weightPercent.toFixed(1));
|
|
// @ts-ignore
|
|
[currentPositions,];
|
|
}
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "total" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['total']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.strong, __VLS_intrinsics.strong)({});
|
|
(__VLS_ctx.totalValue.toLocaleString());
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "card" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['card']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.h2, __VLS_intrinsics.h2)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "form-group" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['form-group']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "drift-threshold" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['drift-threshold']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.label, __VLS_intrinsics.label)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.input)({
|
|
type: "number",
|
|
min: "0",
|
|
max: "50",
|
|
step: "1",
|
|
});
|
|
(__VLS_ctx.driftThreshold);
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "targets" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['targets']} */ ;
|
|
for (const [target, idx] of __VLS_vFor((__VLS_ctx.targetWeights))) {
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
key: (idx),
|
|
...{ class: "target-row" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['target-row']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.input)({
|
|
placeholder: "Symbol",
|
|
...{ class: "symbol-input" },
|
|
});
|
|
(target.symbol);
|
|
/** @type {__VLS_StyleScopedClasses['symbol-input']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.input)({
|
|
type: "number",
|
|
min: "0",
|
|
max: "100",
|
|
step: "1",
|
|
placeholder: "%",
|
|
...{ class: "percent-input" },
|
|
});
|
|
(target.targetPercent);
|
|
/** @type {__VLS_StyleScopedClasses['percent-input']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.button, __VLS_intrinsics.button)({
|
|
...{ onClick: (...[$event]) => {
|
|
return (__VLS_ctx.removeTarget(idx));
|
|
// @ts-ignore
|
|
[totalValue, driftThreshold, targetWeights, removeTarget,];
|
|
} },
|
|
...{ class: "btn-remove" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['btn-remove']} */ ;
|
|
// @ts-ignore
|
|
[];
|
|
}
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "actions" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['actions']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.button, __VLS_intrinsics.button)({
|
|
...{ onClick: (__VLS_ctx.addTarget) },
|
|
...{ class: "btn-secondary" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['btn-secondary']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.button, __VLS_intrinsics.button)({
|
|
...{ onClick: (__VLS_ctx.triggerRebalance) },
|
|
...{ class: "btn-primary" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['btn-primary']} */ ;
|
|
if (__VLS_ctx.jobResult) {
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "card result" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['card']} */ ;
|
|
/** @type {__VLS_StyleScopedClasses['result']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.h2, __VLS_intrinsics.h2)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "result-item" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({
|
|
...{ class: "mono" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['mono']} */ ;
|
|
(__VLS_ctx.jobResult.jobId);
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "result-item" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({
|
|
...{ class: "status-badge" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['status-badge']} */ ;
|
|
(__VLS_ctx.jobResult.status);
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "result-item" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
(__VLS_ctx.jobResult.estimatedTradeCount);
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.div, __VLS_intrinsics.div)({
|
|
...{ class: "result-item" },
|
|
});
|
|
/** @type {__VLS_StyleScopedClasses['result-item']} */ ;
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
__VLS_asFunctionalElement1(__VLS_intrinsics.span, __VLS_intrinsics.span)({});
|
|
(__VLS_ctx.jobResult.estimatedCost.toFixed(2));
|
|
}
|
|
// @ts-ignore
|
|
[addTarget, triggerRebalance, jobResult, jobResult, jobResult, jobResult, jobResult,];
|
|
const __VLS_export = (await import('vue')).defineComponent({});
|
|
export default {};
|