Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· kamo-shared-library
Halaman dan filter kutipan akun dalam basis data
Sebuah tampilan akun membutuhkan setiap kutipan di semua petunjuk. Memuat mereka untuk membuat halaman degrade setiap bulan akun sedang digunakan, dan total yang ditampilkan hanya akan mencakup apa diambil - begitu paging, penyaringan dan menyortir semua terjadi di SQL. Query ini asli karena Quote hanya memiliki leadId lembut tanpa asosiasi untuk bergabung melalui; bergabung leads.uid = commerce _ quotes.lead _ id dan scopes pada leads.account _ uid. Menarik akun tersebut mengarah ke dalam daftar tidak akan bertahan dari sebuah buku besar bisnis. Setiap filter adalah predikat yang dijaga ketat, jadi satu permintaan melayani kisi tak tersaring dan apapun kombinasi dari filter daripada metode per permutasi. Tombol pengurutan allow- terdaftar: nilai mencapai ORDER OLEH asli, sehingga menerima nama lapangan sewenang-wenang dari klien akan menjadi titik suntikan. Daftar Proyeksi juga memperoleh nilai, diterima, versi dan jumlah pilihan / baris - sebuah gambaran dibaca untuk "berapa lama ini telah keluar, apakah itu tanah", yang sebelumnya bidang tidak bisa menjawab.
· kamo-signer-monorepo
Tampilkan agen yang ditugaskan pada salinan pelanggan
Cocok dengan pratinjau staf: nama letterhead org, nama ini orang untuk bertanya.
· kamo-internal
Tampilkan agen yang ditugaskan pada pratinjau
Sebuah panel "Kontak Anda" di atas kaki - nama, judul, telepon dan email - sehingga pelanggan tahu siapa yang harus ditanya tentang harga. Tidak ada sepenuhnya ketika memimpin tidak ditugaskan.
· SecurityService
Selesaikan agen di samping pelanggan, dari satu pencarian memimpin
Kedua blok datang dari lead yang sama, sehingga controller mengambilnya sekali dan memperoleh masing-masing dari itu daripada memukul layanan dua kali per render. Masih orgasme-scoped di kedua tempat; di halaman publik lingkup berasal dari berbagi link organisasi sendiri.
· kamo-shared-library
Nama agen yang ditugaskan memimpin pada dokumen
The letterhead mengidentifikasi org, tetapi pelanggan dengan pertanyaan tentang kebutuhan harga orang yang memiliki hubungan. Kutipan sekarang membawa memimpin apos; s agen ditugaskan - nama, judul pekerjaan, email kerja dan telepon kerja. Rincian kontak kerja saja: kutipan membawa identitas bisnis agen, tidak pernah Nomor pribadi yang kebetulan ada di catatan anggota mereka. Judul tugas lebih suka jobTitleOfficial, yang adalah apa org memilih untuk mencetak, sebelum JobTitleOfficial terkait. Petunjuk yang tidak ditugaskan, atau agen tanpa catatan, menghasilkan tidak ada blok daripada sebuah "Kontak Anda" menuju ruang kosong. Resolusi nama reuses * * * * * * * * * * * * * * * * jalur yang sama Controller sudah digunakan untuk petugas pinjaman ditugaskan, sehingga kutipan nama agen persis sebagai sisa dari pandangan utama tidak.
· kamo-internal
Reassign agen memegang kesempatan
Dialog saksi mendapatkan agen picker, ditarik dari kolam yang sama backend validasi melawan. Grid Agen kolom sekarang menunjukkan yang HOLDS kesempatan, dengan amber "Reassigned dari"... judul ketika itu tidak lagi agen yang bertanya - pemohon tetap pada catatan dan dalam sejarah baik cara. Kontrol lead- header mengikuti pemegang juga. Itu membuat para pemohon tertarik, yang setelah penugasan kembali akan ditawarkan dialog ekstensi ke agen yang tidak lagi memiliki dan menyembunyikannya dari orang yang melakukannya - dan gerbang backend bahwa titik akhir pada pemegang, sehingga tawaran akan berakhir di 403.
· SecurityService
Atur ulang agen induk, dan email semua orang yang terpengaruhi
Seorang saksi sekarang bisa memberikan kesempatan untuk agen yang berbeda. Para pemohon adalah tidak pernah ditulis ulang - applyPrimaryAgent mencatat langkah sebagai baris sejarahnya sendiri dengan kedua nama, jadi enam bulan kemudian catatan menunjukkan bahwa itu bergerak daripada Membaca seolah-olah agen baru memintanya. Kepemilikan ekstensi, tajuk lead- kontrol dan masker detail semua mengikuti pemegang sekarang; "Agen" cocok Akhir dari penugasan, karena menyembunyikannya dari agen yang menemukannya dan dari agen yang memegang itu keduanya jawaban yang salah. Sembilan pemberitahuan meliputi lifecycle tersebut. Permintaan dan permintaan ekstensi pergi ke setiap orang yang dapat memutuskan mereka - baik hak keputusan, karena anggota yang hanya bisa menyangkal tidak akan pernah belajar permintaan ada untuk menyangkal. Keputusan dan edits pergi kepada pemegang, yang asli permintaan ketika yang berbeda, dan setiap rekan pada komisi split; sebuah Edit surat tambahan siapa pun yang dipindahkan, karena kehilangan berbagi komisi diam-diam persis apa email ini untuk. Dua hal terjadi dalam proses pengiriman: - Resolusi dan rendering terjadi secara mudah, di dalam transaksi penelepon, sementara entitas masih memegang nilai email adalah tentang. Persetujuan () membersihkan ruas ekstensi segera setelah, sehingga membaca kemudian akan menggambarkan "tidak tambahan waktu "pada email yang subjek adalah berapa banyak waktu yang diberikan. - The SENDING menunggu untuk * * * * * * * * * * * * * * * * * Mengumumkan keputusan bahwa kegagalan yang terjadi kemudian akan meninggalkan agen memegang email untuk persetujuan yang tidak pernah terjadi, dan aftercompletion daripada afterCommit berarti koneksi basis data dirilis sebelum outbound HTTP dimulai. Nilai tabel detail- yang lolos pada titik mereka memasukkan peta: nama anggota org- memasukkan teks bebas, tabel disuntikkan sebagai HTML mentah, dan lolos perender Tidak ada. Sebuah sunting yang mengubah tidak ada mengirim surat, dan sebuah reservasi PENDING mengirim tidak ada "diperbarui" - tidak ada yang diberitahu itu belum ada. 60 tes.
· EmailService
Pratilik contoh untuk sembilan pemberitahuan kesempatan
Tanpa lengan di sini admin Email Templat editor menghasilkan setiap plaseholder kosong, jadi siapa saja yang menyesuaikan sembilan ini akan mengedit kerangka kosong. Satu lengan untuk semua sembilan: mereka berbagi variabel set dengan desain, sehingga peta contoh tunggal Membuat mereka semua setia. Map.ofEntries karena Map.of caps di sepuluh (Dan kasur-kasur yang tebal lagi empuk) yang diletakkan di atas dipan-dipan.
· InitializerService
Agen primer yang dapat dibuka kembali pada kesempatan tertentu
PRIMARY _ AGEN _ MEMBER _ ID adalah yang memegang kesempatan sekarang; REQUESTED _ BY _ MEMBER _ ID dibiarkan tak tersentuh selamanya. Bernomor tanpa backfill pada tujuan - kosong berarti "Tidak pernah dipindahkan", dan menyalin permintaan ke baris yang ada akan menghancurkan bahwa perbedaan pada setiap reservasi yang mendahului kolom. Terapan terhadap produksi pada 2026-08-04; kolom dan indeks diverifikasi hadir.
· kamo-shared-library
Dapat dibaca ulang agen primer, dan sembilan template pemberitahuan
Seorang saksi dapat memberikan kesempatan - dan komisi dengan itu - untuk yang berbeda Agen. PRIMARY _ AGEN _ MEMBER _ ID adalah yang memegang sekarang; REQUESTED _ BY _ MEMBER _ ID adalah tidak pernah ditulis lagi, karena siapa yang menemukan kesepakatan adalah fakta tentang masa lalu dan overwrite itu akan menghapus satu-satunya catatan bahwa agen asli membawanya masuk Nall berarti "tidak pernah dipindahkan", yang merupakan pernyataan yang berbeda dari "dipindahkan kembali ke permintaan "- sehingga baris yang ada ditinggalkan sendirian daripada backfilled. effectiveAgentgency Anggota () adalah pemegang, dan itu adalah apa yang sekarang memutuskan yang mungkin meminta ekstensi dan siapa kepala utama memperlakukan sebagai pemilik. Sekali kesempatan bergerak, pemilik asli adalah nama dalam sejarah, bukan klaim di atasnya. Sembilan templat kanonikal menutupi garis hidup: permintaan atau permintaan ekstensi pergi untuk semua orang yang bisa memutuskan itu; setiap persetujuan, penolakan, sunting, perintah ekstensi, berakhir dan dekat pergi ke agen memegang itu, agen yang bertanya apakah itu sekarang orang lain, dan setiap rekan pada pembagian komisi. Mereka berbagi satu shell yang dihasilkan sehingga tata letak tidak dapat melayang antara mereka, dan satu set variabel sehingga sebuah template dapat mereferensikan apapun tanpa sebuah perubahan Java yang cocok - Yang penting karena variabel hilang render sebagai string kosong dengan hanya WARN, dan kapal email membaca "reserved until".
· kamo-internal
Overall komisi, standar pasar, dan tidak ada unit yang dipilih sebelumnya
Tiga perubahan bagaimana komisi ditangkap. Tidak ada yang pertama kali dipilih lagi. Percent / Amount dan One-time / Recurring keduanya mulai unset pada setiap komisi split, sehingga masing-masing menyatakan jenisnya karena seseorang bilang begitu. Sebuah pre- dipilih "Percent" tidak dapat dibedakan dari yang dipertimbangkan pilihan, dan perbedaan antara 15% dari penjualan dan $15 adalah seluruh pembayaran. Kirim tetap tidak aktif sampai baris dimulai selesai. Persetujuan sekarang setuju komisi OVERALL - apa organisasi membayar pada dijual kepada agen meminta dan kelompok mereka berbagi dengan, dari mana rekan kerja split diukir. Tampak dalam menyetujui dan mengedit dialog dan sebagai kolom pada daftar cadangan, dan pasar dapat membawa default yang pre- fills itu. Pasar default pre- mengisi APPROVAL saja. Mencari edit dari pasar akan biarkan menyimpan yang tentang tanggal cap pada komisi tidak ada yang setuju, dan akan membuat "tidak ada komisi" mustahil untuk menjaga. Membersihkan sosok prefilled sekarang mengirimkan eksplisit clearCommission, dilacak terhadap apa bentuk DIBUKA dengan daripada apa yang disimpan - jika tidak menghapus sebuah baku yang telah diisi sebelumnya mengirim apa-apa dan server membantu menempatkan langsung kembali. Juga: pasar setengah diisi default sekarang blok menyimpan bukan diturunkan dan dilaporkan sebagai sukses; kolom komisi tidak lagi menciptakan "one-time" ketika tidak ada cadence telah diset; jumlah terbagi dalam tooltip gunakan uang yang sama format sebagai kolom; dan Tambah Pasar membersihkan ruas kutipan itu berasal dari kolom terakhir Pasar diedit.
· SecurityService
Setuju komisi keseluruhan pada persetujuan, berasal dari pasar
Pendatang sekarang mencatat apa organisasi membayar pada penjualan kepada meminta Agen dan kelompok mereka. Keluarkan dengan persetujuan dan pasar utama berlaku - itulah yang membuat pasar menetapkan default daripada saran hanya UI menghormati. applyCommission set the three fields together and never merges them field- wise dengan apa yang tersimpan. Menggabungkan terlihat tidak berbahaya dan tidak: edit hanya membawa tipe berbagi akan flip yang disimpan 15 dari lima belas persen menjadi lima belas dolar, kembali - denominating pembayaran tidak ada yang dimaksudkan untuk menyentuh. Default pasar yang tidak valid atau setengah-konfigurasi log dan diabaikan daripada tidak dilempar. Sebuah default adalah kenyamanan, bukan hukum, dan satu disimpan melalui beberapa jalan lain dengan sosok omong kosong tidak harus berubah menjadi unaccivable-out pasar - yang Persetujuan masih bisa mengetik komisi dalam, dan menyetujui tanpa satu adalah sah. ClearCommission dihormati di depan segalanya, termasuk standar pasar: seorang saksi yang menghapus tokoh prefilled telah membuat keputusan, dan diam-diam Meletakkannya kembali akan membalikkannya. 49 tes, termasuk jalur yang jelas, penjaga penggabungan, dan kedua kasus yang buruk.
· InitializerService
Kolom komisi bagi peluang cadangan dan standar pasar
Enam kolom bernull: keseluruhan komisi disepakati pada kesempatan yang disediakan, dan pasar default yang sebelum-mengisinya dengan persetujuan. NUMERIC (19.4) untuk mencocokkan tabel split - uang adalah desimal yang tepat atau komision sengketa mengikuti. Terapan terhadap produksi pada 2026-08-04; semua enam diverifikasi hadir.
· kamo-shared-library
Komisi keseluruhan pada penjualan, dan standar pasar untuk itu
Sebuah kesempatan dilindungi sekarang mencatat apa organisasi membayar dari penjualan ke agen yang meminta dan kelompok mereka berbagi dengan - panci yang per- rekan Pisah yang diukir dari. Sebuah pasar utama membawa default yang pre- fills itu ketika Persetujuan dikabulkan. Setiap kolom bisa dibuang tanpa default. Sebuah pemesanan tidak ada yang disetujui telah tidak komisi setuju dan pasar yang belum dikonfigurasi tidak memiliki standar; menulis nol ke baik akan menempatkan angka tidak ada yang memilih ke catatan pembayaran. Tiga bidang permintaan tidak akan cukup. A JSON null and an absent field adalah hal yang sama setelah deserialisasi, dan ketidakhadiran sudah berarti dua lainnya hal-hal di sini - "gunakan pasar baku" pada persetujuan, "biarkan saja" di edit. Jadi jelas Komisi mengatakan menghapus keras, tanpa itu seorang saksi yang menghapus Komisi mendapat keheningan, dan dengan menyetujui default mereka hanya dibersihkan datang kembali. LeadIdentity memperoleh default pasar dan findentitas sekarang mantra keluar nya JOINs KIRI. Ditulis sebagai jalur implisit l.maret.x, Hibernasi memancarkan INNER bergabung dan setiap memimpin dengan tidak ada pasar tetes keluar dari proyeksi sepenuhnya - yang akan muncul sebagai "Petunjuk Tanpa Nama" pada baris-baris persis tidak ada yang melihat dua kali.
· kamo-internal
Penyewa rincian klien pada pratinjau, dari memimpin
Menghapus kolom addressee sendiri meninggalkan "Bersiap untuk" kosong, karena nama gubahan hanya pernah datang dari sebuah akun terkait dan kutipan yang diangkat tidak memiliki apapun. Preview sekarang mencetak blok server merakit dari memimpin. Perusahaan kepala itu ketika ada satu - kutipan untuk bisnis ditujukan ke bisnis, dengan kontak bernama di bawah - kemudian alamat, telepon dan email, masing-masing diabaikan ketika memimpin tidak Bawa.
· kamo-signer-monorepo
Tampilkan rincian klien pada salinan pelanggan
Perusahaan kepala blok ketika ada satu - kutipan untuk bisnis ditujukan ke bisnis, dengan kontak bernama di bawahnya. Sesuai dengan pratinjau staf.
· SecurityService
Selesaikan petunjuk alamat untuk pandangan staf dan pelanggan
Organik-scoped di kedua tempat. Pada halaman publik lingkup berasal dari link berbagi sendiri organisasi, sehingga token tidak pernah dapat permukaan memimpin milik penyewa lain.
· kamo-shared-library
Masukan rincian klien pada dokumen, membaca dari memimpin
Menjatuhkan kolom addressee sendiri meninggalkan dokumen tanpa ada yang ingin dibicarakan klien: nama pelanggan hanya pernah datang dari sebuah Akun terkait, yang meninggalkan kutipan-kutipan yang diangkat tidak memiliki, jadi "Bersiap untuk" dicetak kosong. Addressee sekarang dirakit dari timbal - nama, perusahaan, alamat, telepon, email. Ini adalah pencarian daripada bergabung karena kutipan sengaja membuat hanya lembut LeadId sehingga modul memimpin tetap independen didealisalisable, sehingga controllers mengatasinya dan melewati blok masuk Sebuah setengah penuh memimpin adalah kasus normal, bukan pengecualian: mengarah tiba dari vendor dengan Apa pun sumber yang ditangkap. Alamat runtuh ke satu baris dan melewati apa yang hilang, jadi petunjuk hanya memegang cetakan kota "London" daripada, "London", Petunjuk. yang tidak dapat dibaca hasil tidak ada blok daripada melemparkan - kutipan yang memimpin adalah hapus seharusnya masih render.
· kamo-internal
Pindahkan kutipan keluar dari perdagangan dan ke memimpin
Kutipan duduk di pipa perdagangan, di samping perintah dan gerobak daripada di samping klien mereka untuk. Mereka sekarang hidup memimpin: tab Kutipan langsung setelah Klien Lead Data, menunjukkan hanya di mana pasar memungkinkan mereka. Kutipan halaman standalone hilang daripada disimpan di belakang bendera - yang memimpin sudah menyediakan header, identitas klien, komunikasi dan dokumen, jadi tata letak rekaman kedua di atas yang menduplikasi krom dan membagi sejarah klien dalam dua. Memilih suatu kutipan slide daftar keluar dan penyunting masuk, dan header memimpin tidak pernah meninggalkan layar. tab komunikasi dan dokumen dijatuhkan untuk alasan yang sama. Market mendapatkan switch Aktifkan Quotes dan aturan baku tanda kutip mereka mulai dengan. Tanpa EDIT _ QUOTE _ TERMS bidang term dinonaktifkan DAN diabaikan dari payload; server strip itu juga, karena masukan dinonaktifkan presentasi, bukan penegakan. ID Subtab kehilangan "quotes"; tes regresi sekarang menegaskan properti umum - setiap tab melewati pertama menjaga indeks sendiri - sehingga masih menjaga bug bouncing tanpa menyebutkan tab yang sudah tidak ada lagi.
· SecurityService
Tampilkan pengaturan kutipan permarket; paksa pemberian syarat
pasar - config sekarang memberitahu tampilan awal apakah akan menawarkan sebuah tab Quotes dan apa kata kata kutipan baru dimulai dengan, dan pasar titik akhir round-perjalanan kedua bidang. Pengukuran diedit dipreteli server-side untuk penelepon tanpa EDIT _ QUOTE _ TERMS. Menonaktifkan field di UI adalah presentasi; sebuah PATCH buatan tangan tidak boleh mampu menulis ulang org kata hukum baik.
· kamo-shared-library
Kutipan milik ke lead, dikonfigurasi per pasar
Kutipan adalah artefak komersial-pipa, yang menempatkan mereka di samping perintah dan gerobak agak daripada di samping klien mereka. Mereka sekarang menggantung dari memimpin: pasar memutuskan apakah memimpin dapat membawa kutipan sama sekali, dan aturan baku setiap kutipan dalam Pasar dimulai dengan. Per pasar daripada per org karena masalah tabel hipotek Estimasi Loan di bawah TRID dan tidak ada gunanya untuk kutipan generik, sementara sebuah layanan pasar hidup pada mereka. Masa membawa komitmen hukum org 's, sehingga berangkat dari pasar wording pada tunggal quote adalah hibah sendiri - EDIT _ QUOTE _ TERMS. Sebuah ruas istilah kosong sudah berarti "tinggalkan tidak berubah "pada update, yang memungkinkan controller strip untuk penelepon tanpa Benar. Juga jatuhkan nama penerima sendiri / alamat / telepon: yang memimpin telah memegang Rincian klien, dan snapshopting mereka duplikasi catatan diedit di tempat lain yang akan berasal dari itu. Skema yang diterapkan oleh KamoInitializer di depan commit ini; kolom diverifikasi.
· SecurityService
Reserve, menyetujui dan audit memimpin klaim kesempatan
Permukaan REST belakang / lead / peluang / reserved dan Kesempatan Cadangan kontrol di header utama, ditambah layanan yang memiliki invarian. Hak, dipaksakan secara eksplisit karena layanan ini berjalan permitAll tanpa @ EnableMethodSecurity - cek hilang adalah hilang kendali, bukan sebuah default-menyangkal: VIEW _ OPORTUTIES SETIAP pembacaan CREATE _ OPORTITIES meningkatkan permintaan, dan meminta lebih banyak waktu pada Anda sendiri EDIT _ OPORTITIES menyetujui, mengedit, menutup, memerintah pada sebuah ekstensi DELETE _ OPORTUTIES "Deny Oportunity", yang UI menempatkan di belakang konfirmasi Deny is terminal but not destruct: the reservation, its split and its whole sejarah tetap dapat dibaca pada tab Ditolak. Itulah inti dari menyangkal bukan daripada menghapus. Rincian layak dijaga: - Petunjuk-titik akhir header dapat dibaca dengan CREATE saja, karena tombol harus tahu negara bagian mana yang dirender - tapi pemanggil tanpa VIEW yang tidak memegang Agen mendapat proyeksi sempit. Komisi terbagi dan pembenaran bahwa VIEW ada untuk melindungi tidak diungkapkan oleh gerbang lebar. Dibangun kembali sebagai allow- list, sehingga sebuah field ditambahkan kemudian tidak dapat bocor oleh kelalaian. - Daftar topeng kontak dan perusahaan pada lead unassign untuk anggota tanpa View _ UNASSIGNED _ LEADS, LeadController cocok. Siapa yang mengklaim apa yang tidak rahasia; prospek ini. - Extending adalah gated pada menjadi agen yang memegang reservasi, tanpa Tuhan bypass: memegang reservasi adalah fakta identitas, bukan hak, dan ekstensi diajukan atas nama pemohon. - Sebuah pemesanan lapsed yang akan diperpanjang restarts daripada resume, jadi reservedUntil = = reservedFrom + disetujui Hari terus memegang - pembaruan re- turunan akhir dari awal, dan awal yang basi akan diam-diam menghapus hibah. - Komisaris - membagi kolam adalah VIEW _ LEADS pemegang ditambah besar - semua pemilik / admins, identik dengan apa yang ditawarkan titik akhir picker. Computing it from the rights table sendirian membuat dropdown menawarkan pemilik backend kemudian ditolak. - Expiry adalah menyapu dijadwalkan sehingga tab dapat paginate pada kolom nyata, tapi setiap DTO melaporkan siang hari Tersisa terhadap jam basis data, jadi baca benar antara menyapu terlepas. 36 tes mencakup lifecycle, tanggal aritmatika dan aturan split.
· InitializerService
Tabel untuk pemesanan kesempatan utama
Mirrors LeadOpportunityReservation, LeadOpportunityCommision Split and * * * * * * * * * * * * * * * dalam kamo- shared-perpustakaan. ddl- auto: pemutakhiran akan membuat mereka dari entitas pula; eksplisit DDDL adalah konvensi rumah dan membuat bentuk dapat dilihat kembali di sini bukan hanya tertelan dari gangguan. Terapan terhadap produksi pada 2026-08-04 - semua tiga tabel dan setiap indeks ada, dimiliki oleh pengguna aplikasi.
· kamo-shared-library
Entitas untuk waktu - kotak memimpin pemesanan kesempatan
Seorang agen taruhan eksklusif klaim pada menutup memimpin untuk jendela terbatas; menyetujui hibah, edits atau menyangkal itu, dan rekan dapat ditawarkan bagian dari komisi. Tiga meja: reservasi, komisi terbagi, dan Ada... hanya jejak audit. Titik tanda-tanda yang load- bantalan: - Lead, organisasi dan referensi anggota adalah kolom id polos tanpa asing kunci, pencocokan LEAD _ HISTORY dan LEAD _ TASK. Jejak harus hidup lebih lama memimpin penghapusan dan anggota churn tanpa mampu blok atau cascade itu. - dbNow () menggunakan CAST (sekarang () AS timestamp). CockroachDB telanjang sekarang () adalah TIMESTAMPTZ, yang Hibernasi 6 terwujud sebagai Instan yang tidak dapat dilemparkan ke dideklarasikan LocalDateTime - dan the:: stentstamp singkatan dirusak oleh antive- query parser membaca ':' sebagai sebuah awalan parameter. Baik muncul pada waktu kompilasi. - Daftar page menggunakan JpaSpecificationExecutor daripada JPQL dengan (: param IS NULL OR...) penjaga, karena CockroachDB menolak ikatan untyped parameter dalam tes NULL telanjang. - LeadIdentity adalah proyeksi, bukan wujud timbal: Peta memimpin empat @ ManyToOne asosiasi yang baku ke EAGER, sehingga daftar 100 pemesanan oleh entitas akan tembakan ratusan pilihan untuk data grid tidak pernah menunjukkan. - Perintah sejarah timeline oleh (datecreated DESC, id DESC). CockroachDB sekarang () adalah penanda waktu transaksi, sehingga baris ditulis oleh satu edit berbagi persis; tanpa tiebreak sebuah audit jejak reshuffles sendiri antara halaman beban. Tidak ada stereotip di sini - yang memiliki layanan menyatakan kacang, sehingga tidak ada layanan lain membayar untuk pemindaian repositori.
· kamo-internal
Alamat kutipan ke seseorang; ringkasan berhenti biaya tinggi header
Memindahkan ringkasan keluar dari kolom right- tangan tetap lebar tetapi dibeli kembali sebagai band di bawah judul. Sekarang duduk di celah yang sudah ada antara judul dan Tindakan cepat, sehingga biaya tidak ada ruang sama sekali. Jarak tersebut terbatas, sehingga lebih sedikit menunjukkan inline dan sisanya tinggal satu klik jauhnya - perintah membawa dua belas dan akan kerumunan keluar Tindakan. Masih terlihat di setiap lebar daripada menghilang di layar sempit. Kutipan ini juga memperoleh alamat berikut: untuk siapa, mungkin alamat dan telepon mereka. Ini memimpin bagian pertama karena hal pertama yang Anda putuskan, dan ketika akun dihubungkan dengan bidang nama menunjukkan apa yang akan jatuh kembali ke. The preview 's "Prepared for" block render all three and reflect what is being typed rather daripada apa yang terakhir disimpan.
· kamo-shared-library
Alamat kutipan ke seseorang yang belum akun
Addressee hanya diturunkan dari Akun terkait, sehingga setiap kutipan yang diangkat untuk prospek - yang sebagian besar dari mereka - dicetak kosong "Siap untuk" baris dan selesai dokumen tidak mengatakan siapa itu untuk. Kutipan sekarang membawa nama penerima, alamat dan telepon di kanan sendiri. Apa staf mengetik menang atas account terkait: mereka telah mengatakan apa yang harus dicetak, dan akun diganti nama kemudian tidak boleh diam-diam menulis ulang kutipan yang sudah dikirim. Alamat adalah bentuk bebas karena format postal tidak cukup seragam untuk dibagi ke daerah yang bekerja secara internasional, dan itu mencetak seperti yang tertulis. Revisi memuat alamat maju - tawaran yang sama, orang yang sama. Skema yang diterapkan oleh KamoInitializer di depan commit ini; kolom yang diverifikasi saat ini.
· kamo-internal
Buka profil anggota dari baris mereka
Tambahkan aksi keempat ke dok hover baris, menyambung ke * * * * * * * * * * * * * * * It is a real NextLink rather than a click handler, so middle-click and "Buka dalam tab baru" berperilaku dan repo 's no-hard- navigasi penjaga tetap puas; panel menutup pada navigasi sehingga penggulung tubuhnya mengunci tidak hidup lebih lama dari perubahan rute. Aksi ini digated cara gerbang tujuan itu sendiri: pengaturan anggota halaman mengarahkan Anda ke profil Anda sendiri kecuali Anda memegang Manvage _ MEMBERS, Manage _ MEMBER _ KEAMANAN, KONFIGURE _ SISTEM, EDIT _ MEBER _ ACSESS _ LEVEL, ALLOW _ PROMOTING _ MEMBERS atau * * * * * * * * * * * * * * (atau dewa / platform admin). Tanpa salah satu ikon tersembunyi daripada ditawarkan sebagai orang mati berakhir. Barismu sendiri selalu menunjukkannya.
· kamo-internal
Fail the build when a component calls a key messages/ does not define
next-intl renders the key path verbatim for a missing key, and messages/ is gitignored here — populated at image-build time from kamo-translation-dictionary — so a rename that lands in only one of the two repos ships as visible gibberish with nothing to catch it. That is how the department contact fields came to render **************** on the settings screen, and how the entire HMDA demographics form (39 labels) shipped against a namespace that only contained `lar`. scripts/check-i18n-keys.mjs resolves each translator binding's namespace, then checks every literal key, the static prefix of every template-literal key, and the values passed against the {placeholders} in the message — in both directions, since an unsupplied ICU argument throws MissingValueError and an unused one silently drops data. It understands ICU brace escaping and plural sub-messages, and treats <tag> as a placeholder only for t.rich/t.markup. 1737 files in ~1.4s. Wired into `npm test` and into the Dockerfile ahead of the build, with --require-messages there so a skipped dictionary sync fails loudly instead of turning the guard into a no-op. Typing t() against `typeof en` was tried first and rejected: a JSON import widens values to `string`, so next-intl cannot infer placeholders and rejects correct calls like t('...range', {start, end, total}); it also tripled typecheck time (81s -> 249s) and would have needed ~150 edits to non-buggy code. Call-site fixes for what it found: - dropped a `default:` option passed to t() in the chat components and LanguageButton; next-intl has no such fallback option, so it was dead weight. - commerce lowStock passed {count} for {available}, MultiFileUploader {types} for {list}, and audioVideo master volume {pct} for {percent} — all three threw at format time. - DnsSetupStudio passed a {domain} its subtitle does not use.
· kamo-internal
Pilihan Pin / unpin nav dari nav dan home launchpad
Anggota dapat memindahkan opsi antara batang samping dan batang atas, tetapi tidak pernah mengambil satu dari Navs sepenuhnya. Tambahkan penempatan ketiga - NONE, "unpinned" - dan dua cara untuk mencapainya, keduanya mengemudi menu bersama yang sama: - Klik kanan-pilihan yang dapat digerakkan dalam NavPri / NavTop: menu penempatan dibuka di - kontrol sudut di setiap rumah - panel launchpad: chip tenang yang membaca dimana opsi saat ini duduk dan mengembang hover, membuka menu yang sama Tidak pernah ada jalan buntu. Launchpad rumah sekarang render dari setiap gated pilihan daripada penyatuan dari dua nav, sehingga pilihan yang tidak terikat menyimpan panel yang pin kembali; palet perintah tidak sama, dan setiap perubahan Mengangkat roti panggang membatalkan penamaan mana pilihan pergi. Tata Letak Navigasi halaman pengaturan memiliki kolom yang tidak disematkan. Resolver terus invarian nya - setiap pilihan gated dalam tepat satu ember - dan eksplisit NONE sekarang mengalahkan urutan zona basi, sehingga unpin bertahan gumpalan tertulis sebelum itu. Legacy disimpan layout tidak memiliki masukan NONE dan menyelesaikan persis seperti sebelumnya; Reset ke Standar tidak pernah bisa meninggalkan apa pun yang terlepas. Terselubung oleh tes baru untuk resolveNavLayout, yang tidak punya.
· kamo-internal
Sembunyikan departemen kosong, pindahkan filter status ke Direktori
- Departemen tanpa anggota tidak lagi render. Titik akhir departemen mengembalikan setiap departemen di org termasuk yang kosong, sehingga daftar adalah menampilkan bagian yang tidak pernah bisa berisi siapa pun. The per- departemen "tidak anggota "placeholder pergi dengan mereka, menjadi tidak terjangkau sekarang. - Filter All / Online / Offline bergerak dari panel lebar header di bawah strip tab, sehingga duduk di daerah Direktori sendiri dengan daftar itu Filter daripada muncul untuk menyaring seluruh panel (itu tidak pernah diterapkan ke Percakapan atau Akses Mobile). - Keadaan kosong hanya menunjukkan menyesuaikan pencarian / filter ketika salah satu adalah sebenarnya diterapkan; sebuah org tanpa anggota memiliki apa-apa untuk menyesuaikan.

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit