Compare commits
56 Commits
master
...
maxz-real-
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e72acf84b | |||
| 52f4af759e | |||
| 461cd26690 | |||
| 4c6b2ea844 | |||
| 418f45f997 | |||
| 51ebe99d1c | |||
| 2f1f8a60fc | |||
| 64795a80c7 | |||
| 94a17073dd | |||
| 7f7d625fdd | |||
| 6902079866 | |||
|
|
f34dec1054 | ||
|
|
01b64f1aba | ||
|
|
3367ada343 | ||
|
|
f4ea3eaccb | ||
|
|
4adb8401d6 | ||
| df59bff6ae | |||
|
|
fce56e43c3 | ||
|
|
42618602f4 | ||
|
|
e02131846b | ||
|
|
2c3b27d9de | ||
|
|
6ccc833f7d | ||
|
|
a0ecc2eee3 | ||
| 59e6d33656 | |||
| b641c729c2 | |||
| 142cdcda38 | |||
| fc2669dabf | |||
| 8e095b51e3 | |||
| ff03490209 | |||
| 40cd9998d0 | |||
| 973ba159b4 | |||
| 063a5af822 | |||
|
|
6a06c71104 | ||
| cccff1d16d | |||
|
|
100d8de54f | ||
|
|
7c667660c0 | ||
|
|
4eb56372a5 | ||
|
|
16edd398be | ||
|
|
4e08159e6d | ||
| 7a9718a6fa | |||
| f597f7aa5a | |||
| 0ec2b22754 | |||
| a04f7b1bd5 | |||
| 2240603c2c | |||
| d9a7532805 | |||
| e59f9b802b | |||
| ad1c330231 | |||
| a1905a1274 | |||
| e515f99a44 | |||
| d42fac9a7d | |||
| da3df6f0a7 | |||
| 0bf3a1b2c8 | |||
| b63999c7f9 | |||
| 772ab3c6a5 | |||
| e3c66a5bc4 | |||
| 9e510b0183 |
@@ -259,11 +259,14 @@ async def upload(files:t.List[UploadFile] = File(...)):
|
|||||||
|
|
||||||
@r.get("/allapps",)
|
@r.get("/allapps",)
|
||||||
async def allapps():
|
async def allapps():
|
||||||
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
try:
|
||||||
url = f"{c.BASE_URL}{c.API_V1_STR}/apps.json"
|
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
||||||
r = httpx.get(url,headers=headers)
|
url = f"{c.BASE_URL}{c.API_V1_STR}/apps.json"
|
||||||
return r.json()
|
r = httpx.get(url,headers=headers,timeout=httpx.Timeout(10))
|
||||||
|
return r.json()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"異常発生しました。{type(e).__name__},{e}")
|
||||||
|
|
||||||
@r.get("/app")
|
@r.get("/app")
|
||||||
async def app(app:str):
|
async def app(app:str):
|
||||||
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
headers={c.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ from fastapi import Request,Depends, APIRouter, UploadFile,HTTPException,File
|
|||||||
from app.db import Base,engine
|
from app.db import Base,engine
|
||||||
from app.db.session import get_db
|
from app.db.session import get_db
|
||||||
from app.db.crud import *
|
from app.db.crud import *
|
||||||
from app.db.schemas import AppBase, AppEdit, App,Kintone
|
from app.db.schemas import *
|
||||||
|
from typing import List
|
||||||
|
|
||||||
platform_router = r = APIRouter()
|
platform_router = r = APIRouter()
|
||||||
|
|
||||||
@@ -64,4 +65,76 @@ async def kintone_data(
|
|||||||
db=Depends(get_db),
|
db=Depends(get_db),
|
||||||
):
|
):
|
||||||
kintone = get_kintones(db, type)
|
kintone = get_kintones(db, type)
|
||||||
return kintone
|
return kintone
|
||||||
|
|
||||||
|
@r.get(
|
||||||
|
"/actions",
|
||||||
|
response_model=t.List[Action],
|
||||||
|
response_model_exclude={"id"},
|
||||||
|
response_model_exclude_none=True,
|
||||||
|
)
|
||||||
|
async def action_data(
|
||||||
|
request: Request,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
actions = get_actions(db)
|
||||||
|
return actions
|
||||||
|
|
||||||
|
@r.get(
|
||||||
|
"/flow/{flowid}",
|
||||||
|
response_model=Flow,
|
||||||
|
response_model_exclude_none=True,
|
||||||
|
)
|
||||||
|
async def flow_details(
|
||||||
|
request: Request,
|
||||||
|
flowid: str,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
app = get_flow(db, flowid)
|
||||||
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
@r.get(
|
||||||
|
"/flows/{appid}",
|
||||||
|
response_model=List[Flow],
|
||||||
|
response_model_exclude_none=True,
|
||||||
|
)
|
||||||
|
async def flow_list(
|
||||||
|
request: Request,
|
||||||
|
appid: str,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
flows = get_flows_by_app(db, appid)
|
||||||
|
return flows
|
||||||
|
|
||||||
|
|
||||||
|
@r.post("/flow", response_model=Flow, response_model_exclude_none=True)
|
||||||
|
async def flow_create(
|
||||||
|
request: Request,
|
||||||
|
flow: FlowBase,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
return create_flow(db, flow)
|
||||||
|
|
||||||
|
|
||||||
|
@r.put(
|
||||||
|
"/flow/{flowid}", response_model=Flow, response_model_exclude_none=True
|
||||||
|
)
|
||||||
|
async def flow_edit(
|
||||||
|
request: Request,
|
||||||
|
flow: FlowBase,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
return edit_flow(db, flow)
|
||||||
|
|
||||||
|
|
||||||
|
@r.delete(
|
||||||
|
"/flow/{flowid}", response_model=Flow, response_model_exclude_none=True
|
||||||
|
)
|
||||||
|
async def flow_delete(
|
||||||
|
request: Request,
|
||||||
|
flowid: str,
|
||||||
|
db=Depends(get_db),
|
||||||
|
):
|
||||||
|
|
||||||
|
return delete_flow(db, flowid)
|
||||||
@@ -115,4 +115,68 @@ def get_kintones(db: Session, type: int):
|
|||||||
kintones = db.query(models.Kintone).filter(models.Kintone.type == type).all()
|
kintones = db.query(models.Kintone).filter(models.Kintone.type == type).all()
|
||||||
if not kintones:
|
if not kintones:
|
||||||
raise HTTPException(status_code=404, detail="Data not found")
|
raise HTTPException(status_code=404, detail="Data not found")
|
||||||
return kintones
|
return kintones
|
||||||
|
|
||||||
|
def get_actions(db: Session):
|
||||||
|
actions = db.query(models.Action).all()
|
||||||
|
if not actions:
|
||||||
|
raise HTTPException(status_code=404, detail="Data not found")
|
||||||
|
return actions
|
||||||
|
|
||||||
|
|
||||||
|
def create_flow(db: Session, flow: schemas.FlowBase):
|
||||||
|
db_flow = models.Flow(
|
||||||
|
flowid=flow.flowid,
|
||||||
|
appid=flow.appid,
|
||||||
|
eventid=flow.eventid,
|
||||||
|
name=flow.name,
|
||||||
|
content=flow.content
|
||||||
|
)
|
||||||
|
db.add(db_flow)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_flow)
|
||||||
|
return db_flow
|
||||||
|
|
||||||
|
def delete_flow(db: Session, flowid: str):
|
||||||
|
flow = get_flow(db, flowid)
|
||||||
|
if not flow:
|
||||||
|
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Flow not found")
|
||||||
|
db.delete(flow)
|
||||||
|
db.commit()
|
||||||
|
return flow
|
||||||
|
|
||||||
|
|
||||||
|
def edit_flow(
|
||||||
|
db: Session, flow: schemas.FlowBase
|
||||||
|
) -> schemas.Flow:
|
||||||
|
db_flow = get_flow(db, flow.flowid)
|
||||||
|
if not db_flow:
|
||||||
|
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Flow not found")
|
||||||
|
update_data = flow.dict(exclude_unset=True)
|
||||||
|
|
||||||
|
for key, value in update_data.items():
|
||||||
|
setattr(db_flow, key, value)
|
||||||
|
|
||||||
|
db.add(db_flow)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(db_flow)
|
||||||
|
return db_flow
|
||||||
|
|
||||||
|
|
||||||
|
def get_flows(db: Session, flowid: str):
|
||||||
|
flows = db.query(models.Flow).all()
|
||||||
|
if not flows:
|
||||||
|
raise HTTPException(status_code=404, detail="Data not found")
|
||||||
|
return flows
|
||||||
|
|
||||||
|
def get_flow(db: Session, flowid: str):
|
||||||
|
flow = db.query(models.Flow).filter(models.Flow.flowid == flowid).first()
|
||||||
|
if not flow:
|
||||||
|
raise HTTPException(status_code=404, detail="Data not found")
|
||||||
|
return flow
|
||||||
|
|
||||||
|
def get_flows_by_app(db: Session, appid: str):
|
||||||
|
flows = db.query(models.Flow).filter(models.Flow.appid == appid).all()
|
||||||
|
if not flows:
|
||||||
|
raise HTTPException(status_code=404, detail="Data not found")
|
||||||
|
return flows
|
||||||
@@ -1,12 +1,16 @@
|
|||||||
from sqlalchemy import Boolean, Column, Integer, String
|
from sqlalchemy import Boolean, Column, Integer, String, DateTime
|
||||||
|
from sqlalchemy.ext.declarative import as_declarative
|
||||||
from .session import Base
|
from datetime import datetime
|
||||||
|
|
||||||
|
@as_declarative()
|
||||||
|
class Base:
|
||||||
|
id = Column(Integer, primary_key=True, index=True)
|
||||||
|
create_time = Column(DateTime, default=datetime.now)
|
||||||
|
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
||||||
|
|
||||||
class User(Base):
|
class User(Base):
|
||||||
__tablename__ = "user"
|
__tablename__ = "user"
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
|
||||||
email = Column(String(50), unique=True, index=True, nullable=False)
|
email = Column(String(50), unique=True, index=True, nullable=False)
|
||||||
first_name = Column(String(100))
|
first_name = Column(String(100))
|
||||||
last_name = Column(String(100))
|
last_name = Column(String(100))
|
||||||
@@ -17,15 +21,31 @@ class User(Base):
|
|||||||
class AppSetting(Base):
|
class AppSetting(Base):
|
||||||
__tablename__ = "appsetting"
|
__tablename__ = "appsetting"
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
|
||||||
appid = Column(String(100), index=True, nullable=False)
|
appid = Column(String(100), index=True, nullable=False)
|
||||||
setting = Column(String(1000))
|
setting = Column(String(1000))
|
||||||
|
|
||||||
class Kintone(Base):
|
class Kintone(Base):
|
||||||
__tablename__ = "kintone"
|
__tablename__ = "kintone"
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
|
||||||
type = Column(Integer, index=True, nullable=False)
|
type = Column(Integer, index=True, nullable=False)
|
||||||
name = Column(String(100), nullable=False)
|
name = Column(String(100), nullable=False)
|
||||||
desc = Column(String(500))
|
desc = Column(String)
|
||||||
content = Column(String(2000))
|
content = Column(String)
|
||||||
|
|
||||||
|
class Action(Base):
|
||||||
|
__tablename__ = "action"
|
||||||
|
|
||||||
|
name = Column(String(100), index=True, nullable=False)
|
||||||
|
title = Column(String(200))
|
||||||
|
subtitle = Column(String(500))
|
||||||
|
outputpoints = Column(String)
|
||||||
|
property = Column(String)
|
||||||
|
|
||||||
|
class Flow(Base):
|
||||||
|
__tablename__ = "flow"
|
||||||
|
|
||||||
|
flowid = Column(String(100), index=True, nullable=False)
|
||||||
|
appid = Column(String(100), index=True, nullable=False)
|
||||||
|
eventid = Column(String(100), index=True, nullable=False)
|
||||||
|
name = Column(String(200))
|
||||||
|
content = Column(String)
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
from datetime import datetime
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
|
|
||||||
|
class Base(BaseModel):
|
||||||
|
create_time: datetime
|
||||||
|
update_time: datetime
|
||||||
|
|
||||||
class UserBase(BaseModel):
|
class UserBase(BaseModel):
|
||||||
email: str
|
email: str
|
||||||
is_active: bool = True
|
is_active: bool = True
|
||||||
@@ -67,5 +72,34 @@ class Kintone(BaseModel):
|
|||||||
desc: str = None
|
desc: str = None
|
||||||
content: str = None
|
content: str = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
orm_mode = True
|
||||||
|
|
||||||
|
class Action(BaseModel):
|
||||||
|
id: int
|
||||||
|
name: str = None
|
||||||
|
title: str = None
|
||||||
|
subtitle: str = None
|
||||||
|
outputpoints: str = None
|
||||||
|
property: str = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
orm_mode = True
|
||||||
|
|
||||||
|
class FlowBase(BaseModel):
|
||||||
|
flowid: str
|
||||||
|
appid: str
|
||||||
|
eventid: str
|
||||||
|
name: str = None
|
||||||
|
content: str = None
|
||||||
|
|
||||||
|
class Flow(Base):
|
||||||
|
id: int
|
||||||
|
flowid: str
|
||||||
|
appid: str
|
||||||
|
eventid: str
|
||||||
|
name: str = None
|
||||||
|
content: str = None
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
orm_mode = True
|
orm_mode = True
|
||||||
@@ -10,7 +10,7 @@ from app.db import Base,engine
|
|||||||
from app.core.auth import get_current_active_user
|
from app.core.auth import get_current_active_user
|
||||||
from app.core.celery_app import celery_app
|
from app.core.celery_app import celery_app
|
||||||
from app import tasks
|
from app import tasks
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
@@ -18,6 +18,19 @@ app = FastAPI(
|
|||||||
title=config.PROJECT_NAME, docs_url="/api/docs", openapi_url="/api"
|
title=config.PROJECT_NAME, docs_url="/api/docs", openapi_url="/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
origins = [
|
||||||
|
"http://localhost:9000",
|
||||||
|
"http://localhost",
|
||||||
|
"http://localhost:8080",
|
||||||
|
]
|
||||||
|
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=origins,
|
||||||
|
allow_credentials=True,
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
# @app.middleware("http")
|
# @app.middleware("http")
|
||||||
# async def db_session_middleware(request: Request, call_next):
|
# async def db_session_middleware(request: Request, call_next):
|
||||||
|
|||||||
804
document/ALCKintone_20231012.drawio
Normal file
804
document/ALCKintone_20231012.drawio
Normal file
@@ -0,0 +1,804 @@
|
|||||||
|
<mxfile host="Electron" modified="2023-10-12T05:09:00.607Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="Qd_x1J_gzjbS0l44e71w" version="21.1.2" type="device" pages="3">
|
||||||
|
<diagram name="Page-1" id="efa7a0a1-bf9b-a30e-e6df-94a7791c09e9">
|
||||||
|
<mxGraphModel dx="1434" dy="884" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="826" pageHeight="1169" background="none" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-114" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><strong>User</strong></p><p style="margin: 0px; margin-left: 8px;"><br></p><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="40" y="21.64" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-116" value="" style="endArrow=open;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" target="ZIlfFuTIaODnUzWRKW0w-114" edge="1">
|
||||||
|
<mxGeometry x="389.35999999999996" y="350" as="geometry">
|
||||||
|
<mxPoint x="350" y="60.820000000000164" as="sourcePoint" />
|
||||||
|
<mxPoint x="671" y="532" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-117" value="0..n" style="resizable=0;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-116" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-30" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-118" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-116" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="18.919999999999582" y="-21.960000000000644" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-119" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><strong>UserApp</strong></p><hr><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="350" y="250" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-120" value="" style="endArrow=open;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="ZIlfFuTIaODnUzWRKW0w-119" edge="1">
|
||||||
|
<mxGeometry x="399.35999999999996" y="360" as="geometry">
|
||||||
|
<mxPoint x="360" y="71" as="sourcePoint" />
|
||||||
|
<mxPoint x="430" y="100.00000000000023" as="targetPoint" />
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="430" y="140" />
|
||||||
|
<mxPoint x="430" y="140" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-121" value="0..n" style="resizable=0;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-120" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="9" y="-20" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-122" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-120" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="18.919999999999582" y="-21.960000000000644" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-123" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><strong>UserDomain</strong></p><hr><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="350" y="21.64" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-124" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><b>Action</b></p><hr><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="30" y="440" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-125" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><strong>AppAction</strong></p><hr><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="350" y="440" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-130" value="" style="endArrow=open;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="ZIlfFuTIaODnUzWRKW0w-125" target="ZIlfFuTIaODnUzWRKW0w-124" edge="1">
|
||||||
|
<mxGeometry x="209.35999999999999" y="733" as="geometry">
|
||||||
|
<mxPoint x="240.59" y="584.64" as="sourcePoint" />
|
||||||
|
<mxPoint x="240.00000000000003" y="473.0000000000002" as="targetPoint" />
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="241" y="479" />
|
||||||
|
<mxPoint x="200" y="480" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-131" value="0..n" style="resizable=0;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-130" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-30" y="-29" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-132" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-130" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="18.919999999999582" y="-21.960000000000644" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-133" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><b>Flow</b></p><hr><p style="margin: 0px; margin-left: 8px;"><br></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="630" y="250" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-134" value="" style="endArrow=open;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="ZIlfFuTIaODnUzWRKW0w-133" target="ZIlfFuTIaODnUzWRKW0w-119" edge="1">
|
||||||
|
<mxGeometry x="408.77" y="598.36" as="geometry">
|
||||||
|
<mxPoint x="440" y="450" as="sourcePoint" />
|
||||||
|
<mxPoint x="439.41" y="338.36000000000024" as="targetPoint" />
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="570" y="290" />
|
||||||
|
<mxPoint x="570" y="290" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-135" value="0..n" style="resizable=0;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-134" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="-30" y="-20" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-136" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="ZIlfFuTIaODnUzWRKW0w-134" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="18.919999999999582" y="-21.960000000000644" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="ZIlfFuTIaODnUzWRKW0w-140" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="420.00000020761206" y="99.99999999998707" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Z9b4y0bF-qkiY6ReSsG3-1" value="<p style="margin: 0px; margin-top: 4px; text-align: center; text-decoration: underline;"><b>Tenant</b></p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="40" y="250" width="160" height="78.36" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Z9b4y0bF-qkiY6ReSsG3-2" value="" style="endArrow=open;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="ZIlfFuTIaODnUzWRKW0w-114" target="Z9b4y0bF-qkiY6ReSsG3-1" edge="1">
|
||||||
|
<mxGeometry x="209.35999999999999" y="733" as="geometry">
|
||||||
|
<mxPoint x="230" y="220" as="sourcePoint" />
|
||||||
|
<mxPoint x="70" y="220" as="targetPoint" />
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="120" y="220" />
|
||||||
|
<mxPoint x="121" y="220" />
|
||||||
|
<mxPoint x="110" y="221" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Z9b4y0bF-qkiY6ReSsG3-3" value="0..n" style="resizable=0;align=left;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="Z9b4y0bF-qkiY6ReSsG3-2" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="450" y="-100" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="Z9b4y0bF-qkiY6ReSsG3-4" value="1" style="resizable=0;align=right;verticalAlign=top;labelBackgroundColor=#ffffff;fontSize=10;strokeColor=#003366;shadow=1;fillColor=#D4E1F5;fontColor=#003366" parent="Z9b4y0bF-qkiY6ReSsG3-2" connectable="0" vertex="1">
|
||||||
|
<mxGeometry x="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="18.919999999999582" y="-21.960000000000644" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
<diagram id="lCZzTbn_7m8qK95pbvvS" name="ER図">
|
||||||
|
<mxGraphModel dx="1434" dy="884" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-1" value="User" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="420" y="20" width="180" height="180" as="geometry">
|
||||||
|
<mxRectangle x="310" y="60" width="110" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-2">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-4" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-2">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-6" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-7" value="<b style="border-color: var(--border-color); text-align: center; color: rgb(0, 51, 102);">Tenant_id</b>" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-10" value="ユーザー名" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-1">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-13" value="パスワード(暗号化)" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-1" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-1">
|
||||||
|
<mxGeometry y="150" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-2" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-1">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-3" value="その他情報" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-1">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-14" value="Domain" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="420" y="240" width="180" height="180" as="geometry">
|
||||||
|
<mxRectangle x="590" y="60" width="100" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-15" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-14">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-16" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-15">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-17" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-15">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-24" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-14">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-25" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-24">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="inIyfaXWTM6ArMeTnGn6-26" value="domain_url" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-24">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-31" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-14">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-32" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-31">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-33" value="kintoneユーザーID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-31">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-34" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-14">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-35" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-34">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-36" value="kintoneパスワード" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-34">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-4" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="inIyfaXWTM6ArMeTnGn6-14">
|
||||||
|
<mxGeometry y="150" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-5" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-4">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-6" value="API_Key" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-4">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-1" value="<b style="border-color: var(--border-color); color: rgb(0, 51, 102);">Tenant</b>" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="130" y="20" width="180" height="180" as="geometry">
|
||||||
|
<mxRectangle x="40" y="60" width="100" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-2">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-4" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-2">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-7" value="名前" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-10" value="ライセンスキー" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-1">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="QUGX19b9cPh8sdE7zjoR-13" value="利用期限" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="xY3sbCmQmCiIU-0kb39k-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="QUGX19b9cPh8sdE7zjoR-1">
|
||||||
|
<mxGeometry y="150" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="xY3sbCmQmCiIU-0kb39k-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="xY3sbCmQmCiIU-0kb39k-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="xY3sbCmQmCiIU-0kb39k-7" value="その他情報" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="xY3sbCmQmCiIU-0kb39k-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-1" value="Flow" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="420" y="480" width="180" height="240" as="geometry">
|
||||||
|
<mxRectangle x="320" y="370" width="60" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-2">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-4" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-2">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-56" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-57" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-56">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-58" value="domain_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-56">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-6" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-7" value="app_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-10" value="spaceid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="150" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8Zu1yShcSHxMs68hy39H-13" value="appid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="XZEu5LJmFrV2HCpzu9aW-12" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="180" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="XZEu5LJmFrV2HCpzu9aW-13" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="XZEu5LJmFrV2HCpzu9aW-12">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="XZEu5LJmFrV2HCpzu9aW-14" value="content" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="XZEu5LJmFrV2HCpzu9aW-12">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="8Zu1yShcSHxMs68hy39H-1">
|
||||||
|
<mxGeometry y="210" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-15" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-14">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-16" value="event_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-14">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-1" value="Event" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="140" y="435" width="180" height="150" as="geometry">
|
||||||
|
<mxRectangle x="40" y="390" width="70" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-2">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-4" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-2">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-7" value="画面名" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-10" value="イベント名" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-1">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-13" value="モバイル使用可能か" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-17" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERoneToMany;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;curved=1;" edge="1" parent="1" source="GH2g80-cBXHe62XdPV4N-2" target="GH2g80-cBXHe62XdPV4N-14">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="630" y="845" as="sourcePoint" />
|
||||||
|
<mxPoint x="530" y="1085" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-18" value="App" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="710" y="280" width="180" height="150" as="geometry">
|
||||||
|
<mxRectangle x="600" y="370" width="60" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-34" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-18">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-35" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-34">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-36" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-34">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-51" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-18">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-52" value="UK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-51">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-53" value="domain_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-51">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-25" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-18">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-26" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-25">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-27" value="app_name" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-25">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-28" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-18">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-29" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-28">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="GH2g80-cBXHe62XdPV4N-30" value="update_date" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="GH2g80-cBXHe62XdPV4N-28">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-1" value="Flow_History" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="710" y="480" width="180" height="240" as="geometry">
|
||||||
|
<mxRectangle x="320" y="670" width="110" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-23" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-24" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-23">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-25" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-23">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-3" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-2">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-4" value="flow_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-2">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-5">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-7" value="domain_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-5">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-10" value="spaceid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="150" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-13" value="appid" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-17" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="180" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-18" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-17">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-19" value="event_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-17">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-1">
|
||||||
|
<mxGeometry y="210" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-15" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-14">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-16" value="content" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-14">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-40" value="Action" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="20" y="905" width="180" height="150" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-41" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-40">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-42" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-41">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-43" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-41">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-44" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-40">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-45" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-44">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-46" value="アクション名" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-44">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-47" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-40">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-48" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-47">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-49" value="説明" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-47">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-50" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-40">
|
||||||
|
<mxGeometry y="120" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-51" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-50">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="AJLbZMHdl7kzV18ppMoM-52" value="属性定義(json)" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="AJLbZMHdl7kzV18ppMoM-50">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-7" value="UserDomain" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="710" y="100" width="180" height="120" as="geometry">
|
||||||
|
<mxRectangle x="590" y="60" width="100" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-7">
|
||||||
|
<mxGeometry y="30" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-9" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-8">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-10" value="id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-8">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-7">
|
||||||
|
<mxGeometry y="60" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-12" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-11">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-13" value="user_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-11">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-44" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-7">
|
||||||
|
<mxGeometry y="90" width="180" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-45" value="FK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-44">
|
||||||
|
<mxGeometry width="30" height="30" as="geometry">
|
||||||
|
<mxRectangle width="30" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-46" value="domain_id" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="NCbWPNvujZOKFJAbQVH6-44">
|
||||||
|
<mxGeometry x="30" width="150" height="30" as="geometry">
|
||||||
|
<mxRectangle width="150" height="30" as="alternateBounds" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-42" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;curved=1;" edge="1" parent="1" source="QUGX19b9cPh8sdE7zjoR-2" target="inIyfaXWTM6ArMeTnGn6-2">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="160" y="350" as="sourcePoint" />
|
||||||
|
<mxPoint x="260" y="250" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-47" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="NCbWPNvujZOKFJAbQVH6-11" target="inIyfaXWTM6ArMeTnGn6-2">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="230" y="390" as="sourcePoint" />
|
||||||
|
<mxPoint x="330" y="290" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-49" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERmandOne;startArrow=ERmandOne;rounded=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="inIyfaXWTM6ArMeTnGn6-15" target="NCbWPNvujZOKFJAbQVH6-44">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="200" y="400" as="sourcePoint" />
|
||||||
|
<mxPoint x="300" y="300" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-50" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;curved=1;" edge="1" parent="1" source="inIyfaXWTM6ArMeTnGn6-15" target="NCbWPNvujZOKFJAbQVH6-51">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="140" y="430" as="sourcePoint" />
|
||||||
|
<mxPoint x="740" y="445" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-54" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;endFill=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;curved=1;" edge="1" parent="1" source="NCbWPNvujZOKFJAbQVH6-51" target="8Zu1yShcSHxMs68hy39H-5">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="210" y="450" as="sourcePoint" />
|
||||||
|
<mxPoint x="310" y="350" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="NCbWPNvujZOKFJAbQVH6-55" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;curved=1;" edge="1" parent="1" source="8Zu1yShcSHxMs68hy39H-2" target="AJLbZMHdl7kzV18ppMoM-2">
|
||||||
|
<mxGeometry width="100" height="100" relative="1" as="geometry">
|
||||||
|
<mxPoint x="270" y="470" as="sourcePoint" />
|
||||||
|
<mxPoint x="370" y="370" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
<diagram id="yu2qkxLoxjZt0KdZdE3U" name="ページ3">
|
||||||
|
<mxGraphModel dx="1434" dy="884" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
BIN
document/Kinton APIイベント一覧.xlsx
Normal file
BIN
document/Kinton APIイベント一覧.xlsx
Normal file
Binary file not shown.
0
document/Kintone機能整理.drawio
Normal file
0
document/Kintone機能整理.drawio
Normal file
1000
document/Kintone自動化ツール設計図.drawio
Normal file
1000
document/Kintone自動化ツール設計図.drawio
Normal file
File diff suppressed because one or more lines are too long
BIN
document/kintone開発自動化 MVP開発内容 SEサービスデザイングループ 2023.pptx
Normal file
BIN
document/kintone開発自動化 MVP開発内容 SEサービスデザイングループ 2023.pptx
Normal file
Binary file not shown.
BIN
document/kintone開発自動化ツール UIデザイン案.pptx
Normal file
BIN
document/kintone開発自動化ツール UIデザイン案.pptx
Normal file
Binary file not shown.
3
frontend/.gitignore
vendored
3
frontend/.gitignore
vendored
@@ -35,3 +35,6 @@ yarn-error.log*
|
|||||||
|
|
||||||
# local .env files
|
# local .env files
|
||||||
.env.local*
|
.env.local*
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm-lock.yaml
|
||||||
|
|||||||
@@ -47,3 +47,7 @@ quasar build
|
|||||||
|
|
||||||
### Customize the configuration
|
### Customize the configuration
|
||||||
See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js).
|
See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js).
|
||||||
|
|
||||||
|
## VUE3.0编程规范
|
||||||
|
1. [VUE3.0编程概要](./VUE3.0概要.md)
|
||||||
|
2. [VUE3.0编程规范](./VUE3.0-coding-rule.md)
|
||||||
|
|||||||
241
frontend/VUE3.0-coding-rule.md
Normal file
241
frontend/VUE3.0-coding-rule.md
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
以下是一份 Vue 3 和 TypeScript 的编程规范:
|
||||||
|
|
||||||
|
**1. 组件定义**
|
||||||
|
|
||||||
|
- 推荐使用 `defineComponent` 来定义组件,以获取 TypeScript 的类型支持。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { defineComponent } from 'vue'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
// 组件选项
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 数据定义**
|
||||||
|
|
||||||
|
- 使用 `reactive` 定义响应式对象。
|
||||||
|
- 使用 `ref` 定义响应式单值。
|
||||||
|
- 使用 `computed` 定义计算属性。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { reactive, ref, computed } from 'vue'
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
count: 0,
|
||||||
|
message: 'Hello Vue 3'
|
||||||
|
})
|
||||||
|
|
||||||
|
const count = ref(0)
|
||||||
|
|
||||||
|
const doubledCount = computed(() => state.count * 2)
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. 生命周期钩子**
|
||||||
|
|
||||||
|
- 使用 `onMounted`、`onUpdated` 等生命周期钩子,而不是 `beforeCreate`、`created`、`beforeMount`、`mounted`、`beforeUpdate`、`updated`、`beforeUnmount`、`unmounted`。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { onMounted } from 'vue'
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
console.log('Component is mounted.')
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. 组件通信**
|
||||||
|
|
||||||
|
- 使用 `props` 和 `emit` 实现父子组件通信。
|
||||||
|
- 使用 `provide` 和 `inject` 实现祖先和后代组件通信。
|
||||||
|
- 不再推荐使用 `event bus` 进行任意组件间的通信,可以使用 Vuex 或者全局 `provide`/`inject` 替代。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 父组件
|
||||||
|
<ChildComponent @my-event="handleEvent" />
|
||||||
|
|
||||||
|
// 子组件
|
||||||
|
this.$emit('my-event', eventData)
|
||||||
|
```
|
||||||
|
|
||||||
|
**5. 异步处理**
|
||||||
|
|
||||||
|
- 使用 `async/await` 进行异步处理。
|
||||||
|
- 使用 `Suspense` 和 `async setup()` 处理异步依赖。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { ref, onMounted } from 'vue'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
const response = await axios.get('https://api.example.com/data')
|
||||||
|
data.value = response.data
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**6. Vue Router 和 Vuex**
|
||||||
|
|
||||||
|
- 使用 Vue Router 4 和 Vuex 4,它们是为 Vue 3 重新设计的。
|
||||||
|
- 使用 `useRouter` 和 `useRoute` 钩子函数在组件中使用 router。
|
||||||
|
- 使用 `useStore` 钩子函数在组件中使用 Vuex store。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { useStore } from 'vuex'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
const store = useStore()
|
||||||
|
const router = useRouter()
|
||||||
|
```
|
||||||
|
|
||||||
|
**7. 组件模板**
|
||||||
|
|
||||||
|
- 使用 `v-model` 代替 `.sync` 修饰符进行双向绑定。
|
||||||
|
- 使用 `v-for` 和 `:key` 渲染列表。
|
||||||
|
- 使用 `v-if` 和 `v-else`、`v-else-if` 进行条件渲染。
|
||||||
|
- 使用 `v-on` 或者 `@` 监听事件。
|
||||||
|
- 使用 `v-bind` 或者 `:` 绑定属性。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<template>
|
||||||
|
<div v-if="condition">If block</div>
|
||||||
|
<div v-else>Else block</div>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li v-for="(item, index) in list" :key="index">{{ item }}</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<button @click="handleClick">Click me</button>
|
||||||
|
</template>
|
||||||
|
```
|
||||||
|
|
||||||
|
8. **使用类型注解和接口**
|
||||||
|
|
||||||
|
在 TypeScript 中,尽可能使用类型注解和接口来提供更完善的类型信息和类型检查。这将有助于发现和预防错误。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface User {
|
||||||
|
name: string;
|
||||||
|
age: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const user: User = {
|
||||||
|
name: 'John',
|
||||||
|
age: 30
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
9. **模块化和组件化**
|
||||||
|
|
||||||
|
尽可能将功能和逻辑模块化和组件化,使得代码更易于理解和维护。特别是使用 Composition API 时,可以将公共的逻辑封装成 composable 函数。
|
||||||
|
|
||||||
|
下面是一个使用 `Suspense` 和 `axios` 的示例,这个示例将会从一个 JSON Placeholder API 获取数据:
|
||||||
|
|
||||||
|
首先,我们创建一个 composable 函数,用于获取数据:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
export function useAsyncData(url: string) {
|
||||||
|
const data = ref(null)
|
||||||
|
const error = ref(null)
|
||||||
|
|
||||||
|
const fetchData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await axios.get(url)
|
||||||
|
data.value = response.data
|
||||||
|
} catch (e) {
|
||||||
|
error.value = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { data, error, fetchData }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
然后,我们创建一个 Vue 组件来使用这个函数:
|
||||||
|
|
||||||
|
```js
|
||||||
|
<template>
|
||||||
|
<Suspense>
|
||||||
|
<template #default>
|
||||||
|
<div v-if="error">{{ error.message }}</div>
|
||||||
|
<div v-else>{{ data }}</div>
|
||||||
|
</template>
|
||||||
|
<template #fallback>
|
||||||
|
<div>Loading...</div>
|
||||||
|
</template>
|
||||||
|
</Suspense>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, onMounted } from 'vue'
|
||||||
|
import { useAsyncData } from './composables/useAsyncData'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
setup() {
|
||||||
|
const { data, error, fetchData } = useAsyncData('https://jsonplaceholder.typicode.com/posts/1')
|
||||||
|
|
||||||
|
onMounted(fetchData)
|
||||||
|
|
||||||
|
return { data, error }
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* 在这里添加 CSS 样式 */
|
||||||
|
</style>
|
||||||
|
```
|
||||||
|
|
||||||
|
在这个示例中,我们在 `useAsyncData` 函数中获取数据。当 `onMounted` 钩子函数被调用时(也就是当组件挂载完成后),我们开始获取数据。这个过程是异步的,因此我们在 `Suspense` 组件的 `#fallback` 插槽中显示一个 "Loading..." 的提示。一旦数据加载完成,`Suspense` 组件的 `#default` 插槽就会被渲染,并显示获取到的数据。
|
||||||
|
|
||||||
|
10. **良好的代码风格**
|
||||||
|
|
||||||
|
遵循一致的代码风格和代码质量规则,例如使用 ESLint 和 Prettier 来检查和格式化代码。
|
||||||
|
|
||||||
|
11. **单元测试和端到端测试**
|
||||||
|
|
||||||
|
对关键的组件和函数编写单元测试,对用户的主要操作路径编写端到端测试,确保功能的正确性。
|
||||||
|
|
||||||
|
12. **注释和文档**
|
||||||
|
|
||||||
|
对复杂的逻辑和函数编写注释,提供必要的项目文档,帮助其他开发者理解和使用你的代码。
|
||||||
|
|
||||||
|
13. **以下是 Vue 2 中被废弃或改变的部分API,以及在 Vue 3 中的替代方案:**
|
||||||
|
|
||||||
|
| Vue 2.x | Vue 3.0 | 说明 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `Vue.set` / `this.$set` | 响应式数据现在是默认的,无需使用这些方法 | Vue 3 的响应式系统是从头开始构建的,所有的对象和数组都是响应式的 |
|
||||||
|
| `Vue.delete` / `this.$delete` | 无需使用这些方法 | 在 Vue 3 中,你只需要使用 `delete` 操作符即可 |
|
||||||
|
| `filters` | 无对应项 | Vue 3 不再支持过滤器,建议使用计算属性或方法替代 |
|
||||||
|
| `Vue.observable` | `reactive` | 用 `reactive` 替代 `Vue.observable`,实现数据的响应式 |
|
||||||
|
| `Vue.prototype` | `app.config.globalProperties` | 在 Vue 3 中,全局 API 已经改变,`Vue.prototype` 被 `app.config.globalProperties` 替代 |
|
||||||
|
| `Vue.component`, `Vue.directive`, `Vue.mixin`, `Vue.use` | `app.component`, `app.directive`, `app.mixin`, `app.use` | 全局注册的 API 改变,如 `Vue.component` 变为 `app.component` |
|
||||||
|
| `beforeDestroy` 和 `destroyed` 生命周期钩子 | `beforeUnmount` 和 `unmounted` | 生命周期钩子名字变化,`beforeDestroy` 和 `destroyed` 分别改为 `beforeUnmount` 和 `unmounted` |
|
||||||
|
| `$on`, `$off`, `$once` | 无对应项 | Event Bus方法被移除,需要用户自行实现或者使用第三方库 |
|
||||||
|
| `v-model` 在自定义组件上使用 | 需要明确的 `modelValue` 和 `update:modelValue` | Vue 3 对 `v-model` 的改动使其在自定义组件上更具灵活性 |
|
||||||
|
| `functional` 选项 | 无对应项 | Vue 3 不再支持函数式组件的写法,而是推荐使用 `render` 函数或 `setup` 函数 |
|
||||||
|
| 异步组件的 `functional` 写法 | `defineAsyncComponent` | 异步组件的创建方式更改,通过 `defineAsyncComponent` 方法创建 |
|
||||||
|
| `destroyed` 和 `beforeDestroy` 钩子函数 | `unmounted` 和 `beforeUnmount` | 生命周期钩子的名称已改为更直观的名称,以更好地表示其在组件实例生命周期中的角色 |
|
||||||
|
| `Vue.extend` | `defineComponent` | Vue 3 使用 `defineComponent` 方法定义组件,有更好的类型推断 |
|
||||||
|
|
||||||
|
注意:Vue 3 对于 Options API 和 Composition API 提供了完全的支持,你可以在一个组件中混合使用这两种 API。不过,为了代码的一致性和可读性,建议在一个项目中选择一种 API 并坚持使用。
|
||||||
|
|
||||||
|
|
||||||
|
- **以下是 Vue 3.0 中的 Composition API 函数的基本说明,以及与 Options API 的对比**
|
||||||
|
|
||||||
|
| Composition API | 说明 | 对应的 Options API |
|
||||||
|
| --------------- | ---- | ------------------ |
|
||||||
|
| `setup` | `setup` 是一个新引入的组件选项,用于使用 Composition API。它是组件内部使用 Composition API 的入口。| 无 |
|
||||||
|
| `ref` | `ref` 函数用于创建一个响应式的数据。它接收一个参数,返回一个响应式的 Ref 对象。| `data` |
|
||||||
|
| `reactive` | `reactive` 函数用于创建一个响应式的对象。它接收一个普通对象,返回一个响应式的对象。| `data` |
|
||||||
|
| `computed` | `computed` 函数用于创建一个计算属性。它接收一个 getter 函数或者一个具有 getter 和 setter 的对象,返回一个响应式的 Ref 对象。| `computed` |
|
||||||
|
| `watch` | `watch` 函数用于响应式地跟踪和触发副作用。它接收一个响应式的源和一个执行副作用的回调函数。| `watch` |
|
||||||
|
| `watchEffect` | `watchEffect` 函数用于立即执行传入的一个函数,并响应式地追踪其依赖,并在其依赖变更时重新运行该函数。 | 无 |
|
||||||
|
| `onMounted` | `onMounted` 函数在组件被挂载时调用。它接收一个在组件挂载后执行的回调函数。 | `mounted` |
|
||||||
|
| `onUnmounted` | `onUnmounted` 函数在组件被卸载时调用。它接收一个在组件卸载后执行的回调函数。 | `beforeDestroy`/`unmounted` |
|
||||||
|
| `onUpdated` | `onUpdated` 在组件更新后调用。它接收一个在组件更新后执行的回调函数。| `updated` |
|
||||||
|
| `provide` | `provide` 函数用于在组件上定义一个可以被后代组件注入的值。它接收一个提供的键和值。 | 有,与 `provide/inject` 相似但是属性而不是函数 |
|
||||||
|
| `inject` | `inject` 函数用于在组件中注入一个由祖先组件提供的值。它接收一个注入的键。 | 有,但与 `provide/inject` 相似但是属性而不是函数 |
|
||||||
|
|
||||||
|
值得注意的是,虽然一些 Composition API 函数与 Options API 的某些选项有相似之处,但它们的工作方式和使用方式可能有所不同。在实际使用中,你需要根据具体的使用场景和需求选择合适的 API。
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="ja-jp">
|
||||||
<head>
|
<head>
|
||||||
<title><%= productName %></title>
|
<title><%= productName %></title>
|
||||||
|
|
||||||
|
|||||||
72
frontend/package-lock.json
generated
72
frontend/package-lock.json
generated
@@ -10,13 +10,16 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/extras": "^1.16.4",
|
"@quasar/extras": "^1.16.4",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
|
"pinia": "^2.1.6",
|
||||||
"quasar": "^2.6.0",
|
"quasar": "^2.6.0",
|
||||||
|
"uuid": "^9.0.0",
|
||||||
"vue": "^3.0.0",
|
"vue": "^3.0.0",
|
||||||
"vue-router": "^4.0.0"
|
"vue-router": "^4.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@quasar/app-vite": "^1.3.0",
|
"@quasar/app-vite": "^1.3.0",
|
||||||
"@types/node": "^12.20.21",
|
"@types/node": "^12.20.21",
|
||||||
|
"@types/uuid": "^9.0.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
||||||
"@typescript-eslint/parser": "^5.10.0",
|
"@typescript-eslint/parser": "^5.10.0",
|
||||||
"autoprefixer": "^10.4.2",
|
"autoprefixer": "^10.4.2",
|
||||||
@@ -28,8 +31,9 @@
|
|||||||
"typescript": "^4.5.4"
|
"typescript": "^4.5.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18 || ^16 || ^14.19",
|
"node": "^20 ||^18 || ^16 || ^14.19",
|
||||||
"npm": ">= 6.13.4",
|
"npm": ">= 6.13.4",
|
||||||
|
"pnpm": ">=8.6.0",
|
||||||
"yarn": ">= 1.21.1"
|
"yarn": ">= 1.21.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -544,6 +548,12 @@
|
|||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/uuid": {
|
||||||
|
"version": "9.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.3.tgz",
|
||||||
|
"integrity": "sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.61.0",
|
"version": "5.61.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz",
|
||||||
@@ -4070,6 +4080,56 @@
|
|||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pinia": {
|
||||||
|
"version": "2.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz",
|
||||||
|
"integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/devtools-api": "^6.5.0",
|
||||||
|
"vue-demi": ">=0.14.5"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/posva"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.4.0",
|
||||||
|
"typescript": ">=4.4.4",
|
||||||
|
"vue": "^2.6.14 || ^3.3.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"typescript": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/pinia/node_modules/vue-demi": {
|
||||||
|
"version": "0.14.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
|
||||||
|
"integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"bin": {
|
||||||
|
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||||
|
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@vue/composition-api": "^1.0.0-rc.1",
|
||||||
|
"vue": "^3.0.0-0 || ^2.6.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@vue/composition-api": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.25",
|
"version": "8.4.25",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz",
|
||||||
@@ -4946,7 +5006,7 @@
|
|||||||
"version": "4.9.5",
|
"version": "4.9.5",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
|
||||||
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
|
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -5045,6 +5105,14 @@
|
|||||||
"node": ">= 0.4.0"
|
"node": ">= 0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/uuid": {
|
||||||
|
"version": "9.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
|
||||||
|
"integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
|
||||||
|
"bin": {
|
||||||
|
"uuid": "dist/bin/uuid"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vary": {
|
"node_modules/vary": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||||
|
|||||||
@@ -15,13 +15,16 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/extras": "^1.16.4",
|
"@quasar/extras": "^1.16.4",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
|
"pinia": "^2.1.6",
|
||||||
"quasar": "^2.6.0",
|
"quasar": "^2.6.0",
|
||||||
|
"uuid": "^9.0.0",
|
||||||
"vue": "^3.0.0",
|
"vue": "^3.0.0",
|
||||||
"vue-router": "^4.0.0"
|
"vue-router": "^4.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@quasar/app-vite": "^1.3.0",
|
"@quasar/app-vite": "^1.3.0",
|
||||||
"@types/node": "^12.20.21",
|
"@types/node": "^12.20.21",
|
||||||
|
"@types/uuid": "^9.0.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
||||||
"@typescript-eslint/parser": "^5.10.0",
|
"@typescript-eslint/parser": "^5.10.0",
|
||||||
"autoprefixer": "^10.4.2",
|
"autoprefixer": "^10.4.2",
|
||||||
@@ -33,8 +36,9 @@
|
|||||||
"typescript": "^4.5.4"
|
"typescript": "^4.5.4"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18 || ^16 || ^14.19",
|
"node": "^20 ||^18 || ^16 || ^14.19",
|
||||||
"npm": ">= 6.13.4",
|
"npm": ">= 6.13.4",
|
||||||
"yarn": ">= 1.21.1"
|
"yarn": ">= 1.21.1",
|
||||||
|
"pnpm": ">=8.6.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
54
frontend/src/components/ActionSelect.vue
Normal file
54
frontend/src/components/ActionSelect.vue
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md">
|
||||||
|
<q-table row-key="name" :selection="type" v-model:selected="selected" :columns="columns" :rows="rows"
|
||||||
|
class="action-table"
|
||||||
|
flat bordered
|
||||||
|
virtual-scroll
|
||||||
|
:pagination="pagination"
|
||||||
|
:rows-per-page-options="[0]"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { ref,onMounted,reactive } from 'vue'
|
||||||
|
import { api } from 'boot/axios';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'actionSelect',
|
||||||
|
props: {
|
||||||
|
name: String,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
const columns = [
|
||||||
|
{ name: 'name', required: true,label: 'アクション名',align: 'left',field: 'name',sortable: true},
|
||||||
|
{ name: 'desc', align: 'left', label: '説明', field: 'desc', sortable: true },
|
||||||
|
// { name: 'content', label: '内容', field: 'content', sortable: true }
|
||||||
|
]
|
||||||
|
const rows = reactive([])
|
||||||
|
onMounted(async () => {
|
||||||
|
await api.get('http://127.0.0.1:8000/api/kintone/1').then(res =>{
|
||||||
|
res.data.forEach((item) =>
|
||||||
|
{
|
||||||
|
rows.push({name:item.name,desc:item.desc,content:item.content});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
columns,
|
||||||
|
rows,
|
||||||
|
selected: ref([]),
|
||||||
|
pagination:ref({
|
||||||
|
rowsPerPage:0
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.action-table{
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
83
frontend/src/components/ActionSetting.vue
Normal file
83
frontend/src/components/ActionSetting.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<template>
|
||||||
|
<div id="action1">
|
||||||
|
<q-card class="my-card">
|
||||||
|
<q-card-section class="bg-primary text-white">
|
||||||
|
<div class="text-h6">Our Changing Planet</div>
|
||||||
|
<div class="text-subtitle2">by John Doe</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-separator />
|
||||||
|
<q-card-actions align="right">
|
||||||
|
<q-btn flat>設定</q-btn>
|
||||||
|
<q-btn class="del" flat @click="clickdel">削除</q-btn>
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
<div class="next" style="display: table;width: 100%;height:40px;" @mouseenter="showAdd = true" @mouseleave="()=>{if(!showMenu) showAdd = false;}">
|
||||||
|
<div aria-hidden="false" style="display: table-row;">
|
||||||
|
<div
|
||||||
|
style="display: table-cell;background: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEzIDMwIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAyMCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDB7ZmlsbDpub25lO3N0cm9rZTojNUI1QjVDO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjEwO30NCgkuc3Qxe2ZpbGw6IzVCNUI1Qzt9PC9zdHlsZT4NCiA8cmVjdCB4PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIzNy45NzQiIGZpbGw9IiM1MTUxNTEiIHN0cm9rZS13aWR0aD0iNC41MDYyIi8+DQogPHBvbHlnb24gdHJhbnNmb3JtPSJtYXRyaXgoMS4xNzg1IDAgMCAxLjE3ODUgLS42MDY5MiAyMy41NDQpIiBwb2ludHM9IjEuOTI4IDQuMDY1IDguOTk5IDExLjEzNiAxNi4wNzIgNC4wNjUgMTcuNDg2IDUuNDc5IDguOTk5IDEzLjk2NCAwLjUxNSA1LjQ3OSIgZmlsbD0iIzUxNTE1MSIvPg0KPC9zdmc+DQo=") center center no-repeat;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="showAdd" style="display:table-row;height:inherit;position:absolute;left:50%;">
|
||||||
|
<div style="display:table-cell;">
|
||||||
|
<q-btn round size="xs" color="primary" label="+">
|
||||||
|
<q-menu v-model="showMenu">
|
||||||
|
<q-list style="min-width: 100px">
|
||||||
|
<q-item clickable v-close-popup>
|
||||||
|
<q-item-section @click="clickadd">New tab</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
</q-list>
|
||||||
|
</q-menu>
|
||||||
|
</q-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts">
|
||||||
|
import { ref,watch } from 'vue'
|
||||||
|
export default {
|
||||||
|
emits: [
|
||||||
|
'addaction'
|
||||||
|
],
|
||||||
|
setup(props,context) {
|
||||||
|
const showAdd = ref(false)
|
||||||
|
const showMenu = ref(false)
|
||||||
|
|
||||||
|
watch(showMenu,(newVal) =>{
|
||||||
|
console.log('3');
|
||||||
|
if(!newVal)
|
||||||
|
{
|
||||||
|
showAdd.value = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const clickadd = () => {
|
||||||
|
console.log('3');
|
||||||
|
context.emit('addaction');
|
||||||
|
//let oDiv1 = pdiv;
|
||||||
|
// let oDiv1 = document.getElementById('action1');
|
||||||
|
// let oDiv2 = document.createElement('div');
|
||||||
|
// if (oDiv1 !== null) {
|
||||||
|
// oDiv2.innerHTML = oDiv1?.innerHTML;
|
||||||
|
// oDiv1?.after(oDiv2);
|
||||||
|
// let oAdd = oDiv2.getElementsByClassName('next')[0];
|
||||||
|
// oAdd.addEventListener('mouseenter', mouseenter);
|
||||||
|
// oAdd.addEventListener('mouseleave', mouseleave);
|
||||||
|
// let oDel = oDiv2.getElementsByClassName('del')[0];
|
||||||
|
// oDel.addEventListener('click', clickdel);
|
||||||
|
// }
|
||||||
|
};
|
||||||
|
const clickdel = (event: Event) => {
|
||||||
|
let oBtn = event.target as Element;
|
||||||
|
oBtn.parentElement?.parentElement?.parentElement?.parentElement?.remove();
|
||||||
|
};
|
||||||
|
// window.clickadd = clickadd;
|
||||||
|
// window.clickdel = clickdel;
|
||||||
|
// window.mouseenter = mouseenter;
|
||||||
|
// window.mouseleave = mouseleave;
|
||||||
|
|
||||||
|
return {clickadd, clickdel, showAdd, showMenu }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
41
frontend/src/components/AppSelect.vue
Normal file
41
frontend/src/components/AppSelect.vue
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md">
|
||||||
|
<q-table :title="name+'一覧'" :selection="type" v-model:selected="selected" :columns="columns" :rows="rows" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { ref,onMounted,reactive } from 'vue'
|
||||||
|
import { api } from 'boot/axios';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AppSelect',
|
||||||
|
props: {
|
||||||
|
name: String,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
setup() {
|
||||||
|
const columns = [
|
||||||
|
{ name: 'id', required: true,label: 'アプリID',align: 'left',field: 'id',sortable: true},
|
||||||
|
{ name: 'name', align: 'center', label: 'アプリ名', field: 'name', sortable: true },
|
||||||
|
{ name: 'creator', label: '作成者', field: 'creator', sortable: true },
|
||||||
|
{ name: 'createdate', label: '作成日時', field: 'createdate' }
|
||||||
|
]
|
||||||
|
const rows = reactive([])
|
||||||
|
onMounted( () => {
|
||||||
|
api.get('allapps').then(res =>{
|
||||||
|
res.data.apps.forEach((item) =>
|
||||||
|
{
|
||||||
|
rows.push({id:item.appId,name:item.name,creator:item.creator.name,createdate:item.createdAt});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
columns,
|
||||||
|
rows,
|
||||||
|
selected: ref([]),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
47
frontend/src/components/FieldSelect.vue
Normal file
47
frontend/src/components/FieldSelect.vue
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md">
|
||||||
|
<q-table :title="name+'一覧'" row-key="name" :selection="type" v-model:selected="selected" :columns="columns" :rows="rows" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { ref,onMounted,reactive } from 'vue'
|
||||||
|
import { api } from 'boot/axios';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'fieldSelect',
|
||||||
|
props: {
|
||||||
|
name: String,
|
||||||
|
type: String,
|
||||||
|
appId:Number
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const columns = [
|
||||||
|
{ name: 'name', required: true,label: 'フィールド名',align: 'left',field: row=>row.name,sortable: true},
|
||||||
|
{ name: 'code', label: 'フィールドコード', align: 'left',field: 'code', sortable: true },
|
||||||
|
{ name: 'type', label: 'フィールドタイプ', align: 'left',field: 'type', sortable: true }
|
||||||
|
]
|
||||||
|
const rows = reactive([])
|
||||||
|
onMounted( () => {
|
||||||
|
api.get('appfields', {
|
||||||
|
params:{
|
||||||
|
app: props.appId
|
||||||
|
}
|
||||||
|
}).then(res =>{
|
||||||
|
let fields = res.data.properties;
|
||||||
|
console.log(fields);
|
||||||
|
Object.keys(fields).forEach((key) =>
|
||||||
|
{
|
||||||
|
rows.push({name:fields[key].label,code:fields[key].code,type:fields[key].type});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
columns,
|
||||||
|
rows,
|
||||||
|
selected: ref([]),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
export interface Rule{
|
|
||||||
id:number;
|
|
||||||
name:string;
|
|
||||||
condtion:CondtionTree
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CondtionTree{
|
|
||||||
|
|
||||||
}
|
|
||||||
42
frontend/src/components/ShowDialog.vue
Normal file
42
frontend/src/components/ShowDialog.vue
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<q-dialog :model-value="visible" persistent>
|
||||||
|
<q-card style="min-width: 350px">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">{{ name }}選択</div>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-section class="q-pt-none">
|
||||||
|
<slot></slot>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-actions align="right" class="text-primary">
|
||||||
|
<q-btn flat label="確定" v-close-popup @click="CloseDialogue('OK')" />
|
||||||
|
<q-btn flat label="キャンセル" v-close-popup @click="CloseDialogue('Cancel')" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ShowDialog',
|
||||||
|
props: {
|
||||||
|
name:String,
|
||||||
|
visible: Boolean,
|
||||||
|
},
|
||||||
|
emits: [
|
||||||
|
'close'
|
||||||
|
],
|
||||||
|
setup(props, context) {
|
||||||
|
const CloseDialogue = (val) => {
|
||||||
|
context.emit('update:visible', false);
|
||||||
|
context.emit('close', val);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
CloseDialogue
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
29
frontend/src/components/flowEditor/left/ControlPanelC.vue
Normal file
29
frontend/src/components/flowEditor/left/ControlPanelC.vue
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-py-md">
|
||||||
|
<q-tree
|
||||||
|
no-connectors
|
||||||
|
selected-color="primary"
|
||||||
|
default-expand-all
|
||||||
|
:nodes="LeftDataBus.root"
|
||||||
|
v-model:selected="flowNames1"
|
||||||
|
node-key="label"
|
||||||
|
>
|
||||||
|
</q-tree>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
LeftDataBus,
|
||||||
|
setControlPanelE,
|
||||||
|
} from 'components/flowEditor/left/DataBus';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
|
||||||
|
// 应该在page中用网络请求获取值并初始化组件
|
||||||
|
// 然后在page中执行setControlPane设置databus
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
const { flowNames1 } = storeToRefs(store);
|
||||||
|
setControlPanelE();
|
||||||
|
</script>
|
||||||
72
frontend/src/components/flowEditor/left/DataBus.ts
Normal file
72
frontend/src/components/flowEditor/left/DataBus.ts
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import { reactive } from 'vue'
|
||||||
|
|
||||||
|
export const LeftDataBus = reactive<LeftData>({})
|
||||||
|
|
||||||
|
const defaultData = {
|
||||||
|
root: [
|
||||||
|
{
|
||||||
|
label: 'レコードを追加画面',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: '追加画面表示した時',
|
||||||
|
header: 'rg',
|
||||||
|
value: '1-1',
|
||||||
|
group: 'g1',
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '保存をクリックした時',
|
||||||
|
header: 'rg',
|
||||||
|
value: '1-2',
|
||||||
|
group: 'g1',
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '保存成功した時',
|
||||||
|
header: 'rg',
|
||||||
|
value: '1-3',
|
||||||
|
group: 'g1',
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'レコード編集画面',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'レコード詳細画面',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'レコード一覧画面',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
data: new Map([['g1', '1-1']])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const setControlPanel = (rootData: LeftData) => {
|
||||||
|
const { root: dr, data: dd } = defaultData
|
||||||
|
LeftDataBus.title = rootData.title
|
||||||
|
LeftDataBus.root = rootData.root ?? dr
|
||||||
|
LeftDataBus.data = rootData.data ?? dd
|
||||||
|
}
|
||||||
|
|
||||||
|
export const setControlPanelE = () => {
|
||||||
|
const { root: dr, data: dd } = defaultData
|
||||||
|
// LeftDataBus.title = rootData.title
|
||||||
|
LeftDataBus.root = dr
|
||||||
|
LeftDataBus.data = dd
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface LeftData {
|
||||||
|
title?: string
|
||||||
|
root?: ControlPanelData[]
|
||||||
|
data?: Map<string, string>
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ControlPanelData {
|
||||||
|
label: string,
|
||||||
|
header?: string,
|
||||||
|
value?: string,
|
||||||
|
group?: string,
|
||||||
|
children?: ControlPanelData[]
|
||||||
|
}
|
||||||
42
frontend/src/components/flowEditor/left/ItemSelector.vue
Normal file
42
frontend/src/components/flowEditor/left/ItemSelector.vue
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="row"
|
||||||
|
style="
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: rgba(255, 255, 255, 0.1) 0px 0px 0px 1px inset,
|
||||||
|
rgba(0, 0, 0, 0.3) 0px 0px 0px 1px;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<q-icon
|
||||||
|
class="self-center q-ma-sm"
|
||||||
|
name="widgets"
|
||||||
|
color="grey-9"
|
||||||
|
style="font-size: 2em"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="col-7 self-center ellipsis">
|
||||||
|
{{ actName }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="self-center">
|
||||||
|
<q-btn
|
||||||
|
outline
|
||||||
|
dense
|
||||||
|
label="変 更"
|
||||||
|
padding="none sm"
|
||||||
|
color="primary"
|
||||||
|
></q-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: ['actName'],
|
||||||
|
setup(props) {
|
||||||
|
const actName = computed(() => props.actName);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
85
frontend/src/components/left/AppSelector.vue
Normal file
85
frontend/src/components/left/AppSelector.vue
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="row"
|
||||||
|
style="
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: rgba(255, 255, 255, 0.1) 0px 0px 0px 1px inset,
|
||||||
|
rgba(0, 0, 0, 0.3) 0px 0px 0px 1px;
|
||||||
|
">
|
||||||
|
<q-icon
|
||||||
|
class="self-center q-ma-sm"
|
||||||
|
name="widgets"
|
||||||
|
color="grey-9"
|
||||||
|
style="font-size: 2em"
|
||||||
|
/>
|
||||||
|
<div class="col-7 self-center ellipsis">
|
||||||
|
{{ selectedApp.name }}
|
||||||
|
</div>
|
||||||
|
<div class="self-center">
|
||||||
|
<q-btn
|
||||||
|
outline
|
||||||
|
dense
|
||||||
|
label="変 更"
|
||||||
|
padding="none sm"
|
||||||
|
color="primary"
|
||||||
|
@click="showAppDialog"
|
||||||
|
></q-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ShowDialog v-model:visible="showSelectApp" name="アプリ" @close="closeDg">
|
||||||
|
<AppSelect ref="appDg" name="アプリ" type="single"></AppSelect>
|
||||||
|
</ShowDialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent,ref } from 'vue';
|
||||||
|
import {AppInfo} from '../../types/ActionTypes'
|
||||||
|
import ShowDialog from '../../components/ShowDialog.vue';
|
||||||
|
import AppSelect from '../../components/AppSelect.vue';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'AppSelector',
|
||||||
|
emits:[
|
||||||
|
"appSelected"
|
||||||
|
],
|
||||||
|
components:{
|
||||||
|
AppSelect,
|
||||||
|
ShowDialog
|
||||||
|
},
|
||||||
|
setup(props, context) {
|
||||||
|
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
const appDg = ref();
|
||||||
|
const showSelectApp=ref(false);
|
||||||
|
const selectedApp =ref<AppInfo>({
|
||||||
|
appId:"",
|
||||||
|
name:"",
|
||||||
|
});
|
||||||
|
const closeDg=(val :any)=>{
|
||||||
|
showSelectApp.value=false;
|
||||||
|
console.log("Dialog closed->",val);
|
||||||
|
if (val == 'OK') {
|
||||||
|
const data = appDg.value.selected[0];
|
||||||
|
console.log(data);
|
||||||
|
selectedApp.value={
|
||||||
|
appId:data.id ,
|
||||||
|
name:data.name
|
||||||
|
};
|
||||||
|
store.setApp(selectedApp.value);
|
||||||
|
store.setFlow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const showAppDialog=()=>{
|
||||||
|
showSelectApp.value=true;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
store,
|
||||||
|
selectedApp,
|
||||||
|
showSelectApp,
|
||||||
|
showAppDialog,
|
||||||
|
closeDg,
|
||||||
|
appDg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
89
frontend/src/components/left/EventTree.vue
Normal file
89
frontend/src/components/left/EventTree.vue
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<q-tree
|
||||||
|
:nodes="store.eventTree.screens"
|
||||||
|
node-key="label"
|
||||||
|
children-key="events"
|
||||||
|
no-connectors
|
||||||
|
v-model:expanded="expanded"
|
||||||
|
:dense="true"
|
||||||
|
>
|
||||||
|
<template v-slot:default-header="prop">
|
||||||
|
<div class="row col items-start no-wrap event-node" @click="onSelected(prop.node)">
|
||||||
|
<q-icon v-if="prop.node.eventId"
|
||||||
|
name="play_circle"
|
||||||
|
:color="prop.node.hasFlow?'green':'grey'"
|
||||||
|
size="16px" class="q-mr-sm">
|
||||||
|
</q-icon>
|
||||||
|
<div class="no-wrap" :class="selectedEvent && prop.node.eventId===selectedEvent.eventId?'selected-node':''">{{ prop.node.label }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</q-tree>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, computed, ref } from 'vue';
|
||||||
|
import { IKintoneEvent } from '../../types/KintoneEvents';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
import { ActionFlow, ActionNode, RootAction } from 'src/types/ActionTypes';
|
||||||
|
import { S } from 'app/dist/spa/assets/QTable.50486f7c';
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'EventTree',
|
||||||
|
setup(props, context) {
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
// const eventTree=ref(kintoneEvents);
|
||||||
|
// const selectedFlow = store.currentFlow;
|
||||||
|
|
||||||
|
const expanded=ref([
|
||||||
|
store.currentFlow?.getRoot()?.title
|
||||||
|
]);
|
||||||
|
const selectedEvent = ref<IKintoneEvent|null>(null);
|
||||||
|
const onSelected=(node:IKintoneEvent)=>{
|
||||||
|
if(!node.eventId){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selectedEvent.value=node;
|
||||||
|
if(store.appInfo===undefined){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const screen = store.eventTree.findScreen(node.eventId);
|
||||||
|
let flow =store.findFlowByEventId(node.eventId);
|
||||||
|
const screenName=screen!==null?screen.label:"";
|
||||||
|
if(flow!==undefined && flow!==null ){
|
||||||
|
store.selectFlow(flow);
|
||||||
|
}else{
|
||||||
|
const root = new RootAction(node.eventId,screenName,node.label)
|
||||||
|
const flow =new ActionFlow(root);
|
||||||
|
store.flows?.push(flow);
|
||||||
|
store.selectFlow(flow);
|
||||||
|
selectedEvent.value.flowData=flow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
// eventTree,
|
||||||
|
expanded,
|
||||||
|
onSelected,
|
||||||
|
selectedEvent,
|
||||||
|
store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.nowrap{
|
||||||
|
flex-wrap:nowarp;
|
||||||
|
text-wrap:nowarp;
|
||||||
|
}
|
||||||
|
.event-node{
|
||||||
|
cursor:pointer;
|
||||||
|
}
|
||||||
|
.selected-node{
|
||||||
|
color: $primary;
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
.event-node:hover{
|
||||||
|
background-color: $light-blue-1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
186
frontend/src/components/main/NodeItem.vue
Normal file
186
frontend/src/components/main/NodeItem.vue
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
<template>
|
||||||
|
<div class="row justify-center" :style="{ marginLeft: node.inputPoint !== '' ? '240px' : '' }" >
|
||||||
|
<div class="row">
|
||||||
|
<q-card class="action-node" :class="nodeStyle" :square="false" @click="onNodeClick" >
|
||||||
|
<q-toolbar class="col" >
|
||||||
|
<div class="text-subtitle2">{{ node.subTitle }}</div>
|
||||||
|
<q-space></q-space>
|
||||||
|
<q-btn flat round dense icon="more_horiz" size="sm" >
|
||||||
|
<q-menu auto-close anchor="top right">
|
||||||
|
<q-list>
|
||||||
|
<q-item clickable v-if="!isRoot" @click="onEditNode">
|
||||||
|
<q-item-section avatar><q-icon name="edit" ></q-icon></q-item-section>
|
||||||
|
<q-item-section >編集する</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-item clickable v-if="!isRoot" @click="onDeleteNode">
|
||||||
|
<q-item-section avatar><q-icon name="delete" ></q-icon></q-item-section>
|
||||||
|
<q-item-section>削除する</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-item clickable @click="onDeleteAllNode">
|
||||||
|
<q-item-section avatar><q-icon name="delete_sweep" ></q-icon></q-item-section>
|
||||||
|
<q-item-section >以下すべて削除する</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
</q-list>
|
||||||
|
</q-menu>
|
||||||
|
</q-btn>
|
||||||
|
</q-toolbar>
|
||||||
|
<q-separator />
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h7">{{ node.title }}</div>
|
||||||
|
</q-card-section>
|
||||||
|
<template v-if="hasBranch">
|
||||||
|
<q-separator />
|
||||||
|
<q-card-actions align="around">
|
||||||
|
<q-btn flat v-for="(point, index) in node.outputPoints" :key="index">
|
||||||
|
{{ point }}
|
||||||
|
</q-btn>
|
||||||
|
</q-card-actions>
|
||||||
|
</template>
|
||||||
|
</q-card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template v-if="hasBranch">
|
||||||
|
<div class="row justify-center" :style="{ marginLeft: node.inputPoint !== '' ? '240px' : '' }">
|
||||||
|
<div v-for="(point, index) in node.outputPoints" :key="index">
|
||||||
|
<node-line :action-node="node" :mode="getMode(point)" @addNode="addNode" :input-point="point"></node-line>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-if="!hasBranch">
|
||||||
|
<div class="row justify-center" :style="{ marginLeft: node.inputPoint !== '' ? '240px' : '' }">
|
||||||
|
<node-line :action-node="node" :mode="getMode('')" @addNode="addNode" input-point=""></node-line>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, computed, ref } from 'vue';
|
||||||
|
import { IActionNode } from '../../types/ActionTypes';
|
||||||
|
import NodeLine, { Direction } from '../main/NodeLine.vue';
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'NodeItem',
|
||||||
|
components: {
|
||||||
|
NodeLine
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
actionNode: {
|
||||||
|
type: Object as () => IActionNode,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
isSelected: {
|
||||||
|
type: Boolean
|
||||||
|
}
|
||||||
|
},
|
||||||
|
emits: [
|
||||||
|
'addNode',
|
||||||
|
"nodeSelected",
|
||||||
|
"nodeEdit",
|
||||||
|
"deleteNode",
|
||||||
|
"deleteAllNextNodes",
|
||||||
|
],
|
||||||
|
setup(props, context) {
|
||||||
|
const hasBranch = computed(() => props.actionNode.outputPoints.length > 0);
|
||||||
|
const nodeStyle = computed(() => {
|
||||||
|
return {
|
||||||
|
'root-node': props.actionNode.isRoot,
|
||||||
|
'text-white': props.actionNode.isRoot,
|
||||||
|
'selected': props.isSelected && !props.actionNode.isRoot
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const getMode = (point: string) => {
|
||||||
|
if (point === '' || props.actionNode.outputPoints.length === 0) {
|
||||||
|
return Direction.Default;
|
||||||
|
}
|
||||||
|
if (point === props.actionNode.outputPoints[0]) {
|
||||||
|
if (props.actionNode.nextNodeIds.get(point)) {
|
||||||
|
return Direction.Left;
|
||||||
|
} else {
|
||||||
|
return Direction.LeftNotNext;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (props.actionNode.nextNodeIds.get(point)) {
|
||||||
|
return Direction.Right;
|
||||||
|
} else {
|
||||||
|
return Direction.RightNotNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* アクションノード追加イベントを
|
||||||
|
* @param point 入力ポイント
|
||||||
|
*/
|
||||||
|
const addNode = (point: string) => {
|
||||||
|
context.emit('addNode', props.actionNode, point);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ノード選択状態
|
||||||
|
*/
|
||||||
|
const onNodeClick = () => {
|
||||||
|
context.emit('nodeSelected', props.actionNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onEditNode=()=>{
|
||||||
|
context.emit('nodeEdit', props.actionNode);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ノードを削除する
|
||||||
|
*/
|
||||||
|
const onDeleteNode=()=>{
|
||||||
|
context.emit('deleteNode', props.actionNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ノードの以下すべて削除する
|
||||||
|
*/
|
||||||
|
const onDeleteAllNode=()=>{
|
||||||
|
context.emit('deleteAllNextNodes', props.actionNode);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
node: props.actionNode,
|
||||||
|
isRoot: props.actionNode.isRoot,
|
||||||
|
hasBranch,
|
||||||
|
nodeStyle,
|
||||||
|
getMode,
|
||||||
|
addNode,
|
||||||
|
onNodeClick,
|
||||||
|
onEditNode,
|
||||||
|
onDeleteNode,
|
||||||
|
onDeleteAllNode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.action-node {
|
||||||
|
min-width: 300px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line:after {
|
||||||
|
content: '';
|
||||||
|
background-color: $blue-7;
|
||||||
|
display: block;
|
||||||
|
width: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-icon {
|
||||||
|
font-size: 2em;
|
||||||
|
color: $blue-7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.root-node {
|
||||||
|
background-color: $blue-7;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-node:not(.root-node):hover{
|
||||||
|
background-color: $light-blue-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected{
|
||||||
|
background-color: $yellow-1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
109
frontend/src/components/main/NodeLine.vue
Normal file
109
frontend/src/components/main/NodeLine.vue
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<svg class="node-line">
|
||||||
|
<polyline :points="points.linePoints" class="line" ></polyline>
|
||||||
|
<text class="add-icon" @click="addNode(node)" :x="points.iconPoint.x" :y="points.iconPoint.y" font-family="Arial" font-size="25"
|
||||||
|
text-anchor="middle" dy=".3em" style="cursor: pointer;" >
|
||||||
|
⊕
|
||||||
|
</text>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { ref, defineComponent, computed, PropType } from 'vue';
|
||||||
|
import { IActionNode, ActionNode, ActionFlow, RootAction } from '../../types/ActionTypes';
|
||||||
|
export enum Direction {
|
||||||
|
Default = "None",
|
||||||
|
Left = "LEFT",
|
||||||
|
Right = "RIGHT",
|
||||||
|
LeftNotNext = "LEFTNOTNEXT",
|
||||||
|
RightNotNext = "RIGHTNOTNEXT",
|
||||||
|
}
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'NodeLine',
|
||||||
|
props: {
|
||||||
|
actionNode: {
|
||||||
|
type: Object as PropType<IActionNode>,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
mode: {
|
||||||
|
type: String as PropType<Direction>,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
inputPoint:{
|
||||||
|
type:String
|
||||||
|
}
|
||||||
|
},
|
||||||
|
emits: ['addNode'],
|
||||||
|
setup(props,context) {
|
||||||
|
const hasBranch = computed(() => props.actionNode.outputPoints.length > 0);
|
||||||
|
const points = computed(() => {
|
||||||
|
switch (props.mode) {
|
||||||
|
case Direction.Left:
|
||||||
|
return {
|
||||||
|
linePoints: '180, 0, 180, 40, 120, 40, 120, 60',
|
||||||
|
iconPoint: { x: 180, y: 20 }
|
||||||
|
};
|
||||||
|
case Direction.Right:
|
||||||
|
return {
|
||||||
|
linePoints: '60, 0, 60, 40, 120, 40, 120, 60',
|
||||||
|
iconPoint: { x: 60, y: 20 }
|
||||||
|
};
|
||||||
|
case Direction.LeftNotNext:
|
||||||
|
return {
|
||||||
|
linePoints: '180, 0, 180, 40',
|
||||||
|
iconPoint: { x: 180, y: 20 }
|
||||||
|
};
|
||||||
|
case Direction.RightNotNext:
|
||||||
|
return {
|
||||||
|
linePoints: '60, 0, 60, 40',
|
||||||
|
iconPoint: { x: 60, y: 30 }
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return {
|
||||||
|
linePoints: '120, 0, 120, 60',
|
||||||
|
iconPoint: { x: 120, y: 30 }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const addNode=(prveNode:IActionNode)=>{
|
||||||
|
context.emit('addNode',props.inputPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
node: props.actionNode,
|
||||||
|
hasBranch,
|
||||||
|
points,
|
||||||
|
addNode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.node-line {
|
||||||
|
height: 60px;
|
||||||
|
width: 240px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
stroke: $blue-7;
|
||||||
|
fill: none;
|
||||||
|
stroke-width: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-icon {
|
||||||
|
stroke: $blue-8;
|
||||||
|
fill: $blue-8;
|
||||||
|
font-family: Arial;
|
||||||
|
pointer-events: all;
|
||||||
|
font-size: 2.0em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-icon:hover{
|
||||||
|
stroke: $blue-8;
|
||||||
|
fill:$blue-8;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 2.4em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -32,4 +32,3 @@ export interface AppInfo {
|
|||||||
creator?:User;
|
creator?:User;
|
||||||
modifier?:User;
|
modifier?:User;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
57
frontend/src/components/right/ActionProperty.vue
Normal file
57
frontend/src/components/right/ActionProperty.vue
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div v-for="(item, index) in componentData" :key="index">
|
||||||
|
<component :is="item.component" v-bind="item.props" v-model="item.props.modelValue"></component>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import InputText from '../right/InputText.vue';
|
||||||
|
import SelectBox from '../right/SelectBox.vue';
|
||||||
|
import DatePicker from '../right/DatePicker.vue';
|
||||||
|
import FieldInput from '../right/FieldInput.vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'ActionProperty',
|
||||||
|
components: {
|
||||||
|
InputText,
|
||||||
|
SelectBox,
|
||||||
|
DatePicker,
|
||||||
|
FieldInput
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
jsonData: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
jsonValue:{
|
||||||
|
type: Object,
|
||||||
|
required: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
componentData() {
|
||||||
|
return this.jsonData.elements.map((element: any) => {
|
||||||
|
if(this.jsonValue != undefined )
|
||||||
|
{
|
||||||
|
if(this.jsonValue.hasOwnProperty(element.props.name))
|
||||||
|
{
|
||||||
|
element.props.modelValue = this.jsonValue[element.props.name];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
element.props.modelValue = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
component: element.component,
|
||||||
|
props: element.props,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
45
frontend/src/components/right/DatePicker.vue
Normal file
45
frontend/src/components/right/DatePicker.vue
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
|
||||||
|
<q-input v-model="selectedDate" :label="placeholder" mask="date" :rules="['date']">
|
||||||
|
<template v-slot:append>
|
||||||
|
<q-icon name="event" class="cursor-pointer">
|
||||||
|
<q-popup-proxy cover transition-show="scale" transition-hide="scale">
|
||||||
|
<q-date v-model="selectedDate">
|
||||||
|
<div class="row items-center justify-end">
|
||||||
|
<q-btn v-close-popup label="Close" color="primary" flat />
|
||||||
|
</div>
|
||||||
|
</q-date>
|
||||||
|
</q-popup-proxy>
|
||||||
|
</q-icon>
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, ref ,watchEffect} from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'DatePicker',
|
||||||
|
props: {
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const selectedDate = ref(props.modelValue);
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
emit('update:modelValue', selectedDate.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectedDate
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
64
frontend/src/components/right/FieldInput.vue
Normal file
64
frontend/src/components/right/FieldInput.vue
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<template>
|
||||||
|
<q-input v-model="selectedField" :label="placeholder">
|
||||||
|
<template v-slot:append>
|
||||||
|
<q-icon name="search" class="cursor-pointer" @click="showDg"/>
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
|
<show-dialog v-model:visible="show" name="フィールド一覧" @close="closeDg">
|
||||||
|
<field-select ref="appDg" name="フィールド" type="single" :appId="store.appInfo?.appId"></field-select>
|
||||||
|
</show-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, ref ,watchEffect} from 'vue';
|
||||||
|
import ShowDialog from '../ShowDialog.vue';
|
||||||
|
import FieldSelect from '../FieldSelect.vue';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'FieldInput',
|
||||||
|
components: {
|
||||||
|
ShowDialog,
|
||||||
|
FieldSelect,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const appDg = ref();
|
||||||
|
const show = ref(false);
|
||||||
|
const selectedField = ref(props.modelValue);
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
|
||||||
|
const showDg = () => {
|
||||||
|
show.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeDg = (val:string) => {
|
||||||
|
if (val == 'OK') {
|
||||||
|
selectedField.value = appDg.value.selected[0].name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
emit('update:modelValue', selectedField.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
store,
|
||||||
|
appDg,
|
||||||
|
show,
|
||||||
|
showDg,
|
||||||
|
closeDg,
|
||||||
|
selectedField,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
33
frontend/src/components/right/InputText.vue
Normal file
33
frontend/src/components/right/InputText.vue
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<template>
|
||||||
|
<q-input :label="placeholder" v-model="inputValue"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent,ref,watchEffect } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'InputText',
|
||||||
|
props: {
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const inputValue = ref(props.modelValue);
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
emit('update:modelValue', inputValue.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
inputValue,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
45
frontend/src/components/right/PropertyList.vue
Normal file
45
frontend/src/components/right/PropertyList.vue
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div v-for="(item, index) in properties" :key="index">
|
||||||
|
<component :is="item.component" v-bind="item.props" v-model="item.props.modelValue"></component>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
/**
|
||||||
|
* プロパティ属性設定生成する
|
||||||
|
*/
|
||||||
|
import { PropType, defineComponent,ref } from 'vue';
|
||||||
|
import InputText from '../right/InputText.vue';
|
||||||
|
import SelectBox from '../right/SelectBox.vue';
|
||||||
|
import DatePicker from '../right/DatePicker.vue';
|
||||||
|
import FieldInput from '../right/FieldInput.vue';
|
||||||
|
import { IActionNode,IActionProperty } from 'src/types/ActionTypes';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'PropertyList',
|
||||||
|
components: {
|
||||||
|
InputText,
|
||||||
|
SelectBox,
|
||||||
|
DatePicker,
|
||||||
|
FieldInput
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
nodeProps: {
|
||||||
|
type: Object as PropType<Array<IActionProperty>>,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
jsonValue:{
|
||||||
|
type: Object,
|
||||||
|
required: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setup(props, context) {
|
||||||
|
const properties=ref(props.nodeProps)
|
||||||
|
return {
|
||||||
|
properties
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
80
frontend/src/components/right/PropertyPanel.vue
Normal file
80
frontend/src/components/right/PropertyPanel.vue
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<q-drawer
|
||||||
|
side="right"
|
||||||
|
:show-if-above="false"
|
||||||
|
bordered
|
||||||
|
:width="301"
|
||||||
|
:breakpoint="500"
|
||||||
|
class="bg-grey-3"
|
||||||
|
:model-value="showPanel"
|
||||||
|
elevated
|
||||||
|
overlay
|
||||||
|
>
|
||||||
|
<q-card class="column full-height" style="width: 300px">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">プロパティ</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-section class="col q-pt-none">
|
||||||
|
<property-list :node-props="actionProps" v-if="showPanel" ></property-list>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat label="Save" @click="save"/>
|
||||||
|
<q-btn flat label="Cancel" @click="cancel" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts">
|
||||||
|
import { reactive, ref,defineComponent, defineProps,PropType ,watchEffect} from 'vue'
|
||||||
|
import PropertyList from 'components/right/PropertyList.vue';
|
||||||
|
import { IActionNode } from 'src/types/ActionTypes';
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'PropertyPanel',
|
||||||
|
components: {
|
||||||
|
PropertyList
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
actionNode:{
|
||||||
|
type:Object as PropType<IActionNode>,
|
||||||
|
required:true
|
||||||
|
},
|
||||||
|
drawerRight:{
|
||||||
|
type:Boolean,
|
||||||
|
required:true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
emits: [
|
||||||
|
"update:drawerRight"
|
||||||
|
],
|
||||||
|
setup(props,{emit}) {
|
||||||
|
const showPanel =ref(props.drawerRight);
|
||||||
|
const actionProps =ref(props.actionNode.actionProps);
|
||||||
|
watchEffect(() => {
|
||||||
|
showPanel.value = props.drawerRight;
|
||||||
|
actionProps.value= props.actionNode.actionProps;
|
||||||
|
});
|
||||||
|
|
||||||
|
const cancel = async() =>{
|
||||||
|
showPanel.value = false;
|
||||||
|
emit("update:drawerRight",false )
|
||||||
|
}
|
||||||
|
|
||||||
|
const save = async () =>{
|
||||||
|
showPanel.value=false;
|
||||||
|
emit("update:drawerRight",false )
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
cancel,
|
||||||
|
save,
|
||||||
|
actionProps,
|
||||||
|
showPanel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
</style>
|
||||||
36
frontend/src/components/right/SelectBox.vue
Normal file
36
frontend/src/components/right/SelectBox.vue
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<template>
|
||||||
|
<q-select v-model="selectedValue" :label="placeholder" :options="options"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent,ref,watchEffect } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'SelectBox',
|
||||||
|
props: {
|
||||||
|
placeholder: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
modelValue: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const selectedValue = ref(props.modelValue);
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
emit('update:modelValue', selectedValue.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectedValue
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
37
frontend/src/control/flowctrl.ts
Normal file
37
frontend/src/control/flowctrl.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { api } from 'boot/axios';
|
||||||
|
import { ActionFlow } from 'src/types/ActionTypes';
|
||||||
|
|
||||||
|
export class FlowCtrl
|
||||||
|
{
|
||||||
|
|
||||||
|
async getFlows(appId:string):Promise<ActionFlow[]>
|
||||||
|
{
|
||||||
|
const result = await api.get(`http://127.0.0.1:8000/api/flows/${appId}`);
|
||||||
|
//console.info(result.data);
|
||||||
|
if(!result.data || !Array.isArray(result.data)){
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const flows:ActionFlow[]=[];
|
||||||
|
for(const flow of result.data){
|
||||||
|
flows.push(ActionFlow.fromJSON(flow.content));
|
||||||
|
}
|
||||||
|
return flows;
|
||||||
|
}
|
||||||
|
|
||||||
|
async SaveFlow(jsonData:any):Promise<boolean>
|
||||||
|
{
|
||||||
|
const result = await api.post('http://127.0.0.1:8000/api/flow',jsonData);
|
||||||
|
console.info(result.data)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async UpdateFlow(jsonData:any):Promise<boolean>
|
||||||
|
{
|
||||||
|
const result = await api.put('http://127.0.0.1:8000/api/flow/' + jsonData.flowid,jsonData);
|
||||||
|
console.info(result.data)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -56,10 +56,17 @@ const essentialLinks: EssentialLinkProps[] = [
|
|||||||
target:'_self'
|
target:'_self'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ルールエディター',
|
title: 'フローエディター',
|
||||||
caption: 'rule',
|
caption: 'flowChart',
|
||||||
icon: 'rule',
|
icon: 'account_tree',
|
||||||
link: '/#/ruleEditor',
|
link: '/#/flowEditor2',
|
||||||
|
target:'_self'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'FlowEditor',
|
||||||
|
caption: 'FlowEditor',
|
||||||
|
icon: 'account_tree',
|
||||||
|
link: '/#/flowEditor',
|
||||||
target:'_self'
|
target:'_self'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
160
frontend/src/pages/FlowChart.vue
Normal file
160
frontend/src/pages/FlowChart.vue
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm event-tree">
|
||||||
|
<q-drawer
|
||||||
|
side="left"
|
||||||
|
overlay
|
||||||
|
bordered
|
||||||
|
v-model="drawerLeft"
|
||||||
|
:show-if-above="false"
|
||||||
|
elevated
|
||||||
|
>
|
||||||
|
<!-- <q-card class="column full-height" style="width: 300px">
|
||||||
|
<q-card-section> -->
|
||||||
|
|
||||||
|
<div class="flex-center fixd-top" >
|
||||||
|
<AppSelector />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- </q-card-section> -->
|
||||||
|
<q-separator />
|
||||||
|
<!-- <q-card-section> -->
|
||||||
|
<div class="flex-center">
|
||||||
|
<EventTree />
|
||||||
|
</div>
|
||||||
|
<!-- </q-card-section> -->
|
||||||
|
<!-- </q-card> -->
|
||||||
|
</q-drawer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<q-page>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<div class="flowchart" v-if="store.currentFlow">
|
||||||
|
<node-item v-for="(node,) in store.currentFlow.actionNodes" :key="node.id"
|
||||||
|
:isSelected="node===state.activeNode" :actionNode="node"
|
||||||
|
@addNode="addNode"
|
||||||
|
@nodeSelected="onNodeSelected"
|
||||||
|
@nodeEdit="onNodeEdit"
|
||||||
|
@deleteNode="onDeleteNode"
|
||||||
|
@deleteAllNextNodes="onDeleteAllNextNodes"
|
||||||
|
></node-item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</q-page>
|
||||||
|
<PropertyPanel :actionNode="state.activeNode" v-model:drawerRight="drawerRight"></PropertyPanel>
|
||||||
|
<ShowDialog v-model:visible="showAddAction" name="アクション" @close="closeDg">
|
||||||
|
<action-select ref="appDg" name="model" type="single"></action-select>
|
||||||
|
</ShowDialog>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {ref,reactive,computed,onMounted} from 'vue';
|
||||||
|
import {IActionNode, ActionNode, IActionFlow, ActionFlow,RootAction, IActionProperty } from 'src/types/ActionTypes';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
import NodeItem from 'src/components/main/NodeItem.vue';
|
||||||
|
import ShowDialog from 'components/ShowDialog.vue';
|
||||||
|
import ActionSelect from 'components/ActionSelect.vue';
|
||||||
|
import PropertyPanel from 'components/right/PropertyPanel.vue';
|
||||||
|
import AppSelector from 'components/left/AppSelector.vue';
|
||||||
|
import EventTree from 'components/left/EventTree.vue';
|
||||||
|
import {FlowCtrl } from '../control/flowctrl';
|
||||||
|
const drawerLeft = ref(true);
|
||||||
|
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
// ref関数を使ってtemplateとバインド
|
||||||
|
const state=reactive({
|
||||||
|
activeNode:{
|
||||||
|
id:""
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const appDg = ref();
|
||||||
|
const prevNodeIfo=ref({
|
||||||
|
prevNode:{} as IActionNode,
|
||||||
|
inputPoint:""
|
||||||
|
});
|
||||||
|
const refFlow = ref<ActionFlow|null>(null);
|
||||||
|
const showAddAction=ref(false);
|
||||||
|
const drawerRight=ref(false);
|
||||||
|
const model=ref("");
|
||||||
|
const addActionNode=(action:IActionNode)=>{
|
||||||
|
// refFlow.value?.actionNodes.push(action);
|
||||||
|
store.currentFlow?.actionNodes.push(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
const addNode=(node:IActionNode,inputPoint:string)=>{
|
||||||
|
showAddAction.value=true;
|
||||||
|
prevNodeIfo.value.prevNode=node;
|
||||||
|
prevNodeIfo.value.inputPoint=inputPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onNodeSelected=(node:IActionNode)=>{
|
||||||
|
//右パネルが開いている場合、自動閉じる
|
||||||
|
if(drawerRight.value && state.activeNode.id!==node.id){
|
||||||
|
drawerRight.value=false;
|
||||||
|
}
|
||||||
|
state.activeNode = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onNodeEdit=(node:IActionNode)=>{
|
||||||
|
state.activeNode = node;
|
||||||
|
drawerRight.value=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onDeleteNode=(node:IActionNode)=>{
|
||||||
|
if(!store.currentFlow) return;
|
||||||
|
store.currentFlow?.removeNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onDeleteAllNextNodes=(node:IActionNode)=>{
|
||||||
|
if(!store.currentFlow) return;
|
||||||
|
store.currentFlow?.removeAllNext(node.id);
|
||||||
|
}
|
||||||
|
const closeDg=(val :any)=>{
|
||||||
|
console.log("Dialog closed->",val);
|
||||||
|
if (val == 'OK') {
|
||||||
|
const data = appDg.value.selected[0];
|
||||||
|
const actionProps=JSON.parse(data.content);
|
||||||
|
const action = new ActionNode(data.name,data.desc,"",[],actionProps);
|
||||||
|
store.currentFlow?.addNode(action, prevNodeIfo.value.prevNode,prevNodeIfo.value.inputPoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchData= async ()=>{
|
||||||
|
const flowCtrl = new FlowCtrl();
|
||||||
|
if(store.appInfo===undefined) return;
|
||||||
|
const actionFlows = await flowCtrl.getFlows(store.appInfo?.appId);
|
||||||
|
if(actionFlows && actionFlows.length>0){
|
||||||
|
store.setFlows(actionFlows);
|
||||||
|
}
|
||||||
|
if(actionFlows && actionFlows.length==1){
|
||||||
|
store.selectFlow(actionFlows[0]);
|
||||||
|
}
|
||||||
|
refFlow.value=actionFlows[0];
|
||||||
|
const root =refFlow.value.getRoot();
|
||||||
|
if(root){
|
||||||
|
state.activeNode=root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
fetchData();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.flowchart{
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
.flow-toolbar{
|
||||||
|
opacity: 50%;
|
||||||
|
}
|
||||||
|
.flow-container{
|
||||||
|
height: 91.5dvb;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.event-tree .q-drawer {
|
||||||
|
top:50px;
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
102
frontend/src/pages/FlowChartTest.vue
Normal file
102
frontend/src/pages/FlowChartTest.vue
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<template>
|
||||||
|
<q-page>
|
||||||
|
|
||||||
|
<div class="flowchart">
|
||||||
|
<node-item v-for="(node,) in refFlow.actionNodes" :key="node.id"
|
||||||
|
:isSelected="node===state.activeNode" :actionNode="node"
|
||||||
|
@addNode="addNode"
|
||||||
|
@nodeSelected="onNodeSelected"
|
||||||
|
@nodeEdit="onNodeEdit"
|
||||||
|
@deleteNode="onDeleteNode"
|
||||||
|
@deleteAllNextNodes="onDeleteAllNextNodes"
|
||||||
|
></node-item>
|
||||||
|
</div>
|
||||||
|
</q-page>
|
||||||
|
<PropertyPanel :actionNode="state.activeNode" v-model:drawerRight="drawerRight"></PropertyPanel>
|
||||||
|
<show-dialog v-model:visible="showAddAction" name="アクション" @close="closeDg">
|
||||||
|
<action-select ref="appDg" name="アクション" type="single"></action-select>
|
||||||
|
</show-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {ref,reactive,computed} from 'vue';
|
||||||
|
import {IActionNode, ActionNode, IActionFlow, ActionFlow,RootAction, IActionProperty } from 'src/types/ActionTypes';
|
||||||
|
import NodeItem from 'src/components/main/NodeItem.vue';
|
||||||
|
import ShowDialog from 'components/ShowDialog.vue';
|
||||||
|
import ActionSelect from 'components/ActionSelect.vue';
|
||||||
|
import PropertyPanel from 'components/right/PropertyPanel.vue';
|
||||||
|
|
||||||
|
|
||||||
|
const rootNode:RootAction =new RootAction("app.record.create.submit","レコード追加画面","保存するとき");
|
||||||
|
const actionFlow: ActionFlow = new ActionFlow(rootNode);
|
||||||
|
const saibanProps:IActionProperty[]=[{
|
||||||
|
component:"InputText",
|
||||||
|
props:{
|
||||||
|
displayName:"フォーマット",
|
||||||
|
modelValue:"",
|
||||||
|
name:"format",
|
||||||
|
placeholder:"フォーマットを入力してください",
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
component:"FieldInput",
|
||||||
|
props:{
|
||||||
|
displayName:"採番項目",
|
||||||
|
modelValue:"",
|
||||||
|
name:"field",
|
||||||
|
placeholder:"採番項目を選択してください",
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
actionFlow.addNode(new ActionNode('自動採番','文書番号を自動採番する','',[],saibanProps));
|
||||||
|
actionFlow.addNode(new ActionNode('入力データ取得','電話番号を取得する',''));
|
||||||
|
const branchNode = actionFlow.addNode(new ActionNode('条件分岐','電話番号入力形式チャック','',['はい','いいえ'] ));
|
||||||
|
// actionFlow.addNode(new ActionNode('入力データ取得','住所を取得する',''),branchNode,'はい');
|
||||||
|
actionFlow.addNode(new ActionNode('エラー表示','エラー表示して保存しない',''),branchNode,'いいえ' );
|
||||||
|
|
||||||
|
// ref関数を使ってtemplateとバインド
|
||||||
|
const state=reactive({
|
||||||
|
activeNode:rootNode,
|
||||||
|
})
|
||||||
|
|
||||||
|
const refFlow = ref(actionFlow);
|
||||||
|
const showAddAction=ref(false);
|
||||||
|
const drawerRight=ref(false);
|
||||||
|
|
||||||
|
const addActionNode=(action:IActionNode)=>{
|
||||||
|
refFlow.value.actionNodes.push(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
const addNode=(node:IActionNode,inputPoint:string)=>{
|
||||||
|
showAddAction.value=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onNodeSelected=(node:IActionNode)=>{
|
||||||
|
//右パネルが開いている場合、自動閉じる
|
||||||
|
if(drawerRight.value && state.activeNode.id!==node.id){
|
||||||
|
drawerRight.value=false;
|
||||||
|
}
|
||||||
|
state.activeNode = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onNodeEdit=(node:IActionNode)=>{
|
||||||
|
state.activeNode = node;
|
||||||
|
drawerRight.value=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onDeleteNode=(node:IActionNode)=>{
|
||||||
|
refFlow.value.removeNode(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onDeleteAllNextNodes=(node:IActionNode)=>{
|
||||||
|
refFlow.value.removeAllNext(node.id);
|
||||||
|
}
|
||||||
|
const closeDg=(val :any)=>{
|
||||||
|
console.log("Dialog closed->",val);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.flowchart{
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
122
frontend/src/pages/FlowEditorPage.vue
Normal file
122
frontend/src/pages/FlowEditorPage.vue
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="q-ma-md">
|
||||||
|
<div class="q-gutter-xs row items-start">
|
||||||
|
<q-breadcrumbs class="q-pt-xs q-mr-sm" active-color="black">
|
||||||
|
<q-breadcrumbs-el icon="home" />
|
||||||
|
<q-breadcrumbs-el :label="actName" />
|
||||||
|
<q-breadcrumbs-el
|
||||||
|
v-for="flowName in flowNames"
|
||||||
|
:key="flowName"
|
||||||
|
:label="flowName"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-breadcrumbs-el :label="flowNames1" />
|
||||||
|
</q-breadcrumbs>
|
||||||
|
<q-separator vertical class="q-mr-xs" />
|
||||||
|
<q-btn
|
||||||
|
unelevated
|
||||||
|
class="q-py-sm"
|
||||||
|
padding="none md none sm"
|
||||||
|
color="blue-1"
|
||||||
|
text-color="primary"
|
||||||
|
size="md"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
label="変 更"
|
||||||
|
icon="expand_more"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-space />
|
||||||
|
<q-btn
|
||||||
|
class="q-px-sm q-mr-sm"
|
||||||
|
color="white"
|
||||||
|
size="sm"
|
||||||
|
text-color="black"
|
||||||
|
label="キャンセル"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-btn
|
||||||
|
class="q-px-sm"
|
||||||
|
color="primary"
|
||||||
|
size="sm"
|
||||||
|
label="保存する"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<q-layout
|
||||||
|
container
|
||||||
|
style="height: 91.5dvb"
|
||||||
|
class="shadow-2 rounded-borders"
|
||||||
|
>
|
||||||
|
<q-drawer side="left" overlay bordered v-model="drawerLeft">
|
||||||
|
<div class="q-pa-sm fixed-right">
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
round
|
||||||
|
color="primary"
|
||||||
|
icon="close"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="q-mt-lg q-pa-sm">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="flex-center">
|
||||||
|
<div class="row q-pl-md">
|
||||||
|
<p class="text-h6">アクション選択</p>
|
||||||
|
</div>
|
||||||
|
<ItemSelector :actName="actName" />
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
</div>
|
||||||
|
<q-separator />
|
||||||
|
<div class="q-mt-md q-pa-sm">
|
||||||
|
<q-card-section>
|
||||||
|
<p class="text-h6 q-pl-md q-mb-none">フロー選択</p>
|
||||||
|
<ControlPanel />
|
||||||
|
</q-card-section>
|
||||||
|
</div>
|
||||||
|
<q-separator />
|
||||||
|
<q-card-actions align="right">
|
||||||
|
<div class="q-pa-sm">
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
color="primary"
|
||||||
|
size="md"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
label="ジャンプ"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</q-card-actions>
|
||||||
|
</q-drawer>
|
||||||
|
|
||||||
|
<FlowChartTest />
|
||||||
|
</q-layout>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import FlowChartTest from 'pages/FlowChartTest.vue';
|
||||||
|
import ControlPanel from 'components/flowEditor/left/ControlPanelC.vue';
|
||||||
|
import ItemSelector from 'components/flowEditor/left/ItemSelector.vue';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
|
||||||
|
const actName = ref('勤怠管理 - 4');
|
||||||
|
const flowNames = ref(['レコードを追加画面', '保存をクリックした時']);
|
||||||
|
|
||||||
|
const drawerLeft = ref(false);
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
const { flowNames1 } = storeToRefs(store);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass"></style>
|
||||||
117
frontend/src/pages/FlowEditorPage2.vue
Normal file
117
frontend/src/pages/FlowEditorPage2.vue
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
<template>
|
||||||
|
<div >
|
||||||
|
<div class="q-ma-md">
|
||||||
|
<div class="q-gutter-xs row items-start">
|
||||||
|
<q-btn
|
||||||
|
size="md"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
icon="keyboard_double_arrow_right"
|
||||||
|
round
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-space />
|
||||||
|
<q-btn
|
||||||
|
color="white"
|
||||||
|
size="sm"
|
||||||
|
text-color="black"
|
||||||
|
label="キャンセル"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
|
||||||
|
<q-btn
|
||||||
|
class="q-px-sm"
|
||||||
|
color="primary"
|
||||||
|
size="sm"
|
||||||
|
label="保存する"
|
||||||
|
@click="save()"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<q-layout
|
||||||
|
container
|
||||||
|
class="flow-container shadow-2 rounded-borders"
|
||||||
|
>
|
||||||
|
<q-drawer side="left" overlay bordered v-model="drawerLeft">
|
||||||
|
<div class="q-pa-sm fixed-right">
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
round
|
||||||
|
color="primary"
|
||||||
|
icon="close"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="q-mt-lg q-pa-sm">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="flex-center">
|
||||||
|
<ItemSelector />
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
</div>
|
||||||
|
<q-separator />
|
||||||
|
<div class="q-mt-md q-pa-sm">
|
||||||
|
<q-card-section>
|
||||||
|
<ControlPanel />
|
||||||
|
</q-card-section>
|
||||||
|
</div>
|
||||||
|
<q-separator />
|
||||||
|
<q-card-actions align="right">
|
||||||
|
<div class="q-pa-sm">
|
||||||
|
<q-btn
|
||||||
|
flat
|
||||||
|
color="primary"
|
||||||
|
size="md"
|
||||||
|
@click="drawerLeft = !drawerLeft"
|
||||||
|
label="ジャンプ"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</q-card-actions>
|
||||||
|
</q-drawer>
|
||||||
|
|
||||||
|
<FlowChartTest />
|
||||||
|
</q-layout>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import FlowChartTest from 'pages/FlowChartTest.vue';
|
||||||
|
import ControlPanel from 'components/flowEditor/left/ControlPanelC.vue';
|
||||||
|
import ItemSelector from 'components/flowEditor/left/ItemSelector.vue';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFlowEditorStore } from 'stores/flowEditor';
|
||||||
|
import { FlowCtrl } from '../control/flowctrl'
|
||||||
|
|
||||||
|
const flowCtrl = new FlowCtrl();
|
||||||
|
const actName = ref('勤怠管理 - 4');
|
||||||
|
|
||||||
|
const drawerLeft = ref(false);
|
||||||
|
const store = useFlowEditorStore();
|
||||||
|
const { flowNames1 } = storeToRefs(store);
|
||||||
|
let isNew = ref(true);
|
||||||
|
|
||||||
|
const save = () =>{
|
||||||
|
|
||||||
|
if(isNew.value)
|
||||||
|
{
|
||||||
|
flowCtrl.SaveFlow({appid:'1',flowid:'flow123',eventid:'event123',name:'test',content:'[]'});
|
||||||
|
isNew.value = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
flowCtrl.UpdateFlow({appid:'1',flowid:'flow123',eventid:'event123',name:'test',content:'[{"a":"b"}]'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.flow-toolbar{
|
||||||
|
opacity: 50%;
|
||||||
|
}
|
||||||
|
.flow-container{
|
||||||
|
height: calc(91.5dvb - 50px);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -9,41 +9,67 @@
|
|||||||
</div>
|
</div>
|
||||||
<div style="min-height: 100vh;">
|
<div style="min-height: 100vh;">
|
||||||
<div class="q-pa-md">
|
<div class="q-pa-md">
|
||||||
<q-btn-dropdown
|
<q-btn-dropdown split color="primary" label="ルール新規作成" size="lg">
|
||||||
split
|
<q-list>
|
||||||
color="primary"
|
<q-item v-for="action in actions" clickable v-close-popup @click="onItemClick" :key="action">
|
||||||
label="ルール新規作成"
|
<q-item-section>
|
||||||
size="lg"
|
<q-item-label>{{ action }}</q-item-label>
|
||||||
>
|
</q-item-section>
|
||||||
<q-list>
|
</q-item>
|
||||||
<q-item
|
</q-list>
|
||||||
v-for="action in actions"
|
</q-btn-dropdown>
|
||||||
clickable v-close-popup
|
</div>
|
||||||
@click="onItemClick"
|
<div class="q-pa-md">
|
||||||
:key="action"
|
<q-select v-model="model" :options="options" label="Standard"/>
|
||||||
>
|
<q-btn :label="model+'選択'" color="primary" @click="showDg()" />
|
||||||
<q-item-section>
|
<show-dialog v-model:visible="show" :name="model" @close="closeDg">
|
||||||
<q-item-label>{{ action }}</q-item-label>
|
<template v-if="model=='アプリ'">
|
||||||
</q-item-section>
|
<app-select ref="appDg" :name="model" type="single"></app-select>
|
||||||
</q-item>
|
</template>
|
||||||
</q-list>
|
<template v-if="model=='フィールド'">
|
||||||
</q-btn-dropdown>
|
<field-select ref="appDg" :name="model" type="multiple" :appId="1"></field-select>
|
||||||
|
</template>
|
||||||
|
<template v-if="model=='アクション'">
|
||||||
|
<action-select ref="appDg" :name="model" type="single"></action-select>
|
||||||
|
</template>
|
||||||
|
</show-dialog>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</q-page>
|
</q-page>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import ShowDialog from 'components/ShowDialog.vue';
|
||||||
|
import AppSelect from 'components/AppSelect.vue';
|
||||||
|
import FieldSelect from 'components/FieldSelect.vue';
|
||||||
|
import ActionSelect from 'components/ActionSelect.vue';
|
||||||
|
import { ref } from 'vue'
|
||||||
|
let show = ref(false);
|
||||||
|
let appDg = ref();
|
||||||
|
let model = ref('アプリ');
|
||||||
|
let options = ['アプリ','フィールド','アクション']
|
||||||
|
const showDg = () => {
|
||||||
|
show.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const closeDg = (val:string) => {
|
||||||
|
if (val == 'OK') {
|
||||||
|
alert(JSON.stringify(appDg.value.selected))
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
interface Props {
|
interface Props {
|
||||||
title: string;
|
title: string;
|
||||||
actions:string[];
|
actions: string[];
|
||||||
}
|
}
|
||||||
const props = withDefaults(defineProps<Props>(), {
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
title:"ルールエディター",
|
title: "ルールエディター",
|
||||||
actions:()=>["フィールド制御","一覧画面","その他"]
|
actions: () => ["フィールド制御", "一覧画面", "その他"]
|
||||||
});
|
});
|
||||||
function onItemClick(evt: Event){
|
function onItemClick(evt: Event) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
96
frontend/src/pages/testFlow.vue
Normal file
96
frontend/src/pages/testFlow.vue
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<q-btn label="プロパティ" icon="keyboard_arrow_right" color="primary" @click="open('right')" />
|
||||||
|
<!-- <q-btn label="Readプロパティ" icon="keyboard_arrow_right" color="primary" @click="write('right')" /> -->
|
||||||
|
|
||||||
|
<q-dialog v-model="dialog" :position="position">
|
||||||
|
<q-card class="column full-height" style="width: 300px">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">プロパティ</div>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
|
||||||
|
<q-card-section class="col q-pt-none">
|
||||||
|
<ActionProperty :jsonData="jsonData" :jsonValue="jsonValue"/>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat label="Save" v-close-popup @click="save"/>
|
||||||
|
<q-btn flat label="Cancel" v-close-popup />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref,onMounted } from 'vue'
|
||||||
|
import ActionProperty from 'components/right/ActionProperty.vue';
|
||||||
|
const dialog = ref(false)
|
||||||
|
const position = ref('top')
|
||||||
|
|
||||||
|
const jsonData = {
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
component: 'InputText',
|
||||||
|
props: {
|
||||||
|
name:'1',
|
||||||
|
placeholder: 'Enter some text',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'SelectBox',
|
||||||
|
props: {
|
||||||
|
name:'2',
|
||||||
|
placeholder: 'Choose an option',
|
||||||
|
modelValue: '',
|
||||||
|
options: [
|
||||||
|
'option1',
|
||||||
|
'option2',
|
||||||
|
'option3'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'DatePicker',
|
||||||
|
props: {
|
||||||
|
name:'3',
|
||||||
|
placeholder: 'Choose a date',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'FieldInput',
|
||||||
|
props: {
|
||||||
|
name:'4',
|
||||||
|
placeholder: 'Choose a field',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
let jsonValue = {
|
||||||
|
1:'abc',
|
||||||
|
2:'option2',
|
||||||
|
3:'2023/09/04',
|
||||||
|
4:'6666'
|
||||||
|
};
|
||||||
|
|
||||||
|
const open = (pos:string) => {
|
||||||
|
position.value = pos
|
||||||
|
dialog.value = true
|
||||||
|
};
|
||||||
|
|
||||||
|
const save = async () =>{
|
||||||
|
|
||||||
|
jsonData.elements.forEach(property => {
|
||||||
|
if(jsonValue != undefined)
|
||||||
|
{
|
||||||
|
jsonValue[property.props.name] = property.props.modelValue;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(jsonValue);
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -1,13 +1,88 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<q-page>
|
||||||
|
|
||||||
</div>
|
<div class="q-pa-md column content-center items-center">
|
||||||
|
<div>
|
||||||
|
<q-btn label="アクション選択" color="primary" @click="showDg()" v-if="addshow" />
|
||||||
|
<show-dialog v-model:visible="show" name="アクション" @close="closeDg">
|
||||||
|
<action-select ref="appDg" name="アクション" type="single"></action-select>
|
||||||
|
</show-dialog>
|
||||||
|
</div>
|
||||||
|
<div id="action"></div>
|
||||||
|
</div>
|
||||||
|
</q-page>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script setup lang="ts">
|
||||||
export default {
|
import { ref } from 'vue';
|
||||||
|
import ShowDialog from 'components/ShowDialog.vue';
|
||||||
|
import ActionSelect from 'components/ActionSelect.vue';
|
||||||
|
|
||||||
|
const show = ref(false);
|
||||||
|
const addshow = ref(true);
|
||||||
|
const appDg = ref();
|
||||||
|
|
||||||
|
const showDg = () => {
|
||||||
|
show.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeDg = (val: string) => {
|
||||||
|
if (val == 'OK') {
|
||||||
|
//alert(JSON.stringify(appDg.value.selected[0].content));
|
||||||
|
let oDiv1 = document.getElementById('action');
|
||||||
|
let oDiv2 = document.createElement('div');
|
||||||
|
oDiv2.setAttribute('class', 'action');
|
||||||
|
if (oDiv1 !== null) {
|
||||||
|
oDiv2.innerHTML = appDg.value.selected[0].content;
|
||||||
|
oDiv1?.append(oDiv2);
|
||||||
|
// let oAdd = oDiv2.getElementsByClassName('next')[0];
|
||||||
|
// oAdd.addEventListener('mouseenter', mouseenter);
|
||||||
|
// oAdd.addEventListener('mouseleave', mouseleave);
|
||||||
|
// let oDel = oDiv2.getElementsByClassName('del')[0];
|
||||||
|
// oDel.addEventListener('click', clickdel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.getElementsByClassName('action').length > 0) {
|
||||||
|
addshow.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const mouseenter = (event: Event) => {
|
||||||
|
console.log('1');
|
||||||
|
let oAdd = "<div style='display: table-cell;'><button type='button' onclick='clickadd(this.parentElement.parentElement.parentElement.parentElement)'>+</button></div>";
|
||||||
|
let oDiv1 = event.target as Element
|
||||||
|
let oDivs = oDiv1?.getElementsByClassName('add');
|
||||||
|
if (oDivs.length === 0) {
|
||||||
|
let oDiv2 = document.createElement('div');
|
||||||
|
oDiv2.className = "add";
|
||||||
|
oDiv2.setAttribute("style", "display:table-row;height:inherit;position: absolute;left:calc(50% - 19px);");
|
||||||
|
oDiv2.innerHTML = oAdd;
|
||||||
|
oDiv1?.append(oDiv2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const mouseleave = (event: Event) => {
|
||||||
|
console.log('2');
|
||||||
|
let oDiv2 = (event.target as Element)?.parentElement?.getElementsByClassName('add');
|
||||||
|
oDiv2[0]?.remove();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const clickadd = (pdiv: Element) => {
|
||||||
|
console.log('3');
|
||||||
|
show.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const clickdel = (pdiv: Element) => {
|
||||||
|
pdiv.remove();
|
||||||
|
if (document.getElementsByClassName('action').length == 0) {
|
||||||
|
addshow.value = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.clickadd = clickadd;
|
||||||
|
window.clickdel = clickdel;
|
||||||
|
window.mouseenter = mouseenter;
|
||||||
|
window.mouseleave = mouseleave;
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
101
frontend/src/pages/testRight.vue
Normal file
101
frontend/src/pages/testRight.vue
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<template>
|
||||||
|
<div class="q-pa-md q-gutter-sm">
|
||||||
|
<q-btn label="プロパティ" icon="keyboard_arrow_right" color="primary" @click="drawerRight = !drawerRight" />
|
||||||
|
<!-- <q-btn label="Readプロパティ" icon="keyboard_arrow_right" color="primary" @click="write('right')" /> -->
|
||||||
|
<q-drawer
|
||||||
|
side="right"
|
||||||
|
v-model="drawerRight"
|
||||||
|
show-if-above
|
||||||
|
bordered
|
||||||
|
:width="301"
|
||||||
|
:breakpoint="500"
|
||||||
|
class="bg-grey-3"
|
||||||
|
>
|
||||||
|
<q-card class="column full-height" style="width: 300px">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">プロパティ</div>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
|
||||||
|
<q-card-section class="col q-pt-none">
|
||||||
|
<ActionProperty :jsonData="jsonData" :jsonValue="jsonValue" v-if="drawerRight"/>
|
||||||
|
</q-card-section>
|
||||||
|
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat label="Save" @click="save"/>
|
||||||
|
<q-btn flat label="Cancel" @click="cancel" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { reactive, ref } from 'vue'
|
||||||
|
import ActionProperty from 'components/right/ActionProperty.vue';
|
||||||
|
const drawerRight = ref(false);
|
||||||
|
const jsonData = {
|
||||||
|
elements: [
|
||||||
|
{
|
||||||
|
component: 'InputText',
|
||||||
|
props: {
|
||||||
|
name:'1',
|
||||||
|
placeholder: 'Enter some text',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'SelectBox',
|
||||||
|
props: {
|
||||||
|
name:'2',
|
||||||
|
placeholder: 'Choose an option',
|
||||||
|
modelValue: '',
|
||||||
|
options: [
|
||||||
|
'option1',
|
||||||
|
'option2',
|
||||||
|
'option3'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'DatePicker',
|
||||||
|
props: {
|
||||||
|
name:'3',
|
||||||
|
placeholder: 'Choose a date',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: 'FieldInput',
|
||||||
|
props: {
|
||||||
|
name:'4',
|
||||||
|
placeholder: 'Choose a field',
|
||||||
|
modelValue: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
let jsonValue = {
|
||||||
|
1:'abc',
|
||||||
|
2:'option2',
|
||||||
|
3:'2023/09/04',
|
||||||
|
4:'6666'
|
||||||
|
};
|
||||||
|
|
||||||
|
const cancel = async() =>{
|
||||||
|
drawerRight.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const save = async () =>{
|
||||||
|
|
||||||
|
jsonData.elements.forEach(property => {
|
||||||
|
if(jsonValue != undefined)
|
||||||
|
{
|
||||||
|
jsonValue[property.props.name] = property.props.modelValue;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(jsonValue);
|
||||||
|
drawerRight.value=false;
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -4,14 +4,18 @@ const routes: RouteRecordRaw[] = [
|
|||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
component: () => import('layouts/MainLayout.vue'),
|
component: () => import('layouts/MainLayout.vue'),
|
||||||
children: [{ path: '', component: () => import('pages/IndexPage.vue') }],
|
children: [
|
||||||
|
{ path: '', component: () => import('pages/IndexPage.vue') },
|
||||||
|
{ path: 'ruleEditor', component: () => import('pages/RuleEditor.vue') },
|
||||||
|
{ path: 'test', component: () => import('pages/testQursar.vue') },
|
||||||
|
{ path: 'flow', component: () => import('pages/testFlow.vue') },
|
||||||
|
{ path: 'flowchart', component: () => import('pages/FlowChartTest.vue') },
|
||||||
|
{ path: 'flowEditor', component: () => import('pages/FlowEditorPage.vue') },
|
||||||
|
{ path: 'flowEditor2', component: () => import('pages/FlowChart.vue') },
|
||||||
|
{ path: 'flowChart2', component: () => import('pages/FlowEditorPage2.vue') },
|
||||||
|
{ path: 'right', component: () => import('pages/testRight.vue') },
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: '/ruleEditor/',
|
|
||||||
component: () => import('layouts/MainLayout.vue'),
|
|
||||||
children: [{ path: '', component: () => import('pages/RuleEditor.vue') }],
|
|
||||||
},
|
|
||||||
|
|
||||||
// Always leave this as last one,
|
// Always leave this as last one,
|
||||||
// but you can also remove it
|
// but you can also remove it
|
||||||
{
|
{
|
||||||
|
|||||||
71
frontend/src/stores/flowEditor.ts
Normal file
71
frontend/src/stores/flowEditor.ts
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import { defineStore } from 'pinia';
|
||||||
|
import { AppInfo ,IActionFlow} from 'src/types/ActionTypes';
|
||||||
|
import { kintoneEvents,IKintoneEvent,KintoneEventManager } from 'src/types/KintoneEvents';
|
||||||
|
import {FlowCtrl } from '../control/flowctrl';
|
||||||
|
|
||||||
|
export interface FlowEditorState{
|
||||||
|
flowNames1:string;
|
||||||
|
appInfo?:AppInfo;
|
||||||
|
flows?:IActionFlow[];
|
||||||
|
selectedFlow?:IActionFlow|undefined;
|
||||||
|
eventTree:KintoneEventManager;
|
||||||
|
selectedEvent:IKintoneEvent|undefined;
|
||||||
|
}
|
||||||
|
const flowCtrl=new FlowCtrl();
|
||||||
|
export const useFlowEditorStore = defineStore("flowEditor",{
|
||||||
|
state: ():FlowEditorState => ({
|
||||||
|
flowNames1: '',
|
||||||
|
appInfo:undefined,
|
||||||
|
flows:[],
|
||||||
|
selectedFlow:undefined,
|
||||||
|
eventTree:kintoneEvents,
|
||||||
|
selectedEvent:undefined
|
||||||
|
}),
|
||||||
|
getters: {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns 現在編集しているフロー
|
||||||
|
*/
|
||||||
|
currentFlow():IActionFlow|undefined{
|
||||||
|
return this.selectedFlow;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* KintoneイベントIDから、バンドしているフローを検索する
|
||||||
|
* @param state
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
findFlowByEventId(state){
|
||||||
|
return (eventId:string)=>{
|
||||||
|
return state.flows?.find((flow)=>{
|
||||||
|
const root=flow.getRoot();
|
||||||
|
return root?.name===eventId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
setFlows(flows:IActionFlow[]){
|
||||||
|
this.flows=flows;
|
||||||
|
},
|
||||||
|
selectFlow(flow:IActionFlow){
|
||||||
|
this.selectedFlow=flow;
|
||||||
|
},
|
||||||
|
setApp(app:AppInfo){
|
||||||
|
this.appInfo=app;
|
||||||
|
},
|
||||||
|
async setFlow(){
|
||||||
|
if(this.appInfo===undefined) return;
|
||||||
|
const actionFlows = await flowCtrl.getFlows(this.appInfo?.appId);
|
||||||
|
//eventTreeにバンドする
|
||||||
|
this.eventTree.bindFlows(actionFlows);
|
||||||
|
if(actionFlows && actionFlows.length>0){
|
||||||
|
this.setFlows(actionFlows);
|
||||||
|
}
|
||||||
|
if(actionFlows && actionFlows.length==1){
|
||||||
|
this.selectFlow(actionFlows[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
32
frontend/src/stores/index.ts
Normal file
32
frontend/src/stores/index.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { store } from 'quasar/wrappers'
|
||||||
|
import { createPinia } from 'pinia'
|
||||||
|
import { Router } from 'vue-router';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When adding new properties to stores, you should also
|
||||||
|
* extend the `PiniaCustomProperties` interface.
|
||||||
|
* @see https://pinia.vuejs.org/core-concepts/plugins.html#typing-new-store-properties
|
||||||
|
*/
|
||||||
|
declare module 'pinia' {
|
||||||
|
export interface PiniaCustomProperties {
|
||||||
|
readonly router: Router;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If not building with SSR mode, you can
|
||||||
|
* directly export the Store instantiation;
|
||||||
|
*
|
||||||
|
* The function below can be async too; either use
|
||||||
|
* async/await or return a Promise which resolves
|
||||||
|
* with the Store instance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export default store((/* { ssrContext } */) => {
|
||||||
|
const pinia = createPinia()
|
||||||
|
|
||||||
|
// You can add Pinia plugins here
|
||||||
|
// pinia.use(SomePiniaPlugin)
|
||||||
|
|
||||||
|
return pinia
|
||||||
|
})
|
||||||
10
frontend/src/stores/store-flag.d.ts
vendored
Normal file
10
frontend/src/stores/store-flag.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
// THIS FEATURE-FLAG FILE IS AUTOGENERATED,
|
||||||
|
// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING
|
||||||
|
import "quasar/dist/types/feature-flag";
|
||||||
|
|
||||||
|
declare module "quasar/dist/types/feature-flag" {
|
||||||
|
interface QuasarFeatureFlags {
|
||||||
|
store: true;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
frontend/src/stores/testStore.ts
Normal file
19
frontend/src/stores/testStore.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import { defineStore } from 'pinia';
|
||||||
|
|
||||||
|
export const useCounterStore = defineStore('counter', {
|
||||||
|
state: () => ({
|
||||||
|
counter: 0
|
||||||
|
}),
|
||||||
|
|
||||||
|
getters: {
|
||||||
|
doubleCount (state) {
|
||||||
|
return state.counter * 2;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
increment () {
|
||||||
|
this.counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
408
frontend/src/types/ActionTypes.ts
Normal file
408
frontend/src/types/ActionTypes.ts
Normal file
@@ -0,0 +1,408 @@
|
|||||||
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
/**
|
||||||
|
* アプリ情報
|
||||||
|
*/
|
||||||
|
export interface AppInfo {
|
||||||
|
appId:string;
|
||||||
|
code?:string;
|
||||||
|
name:string;
|
||||||
|
description?:string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* アクションのプロパティ定義
|
||||||
|
*/
|
||||||
|
export interface IActionProperty {
|
||||||
|
component: string;
|
||||||
|
props: {
|
||||||
|
//プロパティ名
|
||||||
|
name: string;
|
||||||
|
//プロパティ表示名
|
||||||
|
displayName:string;
|
||||||
|
placeholder: string;
|
||||||
|
//プロパティ設定値
|
||||||
|
modelValue: any;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* アクションタイプ定義
|
||||||
|
*/
|
||||||
|
export interface IActionNode{
|
||||||
|
id:string;
|
||||||
|
//アクション名
|
||||||
|
name:string;
|
||||||
|
title:string;
|
||||||
|
subTitle:string;
|
||||||
|
inputPoint:string;
|
||||||
|
//出力ポイント(条件分岐以外未使用)
|
||||||
|
outputPoints:Array<string>;
|
||||||
|
//ルートアクション(Kintone event)
|
||||||
|
isRoot:boolean;
|
||||||
|
//アクションのプロパティ定義
|
||||||
|
actionProps:Array<IActionProperty>;
|
||||||
|
//アクションのプロパティ設定値抽出
|
||||||
|
ActionValue:object
|
||||||
|
prevNodeId?: string;
|
||||||
|
nextNodeIds: Map<string, string>;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* アクションフローの定義
|
||||||
|
*/
|
||||||
|
export interface IActionFlow {
|
||||||
|
id:string;
|
||||||
|
actionNodes:Array<IActionNode>;
|
||||||
|
getRoot():IActionNode|undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* アクションのプロパティ定義に基づいたクラス
|
||||||
|
*/
|
||||||
|
class ActionProperty implements IActionProperty {
|
||||||
|
component: string;
|
||||||
|
props: {
|
||||||
|
// プロパティ名
|
||||||
|
name: string;
|
||||||
|
// プロパティ表示名
|
||||||
|
displayName: string;
|
||||||
|
placeholder: string;
|
||||||
|
// プロパティ設定値
|
||||||
|
modelValue: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
static defaultProperty():IActionProperty{
|
||||||
|
return new ActionProperty('InputText','displayName','表示名','表示を入力してください','');
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
component: string,
|
||||||
|
name: string,
|
||||||
|
displayName: string,
|
||||||
|
placeholder: string,
|
||||||
|
modelValue: any
|
||||||
|
) {
|
||||||
|
this.component = component;
|
||||||
|
this.props = {
|
||||||
|
name: name,
|
||||||
|
displayName: displayName,
|
||||||
|
placeholder: placeholder,
|
||||||
|
modelValue: modelValue
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IActionNodeの実装、RootActionNode以外のアクション定義
|
||||||
|
*/
|
||||||
|
export class ActionNode implements IActionNode {
|
||||||
|
id:string;
|
||||||
|
name: string;
|
||||||
|
title:string;
|
||||||
|
get subTitle():string{
|
||||||
|
return this.name;
|
||||||
|
};
|
||||||
|
inputPoint:string;
|
||||||
|
//出力ポイント(条件分岐以外未使用)
|
||||||
|
outputPoints:Array<string>;
|
||||||
|
actionProps: Array<IActionProperty>;
|
||||||
|
get isRoot(): boolean{
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
get ActionValue():object{
|
||||||
|
const propValue:any={};
|
||||||
|
this.actionProps.forEach((value)=>{
|
||||||
|
propValue[value.props.name]=value.props.modelValue
|
||||||
|
});
|
||||||
|
return propValue;
|
||||||
|
};
|
||||||
|
prevNodeId?: string;
|
||||||
|
nextNodeIds: Map<string, string>;
|
||||||
|
constructor(
|
||||||
|
name: string,
|
||||||
|
title:string,
|
||||||
|
inputPoint:string,
|
||||||
|
outputPoint: Array<string> = [],
|
||||||
|
actionProps: Array<IActionProperty> =[ActionProperty.defaultProperty()],
|
||||||
|
) {
|
||||||
|
this.id=uuidv4();
|
||||||
|
this.name = name;
|
||||||
|
this.title=title;
|
||||||
|
this.inputPoint=inputPoint;
|
||||||
|
this.outputPoints = outputPoint;
|
||||||
|
const defProp =ActionProperty.defaultProperty();
|
||||||
|
defProp.props.displayName=title;
|
||||||
|
this.actionProps =actionProps;
|
||||||
|
const prop = this.actionProps.find((prop)=>prop.props.name===defProp.props.name);
|
||||||
|
if(prop===undefined){
|
||||||
|
this.actionProps.unshift(defProp);
|
||||||
|
}
|
||||||
|
this.nextNodeIds=new Map<string,string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ルートアクション定義
|
||||||
|
*/
|
||||||
|
export class RootAction implements IActionNode {
|
||||||
|
id:string;
|
||||||
|
name: string;
|
||||||
|
title:string;
|
||||||
|
subTitle:string;
|
||||||
|
inputPoint:string;
|
||||||
|
//出力ポイント(条件分岐以外未使用)
|
||||||
|
outputPoints:Array<string>;
|
||||||
|
isRoot: boolean;
|
||||||
|
actionProps: Array<IActionProperty>;
|
||||||
|
ActionValue:object;
|
||||||
|
prevNodeId?: string = undefined;
|
||||||
|
nextNodeIds: Map<string, string>;
|
||||||
|
constructor(
|
||||||
|
name: string,
|
||||||
|
title:string,
|
||||||
|
subTitle:string,
|
||||||
|
) {
|
||||||
|
this.id=uuidv4();
|
||||||
|
this.name = name;
|
||||||
|
this.title=title;
|
||||||
|
this.subTitle=subTitle;
|
||||||
|
this.inputPoint='';
|
||||||
|
this.outputPoints = [];
|
||||||
|
this.isRoot = true;
|
||||||
|
this.actionProps=[];
|
||||||
|
this.ActionValue={};
|
||||||
|
this.nextNodeIds=new Map<string,string>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* アクションフローの定義
|
||||||
|
*/
|
||||||
|
export class ActionFlow implements IActionFlow {
|
||||||
|
id:string;
|
||||||
|
actionNodes:Array<IActionNode>;
|
||||||
|
constructor(actionNodes:Array<IActionNode>|RootAction){
|
||||||
|
if(actionNodes instanceof Array){
|
||||||
|
this.actionNodes=actionNodes;
|
||||||
|
}else{
|
||||||
|
this.actionNodes=[actionNodes];
|
||||||
|
}
|
||||||
|
this.id=uuidv4();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ノードを追加する
|
||||||
|
* 1.ID採番する
|
||||||
|
* 2.前のノードを関連付け
|
||||||
|
* @param newNode 新規追加するノード
|
||||||
|
* @param prevNode 前のノード
|
||||||
|
* @param inputPoint 入力ポイント
|
||||||
|
* @returns 追加されたノード
|
||||||
|
*/
|
||||||
|
addNode(
|
||||||
|
newNode:IActionNode,
|
||||||
|
prevNode?:IActionNode,
|
||||||
|
inputPoint?:string):IActionNode
|
||||||
|
{
|
||||||
|
if(inputPoint!==undefined){
|
||||||
|
newNode.inputPoint=inputPoint;
|
||||||
|
}
|
||||||
|
if(prevNode!==undefined){
|
||||||
|
this.connectNodes(prevNode,newNode,inputPoint||'');
|
||||||
|
}else{
|
||||||
|
prevNode=this.actionNodes[this.actionNodes.length-1];
|
||||||
|
this.connectNodes(prevNode,newNode,inputPoint||'');
|
||||||
|
}
|
||||||
|
const index=this.actionNodes.findIndex(node=>node.id===prevNode?.id)
|
||||||
|
if(index>=0){
|
||||||
|
this.actionNodes.splice(index+1,0,newNode);
|
||||||
|
}else{
|
||||||
|
this.actionNodes.push(newNode);
|
||||||
|
}
|
||||||
|
return newNode;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ノードを削除する
|
||||||
|
* @param delNode
|
||||||
|
*/
|
||||||
|
removeNode(targetNode :IActionNode):boolean{
|
||||||
|
if (!targetNode ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(targetNode.isRoot){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.disconnectFromPrevNode(targetNode);
|
||||||
|
this.reconnectOrRemoveNextNodes(targetNode);
|
||||||
|
this.removeFromActionNodes(targetNode.id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/***
|
||||||
|
* 目標ノードの次のノードを全部削除する
|
||||||
|
*/
|
||||||
|
removeAllNext(targetNodeId :string){
|
||||||
|
if (!targetNodeId || targetNodeId==='') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const targetNode=this.findNodeById(targetNodeId);
|
||||||
|
if(!targetNode){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(targetNode.nextNodeIds.size==0){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (const [, id] of targetNode.nextNodeIds) {
|
||||||
|
this.removeAllNext(id);
|
||||||
|
this.removeFromActionNodes(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 断开与前一个节点的连接
|
||||||
|
disconnectFromPrevNode(targetNode: IActionNode): void {
|
||||||
|
const prevNodeId = targetNode.prevNodeId;
|
||||||
|
if (prevNodeId) {
|
||||||
|
const prevNode = this.findNodeById(prevNodeId);
|
||||||
|
if (prevNode) {
|
||||||
|
for (const [key, value] of prevNode.nextNodeIds) {
|
||||||
|
if (value === targetNode.id) {
|
||||||
|
prevNode.nextNodeIds.delete(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从 actionNodes 数组中移除节点
|
||||||
|
private removeFromActionNodes(targetNodeId: string): void {
|
||||||
|
const index = this.actionNodes.findIndex(node => node.id === targetNodeId);
|
||||||
|
if (index > -1) {
|
||||||
|
this.actionNodes.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ノード削除時、前のノードと次のノードを接続する
|
||||||
|
* @param targetNode
|
||||||
|
*/
|
||||||
|
reconnectOrRemoveNextNodes(targetNode: IActionNode): void {
|
||||||
|
if(!targetNode || !targetNode.prevNodeId ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//前のノードを取得
|
||||||
|
const prevNode = this.findNodeById(targetNode.prevNodeId);
|
||||||
|
if(!prevNode) return;
|
||||||
|
//次のノード取得
|
||||||
|
const nextNodeIds = targetNode.nextNodeIds;
|
||||||
|
if(nextNodeIds.size==0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//次のノード一つの場合
|
||||||
|
if(nextNodeIds.size==1){
|
||||||
|
const nextNodeId = nextNodeIds.get('');
|
||||||
|
if(!nextNodeId) return;
|
||||||
|
const nextNode = this.findNodeById(nextNodeId) ;
|
||||||
|
if(!nextNode) return;
|
||||||
|
nextNode.prevNodeId=prevNode.id;
|
||||||
|
prevNode.nextNodeIds.set(targetNode.inputPoint||'',nextNodeId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//二つ以上の場合
|
||||||
|
for(const [point,nextid] of nextNodeIds){
|
||||||
|
const nextNode = this.findNodeById(nextid);
|
||||||
|
if(!nextNode) return;
|
||||||
|
if(!this.connectNodes(prevNode,nextNode,point)){
|
||||||
|
this.removeAllNext(nextid);
|
||||||
|
this.removeFromActionNodes(nextid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 二つノードを接続する
|
||||||
|
* @param prevNode
|
||||||
|
* @param nextNodeId
|
||||||
|
* @param point
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
connectNodes(prevNode:IActionNode,nextNode:IActionNode,point:string):boolean{
|
||||||
|
if(!prevNode || !nextNode){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!nextNode) return false;
|
||||||
|
prevNode.nextNodeIds.set(point,nextNode.id);
|
||||||
|
nextNode.prevNodeId=prevNode.id;
|
||||||
|
nextNode.inputPoint=point;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
resetNodeRelation(prevNode: IActionNode, newNode: IActionNode, inputPoint?: string) {
|
||||||
|
// 设置新节点和前节点的关联
|
||||||
|
prevNode.nextNodeIds.set(inputPoint || '', newNode.id);
|
||||||
|
newNode.prevNodeId = prevNode.id;
|
||||||
|
// 保存前节点原有的后节点ID
|
||||||
|
const originalNextNodeId = prevNode.nextNodeIds.get(inputPoint || '');
|
||||||
|
this.setNewNodeNextId(newNode,originalNextNodeId,inputPoint);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 後ノードと新ノードの関連付け
|
||||||
|
* @param newNode
|
||||||
|
* @param originalNextNodeId
|
||||||
|
* @param inputPoint
|
||||||
|
*/
|
||||||
|
private setNewNodeNextId(newNode: IActionNode, originalNextNodeId: string | undefined, inputPoint?: string) {
|
||||||
|
// 如果原先的后节点存在
|
||||||
|
if (originalNextNodeId) {
|
||||||
|
// 检查新节点的 outputPoints 是否包含该 inputPoint
|
||||||
|
if (newNode.outputPoints.includes(inputPoint || '')) {
|
||||||
|
newNode.nextNodeIds.set(inputPoint || '', originalNextNodeId);
|
||||||
|
} else {
|
||||||
|
// 如果不包含,选择新节点的一个 outputPoint
|
||||||
|
const alternativeOutputPoint = newNode.outputPoints.length > 0 ? newNode.outputPoints[0] : '';
|
||||||
|
newNode.nextNodeIds.set(alternativeOutputPoint, originalNextNodeId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* IDでActionNodeを取得する
|
||||||
|
*/
|
||||||
|
findNodeById(id: string): IActionNode | undefined {
|
||||||
|
return this.actionNodes.find((node) => node.id === id);
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON() {
|
||||||
|
return {
|
||||||
|
id:this.id,
|
||||||
|
actionNodes: this.actionNodes.map(node => {
|
||||||
|
const { nextNodeIds, ...rest } = node;
|
||||||
|
return {
|
||||||
|
...rest,
|
||||||
|
nextNodeIds: Array.from(nextNodeIds.entries())
|
||||||
|
};
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getRoot():IActionNode|undefined{
|
||||||
|
return this.actionNodes.find(node=>node.isRoot)
|
||||||
|
}
|
||||||
|
|
||||||
|
static fromJSON(json: string): ActionFlow {
|
||||||
|
const parsedObject = JSON.parse(json);
|
||||||
|
|
||||||
|
const actionNodes = parsedObject.actionNodes.map((node: any) => {
|
||||||
|
const nodeClass = !node.isRoot? new ActionNode(node.name,node.title,node.inputPoint,node.outputPoint,node.actionProps)
|
||||||
|
:new RootAction(node.name,node.title,node.subTitle);
|
||||||
|
nodeClass.nextNodeIds=new Map(node.nextNodeIds);
|
||||||
|
nodeClass.prevNodeId=node.prevNodeId;
|
||||||
|
nodeClass.id=node.id;
|
||||||
|
return nodeClass;
|
||||||
|
});
|
||||||
|
const actionFlow = new ActionFlow(actionNodes);
|
||||||
|
actionFlow.id=parsedObject.id;
|
||||||
|
return actionFlow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
112
frontend/src/types/KintoneEvents.ts
Normal file
112
frontend/src/types/KintoneEvents.ts
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
import { publicDecrypt } from 'crypto';
|
||||||
|
import {IActionFlow} from './ActionTypes';
|
||||||
|
export interface TreeNode {
|
||||||
|
label: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IKintoneEvent extends TreeNode {
|
||||||
|
eventId: string;
|
||||||
|
hasFlow: boolean;
|
||||||
|
flowData?: IActionFlow;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IKintoneScreen extends TreeNode {
|
||||||
|
label: string;
|
||||||
|
events: IKintoneEvent[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class kintoneEvent implements IKintoneEvent{
|
||||||
|
eventId: string;
|
||||||
|
get hasFlow(): boolean{
|
||||||
|
return this.flowData!==undefined && this.flowData.actionNodes.length>1
|
||||||
|
};
|
||||||
|
flowData?: IActionFlow | undefined;
|
||||||
|
label: string;
|
||||||
|
constructor({eventId,label}:{eventId:string,label:string}){
|
||||||
|
this.eventId=eventId;
|
||||||
|
this.label=label;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export class KintoneEventManager {
|
||||||
|
public screens: IKintoneScreen[];
|
||||||
|
|
||||||
|
constructor(screens: IKintoneScreen[]) {
|
||||||
|
this.screens = screens;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bindFlows(flows:IActionFlow[]){
|
||||||
|
for (const screen of this.screens) {
|
||||||
|
screen.events.forEach((ev)=>ev.flowData=undefined);
|
||||||
|
}
|
||||||
|
for (const flow of flows){
|
||||||
|
const eventId =flow.getRoot()?.name;
|
||||||
|
if(eventId!==undefined){
|
||||||
|
const event = this.findEventById(eventId);
|
||||||
|
if(event!==null){
|
||||||
|
event.flowData=flow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public findEventById(eventId: string): IKintoneEvent | null {
|
||||||
|
for (const screen of this.screens) {
|
||||||
|
for (const event of screen.events) {
|
||||||
|
if (event.eventId === eventId) {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public findScreen(eventId:string):IKintoneScreen|null{
|
||||||
|
for (const screen of this.screens) {
|
||||||
|
if(screen.events.some((ev:IKintoneEvent)=>ev.eventId===eventId)){
|
||||||
|
return screen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const kintoneEvents:KintoneEventManager = new KintoneEventManager([
|
||||||
|
{
|
||||||
|
label:"レコード追加画面",
|
||||||
|
events:[
|
||||||
|
new kintoneEvent({label:"レコード追加画面を表示した後",eventId:"app.record.create.show"}),
|
||||||
|
new kintoneEvent({label:"保存をクリックしたとき",eventId:"app.record.create.submit"}),
|
||||||
|
new kintoneEvent({label:"保存が成功したとき",eventId:"app.record.create.submit.success"}),
|
||||||
|
new kintoneEvent({label:"フィールドの値を変更したとき",eventId:"app.record.create.change"}),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label:"レコード詳細画面",
|
||||||
|
events:[
|
||||||
|
new kintoneEvent({label:"レコード詳細画面を表示した後",eventId:"app.record.detail.show"}),
|
||||||
|
new kintoneEvent({label:"レコードを削除するとき",eventId:"app.record.detail.delete.submit"}),
|
||||||
|
new kintoneEvent({label:"プロセス管理のアクションを実行したとき",eventId:"app.record.detail.process.proceed"}),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label:"レコード編集画面",
|
||||||
|
events:[new kintoneEvent({label:"レコード編集画面を表示した後",eventId:"app.record.edit.show"}),
|
||||||
|
new kintoneEvent({label:"保存をクリックしたとき",eventId:"app.record.edit.submit"}),
|
||||||
|
new kintoneEvent({label:"保存が成功したとき",eventId:"app.record.edit.submit.success"}),
|
||||||
|
new kintoneEvent({label:"フィールドの値を変更したとき",eventId:"app.record.edit.change"}),
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label:"レコード一覧画面",
|
||||||
|
events:[
|
||||||
|
new kintoneEvent({label:"一覧画面を表示した後", eventId:"app.record.index.show"}),
|
||||||
|
new kintoneEvent({label:"インライン編集を開始したとき",eventId:"app.record.index.edit.show"}),
|
||||||
|
new kintoneEvent({label:"インライン編集のフィールド値を変更したとき", eventId:"app.record.index.edit.change"}),
|
||||||
|
new kintoneEvent({label:"インライン編集の【保存】をクリックしたとき",eventId:"app.record.index.edit.submit"}),
|
||||||
|
new kintoneEvent({label:"インライン編集の保存が成功したとき", eventId:"app.record.index.edit.submit.success"}),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
||||||
1075
frontend/vue3.0概要.md
Normal file
1075
frontend/vue3.0概要.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -278,6 +278,11 @@
|
|||||||
"@types/mime" "*"
|
"@types/mime" "*"
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/uuid@^9.0.3":
|
||||||
|
version "9.0.3"
|
||||||
|
resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.3.tgz"
|
||||||
|
integrity sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@^5.10.0":
|
"@typescript-eslint/eslint-plugin@^5.10.0":
|
||||||
version "5.61.0"
|
version "5.61.0"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz"
|
||||||
@@ -2144,6 +2149,14 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
|
|||||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||||
|
|
||||||
|
pinia@^2.0.0, pinia@^2.1.6:
|
||||||
|
version "2.1.6"
|
||||||
|
resolved "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz"
|
||||||
|
integrity sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==
|
||||||
|
dependencies:
|
||||||
|
"@vue/devtools-api" "^6.5.0"
|
||||||
|
vue-demi ">=0.14.5"
|
||||||
|
|
||||||
postcss-selector-parser@^6.0.9:
|
postcss-selector-parser@^6.0.9:
|
||||||
version "6.0.13"
|
version "6.0.13"
|
||||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
|
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
|
||||||
@@ -2657,7 +2670,7 @@ type-is@~1.6.18:
|
|||||||
media-typer "0.3.0"
|
media-typer "0.3.0"
|
||||||
mime-types "~2.1.24"
|
mime-types "~2.1.24"
|
||||||
|
|
||||||
typescript@^4.5.4, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta":
|
typescript@^4.5.4, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.4.4:
|
||||||
version "4.9.5"
|
version "4.9.5"
|
||||||
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
|
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
|
||||||
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
|
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
|
||||||
@@ -2707,6 +2720,11 @@ utils-merge@1.0.1:
|
|||||||
resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
|
resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
|
||||||
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
|
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
|
||||||
|
|
||||||
|
uuid@^9.0.0:
|
||||||
|
version "9.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz"
|
||||||
|
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
|
||||||
|
|
||||||
vary@~1.1.2:
|
vary@~1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
|
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
|
||||||
@@ -2724,6 +2742,11 @@ vary@~1.1.2:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
|
vue-demi@>=0.14.5:
|
||||||
|
version "0.14.6"
|
||||||
|
resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
|
||||||
|
integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
|
||||||
|
|
||||||
vue-eslint-parser@^9.3.0:
|
vue-eslint-parser@^9.3.0:
|
||||||
version "9.3.1"
|
version "9.3.1"
|
||||||
resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz"
|
resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz"
|
||||||
@@ -2744,7 +2767,7 @@ vue-router@^4.0.0, vue-router@^4.0.12:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@vue/devtools-api" "^6.5.0"
|
"@vue/devtools-api" "^6.5.0"
|
||||||
|
|
||||||
vue@^3.0.0, vue@^3.2.0, vue@^3.2.25, vue@^3.2.29, vue@3.3.4:
|
"vue@^2.6.14 || ^3.3.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.29, vue@3.3.4:
|
||||||
version "3.3.4"
|
version "3.3.4"
|
||||||
resolved "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz"
|
resolved "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz"
|
||||||
integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==
|
integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==
|
||||||
|
|||||||
138
sample.json
Normal file
138
sample.json
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
{
|
||||||
|
"id": "681ecde3-4439-4210-9fdf-424c6af98f09",
|
||||||
|
"actionNodes": [
|
||||||
|
{
|
||||||
|
"id": "34dfd32e-ba1a-440f-bb46-a8a1999109cd",
|
||||||
|
"name": "app.record.create.submit",
|
||||||
|
"title": "レコード追加画面",
|
||||||
|
"subTitle": "保存するとき",
|
||||||
|
"inputPoint": "",
|
||||||
|
"outputPoints": [],
|
||||||
|
"isRoot": true,
|
||||||
|
"actionProps": [],
|
||||||
|
"ActionValue": {},
|
||||||
|
"nextNodeIds": [
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"ce07775d-9729-4516-a88c-78ee8f2f851e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ce07775d-9729-4516-a88c-78ee8f2f851e",
|
||||||
|
"name": "自動採番",
|
||||||
|
"title": "文書番号を自動採番する",
|
||||||
|
"inputPoint": "",
|
||||||
|
"outputPoints": [],
|
||||||
|
"actionProps": [
|
||||||
|
{
|
||||||
|
"component": "InputText",
|
||||||
|
"props": {
|
||||||
|
"name": "displayName",
|
||||||
|
"displayName": "文書番号を自動採番する",
|
||||||
|
"placeholder": "表示を入力してください",
|
||||||
|
"modelValue": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component": "InputText",
|
||||||
|
"props": {
|
||||||
|
"displayName": "フォーマット",
|
||||||
|
"modelValue": "",
|
||||||
|
"name": "format",
|
||||||
|
"placeholder": "フォーマットを入力してください"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component": "FieldInput",
|
||||||
|
"props": {
|
||||||
|
"displayName": "採番項目",
|
||||||
|
"modelValue": "",
|
||||||
|
"name": "field",
|
||||||
|
"placeholder": "採番項目を選択してください"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prevNodeId": "34dfd32e-ba1a-440f-bb46-a8a1999109cd",
|
||||||
|
"nextNodeIds": [
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"0d18c3c9-abee-44e5-83eb-82074316219b"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0d18c3c9-abee-44e5-83eb-82074316219b",
|
||||||
|
"name": "入力データ取得",
|
||||||
|
"title": "電話番号を取得する",
|
||||||
|
"inputPoint": "",
|
||||||
|
"outputPoints": [],
|
||||||
|
"actionProps": [
|
||||||
|
{
|
||||||
|
"component": "InputText",
|
||||||
|
"props": {
|
||||||
|
"name": "displayName",
|
||||||
|
"displayName": "表示名",
|
||||||
|
"placeholder": "表示を入力してください",
|
||||||
|
"modelValue": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prevNodeId": "ce07775d-9729-4516-a88c-78ee8f2f851e",
|
||||||
|
"nextNodeIds": [
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"399d7c04-5345-4bf6-8da3-d745df554524"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "399d7c04-5345-4bf6-8da3-d745df554524",
|
||||||
|
"name": "条件分岐",
|
||||||
|
"title": "電話番号入力形式チャック",
|
||||||
|
"inputPoint": "",
|
||||||
|
"outputPoints": [
|
||||||
|
"はい",
|
||||||
|
"いいえ"
|
||||||
|
],
|
||||||
|
"actionProps": [
|
||||||
|
{
|
||||||
|
"component": "InputText",
|
||||||
|
"props": {
|
||||||
|
"name": "displayName",
|
||||||
|
"displayName": "表示名",
|
||||||
|
"placeholder": "表示を入力してください",
|
||||||
|
"modelValue": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prevNodeId": "0d18c3c9-abee-44e5-83eb-82074316219b",
|
||||||
|
"nextNodeIds": [
|
||||||
|
[
|
||||||
|
"いいえ",
|
||||||
|
"8173e6bc-3fa2-4403-b973-9368884e2dfa"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8173e6bc-3fa2-4403-b973-9368884e2dfa",
|
||||||
|
"name": "エラー表示",
|
||||||
|
"title": "エラー表示して保存しない",
|
||||||
|
"inputPoint": "いいえ",
|
||||||
|
"outputPoints": [],
|
||||||
|
"actionProps": [
|
||||||
|
{
|
||||||
|
"component": "InputText",
|
||||||
|
"props": {
|
||||||
|
"name": "displayName",
|
||||||
|
"displayName": "表示名",
|
||||||
|
"placeholder": "表示を入力してください",
|
||||||
|
"modelValue": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prevNodeId": "399d7c04-5345-4bf6-8da3-d745df554524",
|
||||||
|
"nextNodeIds": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user