--- title: MultiSelectDialog Bug --- ## Frappe MultiSelectDialog Bug 在 MultiSelectDialog 中使用 Filter 時,會發生已刪除的 Filter ,仍舊會包含在送出的查詢中,翻了 Frappe 的原始碼後也不太清楚是為什麼會造成這個狀況,因此選擇透過覆寫的方式,修改 JS ```frappe.ui.form.MultiSelectDialog``` 的 ``` get_args_for_search ``` 方法。 [Origin Source](https://github.com/frappe/frappe/blob/version-13/frappe/public/js/frappe/form/multi_select_dialog.js#L478) Update Script: ```javascript= get_args_for_search() { let [filters, filter_fields] = this.get_filters_from_setters(); let curr_custom_filters = this.get_custom_filters() // 比對當前的 filter 與前次 filter 是否有被移除的 key let remove_filter_key = [] if(this.prev_custom_filters != undefined){ Object.keys(this.prev_custom_filters).forEach((key) => { if(!Object.keys(curr_custom_filters).includes(key)){ remove_filter_key.push(key) } }) } let custom_filters = this.get_custom_filters(); this.prev_custom_filters = custom_filters Object.assign(filters, custom_filters); let new_filters = {} // 排除掉前次被移除的 filter 與 ˊ比對值為 undefined 的條件 Object.keys(filters).forEach((key) => { if(!remove_filter_key.includes(key)){ if($.isArray(filters[key])){ if(filters[key][1] != undefined){ new_filters[key] = filters[key] } }else{ new_filters[key] = filters[key] } } }) // 更新 get_query, 確保 get_filters_from_setters 抓到的 filter 是最新的 this.get_query = function(){ return {filters: new_filters} } return { doctype: this.doctype, txt: this.dialog.fields_dict["search_term"].get_value(), filters: new_filters, filter_fields: filter_fields, start: this.start, page_length: this.page_length + 1, query: this.get_query ? this.get_query().query : '', as_dict: 1 }; } ```