242 lines
12 KiB
Markdown
242 lines
12 KiB
Markdown
# Graph Report - bx-mobile (2026-08-17)
|
|
|
|
## Corpus Check
|
|
- 59 files · ~50,517 words
|
|
- Verdict: corpus is large enough that graph structure adds value.
|
|
|
|
## Summary
|
|
- 950 nodes · 1438 edges · 44 communities (36 shown, 8 thin omitted)
|
|
- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 11 edges (avg confidence: 0.53)
|
|
- Token cost: 0 input · 0 output
|
|
|
|
## Graph Freshness
|
|
- Built from commit: `43d53cb9`
|
|
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
|
- Run `graphify update .` after code changes (no API cost).
|
|
|
|
## Community Hubs (Navigation)
|
|
- [[_COMMUNITY_HomePage.vue|HomePage.vue]]
|
|
- [[_COMMUNITY_ApprovalPage.vue|ApprovalPage.vue]]
|
|
- [[_COMMUNITY_PaymentPage.vue|PaymentPage.vue]]
|
|
- [[_COMMUNITY_RoleManagePage.vue|RoleManagePage.vue]]
|
|
- [[_COMMUNITY_InvoiceWalletAdminPage.vue|InvoiceWalletAdminPage.vue]]
|
|
- [[_COMMUNITY_InvoiceWalletMinePage.vue|InvoiceWalletMinePage.vue]]
|
|
- [[_COMMUNITY_format.ts|format.ts]]
|
|
- [[_COMMUNITY_MinePage.vue|MinePage.vue]]
|
|
- [[_COMMUNITY_ReimburseApplyPage.vue|ReimburseApplyPage.vue]]
|
|
- [[_COMMUNITY_AdvanceApprovePage.vue|AdvanceApprovePage.vue]]
|
|
- [[_COMMUNITY_AdvanceIssuePage.vue|AdvanceIssuePage.vue]]
|
|
- [[_COMMUNITY_ReimburseApprovePage.vue|ReimburseApprovePage.vue]]
|
|
- [[_COMMUNITY_MenuManagePage.vue|MenuManagePage.vue]]
|
|
- [[_COMMUNITY_UserManagePage.vue|UserManagePage.vue]]
|
|
- [[_COMMUNITY_AllPage.vue|AllPage.vue]]
|
|
- [[_COMMUNITY_ReimburseDetailPage.vue|ReimburseDetailPage.vue]]
|
|
- [[_COMMUNITY_ExpenseProjectPage.vue|ExpenseProjectPage.vue]]
|
|
- [[_COMMUNITY_dependencies|dependencies]]
|
|
- [[_COMMUNITY_WfReimbursePage.vue|WfReimbursePage.vue]]
|
|
- [[_COMMUNITY_ReimburseListPage.vue|ReimburseListPage.vue]]
|
|
- [[_COMMUNITY_WfAdvancePage.vue|WfAdvancePage.vue]]
|
|
- [[_COMMUNITY_ApprovalDetailPage.vue|ApprovalDetailPage.vue]]
|
|
- [[_COMMUNITY_AdvanceDetailPage.vue|AdvanceDetailPage.vue]]
|
|
- [[_COMMUNITY_compilerOptions|compilerOptions]]
|
|
- [[_COMMUNITY_LoginPage.vue|LoginPage.vue]]
|
|
- [[_COMMUNITY_AdvanceApplyPage.vue|AdvanceApplyPage.vue]]
|
|
- [[_COMMUNITY_useExpenseItemTree.ts|useExpenseItemTree.ts]]
|
|
- [[_COMMUNITY_index.ts|index.ts]]
|
|
- [[_COMMUNITY_compilerOptions|compilerOptions]]
|
|
- [[_COMMUNITY_BizError|BizError]]
|
|
- [[_COMMUNITY_formatApplyDateTime|formatApplyDateTime]]
|
|
- [[_COMMUNITY_fetchPage|fetchPage]]
|
|
- [[_COMMUNITY_loadEditData|loadEditData]]
|
|
- [[_COMMUNITY_AdminIndexPage.vue|AdminIndexPage.vue]]
|
|
- [[_COMMUNITY_onSubmit|onSubmit]]
|
|
- [[_COMMUNITY_components.d.ts|components.d.ts]]
|
|
- [[_COMMUNITY_MenuEntryCard.vue|MenuEntryCard.vue]]
|
|
- [[_COMMUNITY_fetchOffsetAdvances|fetchOffsetAdvances]]
|
|
- [[_COMMUNITY_isImageFile|isImageFile]]
|
|
- [[_COMMUNITY_loadBizAttachmentsTo|loadBizAttachmentsTo]]
|
|
- [[_COMMUNITY_findRootForItem|findRootForItem]]
|
|
|
|
## God Nodes (most connected - your core abstractions)
|
|
1. `formatAmount()` - 28 edges
|
|
2. `statusLabel()` - 19 edges
|
|
3. `compilerOptions` - 18 edges
|
|
4. `resolveExpenseDisplay()` - 17 edges
|
|
5. `formatApplyDateTime()` - 14 edges
|
|
6. `advanceApi` - 11 edges
|
|
7. `reimburseApi` - 11 edges
|
|
8. `attachmentApi` - 11 edges
|
|
9. `useKeywordSearch()` - 11 edges
|
|
10. `useExpenseItemTree()` - 10 edges
|
|
|
|
## Surprising Connections (you probably didn't know these)
|
|
- `actualIssuedDisplay()` --calls--> `formatAmount()` [EXTRACTED]
|
|
src/views/advance/AdvanceListPage.vue → src/utils/format.ts
|
|
- `moneyOrDash()` --calls--> `formatAmount()` [EXTRACTED]
|
|
src/views/reimburse/ReimburseListPage.vue → src/utils/format.ts
|
|
- `allReimburseLineSubtitle()` --calls--> `resolveExpenseDisplay()` [EXTRACTED]
|
|
src/views/all/AllPage.vue → src/hooks/useExpenseItemTree.ts
|
|
- `reimburseLineSubtitle()` --calls--> `resolveExpenseDisplay()` [EXTRACTED]
|
|
src/views/approval/ApprovalPage.vue → src/hooks/useExpenseItemTree.ts
|
|
- `mineReimburseLineSubtitle()` --calls--> `resolveExpenseDisplay()` [EXTRACTED]
|
|
src/views/mine/MinePage.vue → src/hooks/useExpenseItemTree.ts
|
|
|
|
## Import Cycles
|
|
- None detected.
|
|
|
|
## Communities (44 total, 8 thin omitted)
|
|
|
|
### Community 0 - "HomePage.vue"
|
|
Cohesion: 0.05
|
|
Nodes (33): reimburseApi, BX_MENU_CATALOG, BxMenuEntry, BxMenuPhase, app, router, routes, MenuItem (+25 more)
|
|
|
|
### Community 1 - "ApprovalPage.vue"
|
|
Cohesion: 0.05
|
|
Nodes (38): formatAmount(), actualIssuedDisplay(), popupOffsetTotalDisplay(), actualIssuedDisplay(), detailOffsetTotalDisplay(), actualIssuedDisplay(), moneyOrDash(), actionLoading (+30 more)
|
|
|
|
### Community 2 - "PaymentPage.vue"
|
|
Cohesion: 0.05
|
|
Nodes (33): activeTab, actualAmount, detailApplyAttachments, detailData, detailLoading, detailOffsetAttachments, detailOffsetRecords, detailPayAttachments (+25 more)
|
|
|
|
### Community 3 - "RoleManagePage.vue"
|
|
Cohesion: 0.06
|
|
Nodes (36): allUsers, collectAllParentIds(), currentPage, editingId, finished, form, handleAssignUserSubmit(), handleDelete() (+28 more)
|
|
|
|
### Community 4 - "InvoiceWalletAdminPage.vue"
|
|
Cohesion: 0.06
|
|
Nodes (40): useKeywordSearch(), UseKeywordSearchOptions, detailInvoices, detailSummary, detailUser, fetchInvoices(), fetchWallets(), invFinished (+32 more)
|
|
|
|
### Community 5 - "InvoiceWalletMinePage.vue"
|
|
Cohesion: 0.08
|
|
Nodes (20): activeTab, allLedgers, invFinished, invLoading, InvoiceAtt, invoices, invPage, invRefreshing (+12 more)
|
|
|
|
### Community 6 - "format.ts"
|
|
Cohesion: 0.13
|
|
Nodes (18): advanceApi, activeTab, actualIssuedDisplay(), currentPage, fetchPage(), finished, handleDelete(), handleSubmit() (+10 more)
|
|
|
|
### Community 7 - "MinePage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (34): activeTab, addActions, advanceFinished, advanceList, advanceLoadingMore, advancePage, advanceRefreshing, advanceStatus (+26 more)
|
|
|
|
### Community 8 - "ReimburseApplyPage.vue"
|
|
Cohesion: 0.04
|
|
Nodes (33): applicantKeyword, applicantLabel, { applicantOptions, loadApplicantOptions }, applicantPickerColumns, attachItems, auth, balanceInsufficient, DetailLine (+25 more)
|
|
|
|
### Community 9 - "AdvanceApprovePage.vue"
|
|
Cohesion: 0.06
|
|
Nodes (32): actionLoading, actionType, activeTab, confirmAction(), currentItem, detailData, downloadPopupFile(), fetchPage() (+24 more)
|
|
|
|
### Community 10 - "AdvanceIssuePage.vue"
|
|
Cohesion: 0.06
|
|
Nodes (27): activeTab, actualAmount, confirmIssue(), detailApplyAttachments, detailData, detailIssueAttachments, detailOffsetRecords, fetchList() (+19 more)
|
|
|
|
### Community 11 - "ReimburseApprovePage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (31): actionLoading, actionType, activeTab, cardTitle(), confirmAction(), currentItem, detailData, fetchPage() (+23 more)
|
|
|
|
### Community 12 - "MenuManagePage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (26): Props, Props, variantClass, menuTypeLabel(), editingId, form, handleDelete(), handleSubmit() (+18 more)
|
|
|
|
### Community 13 - "UserManagePage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (29): currentPage, editingId, finished, form, handleDelete(), handleSearch(), handleSubmit(), handleToggleStatus() (+21 more)
|
|
|
|
### Community 14 - "AllPage.vue"
|
|
Cohesion: 0.09
|
|
Nodes (27): activeTab, allReimburseCardTitle(), allReimburseLineSubtitle(), allRows, displayList, displayPage, extractRows(), filteredList (+19 more)
|
|
|
|
### Community 15 - "ReimburseDetailPage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (30): actionButtons, applyAttachments, approvals, canWithdraw, checkResubmitPrompt(), deleteLoading, detail, detailTab (+22 more)
|
|
|
|
### Community 16 - "ExpenseProjectPage.vue"
|
|
Cohesion: 0.09
|
|
Nodes (24): dialogMode, dialogTitle, expandedIds, expenseTree, form, handleDelete(), handleSubmit(), isEdit (+16 more)
|
|
|
|
### Community 17 - "dependencies"
|
|
Cohesion: 0.08
|
|
Nodes (25): dependencies, axios, dayjs, jsencrypt, pinia, vant, @vant/use, vue (+17 more)
|
|
|
|
### Community 18 - "WfReimbursePage.vue"
|
|
Cohesion: 0.06
|
|
Nodes (36): workflowApi, portalAdminApi, portalAuthApi, portalClient, PortalError, useApplicantOptions(), buildWebEncryptedLoginBody(), approverDisplay (+28 more)
|
|
|
|
### Community 19 - "ReimburseListPage.vue"
|
|
Cohesion: 0.08
|
|
Nodes (30): expenseItemApi, ExpenseItem, formatExpenseName(), pickExpenseItemId(), resolveExpenseDisplay(), useExpenseItemTree(), payCardTitle(), lineExpenseDisplay() (+22 more)
|
|
|
|
### Community 20 - "WfAdvancePage.vue"
|
|
Cohesion: 0.12
|
|
Nodes (22): approverDisplay, approverKeyword, buildNodePayload(), formData, handleDelete(), handleSubmit(), isEdit, loading (+14 more)
|
|
|
|
### Community 21 - "ApprovalDetailPage.vue"
|
|
Cohesion: 0.07
|
|
Nodes (23): actionType, advanceOffsetRecords, advanceOffsetTotalDisplay, approvals, bizType, detail, detailTab, dialogSubmitting (+15 more)
|
|
|
|
### Community 22 - "AdvanceDetailPage.vue"
|
|
Cohesion: 0.10
|
|
Nodes (20): paymentApi, actionLoading, approvals, AttachmentInfo, attachments, checkResubmitPrompt(), detail, detailTab (+12 more)
|
|
|
|
### Community 23 - "compilerOptions"
|
|
Cohesion: 0.09
|
|
Nodes (21): compilerOptions, allowImportingTsExtensions, baseUrl, isolatedModules, jsx, lib, module, moduleResolution (+13 more)
|
|
|
|
### Community 24 - "LoginPage.vue"
|
|
Cohesion: 0.16
|
|
Nodes (15): advanceIssueRecordStatusLabel(), advanceIssueRecordStatusTagClass(), formatApplyDate(), formatDate(), paymentDetailTicketToneClass(), paymentRecordRawStatus(), paymentRecordStatusLabel(), paymentRecordStatusTagClass() (+7 more)
|
|
|
|
### Community 25 - "AdvanceApplyPage.vue"
|
|
Cohesion: 0.13
|
|
Nodes (14): SUBMIT_APPROVE_BUTTON_COLOR, attachment, attachmentAccept, fieldErr, form, isEdit, loadEditData(), onSubmit() (+6 more)
|
|
|
|
### Community 26 - "useExpenseItemTree.ts"
|
|
Cohesion: 0.17
|
|
Nodes (8): BizError, bxClient, attachmentApi, BxId, invoiceApi, invoiceWalletApi, AttachmentFile, useAttachment()
|
|
|
|
### Community 27 - "index.ts"
|
|
Cohesion: 0.22
|
|
Nodes (9): ensureLedgersLoaded(), fetchLedgersPage(), ledgers, loadSummary(), onInvoiceRefresh(), onLedgerLoad(), onLedgerRefresh(), onUploadBeforeClose() (+1 more)
|
|
|
|
### Community 28 - "compilerOptions"
|
|
Cohesion: 0.25
|
|
Nodes (7): compilerOptions, allowSyntheticDefaultImports, composite, module, moduleResolution, skipLibCheck, include
|
|
|
|
### Community 29 - "BizError"
|
|
Cohesion: 0.29
|
|
Nodes (7): fetchInvoices(), invoiceFiles(), isImage(), kickInvoicePreviewLoads(), normalizeInvoiceFiles(), onInvoiceLoad(), openAttachment()
|
|
|
|
### Community 31 - "fetchPage"
|
|
Cohesion: 0.33
|
|
Nodes (6): confirmIssue(), confirmOffset(), fetchPage(), onLoad(), onRefresh(), remainingOffset()
|
|
|
|
### Community 32 - "loadEditData"
|
|
Cohesion: 0.24
|
|
Nodes (10): buildAttachItems(), confirmInvoicePicker(), invoiceFileList(), isImageFileType(), kickAttachPreviews(), loadEditData(), onApplicantConfirm(), refreshTitle() (+2 more)
|
|
|
|
### Community 34 - "onSubmit"
|
|
Cohesion: 0.67
|
|
Nodes (3): buildInvoicePayload(), onSubmit(), validateReimburseApplyForm()
|
|
|
|
## Knowledge Gaps
|
|
- **485 isolated node(s):** `GlobalComponents`, `name`, `private`, `version`, `type` (+480 more)
|
|
These have ≤1 connection - possible missing edges or undocumented components.
|
|
- **8 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
|
|
|
## Suggested Questions
|
|
_Questions this graph is uniquely positioned to answer:_
|
|
|
|
- **Why does `statusLabel()` connect `LoginPage.vue` to `ApprovalPage.vue`, `RoleManagePage.vue`, `format.ts`, `MinePage.vue`, `AdvanceApprovePage.vue`, `ReimburseApprovePage.vue`, `MenuManagePage.vue`, `UserManagePage.vue`, `AllPage.vue`, `ReimburseDetailPage.vue`, `ExpenseProjectPage.vue`, `WfReimbursePage.vue`, `ReimburseListPage.vue`, `WfAdvancePage.vue`, `ApprovalDetailPage.vue`, `AdvanceDetailPage.vue`?**
|
|
_High betweenness centrality (0.052) - this node is a cross-community bridge._
|
|
- **Why does `attachmentApi` connect `useExpenseItemTree.ts` to `PaymentPage.vue`, `InvoiceWalletAdminPage.vue`, `InvoiceWalletMinePage.vue`, `ReimburseApplyPage.vue`, `AdvanceApprovePage.vue`, `AdvanceIssuePage.vue`, `ReimburseApprovePage.vue`, `ReimburseDetailPage.vue`, `AdvanceDetailPage.vue`?**
|
|
_High betweenness centrality (0.037) - this node is a cross-community bridge._
|
|
- **Why does `formatAmount()` connect `ApprovalPage.vue` to `PaymentPage.vue`, `format.ts`, `MinePage.vue`, `AdvanceApprovePage.vue`, `AdvanceIssuePage.vue`, `ReimburseApprovePage.vue`, `AllPage.vue`, `ReimburseDetailPage.vue`, `ReimburseListPage.vue`, `ApprovalDetailPage.vue`, `AdvanceDetailPage.vue`, `LoginPage.vue`?**
|
|
_High betweenness centrality (0.033) - this node is a cross-community bridge._
|
|
- **What connects `GlobalComponents`, `name`, `private` to the rest of the system?**
|
|
_485 weakly-connected nodes found - possible documentation gaps or missing edges._
|
|
- **Should `HomePage.vue` be split into smaller, more focused modules?**
|
|
_Cohesion score 0.05052790346907994 - nodes in this community are weakly interconnected._
|
|
- **Should `ApprovalPage.vue` be split into smaller, more focused modules?**
|
|
_Cohesion score 0.05496828752642706 - nodes in this community are weakly interconnected._
|
|
- **Should `PaymentPage.vue` be split into smaller, more focused modules?**
|
|
_Cohesion score 0.046511627906976744 - nodes in this community are weakly interconnected._ |