update 園児台帳 for update vlookup
This commit is contained in:
@@ -23,5 +23,11 @@ const env = {
|
|||||||
},
|
},
|
||||||
"園児台帳": {
|
"園児台帳": {
|
||||||
appId: 16,
|
appId: 16,
|
||||||
|
uniqueKeyFieldCode: 'ユニークキー'
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const warekiStartYear = {
|
||||||
|
"平成": 1989,
|
||||||
|
"令和": 2019,
|
||||||
|
}
|
||||||
16
src/main.css
16
src/main.css
@@ -76,3 +76,19 @@
|
|||||||
margin-top: 32px;
|
margin-top: 32px;
|
||||||
margin-left: -8px;
|
margin-left: -8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.kuc--has-spinner {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
div[class^='kuc-spinner'][class$='__spinner'] {
|
||||||
|
margin-top: 89px;
|
||||||
|
height: calc(100% - 89px);
|
||||||
|
position: absolute;
|
||||||
|
--kuc-spinner-text-color: #3498db;
|
||||||
|
--kuc-spinner-loader-color: #3498db;
|
||||||
|
}
|
||||||
|
div[class^='kuc-spinner'][class$='mask'] {
|
||||||
|
top: 89px;
|
||||||
|
position: absolute;
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|||||||
58
src/utils.js
58
src/utils.js
@@ -21,6 +21,7 @@ const classItems = [
|
|||||||
const errorEl = new Kuc.Notification({
|
const errorEl = new Kuc.Notification({
|
||||||
type: 'danger',
|
type: 'danger',
|
||||||
});
|
});
|
||||||
|
let loadingEl;
|
||||||
|
|
||||||
function getHeaderSpace(className, isDetailPage) {
|
function getHeaderSpace(className, isDetailPage) {
|
||||||
const headerSpace = (isDetailPage ? kintone.app.record : kintone.app).getHeaderMenuSpaceElement();
|
const headerSpace = (isDetailPage ? kintone.app.record : kintone.app).getHeaderMenuSpaceElement();
|
||||||
@@ -192,3 +193,60 @@ function hideSpaceField(ids) {
|
|||||||
function getExcelName({ excelName }, nameSuffix = '', suffix = '.xlsx') {
|
function getExcelName({ excelName }, nameSuffix = '', suffix = '.xlsx') {
|
||||||
return excelName + (nameSuffix ? (nameSuffix.startsWith('_') ? nameSuffix : ('_' + nameSuffix)) : '') + suffix;
|
return excelName + (nameSuffix ? (nameSuffix.startsWith('_') ? nameSuffix : ('_' + nameSuffix)) : '') + suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getJapaneseEraDate(date = new Date()) {
|
||||||
|
const formatter = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {
|
||||||
|
era: 'long',
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
day: 'numeric'
|
||||||
|
});
|
||||||
|
const japaneseDate = formatter.format(date);
|
||||||
|
|
||||||
|
const match = japaneseDate.match(/(.+?)(元|\d+)年(\d+)月(\d+)日/);
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
throw new Error("日付の解析に失敗しました。");
|
||||||
|
}
|
||||||
|
|
||||||
|
const era = match[1];
|
||||||
|
const year = match[2] === "元" ? 1 : parseInt(match[2], 10);
|
||||||
|
const month = parseInt(match[3], 10);
|
||||||
|
const day = parseInt(match[4], 10);
|
||||||
|
|
||||||
|
return {
|
||||||
|
japaneseDate,
|
||||||
|
era,
|
||||||
|
year,
|
||||||
|
month,
|
||||||
|
day,
|
||||||
|
westernYear: date.getFullYear()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertToWesternYear(year, era) {
|
||||||
|
return warekiStartYear[era] + year - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFormatDateString(date) {
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(date.getDate()).padStart(2, '0');
|
||||||
|
|
||||||
|
return `${year}-${month}-${day}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loading(show, text) {
|
||||||
|
if (!loadingEl) {
|
||||||
|
loadingEl = new Kuc.Spinner({
|
||||||
|
container: document.querySelector('.container-gaia'),
|
||||||
|
text
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
loadingEl.close();
|
||||||
|
loadingEl.text = text;
|
||||||
|
}
|
||||||
|
if (show) {
|
||||||
|
loadingEl.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
class BatchCreateHandler {
|
class BatchCreateHandler {
|
||||||
|
|
||||||
constructor(env, headerSpace) {
|
constructor(headerSpace) {
|
||||||
BatchCreateHandler.APP_ENV = env;
|
|
||||||
|
|
||||||
const elements = createBtnGroupArea('batch-action-area', '出欠簿一括作成', this.handleCreateDate, {
|
const elements = createBtnGroupArea('batch-action-area', '出欠簿一括作成', this.handleCreateDate, {
|
||||||
btnElId: 'batch-btn',
|
btnElId: 'batch-btn',
|
||||||
})
|
})
|
||||||
@@ -12,7 +10,69 @@ class BatchCreateHandler {
|
|||||||
headerSpace.appendChild(elements['batch-action-area']);
|
headerSpace.appendChild(elements['batch-action-area']);
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCreateDate(e) {
|
handleCreateDate = async (e) => {
|
||||||
|
loading(true, '出欠簿一括作成中...');
|
||||||
|
const api = new KintoneRestAPIClient();
|
||||||
|
let result = [];
|
||||||
|
|
||||||
|
try {
|
||||||
|
result = await api.record.getAllRecordsWithId({
|
||||||
|
app: env["園児台帳"].appId,
|
||||||
|
fields: ["$id", "ユニークキー", "和暦_退園年月日", "年_退園年月日", "月_退園年月日", "日_退園年月日"],
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
// TODO
|
||||||
|
loading(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const today = new Date();
|
||||||
|
const todayString = getFormatDateString(today)
|
||||||
|
const records = [];
|
||||||
|
for (const record of result) {
|
||||||
|
if (!this.needCreateData(record, today)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
records.push(this.createRecord(record, todayString))
|
||||||
|
}
|
||||||
|
console.log(records);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const addResult = await api.record.addAllRecords({
|
||||||
|
app: env["園児別出欠簿入力"].appId,
|
||||||
|
records
|
||||||
|
});
|
||||||
|
location.reload();
|
||||||
|
} catch (error) {
|
||||||
|
// TODO
|
||||||
|
} finally {
|
||||||
|
loading(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
needCreateData = (record, today) => {
|
||||||
|
const era = record["和暦_退園年月日"].value;
|
||||||
|
const lastYear = record["年_退園年月日"].value;
|
||||||
|
const lastMonth = record["月_退園年月日"].value;
|
||||||
|
const lastDate = record["日_退園年月日"].value;
|
||||||
|
if (!era || !lastYear || !lastMonth || !lastDate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
const todayObj = new Date(today);
|
||||||
|
todayObj.setHours(0, 0, 0, 0);
|
||||||
|
const lastDateObj = new Date(convertToWesternYear(Number(lastYear), era), Number(lastMonth) - 1, Number(lastDate));
|
||||||
|
lastDateObj.setHours(0, 0, 0, 0);
|
||||||
|
return todayObj.getTime() <= lastDateObj.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
createRecord = (record, todayString) => {
|
||||||
|
return {
|
||||||
|
'登園日': { 'value': todayString },
|
||||||
|
'園児ユニークキー': { 'value': record["ユニークキー"].value },
|
||||||
|
// '学年': { 'value': record["学年"].value },
|
||||||
|
// 'クラス': { 'value': record["クラス"].value },
|
||||||
|
// '出席番号': { 'value': record["出席番号"].value },
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static getInstance(env, headerSpace) {
|
static getInstance(env, headerSpace) {
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
class ExtractHandler {
|
class ExtractHandler {
|
||||||
constructor(env, headerSpace) {
|
constructor(headerSpace) {
|
||||||
ExtractHandler.APP_ENV = env;
|
|
||||||
|
|
||||||
const elements = createBtnGroupArea('extract-action-area', '出欠集計表出力', this.handleExtractData, {
|
const elements = createBtnGroupArea('extract-action-area', '出欠集計表出力', this.handleExtractData, {
|
||||||
btnElId: 'extract-btn',
|
btnElId: 'extract-btn',
|
||||||
yearElId: 'extract-year',
|
yearElId: 'extract-year',
|
||||||
@@ -15,13 +13,13 @@ class ExtractHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleExtractData(e, { year, month, className }) {
|
handleExtractData(e, { year, month, className }) {
|
||||||
const fileName = getExcelName(ExtractHandler.APP_ENV, year + month + '_' + className + '組');
|
const fileName = getExcelName(env["園児別出欠簿入力"], year + month + '_' + className + '組');
|
||||||
console.log(fileName);
|
console.log(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getInstance(env, headerSpace) {
|
static getInstance(headerSpace) {
|
||||||
if (!ExtractHandler.instance) {
|
if (!ExtractHandler.instance) {
|
||||||
ExtractHandler.instance = new ExtractHandler(env, headerSpace);
|
ExtractHandler.instance = new ExtractHandler(headerSpace);
|
||||||
}
|
}
|
||||||
return ExtractHandler.instance;
|
return ExtractHandler.instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
class Link1Handler {
|
class Link1Handler {
|
||||||
|
|
||||||
constructor(env, headerSpace) {
|
constructor(headerSpace) {
|
||||||
Link1Handler.APP_ENV = env;
|
|
||||||
|
|
||||||
const elements = createBtnGroupArea('link-1-action-area', '0,1歳日誌データ連携', this.handleLink, {
|
const elements = createBtnGroupArea('link-1-action-area', '0,1歳日誌データ連携', this.handleLink, {
|
||||||
btnElId: 'link-1-btn',
|
btnElId: 'link-1-btn',
|
||||||
yearElId: 'link-1-year',
|
yearElId: 'link-1-year',
|
||||||
@@ -17,9 +15,9 @@ class Link1Handler {
|
|||||||
handleLink(e, { year, month }) {
|
handleLink(e, { year, month }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static getInstance(env, headerSpace) {
|
static getInstance(headerSpace) {
|
||||||
if (!Link1Handler.instance) {
|
if (!Link1Handler.instance) {
|
||||||
Link1Handler.instance = new Link1Handler(env, headerSpace);
|
Link1Handler.instance = new Link1Handler(headerSpace);
|
||||||
}
|
}
|
||||||
return Link1Handler.instance;
|
return Link1Handler.instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
class Link2Handler {
|
class Link2Handler {
|
||||||
|
|
||||||
constructor(env, headerSpace) {
|
constructor(headerSpace) {
|
||||||
Link2Handler.APP_ENV = env;
|
|
||||||
|
|
||||||
const elements = createBtnGroupArea('link-2-action-area', '2歳以上日誌データ連携', this.handleLink, {
|
const elements = createBtnGroupArea('link-2-action-area', '2歳以上日誌データ連携', this.handleLink, {
|
||||||
btnElId: 'link-2-btn',
|
btnElId: 'link-2-btn',
|
||||||
yearElId: 'link-2-year',
|
yearElId: 'link-2-year',
|
||||||
@@ -20,9 +18,9 @@ class Link2Handler {
|
|||||||
handleLink(e, { year, month, date }) {
|
handleLink(e, { year, month, date }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static getInstance(env, headerSpace) {
|
static getInstance(headerSpace) {
|
||||||
if (!Link2Handler.instance) {
|
if (!Link2Handler.instance) {
|
||||||
Link2Handler.instance = new Link2Handler(env, headerSpace);
|
Link2Handler.instance = new Link2Handler(headerSpace);
|
||||||
}
|
}
|
||||||
return Link2Handler.instance;
|
return Link2Handler.instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,7 @@
|
|||||||
area.appendChild(clockOut);
|
area.appendChild(clockOut);
|
||||||
|
|
||||||
hideSpaceField(['clock-in-btn-area', 'clock-out-btn-area']);
|
hideSpaceField(['clock-in-btn-area', 'clock-out-btn-area']);
|
||||||
});
|
return event;
|
||||||
|
|
||||||
kintone.events.on('app.record.print.show', (event) => {
|
|
||||||
hideSpaceField(['clock-in-btn-area', 'clock-out-btn-area']);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function dateToFieldInDetail(fieldCode) {
|
function dateToFieldInDetail(fieldCode) {
|
||||||
@@ -33,12 +30,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------- 印刷画面表示時の処理 -------------------
|
||||||
|
kintone.events.on('app.record.print.show', (event) => {
|
||||||
|
hideSpaceField(['clock-in-btn-area', 'clock-out-btn-area']);
|
||||||
|
return event;
|
||||||
|
});
|
||||||
|
|
||||||
// ------------------- 編集画面表示時の処理 -------------------
|
// ------------------- 編集画面表示時の処理 -------------------
|
||||||
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function (event) {
|
kintone.events.on(['app.record.create.show', 'app.record.edit.show'], function (event) {
|
||||||
const clockIn = createBtn('clock-in', '登園', dateToFieldInEdit('登園時刻'));
|
const clockIn = createBtn('clock-in', '登園', dateToFieldInEdit('登園時刻'));
|
||||||
kintone.app.record.getSpaceElement('clock-in-btn-area').appendChild(clockIn);
|
kintone.app.record.getSpaceElement('clock-in-btn-area').appendChild(clockIn);
|
||||||
const clockOut = createBtn('clock-out', '帰園', dateToFieldInEdit('帰園時刻'));
|
const clockOut = createBtn('clock-out', '帰園', dateToFieldInEdit('帰園時刻'));
|
||||||
kintone.app.record.getSpaceElement('clock-out-btn-area').appendChild(clockOut);
|
kintone.app.record.getSpaceElement('clock-out-btn-area').appendChild(clockOut);
|
||||||
|
return event;
|
||||||
});
|
});
|
||||||
|
|
||||||
function dateToFieldInEdit(fieldCode) {
|
function dateToFieldInEdit(fieldCode) {
|
||||||
|
|||||||
@@ -6,17 +6,17 @@
|
|||||||
const headerSpace = getHeaderSpace('single-label-line');
|
const headerSpace = getHeaderSpace('single-label-line');
|
||||||
|
|
||||||
if (event.viewId === APP_ENV.view["0,1歳日誌データ連携用途"]) {
|
if (event.viewId === APP_ENV.view["0,1歳日誌データ連携用途"]) {
|
||||||
Link1Handler.getInstance(APP_ENV, headerSpace);
|
Link1Handler.getInstance(headerSpace);
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.viewId === APP_ENV.view["2歳以上日誌データ連携用途"]) {
|
if (event.viewId === APP_ENV.view["2歳以上日誌データ連携用途"]) {
|
||||||
Link2Handler.getInstance(APP_ENV, headerSpace);
|
Link2Handler.getInstance(headerSpace);
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
BatchCreateHandler.getInstance(APP_ENV, headerSpace);
|
BatchCreateHandler.getInstance(headerSpace);
|
||||||
ExtractHandler.getInstance(APP_ENV, headerSpace);
|
ExtractHandler.getInstance(headerSpace);
|
||||||
});
|
});
|
||||||
|
|
||||||
})();
|
})();
|
||||||
42
src/園児台帳/main.js
Normal file
42
src/園児台帳/main.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
const APP_ENV = env["園児台帳"];
|
||||||
|
const FIELD_CODE = APP_ENV.uniqueKeyFieldCode;
|
||||||
|
|
||||||
|
// ------------------- 詳細/印刷/編集画面表示時の処理 -------------------
|
||||||
|
kintone.events.on(['app.record.detail.show', 'app.record.print.show'], function (event) {
|
||||||
|
hideField(FIELD_CODE);
|
||||||
|
return event;
|
||||||
|
});
|
||||||
|
|
||||||
|
// ------------------- 編集画面表示時の処理 -------------------
|
||||||
|
kintone.events.on(['app.record.edit.show', 'app.record.create.show'], function (event) {
|
||||||
|
const targetFieldEl = kintone.app.record.getSpaceElement("before-unique-key").parentElement.nextSibling;
|
||||||
|
targetFieldEl.querySelector('.input-constraints-cybozu').style.display = 'none';
|
||||||
|
|
||||||
|
event.record[FIELD_CODE]['value'] = "<自動計算:出席番号+学年+クラス+名前>";
|
||||||
|
disableField(event.record, FIELD_CODE);
|
||||||
|
return event;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function hideField(fieldCode) {
|
||||||
|
kintone.app.record.setFieldShown(fieldCode, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function disableField(record, fieldCode) {
|
||||||
|
record[fieldCode]['disabled'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------- 編集画面保存時の処理 -------------------
|
||||||
|
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function (event) {
|
||||||
|
event.record[FIELD_CODE]['value'] = getUniqueKey(event.record);
|
||||||
|
return event;
|
||||||
|
});
|
||||||
|
|
||||||
|
function getUniqueKey(record) {
|
||||||
|
return (record['出席番号']['value'] + '_' + record['学年']['value'] + '_' + record['クラス']['value'] + '_' + record['名前']['value']).substring(0, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
Reference in New Issue
Block a user