Demo Widget
Lihat berbagai mode widget yang tersedia dan pilih yang sesuai dengan kebutuhan website Anda
Integrasi & API
Dokumentasi lengkap untuk integrasi widget dengan berbagai platform dan teknologi
API Integration
Integrasi sistem pemesanan dengan aplikasi Anda
Contoh API Request
// Example API Request
const response = await fetch('https://api.emerald-system.com/v1/bookings', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
room_type: 'deluxe',
check_in: '2024-03-01',
check_out: '2024-03-03'
})
});Endpoint Utama
/v1/bookings- Membuat pemesanan baru/v1/availability- Cek ketersediaan kamar/v1/rates- Mendapatkan daftar harga/v1/bookings/{id}- Detail pemesanan
Autentikasi
Semua request ke API memerlukan header Authorization dengan token Bearer.
Dapatkan API key Anda dengan menghubungi tim support Emerald.
Opsi Konfigurasi
Parameter yang tersedia untuk menyesuaikan widget
| Opsi | Tipe | Default | Deskripsi |
|---|---|---|---|
| container | Element | null | Element DOM tempat widget akan ditampilkan (wajib) |
| primaryColor | String | #8B0000 | Warna utama widget (format hex) |
| widgetBaseUrl | String | https://booking.emerald-system.id | URL dasar booking engine yang dapat dikonfigurasi sesuai kebutuhan |
| redirectUrl | String | null | URL kustom untuk redirect hasil pencarian (menggantikan widgetBaseUrl jika diisi) |
| language | String | id | Bahasa (id atau en) |
| mode | String | calendar | Mode widget (calendar, search, atau full) |
| propertyCode | String | DEMO | Kode properti hotel |
| onSelect | Function | null | Callback saat tanggal dipilih |
| debug | Boolean | false | Mode debug untuk logging |
Panduan Integrasi
Langkah-langkah implementasi widget ke website Anda
Langkah Instalasi
- Salin script widget ke direktori website Anda
- Tambahkan container HTML di halaman Anda
- Muat script widget dari server Anda
- Inisialisasi widget dengan opsi yang diperlukan
- Sesuaikan tampilan sesuai kebutuhan menggunakan CSS kustom
Tips Penggunaan
- Gunakan mode
fulluntuk pengalaman pemesanan lengkap - Untuk kontrol lebih, gunakan mode
calendardan implementasikan logika pemesanan kustom - Sesuaikan warna utama agar sesuai dengan branding website Anda
- Aktifkan mode debug saat pengembangan untuk melihat log detail
WordPress Integration
Panduan integrasi dengan WordPress step-by-step
Emerald Booking Widget tersedia sebagai plugin WordPress yang mudah digunakan
1Unduh Plugin
Unduh plugin Emerald Booking Widget dari link download di bawah ini.
2Install Plugin
Login ke dashboard WordPress admin Anda, kemudian navigasi ke Plugins > Add New > Upload Plugin.

3Upload Plugin
Pilih file zip yang baru saja diunduh dan klik 'Install Now'.

4Aktifkan Plugin
Setelah instalasi selesai, klik 'Activate Plugin' untuk mengaktifkan widget.

5Penggunaan Shortcode
Anda dapat menyisipkan widget ke halaman atau post apa pun menggunakan shortcode.
[emerald_booking_widget property_code="DEMO" primary_color="#8B0000" mode="full"]
6Konfigurasi Shortcode
Berikut adalah parameter yang dapat disesuaikan:
| Parameter | Deskripsi | Default |
|---|---|---|
| property_code | Kode properti hotel | DEMO |
| primary_color | Warna utama widget (format hex) | #8B0000 |
| language | Bahasa widget (id atau en) | id |
| mode | Mode tampilan (full, search, calendar) | full |
| widget_base_url | URL basis widget | https://booking.emerald-system.id |
| redirect_url | URL kustom untuk redirect hasil pencarian | |
| api_base_url | URL basis API | |
| open_in_new_tab | Buka hasil di tab baru (true/false) | false |
| debug | Mode debug (true/false) | false |
7Penggunaan Widget
Anda juga dapat menambahkan widget melalui sistem widget WordPress.

- Buka menu Appearance > Widgets di dashboard WordPress
- Temukan widget 'Emerald Booking Widget' di daftar widget yang tersedia
- Drag and drop widget ke area widget yang diinginkan (sidebar, footer, dll)
- Konfigurasikan widget sesuai kebutuhan Anda
- Klik Save untuk menyimpan pengaturan
8Konfigurasikan Tema
Anda dapat menyesuaikan tampilan widget menggunakan CSS kustom di Customizer WordPress Anda.
.emerald-booking-widget {
/* Kustomisasi sesuai kebutuhan */
max-width: 100%;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
}Shortcode WordPress
Salin dan tempel shortcode berikut ke dalam post atau halaman WordPress Anda:
[emerald_booking_widget property_code="DEMO,PMH,DEMO2" database="DEMO,PMH,DEMO2" hotelname="Demo Hotel,Padma Hotel,Demo Hotel 2" show_property_select="true" primary_color="#8B0000" mode="full" widget_base_url="https://booking.emerald-system.id" redirect_same_tab="true" ]
Next.js Integration
Cara mengintegrasikan widget dengan aplikasi Next.js
Widget dapat diintegrasikan dengan mudah ke dalam aplikasi Next.js
Komponen BookingWidget.js
import { useEffect, useRef } from 'react';
export default function BookingWidget({
widgetBaseUrl = 'https://booking.emerald-system.id',
propertyCode = 'DEMO',
database = 'DEMO',
primaryColor = '#8B0000',
mode = 'full',
openInNewTab = false
}) {
const containerRef = useRef(null);
const scriptRef = useRef(null);
useEffect(() => {
// Cek apakah script sudah dimuat
if (!scriptRef.current) {
// Buat script element
const script = document.createElement('script');
script.src = '/widget/booking-widget.js';
script.async = true;
script.onload = initializeWidget;
// Simpan referensi ke script
scriptRef.current = script;
// Tambahkan script ke document
document.body.appendChild(script);
} else {
// Jika script sudah dimuat, langsung inisialisasi widget
initializeWidget();
}
// Cleanup function
return () => {
if (window.EmeraldBookingWidget && containerRef.current) {
containerRef.current.innerHTML = '';
}
};
}, [widgetBaseUrl, propertyCode, database, primaryColor, mode, openInNewTab]);
const initializeWidget = () => {
if (containerRef.current && window.EmeraldBookingWidget) {
containerRef.current.innerHTML = '';
window.EmeraldBookingWidget.init({
container: containerRef.current,
widgetBaseUrl: widgetBaseUrl,
propertyCode: propertyCode,
database: database,
primaryColor: primaryColor,
mode: mode,
openInNewTab: openInNewTab
});
}
};
return <div ref={containerRef} className="booking-widget-container" />;
}Penggunaan Komponen (Next.js App Router)
'use client';
import BookingWidget from '@/components/BookingWidget';
export default function BookingPage() {
return (
<main className="container mx-auto px-4 py-8">
<h1 className="text-3xl font-bold mb-6">Booking Hotel</h1>
<div className="mb-8">
<BookingWidget
widgetBaseUrl="https://booking.emerald-system.id"
propertyCode="DEMO"
database="DEMO"
primaryColor="#8B0000"
mode="full"
/>
</div>
</main>
);
}Flutter Web Integration
Cara mengintegrasikan widget dengan aplikasi Flutter Web
Integrasi dengan Flutter Web memerlukan penggunaan platform channel untuk JavaScript interop
booking_widget.dart
// CONTOH KODE DART - HANYA UNTUK REFERENSI
// PERHATIAN: Ini adalah kode Dart untuk Flutter Web, bukan JavaScript
import 'dart:html' as html;
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
class BookingWidget extends StatefulWidget {
final String widgetBaseUrl;
final String propertyCode;
final String database;
final String primaryColor;
final String mode;
final bool openInNewTab;
final double height;
const BookingWidget({
Key? key,
this.widgetBaseUrl = 'https://booking.emerald-system.id',
this.propertyCode = 'DEMO',
this.database = 'DEMO',
this.primaryColor = '#8B0000',
this.mode = 'full',
this.openInNewTab = false,
this.height = 500,
}) : super(key: key);
@override
State<BookingWidget> createState() => _BookingWidgetState();
}
class _BookingWidgetState extends State<BookingWidget> {
final String viewId = 'booking-widget-view-' + DateTime.now().millisecondsSinceEpoch.toString();
bool _isScriptLoaded = false;
@override
void initState() {
super.initState();
// Initialize UI views after the first frame is rendered
WidgetsBinding.instance.addPostFrameCallback((_) {
_loadBookingWidget();
});
}
void _loadBookingWidget() {
// Register the view factory
ui.platformViewRegistry.registerViewFactory(viewId, (int viewId) {
final container = html.DivElement()
..id = 'booking-widget-container'
..style.width = '100%'
..style.height = '100%';
_loadScript(container);
return container;
});
}
void _loadScript(html.Element container) {
// Check if script is already loaded
if (!_isScriptLoaded) {
final script = html.ScriptElement()
..src = '/widget/booking-widget.js'
..type = 'text/javascript';
script.onLoad.listen((event) {
_isScriptLoaded = true;
_initializeWidget(container);
});
html.document.head!.append(script);
} else {
_initializeWidget(container);
}
}
void _initializeWidget(html.Element container) {
// Call the JavaScript function using dart:html JS interop
html.window.callMethod('eval', ['''
if (window.EmeraldBookingWidget) {
window.EmeraldBookingWidget.init({
container: document.getElementById('booking-widget-container'),
widgetBaseUrl: '${widget.widgetBaseUrl}',
propertyCode: '${widget.propertyCode}',
database: '${widget.database}',
primaryColor: '${widget.primaryColor}',
mode: '${widget.mode}',
openInNewTab: ${widget.openInNewTab}
});
}
''']);
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: widget.height,
child: HtmlElementView(viewType: viewId),
);
}
}Penggunaan Widget dalam Flutter
// CONTOH KODE DART - HANYA UNTUK REFERENSI
// PERHATIAN: Ini adalah kode Dart untuk Flutter Web, bukan JavaScript
import 'package:flutter/material.dart';
import 'booking_widget.dart';
class BookingPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Hotel Booking'),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Cari dan Pesan Kamar Hotel',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 20),
BookingWidget(
widgetBaseUrl: 'https://booking.emerald-system.id',
propertyCode: 'DEMO',
database: 'DEMO',
primaryColor: '#8B0000',
mode: 'full',
height: 600,
),
],
),
),
),
);
}
}