diff --git a/resources/js/src/database/multi_table_query.ts b/resources/js/src/database/multi_table_query.ts index c3fdd63da0..fe803e1c25 100644 --- a/resources/js/src/database/multi_table_query.ts +++ b/resources/js/src/database/multi_table_query.ts @@ -51,6 +51,10 @@ AJAX.registerOnload('database/multi_table_query.js', function () { return ['IN (...)', 'NOT IN (...)']; } + function opsWithTwoArgs (): string[] { + return ['BETWEEN', 'NOT BETWEEN']; + } + $('#update_query_button').on('click', function () { var columns = []; var tableAliases = {}; @@ -200,10 +204,13 @@ AJAX.registerOnload('database/multi_table_query.js', function () { }); const acceptsMultipleArgs: string[] = opsWithMultipleArgs(); + const acceptsTwoArgs: string[] = opsWithTwoArgs(); $('.criteria_op').each(function () { $(this).on('change', function () { if (acceptsMultipleArgs.includes($(this).val().toString())) { showMultiFields($(this)); + } else if (acceptsTwoArgs.includes($(this).val().toString())) { + showTwoFields($(this)); } else { const options: JQuery = $(this).closest('table').find('.options'); options.parent().prepend(''); @@ -212,14 +219,33 @@ AJAX.registerOnload('database/multi_table_query.js', function () { }); }); - function showMultiFields (opSelect: JQuery) { - const criteriaInput: JQuery = opSelect.closest('table').find('.rhs_text_val'); - const criteriaInputCol: JQuery = criteriaInput.parent(); - const hasAtLeastOneOption: boolean = criteriaInputCol.find('.option').length > 0; + function showTwoFields (opSelect: JQuery) { + const critetiaRow: JQuery = opSelect.closest('table').find('.rhs_text'); + const critetiaCol: JQuery = critetiaRow.find('td').last(); + const criteriaInput: JQuery = critetiaCol.find('input').first(); - if (!hasAtLeastOneOption) { - criteriaInputCol.append(` -
+ if (critetiaCol.find('.binary').length === 0) { + critetiaCol.empty(); + + critetiaCol.append(` +
+ + +
+ `); + } + } + + function showMultiFields (opSelect: JQuery) { + const critetiaRow: JQuery = opSelect.closest('table').find('.rhs_text'); + const critetiaCol: JQuery = critetiaRow.find('td').last(); + const criteriaInput: JQuery = critetiaCol.find('input').first(); + + if (critetiaCol.find('.multi').length === 0) { + critetiaCol.empty(); + + critetiaCol.append(` +
@@ -227,8 +253,6 @@ AJAX.registerOnload('database/multi_table_query.js', function () {
`); } - - criteriaInput.remove(); } $('body').on('click', 'input.add-option', function () { diff --git a/resources/js/src/database/query_generator.ts b/resources/js/src/database/query_generator.ts index 79a63c549a..6a1dcba04f 100644 --- a/resources/js/src/database/query_generator.ts +++ b/resources/js/src/database/query_generator.ts @@ -29,8 +29,8 @@ function getFormatsText () { 'NOT LIKE %...%': ' NOT LIKE \'%%%s%%\'', 'IN (...)': ' IN (%s)', 'NOT IN (...)': ' NOT IN (%s)', - 'BETWEEN': ' BETWEEN \'%s\'', - 'NOT BETWEEN': ' NOT BETWEEN \'%s\'', + 'BETWEEN': ' BETWEEN \'%s\' AND \'%s\'', + 'NOT BETWEEN': ' NOT BETWEEN \'%s\' AND \'%s\'', 'REGEXP': ' REGEXP \'%s\'', 'REGEXP ^...$': ' REGEXP \'^%s$\'', 'NOT REGEXP': ' NOT REGEXP \'%s\'' @@ -45,6 +45,10 @@ function opsWithMultipleArgs (): string[] { return ['IN (...)', 'NOT IN (...)']; } +function opsWithTwoArgs (): string[] { + return ['BETWEEN', 'NOT BETWEEN']; +} + function isOpWithoutArg (op) { return opsWithoutArg().includes(op); } @@ -53,6 +57,10 @@ function acceptsMultipleValues (op: string): boolean { return opsWithMultipleArgs().includes(op); } +function acceptsTwoValues (op: string): boolean { + return opsWithTwoArgs().includes(op); +} + function joinWrappingElementsWith (array: string[], char: string, separator: string = ','): string { let string: string = ''; @@ -94,6 +102,11 @@ function generateCondition (criteriaDiv, table) { criteriaText = joinWrappingElementsWith(critertiaTextArray, '\''); query += window.sprintf(formatsText[criteriaOp], criteriaText); + } else if (acceptsTwoValues(criteriaOp)) { + const formatsText = getFormatsText(); + const valuesInputs = criteriaDiv.find('input.val'); + + query += window.sprintf(formatsText[criteriaOp], valuesInputs[0].value, valuesInputs[1].value); } else { const formatsText = getFormatsText(); diff --git a/src/Controllers/JavaScriptMessagesController.php b/src/Controllers/JavaScriptMessagesController.php index ebb2b0036b..45ba061f80 100644 --- a/src/Controllers/JavaScriptMessagesController.php +++ b/src/Controllers/JavaScriptMessagesController.php @@ -451,6 +451,8 @@ final class JavaScriptMessagesController implements InvocableController 'strConfirmTd' => __('Confirm transitive dependencies'), 'strSelectedTd' => __('Selected dependencies are as follows:'), 'strNoTdSelected' => __('No dependencies selected!'), + 'strFirstValuePlaceholder' => __('Enter first value'), + 'strSecondValuePlaceholder' => __('Enter second value'), /* For server/variables.js */ 'strSave' => __('Save'),