diff --git a/backend/app/api/api_v1/routers/kintone.py b/backend/app/api/api_v1/routers/kintone.py
index 0b595ae..eb8ee5e 100644
--- a/backend/app/api/api_v1/routers/kintone.py
+++ b/backend/app/api/api_v1/routers/kintone.py
@@ -217,7 +217,9 @@ def deoployappfromkintone(app:str,revision:str,c:config.KINTONE_ENV):
data = {"apps":[{"app":app,"revision":revision}],"revert": False}
r = httpx.post(url,headers=headers,data=json.dumps(data))
return r.json
-
+
+# 既定項目に含めるアプリのフィールドのみ取得する
+# スペース、枠線、ラベルを含まない
def getfieldsfromkintone(app:str,c:config.KINTONE_ENV):
headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
params = {"app":app}
@@ -225,6 +227,44 @@ def getfieldsfromkintone(app:str,c:config.KINTONE_ENV):
r = httpx.get(url,headers=headers,params=params)
return r.json()
+# フォームに配置するフィールドのみ取得する
+# スペース、枠線、ラベルも含める
+def getformfromkintone(app:str,c:config.KINTONE_ENV):
+ headers={config.API_V1_AUTH_KEY:c.API_V1_AUTH_VALUE}
+ params = {"app":app}
+ url = f"{c.BASE_URL}{config.API_V1_STR}/form.json"
+ r = httpx.get(url,headers=headers,params=params)
+ return r.json()
+
+
+def merge_kintone_fields(fields_response: dict, form_response: dict) -> dict:
+ fields_properties = fields_response.get('properties', {})
+ form_properties = form_response.get('properties', [])
+
+ merged_properties = {k: v for k, v in fields_properties.items()}
+
+ for index, form_field in enumerate(form_properties):
+ code = form_field.get('code')
+ if code:
+ if code and code not in merged_properties:
+ merged_properties[code] = form_field
+ else:
+ element_id = form_field.get('elementId')
+ if element_id:
+ key = element_id
+ form_field['code']=element_id
+ form_field['label']=form_field.get('type')
+ # else:
+ # key = f"{form_field.get('type')}_{index}"
+ merged_properties[key] = form_field
+
+ merged_response = {
+ 'revision': fields_response.get('revision', ''),
+ 'properties': merged_properties
+ }
+
+ return merged_response
+
def analysefields(excel,kintone):
updatefields={}
addfields={}
@@ -482,6 +522,15 @@ async def appfields(request:Request,app:str,env = Depends(getkintoneenv)):
except Exception as e:
raise APIException('kintone:appfields',request.url._url, f"Error occurred while get app fileds({env.DOMAIN_NAM}->{app}):",e)
+@r.get("/allfields")
+async def allfields(request:Request,app:str,env = Depends(getkintoneenv)):
+ try:
+ field_resp = getfieldsfromkintone(app,env)
+ form_resp = getformfromkintone(app,env)
+ return merge_kintone_fields(field_resp,form_resp)
+ except Exception as e:
+ raise APIException('kintone:allfields',request.url._url, f"Error occurred while get form fileds({env.DOMAIN_NAM}->{app}):",e)
+
@r.get("/appprocess")
async def appprocess(request:Request,app:str,env = Depends(getkintoneenv)):
try:
diff --git a/backend/readme.md b/backend/readme.md
index d487559..ed1a2ce 100644
--- a/backend/readme.md
+++ b/backend/readme.md
@@ -24,4 +24,8 @@ python -m venv env
```bash
pip install -r requirements.txt
- ```
\ No newline at end of file
+ ```
+4. backend 起動
+ ```bash
+ uvicorn app.main:app --reload
+ ```
diff --git a/frontend/index.html b/frontend/index.html
index 43d25b2..b50159a 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -2,7 +2,6 @@
<%= productName %>
-
diff --git a/frontend/package.json b/frontend/package.json
index 5016fbf..3343684 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -17,8 +17,9 @@
},
"dependencies": {
"@quasar/extras": "^1.16.4",
+ "@vueuse/core": "^10.9.0",
"axios": "^1.4.0",
- "pinia": "^2.1.6",
+ "pinia": "^2.1.7",
"quasar": "^2.6.0",
"uuid": "^9.0.0",
"vue": "^3.0.0",
diff --git a/frontend/src/boot/error-handler.ts b/frontend/src/boot/error-handler.ts
index 57253da..93be80b 100644
--- a/frontend/src/boot/error-handler.ts
+++ b/frontend/src/boot/error-handler.ts
@@ -4,6 +4,7 @@ import { Router } from 'vue-router';
import { App } from 'vue';
export default boot(({ app, router }: { app: App; router: Router }) => {
+ document.documentElement.lang="ja-JP";
app.config.errorHandler = (err: any, instance: any, info: string) => {
if (err.response && err.response.status === 401) {
// 認証エラーの場合再ログインする
diff --git a/frontend/src/components/ConditionEditor/ConditionEditor.vue b/frontend/src/components/ConditionEditor/ConditionEditor.vue
index ef47543..eef9401 100644
--- a/frontend/src/components/ConditionEditor/ConditionEditor.vue
+++ b/frontend/src/components/ConditionEditor/ConditionEditor.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/frontend/src/components/ConditionEditor/ConditionObject.vue b/frontend/src/components/ConditionEditor/ConditionObject.vue
index aa22dfa..2097f5a 100644
--- a/frontend/src/components/ConditionEditor/ConditionObject.vue
+++ b/frontend/src/components/ConditionEditor/ConditionObject.vue
@@ -6,21 +6,21 @@
{{ selectedObject.name }}
- {{ selectedObject.name }}
+ {{ selectedObject.name.name }}
-
+
-
+
@@ -88,9 +88,9 @@
.condition-object{
min-width: 200px;
max-height: 40px;
- padding: 2px;
+ margin: 0 2px;
}
.selected-obj{
- margin: 0px;
+ margin: 0 2px;
}
diff --git a/frontend/src/components/ConditionEditor/NodeCondition.vue b/frontend/src/components/ConditionEditor/NodeCondition.vue
index c684992..943fdab 100644
--- a/frontend/src/components/ConditionEditor/NodeCondition.vue
+++ b/frontend/src/components/ConditionEditor/NodeCondition.vue
@@ -66,7 +66,7 @@
-
+
-
+
@@ -30,7 +30,7 @@
-
diff --git a/frontend/src/components/main/NodeItem.vue b/frontend/src/components/main/NodeItem.vue
index 6474a18..0e4cb8b 100644
--- a/frontend/src/components/main/NodeItem.vue
+++ b/frontend/src/components/main/NodeItem.vue
@@ -205,7 +205,7 @@ export default defineComponent({
*/
const varName =(node:IActionNode)=>{
const prop = node.actionProps.find((prop) => prop.props.name === "verName");
- return prop?.props.modelValue;
+ return prop?.props.modelValue.name;
};
const copyFlow=()=>{
context.emit('copyFlow', props.actionNode);
diff --git a/frontend/src/components/right/AppFieldSelect.vue b/frontend/src/components/right/AppFieldSelect.vue
index 3c16c73..53760f0 100644
--- a/frontend/src/components/right/AppFieldSelect.vue
+++ b/frontend/src/components/right/AppFieldSelect.vue
@@ -23,9 +23,9 @@
-
- {{ item.label }}
-
+
+ {{ item.label }}
+
@@ -81,8 +81,8 @@
-
+
@@ -99,9 +99,7 @@
-
-
+
@@ -128,7 +126,7 @@ interface IAppFields{
export default defineComponent({
inheritAttrs:false,
- name: 'FieldInput',
+ name: 'AppFieldSelect',
components: {
ShowDialog,
FieldSelect,
@@ -154,6 +152,10 @@ export default defineComponent({
selectType:{
type:String,
default:'single'
+ },
+ fieldTypes:{
+ type:Array,
+ default:()=>[]
}
},
setup(props, { emit }) {
@@ -197,13 +199,6 @@ export default defineComponent({
selectedField.value.fields = fieldDlg.value.selected;
}
};
- const updateExternalSelectAppInfo = (newAppinfo:IApp) => {
- // selectedField.value.app = newAppinfo
- }
-
- const updateItems = (newFields:IField[]) => {
- // selectedField.value.fields = newFields
- }
const removeField=(index:number)=>{
selectedField.value.fields.splice(index,1);
@@ -223,9 +218,7 @@ export default defineComponent({
selectedField,
showSelectApp,
isSelected,
- updateExternalSelectAppInfo,
filter: ref(),
- updateItems,
clear,
fieldFilter: ref(),
removeField
diff --git a/frontend/src/components/right/ConditionInput.vue b/frontend/src/components/right/ConditionInput.vue
index 2b5d552..966339a 100644
--- a/frontend/src/components/right/ConditionInput.vue
+++ b/frontend/src/components/right/ConditionInput.vue
@@ -1,12 +1,12 @@
-
-
+
+
- クリックで設定:{{ isSetted?'設定済み':'未設定' }}
+ クリックで設定:{{ isSetted ? '設定済み' : '未設定' }}
-
+
{{ placeholder }}
{{ conditionString }}
@@ -17,82 +17,118 @@
-
+ }
+};
+
+
+export default defineComponent({
+ name: 'FieldInput',
+ inheritAttrs: false,
+ components: {
+ ConditionEditor
+ },
+ props: {
+ context: {
+ type: Array,
+ default: '',
+ },
+ displayName: {
+ type: String,
+ default: '',
+ },
+ name: {
+ type: String,
+ default: '',
+ },
+ placeholder: {
+ type: String,
+ default: '',
+ },
+ hint: {
+ type: String,
+ default: '',
+ },
+ modelValue: {
+ type: String,
+ default: null
+ },
+ sourceType: {
+ type: String,
+ default: 'field'
+ }
+ },
+
+ setup(props, { emit }) {
+ const source = props.context.find(element => element?.props?.name === 'sources')
+
+ if (source) {
+ if(props.sourceType === 'field'){
+ provide('sourceFields', computed( () => source.props?.modelValue?.fields ?? []));
+ } else if(props.sourceType === 'app'){
+ console.log('sourceApp', source.props?.modelValue);
+ provide('sourceApp', computed( () => source.props?.modelValue?.app?.id));
+ }
+ }
+
+ const appDg = ref();
+ const show = ref(false);
+ const tree = reactive(new ConditionTree());
+ if (props.modelValue && props.modelValue !== '') {
+ tree.fromJson(props.modelValue);
+ } else {
+ const newNode = new ConditionNode({}, Operator.Equal, '', tree.root);
+ tree.addNode(tree.root, newNode);
+ }
+
+ const isSetted = ref(props.modelValue && props.modelValue !== '');
+
+ const conditionString = computed(() => {
+ return tree.buildConditionString(tree.root);
+ });
+
+ const showDg = () => {
+ show.value = true;
+ };
+
+ const onClosed = (val: string) => {
+ if (val == 'OK') {
+ const conditionJson = tree.toJson();
+ isSetted.value = true;
+ emit('update:modelValue', conditionJson);
+ }
+ };
+
+ watchEffect(() => {
+ const conditionJson = tree.toJson();
+ emit('update:modelValue', conditionJson);
+ });
+
+ return {
+ appDg,
+ isSetted,
+ show,
+ showDg,
+ onClosed,
+ tree,
+ conditionString
+ };
+ }
+});
+
diff --git a/frontend/src/components/right/DataProcessing.vue b/frontend/src/components/right/DataProcessing.vue
new file mode 100644
index 0000000..9aa554b
--- /dev/null
+++ b/frontend/src/components/right/DataProcessing.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+ { dgIsShow = true }">クリックで設定
+
+
+
+ {{ placeholder }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ deleteProcessingObject(index)" />
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/right/EventSetter.vue b/frontend/src/components/right/EventSetter.vue
index 54303dd..25a90d5 100644
--- a/frontend/src/components/right/EventSetter.vue
+++ b/frontend/src/components/right/EventSetter.vue
@@ -61,12 +61,12 @@ export default defineComponent({
if(store.eventTree.findEventById(addEventId)){
return;
}
- customEvents.events.push(
- new kintoneEvent(
- displayName,
- addEventId,
- customButtonId)
- );
+ customEvents.events.push({
+ eventId: addEventId,
+ label: displayName,
+ parentId: customButtonId,
+ header: 'DELETABLE'
+ });
}
}
diff --git a/frontend/src/components/right/FieldInput.vue b/frontend/src/components/right/FieldInput.vue
index b21357f..88e84c1 100644
--- a/frontend/src/components/right/FieldInput.vue
+++ b/frontend/src/components/right/FieldInput.vue
@@ -7,9 +7,6 @@
{{ selectedField.name }}
-
{{ placeholder }}
@@ -19,7 +16,7 @@
-
+
@@ -54,6 +51,14 @@ export default defineComponent({
type: String,
default: '',
},
+ selectType:{
+ type:String,
+ default:'single'
+ },
+ fieldTypes:{
+ type:Array,
+ default:()=>[]
+ },
hint: {
type: String,
default: '',
diff --git a/frontend/src/components/right/InputText.vue b/frontend/src/components/right/InputText.vue
index a14e06d..cb6ee83 100644
--- a/frontend/src/components/right/InputText.vue
+++ b/frontend/src/components/right/InputText.vue
@@ -1,10 +1,7 @@
-
+
@@ -18,7 +15,7 @@