kenken999's picture
Upload folder using huggingface_hub
aaf2f91 verified
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"""<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{workflow_name}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/css/bootstrap.min.css">
<style>{css_content}</style>
</head>
<body>
{html_content}
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
</body>
</html>"""
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("""
<a href="https://kenken999.github.io/api-workflow-builder/" target="_blank"
style="display:inline-block; padding:15px 30px; background:linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color:white; text-decoration:none; border-radius:8px; font-weight:bold; margin:20px 0;">
🚀 Open Full Editor
</a>
""")
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="<div>...</div>",
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": "<div>...</div>",
"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
)