E

Emerald Booking Widget

Sistem pemesanan kamar hotel yang elegan dan modern untuk website Anda

Demo Widget

Lihat berbagai mode widget yang tersedia dan pilih yang sesuai dengan kebutuhan website Anda

Widget Lengkap

Form pencarian lengkap untuk implementasi cepat

Kode untuk memasang widget:

<!-- Tambahkan widget ke halaman -->
<div id="booking-widget-container"></div>

<!-- Tambahkan script booking widget -->
<script src="https://widget.emerald-system.id/widget/booking-widget.js"></script>

<script>
  // Inisialisasi widget
  document.addEventListener('DOMContentLoaded', function() {
    EmeraldBookingWidget.init({
      container: document.getElementById('booking-widget-container'),
      widgetBaseUrl: 'https://booking.emerald-system.id', // URL dasar untuk booking engine
      primaryColor: '#8B0000',
      mode: 'full',
      propertyCode: ['DEMO', 'DEMO2', 'DEMO3'], // Kode properti untuk API request dan URL booking
      database: ['DEMO', 'DEMO2', 'DEMO3'],     // Kode database untuk header X-Database
      hotelname: ['Demo Hotel 1', 'Demo Hotel 2', 'Demo Hotel 3'], // Nama hotel yang sesuai
      showPropertySelect: true, // Tampilkan pemilihan properti di form pencarian
      redirectSameTab: true // buka di tab yang sama
    });
  });
</script>

Widget Kalender

Widget kalender untuk implementasi kustom di website Anda

Kode untuk memasang widget kalender:

<!-- Tambahkan widget ke halaman -->
<div id="calendar-widget-container"></div>

<!-- Tambahkan script booking widget -->
<script src="https://widget.emerald-system.id/widget/booking-widget.js"></script>

<script>
  // Inisialisasi widget kalender
  document.addEventListener('DOMContentLoaded', function() {
    EmeraldBookingWidget.init({
      container: document.getElementById('calendar-widget-container'),
      widgetBaseUrl: 'https://booking.emerald-system.id', // URL dasar untuk booking engine
      primaryColor: '#006400',
      mode: 'calendar',
      propertyCode: ['DEMO', 'DEMO2', 'DEMO3'], // Kode properti untuk API request
      database: ['DEMO', 'DEMO2', 'DEMO3'],     // Kode database untuk header X-Database
      hotelname: ['Demo Hotel 1', 'Demo Hotel 2', 'Demo Hotel 3'], // Nama hotel yang sesuai
      showPropertySelect: true, // Tampilkan pemilihan properti di form pencarian
      onSelect: function(data) {
        console.log('Selected dates:', data);
        // Handle selected dates as needed
      }
    });
  });
</script>

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

OpsiTipeDefaultDeskripsi
containerElementnullElement DOM tempat widget akan ditampilkan (wajib)
primaryColorString#8B0000Warna utama widget (format hex)
widgetBaseUrlStringhttps://booking.emerald-system.idURL dasar booking engine yang dapat dikonfigurasi sesuai kebutuhan
redirectUrlStringnullURL kustom untuk redirect hasil pencarian (menggantikan widgetBaseUrl jika diisi)
languageStringidBahasa (id atau en)
modeStringcalendarMode widget (calendar, search, atau full)
propertyCodeStringDEMOKode properti hotel
onSelectFunctionnullCallback saat tanggal dipilih
debugBooleanfalseMode debug untuk logging

Panduan Integrasi

Langkah-langkah implementasi widget ke website Anda

Langkah Instalasi

  1. Salin script widget ke direktori website Anda
  2. Tambahkan container HTML di halaman Anda
  3. Muat script widget dari server Anda
  4. Inisialisasi widget dengan opsi yang diperlukan
  5. Sesuaikan tampilan sesuai kebutuhan menggunakan CSS kustom

Tips Penggunaan

  • Gunakan mode full untuk pengalaman pemesanan lengkap
  • Untuk kontrol lebih, gunakan mode calendar dan 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.

Install Plugin

3Upload Plugin

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

Upload Plugin

4Aktifkan Plugin

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

Aktifkan Plugin

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:

ParameterDeskripsiDefault
property_codeKode properti hotelDEMO
primary_colorWarna utama widget (format hex)#8B0000
languageBahasa widget (id atau en)id
modeMode tampilan (full, search, calendar)full
widget_base_urlURL basis widgethttps://booking.emerald-system.id
redirect_urlURL kustom untuk redirect hasil pencarian
api_base_urlURL basis API
open_in_new_tabBuka hasil di tab baru (true/false)false
debugMode debug (true/false)false

7Penggunaan Widget

Anda juga dapat menambahkan widget melalui sistem widget WordPress.

Penggunaan Widget
  • 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,
              ),
            ],
          ),
        ),
      ),
    );
  }
}