logologo
Mulai
Panduan
Pengembangan
Plugin
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Mulai
Panduan
Pengembangan
Plugin
API
logologo

Pengantar

Apa itu FlowEngine?
Hubungan FlowEngine & Plugin
Mulai Cepat
Peta Jalan Belajar

Panduan

Registrasi FlowModel
Buat FlowModel
Render FlowModel
Alur Event & Konfigurasi FlowModel
Persistensi FlowModel
Siklus Hidup FlowModel
Sistem Konteks FlowModel
Mekanisme Responsif: Observable
FlowModel vs React.Component

Definitions

ModelDefinition
FlowDefinition
EventDefinition
ActionDefinition
StepDefinition
Previous PageActionDefinition
TIP

Dokumen ini diterjemahkan oleh AI. Untuk ketidakakuratan apa pun, silakan lihat versi bahasa Inggris

#StepDefinition

StepDefinition mendefinisikan satu langkah dalam sebuah alur kerja. Setiap langkah dapat berupa sebuah tindakan (action), penanganan kejadian (event handling), atau operasi lainnya. Sebuah langkah adalah unit eksekusi dasar dari sebuah alur kerja.

#Definisi Tipe

interface StepDefinition<TModel extends FlowModel = FlowModel>
  extends Partial<Omit<ActionDefinition<TModel, FlowRuntimeContext<TModel>>, 'name'>> {
  key?: string;
  isAwait?: boolean;
  use?: string;
  sort?: number;
  preset?: boolean;
  paramsRequired?: boolean;
  hideInSettings?: boolean;
  uiMode?: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>);
}

#Cara Penggunaan

class MyModel extends FlowModel {}

MyModel.registerFlow({
  key: 'pageSettings',
  steps: {
    step1: {
      use: 'actionName',
      title: 'First Step',
      sort: 0,
      preset: true
    },
    step2: {
      handler: async (ctx, params) => {
        // Logika pemrosesan kustom
        return { result: 'success' };
      },
      title: 'Second Step',
      sort: 1
    }
  }
});

#Deskripsi Properti

#key

Tipe: string
Wajib: Tidak
Deskripsi: Pengidentifikasi unik untuk langkah dalam alur kerja.

Jika tidak disediakan, nama kunci (key name) dari langkah dalam objek steps akan digunakan.

Contoh:

steps: {
  loadData: {  // key adalah 'loadData'
    use: 'loadDataAction'
  }
}

#use

Tipe: string
Wajib: Tidak
Deskripsi: Nama ActionDefinition yang terdaftar untuk digunakan.

Properti use memungkinkan Anda untuk mereferensikan tindakan (action) yang sudah terdaftar, menghindari definisi berulang.

Contoh:

// Daftarkan tindakan terlebih dahulu
MyModel.registerAction({
  name: 'loadDataAction',
  handler: async (ctx, params) => {
    // Logika pemuatan data
  }
});

// Gunakan dalam sebuah langkah
steps: {
  step1: {
    use: 'loadDataAction',  // Mereferensikan tindakan yang terdaftar
    title: 'Load Data'
  }
}

#title

Tipe: string
Wajib: Tidak
Deskripsi: Judul tampilan untuk langkah.

Digunakan untuk tampilan antarmuka pengguna (UI) dan debugging.

Contoh:

title: 'Load Data'
title: 'Process Information'
title: 'Save Results'

#sort

Tipe: number
Wajib: Tidak
Deskripsi: Urutan eksekusi langkah. Semakin kecil nilainya, semakin awal dieksekusi.

Digunakan untuk mengontrol urutan eksekusi beberapa langkah dalam alur kerja yang sama.

Contoh:

steps: {
  step1: { sort: 0 },  // Dieksekusi pertama
  step2: { sort: 1 },  // Dieksekusi berikutnya
  step3: { sort: 2 }   // Dieksekusi terakhir
}

#handler

Tipe: (ctx: FlowRuntimeContext<TModel>, params: any) => Promise<any> | any
Wajib: Tidak
Deskripsi: Fungsi handler untuk langkah.

Ketika properti use tidak digunakan, Anda dapat langsung mendefinisikan fungsi handler.

Contoh:

handler: async (ctx, params) => {
  // Dapatkan informasi konteks
  const { model, flowEngine } = ctx;
  
  // Logika pemrosesan
  const result = await processData(params);
  
  // Kembalikan hasil
  return { success: true, data: result };
}

#defaultParams

Tipe: Record<string, any> | ((ctx: FlowRuntimeContext<TModel>) => Record<string, any> | Promise<Record<string, any>>)
Wajib: Tidak
Deskripsi: Parameter default untuk langkah.

Mengisi parameter dengan nilai default sebelum langkah dieksekusi.

Contoh:

// Parameter default statis
defaultParams: {
  timeout: 5000,
  retries: 3,
  format: 'json'
}

// Parameter default dinamis
defaultParams: (ctx) => {
  return {
    userId: ctx.model.uid,
    timestamp: Date.now()
  }
}

// Parameter default asinkron
defaultParams: async (ctx) => {
  const config = await loadConfig();
  return {
    apiUrl: config.apiUrl,
    apiKey: config.apiKey
  }
}

#uiSchema

Tipe: Record<string, ISchema> | ((ctx: FlowRuntimeContext<TModel>) => Record<string, ISchema> | Promise<Record<string, ISchema>>)
Wajib: Tidak
Deskripsi: Skema konfigurasi UI untuk langkah.

Mendefinisikan bagaimana langkah ditampilkan di antarmuka dan konfigurasi formulirnya.

Contoh:

uiSchema: {
  'x-component': 'Form',
  'x-component-props': {
    layout: 'vertical'
  },
  properties: {
    name: {
      type: 'string',
      title: 'Name',
      'x-component': 'Input'
    },
    age: {
      type: 'number',
      title: 'Age',
      'x-component': 'InputNumber'
    }
  }
}

#beforeParamsSave

Tipe: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Wajib: Tidak
Deskripsi: Fungsi hook yang berjalan sebelum parameter disimpan.

Dieksekusi sebelum parameter langkah disimpan, dan dapat digunakan untuk validasi atau transformasi parameter.

Contoh:

beforeParamsSave: (ctx, params, previousParams) => {
  // Validasi parameter
  if (!params.name) {
    throw new Error('Name is required');
  }
  
  // Transformasi parameter
  params.name = params.name.trim().toLowerCase();
}

#afterParamsSave

Tipe: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Wajib: Tidak
Deskripsi: Fungsi hook yang berjalan setelah parameter disimpan.

Dieksekusi setelah parameter langkah disimpan, dan dapat digunakan untuk memicu operasi lain.

Contoh:

afterParamsSave: (ctx, params, previousParams) => {
  // Catat log
  console.log('Step params saved:', params);
  
  // Memicu operasi lain
  ctx.model.emitter.emit('paramsChanged', params);
}

#uiMode

Tipe: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)
Wajib: Tidak
Deskripsi: Mode tampilan UI untuk langkah.

Mengontrol bagaimana langkah ditampilkan di antarmuka.

Mode yang didukung:

  • 'dialog' - Mode dialog
  • 'drawer' - Mode drawer
  • 'embed' - Mode embed
  • Atau objek konfigurasi kustom

Contoh:

// Mode sederhana
uiMode: 'dialog'

// Konfigurasi kustom
uiMode: {
  type: 'dialog',
  props: {
    width: 800,
    title: 'Step Configuration'
  }
}

// Mode dinamis
uiMode: (ctx) => {
  return ctx.model.isMobile ? 'drawer' : 'dialog';
}

#preset

Tipe: boolean
Wajib: Tidak
Deskripsi: Menentukan apakah ini adalah langkah prasetel (preset).

Parameter untuk langkah dengan preset: true perlu diisi saat pembuatan. Langkah yang tidak ditandai dengan ini dapat diisi setelah model dibuat.

Contoh:

steps: {
  step1: {
    preset: true,  // Parameter harus diisi saat pembuatan
    use: 'requiredAction'
  },
  step2: {
    preset: false, // Parameter dapat diisi nanti
    use: 'optionalAction'
  }
}

#paramsRequired

Tipe: boolean
Wajib: Tidak
Deskripsi: Menentukan apakah parameter langkah wajib diisi.

Jika true, dialog konfigurasi akan terbuka sebelum menambahkan model.

Contoh:

paramsRequired: true  // Parameter harus dikonfigurasi sebelum menambahkan model
paramsRequired: false // Parameter dapat dikonfigurasi nanti

#hideInSettings

Tipe: boolean
Wajib: Tidak
Deskripsi: Menentukan apakah langkah disembunyikan di menu pengaturan.

Contoh:

hideInSettings: true  // Sembunyikan di pengaturan
hideInSettings: false // Tampilkan di pengaturan (default)

#isAwait

Tipe: boolean
Wajib: Tidak
Nilai Default: true
Deskripsi: Menentukan apakah akan menunggu fungsi handler selesai.

Contoh:

isAwait: true  // Tunggu fungsi handler selesai (default)
isAwait: false // Jangan tunggu, eksekusi secara asinkron

#Contoh Lengkap

class DataProcessingModel extends FlowModel {}

DataProcessingModel.registerFlow({
  key: 'dataProcessing',
  title: 'Data Processing',
  steps: {
    loadData: {
      use: 'loadDataAction',
      title: 'Load Data',
      sort: 0,
      preset: true,
      paramsRequired: true,
      defaultParams: {
        source: 'api',
        timeout: 5000
      },
      uiMode: 'dialog'
    },
    processData: {
      handler: async (ctx, params) => {
        const data = await ctx.model.getData();
        return processData(data, params);
      },
      title: 'Process Data',
      sort: 1,
      defaultParams: (ctx) => ({
        userId: ctx.model.uid,
        timestamp: Date.now()
      }),
      beforeParamsSave: (ctx, params) => {
        if (!params.processor) {
          throw new Error('Processor is required');
        }
      },
      afterParamsSave: (ctx, params) => {
        ctx.model.emitter.emit('dataProcessed', params);
      }
    },
    saveData: {
      use: 'saveDataAction',
      title: 'Save Data',
      sort: 2,
      hideInSettings: false,
      uiMode: {
        type: 'drawer',
        props: {
          width: 600,
          title: 'Save Configuration'
        }
      }
    }
  }
});