@brftech/filex-core 0.30.1 → 0.32.0
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.
- package/README.md +37 -2
- package/dist/filex-core.js +10571 -8278
- package/dist/filex-core.js.map +1 -1
- package/dist/filex-core.umd.cjs +95 -87
- package/dist/filex-core.umd.cjs.map +1 -1
- package/dist/index.d.ts +548 -66
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/FileExplorer.vue +1104 -26
- package/src/components/Breadcrumb.vue +4 -2
- package/src/components/CommandPalette.vue +18 -2
- package/src/components/E2eRecoveryUnlockModal.vue +193 -0
- package/src/components/EncryptedFolderModal.vue +10 -0
- package/src/components/FilterBar.vue +244 -0
- package/src/components/GalleryView.vue +48 -0
- package/src/components/GridView.vue +85 -3
- package/src/components/InspectorPanel.vue +231 -8
- package/src/components/ListView.vue +11 -1
- package/src/components/RecoveryKeyModal.vue +133 -0
- package/src/components/SecondaryPane.vue +15 -1
- package/src/components/SideNav.vue +329 -6
- package/src/components/StarButton.vue +27 -15
- package/src/components/Toolbar.vue +235 -49
- package/src/components/ViewSwitcher.vue +81 -0
- package/src/composables/useFileApi.ts +83 -0
- package/src/composables/useKeyboardShortcuts.ts +7 -0
- package/src/index.ts +33 -1
- package/src/lib/e2ecrypto.ts +716 -70
- package/src/lib/fileFilters.ts +143 -0
- package/src/lib/listing.ts +103 -1
- package/src/lib/star.ts +42 -0
- package/src/lib/tags.ts +105 -0
- package/src/locales/en.ts +154 -2
- package/src/locales/tr.ts +154 -2
- package/src/modals/PermissionsModal.vue +18 -2
- package/src/styles/base.css +743 -0
- package/src/types/ExplorerConfig.ts +53 -1
- package/src/types/FileNode.ts +23 -0
package/src/locales/tr.ts
CHANGED
|
@@ -186,6 +186,7 @@ export const tr: Record<string, string> = {
|
|
|
186
186
|
'shortcuts.toggle_hidden': 'Gizli dosyaları göster/gizle',
|
|
187
187
|
'shortcuts.help': 'Bu yardım penceresi',
|
|
188
188
|
'shortcuts.select_all': 'Tümünü seç',
|
|
189
|
+
'shortcuts.star': 'Yıldızla / yıldızı kaldır',
|
|
189
190
|
'shortcuts.rename': 'Yeniden adlandır',
|
|
190
191
|
'shortcuts.delete': 'Sil',
|
|
191
192
|
'shortcuts.cut': 'Kes',
|
|
@@ -227,6 +228,10 @@ export const tr: Record<string, string> = {
|
|
|
227
228
|
/* === koru:k1 === */
|
|
228
229
|
'toolbar.inspector': 'Ayrıntılar',
|
|
229
230
|
'ctx.details': 'Ayrıntılar',
|
|
231
|
+
/* yildiz:s1 — yıldızlamak bir eylem, menüde de öyle görünür. */
|
|
232
|
+
'ctx.star': 'Yıldızla',
|
|
233
|
+
'ctx.unstar': 'Yıldızı kaldır',
|
|
234
|
+
'star.failed': 'Yıldız değiştirilemedi',
|
|
230
235
|
'shortcuts.inspector': 'Ayrıntılar panelini aç/kapat',
|
|
231
236
|
'inspector.title': 'Ayrıntılar',
|
|
232
237
|
'inspector.close': 'Kapat',
|
|
@@ -403,8 +408,8 @@ export const tr: Record<string, string> = {
|
|
|
403
408
|
'e2e.create.pw2_placeholder': 'Parolayı tekrar girin',
|
|
404
409
|
'e2e.create.warn_title': 'GERİ DÖNÜŞÜ YOK',
|
|
405
410
|
'e2e.create.warn_body':
|
|
406
|
-
'
|
|
407
|
-
'e2e.create.ack': 'Anladım: parolayı kaybedersem verilerim kurtarılamaz.',
|
|
411
|
+
'Bu klasördeki dosyalar yalnız bu parolayla ya da klasör oluşturulurken bir kez gösterilen kurtarma anahtarıyla açılır. Parola sunucuda TUTULMAZ; kurtarma anahtarının da filex\'te kopyası kalmaz. İkisini de kaybederseniz içerik sonsuza dek gider.',
|
|
412
|
+
'e2e.create.ack': 'Anladım: parolayı da kurtarma anahtarını da kaybedersem verilerim kurtarılamaz.',
|
|
408
413
|
'e2e.create.ack_required': 'Devam etmek için uyarıyı onaylayın.',
|
|
409
414
|
'e2e.create.pw_short': 'Parola en az 8 karakter olmalı.',
|
|
410
415
|
'e2e.create.pw_mismatch': 'Parolalar birbirini tutmuyor.',
|
|
@@ -428,6 +433,86 @@ export const tr: Record<string, string> = {
|
|
|
428
433
|
'e2e.upload.locked': 'Önce klasörün kilidini açın',
|
|
429
434
|
'e2e.decrypting': 'Çözülüyor…',
|
|
430
435
|
'e2e.decrypt_failed': 'Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).',
|
|
436
|
+
/* wiring:e2 recovery — kurtarma anahtarı + yönetici escrow'u */
|
|
437
|
+
'e2e.create.escrow_title': 'Bu sunucunun da bir anahtarı var',
|
|
438
|
+
'e2e.create.escrow_body':
|
|
439
|
+
'Bu kurulumda anahtar emaneti (escrow) açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir. Escrow sunucu kurulurken sabitlenir; bir klasör için kapatılamaz.',
|
|
440
|
+
'e2e.locked.use_recovery': 'Parolayı mı kaybettiniz? Kurtarma anahtarı kullanın',
|
|
441
|
+
'e2e.recovery.title': 'Kurtarma anahtarınızı saklayın',
|
|
442
|
+
'e2e.recovery.title_upgraded': 'Kurtarma anahtarınız',
|
|
443
|
+
'e2e.recovery.lead':
|
|
444
|
+
'Bu anahtar klasörü parolasız açar. Yalnız bir kez gösterilir — filex bu anahtarı saklamaz ve bir daha gösteremez.',
|
|
445
|
+
'e2e.recovery.lead_upgraded':
|
|
446
|
+
'Bu klasörün artık bir kurtarma anahtarı var. Klasörü parolasız açar, yalnız bir kez gösterilir ve filex\'te kopyası kalmaz.',
|
|
447
|
+
'e2e.recovery.copy': 'Kopyala',
|
|
448
|
+
'e2e.recovery.copied': 'Kopyalandı',
|
|
449
|
+
'e2e.recovery.download': 'Dosya olarak indir',
|
|
450
|
+
'e2e.recovery.warn_title': 'BUNU PAROLA GİBİ SAKLAYIN',
|
|
451
|
+
'e2e.recovery.warn_body':
|
|
452
|
+
'Bu anahtarı eline geçiren herkes klasörü okuyabilir. Parolanızdan ayrı bir yerde tutun — parolanın yanında duran bir anahtar sizi unutmaya karşı korur, başkasına karşı değil.',
|
|
453
|
+
'e2e.recovery.escrow_title': 'Bu sunucunun da bir anahtarı var',
|
|
454
|
+
'e2e.recovery.escrow_body':
|
|
455
|
+
'Bu kurulumda anahtar emaneti açık: sunucunun işletmecisi bu klasörü parolanız olmadan açabilir. O anahtar kullanıldığında size bildirim gelir.',
|
|
456
|
+
'e2e.recovery.escrow_kid': 'Emanet anahtarı',
|
|
457
|
+
'e2e.recovery.ack': 'Bu anahtarı güvenli bir yere kaydettim.',
|
|
458
|
+
'e2e.recovery.done': 'Tamam',
|
|
459
|
+
'e2e.recover.title': 'Parolasız kilit açma',
|
|
460
|
+
'e2e.recover.none':
|
|
461
|
+
'Bu klasör kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden anahtarı yok. Tek giriş yolu parolası. Bir kez parolayla açın, filex kurtarma anahtarı eklemeyi önerecek.',
|
|
462
|
+
'e2e.recover.tab_recovery': 'Kurtarma anahtarı',
|
|
463
|
+
'e2e.recover.tab_escrow': 'Emanet anahtarı',
|
|
464
|
+
'e2e.recover.recovery_hint': 'Klasör oluşturulurken bir kez gösterilen anahtar.',
|
|
465
|
+
'e2e.recover.recovery_placeholder': 'XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX',
|
|
466
|
+
'e2e.recover.escrow_warn_title': 'Klasörün sahibine haber gidecek',
|
|
467
|
+
'e2e.recover.escrow_warn_body':
|
|
468
|
+
'Emanet anahtarıyla açılan klasörün sahibine bildirim gönderilir. Yalnız yetkiniz olduğunda kullanın.',
|
|
469
|
+
'e2e.recover.escrow_kid': 'Emanet anahtarı',
|
|
470
|
+
'e2e.recover.escrow_predates':
|
|
471
|
+
'Bu kurulumun emanet anahtarı var ama bu klasörün yok. Klasör, emanet burada açılmadan önce oluşturulmuş; ana anahtarı emanet kimliğine hiç sarmalanmadı. Emanet anahtarı bu klasörü açmaz. İşletmecinin yapabileceği hiçbir şey bunu değiştirmez — sarmalama için klasörün parolası gerekir ve sunucu onu hiçbir zaman görmedi. Klasörün sahibi verebilir: parolayla kilidi açıp işletmeciye anahtar vermeyi seçebilir. O yapılana kadar parolayı ya da kurtarma anahtarını kullanın.',
|
|
472
|
+
'e2e.recover.escrow_other_key':
|
|
473
|
+
'Bu klasör BAŞKA bir kurulumun emanet anahtarını taşıyor. Başka yerde oluşturulup buraya geri yüklenmiş, bu yüzden bu kurulumun emanet anahtarı onu açmaz. Yalnızca sarmalandığı emanet anahtarının özel yarısı açabilir.',
|
|
474
|
+
'e2e.recover.escrow_placeholder': 'Emanet özel anahtarını yapıştırın (PKCS#8, base64 ya da PEM)',
|
|
475
|
+
'e2e.recover.bad_format':
|
|
476
|
+
'Bu bir kurtarma anahtarına benzemiyor. Dörtlü sekiz grup, toplam 32 karakter olmalı.',
|
|
477
|
+
'e2e.recover.escrow_required': 'Emanet özel anahtarını yapıştırın.',
|
|
478
|
+
'e2e.recover.wrong_recovery': 'Bu kurtarma anahtarı bu klasörü açmıyor.',
|
|
479
|
+
'e2e.recover.wrong_escrow':
|
|
480
|
+
'Bu emanet anahtarı bu klasörü açmıyor. Escrow açılmadan önce oluşturulmuş klasörlerin emanet anahtarı yoktur ve sonradan da eklenemez.',
|
|
481
|
+
'e2e.recover.bad_escrow_key': 'Bu okunabilir bir özel anahtar değil (PKCS#8, base64 ya da PEM bekleniyor).',
|
|
482
|
+
'e2e.recover.notify_failed':
|
|
483
|
+
'Klasör sahibine bildirim gönderilemedi, bu yüzden kilit açılmadı. Emanet anahtarının kullanımı her zaman duyurulur.',
|
|
484
|
+
'e2e.recover.recovery_done': 'Kurtarma anahtarıyla açıldı',
|
|
485
|
+
'e2e.recover.escrow_done': 'Emanet anahtarıyla açıldı — klasör sahibine bildirildi',
|
|
486
|
+
'e2e.recover.unlock': 'Kilidi aç',
|
|
487
|
+
'e2e.recover.busy': 'Açılıyor…',
|
|
488
|
+
'e2e.escrowoffer.title': 'İşletmeciye bu klasörün anahtarı verilsin mi?',
|
|
489
|
+
'e2e.escrowoffer.body':
|
|
490
|
+
'Bu klasör, burada anahtar emaneti açılmadan önce oluşturulmuş; bu yüzden kurulumun işletmecisi onu açamıyor. Şu anda — parolanız bellekteyken — filex bu klasörü emanet anahtarına sarmalayabilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz; yalnızca anahtar dosyası değişir.',
|
|
491
|
+
'e2e.escrowoffer.consequence':
|
|
492
|
+
'Bunun anlamı: işletmeci, parolanız olmadan bu klasöre giren ikinci ve kalıcı bir yol kazanır. O anahtar kullanıldığında size bildirim gelir, ama bu bildirim bir denetim değil yalnızca bir duyurudur.',
|
|
493
|
+
'e2e.escrowoffer.learn_more': 'Emanet anahtarı neyi yapar, neyi yapamaz',
|
|
494
|
+
'e2e.escrowoffer.password_label': 'Klasör parolası',
|
|
495
|
+
'e2e.escrowoffer.password_required': 'Klasör parolasını girin.',
|
|
496
|
+
'e2e.escrowoffer.wrong_password': 'Bu, bu klasörün parolası değil.',
|
|
497
|
+
'e2e.escrowoffer.accept': 'İşletmeciye anahtar ver',
|
|
498
|
+
'e2e.escrowoffer.decline': 'Hayır, bende kalsın',
|
|
499
|
+
'e2e.escrowoffer.cancel': 'Vazgeç',
|
|
500
|
+
'e2e.escrowoffer.busy': 'Sarmalanıyor…',
|
|
501
|
+
'e2e.escrowoffer.done': 'İşletmeci artık bu klasörü emanet anahtarıyla açabilir',
|
|
502
|
+
'e2e.escrowoffer.declined_toast': 'Sizde kaldı. filex bu klasör için bir daha sormayacak.',
|
|
503
|
+
'e2e.escrowoffer.decline_failed':
|
|
504
|
+
'Cevabınız kaydedilemedi, bu yüzden filex bir dahakine yine soracak. Klasörde hiçbir şey değişmedi.',
|
|
505
|
+
'e2e.escrowoffer.failed': 'İşletmeciye bu klasörün anahtarı verilemedi',
|
|
506
|
+
'e2e.escrowoffer.strip_action': 'Emanet anahtarı…',
|
|
507
|
+
'e2e.upgrade.title': 'Bu klasörün kurtarma anahtarı yok',
|
|
508
|
+
'e2e.upgrade.body':
|
|
509
|
+
'Kurtarma anahtarları eklenmeden önce oluşturulmuş, bu yüzden tek giriş yolu parolası. Şu anda — ve yalnız şu anda, parola bellekteyken — filex bir tane ekleyebilir. Dosyalarınız yeniden şifrelenmez, hiçbir yere taşınmaz.',
|
|
510
|
+
'e2e.upgrade.escrow_note':
|
|
511
|
+
'Not: bu kurulumda anahtar emaneti açık; kurtarma anahtarı eklemek aynı zamanda işletmecinin bu klasörü parolanız olmadan açabilmesi demektir.',
|
|
512
|
+
'e2e.upgrade.accept': 'Kurtarma anahtarı oluştur',
|
|
513
|
+
'e2e.upgrade.decline': 'Şimdi değil',
|
|
514
|
+
'e2e.upgrade.busy': 'Oluşturuluyor…',
|
|
515
|
+
'e2e.upgrade.failed': 'Bu klasöre kurtarma anahtarı eklenemedi',
|
|
431
516
|
'e2e.download.failed': 'Şifreli dosya indirilemedi.',
|
|
432
517
|
/* /wiring:e2 */
|
|
433
518
|
|
|
@@ -866,6 +951,13 @@ export const tr: Record<string, string> = {
|
|
|
866
951
|
'empty.starred.hint': 'Bir dosyayı yıldızla, burada bulasın',
|
|
867
952
|
'empty.shared.title': 'Seninle henüz bir şey paylaşılmadı',
|
|
868
953
|
'empty.shared.hint': 'Başkalarının paylaştığı klasör ve dosyalar burada görünür',
|
|
954
|
+
/* etiket:t1 */
|
|
955
|
+
'sidenav.tags': 'Etiketler',
|
|
956
|
+
'sidenav.tags.empty': 'Henüz etiket yok — bir dosyaya sağ tıklayıp Etiketler’den ekleyebilirsin.',
|
|
957
|
+
'sidenav.tags.more': '{count} tane daha göster',
|
|
958
|
+
'sidenav.tags.less': 'Daha az göster',
|
|
959
|
+
'empty.tag.title': '“{tag}” etiketli hiçbir şey yok',
|
|
960
|
+
'empty.tag.hint': 'Bir dosyaya sağ tıklayıp Etiketler’i seç, burada görünsün',
|
|
869
961
|
'sidenav.connections': 'Bağlantılar',
|
|
870
962
|
'sidenav.connect': 'Nasıl bağlanılır',
|
|
871
963
|
'sidenav.apikeys': 'API anahtarları',
|
|
@@ -877,4 +969,64 @@ export const tr: Record<string, string> = {
|
|
|
877
969
|
'conn.tokens.expiryNever': 'süresiz',
|
|
878
970
|
'conn.tokens.capNote': 'Tavan hesabın ve yetkilerin — sahip olduğundan fazlasını istemek reddedilir, verilmez.',
|
|
879
971
|
/* === /gezinti:g1 === */
|
|
972
|
+
|
|
973
|
+
/* === surucu:d1 — Sürücü kabuğu (uiProfile: 'drive', GitHub #14) ======== */
|
|
974
|
+
'drive.new': 'Yeni',
|
|
975
|
+
'drive.new.upload': 'Dosya yükle',
|
|
976
|
+
'drive.new.folder': 'Yeni klasör',
|
|
977
|
+
'drive.new.request': 'Dosya iste',
|
|
978
|
+
'drive.search.placeholder': '{scope} içinde ara',
|
|
979
|
+
'drive.search.placeholder_all': 'Dosyalarında ara',
|
|
980
|
+
'drive.search.hint_title': 'Her yerde ara ve komut çalıştır ({combo})',
|
|
981
|
+
'drive.storage.used': '{total} alanın {used} kadarı dolu',
|
|
982
|
+
'drive.storage.used_unlimited': '{used} kullanılıyor',
|
|
983
|
+
'drive.storage.label': 'Depolama',
|
|
984
|
+
'drive.section.folders': 'Klasörler',
|
|
985
|
+
'drive.section.files': 'Dosyalar',
|
|
986
|
+
'filter.aria': 'Süzgeçler',
|
|
987
|
+
'filter.type': 'Tür',
|
|
988
|
+
'filter.type.any': 'Her tür',
|
|
989
|
+
'filter.type.folder': 'Klasörler',
|
|
990
|
+
'filter.type.document': 'Belgeler',
|
|
991
|
+
'filter.type.spreadsheet': 'Hesap tabloları',
|
|
992
|
+
'filter.type.presentation': 'Sunumlar',
|
|
993
|
+
'filter.type.pdf': 'PDF’ler',
|
|
994
|
+
'filter.type.image': 'Görseller',
|
|
995
|
+
'filter.type.video': 'Videolar',
|
|
996
|
+
'filter.type.audio': 'Ses dosyaları',
|
|
997
|
+
'filter.type.archive': 'Arşivler',
|
|
998
|
+
'filter.type.code': 'Kod',
|
|
999
|
+
'filter.modified': 'Değiştirilme',
|
|
1000
|
+
'filter.modified.any': 'Her zaman',
|
|
1001
|
+
'filter.modified.today': 'Bugün',
|
|
1002
|
+
'filter.modified.7d': 'Son 7 gün',
|
|
1003
|
+
'filter.modified.30d': 'Son 30 gün',
|
|
1004
|
+
'filter.modified.year': 'Bu yıl',
|
|
1005
|
+
'filter.size': 'Boyut',
|
|
1006
|
+
'filter.size.any': 'Her boyut',
|
|
1007
|
+
'filter.size.lt1': '1 MB altı',
|
|
1008
|
+
'filter.size.1to10': '1 - 10 MB',
|
|
1009
|
+
'filter.size.10to100': '10 - 100 MB',
|
|
1010
|
+
'filter.size.gt100': '100 MB üstü',
|
|
1011
|
+
'filter.clear': 'Süzgeçleri temizle',
|
|
1012
|
+
'filter.empty.title': 'Bu süzgeçlere uyan bir şey yok',
|
|
1013
|
+
'filter.empty.hint': 'Bir süzgeci kaldır ya da yukarıdaki alandan her yerde ara.',
|
|
1014
|
+
'filter.count': '{total} ögeden {shown} tanesi',
|
|
1015
|
+
'inspector.tab.details': 'Ayrıntılar',
|
|
1016
|
+
'inspector.tab.activity': 'Etkinlik',
|
|
1017
|
+
'inspector.people': 'Erişimi olan kişiler',
|
|
1018
|
+
'inspector.people.you': 'Sen',
|
|
1019
|
+
'inspector.people.inherited': 'üst klasörden',
|
|
1020
|
+
'inspector.people.empty': 'Yalnızca sen ve aşağıdaki bağlantıya sahip olanlar.',
|
|
1021
|
+
'inspector.people.manage': 'Erişimi yönet',
|
|
1022
|
+
'inspector.link': 'Paylaşım bağlantısı',
|
|
1023
|
+
'inspector.link.none': 'Paylaşılmadı',
|
|
1024
|
+
'inspector.link.create': 'Bağlantı oluştur',
|
|
1025
|
+
'inspector.link.copy': 'Bağlantıyı kopyala',
|
|
1026
|
+
'inspector.activity.empty': 'Bu öge için henüz etkinlik kaydı yok.',
|
|
1027
|
+
'inspector.activity.hint': 'Sürümler dosya değiştikçe, yorumlar ise insanlar yazdıkça birikir.',
|
|
1028
|
+
'inspector.activity.version': '{n}. sürüm kaydedildi',
|
|
1029
|
+
'inspector.activity.comment': '{who} yorum yaptı',
|
|
1030
|
+
'inspector.activity.select': 'Etkinliğini görmek için bir dosya ya da klasör seç.',
|
|
1031
|
+
/* === /surucu:d1 === */
|
|
880
1032
|
};
|
|
@@ -19,6 +19,20 @@ const props = defineProps<{
|
|
|
19
19
|
/** Server ceiling on a new link's life in days (capabilities.share_max_ttl_days).
|
|
20
20
|
* undefined/0 = no ceiling. The expiry choices are derived from it. */
|
|
21
21
|
shareMaxTtlDays?: number;
|
|
22
|
+
/**
|
|
23
|
+
* surucu:d1 — which tab this modal opens on. Absent = 'perms', the behaviour
|
|
24
|
+
* every existing caller has.
|
|
25
|
+
*
|
|
26
|
+
* The drive shell's "Request files" needs 'drop': the file-drop link already
|
|
27
|
+
* lives in this modal, and a menu entry that opens it on the permissions tab
|
|
28
|
+
* and leaves the user to find the third tab is a menu entry that lied about
|
|
29
|
+
* what it does.
|
|
30
|
+
*
|
|
31
|
+
* ⚠ A hint, not a lock: `load()` still falls back to 'share' when the caller
|
|
32
|
+
* turns out not to be an owner, because the permissions tab is not theirs to
|
|
33
|
+
* see.
|
|
34
|
+
*/
|
|
35
|
+
initialTab?: 'perms' | 'share' | 'drop';
|
|
22
36
|
}>();
|
|
23
37
|
const emit = defineEmits<{ (e: 'close'): void }>();
|
|
24
38
|
|
|
@@ -37,7 +51,7 @@ const pathParts = computed(() => {
|
|
|
37
51
|
});
|
|
38
52
|
|
|
39
53
|
type Tab = 'perms' | 'share' | 'drop';
|
|
40
|
-
const tab = ref<Tab>('perms');
|
|
54
|
+
const tab = ref<Tab>(props.initialTab ?? 'perms');
|
|
41
55
|
const canManage = ref(false); // owner/admin → can see the permissions tab
|
|
42
56
|
|
|
43
57
|
// ── permissions state ──
|
|
@@ -185,7 +199,9 @@ async function reload() {
|
|
|
185
199
|
if (st === 403) {
|
|
186
200
|
canManage.value = false;
|
|
187
201
|
// Editor (not owner): no permissions tab → fall back to the link tab.
|
|
188
|
-
|
|
202
|
+
// ⚠ Unless the caller asked for a specific one: "Request files" opens
|
|
203
|
+
// 'drop', which an editor may perfectly well use.
|
|
204
|
+
if (!props.initialTab || props.initialTab === 'perms') tab.value = 'share';
|
|
189
205
|
} else {
|
|
190
206
|
err.value = e instanceof Error ? e.message : String(e);
|
|
191
207
|
}
|