PageSourceSearch

https://awll-studio.ai/assets/Wo9Ia6NN.js

js awll-studio.ai collected 2026-10-05 14:50:01 UTC 51,322 bytes, 26 lines download raw bytes

1import{i as lr}from"./6KndmJbk.js";import{$ as ur,$i as xr,$r as ke,Ai as b,Bi as de,Ca as qe,Cn as Je,Di as X,Fi as V,Gn as hr,Ha as mr,Hi as ce,Hr as pr,Jr as jr,Mi as ve,Pi as De,Pr as gr,Q as we,Qr as ie,Rr as vr,Si as yr,Ta as be,Ui as le,Vr as _,Wi as ue,Wr as ye,Xr as fr,Y as Fe,Yr as $,Zr as Cr,_a as a,aa as g,ai as Tr,ba as xe,da as J,ft as ze,hi as br,ii as H,in as fe,io as Er,la as Sr,m as Qe,mi as Y,oo as Ir,ot as Ee,pi as T,qr as Rr,ra as f,ta as Nr,tr as Or,va as L,vi as Ue,wa as Ke,wi as Pr,wt as Ar,xa as Ge,xi as He,ya as Ce,zi as Se,zn as _r}from"./CCK59u6I.js";import{Q as Ie,X as ae,Y as Q}from"./CPqHB1YI.js";import{s as Lr}from"./J7vjj6EC.js";import{t as Z}from"./e0LlMT3d.js";import{t as kr}from"./Mt0nS1Wk.js";import{at as Dr,c as wr,et as Fr,ot as zr,s as Ur,st as Hr,z as $r}from"./BQH5TMbu.js";import{t as Br}from"./BW1Om2ww.js";import{t as Xe}from"./gcAgF69C.js";import{t as Wr}from"./BfNMAFZN.js";import{n as Vr,r as $e}from"./CQrfa0ZN.js";import{a as U,d as qr,f as Jr,h as Te,i as Be,l as Qr,m as Kr,n as D,o as q,p as Gr,r as Xr,s as E}from"./C8FGAM05.js";import{t as Yr}from"./xy495-rV.js";import{t as Zr}from"./B6GctJ6V.js";var m=lr(Ir(),1),e=Er(),Mr=({open:r,onClose:i,onKeepDraft:n,onPublish:o,isActive:l})=>(0,e.jsxs)(ue,{open:r,onClose:i,children:[(0,e.jsx)(de,{children:"このバージョンを公開しますか?"}),(0,e.jsx)(ce,{children:(0,e.jsx)(a,{children:l?"下書きとして保存しました。このバージョンを公開しますか?現在実行中のバージョンは置き換えられます。":"下書きとして保存しました。このバージョンを公開してルールを有効化しますか?"})}),(0,e.jsxs)(le,{children:[(0,e.jsx)(f,{onClick:n,children:"下書きとして保存"}),(0,e.jsx)(f,{variant:"contained",color:"success",startIcon:(0,e.jsx)(Ee,{}),onClick:o,children:"公開する"})]})]}),We=r=>{switch(r){case"PUBLISHED":return"success";case"DRAFT":return"info";default:return"default"}},es=({open:r,onClose:i,versions:n,editingVersionNumber:o,onPublish:l,onUnpublish:c,onRestore:p})=>{const[x,h]=(0,m.useState)(null),t=()=>{h(null),i()};return(0,e.jsxs)(ue,{open:r,onClose:t,maxWidth:"md",fullWidth:!0,children:[(0,e.jsx)(de,{children:"バージョン履歴"}),(0,e.jsx)(ce,{children:x?(0,e.jsxs)(g,{children:[(0,e.jsxs)(H,{direction:"row",spacing:1,alignItems:"center",sx:{mb:2},children:[(0,e.jsx)(f,{size:"small",onClick:()=>h(null),children:"一覧に戻る"}),(0,e.jsx)(J,{label:`v${x.versionNumber}`,size:"small"}),(0,e.jsx)(J,{label:x.status,size:"small",color:We(x.status)})]}),(0,e.jsx)(g,{sx:{fontFamily:"monospace",fontSize:13,whiteSpace:"pre-wrap",bgcolor:Ur,color:wr,p:2,borderRadius:1,maxHeight:400,overflow:"auto"},children:x.scriptCode})]}):(0,e.jsxs)(Pr,{children:[n?.map(u=>(0,e.jsxs)(m.Fragment,{children:[(0,e.jsxs)(He,{sx:{cursor:"pointer","&:hover":{bgcolor:"action.hover"},...u.versionNumber===o&&{bgcolor:"action.selected",borderLeft:"3px solid",borderLeftColor:"primary.main"}},onClick:()=>h(u),children:[(0,e.jsx)(Ue,{primary:(0,e.jsxs)(H,{direction:"row",spacing:1,alignItems:"center",children:[(0,e.jsxs)(a,{variant:"body2",fontWeight:500,children:["v",u.versionNumber]}),(0,e.jsx)(J,{label:u.status,size:"small",color:We(u.status)}),u.versionNumber===o&&(0,e.jsx)(J,{label:"editing",size:"small",color:"primary",variant:"outlined"})]}),secondary:new Date(u.createdAt).toLocaleString("ja-JP")}),(0,e.jsx)(yr,{children:(0,e.jsxs)(H,{direction:"row",spacing:.5,children:[u.status!=="PUBLISHED"&&(0,e.jsx)(f,{size:"small",variant:"outlined",color:"success",startIcon:(0,e.jsx)(Ee,{}),onClick:C=>{C.stopPropagation(),l(u.versionNumber),t()},children:"公開"}),u.status==="PUBLISHED"&&(0,e.jsx)(f,{size:"small",variant:"outlined",color:"warning",startIcon:(0,e.jsx)(Qe,{}),onClick:C=>{C.stopPropagation(),c(),t()},children:"無効化"}),(0,e.jsx)(f,{size:"small",variant:"outlined",startIcon:(0,e.jsx)(ur,{}),onClick:C=>{C.stopPropagation(),p(u),t()},children:"復元"})]})})]}),(0,e.jsx)(Se,{})]},u.id)),(!n||n.length===0)&&(0,e.jsx)(He,{children:(0,e.jsx)(Ue,{primary:"バージョンが見つかりません"})})]})}),(0,e.jsx)(le,{children:(0,e.jsx)(f,{onClick:t,children:"閉じる"})})]})},rs=({formData:r,setFormData:i,errors:n,isMobile:o,formOptions:l,loadingForms:c})=>{const p=r.scheduleType==="FIXED_RATE",x=p?Vr(r.scheduleExpression||""):null,h=Te(r.errorHandling);return(0,e.jsxs)(b,{container:!0,spacing:{xs:2,sm:3},children:[(0,e.jsx)(b,{size:{xs:12,md:6},children:(0,e.jsx)(_,{fullWidth:!0,label:"ルール名",required:!0,value:r.ruleName,onChange:t=>i({...r,ruleName:t.target.value,name:t.target.value}),error:!!n.ruleName,helperText:n.ruleName,size:o?"small":"medium"})}),(0,e.jsx)(b,{size:{xs:12,md:6},children:(0,e.jsxs)(V,{fullWidth:!0,required:!0,error:!!n.eventType,size:o?"small":"medium",children:[(0,e.jsx)(X,{id:"script-event-type-label",children:"イベントタイプ"}),(0,e.jsxs)(Y,{labelId:"script-event-type-label",value:r.eventType,onCh
1ange:t=>{const u=t.target.value,C={eventType:u};u===E.SCHEDULED&&(C.scheduleType=r.scheduleType||"CRON",C.scheduleExpression=r.scheduleExpression||"",C.scheduleTimezone=r.scheduleTimezone||"Asia/Tokyo"),i({...r,...C})},label:"イベントタイプ",children:[(0,e.jsx)(T,{value:E.ON_CREATE,children:o?"作成時":"レコード作成時 (onCreate)"}),(0,e.jsx)(T,{value:E.ON_UPDATE,children:o?"更新時":"レコード更新時 (onUpdate)"}),(0,e.jsx)(T,{value:E.ON_DELETE,children:o?"削除時":"レコード削除時 (onDelete)"}),(0,e.jsx)(T,{value:E.ON_BUTTON_CLICK,children:o?"ボタン":"ボタンクリック時 (onButtonClick)"}),(0,e.jsx)(T,{value:E.SCHEDULED,children:o?"スケジュール":"スケジュール実行 (scheduled)"}),r.eventType===E.ON_CHANGE&&(0,e.jsx)(T,{value:E.ON_CHANGE,disabled:!0,children:o?"変更時(レガシー)":"フィールド変更時 (onChange) ※レガシー・新規作成不可"})]}),n.eventType&&(0,e.jsx)(ve,{children:n.eventType})]})}),r.eventType===E.SCHEDULED&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(b,{size:{xs:12,md:4},children:(0,e.jsxs)(V,{fullWidth:!0,required:!0,size:o?"small":"medium",children:[(0,e.jsx)(X,{children:"スケジュールタイプ"}),(0,e.jsxs)(Y,{value:r.scheduleType||"CRON",onChange:t=>{const u=t.target.value;i({...r,scheduleType:u,scheduleExpression:u==="FIXED_RATE"?"PT1M":""})},label:"スケジュールタイプ",children:[(0,e.jsx)(T,{value:"CRON",children:"Cron式"}),(0,e.jsx)(T,{value:"FIXED_RATE",children:"固定間隔"})]})]})}),p?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(b,{size:{xs:6,md:2},children:(0,e.jsx)(_,{fullWidth:!0,required:!0,type:"number",label:"間隔",value:x?.value??1,onChange:t=>{const u=Math.max(1,parseInt(t.target.value)||1);i({...r,scheduleExpression:$e(u,x?.unit||"M")})},inputProps:{min:1},size:o?"small":"medium"})}),(0,e.jsx)(b,{size:{xs:6,md:2},children:(0,e.jsxs)(V,{fullWidth:!0,size:o?"small":"medium",children:[(0,e.jsx)(X,{children:"単位"}),(0,e.jsxs)(Y,{value:x?.unit||"M",onChange:t=>{i({...r,scheduleExpression:$e(x?.value||1,t.target.value)})},label:"単位",children:[(0,e.jsx)(T,{value:"S",children:"秒"}),(0,e.jsx)(T,{value:"M",children:"分"}),(0,e.jsx)(T,{value:"H",children:"時間"})]})]})})]}):(0,e.jsx)(b,{size:{xs:12,md:4},children:(0,e.jsx)(_,{fullWidth:!0,required:!0,label:"Cron式(例: 0 0 2 * * *)",value:r.scheduleExpression||"",onChange:t=>i({...r,scheduleExpression:t.target.value}),helperText:"秒 分 時 日 月 曜日",size:o?"small":"medium",slotProps:{input:{style:{fontFamily:"monospace"}}}})}),(0,e.jsx)(b,{size:{xs:12,md:4},children:(0,e.jsxs)(V,{fullWidth:!0,size:o?"small":"medium",children:[(0,e.jsx)(X,{children:"タイムゾーン"}),(0,e.jsxs)(Y,{value:r.scheduleTimezone||"Asia/Tokyo",onChange:t=>i({...r,scheduleTimezone:t.target.value}),label:"タイムゾーン",children:[(0,e.jsx)(T,{value:"Asia/Tokyo",children:"Asia/Tokyo (JST)"}),(0,e.jsx)(T,{value:"UTC",children:"UTC"})]})]})})]}),r.eventType===E.ON_BUTTON_CLICK&&(0,e.jsx)(b,{size:{xs:12,md:6},children:(0,e.jsx)(_,{fullWidth:!0,label:"アクションID",value:r.actionId||"",onChange:t=>i({...r,actionId:t.target.value}),helperText:n.actionId||"actions[].actionId に対応(例: approve, export_pdf)",error:!!n.actionId,size:o?"small":"medium",required:!0})}),(0,e.jsx)(b,{size:{xs:12,md:6},children:(0,e.jsx)(Sr,{options:l,getOptionLabel:t=>t.title||t.formId,value:l.find(t=>t.formId===r.targetFormId)||null,onChange:(t,u)=>{i({...r,targetFormId:u?.formId||""})},loading:c,slotProps:{paper:{elevation:0,sx:{boxShadow:"0 4px 16px rgba(0,0,0,0.12)"}}},renderInput:t=>(0,e.jsx)(_,{...t,label:"対象データベース",required:r.eventType!==E.SCHEDULED,placeholder:o?"選択":"データベース名で検索",error:!!n.targetFormId,helperText:n.targetFormId||(o?"選択":"データベース名で検索して選択してください"),size:o?"small":"medium",InputProps:{...t.InputProps,endAdornment:(0,e.jsxs)(e.Fragment,{children:[c?(0,e.jsx)(xe,{color:"inherit",size:20}):null,t.InputProps.endAdornment]})}}),renderOption:(t,u)=>(0,e.jsx)(g,{component:"li",...t,sx:{color:"text.primary !important"},children:u.title||u.formId}),isOptionEqualToValue:(t,u)=>t.formId===u.formId})}),(0,e.jsx)(b,{size:{xs:6,sm:4},children:(0,e.jsx)(_,{fullWidth:!0,type:"number",label:"優先度",value:r.priority,onChange:t=>i({...r,priority:parseInt(t.target.value)}),error:!!n.priority,helperText:n.priority||(o?"1-100":"1-100 (小さいほど優先)"),inputProps:{min:1,max:100},size:o?"small":"medium"})}),(0,e.jsx)(b,{size:{xs:6,sm:4},children:(0,e.jsx)(_,{fullWidth:!0,type:"number",label:o?"タイムアウト":"タイムアウト(秒)",value:r.timeoutSeconds,onChange:t=>i({...r,timeoutSeconds:parseInt(t.target.value)}),error:!!n.timeoutSeconds,helperText:n.timeoutSeconds||"1-300秒",inputProps:{min:1,max:300},size:o?"small":"medium"})}),(0,e.jsx)(b,{size:{xs:12,sm:4},children:(0,e.jsx)(De,{control:(0,e.jsx)(ke,{checked:r.isActive,onChange:t=>i({...r,isActive:t.target.checked}),size:o?"small":"medium"}),label:"有効"})}),(0,e.jsx)(b,{size:{xs:12,md:6},children:(0,e.jsxs)(V,{fullWidth:!0,size:o?"small":"medium",children:[(0,e.jsx)(X,{id:"script-error-handling-label",children:"エラー時の挙動"}),(0,e.jsxs)(Y,{labelId:"script-error-handling-label",value:h,onChange:t=>i({...r,errorHandling:t.target.value}),label:"エラー時の挙動",children:[(0,e.jsx)(T,{value:q.LOG_AN
1D_CONTINUE,children:Be[q.LOG_AND_CONTINUE]}),(0,e.jsx)(T,{value:q.STOP_ON_ERROR,children:Be[q.STOP_ON_ERROR]})]}),(0,e.jsx)(ve,{children:h===q.STOP_ON_ERROR?"スクリプトが失敗するとレコードの保存を中断します":"スクリプトが失敗してもレコードの保存を継続します"})]})}),(r.eventType===E.ON_CREATE||r.eventType===E.ON_UPDATE)&&(0,e.jsx)(b,{size:{xs:12},children:(0,e.jsxs)(V,{fullWidth:!0,size:o?"small":"medium",children:[(0,e.jsx)(De,{control:(0,e.jsx)(ke,{checked:!!r.runOnScriptWrites,onChange:t=>i({...r,runOnScriptWrites:t.target.checked}),size:o?"small":"medium"}),label:"他のルールからの書き込みでも動かす"}),(0,e.jsx)(ve,{children:"既定はオフです。オンにすると、レコードの保存で動いたルールからの書き込みのときだけ動きます (定期実行・ボタンからの書き込みでは動きません)。連鎖は深さ5までです。"})]})})]})},ss=({isMobile:r})=>(0,e.jsxs)(be,{elevation:1,sx:{p:{xs:2,sm:3},bgcolor:"background.paper"},children:[(0,e.jsx)(a,{variant:r?"subtitle1":"h6",gutterBottom:!0,children:"スクリプトルールの使い方"}),(0,e.jsx)(Se,{sx:{my:2}}),(0,e.jsx)(a,{variant:r?"subtitle2":"subtitle1",fontWeight:"bold",gutterBottom:!0,children:"利用可能なAPI"}),(0,e.jsxs)(g,{sx:{ml:{xs:1,sm:2},mb:2},children:[(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.getRecords(formId, filters)"})," - レコードを取得"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsxs)("code",{children:["api.getRecordsPage(formId, ","{"," limit, nextToken ","}",")"]})," - レコードと次ページのトークン(",(0,e.jsxs)("code",{children:["{"," records, nextToken ","}"]}),")を取得。件数が ",(0,e.jsx)("code",{children:"limit"})," より少なくても続きがあることがあるので、全件を読むときは ",(0,e.jsx)("code",{children:"nextToken"})," が ",(0,e.jsx)("code",{children:"null"})," になるまで繰り返す"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.createRecord(formId, record)"})," - レコードを作成"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.updateRecord(formId, recordId, updates)"})," - レコードを更新(サブテーブルは配列ごと置き換え)。別の更新と競合すると 409(",(0,e.jsx)("code",{children:"try/catch"})," で捕捉可能)。409 は ",(0,e.jsx)("code",{children:"patchRecord"})," と同じく「行は増えていない」(追加した明細行はサーバが取り消す。既存の行の変更・削除は反映されていることがあるが、再送すると揃う)。409 を受けたら ",(0,e.jsx)("code",{children:"api.getRecords"})," で読み直してから ",(0,e.jsx)("code",{children:"updates"})," を組み立て直して呼び直す"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.patchRecord(formId, recordId, operations, options)"})," - レコードを部分更新(REST の PATCH と同じ operations。サブテーブルは ",(0,e.jsx)("code",{children:"__rowId"})," で指定した行だけを追加・更新・削除)。冪等が効くのは同じ実行の中の再送だけで、自分で書いた再試行は守られない。409 は「行は増えていない」(",(0,e.jsx)("code",{children:"append"})," で足した行はサーバが取り消す。既存の行の ",(0,e.jsx)("code",{children:"update"})," / ",(0,e.jsx)("code",{children:"delete"})," は反映されていることがあるが、再送すると揃う)。409 を受けたら ",(0,e.jsx)("code",{children:"api.getRecords"})," で読み直してから組み立て直して呼び直す"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.deleteRecord(formId, recordId)"})," - レコードを削除"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• 書き込み(",(0,e.jsx)("code",{children:"createRecord"})," / ",(0,e.jsx)("code",{children:"updateRecord"})," / ",(0,e.jsx)("code",{children:"patchRecord"})," / ",(0,e.jsx)("code",{children:"deleteRecord"}
1),")の失敗を ",(0,e.jsx)("code",{children:"try/catch"})," で捕まえると、",(0,e.jsx)("code",{children:"e.errors"})," に ",(0,e.jsxs)("code",{children:["{"," field, message, code, rowId? ","}"]})," の配列が入る(REST API のエラーの ",(0,e.jsx)("code",{children:"details"})," と同じ形。409 は ",(0,e.jsx)("code",{children:"code: 'OPTIMISTIC_LOCK_CONFLICT'"}),")。例外のメッセージは今までどおり"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• レコードの作成・更新(POST / PUT / PATCH・一括)で動く ON_CREATE / ON_UPDATE の中の ",(0,e.jsx)("code",{children:"createRecord"})," / ",(0,e.jsx)("code",{children:"updateRecord"})," / ",(0,e.jsx)("code",{children:"patchRecord"})," / ",(0,e.jsx)("code",{children:"deleteRecord"})," はその場では書き込まれず、元の保存が成功したときだけ保存の直後に 1 回適用される(保存が失敗したら何も書かれない)。ルールの中では書いたレコードを読み返せず、戻り値は ",(0,e.jsxs)("code",{children:["{"," id, formId, planned: true ","}"]}),"(",(0,e.jsx)("code",{children:"createRecord"})," の ",(0,e.jsx)("code",{children:"id"})," は後の呼び出しに使える)。書き込み先の失敗は ",(0,e.jsx)("code",{children:"try/catch"})," で捕まえられない"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"recordErrors.addFieldError(field, message)"})," / ",(0,e.jsx)("code",{children:"recordErrors.addError(message)"})," - 保存を止める理由を項目ごと(",(0,e.jsx)("code",{children:"addError"})," は項目なし)に積む。使えるのは ON_CREATE / ON_UPDATE / ON_DELETE だけ(ON_CHANGE・ボタン・スケジュールでは ",(0,e.jsx)("code",{children:"recordErrors"})," は定義されていない)。積むとそのルールは失敗になり、エラー処理が「エラー時に保存をブロック」なら保存(削除)が止まって、REST API のエラーの ",(0,e.jsx)("code",{children:"details"})," に ",(0,e.jsx)("code",{children:"{ field, message, code: 'SCRIPT_RULE_ERROR' }"})," で 1 件ずつ返る(「ログに記録して継続」なら保存は続く)"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"recordErrors.addFieldWarning(field, message)"})," / ",(0,e.jsx)("code",{children:"recordErrors.addWarning(message)"})," - 保存は止めずに注意を積む(使えるイベントは ",(0,e.jsx)("code",{children:"addError"})," と同じ)。保存が通ると REST API の応答に ",(0,e.jsx)("code",{children:"warnings"})," が付き、",(0,e.jsx)("code",{children:"{ field, message, code: 'SCRIPT_RULE_WARNING' }"})," で 1 件ずつ返る(一括は行ごとの ",(0,e.jsx)("code",{children:"results[].warnings"}),"、スクリプトの ",(0,e.jsx)("code",{children:"createRecord"})," / ",(0,e.jsx)("code",{children:"updateRecord"})," / ",(0,e.jsx)("code",{children:"patchRecord"})," は戻り値の ",(0,e.jsx)("code",{children:"warnings"}),"。ただし今は書き込み先のルールが発火しないので付かない)。エラーと一緒に積むと保存は止まり、警告は返らない"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.log(message)"})," - ログを出力"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"api.error(message)"})," - エラーを出力"]})]}),(0,e.jsx)(a,{variant:r?"subtitle2":"subtitle1",fontWeight:"bold",gutterBottom:!0,children:"コンテキスト変数"}),(0,e.jsxs)(g,{sx:{ml:{xs:1,sm:2},mb:2},children:[(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.record"})," - 現在のレコード"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.oldRecord"})," - 更新前のレコード(onUpdateのみ)"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.changedFields"})," - 値が変わった項目コードの配列(onCreate・onUpdate。onCreate は値ã
1®ã‚る項目すべて)"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.changedNodes"})," - 追加・変更・削除された明細行の配列(onCreate・onUpdate)。各要素は"," ",(0,e.jsx)("code",{children:"{ rowId, fieldCode, change }"}),"、change は ADDED / UPDATED / DELETED"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.fieldName"})," - 変更されたフィールド名(onChangeのみ)"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.formId"})," - データベースID"]}),(0,e.jsxs)(a,{variant:r?"caption":"body2",component:"div",children:["• ",(0,e.jsx)("code",{children:"context.userId"})," - ユーザーID"]})]}),(0,e.jsx)(a,{variant:r?"subtitle2":"subtitle1",fontWeight:"bold",gutterBottom:!0,children:"制限事項"}),(0,e.jsxs)(g,{sx:{ml:{xs:1,sm:2}},children:[(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• eval, Function, setTimeout, setInterval は使用できません"}),(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• ファイルシステムアクセスは禁止されています"}),(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• ネットワークアクセスは禁止されています"}),(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• 最大実行時間: 30秒(デフォルト、ルール設定で最大300秒)"}),(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• API呼び出し(1スクリプトあたり): 読み取り 最大100回 / 書き込み 最大150回(作成・更新・削除の合算) / 外部HTTP 最大100回 / メール送信 最大10回"}),(0,e.jsx)(a,{variant:r?"caption":"body2",color:"error",component:"div",children:"• レコード取得: 最大1,000ä»¶/回・50,000ä»¶/スクリプト"})]})]}),ns=({open:r,onClose:i,testContext:n,onTestContextChange:o,testResult:l,isPending:c,onTest:p,isMobile:x})=>{const h=t=>(0,e.jsxs)(g,{sx:{fontFamily:"inherit",fontSize:"inherit",mb:.5},children:[(0,e.jsxs)(a,{component:"span",sx:{color:{log:"#cccccc",info:"#3794ff",warn:"#ce9178",error:"#f48771",debug:"#858585"}[t.level]||"#cccccc",fontFamily:"inherit"},children:["[",t.level.toUpperCase(),"] ",new Date(t.timestamp).toLocaleTimeString(),":"]}),(0,e.jsx)(a,{component:"span",sx:{ml:1,color:"#cccccc",fontFamily:"inherit"},children:t.message})]},t.timestamp);return(0,e.jsxs)(ue,{open:r,onClose:i,maxWidth:x?"md":"lg",fullWidth:!0,fullScreen:x,children:[(0,e.jsx)(de,{children:x?"テスト実行":"スクリプトテスト実行"}),(0,e.jsxs)(ce,{children:[(0,e.jsx)(L,{severity:"info",sx:{mb:2},children:"モックのサンドボックスで実行します(既定では実DBに一切アクセスしません)。 実レコードで保存前の本文を試したいときは「実レコードで試す(dry-run)」を使ってください。"}),(0,e.jsxs)(b,{container:!0,spacing:2,sx:{mt:1},children:[(0,e.jsxs)(b,{size:{xs:12,md:6},children:[(0,e.jsx)(a,{variant:x?"caption":"subtitle2",gutterBottom:!0,children:"テストコンテキスト(JSON形式)"}),(0,e.jsx)(_,{fullWidth:!0,multiline:!0,rows:x?10:15,value:n,onChange:t=>o(t.target.value),sx:{fontFamily:"monospace"},size:x?"small":"medium"})]}),(0,e.jsxs)(b,{size:{xs:12,md:6},children:[(0,e.jsx)(a,{variant:x?"caption":"subtitle2",gutterBottom:!0,children:"実行結果"}),(0,e.jsxs)(be,{variant:"outlined",sx:{p:{xs:1,sm:2},minHeight:x?300:360,maxHeight:x?300:360,overflowY:"auto"},children:[c&&(0,e.jsx)(g,{display:"flex",justifyContent:"center",py:4,children:(0,e.jsx)(xe,{})}),l&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(g,{mb:2,children:[(0,e.jsx)(J,{label:l.success?"成功":"失敗",color:l.success?"success":"error",size:"small"}),(0,e.jsxs)(a,{variant:"caption",sx:{ml:1},children:["実行時間: ",l.executionTimeMs,"ms"]})]}),l.error&&(0,e.jsxs)(L,{severity:"error",sx:{mb:2},children:[typeof l.error=="string"?l.error:l.error.message,typeof l.error=="object"&&l.error.line&&(0,e.jsxs)(a,{variant:"caption",display:"block",children:["Line ",l.error.line,":",l.error.column]})]}),l.consoleLogs.length>0&&(0,e.jsxs)(g,{children:[(0,e.jsx)(a,{variant:"subtitle2",gutterBottom:!0,children:"コンソールログ:"}),(0,e.jsx)(g,{sx:{bgcolor:"#1e1e1e",color:"#cccccc",p:2,borderRadius:1,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:"0.875rem",border:"1px solid",borderColor:"grey.800"},children:l.consoleLogs.map(h)})]}),l.output&&(0,e.jsxs)(g,{mt:2,children:[(0,e.jsx)(a,{variant:"subtitle2",gutterBottom:!0,children:"出力:"}),(0,e.jsx)("pre",{style:{margin:0,fontSize:"0.875rem"},children:JSON.stringify(l.output,null,2)})]})]})]})]})]})]}),(0,e.jsxs)(le,{children:[(0,e.jsx)(f,{onClick:i,children:"閉じる"}),(0,e.jsx)(f,{onClick:p,variant:"contained",color:"primary",disabled:c,
1children:"実行"})]})]})};function ts(r){if(kr(r)){const i=r.response?.status;if(i===403)return{kind:"forbidden"};if(i===429){const l=r.response?.headers?.["retry-after"],c=l!=null&&String(l).trim()!==""?Number(l):NaN;return{kind:"rateLimited",retryAfterSeconds:Number.isFinite(c)?c:null}}const n=r.response?.data,o=typeof n=="object"&&n!==null?n.message:void 0;return{kind:"other",message:(typeof o=="string"&&o?o:r.message)||"dry-run の実行に失敗しました"}}return{kind:"other",message:r instanceof Error&&r.message||"dry-run の実行に失敗しました"}}function is(r){return r!=null?`試行回数の上限に達しました。${r}秒後に再試行してください`:"試行回数の上限に達しました。しばらくしてから再試行してください"}function Ve(r){const i=r.field?`${r.field}: `:"",n=r.rowId?`(行: ${r.rowId})`:"";return`[${r.code}] ${i}${r.message}${n}`}var Ye=({value:r})=>(0,e.jsx)(g,{component:"pre",sx:{m:0,bgcolor:"#1e1e1e",color:"#cccccc",p:1.5,borderRadius:1,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:"0.8rem",border:"1px solid",borderColor:"grey.800",overflowX:"auto",whiteSpace:"pre"},children:JSON.stringify(r,null,2)}),os=({write:r})=>{const i=[];return r.data!=null&&i.push({label:"data",value:r.data}),r.operations!=null&&i.push({label:"operations",value:r.operations}),r.options!=null&&i.push({label:"options",value:r.options}),i.length===0?null:(0,e.jsx)(e.Fragment,{children:i.map(({label:n,value:o})=>(0,e.jsxs)(Ke,{disableGutters:!0,sx:{mt:.5},children:[(0,e.jsx)(Ge,{expandIcon:(0,e.jsx)(Je,{}),children:(0,e.jsx)(a,{variant:"caption",children:n})}),(0,e.jsx)(qe,{sx:{pt:0},children:(0,e.jsx)(Ye,{value:o})})]},n))})};function as(r){if(r.kind==="sendReportMail")return r.subject?`${r.kind}(プリセット: ${r.subject})`:r.kind;const i=r.to?` → ${r.to}`:"",n=r.subject?`(件名: ${r.subject})`:"";return`${r.kind}${i}${n}`}var ds={PASS:"通る(PASS)",BLOCKED:"ブロックされる(BLOCKED)",ERROR:"エラー(ERROR)"},cs={PASS:"success",BLOCKED:"warning",ERROR:"error"},ls=({open:r,onClose:i,ruleId:n,eventType:o,scriptCode:l,isMobile:c})=>{const[p,x]=(0,m.useState)(""),[h,t]=(0,m.useState)(""),[u,C]=(0,m.useState)(""),[B,O]=(0,m.useState)(null),v=o===E.ON_CREATE,R=o===E.ON_UPDATE,A=Q({mutationFn:I=>D.dryRun(n,{...I,scriptCode:l})}),G=()=>{if(O(null),R){if(!p.trim()){O("レコードIDを入力してください");return}let I;if(h.trim())try{const F=JSON.parse(h);if(!Array.isArray(F)){O("changes は配列のJSONで指定してください");return}I=F}catch{O("changes のJSONが不正です");return}A.mutate({recordId:p.trim(),changes:I});return}if(v){if(!u.trim()){O("record を入力してください");return}let I;try{const F=JSON.parse(u);if(typeof F!="object"||F===null||Array.isArray(F)){O("record はオブジェクトのJSONで指定してください");return}I=F}catch{O("record のJSONが不正です");return}A.mutate({record:I});return}O("このイベント種別(ON_CREATE / ON_UPDATE 以外)は dry-run に対応していません")},M=()=>{A.reset(),O(null),i()},S=A.data,w=A.isError?ts(A.error):null;return(0,e.jsxs)(ue,{open:r,onClose:M,maxWidth:c?"md":"lg",fullWidth:!0,fullScreen:c,children:[(0,e.jsx)(de,{children:"実レコードで試す(dry-run)"}),(0,e.jsxs)(ce,{children:[(0,e.jsx)(L,{severity:"info",sx:{mb:2},children:"指定したレコードを実際に読み、このルールを保存前の本文で流します。 レコード・明細・他のDBには何も書き込みません。メールは送らず、外部へのfetchは拒否されます。"}),!v&&!R&&(0,e.jsx)(L,{severity:"warning",sx:{mb:2},children:"dry-run は ON_CREATE / ON_UPDATE のトリガーのみ対応しています。"}),R&&(0,e.jsxs)(H,{spacing:2,sx:{mb:2},children:[(0,e.jsx)(_,{label:"レコードID",required:!0,fullWidth:!0,size:"small",value:p,onChange:I=>x(I.target.value),helperText:"dry-run で読み込む対象レコード(更新前の値を強整合で読みます)"}),(0,e.jsx)(_,{label:"changes(任意・JSON配列。REST PATCH と同じ operations)",fullWidth:!0,multiline:!0,rows:4,size:"small",value:h,onChange:I=>t(I.target.value),placeholder:'[{ "op": "replace", "path": "price", "value": 1200 }]',helperText:"省略すると「値を変えずに保存した」扱いになります"})]}),v&&(0,e.jsx)(H,{spacing:2,sx:{mb:2},children:(0,e.jsx)(_,{label:"record(必須・JSONオブジェクト)",required:!0,fullWidth:!0,multiline:!0,rows:6,size:"small",value:u,onChange:I=>C(I.target.value),placeholder:'{ "name": "サンプル", "price": 1000 }',helperText:"新規作成のときの保存内容"})}),B&&(0,e.jsx)(L,{severity:"error",sx:{mb:2},"data-testid":"dry-run-input-error",children:B}),(0,e.jsx)(Se,{sx:{mb:2}}),(0,e.jsx)(a,{variant:"subtitle2",gutterBottom:!0,children:"結果"}),!S&&!w&&!A.isPending&&(0,e.jsx)(a,{variant:"body2",color:"text.secondary",sx:{mb:2},children:"まだ実行していません"}),w&&(0,e.jsxs)(L,{severity:"error",sx:{mb:2},"data-testid":"dry-run-request-error",children:[w.kind==="forbidden"&&"このルールを編集する権限、または対象レコードを読む権限がありません",w.kind==="rateLimited"&&is(w.retryAfterSeconds),w.kind==="other"&&w.message]}),A.isPending&&(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"実行中…"}),S&&(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(L,{severity:"info",variant:"outlined",sx:{mb:2},"data-testid":"dry-run-no-write-notice",children:"dry-run: 何も書き込んでいません"}),(0,e.jsx)(us,{result:S})]})]}),(0,e.jsxs)(le,{children:[(0,e.jsx)(f,{onClick:M,children:"閉じる"}),(0,e.jsx)(f,{onClick:G,variant:"contained",color:"primary",disabled:A.isPending||!v&&!R,children:"実レコードで試す(dry-run)"})]})]})},us=({result:r})=>{const i=r.errors.some(n=>n.code===Xr);return(0,e.jsxs)(H,{spacing:2,children:[(0,e.jsxs)(g,{children:[(0,e.jsx)(J,{label:ds[r.outcome],color:cs[r.outcome],"data-testid":"dry-run-outcome"}),(0,e.jsxs)(a,{variant:"caption",sx:{ml:1},children:["実行時間: ",r.executionTimeMs,"ms"]})]}),i&&(0,e.jsx)(L,{severity:"info","data-testid":"dry-run-fetch-rejected",children:"このルールは外部への fetch を試みましたが、dry-run では外部通信を行わないため拒否しました。"}),(0,e.jsx)(z,{title:"errors",testId:"dry-run-errors",children:r.errors.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em"},children:r.errors.map((n,o)=>(0,e.jsx)("li",{children:(0,e.jsx)(a,{variant:"body2",children:Ve(n)})},o))})}),(0,e.jsx)(z,{title:"warnings",testId:"dry-run-warnings",children:r.warnings.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em"},children:r.warnings.map((n,o)=>(0,e.jsx)("li",{children:(0,e.jsx)(a,{variant:"body2",children:Ve(n)})},o))})}),(0,e.jsx)(z,{title:"変更された項目 (changedFields)",testId:"dry-run-changed-fields",children:r.changedFields.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)(a,{variant:"body2",children:r.changedFields.join(", ")})}),(0,e.jsx)(z,{title:"変更された明細行 (changedNodes)",testId:"dry-run-changed-nodes",children:r.changedNodes.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em"},children:r.changedNodes.map((n,o)=>(0,e.jsx)("li",{children:(0,e.jsx)(a,{variant:"body2",children:`${n.fieldCode} / ${n.change}${n.rowId?`(行: ${n.rowId})`:""}`})},o))})}),(0,e.jsx)(z,{title:"書き込む予定だったもの(実行されていない・本番なら書く予定のもの)",testId:"dry-run-planned-writes",children:r.plannedWrites.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em",listStyle:"none"},children:r.plannedWrites.map(n=>(0,e.jsxs)("li",{style:{marginBottom:8},children:[(0,e.jsx)(a,{variant:"body2",children:`op${n.index}: ${n.op} ${n.formId}${n.recordId?` / ${n.recordId}`:""}`}),(0,e.jsx)(os,{write:n})]},n.index))})}
1),(0,e.jsx)(z,{title:"保存される内容 (record)",testId:"dry-run-record",children:r.record==null?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsxs)(Ke,{disableGutters:!0,children:[(0,e.jsx)(Ge,{expandIcon:(0,e.jsx)(Je,{}),children:(0,e.jsx)(a,{variant:"caption",children:"record"})}),(0,e.jsx)(qe,{sx:{pt:0},children:(0,e.jsx)(Ye,{value:r.record})})]})}),(0,e.jsx)(z,{title:"送らなかったメール等(suppressedSideEffects)",testId:"dry-run-suppressed-side-effects",children:r.suppressedSideEffects.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em"},children:r.suppressedSideEffects.map((n,o)=>(0,e.jsx)("li",{children:(0,e.jsx)(a,{variant:"body2",children:as(n)})},o))})}),(0,e.jsx)(z,{title:"コンソールログ (consoleLogs)",testId:"dry-run-console-logs",children:r.consoleLogs.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)(g,{sx:{bgcolor:"#1e1e1e",color:"#cccccc",p:1.5,borderRadius:1,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, monospace",fontSize:"0.8rem",border:"1px solid",borderColor:"grey.800"},children:r.consoleLogs.map((n,o)=>(0,e.jsx)("div",{children:`[${n.level.toUpperCase()}] ${n.message}`},o))})}),(0,e.jsx)(z,{title:"dry-run が本番と違う点(limitations)",testId:"dry-run-limitations",children:r.limitations.length===0?(0,e.jsx)(a,{variant:"body2",color:"text.secondary",children:"なし"}):(0,e.jsx)("ul",{style:{margin:0,paddingLeft:"1.25em"},children:r.limitations.map((n,o)=>(0,e.jsx)("li",{children:(0,e.jsx)(a,{variant:"body2",children:n})},o))})})]})},z=({title:r,testId:i,children:n})=>(0,e.jsxs)(g,{"data-testid":i,children:[(0,e.jsx)(a,{variant:"subtitle2",gutterBottom:!0,children:r}),n]}),K={async searchUsers(r){return Yr.searchUsers(r)},async checkScriptRulePermissions(r){return(await Z.get(`/api/v1/permissions/script-rules/${r}/check`)).data},async getScriptRulePermissions(r){return(await Z.get(`/api/v1/permissions/script-rules/${r}/users`)).data},async grantScriptRulePermission(r){await Z.post("/api/v1/permissions/script-rules/grant",r)},async revokeScriptRulePermission(r){await Z.delete("/api/v1/permissions/script-rules/revoke",{data:r})}},xs=[{value:"EDIT",label:"編集(管理画面でのスクリプトルール編集・削除・公開)"}],hs=({open:r,onClose:i,ruleId:n})=>(0,e.jsx)(Zr,{open:r,onClose:i,config:{resourceId:n,description:"ユーザーのスクリプトルール編集権限を編集します",permissionOptions:xs,userSearchQueryKey:["users","search"],permissionsQueryKey:["permissions","scriptRules",n,"users"],invalidateQueryKey:["permissions","scriptRules",n],searchUsers:o=>K.searchUsers(o),getPermissions:()=>K.getScriptRulePermissions(n),grantPermissions:async(o,l)=>{const c=(await Promise.allSettled(l.map(p=>K.grantScriptRulePermission({userId:o,ruleId:n,permissionType:p})))).filter(p=>p.status==="rejected");if(c.length>0)throw new Error(`${c.length}件の権限付与に失敗しました`)},revokePermissions:async(o,l)=>{const c=(await Promise.allSettled(l.map(p=>K.revokeScriptRulePermission({userId:o,ruleId:n,permissionType:p})))).filter(p=>p.status==="rejected");if(c.length>0)throw new Error(`${c.length}件の権限削除に失敗しました`)}}}),ms=({ruleId:r,canEdit:i})=>{const{showSnackbar:n}=Xe(),o=Ie(),[l,c]=(0,m.useState)(!1),[p,x]=(0,m.useState)(null),{data:h=[],isLoading:t,error:u}=ae({queryKey:["permissions","scriptRules",r,"users"],queryFn:()=>K.getScriptRulePermissions(r),enabled:!!r}),C=Q({mutationFn:v=>K.revokeScriptRulePermission({userId:v.userId,ruleId:r,permissionType:v.permissionType}),onSuccess:()=>{o.invalidateQueries({queryKey:["permissions","scriptRules",r]}),n("権限を取り消しました","success")},onError:v=>{n(v.message||"権限の取り消しに失敗しました","error")}}),B=(v,R)=>{x({userId:v,permissionType:R})},O=()=>{p&&C.mutate(p),x(null)};return t?(0,e.jsx)(g,{sx:{display:"flex",justifyContent:"center",p:4},children:(0,e.jsx)(xe,{})}):u?(0,e.jsx)(L,{severity:"error",sx:{m:2},children:"権限情報の取得に失敗しました"}):(0,e.jsxs)(g,{sx:{p:3},children:[(0,e.jsxs)(g,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3},children:[(0,e.jsx)(a,{variant:"h6",children:"アクセス権限管理"}),i&&(0,e.jsx)(f,{variant:"contained",startIcon:(0,e.jsx)(gr,{}),onClick:()=>c(!0),children:"権限を付与"})]}),!i&&(0,e.jsx)(L,{severity:"info",sx:{mb:2},children:"編集権限がないため、権限の付与・取り消しはできません"}),(0,e.jsx)(jr,{component:be,variant:"outlined",children:(0,e.jsxs)(Cr,{children:[(0,e.jsx)(Rr,{children:(0,e.jsxs)(ye,{children:[(0,e.jsx)($,{children:"ユーザー名"}),(0,e.jsx)($,{children:"付与日時"}),i&&(0,e.jsx)($,{align:"right",children:"操作"})]})}),(0,e.jsx)(fr,{children:h.length===0?(0,e.jsx)(ye,{children:(0,e.jsx)($,{colSpan:i?3:2,align:"center",children:(0,e.jsx)(a,{variant:"body2",color:"text.secondary",sx:{py:4},children:"権限が設定されていません"})})}):h.map((v,R)=>(0,e.jsxs)(ye,{children:[(0,e.jsx)($,{children:v.userName||v.userId}),(0,e.jsx)($,{children:v.grantedAt?new Date(v.grantedAt).toLocaleStr
1ing("ja-JP"):"-"}),i&&(0,e.jsx)($,{align:"right",children:(0,e.jsx)(Ce,{size:"small",color:"error",onClick:()=>B(v.userId,v.permissionType),disabled:C.isPending,children:(0,e.jsx)(_r,{})})})]},`${v.userId}-${v.permissionType}-${R}`))})]})}),(0,e.jsx)(hs,{open:l,onClose:()=>c(!1),ruleId:r}),(0,e.jsx)(Wr,{open:p!==null,title:"権限の取り消し",message:"この権限を取り消しますか?",confirmText:"取り消す",confirmColor:"error",onConfirm:O,onCancel:()=>x(null),loading:C.isPending})]})},ps=r=>{const{userInfo:i,hasRole:n}=Fr(),o=Ie(),l=n("ADMIN"),c=n("DEVELOPER"),p=!l&&c,{data:x,isLoading:h,error:t}=ae({queryKey:["permissions","scriptRules",r,i?.userId],queryFn:async()=>(await Z.get(`/api/v1/permissions/script-rules/${r}/check`)).data,enabled:!!r&&!!i&&p,staleTime:300*1e3,gcTime:600*1e3,retry:1}),u=(0,m.useCallback)(async()=>{await o.invalidateQueries({queryKey:["permissions","scriptRules",r]})},[o,r]);return l?{canEdit:!0,isLoading:!1,error:null,invalidatePermissions:u}:c?{canEdit:x?.canEdit??!1,isLoading:h,error:t,invalidatePermissions:u}:{canEdit:!1,isLoading:!1,error:null,invalidatePermissions:u}},js=`/**
2 * Available API:
3 *   api.getRecords(formId, options)          - get records
4 *   api.getRecordsPage(formId, options)      - get { records, nextToken } (repeat until nextToken is null)
5 *   api.createRecord(formId, data)           - create record
6 *   api.updateRecord(formId, recordId, data) - update record (arrays are replaced as a whole)
7 *   api.patchRecord(formId, recordId, ops)   - partial update, same operations as REST PATCH (rows by __rowId)
8 *   api.deleteRecord(formId, recordId)       - delete record
9 *
10 * Available variables:
11 *   record    - current record
12 *   oldRecord - previous record (onUpdate only)
13 *   context.changedFields - changed field codes (onCreate / onUpdate)
14 *   context.changedNodes  - added / updated / deleted rows: { rowId, fieldCode, change } (onCreate / onUpdate)
15 *   formId    - target form ID
16 *   userId    - current user ID
17 *   console   - console.log() / console.error() / console.warn()
18 */
19
20// Example: validate field value
21if (record.price < 0) {
22  console.error('price must be >= 0');
23}
24
25console.log('script executed');
26`,gs={record:{id:"01KFQ5WQTTVN1T9YBZSBM745NZ",name:"サンプル商品",price:1e3,quantity:10},formId:"01KFQ5WQTTVN1T9YBZSBM745NZ",userId:"user123",tenantId:1},oe=({children:r,value:i,index:n})=>(0,e.jsx)("div",{hidden:i!==n,children:i===n&&(0,e.jsx)(g,{sx:{p:2},children:r})}),_s=()=>{const r=Dr(),{id:i}=zr(),[n]=Hr(),o=n.get("v"),l=Ie(),c=i&&i!=="new",{canEdit:p}=ps(c?i:""),x=(0,m.useRef)(null),h=vr(mr().breakpoints.down("sm")),[t,u]=(0,m.useState)({name:"",ruleName:"",eventType:E.ON_CREATE,targetFormId:"",scriptCode:js,priority:50,isActive:!0,timeoutSeconds:30,errorHandling:q.LOG_AND_CONTINUE,runOnScriptWrites:!1}),[C,B]=(0,m.useState)(JSON.stringify(gs,null,2)),[O,v]=(0,m.useState)(null),[R,A]=(0,m.useState)(0),[G,M]=(0,m.useState)({}),{showSnackbar:S}=Xe(),[w,I]=(0,m.useState)(!1),[F,he]=(0,m.useState)(!1),[Ze,Me]=(0,m.useState)([]),[er,Re]=(0,m.useState)(!1),[Ne,W]=(0,m.useState)(null),[rr,Oe]=(0,m.useState)(!1),[sr,ee]=(0,m.useState)(!1),[P,re]=(0,m.useState)(null),[nr,se]=(0,m.useState)(null),{data:j,isLoading:tr}=ae({queryKey:["scriptRule",i],queryFn:()=>D.get(i),enabled:!!c}),{data:k}=ae({queryKey:["scriptRuleVersions",i],queryFn:()=>D.listVersions(i),enabled:!!c}),me=Q({mutationFn:s=>c?D.update(i,s):D.create(s),onSuccess:async s=>{if(S("保存しました","success"),!c)r(`/admin/scripts/${s.id}/edit`);else{const d=await D.listVersions(i),y=k?.find(te=>te.versionNumber===P)?.status==="DRAFT";let N;if(y)N=P;else{const te=d?.filter(ge=>ge.status==="DRAFT")??[];N=te.length>0?Math.max(...te.map(ge=>ge.versionNumber)):P}l.setQueryData(["scriptRuleVersions",i],d),N&&(re(N),r(`/admin/scripts/${i}/edit?v=${N}`,{replace:!0})),se(N),ee(!0)}},onError:s=>{s.response?.status===409&&c?(S("データが更新されています。最新データを取得します...","warning"),l.invalidateQueries({queryKey:["scriptRule",i]})):S(s.response?.data?.message||s.response?.data?.reason||s.message||`スクリプトルールの${c?"更新":"作成"}に失敗しました`,"error")}}),Pe=async(s,d)=>{l.setQueryData(["scriptRule",i],s);const y=await D.listVersions(i);
26l.setQueryData(["scriptRuleVersions",i],y),l.invalidateQueries({queryKey:["scriptRules"]});const N=y?d(y):void 0;re(N?.versionNumber??null),Le(!1),N&&r(`/admin/scripts/${i}/edit?v=${N.versionNumber}`,{replace:!0})},ne=Q({mutationFn:s=>D.publishVersion(i,s),onSuccess:async s=>{S("公開しました","success"),await Pe(s,d=>d.find(y=>y.status==="PUBLISHED"))},onError:s=>{S(s.message||"公開に失敗しました","error")}}),pe=Q({mutationFn:()=>D.unpublishRule(i),onSuccess:async s=>{S("非公開にしました","success"),await Pe(s,d=>d.find(y=>y.status==="DRAFT")||d.find(y=>y.status==="ARCHIVED"))},onError:s=>{S(s.message||"非公開に失敗しました","error")}}),Ae=Q({mutationFn:s=>D.test(s),onSuccess:s=>{v(s),S(s.success?"テスト実行成功":"テスト実行失敗",s.success?"success":"error")},onError:s=>{S(s.message||"テスト実行に失敗しました","error")}}),ir=(0,m.useMemo)(()=>{if(!c||!j)return;const s=P?k?.find(N=>N.versionNumber===P):null,d=k?.find(N=>N.status==="PUBLISHED"),y=[];return s&&y.push(`Editing: v${s.versionNumber} (${s.status})`),d&&d.versionNumber!==P&&y.push(`Running: v${d.versionNumber}`),y.join(" | ")||(j.isActive?"PUBLISHED":"DRAFT")},[c,j,P,k]),[_e,Le]=(0,m.useState)(!1);(0,m.useEffect)(()=>{if(j&&k!==void 0&&!_e){const s=o?k?.find(y=>y.versionNumber===parseInt(o,10)):k?.find(y=>y.status==="PUBLISHED")||k?.find(y=>y.status==="DRAFT"),d=s;u({name:d?.name??j.name,ruleName:d?.name??j.ruleName??j.name,eventType:j.eventType,actionId:j.actionId,scheduleType:d?.scheduleType??j.scheduleType,scheduleExpression:d?.scheduleExpression??j.scheduleExpression,scheduleTimezone:d?.scheduleTimezone??j.scheduleTimezone,targetFormId:d?.targetFormId??j.targetFormId,scriptCode:d?.scriptCode??j.scriptCode,priority:d?.priority??j.priority,isActive:j.isActive,maxExecutionTimeMs:d?.maxExecutionTimeMs??j.maxExecutionTimeMs,timeoutSeconds:Math.floor((d?.maxExecutionTimeMs??j.maxExecutionTimeMs)/1e3),errorHandling:Te(d?.errorHandling??j.errorHandling),runOnScriptWrites:j.runOnScriptWrites??!1,version:j.version}),re(s?.versionNumber||null),s&&!o&&r(`/admin/scripts/${i}/edit?v=${s.versionNumber}`,{replace:!0}),Le(!0)}},[j,k,_e,o]),(0,m.useEffect)(()=>{(async()=>{Re(!0);try{Me(await $r.getFormList("PUBLISHED"))}catch{}finally{Re(!1)}})()},[]);const or=()=>{const s={},d=t.ruleName||t.name;return d?d.length>255&&(s.ruleName=U.SCRIPT_NAME_TOO_LONG):s.ruleName=U.REQUIRED_FIELD,t.eventType!==E.SCHEDULED&&(t.targetFormId?Kr(t.targetFormId)||(s.targetFormId=U.INVALID_ULID):s.targetFormId=U.REQUIRED_FIELD),t.scriptCode?Jr(t.scriptCode)||(s.scriptCode=U.FORBIDDEN_FUNCTION):s.scriptCode=U.REQUIRED_FIELD,t.priority&&!qr(t.priority)&&(s.priority=U.INVALID_PRIORITY),t.timeoutSeconds&&!Gr(t.timeoutSeconds)&&(s.timeoutSeconds=U.INVALID_TIMEOUT),M(s),Object.keys(s).length===0},je=()=>{if(or()){const s={...t};s.eventType===E.SCHEDULED&&!s.targetFormId&&(s.targetFormId=Qr);const d=c?{...s,version:s.version??0,editingVersionNumber:P||void 0}:s;me.mutate(d)}else S("入力内容にエラーがあります","error")},ar=()=>{try{const s=JSON.parse(C),d={scriptCode:t.scriptCode,context:s,timeoutSeconds:t.timeoutSeconds};Ae.mutate(d)}catch{S("テストコンテキストのJSONが不正です","error")}},dr=(s,d)=>{x.current=s,d.editor.defineTheme("awll-studio-dark",{base:"vs-dark",inherit:!0,rules:[],colors:{"editor.background":"#1e1e1e"}}),d.editor.setTheme("awll-studio-dark"),s.addCommand(d.KeyMod.CtrlCmd|d.KeyCode.KeyS,()=>{je()})},cr=()=>{if(x.current){const s=x.current.getValue();navigator.clipboard.writeText(s),S("コードをクリップボードにコピーしました","success")}};return tr?(0,e.jsx)(g,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"400px",children:(0,e.jsx)(xe,{})}):(0,e.jsxs)(Br,{breadcrumbs:[{label:"スクリプトルール管理",onClick:()=>r("/admin/scripts")},{label:c?"スクリプト編集":"新規作成"}],backPath:"/admin/scripts",title:c?"スクリプト編集":"新規作成",subtitle:ir,actions:h?(0,e.jsxs)(H,{direction:"row",spacing:.5,alignItems:"center",children:[(0,e.jsx)(f,{variant:"contained",color:"primary",size:"small",startIcon:(0,e.jsx)(we,{}),onClick:je,disabled:me.isPending,sx:{minWidth:"auto"},children:"保存"}),(0,e.jsx)(Ce,{size:"small",onClick:s=>W(s.currentTarget),"aria-label":"メニュー",children:(0,e.jsx)(Ar,{})}),(0,e.jsxs)(br,{anchorEl:Ne,open:!!Ne,onClose:()=>W(null),children:[(0,e.jsxs)(T,{onClick:()=>{I(!0),W(null)},children:[(0,e.jsx)(ze,{fontSize:"small",sx:{mr:1}}),"テスト実行"]}),c&&(0,e.jsxs)(T,{onClick:()=>{he(!0),W(null)},children:[(0,e.jsx)(Fe,{fontSize:"small",sx:{mr:1}}),"実レコードで試す(dry-run)"]}),c&&(0,e.jsxs)(T,{onClick:()=>{r(`/admin/scripts/${i}/logs`),W(null)},children:[(0,e.jsx)(fe,{fontSize:"small",sx:{mr:1}}),"実行履歴"]}),(0,e.jsxs)(T,{onClick:()=>{r("/admin/scripts"),W(null)},children:[(0,e.jsx)(Or,{fontSize:"small",sx:{mr:1}}),"閉じる"]})]})]}):(0,e.jsxs)(H,{direction:"row",spacing:1,children:[(0,e.jsx)(f,{variant:"contained",color:"primary",startIcon:(0,e.jsx)(we,{}),onClick:je,disabled:me.isPending,children:"保存"}),(0,e.jsx)(f,{variant:"outlined",startIcon:(0,e.jsx)(ze,{}),onClick:()=>I(!0),children:"テスト実行"}),c&&(0,e.jsx)(f,{variant:"outlined",startIcon:(0,e.jsx)(Fe,{}),onClick:()=>he(!0),children:"実レコードで試す(dry-run)"}),c&&(0,e.jsxs)(e.Fragment,{children:[j?.isActive&&(0,e.jsx)(f,{variant:"outlined",color:"warning",startIcon:(0,e.jsx)(Qe,{}),onClick:()=>pe.mutate(),disabled:pe.isPending,children:"非公開"}),P&&(0,e.jsxs)(f,{variant:"contained",color:"success",startIcon:(0,e.jsx)(Ee,{}),onClick:()=>ne.mutate(P),disabled:ne.isPending,children:["公開 v",P]}),(0,e.jsx)(f,{variant:"outlined",startIcon:(0,e.jsx)(fe,{}),onClick:()=>Oe(!0),children:h?"":"バージョン"}),(0,e.jsx)(f,{variant:"outlined",startIcon:(0,e.jsx)(fe,{}),onClick:()=>r(`/admin/scripts/${i}/logs`),children:h?"":"履歴"})]})]}),children:[(0,e.jsx)(Nr,{children:(0,e.jsxs)(xr,{sx:{px:{xs:1,sm:2}},children:[(0,e.jsxs)(pr,{value:R,onChange:(s,d)=>A(d),variant:h?"fullWidth":"standard",sx:{"& .MuiTab-root":{fontSize:{xs:"0.75rem",sm:"0.875rem"},minHeight:{xs:36,sm:48},px:{xs:1,sm:2}}},children:[(0,e.jsx)(ie,{label:h?"設定":"基本設定"}),(0,e.jsx)(ie,{label:h?"エディタ":"スクリプトエディタ"}),(0,e.jsx)(ie,{label:"ヘルプ"}),c&&(0,e.jsx)(ie,{label:"アクセス権限"})]}),(0,e.jsx)(oe,{value:R,index:0,children:(0,e.jsx)(rs,{formData:t,setFormData:u,errors:G,isMobile:h,formOptions:Ze,loadingForms:er})}),(0,e.jsx)(oe,{value:R,index:1,children:(0,e.jsxs)(g,{sx:{position:"relative"},children:[(0,e.jsx)(g,{sx:{position:"absolute",right:0,top:-40,zIndex:1},children:(0,e.jsx)(Tr,{title:"コードをコピー",children:(0,e.jsx)(Ce,{size:"small",onClick:cr,children:(0,e.jsx)(hr,{fontSize:"small"})})})}),(0,e.jsx)(g,{sx:{width:"100%",border:"1px solid",borderColor:"grey.800",borderRadius:1,backgroundColor:"#1e1e1e",overflow:"hidden"},children:(0,e.jsx)(Lr,{height:h?"calc(100dvh - 400px)":"calc(100dvh - 350px)",defaultLanguage:"javascript",value:t.scriptCode,onChange:s=>u({...t,scriptCode:s||""}),onMount:dr,options:{minimap:{enabled:!h},fontSize:h?12:14,fontFamily:"'JetBrains Mono', 'Fira Code', Consolas, 'Courier New', monospace",fontLigatures:!0,lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,tabSize:2,wordWrap:"on",renderLineHighlight:"line",cursorBlinking:"smooth",cursorSmoothCaretAnimation:"on",smoothScrolling:!0,bracketPairColorization:{enabled:!0},formatOnPaste:!0,formatOnType:!1,contextmenu:!0,quickSuggestions:!0,suggestOnTriggerCharacters:!0,acceptSuggestionOnEnter:"on",autoClosingBrackets:"always",autoClosingQuotes:"always",autoIndent:"full",folding:!0,foldingHighlight:!0,showFoldingControls:"mouseover"}})}),G.scriptCode&&(0,e.jsx)(L,{severity:"error",sx:{mt:1},children:G.scriptCode})]})}),(0,e.jsx)(oe,{value:R,index:2,children:(0,e.jsx)(ss,{isMobile:h})}),c&&(0,e.jsx)(oe,{value:R,index:3,children:(0,e.jsx)(ms,{ruleId:i,canEdit:p})})]})}),(0,e.jsx)(ns,{open:w,onClose:()=>
26I(!1),testContext:C,onTestContextChange:B,testResult:O,isPending:Ae.isPending,onTest:ar,isMobile:h}),c&&(0,e.jsx)(ls,{open:F,onClose:()=>he(!1),ruleId:i,eventType:t.eventType,scriptCode:t.scriptCode,isMobile:h}),(0,e.jsx)(Mr,{open:sr,onClose:()=>{ee(!1),se(null)},onKeepDraft:()=>{ee(!1),se(null)},onPublish:()=>{ee(!1);const s=nr??P;se(null),s&&ne.mutate(s)},isActive:j?.isActive??!1}),(0,e.jsx)(es,{open:rr,onClose:()=>Oe(!1),versions:k,editingVersionNumber:P,onPublish:s=>ne.mutate(s),onUnpublish:()=>pe.mutate(),onRestore:s=>{u(d=>({...d,scriptCode:s.scriptCode,name:s.name||d.name,ruleName:s.name||d.ruleName,description:s.description??d.description,targetFormId:s.targetFormId||d.targetFormId,priority:s.priority??d.priority,errorHandling:Te(s.errorHandling??d.errorHandling),maxExecutionTimeMs:s.maxExecutionTimeMs??d.maxExecutionTimeMs,timeoutSeconds:s.maxExecutionTimeMs?Math.floor(s.maxExecutionTimeMs/1e3):d.timeoutSeconds,scheduleType:s.scheduleType??d.scheduleType,scheduleExpression:s.scheduleExpression??d.scheduleExpression,scheduleTimezone:s.scheduleTimezone??d.scheduleTimezone})),re(s.versionNumber),r(`/admin/scripts/${i}/edit?v=${s.versionNumber}`,{replace:!0}),S(`v${s.versionNumber} をエディタに復元しました`,"info")}})]})};export{_s as ScriptEditorPage,_s as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.