fastapi-voyager 0.15.1__py3-none-any.whl → 0.15.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "0.15.1"
2
+ __version__ = "0.15.2"
@@ -101,6 +101,30 @@
101
101
  }
102
102
  }
103
103
 
104
+ /* Tag Navigator Collapse Button */
105
+ .tag-navigator-collapse-btn-right {
106
+ position: absolute;
107
+ bottom: 8px;
108
+ left: 8px;
109
+ width: 32px;
110
+ height: 32px;
111
+ border-radius: 50%;
112
+ background: #009485;
113
+ color: white;
114
+ border: 2px solid white;
115
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
116
+ cursor: pointer;
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ z-index: 100;
121
+ transition: all 0.2s ease;
122
+ }
123
+ .tag-navigator-collapse-btn-right:hover {
124
+ background: #007a6d;
125
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
126
+ }
127
+
104
128
  /* App boot loading overlay & gating */
105
129
  #app-loading-overlay {
106
130
  position: fixed;
@@ -352,7 +376,7 @@
352
376
  <q-splitter
353
377
  v-model="store.state.leftPanel.width"
354
378
  unit="px"
355
- :limits="store.state.mode === 'voyager' ? [200, 800] : [0, 0]"
379
+ :limits="store.state.mode === 'voyager' ? [0, 800] : [0, 0]"
356
380
  class="adjust-fit"
357
381
  >
358
382
  <template #before>
@@ -509,6 +533,19 @@
509
533
  />
510
534
  </div>
511
535
  </div>
536
+
537
+ <!-- Collapse toggle button for tag navigator - at bottom-left of right panel -->
538
+ <div
539
+ v-show="store.state.mode === 'voyager'"
540
+ class="tag-navigator-collapse-btn-right"
541
+ @click="toggleTagNavigatorCollapse"
542
+ :title="store.state.leftPanel.collapsed ? 'Expand tag navigator' : 'Collapse tag navigator'"
543
+ >
544
+ <q-icon
545
+ :name="store.state.leftPanel.collapsed ? 'chevron_right' : 'chevron_left'"
546
+ size="18px"
547
+ />
548
+ </div>
512
549
  </div>
513
550
  </template>
514
551
  </q-splitter>
@@ -41,9 +41,11 @@ const state = reactive({
41
41
  width: 300,
42
42
  previousWidth: 300,
43
43
  tags: null,
44
+ fullTagsCache: null, // Cache for full tags (before search)
44
45
  tag: null,
45
46
  _tag: null,
46
47
  routeId: null,
48
+ collapsed: false,
47
49
  },
48
50
 
49
51
  graph: {
@@ -42,9 +42,13 @@ const app = createApp({
42
42
  graphUI = new GraphUI("#graph", {
43
43
  onSchemaShiftClick: (id) => {
44
44
  if (store.state.graph.schemaKeys.has(id)) {
45
- store.state.previousTagRoute.tag = store.state.leftPanel.tag
46
- store.state.previousTagRoute.routeId = store.state.leftPanel.routeId
47
- store.state.previousTagRoute.hasValue = true
45
+ // Only save current tag/route if we're not already in search mode
46
+ // This prevents overwriting the saved state with null values
47
+ if (!store.state.previousTagRoute.hasValue && !store.state.search.mode) {
48
+ store.state.previousTagRoute.tag = store.state.leftPanel.tag
49
+ store.state.previousTagRoute.routeId = store.state.leftPanel.routeId
50
+ store.state.previousTagRoute.hasValue = true
51
+ }
48
52
  store.state.search.mode = true
49
53
  store.state.search.schemaName = id
50
54
  onSearch()
@@ -183,9 +187,9 @@ const app = createApp({
183
187
 
184
188
  async function resetSearch() {
185
189
  store.state.search.mode = false
186
- console.log(store.state.previousTagRoute.hasValue)
187
- console.log(store.state.previousTagRoute)
188
- if (store.state.previousTagRoute.hasValue) {
190
+ const hadPreviousValue = store.state.previousTagRoute.hasValue
191
+
192
+ if (hadPreviousValue) {
189
193
  store.state.leftPanel.tag = store.state.previousTagRoute.tag
190
194
  store.state.leftPanel._tag = store.state.previousTagRoute.tag
191
195
  store.state.leftPanel.routeId = store.state.previousTagRoute.routeId
@@ -197,12 +201,25 @@ const app = createApp({
197
201
  }
198
202
 
199
203
  syncSelectionToUrl()
200
- await loadSearchedTags()
201
- renderBasedOnInitialPolicy()
204
+
205
+ // Load the full tags from cache (not search results) since we're resetting search
206
+ loadFullTags()
207
+
208
+ // If we restored a previous tag/route, generate with it
209
+ // Otherwise, fall back to initial policy
210
+ if (hadPreviousValue) {
211
+ onGenerate()
212
+ } else {
213
+ renderBasedOnInitialPolicy()
214
+ }
215
+ }
216
+
217
+ function loadFullTags() {
218
+ // Restore from cache (set by loadInitial)
219
+ store.state.leftPanel.tags = store.state.leftPanel.fullTagsCache
202
220
  }
203
221
 
204
222
  async function onSearch() {
205
- console.log("start search")
206
223
  store.state.search.mode = true
207
224
  store.state.leftPanel.tag = null
208
225
  store.state.leftPanel._tag = null
@@ -241,7 +258,10 @@ const app = createApp({
241
258
  try {
242
259
  const res = await fetch("dot")
243
260
  const data = await res.json()
244
- store.state.leftPanel.tags = Array.isArray(data.tags) ? data.tags : []
261
+ const tags = Array.isArray(data.tags) ? data.tags : []
262
+ store.state.leftPanel.tags = tags
263
+ // Cache the full tags for later use (e.g., resetSearch)
264
+ store.state.leftPanel.fullTagsCache = tags
245
265
 
246
266
  const schemasArr = Array.isArray(data.schemas) ? data.schemas : []
247
267
  // Build dict keyed by id for faster lookups and simpler prop passing
@@ -430,6 +450,22 @@ const app = createApp({
430
450
  syncSelectionToUrl()
431
451
  }
432
452
 
453
+ function toggleTagNavigatorCollapse() {
454
+ if (store.state.leftPanel.collapsed) {
455
+ // Expand: restore previous width
456
+ const fallbackWidth = store.state.leftPanel.previousWidth || 300
457
+ store.state.leftPanel.width = fallbackWidth
458
+ store.state.leftPanel.collapsed = false
459
+ } else {
460
+ // Collapse: save current width and set to 0
461
+ if (store.state.leftPanel.width > 0) {
462
+ store.state.leftPanel.previousWidth = store.state.leftPanel.width
463
+ }
464
+ store.state.leftPanel.width = 0
465
+ store.state.leftPanel.collapsed = true
466
+ }
467
+ }
468
+
433
469
  function selectRoute(routeId) {
434
470
  // find belonging tag
435
471
  const belongingTag = findTagByRoute(routeId)
@@ -558,6 +594,7 @@ const app = createApp({
558
594
  filterSearchSchemas,
559
595
  onSearchSchemaChange,
560
596
  toggleTag,
597
+ toggleTagNavigatorCollapse,
561
598
  toggleBrief,
562
599
  toggleHidePrimitiveRoute,
563
600
  selectRoute,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-voyager
3
- Version: 0.15.1
3
+ Version: 0.15.2
4
4
  Summary: Visualize FastAPI application's routing tree and dependencies
5
5
  Project-URL: Homepage, https://github.com/allmonday/fastapi-voyager
6
6
  Project-URL: Source, https://github.com/allmonday/fastapi-voyager
@@ -9,7 +9,7 @@ fastapi_voyager/render_style.py,sha256=mPOuChEl71-3agCbPwkMt2sFmax2AEKDI6dK90eFP
9
9
  fastapi_voyager/server.py,sha256=MUc_ia3_QIbYQ8VenOxv3CEYVTiPDs7e_H40YoalxZs,8970
10
10
  fastapi_voyager/type.py,sha256=zluWvh5vpnjXJ9aAmyNJTSmXZPjAHCvgRT5oQRAjHrg,2104
11
11
  fastapi_voyager/type_helper.py,sha256=FmfrZAI3Z4uDdh3sH_kH7UGoY6yNVPapneSN86qY_wo,10209
12
- fastapi_voyager/version.py,sha256=BSYny8QjMZlFFaTEx2paWbmn9s5pXE5CYgdpnEf49W8,49
12
+ fastapi_voyager/version.py,sha256=MNw2WhSygJJXBlu1ZTOV_kDUGMOPYB98_73ZGP4k0S4,49
13
13
  fastapi_voyager/voyager.py,sha256=4vonmL-xt54C5San-DRBq4mjoV8Q96eoWRy68MJ1IJw,14169
14
14
  fastapi_voyager/templates/dot/cluster.j2,sha256=I2z9KkfCzmAtqXe0gXBnxnOfBXUSpdlATs3uf-O8_B8,307
15
15
  fastapi_voyager/templates/dot/cluster_container.j2,sha256=2tH1mOJvPoVKE_aHVMR3t06TfH_dYa9OeH6DBqSHt_A,204
@@ -27,11 +27,11 @@ fastapi_voyager/templates/html/schema_table.j2,sha256=rzphiGk1il7uv4Gr2p_HLPHqyL
27
27
  fastapi_voyager/web/graph-ui.js,sha256=cmEcM35rQsR6eQA2Sc8zJ_MOA0UfEQ9WvGA1zNInUUc,6285
28
28
  fastapi_voyager/web/graphviz.svg.css,sha256=K218ov_mdSe3ga4KwhiBB92ynVvm5zaAk9_D9a3d8hE,1546
29
29
  fastapi_voyager/web/graphviz.svg.js,sha256=deI815RgxpZ3_MpELeV-TBYy2MVuUvZtQOHfS3aeXHY,18203
30
- fastapi_voyager/web/index.html,sha256=NQCbf3FDJVOOoep-nKh-RVsSlAK9E_eCYQ3LfGgJe-c,21987
30
+ fastapi_voyager/web/index.html,sha256=lA59Op4u1bb-B105Iadn2KN_n11-AtXFdJglUezZIDg,23225
31
31
  fastapi_voyager/web/quasar.min.css,sha256=F5jQe7X2XT54VlvAaa2V3GsBFdVD-vxDZeaPLf6U9CU,203145
32
32
  fastapi_voyager/web/quasar.min.js,sha256=h0ftyPMW_CRiyzeVfQqiup0vrVt4_QWojpqmpnpn07E,502974
33
- fastapi_voyager/web/store.js,sha256=wLI9k7q-NuprpGd_We_laTJ35te5XX5dRIIrPn257Rg,1934
34
- fastapi_voyager/web/vue-main.js,sha256=lWe_MUwYGE4q3s4eWhjLZlcYZTjxklp_1wGvW-eedj0,18657
33
+ fastapi_voyager/web/store.js,sha256=h9WLKgFdmHrF9riirX-3FnCODZzeNZcvnxqZvfFnXLw,2020
34
+ fastapi_voyager/web/vue-main.js,sha256=49iJ_uoXde-jcYJpS-_Gd10zGuxo_nhp1-LAAsFzyVc,20034
35
35
  fastapi_voyager/web/component/demo.js,sha256=sAklFGhKGmMy9-ofgOw2oPIidAoIOgHu6yvV51L_MAA,350
36
36
  fastapi_voyager/web/component/render-graph.js,sha256=9wnO70n3eyPKTpa744idgs5PSwgvzbfv4InZ68eEOKs,2454
37
37
  fastapi_voyager/web/component/route-code-display.js,sha256=a823nBz3EEjutW2pfi73rcF3hodCBmgYNmuZi94sXE4,3615
@@ -43,8 +43,8 @@ fastapi_voyager/web/icon/favicon-16x16.png,sha256=JC07jEzfIYxBIoQn_FHXvyHuxESdhW
43
43
  fastapi_voyager/web/icon/favicon-32x32.png,sha256=C7v1h58cfWOsiLp9yOIZtlx-dLasBcq3NqpHVGRmpt4,1859
44
44
  fastapi_voyager/web/icon/favicon.ico,sha256=tZolYIXkkBcFiYl1A8ksaXN2VjGamzcSdes838dLvNc,15406
45
45
  fastapi_voyager/web/icon/site.webmanifest,sha256=GRozZ5suTykYcPMap1QhjrAB8PLW0mbT_phhzw_utvQ,316
46
- fastapi_voyager-0.15.1.dist-info/METADATA,sha256=DsiVefq6CHjYmQmRox7zjSKIehv3H8e7DMU_KZgXdGA,8513
47
- fastapi_voyager-0.15.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
48
- fastapi_voyager-0.15.1.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
49
- fastapi_voyager-0.15.1.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
50
- fastapi_voyager-0.15.1.dist-info/RECORD,,
46
+ fastapi_voyager-0.15.2.dist-info/METADATA,sha256=O7X7HJ1JMuXk_bJJ93gre1ESQOaeyBxWj4UtYtku1jo,8513
47
+ fastapi_voyager-0.15.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
48
+ fastapi_voyager-0.15.2.dist-info/entry_points.txt,sha256=pEIKoUnIDXEtdMBq8EmXm70m16vELIu1VPz9-TBUFWM,53
49
+ fastapi_voyager-0.15.2.dist-info/licenses/LICENSE,sha256=lNVRR3y_bFVoFKuK2JM8N4sFaj3m-7j29kvL3olFi5Y,1067
50
+ fastapi_voyager-0.15.2.dist-info/RECORD,,