From 6546d15a0520f4c3463e035fe48518f5113f54fd Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 10:55:19 +0900 Subject: [PATCH 1/8] Update morebits.js --- morebits.js | 86 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/morebits.js b/morebits.js index e6e85a57a..1ec7a0414 100644 --- a/morebits.js +++ b/morebits.js @@ -353,7 +353,7 @@ Morebits.quickForm.prototype.append = function QuickFormAppend(data) { * - `number`: A number input box. * - Attributes: Everything the text `input` has, as well as: min, max, step, list * - `dyninput`: A set of text boxes with "Remove" buttons and an "Add" button. - * - Attributes: name, label, min, max, sublabel, value, size, maxlength, event + * - Attributes: name, label, min, max, inputs, sublabel, value, size, maxlength, event * - `hidden`: An invisible form field. * - Attributes: name, value * - `header`: A level 5 header. @@ -371,7 +371,7 @@ Morebits.quickForm.prototype.append = function QuickFormAppend(data) { * There is some difference on how types handle the `label` attribute: * - `div`, `select`, `field`, `checkbox`/`radio`, `input`, `textarea`, `header`, and `dyninput` can accept an array of items, * and the label item(s) can be `Element`s. - * - `option`, `optgroup`, `_dyninput_element`, `submit`, and `button` accept only a single string. + * - `option`, `optgroup`, `_dyninput_cell`, `submit`, and `button` accept only a single string. * * @memberof Morebits.quickForm * @class @@ -730,14 +730,17 @@ Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( var moreButton = more[1]; var sublist = { - type: '_dyninput_element', - label: data.sublabel || data.label, - name: data.name, - value: data.value, - size: data.size, + type: '_dyninput_row', remove: false, maxlength: data.maxlength, - event: data.event + event: data.event, + inputs: data.inputs || [{ + // compatibility + label: data.sublabel || data.label, + name: data.name, + value: data.value, + size: data.size + }] }; for (i = 0; i < min; ++i) { @@ -753,9 +756,38 @@ Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( moreButton.max = max - min; moreButton.counter = 0; break; - case '_dyninput_element': // Private, similar to normal input + case '_dyninput_row': // Private, similar to normal input node = document.createElement('div'); + data.inputs.forEach(function(subdata) { + var cell = new Morebits.quickForm.element($.extend(subdata, { type: '_dyninput_cell' })); + node.appendChild(cell.render()); + }); + if (data.remove) { + var remove = this.compute({ + type: 'button', + label: 'remove', + event: function(e) { + var list = e.target.listnode; + var node = e.target.inputnode; + var more = e.target.morebutton; + + list.removeChild(node); + --more.counter; + more.removeAttribute('disabled'); + e.stopPropagation(); + } + }); + node.appendChild(remove[0]); + var removeButton = remove[1]; + removeButton.inputnode = node; + removeButton.listnode = data.listnode; + removeButton.morebutton = data.morebutton; + } + break; + case '_dyninput_cell': // Private, similar to normal input + node = document.createElement('span'); + if (data.label) { label = node.appendChild(document.createElement('label')); label.appendChild(document.createTextNode(data.label)); @@ -769,36 +801,23 @@ Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( } subnode.setAttribute('name', data.name); subnode.setAttribute('type', 'text'); + subnode.setAttribute('data-dyninput', 'data-dyninput'); if (data.size) { subnode.setAttribute('size', data.size); } if (data.maxlength) { subnode.setAttribute('maxlength', data.maxlength); } + if (data.required) { + subnode.setAttribute('required', 'required'); + } + if (data.disabled) { + subnode.setAttribute('required', 'disabled'); + } if (data.event) { subnode.addEventListener('keyup', data.event, false); } - if (data.remove) { - var remove = this.compute({ - type: 'button', - label: 'remove', - event: function(e) { - var list = e.target.listnode; - var node = e.target.inputnode; - var more = e.target.morebutton; - - list.removeChild(node); - --more.counter; - more.removeAttribute('disabled'); - e.stopPropagation(); - } - }); - node.appendChild(remove[0]); - var removeButton = remove[1]; - removeButton.inputnode = node; - removeButton.listnode = data.listnode; - removeButton.morebutton = data.morebutton; - } + node.style.marginRight = '3px'; break; case 'hidden': node = document.createElement('input'); @@ -979,7 +998,12 @@ Morebits.quickForm.getInputData = function(form) { break; case 'text': // falls through case 'textarea': - result[fieldNameNorm] = field.value.trim(); + if (field.dataset.dyninput) { + result[fieldNameNorm] = result[fieldNameNorm] || []; + result[fieldNameNorm].push(field.value.trim()); + } else { + result[fieldNameNorm] = field.value.trim(); + } break; default: // could be select-one, date, number, email, etc if (field.value) { From 05b0d1ebb7259cd562299c59b46caef3fd74352e Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:10:51 +0900 Subject: [PATCH 2/8] Update morebits.js --- morebits.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/morebits.js b/morebits.js index 1ec7a0414..416c62d04 100644 --- a/morebits.js +++ b/morebits.js @@ -791,11 +791,12 @@ Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( if (data.label) { label = node.appendChild(document.createElement('label')); label.appendChild(document.createTextNode(data.label)); - label.setAttribute('for', id); + label.setAttribute('for', id + '_input'); label.style.marginRight = '3px'; } subnode = node.appendChild(document.createElement('input')); + subnode.setAttribute('id', id + '_input'); if (data.value) { subnode.setAttribute('value', data.value); } From 3f34791439dc368f4473a8c60ccec7c8a983596d Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:11:34 +0900 Subject: [PATCH 3/8] Update twinklexfd.js --- modules/twinklexfd.js | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/modules/twinklexfd.js b/modules/twinklexfd.js index d6b80ebe9..8f1ed62bf 100644 --- a/modules/twinklexfd.js +++ b/modules/twinklexfd.js @@ -685,7 +685,8 @@ Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory tooltip: 'Use this option when you are unable to perform this uncontroversial move yourself because of a technical reason (e.g. a page already exists at the new title, or the page is protected)', checked: false, event: function() { - form.newname.required = this.checked; + $('input[name="newname"]', form).prop('required', this.checked); + $('input[type="button"][value="more"]')[0].sublist.inputs[1].required = this.checked; }, subgroup: { type: 'checkbox', @@ -703,15 +704,27 @@ Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory ] }); work_area.append({ - type: 'input', - name: 'newname', - label: 'New title:', - tooltip: 'Required for technical requests. Otherwise, if unsure of the appropriate title, you may leave it blank.' + type: 'dyninput', + inputs: [ + { + label: 'From:', + name: 'currentname', + required: true + }, + { + label: 'To:', + name: 'newname', + tooltip: 'Required for technical requests. Otherwise, if unsure of the appropriate title, you may leave it blank.' + } + ], + min: 1 }); appendReasonBox(); work_area = work_area.render(); old_area.parentNode.replaceChild(work_area, old_area); + + form.currentname.value = Morebits.pageNameNorm; break; default: @@ -764,12 +777,19 @@ Twinkle.xfd.callbacks = { // U+00A0 NO-BREAK SPACE; U+2013 EN RULE } if (venue === 'rm') { - // even if invoked from talk page, propose the subject page for move - var pageName = new mw.Title(Morebits.pageNameNorm).getSubjectPage().toText(); - var rmtrDiscuss = params['rmtr-discuss'] ? '|discuss=no' : ''; - var rmtr = '{{subst:RMassist|1=' + pageName + '|2=' + params.newname + rmtrDiscuss + '|reason=' + params.reason + '}}'; - var requestedMove = '{{subst:Requested move|current1=' + pageName + '|new1=' + params.newname + '|reason=' + params.reason + '}}'; - return params.rmtr ? rmtr : requestedMove; + if (params.rmtr) { + var rmtrDiscuss = params['rmtr-discuss'] ? '|discuss=no' : ''; + return params.currentname + .map((currentname, i) => `{{subst:RMassist|1=${currentname}|2=${params.newname[i] || ''}${rmtrDiscuss}|reason=${params.reason}}}`) + .filter(Boolean) + .join('\n'); + } else { + return `{{subst:Requested move${ + params.currentname + .map((currentname, i) => `|current${i + 1}=${currentname}|new${i + 1}=${params.newname[i] || ''}`) + .join('') + }|reason=${params.reason}}}`; + } } var text = '{{subst:' + venue + '2'; From 4f1288528156d1fe272ae42dc8821642146f4bd8 Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:15:13 +0900 Subject: [PATCH 4/8] Update twinklexfd.js --- modules/twinklexfd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/twinklexfd.js b/modules/twinklexfd.js index 8f1ed62bf..fecf86954 100644 --- a/modules/twinklexfd.js +++ b/modules/twinklexfd.js @@ -686,7 +686,7 @@ Twinkle.xfd.callback.change_category = function twinklexfdCallbackChangeCategory checked: false, event: function() { $('input[name="newname"]', form).prop('required', this.checked); - $('input[type="button"][value="more"]')[0].sublist.inputs[1].required = this.checked; + $('input[type="button"][value="more"]', form)[0].sublist.inputs[1].required = this.checked; }, subgroup: { type: 'checkbox', From 3cf651a44fc939b929a81f5fe45ff0b1b0301305 Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:16:42 +0900 Subject: [PATCH 5/8] Update twinklexfd.js --- modules/twinklexfd.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/twinklexfd.js b/modules/twinklexfd.js index fecf86954..660ba5aa2 100644 --- a/modules/twinklexfd.js +++ b/modules/twinklexfd.js @@ -781,7 +781,6 @@ Twinkle.xfd.callbacks = { var rmtrDiscuss = params['rmtr-discuss'] ? '|discuss=no' : ''; return params.currentname .map((currentname, i) => `{{subst:RMassist|1=${currentname}|2=${params.newname[i] || ''}${rmtrDiscuss}|reason=${params.reason}}}`) - .filter(Boolean) .join('\n'); } else { return `{{subst:Requested move${ From dfd0b73a4d8118428ba228456c5a61259a2d7844 Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:17:34 +0900 Subject: [PATCH 6/8] Update twinklexfd.js --- modules/twinklexfd.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/twinklexfd.js b/modules/twinklexfd.js index 660ba5aa2..74f1274ed 100644 --- a/modules/twinklexfd.js +++ b/modules/twinklexfd.js @@ -780,12 +780,12 @@ Twinkle.xfd.callbacks = { if (params.rmtr) { var rmtrDiscuss = params['rmtr-discuss'] ? '|discuss=no' : ''; return params.currentname - .map((currentname, i) => `{{subst:RMassist|1=${currentname}|2=${params.newname[i] || ''}${rmtrDiscuss}|reason=${params.reason}}}`) + .map((currentname, i) => `{{subst:RMassist|1=${currentname}|2=${params.newname[i]}${rmtrDiscuss}|reason=${params.reason}}}`) .join('\n'); } else { return `{{subst:Requested move${ params.currentname - .map((currentname, i) => `|current${i + 1}=${currentname}|new${i + 1}=${params.newname[i] || ''}`) + .map((currentname, i) => `|current${i + 1}=${currentname}|new${i + 1}=${params.newname[i]}`) .join('') }|reason=${params.reason}}}`; } From 98690bb92cf38764313f3b59e5d0dcadd042244a Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:19:29 +0900 Subject: [PATCH 7/8] Update morebits.js --- morebits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/morebits.js b/morebits.js index 416c62d04..42cebeba6 100644 --- a/morebits.js +++ b/morebits.js @@ -756,7 +756,7 @@ Morebits.quickForm.element.prototype.compute = function QuickFormElementCompute( moreButton.max = max - min; moreButton.counter = 0; break; - case '_dyninput_row': // Private, similar to normal input + case '_dyninput_row': // Private node = document.createElement('div'); data.inputs.forEach(function(subdata) { From efca3a1715ec95de8a2cbcd42badd8a30933873a Mon Sep 17 00:00:00 2001 From: Nardog Date: Sat, 11 Nov 2023 11:23:05 +0900 Subject: [PATCH 8/8] Update twinklexfd.js --- modules/twinklexfd.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/twinklexfd.js b/modules/twinklexfd.js index 74f1274ed..a1dd47e81 100644 --- a/modules/twinklexfd.js +++ b/modules/twinklexfd.js @@ -782,13 +782,12 @@ Twinkle.xfd.callbacks = { return params.currentname .map((currentname, i) => `{{subst:RMassist|1=${currentname}|2=${params.newname[i]}${rmtrDiscuss}|reason=${params.reason}}}`) .join('\n'); - } else { - return `{{subst:Requested move${ - params.currentname - .map((currentname, i) => `|current${i + 1}=${currentname}|new${i + 1}=${params.newname[i]}`) - .join('') - }|reason=${params.reason}}}`; } + return `{{subst:Requested move${ + params.currentname + .map((currentname, i) => `|current${i + 1}=${currentname}|new${i + 1}=${params.newname[i]}`) + .join('') + }|reason=${params.reason}}}`; } var text = '{{subst:' + venue + '2';