import gradio as gr import json import os from datetime import datetime # Gradio App for API Workflow Builder # Visual page builder with drag-and-drop interface def load_page_builder(): """Load the main page builder HTML""" with open('index.html', 'r', encoding='utf-8') as f: return f.read() def save_workflow(workflow_name, html_content, css_content): """Save workflow to JSON file""" if not workflow_name: return "❌ ワークフロー名を入力してください" workflows_dir = 'workflows' os.makedirs(workflows_dir, exist_ok=True) workflow_data = { 'name': workflow_name, 'html': html_content, 'css': css_content, 'created_at': datetime.now().isoformat(), 'updated_at': datetime.now().isoformat() } filename = f"{workflows_dir}/{workflow_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" with open(filename, 'w', encoding='utf-8') as f: json.dump(workflow_data, f, ensure_ascii=False, indent=2) return f"✅ ワークフロー保存完了: {filename}" def load_workflows(): """Load list of saved workflows""" workflows_dir = 'workflows' if not os.path.exists(workflows_dir): return [] workflows = [] for filename in os.listdir(workflows_dir): if filename.endswith('.json'): with open(f"{workflows_dir}/{filename}", 'r', encoding='utf-8') as f: data = json.load(f) workflows.append({ 'filename': filename, 'name': data.get('name', 'Unknown'), 'created_at': data.get('created_at', 'Unknown') }) return workflows def export_html(workflow_name, html_content, css_content): """Export complete HTML file""" full_html = f""" {workflow_name} {html_content} """ output_dir = 'exports' os.makedirs(output_dir, exist_ok=True) filename = f"{output_dir}/{workflow_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html" with open(filename, 'w', encoding='utf-8') as f: f.write(full_html) return filename # Gradio Interface with gr.Blocks(title="🚀 API Workflow Builder", theme=gr.themes.Soft()) as app: gr.Markdown(""" # 🚀 API Workflow Builder Visual page builder with drag-and-drop interface powered by GrapeJS. Create API workflow screens without coding! ## ✨ Features - 📦 Drag & Drop page builder - 🔌 API integration blocks - 💾 Save workflows to JSON/Supabase - 📥 Export as HTML file - 🎨 Visual styling editor """) with gr.Tab("📝 Page Builder"): gr.Markdown(""" ### Visual Editor **Note**: Due to Gradio limitations, the full GrapeJS editor works best when opened in a separate window. Click the button below to open the full editor in a new tab: """) gr.Markdown(""" 🚀 Open Full Editor """) gr.Markdown(""" ### Alternative: Localhost Setup For full functionality with API integration, run locally: ```bash # Clone the repository git clone https://huggingface.co/spaces/kenken999/api-workflow-builder cd api-workflow-builder # Open index.html in your browser # Or serve with a local server: python -m http.server 8000 # Then visit: http://localhost:8000/index.html ``` ### 使い方 1. 左サイドバーから要素をドラッグ&ドロップ 2. 右サイドバーでスタイルをカスタマイズ 3. ヘッダーの「保存」ボタンでSupabaseに保存 4. 下の「エクスポート」タブからHTMLファイルをダウンロード """) with gr.Tab("💾 Workflows"): gr.Markdown("### 保存されたワークフロー") with gr.Row(): workflow_name_input = gr.Textbox( label="ワークフロー名", placeholder="my-workflow" ) save_btn = gr.Button("💾 保存", variant="primary") save_status = gr.Textbox(label="保存ステータス", interactive=False) gr.Markdown("### ワークフロー一覧") workflows_list = gr.JSON(label="保存済みワークフロー") refresh_btn = gr.Button("🔄 更新") # Event handlers refresh_btn.click( fn=lambda: load_workflows(), outputs=workflows_list ) with gr.Tab("📥 Export"): gr.Markdown("### HTMLエクスポート") with gr.Row(): export_name = gr.Textbox( label="ファイル名", placeholder="my-page" ) html_input = gr.Textbox( label="HTML Content", placeholder="
...
", lines=5 ) css_input = gr.Textbox( label="CSS Content", placeholder=".class { ... }", lines=5 ) export_btn = gr.Button("📥 HTMLエクスポート", variant="primary") export_result = gr.File(label="ダウンロード") export_btn.click( fn=export_html, inputs=[export_name, html_input, css_input], outputs=export_result ) with gr.Tab("⚙️ Settings"): gr.Markdown("### API設定") with gr.Row(): with gr.Column(): supabase_url = gr.Textbox( label="Supabase URL", value="https://rootomzbucovwdqsscqd.supabase.co" ) supabase_key = gr.Textbox( label="Supabase Anon Key", value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", type="password" ) with gr.Column(): api_base_url = gr.Textbox( label="API Base URL", value="https://your-api.com", placeholder="https://api.example.com" ) api_auth_type = gr.Dropdown( label="認証タイプ", choices=["None", "Bearer Token", "API Key", "Basic Auth"], value="None" ) save_config_btn = gr.Button("💾 設定保存", variant="primary") config_status = gr.Textbox(label="保存ステータス", interactive=False) with gr.Tab("📚 Documentation"): gr.Markdown(""" ## 📖 ドキュメント ### 🎯 概要 API Workflow Builderは、ドラッグ&ドロップでAPIワークフロー画面を作成できるノーコードツールです。 ### 🚀 クイックスタート 1. **Page Builderタブ**を開く 2. 左サイドバーから要素をドラッグ 3. キャンバスにドロップして配置 4. スタイルをカスタマイズ 5. 保存またはエクスポート ### 📦 利用可能なブロック #### Shop11 API カテゴリ - **地金チェック削除**: 商品IDで地金チェックを削除 - **査定タイトル生成**: 商品IDから査定タイトルを生成 - **メール送信**: メール通知を送信 - **商品検索**: キーワードで商品を検索 - **商品データテーブル**: 商品データを検索・表示 - **顧客検索テーブル**: 顧客情報を検索・表示 - **査定検索テーブル**: 査定データを検索・表示 - **商品登録フォーム**: 新規商品を登録 ### 🔌 API連携 すべてのAPIブロックは自動的にSupabaseにログを保存します。 ```javascript // API呼び出し例 fetch('/api/your-endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(res => res.json()) .then(data => { // Supabaseログ保存 saveApiLogToSupabase('API名', endpoint, request, response, 'success'); }); ``` ### 💾 データ保存 ページデータは以下の形式でSupabaseに保存されます: ```json { "name": "page-name", "html_content": "
...
", "css_content": ".class {...}", "components_json": {...}, "created_at": "2026-02-23T...", "updated_at": "2026-02-23T..." } ``` ### 🎨 カスタマイズ 新しいブロックを追加するには: 1. `index.html`の`blockManager.add()`に新しいブロックを登録 2. `api-functions.js`にAPI呼び出し関数を追加 3. イベントリスナーに`data-action`を登録 ### 🔐 セキュリティ - Supabase RLSポリシーで行レベルセキュリティを設定 - API Keyは環境変数で管理 - CSRF Tokenを使用したAPI保護 ### 📊 技術スタック - **Frontend**: GrapeJS, Bootstrap, jQuery - **Backend**: Gradio (Python) - **Database**: Supabase (PostgreSQL) - **Hosting**: Hugging Face Spaces ### 🐛 トラブルシューティング **ブロックがドラッグできない** - ブラウザのキャッシュをクリア - ページをリロード **APIエラー** - ネットワークタブでHTTPステータス確認 - Supabase接続情報を確認 **保存できない** - RLSポリシーを確認 - ブラウザコンソールのエラーログをチェック ### 📝 ライセンス MIT License ### 👤 作者 Created for visual API workflow automation. ### 🔗 リンク - [GitHub Repository](https://github.com/your-repo) - [Supabase Docs](https://supabase.com/docs) - [GrapeJS Docs](https://grapesjs.com/docs/) """) # Launch app if __name__ == "__main__": app.launch( server_name="0.0.0.0", server_port=7860, share=False, show_error=True )