'''
new_desc_section = desc_csv_buttons + '''
'''
if old_desc_section in content and desc_csv_buttons not in content:
content = content.replace(old_desc_section, new_desc_section)
print("[OK] Added CSV buttons to Description module")
# 5. 加入 CSV 處理函數
csv_functions = '''
// ==================== CSV 匯入匯出函數 ====================
// 崗位資料 CSV 匯出
function exportPositionsCSV() {
// 收集所有崗位資料(這裡簡化為當前表單資料)
const data = [{
positionCode: getFieldValue('positionCode'),
positionName: getFieldValue('positionName'),
positionCategory: getFieldValue('positionCategory'),
positionNature: getFieldValue('positionNature'),
headcount: getFieldValue('headcount'),
positionLevel: getFieldValue('positionLevel'),
effectiveDate: getFieldValue('effectiveDate'),
positionDesc: getFieldValue('positionDesc'),
positionRemark: getFieldValue('positionRemark'),
minEducation: getFieldValue('minEducation'),
salaryRange: getFieldValue('salaryRange'),
workExperience: getFieldValue('workExperience'),
minAge: getFieldValue('minAge'),
maxAge: getFieldValue('maxAge')
}];
const headers = ['positionCode', 'positionName', 'positionCategory', 'positionNature',
'headcount', 'positionLevel', 'effectiveDate', 'positionDesc', 'positionRemark',
'minEducation', 'salaryRange', 'workExperience', 'minAge', 'maxAge'];
CSVUtils.exportToCSV(data, 'positions.csv', headers);
showToast('崗位資料已匯出!');
}
// 崗位資料 CSV 匯入觸發
function importPositionsCSV() {
document.getElementById('positionCSVInput').click();
}
// 處理崗位 CSV 匯入
function handlePositionCSVImport(event) {
const file = event.target.files[0];
if (!file) return;
CSVUtils.importFromCSV(file, (data) => {
if (data && data.length > 0) {
const firstRow = data[0];
// 填充表單
Object.keys(firstRow).forEach(key => {
const element = document.getElementById(key);
if (element) {
element.value = firstRow[key];
}
});
showToast(`已匯入 ${data.length} 筆崗位資料(顯示第一筆)`);
}
});
// 重置 input
event.target.value = '';
}
// 職務資料 CSV 匯出
function exportJobsCSV() {
const data = [{
jobCategoryCode: getFieldValue('jobCategoryCode'),
jobCategoryName: getFieldValue('jobCategoryName'),
jobCode: getFieldValue('jobCode'),
jobName: getFieldValue('jobName'),
jobNameEn: getFieldValue('jobNameEn'),
jobEffectiveDate: getFieldValue('jobEffectiveDate'),
jobHeadcount: getFieldValue('jobHeadcount'),
jobSortOrder: getFieldValue('jobSortOrder'),
jobRemark: getFieldValue('jobRemark'),
jobLevel: getFieldValue('jobLevel'),
hasAttendanceBonus: document.getElementById('hasAttendanceBonus')?.checked,
hasHousingAllowance: document.getElementById('hasHousingAllowance')?.checked
}];
const headers = ['jobCategoryCode', 'jobCategoryName', 'jobCode', 'jobName', 'jobNameEn',
'jobEffectiveDate', 'jobHeadcount', 'jobSortOrder', 'jobRemark', 'jobLevel',
'hasAttendanceBonus', 'hasHousingAllowance'];
CSVUtils.exportToCSV(data, 'jobs.csv', headers);
showToast('職務資料已匯出!');
}
// 職務資料 CSV 匯入觸發
function importJobsCSV() {
document.getElementById('jobCSVInput').click();
}
// 處理職務 CSV 匯入
function handleJobCSVImport(event) {
const file = event.target.files[0];
if (!file) return;
CSVUtils.importFromCSV(file, (data) => {
if (data && data.length > 0) {
const firstRow = data[0];
Object.keys(firstRow).forEach(key => {
const element = document.getElementById(key);
if (element) {
if (element.type === 'checkbox') {
element.checked = firstRow[key] === 'true';
} else {
element.value = firstRow[key];
}
}
});
showToast(`已匯入 ${data.length} 筆職務資料(顯示第一筆)`);
}
});
event.target.value = '';
}
// 崗位描述 CSV 匯出
function exportDescriptionsCSV() {
const data = [{
descPositionCode: getFieldValue('descPositionCode'),
descPositionName: getFieldValue('descPositionName'),
descEffectiveDate: getFieldValue('descEffectiveDate'),
jobDuties: getFieldValue('jobDuties'),
requiredSkills: getFieldValue('requiredSkills'),
workEnvironment: getFieldValue('workEnvironment'),
careerPath: getFieldValue('careerPath'),
descRemark: getFieldValue('descRemark')
}];
const headers = ['descPositionCode', 'descPositionName', 'descEffectiveDate', 'jobDuties',
'requiredSkills', 'workEnvironment', 'careerPath', 'descRemark'];
CSVUtils.exportToCSV(data, 'job_descriptions.csv', headers);
showToast('崗位描述已匯出!');
}
// 崗位描述 CSV 匯入觸發
function importDescriptionsCSV() {
document.getElementById('descCSVInput').click();
}
// 處理崗位描述 CSV 匯入
function handleDescCSVImport(event) {
const file = event.target.files[0];
if (!file) return;
CSVUtils.importFromCSV(file, (data) => {
if (data && data.length > 0) {
const firstRow = data[0];
Object.keys(firstRow).forEach(key => {
const element = document.getElementById(key);
if (element) {
element.value = firstRow[key];
}
});
showToast(`已匯入 ${data.length} 筆崗位描述資料(顯示第一筆)`);
}
});
event.target.value = '';
}
'''
# 在 前加入函數
if 'function exportPositionsCSV()' not in content:
content = content.replace(' \n