diff --git a/tcms/static/js/utils.js b/tcms/static/js/utils.js index 8e912edad7..27c5b66891 100644 --- a/tcms/static/js/utils.js +++ b/tcms/static/js/utils.js @@ -560,6 +560,186 @@ export function showOrHideMultipleRows (rootSelector, rows) { } } +/* + Reusable duplicate-check logic for "new" forms. + + config = { + rpcMethod: 'TestCase.filter', // JSON-RPC method + fieldName: 'summary', // model field name + inputSelector: '#id_summary', // input element + groupSelector: '#summary-group', // form-group with data-trans-* attrs + warningSelector:'#duplicate-summary-warning', + autocompleteSelector: '#summary-autocomplete', + modalSelector: '#duplicate-tc-modal', + prefix: 'TC', // display prefix, e.g. TC, TR, TP + detailUrlBase: '/case/', // URL path for detail view + modalRows: function(g, item) {}, // returns array of [label, value] + descriptionField: 'text' // field name for markdown description, or null + } +*/ +export function initDuplicateCheck (config) { + const duplicateWarning = $(config.warningSelector) + if (!duplicateWarning.length) { + return + } + + const group = $(config.groupSelector) + const input = $(config.inputSelector) + const autocomplete = $(config.autocompleteSelector) + const modal = $(config.modalSelector) + const maxItems = 10 + let debounceTimer = null + let duplicateMatches = [] + + function showModal (item) { + const g = group.data.bind(group) + $('#duplicate-modal-title').text( + g('trans-duplicate-modal-title') + ' - ' + config.prefix + '-' + item.id + ) + + $('#duplicate-modal-view-btn').attr('href', config.detailUrlBase + item.id + '/') + $('#duplicate-modal-view-label').text( + g('trans-duplicate-modal-view') + ' ' + config.prefix + '-' + item.id + ) + + const body = $('#duplicate-modal-body') + body.empty() + + const table = $('