141 lines
4.2 KiB
JavaScript
141 lines
4.2 KiB
JavaScript
/*
|
||
@config : next999.json
|
||
@filename : ${psFileBasename}
|
||
@title : 1.シフト情報保存
|
||
@name : 1.シフト情報保存
|
||
@siteIds : 310514
|
||
@siteTitles : イオン多摩平シフト希望
|
||
@disabled: false
|
||
*/
|
||
|
||
$p.events.on_editor_load = function () {
|
||
|
||
|
||
if ($p.action() == 'new') {
|
||
let now = new Date();
|
||
let nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1);
|
||
let yyyy = nextMonth.getFullYear();
|
||
let mm = String(nextMonth.getMonth() + 1).padStart(2, '0');
|
||
let ymStr = `${yyyy}年${mm}月`;
|
||
$p.set($('#Results_ClassA'), ymStr);
|
||
}
|
||
|
||
//任意の処理
|
||
setupCalendar();
|
||
}
|
||
|
||
|
||
|
||
//保存前野処理
|
||
$p.events.before_validate = function (args) {
|
||
|
||
//曜日判定
|
||
let week = ['月', '火', '水', '木', '金', '土', '日'];
|
||
if ($('#Results_ClassC').val().includes('すべて可')) {
|
||
$p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]'));
|
||
} else if (isSubset($('#Results_ClassC').val(), week)) {
|
||
$p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]'));
|
||
} else if ($('#Results_ClassC').val().length === 0) {
|
||
$p.set($('#Results_ClassC'), JSON.stringify('["すべて可"]'));
|
||
}
|
||
|
||
/*
|
||
//最低勤務時間
|
||
if ($('#Results_NumA').val() == '0') {
|
||
$p.set($('#Results_ClassG'), "月あたり最低勤務時間:指定無し");
|
||
} else {
|
||
$p.set($('#Results_ClassG'), "月あたり最低勤務時間:" + $('#Results_NumA').val() + "時間");
|
||
}
|
||
|
||
//最大勤務時間
|
||
if ($('#Results_NumB').val() == '0') {
|
||
$p.set($('#Results_ClassH'), "月あたり最大勤務時間:指定無し");
|
||
} else {
|
||
$p.set($('#Results_ClassH'), "月あたり最大勤務時間:" + $('#Results_NumB').val() + "時間");
|
||
}
|
||
*/
|
||
|
||
//曜日
|
||
let classCStr = "希望曜日:" + $('#Results_ClassC').val().join(',');
|
||
|
||
//時間帯
|
||
let classD1 = $('#Results_ClassD').val();
|
||
let classD2;
|
||
let classDStr;
|
||
|
||
if (classD1.includes('いつでも')) {
|
||
$p.set($('#Results_ClassD'), JSON.stringify('["いつでも"]'));
|
||
classDStr = "時間:いつでも";
|
||
} else if (classD1.length === 0) {
|
||
$p.set($('#Results_ClassD'), JSON.stringify('["いつでも"]'));
|
||
classDStr = "時間:いつでも";
|
||
} else {
|
||
classD2 = convertToNumbers(classD1);
|
||
classDStr = "時間:" + formatRanges(classD2);
|
||
}
|
||
|
||
//カレンダーチェック内容保存
|
||
let checked = getCheckedDates();
|
||
$p.set($('#Results_ClassW'), JSON.stringify(checked));
|
||
|
||
|
||
//個別指定
|
||
let classWArray = checked.map(date => Number(date.split('-')[2]));
|
||
let classWStr = "個別希望日:" + classWArray.join(',');
|
||
|
||
$p.set($('#Results_ClassE'), classWArray.join(', '));
|
||
|
||
if (classWArray.length === 0) {
|
||
classWStr = "個別希望日:なし";
|
||
}
|
||
|
||
let list = [];
|
||
if (classCStr) list.push(classCStr);
|
||
if (classDStr) list.push(classDStr);
|
||
if (classWStr) list.push(classWStr);
|
||
|
||
let classZStr = list.join('/');
|
||
|
||
//希望シフトの内容をすべて連結して保存
|
||
$p.set($('#Results_ClassZ'), classZStr);
|
||
|
||
//年月を保存
|
||
$p.set($('#Results_ClassY'), $('#Results_ClassA').val());
|
||
|
||
//名前を保存
|
||
$p.set($('#Results_ClassX'), $('#Results_ClassB option:selected').text());
|
||
|
||
}
|
||
|
||
//配列ABを比較
|
||
function isSubset(A, B) {
|
||
return B.every(value => A.includes(value));
|
||
}
|
||
|
||
//数字範囲を省略して返却
|
||
function formatRanges(arr) {
|
||
arr.sort((a, b) => a - b); //配列を昇順にソート
|
||
let result = [];
|
||
let start = arr[0], end = arr[0];
|
||
|
||
for (let i = 1; i < arr.length; i++) {
|
||
if (arr[i] === end + 1) {
|
||
//連続する数値の場合、範囲を拡張
|
||
end = arr[i];
|
||
} else {
|
||
//連続が途切れたら結果に追加し、新しい範囲を開始
|
||
result.push(start === end ? `${start}` : `${start}-${end}時`);
|
||
start = end = arr[i];
|
||
}
|
||
}
|
||
|
||
//最後の範囲を追加
|
||
result.push(start === end ? `${start}` : `${start}-${end}時`);
|
||
return result.join(",");
|
||
}
|
||
|
||
//配列の中身をすべて数値に置き換える
|
||
function convertToNumbers(arr) {
|
||
return arr.map(value => Number(value));
|
||
}
|