Files
KintoneAppBuilder/plugin/kintone-addins/src/actions/string-join.ts

211 lines
11 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { actionAddins } from ".";
import { IField, IAction,IActionResult, IActionNode, IActionProperty } from "../types/ActionTypes";
import { Formatter } from "../util/format";
//右UI画面propertyのname:型:
interface IStringJoinProps{
//保存先フィールド
saveField:IField;
//結合元フィールド1
joinField1:IField;
//結合元フィールド2
joinField2:IField;
//区切り文字
delimiter:string;
}
//IActionインタフェースを実装する新しいクラスActionを作成
export class StringJoinAction implements IAction{
name: string;
//importから導入顕示定義
actionProps: IActionProperty[];
//上方のinterface Propsから、props受ける属性を定義
props:IStringJoinProps;
//関数定義に必要な類名を構築:
constructor(){
//pgAdminDBに登録したアクション名(name/subtitle)一致する必要がある:
this.name="文字結合";
this.actionProps=[];
this.register();
//プロパティ属性初期化:
this.props={
saveField:{code:''},
joinField1:{code:''},
joinField2:{code:''},
delimiter:''
}
//リセット上記登録表:
this.register();
}
/**
* アクションの処理を実装する
* @param actionNode アクションノード
* @param event Kintoneのイベント
* @param context コンテキスト(レコード、変数情報を持っている)
* @returns
*/
//非同期処理ある関数下のある属性:
async process(actionNode:IActionNode,event:any):Promise<IActionResult> {
let result={
//後継処理不可:
canNext:false,
result:false
};
try{
//属性設定を取得する:
this.actionProps=actionNode.actionProps;
//プロパティ設定のデータ型は必要な情報含めますか全部不存在時return:
if (!('saveField' in actionNode.ActionValue) && !('joinField1' in actionNode.ActionValue) && !('joinField2' in actionNode.ActionValue)) {
return result
}
//既定のプロパティのインタフェースへ変換:
this.props = actionNode.ActionValue as IStringJoinProps;
const record = event.record;
//kintoneフィールドタイプ取得
const joinField1type=this.props.joinField1.type;
const joinField2type=this.props.joinField2.type;
const saveFieldtype=this.props.saveField.type;
//////////////////////////////////////////////////////////////////////////////////////////////////////
// //保存先フィールドは文字列フィールドではない場合、エラー発生:
if(!(saveFieldtype==='SINGLE_LINE_TEXT'||saveFieldtype==='MULTI_LINE_TEXT'||saveFieldtype==='RICH_TEXT')){
event.error='[エラーメッセージ]:結合保存先対応不可。結合しません';
if (event.type.includes('success')){
window.alert("[windows alert]"+event.error);
}
result = {
canNext: false,
result: false
}
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////
//値取得方法定義:
function getValue(value:string,type:string|undefined,fieldCode:string,event:any){
if(event.record[fieldCode]?.value===undefined||event.record[fieldCode]?.value===null){
event.record[fieldCode].value='';
}
//作成者、更新者:
if(type==='CREATOR'||type==='MODIFIER'){
value = event.record[fieldCode]?.value.name;
//日時、作成日時、更新日時:
}else if(type==='DATETIME'||type==='CREATED_TIME'||type==='UPDATED_TIME'){
if(event.record[fieldCode]?.value!==undefined && event.record[fieldCode]?.value!==''){
value = Formatter.dateFormat(new Date(event.record[fieldCode]?.value),'yyyy-MM-dd HH:mm');
}else{
value=event.record[fieldCode]?.value;
}
//ユーザ選択、組織選択、グループ選択、添付ファイル名、作業者、カテゴリー:
}else if(type==='USER_SELECT'||type==='ORGANIZATION_SELECT'||type==='GROUP_SELECT'||type==='FILE'||type==='STATUS_ASSIGNEE'){
if(event.record[fieldCode]?.value===undefined || event.record[fieldCode]?.value===''){
value = event.record[fieldCode]?.value;
}else{
const mototext=event.record[fieldCode]?.value;
let arr=[];
for(let i=0;i<mototext.length;i++){
arr.push(mototext[i].name);
}
//配列要素を,で連結して文字列を作成:
value=arr.join();
}
//カテゴリー、チェックボックス、複数選択:
}else if(type==='CATEGORY'||type==='CHECK_BOX'||type==='MULTI_SELECT'){
if(event.record[fieldCode]?.value===undefined || event.record[fieldCode]?.value===''){
value = event.record[fieldCode]?.value;
}else{
const mototext=event.record[fieldCode]?.value;
let arr=[];
for(let i=0;i<mototext.length;i++){
arr.push(mototext[i]);
}
//配列要素を,で連結して文字列を作成:
value=arr.join();
}
//詳細画面プロセス実行後のステータス:
}else if(type==='STATUS'&&event.type.includes('process')){
value = event.nextStatus.value;
}else{
value = event.record[fieldCode]?.value;
}
if (value===undefined || value===null){
value='';
}
return value;
}
//////////////////////////////////////////////////////////////////////
//値取得方法呼出:
let joinValue1:string='';
joinValue1=getValue(joinValue1,joinField1type,this.props.joinField1.code,event);
/////////////////////////////////////////////////////////////////////////////////////
let joinValue2:string='';
joinValue2=getValue(joinValue2,joinField2type,this.props.joinField2.code,event);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
const conString = this.props.delimiter;
let saveValue:string='';
//前後結合元が空白なら区切り文字も空白にする(例:1-8の8無いなら1。1-8の1無いなら8。1空白8の8無いなら1。結合元全部空白なら全部空白):
if(joinValue1===''&&joinValue2===''){
saveValue='';
}else if(joinValue1===''&&joinValue2!==''){
saveValue=joinValue2;
}else if(joinValue2===''&&joinValue1!==''){
saveValue=joinValue1;
}else if(joinValue1!==''&&joinValue2!==''){
saveValue=`${joinValue1}${conString}${joinValue2}`
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//新規/更新/一覧保存成功後の以外のeventでPUT使用しない
if (!event.type.includes('success')){
//保存先フィールドに値セット:
record[this.props.saveField.code].value=saveValue;
window.alert("文字結合行いました。"+this.props.joinField1.name+":"+joinValue1+","+this.props.joinField2.name+":"+joinValue2+"。");
}else{
const params={
"app":event.appId,
"id":event.recordId,
"record":{[this.props.saveField.code]:{"value":saveValue}}
};
return await kintone.api(kintone.api.url('/k/v1/record',true),'PUT',params).then((resp) => {
//kintone保存先フィールド存在確認
record[this.props.saveField.code].value=saveValue;
if (event.type.includes('index')){
window.alert("文字結合行いました。"+this.props.joinField1.name+":"+joinValue1+","+this.props.joinField2.name+":"+joinValue2+"。一覧画面更新成功後自動リロードしません。必要に応じて手動リロードください。");
}else{
window.alert("文字結合行いました。"+this.props.joinField1.name+":"+joinValue1+","+this.props.joinField2.name+":"+joinValue2+"。");
}
//一覧画面更新成功後リロード:
// if (event.type.includes('index')){
// event.url = location.href.endsWith('/') || location.href.endsWith('&') ?
// location.href.slice(0, -1) :
// location.href + (location.href.includes('?') ? '&' : '/');
// }
}).catch((error) => {
event.error = 'エラーが発生しました。結合しません。システム管理者へお問合せください';
window.alert(event.error+"error message"+error);
return event;
});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
result= {
canNext:true,
result:true
}
return result;
}catch(error){;
if (event.type.includes('success')){
window.alert("[windows alert]処理中異常が発生しました。結合しません。システム担当者へお問合せください。errorメッセージ"+error)
}
event.error="[エラーメッセージ]処理中異常が発生しました。結合しません。システム担当者へお問合せください。errorメッセージ"+error;
return {
canNext:false,
result:false
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
register(): void {
actionAddins[this.name]=this;
}
}
new StringJoinAction();