タイトルの件で上手くいかず困っています。
ステータス毎にテーブルの一部の列を入力できないよう制御しようとしており、以下リンクを参考にドロップダウンをステータスに書き換えて実装しているのですが2点どのようにしてよいか分かりません。初歩的な事だと思いますが、js初心者の為お分かりになる方いらっしゃればご教示いただければ嬉しいです。
【参考リンク】https://developer.cybozu.io/hc/ja/community/posts/360042672011/comments/360004835652
1点目:以下のコードで実装した時に、保存した後に再度編集画面を表示するとうまく制御できているのですが、新規レコード作成時から列を制御したい。
2点目:ステータスが1つであれば制御できますが、次のステータスをまわす際のコードの書き方が分かりません。
=====
ステータスのコードが「下書き」
サブテーブルのフィールドコードが「Table」
サブテーブル内の入力不可フィールドのコードが「支払日」、「支払方法」、「実績金額」
という仮定で書き替えました。
=====
(function() {
“use strict”;
kintone.events.on([
‘app.record.create.show’,
‘app.record.edit.show’,
‘app.record.create.change.Table’,
‘app.record.edit.change.Table’,
‘app.record.create.change.ステータス’,
‘app.record.edit.change.ステータス’,
], function(event){
if(event.record.ステータス.value !== ‘下書き’) return;
event.record.Table.value.forEach(function(row){
row.value.支払日.disabled = true;
row.value.支払方法.disabled = true;
row.value.実績金額.disabled = true;
});
return event;
});
})();
yt様
こんにちは。erikaと申します。
個人的にif文よりswitch文の方が好きなので、switch文で記載してます。
ステータスというドロップダウンはサブテーブルに含まれていないと認識してますが、あってますか?
サブテーブルに含まれている場合はまた別の方法になりますので、教えて頂ければと思います。
erikaさま
早速ご教示いただきありがとうございます。
分かりにくい聞き方をしてすみません。今回はドロップダウンリストのフォームでなく、ドロップダウンをステータス(プロセス管理)に変え設定し、そのプロセスを進めていく毎にサブテーブルの一部を編集できないように制御するやり方がないかを模索しております。
また、制御するサブテーブルのフィールドはプロセス毎に制御を変化させる予定で、その方法が分かりましたらご教示いただければ嬉しいです。
よろしくお願いいたします。
また、補足ですが、ステータスの最初は「下書き」から始まり ”下書き”>”承認待ち”>”購入許可”>”完了” のプロセスを作る予定で、プロセス毎に以下の通り制御をする予定です。
”下書き”…「実績金額」のサブテーブルを制御
”承認待ち”…「実績金額」のサブテーブルを制御
”購入許可”…「支払日」「支払方法」のサブテーブルを制御
”完了”…「実績金額」「支払日」「支払方法」のサブテーブルを制御
そのような事ができるかどうかも分かっておらずやってみたら、下書きの段階では制御できたので、プロセスを進めるごとに制御できればとても助かります。
yt様
ステータスはプロセス管理を使用するとのこと承知しました。
では上記で提示したコードの「ドロップダウン」から「ステータス」に変更すれば問題なさそうですね。
あとはcaseを増やしてこのステータスの時はこの処理って感じで記載すれば大丈夫だと思われます。
問題は初期作成時はステータスがない状態です(保存ボタンを押さないと"下書き"にならない)ので、
caseに引っかからなかった場合の処理でdefaultを用意してますが。。
実際に試してもらった方が早いかもです。
(function() {
"use strict";
kintone.events.on([
'app.record.create.show',
'app.record.detail.show',
'app.record.edit.show',
'app.record.create.change.table',
'app.record.edit.change.table',
], function(event) {
var record = event.record;
var ステータス = record.ステータス.value;
var count = record.table.value.length;
switch(ステータス){
case '下書き':
case '承認待ち':
//プロセス管理のステータスが"下書き"と"承認待ち"の場合の処理
//下書きの場合、"実績金額"を選択不可にする
for(var i = 0; i < count; i++) {
record.table.value[i].value.支払日.disabled = false;
record.table.value[i].value.支払方法.disabled = false;
record.table.value[i].value.実績金額.disabled = true;
}
break;
case '購入許可':
//プロセス管理のステータスが"購入許可"の場合の処理
//例)"支払日"と"支払方法"を選択不可にする
for(var i = 0; i < count; i++) {
record.table.value[i].value.支払日.disabled = true;
record.table.value[i].value.支払方法.disabled = true;
record.table.value[i].value.実績金額.disabled = false;
}
break;
case '完了':
//プロセス管理のステータスが"下書き"の場合の処理
//例)下記項目を選択不可にする
for(var i = 0; i < count; i++) {
record.table.value[i].value.支払日.disabled = true;
record.table.value[i].value.支払方法.disabled = true;
record.table.value[i].value.実績金額.disabled = true;
}
break;
default:
//ステータスがない状態(初期作成)の場合の処理
for(var i = 0; i < count; i++) {
record.table.value[i].value.支払日.disabled = false;
record.table.value[i].value.支払方法.disabled = false;
record.table.value[i].value.実績金額.disabled = true;
}
}
});
})();
erikaさま
早速ありがとうございました!急いでいたのでとても助かりました。
一度試してみましたが、上手く動作せず・・。どうも私の記載した順序が逆のようでしたので、もう一度修正しなおしてチャレンジしてみます!
再チャレ、うまくいきましたらまたご連絡させてもらいます!!取り急ぎ御礼まで。
yt様
上手くいかなかったとのことで申し訳ないです。
私の方で実際にアプリを作成して上記試したところ、初期レコード作成時でエラーが出てました。
やはり、初期レコード作成時でステータスの値がないためエラーになり途中で処理を中断してました。
上記エラーをもとに初期レコード作成時とそれ以外とで処理を分けてみたところ、問題なく動作しましたので、
下記コードにてお試し頂ければと思います。
(function() {
"use strict";
kintone.events.on([
'app.record.create.show',
'app.record.create.change.Table',
], function(event) {
var record = event.record;
var count = record.Table.value.length;
//初期作成時は下書きと同じ処理で、"実績金額"を選択不可にする
for(var i = 0; i < count; i++) {
record.Table.value[i].value.支払日.disabled = false;
record.Table.value[i].value.支払方法.disabled = false;
record.Table.value[i].value.実績金額.disabled = true;
}
return event;
});
})();
(function() {
"use strict";
kintone.events.on([
'app.record.detail.show',
'app.record.edit.show',
'app.record.edit.change.Table',
], function(event) {
var record = event.record;
var ステータス = record['ステータス']['value'];
var count = record.Table.value.length;
switch(ステータス){
case '下書き':
case '承認待ち':
//プロセス管理のステータスが"下書き"と"承認待ち"の場合の処理
//下書きの場合、"実績金額"を選択不可にする
for(var i = 0; i < count; i++) {
record.Table.value[i].value.支払日.disabled = false;
record.Table.value[i].value.支払方法.disabled = false;
record.Table.value[i].value.実績金額.disabled = true;
}
break;
case '購入許可':
//プロセス管理のステータスが"購入許可"の場合の処理
//例)"支払日"と"支払方法"を選択不可にする
for(var i = 0; i < count; i++) {
record.Table.value[i].value.支払日.disabled = true;
record.Table.value[i].value.支払方法.disabled = true;
record.Table.value[i].value.実績金額.disabled = false;
}
break;
case '完了':
//プロセス管理のステータスが"下書き"の場合の処理
//例)下記項目を選択不可にする
for(var i = 0; i < count; i++) {
record.Table.value[i].value.支払日.disabled = true;
record.Table.value[i].value.支払方法.disabled = true;
record.Table.value[i].value.実績金額.disabled = true;
}
break;
}
return event;
});
})();
erikaさま
この度はお忙しい中ご確認、丁寧に分けたコードのご教示までありがとうございました。
早速試してみましたら、無事実装できましたーーーーー!とっても嬉しいです!!
コードを分ける方法など大変勉強になり、また他のアプリにもどんどん活用させてもらいながら、もっともっと勉強していきたいと思います。
本件とても困っていましたので本当に感謝の気持ちでいっぱいです。ありがとうございました!