fix: 生物由来照会画面からのフィードバック。シングルクォート、ダブルクォートのエスケープ処理

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2023-07-28 09:17:32 +09:00
parent 739384febd
commit e4674d69e5
4 changed files with 86 additions and 26 deletions

View File

@ -17,9 +17,21 @@ class UltmarcDoctorSearchViewModel(BaseModel):
form_data: Optional[UltmarcDoctorSearchModel]
def ultmarc_data_json_str(self):
"""アルトマーク医師データの検索結果を指定された件数ごとに分割しながら返す"""
def date_handler(obj):
"""json.dumpsの日付項目のフォーマットハンドラ"""
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
return json.dumps([model.dict() for model in self.doctor_data], ensure_ascii=False, default=date_handler)
search_data_list = [model.dict() for model in self.doctor_data]
search_data_len = len(search_data_list)
# 呼び出し一回あたりの分割数
part_size = 50
for i in range(0, search_data_len, part_size):
json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler)
# JavaScriptに埋め込むため、クォートをエスケープ
json_str = json_str.replace("'", "\\'")
json_str = json_str.replace('\\"', '\\\\"')
yield json_str
# ページネーションのページ番号
# 検索時は最初のページを表示する

View File

@ -19,9 +19,21 @@ class UltmarcInstSearchViewModel(BaseModel):
form_data: Optional[UltmarcInstSearchModel]
def ultmarc_data_json_str(self):
"""アルトマーク施設データの検索結果を指定された件数ごとに分割しながら返す"""
def date_handler(obj):
"""json.dumpsの日付項目のフォーマットハンドラ"""
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
return json.dumps([model.dict() for model in self.inst_data], ensure_ascii=False, default=date_handler)
search_data_list = [model.dict() for model in self.inst_data]
search_data_len = len(search_data_list)
# 呼び出し一回あたりの分割数
part_size = 50
for i in range(0, search_data_len, part_size):
json_str = json.dumps(search_data_list[i:i + part_size], ensure_ascii=False, default=date_handler)
# JavaScriptに埋め込むため、クォートをエスケープ
json_str = json_str.replace("'", "\\'")
json_str = json_str.replace('\\"', '\\\\"')
yield json_str
# ページネーションのページ番号
# 検索時は最初のページを表示する

View File

@ -164,14 +164,8 @@
<script type="text/javascript">
// <! --ページネーションの作成-- >
$(function() {
let searchResultData = [];
// {% if not ultmarc.is_data_overflow_max_length() and not ultmarc.is_data_empty() %}
// スピナー出さない場合は以下、エスケープせず埋め込む
// {% autoescape False%}
const searchResultString = '{{ultmarc.ultmarc_data_json_str()}}';
// {% endautoescape%}
searchResultData = JSON.parse(searchResultString);
// {% endif %}
const searchResultData = generateSearchResult();
if (searchResultData.length == 0) return;
// 検索条件をセッションに入れる
sessionStorage.clear();
@ -191,9 +185,7 @@
let pagination_page_number = Number('{{ultmarc.init_pagination_page_number()}}');
$(".pagination").pagination({
dataSource: function(done) {
done(searchResultData)
},
dataSource: searchResultData,
pageNumber: pagination_page_number, // 初期ページ番号
pageSize: 50, //表示するコンテンツ数
pageRange: 1, //選択されているページネーション番号の両隣に表示する個数
@ -205,6 +197,21 @@
callback: function(data, pagination) {
sessionStorage.setItem('pagination_page_number',pagination.pageNumber);
$('#result_data').html(pagination_content(data));
$('.paginationjs-pages > ul > li').not('.disabled,.active').each(function(index, val) {
// paginationにtabindexをつける
$(val).attr('tabindex', '0')
// Enterキー押下時に要素をクリックできるようにイベントを付加する
$(val).on('keypress', function(e) {
if (e.code === 'Enter') {
$(e.target).click()
$(val).off('keypress')
return false
}
$(val).off('keypress')
})
})
FixedMidashi.remove();
FixedMidashi.create();
}
})
});
@ -247,6 +254,19 @@
})
}
function generateSearchResult(){
const searchResultData = []
// {% if ultmarc.is_form_submitted() and not (ultmarc.is_data_overflow_max_length() or ultmarc.is_data_empty()) %}
// {% autoescape False%}
// ジェネレータですこしずつ取得してリストに詰める
// {% for ultmarc_data_json_str in ultmarc.ultmarc_data_json_str() %}
searchResultData.push(...JSON.parse('{{ultmarc_data_json_str}}'))
// {% endfor %}
// {% endautoescape%}
// {% endif %}
return searchResultData
}
// チェックボックスのチェックされている場合、医師情報ボタンを活性化させる
function resultBtDisabled(){
var checkboxes = $('input[name="data"]:checked').length;

View File

@ -165,15 +165,8 @@
// <! --ページネーションの作成-- >
$(function() {
let searchResultData = [];
// {% if not ultmarc.is_data_overflow_max_length() and not ultmarc.is_data_empty() %}
// スピナー出さない場合は以下、エスケープせず埋め込む
// {% autoescape False%}
const searchResultString = '{{ultmarc.ultmarc_data_json_str()}}';
// {% endautoescape%}
searchResultData = JSON.parse(searchResultString);
// {% endif %}
const searchResultData = generateSearchResult();
if (searchResultData.length == 0) return;
// 検索条件をセッションに入れる
sessionStorage.clear();
@ -189,11 +182,8 @@
// ページネーションのページ番号取得
let pagination_page_number = Number('{{ultmarc.init_pagination_page_number()}}');
$(".pagination").pagination({
dataSource: function(done) {
done(searchResultData)
},
dataSource: searchResultData,
pageNumber: pagination_page_number, // 初期ページ番号
pageSize: 50, //表示するコンテンツ数
pageRange: 2, //選択されているページネーション番号の両隣に表示する個数
@ -205,6 +195,19 @@
callback: function(data, pagination) {
sessionStorage.setItem('pagination_page_number',pagination.pageNumber);
$('#result_data').html(pagination_content(data))
$('.paginationjs-pages > ul > li').not('.disabled,.active').each(function(index, val) {
// paginationにtabindexをつける
$(val).attr('tabindex', '0')
// Enterキー押下時に要素をクリックできるようにイベントを付加する
$(val).on('keypress', function(e) {
if (e.code === 'Enter') {
$(e.target).click()
$(val).off('keypress')
return false
}
$(val).off('keypress')
})
})
}
})
});
@ -243,6 +246,19 @@
})
}
function generateSearchResult(){
const searchResultData = []
// {% if ultmarc.is_form_submitted() and not (ultmarc.is_data_overflow_max_length() or ultmarc.is_data_empty()) %}
// {% autoescape False%}
// ジェネレータですこしずつ取得してリストに詰める
// {% for ultmarc_data_json_str in ultmarc.ultmarc_data_json_str() %}
searchResultData.push(...JSON.parse('{{ultmarc_data_json_str}}'))
// {% endfor %}
// {% endautoescape%}
// {% endif %}
return searchResultData
}
// チェックボックスのチェックされている場合、施設情報ボタンを活性化させる
function resultBtDisabled(){
var checkboxes = $('input[name="data"]:checked').length;