diff --git a/javascript/packs/app.ts b/javascript/packs/app.ts index bad81d7..f4a2b13 100644 --- a/javascript/packs/app.ts +++ b/javascript/packs/app.ts @@ -186,4 +186,47 @@ document.addEventListener('DOMContentLoaded', () => { } }); }); + + document.querySelectorAll('form.edit-is-ku').forEach(form => { + form.addEventListener('submit', e => { + // 保存時に選択されていない方の所属情報を削除 + form.querySelectorAll('form #edit-is-kyoto-university').forEach(select => { + var isKUMember = (select.value==="TRUE"); + form.querySelectorAll('form #edit-ku-department').forEach(selectDepartment => { + if (!isKUMember) selectDepartment.value=""; + }); + form.querySelectorAll('form div.is-ku .form-control').forEach(input => { + if (!isKUMember) input.value=""; + }); + form.querySelectorAll('form div.not-ku .form-control').forEach(input => { + if (isKUMember) input.value=""; + }); + }); + + if (!form.reportValidity()) { + e.preventDefault(); + e.stopPropagation(); + } + }); + + form.querySelectorAll('form #edit-is-kyoto-university').forEach(select => { + function rewrite(){ + var isKUMember = (select.value==="TRUE"); + form.querySelectorAll('form div.is-ku').forEach(div => { + div.hidden = !isKUMember; + }) + form.querySelectorAll('form div.not-ku').forEach(div => { + div.hidden = isKUMember; + }) + form.querySelectorAll('form div.is-ku .form-control').forEach(input => { + input.required=isKUMember; + }) + form.querySelectorAll('form div.not-ku .form-control').forEach(input => { + input.required=!isKUMember; + }) + } + rewrite(); + select.addEventListener('change', rewrite); + }); + }); }); diff --git a/lib/user.rb b/lib/user.rb index 0221981..96eacc4 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -46,6 +46,7 @@ def edit(uid, bind_uid, bind_password, attrs, update_last_modified: true) attrs['cn'] = "#{attrs['givenName']} #{attrs['sn']}" attrs['x-kmc-Lodging'] = attrs['x-kmc-Lodging'] ? 'TRUE' : 'FALSE' # fixme attrs['x-kmc-AddressIsPublic'] = attrs['x-kmc-AddressIsPublic'] ? 'TRUE' : 'FALSE' # fixme + attrs['x-kmc-IsKUMember'] = attrs['x-kmc-IsKUMember']=="TRUE" ? 'TRUE' : 'FALSE' # fixme ssh_public_keys = attrs.delete('sshPublicKey') ssh_public_keys&.each do |key| @@ -132,7 +133,7 @@ def add(uid, attributes, bind_uid, bind_password) x-kmc-Alias title x-kmc-Generation description postalCode postalAddress x-kmc-Lodging telephoneNumber x-kmc-MailForwardingAddress - x-kmc-AddressIsPublic + x-kmc-AddressIsPublic x-kmc-IsKUMember x-kmc-KUDepartment x-kmc-KUStudentNumber ] def update_attribute(conn, dn, key, value) diff --git a/lib/view_helpers.rb b/lib/view_helpers.rb index 24466d7..ec3ccec 100644 --- a/lib/view_helpers.rb +++ b/lib/view_helpers.rb @@ -4,5 +4,18 @@ def input_userattr(user, attr, opt = {}) opt[:class] ||= 'form-control' haml_tag :input, {name: attr, value: user[attr].first}.merge(opt) end + def select_userattr(user, attr, values, show_default, opt = {}) + opt[:class] ||= 'form-select' + haml_tag :select, {name: attr}.merge(opt) do + if show_default + haml_tag :option, selected: true, hidden: true, value: "" do haml_concat "--選択してください--" end + end + current_value = user[attr].first + values.each do |k, v| + selected = v == current_value + haml_tag :option, value: k, selected: selected do haml_concat v end + end + end + end end end diff --git a/schema/kmc.schema b/schema/kmc.schema index 1cfa563..a05a7e3 100644 --- a/schema/kmc.schema +++ b/schema/kmc.schema @@ -102,6 +102,29 @@ attributeType ( kmcAttributeType:14 EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 ) +attributeType ( kmcAttributeType:15 + NAME 'x-kmc-IsKUMember' + DESC 'Whether the associated person belongs to Kyoto University' + EQUALITY booleanMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 + SINGLE-VALUE ) + +attributeType ( kmcAttributeType:16 + NAME 'x-kmc-KUStudentNumber' + DESC 'Kyoto University Student Number' + EQUALITY caseIgnoreMatch + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE ) + +attributeType ( kmcAttributeType:17 + NAME 'x-kmc-KUDepartment' + DESC 'the department and faculty of Kyoto University to which the associated person belongs' + EQUALITY caseIgnoreMatch + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 + SINGLE-VALUE ) + objectClass ( kmcObjectClass:1 NAME 'x-kmc-Person' DESC 'Additional informations for a member of KMC' @@ -112,4 +135,4 @@ objectClass ( kmcObjectClass:1 x-kmc-UniversityDepartment $ x-kmc-UniversityStatus $ x-kmc-UniversityMatricYear $ x-kmc-MailForwardingAddress $ x-kmc-MailNotificationAddress $ - x-kmc-DiscordUserID $ x-kmc-SlackUserID $ x-kmc-AddressIsPublic) ) + x-kmc-DiscordUserID $ x-kmc-SlackUserID $ x-kmc-AddressIsPublic $ x-kmc-IsKUMember $ x-kmc-KUDepartment $ x-kmc-KUStudentNumber) ) diff --git a/views/detail.haml b/views/detail.haml index 7be78fc..4857251 100644 --- a/views/detail.haml +++ b/views/detail.haml @@ -25,10 +25,13 @@ %tr %th 住所 %td #{user['postalCode'].first} #{user['postalAddress'].first} - - if user['x-kmc-UniversityDepartment'].first + - if user['x-kmc-KUDepartment'].first||user['x-kmc-UniversityDepartment'].first %tr %th 所属 - %td #{user['x-kmc-UniversityDepartment'].first} #{user['x-kmc-UniversityStatus'].first} + -if user['x-kmc-isKUMember'].first=="TRUE" + %td 京都大学 #{user['x-kmc-KUDepartment'].first} #{user['x-kmc-UniversityStatus'].first} + -else + %td #{user['x-kmc-UniversityDepartment'].first} - if user['description'].first %tr %th 備考 diff --git a/views/edit.haml b/views/edit.haml index 9a0744b..fd83525 100644 --- a/views/edit.haml +++ b/views/edit.haml @@ -2,7 +2,9 @@ %p.alert.alert-danger = error -%form.edit-form.needs-validation{action: absolute_uri(user['uid'].first, :edit), method: :POST} +-ku_departments={"工学部情報学科" => "工学部情報学科", "工学部電気電子工学科" => "工学部電気電子工学科", "工学部物理工学科" => "工学部物理工学科", "工学部地球工学科" => "工学部地球工学科", "工学部建築学科" => "工学部建築学科", "工学部工業化学科" => "工学部工業化学科", "理学部" => "理学部", "医学部医学科" => "医学部医学科", "医学部人間健康科学科" => "医学部人間健康科学科", "総合人間学部" => "総合人間学部", "文学部" => "文学部", "教育学部" => "教育学部", "法学部" => "法学部", "経済学部" => "経済学部", "薬学部薬科学科" => "薬学部薬科学科", "薬学部薬学科" => "薬学部薬学科", "農学部資源生物科学科" => "農学部資源生物科学科", "農学部応用生命科学科" => "農学部応用生命科学科", "農学部地域環境工学科" => "農学部地域環境工学科", "農学部食料・環境経済学科" => "農学部食料・環境経済学科", "農学部森林科学科" => "農学部 森林科学科", "農学部食品生物科学科" => "農学部 食品生物科学科", "情報学研究科" => "情報学研究科", "工学研究科" => "工学研究科", "文学研究科" => "文学研究科", "法学研究科" => "法学研究科", "理学研究科" => "理学研究科", "薬学研究科" => "薬学研究科", "エネルギー化学研究科" => "エネルギー化学研究科", "教育学研究科" => "教育学研究科", "経済学研究科" => "経済学研究科", "医学研究科" => "医学研究科", "職員" => "職員", "other" => "その他" } + +%form.edit-form.needs-validation.edit-is-ku{action: absolute_uri(user['uid'].first, :edit), method: :POST} %h2 ユーザ情報編集 %div.container %div.row @@ -92,18 +94,36 @@ - input_userattr user, 'x-kmc-AddressIsPublic', type: :checkbox, value: 'true', checked: user['x-kmc-AddressIsPublic'].first == 'TRUE', class: '' 郵便番号と住所を他の部員に公開 %div.row - %div.col-12.col-lg-8.mb-2 - %label{for: 'edit-university-department'} + %div.col-12.col-lg-2.mb-2 + %label{for: 'edit-is-kyoto-university'} 所属 - %span.form-required *在学者は必須 + %span.form-required * + %div + - select_userattr user, 'x-kmc-IsKUMember', {"TRUE" => "京都大学", "FALSE" => "その他"} , false, id: 'edit-is-kyoto-university' + %div.col-12.col-lg-4.mb-2.is-ku + %label{for: 'edit-ku-department'} + 学部・学科 + %span.form-required *京大所属者は必須 %div - - input_userattr user, 'x-kmc-UniversityDepartment', id: 'edit-university-department', placeholder: '工学部情報学科, 千葉電波大学理学部' - %div.col-12.col-lg-4.mb-2 + - select_userattr user, 'x-kmc-KUDepartment', ku_departments, true, id: 'edit-ku-department', required: true + %div.col-12.col-lg-4.mb-2.is-ku + %label{for: 'edit-ku-student-number'} + 学生番号 + %span.form-required *京大所属者は必須 + %div + - input_userattr user, 'x-kmc-KUStudentNumber', id: 'edit-ku-student-number', type: :text, required: true, placeholder: 'XXXX-YY-ZZZZ', pattern: '\d+-\d+-\d+' + %div.col-12.col-lg-2.mb-2.is-ku %label{for: 'edit-university-status'} 学年 - %span.form-required *在学者は必須 + %span.form-required *京大所属者は必須 + %div + - input_userattr user, 'x-kmc-UniversityStatus', id: 'edit-university-status', required: true, placeholder: '1, M2, D3, 教授' + %div.col-12.col-lg-10.mb-2.not-ku{hidden: "hidden"} + %label{for: 'edit-university-department'} + 所属組織・学部・学科 + %span.form-required *必須 %div - - input_userattr user, 'x-kmc-UniversityStatus', id: 'edit-university-status', placeholder: '1, M2, D3, 教授' + - input_userattr user, 'x-kmc-UniversityDepartment', id: 'edit-university-department', required: true, placeholder: '千葉電波大学理学部, 社会人' %div.row %div.col-12.col-lg-6.mb-2 %label{for: 'edit-university-matric-year'} diff --git a/views/index.haml b/views/index.haml index be1689a..461e5ae 100644 --- a/views/index.haml +++ b/views/index.haml @@ -50,7 +50,9 @@ %td #{user['x-kmc-UniversityMatricYear'].first} %td + - if !user['x-kmc-KUDepartment'].empty? + 京都大学 #{user['x-kmc-KUDepartment'].first} #{user['x-kmc-UniversityStatus'].first} - if !user['x-kmc-UniversityDepartment'].empty? - #{user['x-kmc-UniversityDepartment'].first} #{user['x-kmc-UniversityStatus'].first} + #{user['x-kmc-UniversityDepartment'].first} %td #{user['title'].first}