Fitur Baru
Dukungan untuk Banyak Sumber Data
Menambahkan plugin ”Data Source Manager”, yang digunakan untuk mengelola semua koleksi dan bidang untuk sumber data. Plugin Data Source Manager menyediakan antarmuka terpusat untuk mengelola sumber data dan tidak menyediakan kemampuan untuk mengakses sumber data. Plugin ini perlu digunakan bersama dengan berbagai plugin sumber data. Sumber data yang saat ini didukung meliputi:
- Basis Data Utama: Basis data utama NocoBase, mendukung basis data relasional seperti MySQL, PostgreSQL, SQLite, dll.
- Sumber Data MySQL Eksternal: Mengakses basis data MySQL yang sudah ada sebagai sumber data.
- Sumber Data MariaDB Eksternal: Mengakses basis data MariaDB yang sudah ada sebagai sumber data.
- Sumber Data PostgreSQL Eksternal: Mengakses basis data PostgreSQL yang sudah ada sebagai sumber data.
Selain itu, lebih banyak sumber data dapat diperluas, yang dapat berupa jenis basis data umum atau platform yang menyediakan API (SDK).

Penyesuaian pada Manajemen Koleksi
Memindahkan “Collection Manager” asli ke “Data Source > Main Database > Configuration”.

Dukungan untuk Bidang Non-ID sebagai Kunci Utama dan Kendala Relasi
Saat membuat koleksi, Anda dapat memilih untuk tidak membuat bidang ID.

Bidang integer dapat digunakan sebagai kunci utama.

Bidang teks satu baris juga dapat digunakan sebagai kunci utama.

Kendala relasi mendukung pemilihan bidang lain dengan indeks Unik yang ditetapkan sebagai bidang non-kunci utama.

Penyesuaian pada Pengurutan Seret dan Lepas
Menambahkan bidang tipe “Sort”. Bidang pengurutan tidak lagi dibuat secara otomatis saat membuat koleksi dan perlu dibuat secara manual.

Saat memilih bidang sebagai grup, pengelompokan akan dilakukan sebelum pengurutan.

Saat mengaktifkan pengurutan seret dan lepas di blok tabel, Anda perlu memilih bidang pengurutan.

Saat membuat blok Kanban, Anda perlu memilih bidang pengurutan.

Penyesuaian pada Antarmuka Pengguna dan Izin
Menambahkan antarmuka manajemen pengguna dan menyatukan manajemen pengguna dan peran di bawah satu menu.

Menyesuaikan antarmuka manajemen peran untuk memudahkan pengelolaan peran, izin, departemen, dll. yang terkait dengan pengguna.

Memindahkan “Action Permissions” asli ke tab “Data Source”.

Plugin Departemen

Mengatur pengguna berdasarkan departemen, mengatur hubungan hierarkis, menautkan peran untuk mengontrol izin, dan menggunakan departemen sebagai variabel dalam alur kerja dan ekspresi.
Alur Kerja: Persetujuan
Plugin persetujuan menyediakan jenis alur kerja (pemicu) khusus “Initiate Approval” dan node “Approval” untuk proses ini. Dikombinasikan dengan tabel data kustom dan blok kustom unik NocoBase, berbagai skenario persetujuan dapat dibuat dan dikelola dengan cepat dan fleksibel.
Konfigurasi persetujuan

Proses persetujuan

Detail lebih lanjut dapat ditemukan di dokumentasi: Workflow Approval
Alur Kerja: Node Akhiri Proses
Node ini segera mengakhiri eksekusi alur kerja saat ini saat dijalankan dan berakhir dengan status yang dikonfigurasi di node. Ini biasanya digunakan untuk kontrol aliran logika tertentu, untuk keluar dari alur kerja saat ini setelah memenuhi kondisi logis tertentu, tanpa melanjutkan pemrosesan selanjutnya. Ini dapat diibaratkan seperti perintah return dalam bahasa pemrograman, yang digunakan untuk keluar dari fungsi yang sedang dijalankan.

Detail lebih lanjut dapat ditemukan di dokumentasi: End Process Node
Alur Kerja: Node Variabel Kustom
Variabel dapat dideklarasikan dalam alur kerja atau nilai dapat ditetapkan ke variabel yang dideklarasikan sebelumnya, biasanya digunakan untuk menyimpan data sementara dalam alur kerja. Ini cocok untuk skenario di mana hasil perhitungan perlu disimpan untuk digunakan nanti di luar cabang (seperti loop, paralelisme, dll.).

Detail lebih lanjut dapat ditemukan di dokumentasi: Custom Variable Node
Alur Kerja: Pencegat Permintaan
Plugin pencegat permintaan menyediakan mekanisme untuk mencegat operasi pada formulir, di mana peristiwa pencegat dipicu setelah operasi formulir yang sesuai dikirimkan dan sebelum diproses. Jika node “End Process” dijalankan dalam aliran proses selanjutnya setelah pemicuan, atau jika node lain gagal dijalankan (kesalahan atau eksekusi tidak lengkap lainnya), operasi formulir akan dicegat, jika tidak, operasi yang dijadwalkan akan dijalankan secara normal. Ini dapat digunakan untuk validasi bisnis atau pemeriksaan logika untuk menyetujui atau mencegat operasi buat, perbarui, dan hapus yang dikirimkan klien.

Detail lebih lanjut dapat ditemukan di dokumentasi: Request Interceptor
Alur Kerja: Node Pesan Respons
Node pesan respons digunakan untuk memberikan umpan balik kepada klien dengan pesan kustom dalam jenis alur kerja tertentu (seperti pencegat permintaan dan peristiwa formulir).
Konfigurasi node

Pesan prompt

Detail lebih lanjut dapat ditemukan di dokumentasi: Response Message Node
Perubahan yang Tidak Kompatibel
API dengan Nama yang Bertentangan
Dalam perubahan kernel ini, beberapa API versi baru bertentangan dengan nama versi lama. API versi lama yang bertentangan ini akan dipertahankan dalam versi ini tetapi akan diberi akhiran _deprecated secara seragam.
| API Asli | API Tidak Digunakan Lagi | API Baru |
|---|---|---|
| CollectionProvider | CollectionProvider_deprecated | CollectionProvider |
| useCollection | useCollection_deprecated | useCollection |
| useCollectionField | useCollectionField_deprecated | useCollectionField |
| useCollectionManager | useCollectionManager_deprecated | useCollectionManager |
| useContext(CollectionManagerContext) | useCollectionManager_deprecated | useCollectionManager |
Jika Anda menggunakan API terkait di atas, Anda memiliki dua cara untuk mengubah:
- Penggantian sederhana: Ganti API asli dengan yang diberi akhiran
_deprecated, misalnya, gantiuseCollection()denganuseRecord_deprecated(). - Gunakan API baru sesuai dengan dokumentasi baru: Meskipun nama API baru sama dengan API lama, ada perbedaan dalam parameter dan nilai kembalian. Anda perlu merujuk ke dokumentasi baru
untuk menyesuaikan kode yang sesuai.
API Lain yang Perlu Disesuaikan
registerTemplate()diubah menjadiapp.dataSourceManager.addCollectionTemplates()registerField()diubah menjadiapp.dataSourceManager.addFieldInterfaces()registerGroup()diubah menjadiapp.dataSourceManager.addFieldInterfaceGroups()useContext(CollectionManagerContext)diubah menjadiuseCollectionManager_deprecated()- Perluas koleksi menggunakan
ExtendCollectionsProvider RecordProvidermemerlukan penerusan parameter induk secara eksplisit saat diperlukan
Contoh Perubahan
Ekstensi Template Koleksi
Definisi
Sebelumnya didefinisikan sebagai objek, sekarang perlu diubah menjadi kelas. Contoh:
Sebelum:
import { ICollectionTemplate } from '@nocobase/client';
const calendar: ICollectionTemplate = {
name: 'calendar',
title: 'Calendar collection',
order: 2,
color: 'orange',
// ...
}
Sekarang:
import { CollectionTemplate } from '@nocobase/client';
class CalendarCollectionTemplate extends CollectionTemplate {
name = 'calendar';
title = 'Calendar collection';
order = 2;
color = 'orange';
}
Properti objek asli menjadi anggota kelas.
Pendaftaran
Sebelumnya didaftarkan melalui registerTemplate, sekarang perlu didaftarkan melalui dataSourceManager.addCollectionTemplates plugin. Contoh:
Sebelum:
import { registerTemplate } from '@nocobase/client';
import { calendar } from './calendar'
registerTemplate('calendar', calendar);
Sekarang:
import { Plugin } from '@nocobase/client';
import { CalendarCollectionTemplate } from './calendar'
export class CalendarPluginClient extends Plugin {
async load() {
this.app.dataSourceManager.addCollectionTemplates([CalendarCollectionTemplate]);
}
}
Ekstensi Antarmuka Bidang
Definisi
Sebelumnya didefinisikan sebagai objek, sekarang perlu diubah menjadi kelas. Contoh:
Sebelum:
import { IField } from '@nocobase/client';
const attachment: IField = {
name: 'attachment',
type: 'object',
group: 'media',
title: 'Attachment',
// ...
}
Sekarang:
import { CollectionFieldInterface } from '@nocobase/client';
class AttachmentFieldInterface extends CollectionFieldInterface {
name = 'attachment';
type = 'object';
group = 'media';
title = 'Attachment';
// ...
}
Properti objek asli menjadi anggota kelas.
Pendaftaran
Sebelumnya didaftarkan melalui registerField, sekarang perlu didaftarkan melalui dataSourceManager.addFieldInterfaces plugin dan tidak perlu meneruskan CollectionManagerProvider lagi. Contoh:
Sebelum:
import { registerField } from '@nocobase/client';
import { attachment } from './attachment'
- registerField(attachment.group, 'attachment', attachment);
export const FileManagerProvider: FC = (props) => {
return (
- <CollectionManagerProvider interfaces={{ attachment }}>
<SchemaComponentOptions scope={hooks} components={{ UploadActionInitializer }}>
{props.children}
</SchemaComponentOptions>
- </CollectionManagerProvider>
);
};
Sekarang:
import { Plugin } from '@nocobase/client';
import { AttachmentFieldInterface } from './attachment'
export class FilPlugin extends Plugin {
async load() {
this.app.dataSourceManager.addFieldInterfaces([AttachmentFieldInterface]);
}
}
Ekstensi Grup Antarmuka Bidang
Sebelumnya didaftarkan melalui registerGroup, sekarang perlu didaftarkan melalui dataSourceManager.addFieldInterfaceGroups plugin. Contoh:
- import { registerGroup, Plugin } from '@nocobase/client';
+ import { Plugin } from '@nocobase/client';
- registerGroup('map', {
- label: 'Map-based geometry',
- order: 10
- })
export class MapPlugin extends Plugin {
async load() {
+ this.app.dataSourceManager.addFieldInterfaceGroups({
+ map: {
+ label: generateNTemplate('Map-based geometry'),
+ order: 51,
+ },
+ });
}
}
useContext(CollectionManagerContext) Diubah Menjadi useCollectionManager_deprecated()
- const ctx = useContext(CollectionManagerContext);
+ const ctx = useCollectionManager_deprecated();
Perluas Koleksi, Gunakan ExtendCollectionsProvider Sebagai Pengganti CollectionManagerProvider
const Demo = () => {
- <CollectionManagerProvider collections={[apiKeysCollection]}>
+ <ExtendCollectionsProvider collections={[apiKeysCollection]}>
...
- </CollectionManagerProvider>
+ </ExtendCollectionsProvider>
}
Perubahan pada RecordProvider
Sebelumnya, ketika properti induk tidak diteruskan, nilai RecordProvider terakhir akan diambil secara otomatis sebagai induk. Sekarang, induk perlu diteruskan secara eksplisit, dan ketika induk tidak diteruskan, nilai induk akan menjadi undefined.
- <RecordProvider record={recordData}>
+ <RecordProvider record={recordData} parent={parentRecordData}>
...
</RecordProvider>
Jika tidak ada beban historis, Anda juga dapat langsung menggunakan CollectionRecordProvider sebagai pengganti.
- <RecordProvider record={recordData}>
+ <CollectionRecordProvider record={recordData} parent={parentRecordData}>
...
- </RecordProvider>
+ </CollectionRecordProvider>
⚠️Perbedaan Antara RecordProvider dan CollectionRecordProvider
- RecordProvider tidak digunakan lagi dan akan dihapus di masa mendatang.
- RecordProvider membawa RecordContext lama, sedangkan CollectionRecordProvider tidak.