NocoBase 0.20:Dukungan untuk Banyak Sumber Data

NocoBase 0.20 memperkenalkan dukungan untuk banyak sumber data, penyesuaian manajemen koleksi, kunci utama non-ID, antarmuka pengguna dan izin yang lebih baik, serta node alur kerja baru untuk fleksibilitas dan kinerja yang lebih baik.

NocoBase team |

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:

Selain itu, lebih banyak sumber data dapat diperluas, yang dapat berupa jenis basis data umum atau platform yang menyediakan API (SDK).

Data Source Manager

Penyesuaian pada Manajemen Koleksi

Memindahkan “Collection Manager” asli ke “Data Source > Main Database > Configuration”.

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.

Predefined Fields

Bidang integer dapat digunakan sebagai kunci utama.

Integer fields can be used as primary keys

Bidang teks satu baris juga dapat digunakan sebagai kunci utama.

Single-line text fields can also be used as primary keys

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

Approval Configuration

Proses persetujuan

Approval Process

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 AsliAPI Tidak Digunakan LagiAPI Baru
CollectionProviderCollectionProvider_deprecatedCollectionProvider
useCollectionuseCollection_deprecateduseCollection
useCollectionFielduseCollectionField_deprecateduseCollectionField
useCollectionManageruseCollectionManager_deprecateduseCollectionManager
useContext(CollectionManagerContext)useCollectionManager_deprecateduseCollectionManager

Jika Anda menggunakan API terkait di atas, Anda memiliki dua cara untuk mengubah:

  • Penggantian sederhana: Ganti API asli dengan yang diberi akhiran _deprecated, misalnya, ganti useCollection() dengan useRecord_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 menjadi app.dataSourceManager.addCollectionTemplates()
  • registerField() diubah menjadi app.dataSourceManager.addFieldInterfaces()
  • registerGroup() diubah menjadi app.dataSourceManager.addFieldInterfaceGroups()
  • useContext(CollectionManagerContext) diubah menjadi useCollectionManager_deprecated()
  • Perluas koleksi menggunakan ExtendCollectionsProvider
  • RecordProvider memerlukan 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.
× View Image