1
0
mirror of https://github.com/salexdv/bsl_console.git synced 2025-02-01 13:08:06 +02:00

Режим запроса: подсказки для ресурсов виртуальных таблицы регистров

This commit is contained in:
salexdv 2020-12-22 23:24:44 +03:00
parent 449a7914af
commit 5ec96f8c5c
3 changed files with 176 additions and 5 deletions

View File

@ -1713,6 +1713,84 @@ class bslHelper {
}
/**
* Returns subresources for the virtual table type
*
* @param {string} subTable subtable name like balance, turnovers, periodical
* @param {string} regType type of subtable like balance, turnovers, periodical
*
* @returns {array} array of subresources
*/
getGetVirtualTableSubresouces(subTable, regType) {
let subresouces = {};
if (engLang) {
if (subTable == 'balance') {
subresouces = {
"Balance": "(balance)"
};
}
else if (subTable == 'turnovers') {
if (regType == 'balance')
subresouces = {
"Receipt": "(receipt)",
"Expense": "(expense)",
"Turnover": "(turnover)"
};
else
subresouces = {
"Turnover": "(turnover)"
};
}
else if (subTable == 'balanceandturnovers') {
subresouces = {
"OpeningBalance": "(opening balance)",
"Receipt": "(receipt)",
"Expense": "(expense)",
"Turnover": "(turnover)",
"ClosingBalance": "(closing balance)"
};
}
}
else {
if (subTable == 'остатки') {
subresouces = {
"Остаток": "(остаток)"
};
}
else if (subTable == 'обороты') {
if (regType == 'balance')
subresouces = {
"Приход": "(приход)",
"Расход": "(расход)",
"Оборот": "(оборот)"
};
else
subresouces = {
"Оборот": "(оборот)"
};
}
else if (subTable == 'остаткииобороты') {
subresouces = {
"НачальныйОстаток": "(начальный остаток)",
"Приход": "(приход)",
"Расход": "(расход)",
"Оборот": "(оборот)",
"КонечныйОстаток": "(конечный остаток)"
};
}
}
return subresouces;
}
/**
* Gets the list of properties (attributes) owned by object
* (Catalog, Document, etc) and fills the suggestions by it
@ -1755,6 +1833,49 @@ class bslHelper {
});
}
let resources = [];
if (obj.hasOwnProperty('resources')) {
for (const [rkey, rvalue] of Object.entries(obj.resources)) {
resources.push({'label': rkey, 'name': rvalue.name});
}
let regType = obj.hasOwnProperty('type') ? obj.type : '';
let subresouces = this.getGetVirtualTableSubresouces(metadataSubtable, regType);
let subExists = false;
let items = [];
for (let idx = 0; idx < resources.length; idx++) {
let resource = resources[idx];
for (const [skey, svalue] of Object.entries(subresouces)) {
subExists = true;
items.push({'label': resource.label + skey, 'name': resource.name + ' ' + svalue});
}
if (!subExists)
items.push(resource);
}
for (let idx = 0; idx < items.length; idx++) {
let item = items[idx];
suggestions.push({
label: item.label,
kind: monaco.languages.CompletionItemKind.value,
insertText: item.label,
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
detail: item.name
});
}
}
}
}
@ -1914,13 +2035,13 @@ class bslHelper {
}
/**
* Returns temporary tables of register depending on the register's type
* Returns virtual tables of register depending on the register's type
*
* @param {string} type of register like balance, turnovers, periodical
*
* @returns {array} array of names
*/
getRegisterTempraryTables(type) {
getRegisterVirtualTables(type) {
let tables = {};
@ -1994,7 +2115,7 @@ class bslHelper {
}
/**
* Fills array of completition for temporary tables of registers in source
* Fills array of completition for virtual tables of registers in source
*
* @param {object} data objects from BSL-JSON dictionary
* @param {string} metadataItem name of metadata item like (ЦеныНоменклатуры/ProductPrices, СвободныеОстатки/AvailableStock)
@ -2006,7 +2127,7 @@ class bslHelper {
if (ikey.toLowerCase() == metadataItem.toLowerCase() && ivalue.hasOwnProperty('type')) {
let tables = this.getRegisterTempraryTables(ivalue.type);
let tables = this.getRegisterVirtualTables(ivalue.type);
for (const [tkey, tvalue] of Object.entries(tables)) {

View File

@ -1110,7 +1110,11 @@
'////////////////////////////////////////////////////////////////////////////////',
'ВЫБРАТЬ',
' Товары.Ссылка КАК Ссылка,',
' Цены.Цена КАК Цена',
' Цены.Цена КАК Цена,',
' Остатки.Номенклатура КАК Остатки_Номенклатура,',
' Обороты.Номенклатура КАК Обороты_Номенклатура,',
' ОстаткиИОбороты.Номенклатура КАК ОстаткиИОбороты_Номенклатура,',
' Продажи.Номенклатура КАК Продажи_Номенклатура',
'ИЗ',
' Справочник.Товары КАК Товары',
' ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(',
@ -1124,6 +1128,8 @@
' ПО Товары.Ссылка = Обороты.Номенклатура',
' ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты КАК ОстаткиИОбороты',
' ПО Товары.Ссылка = ОстаткиИОбороты.Номенклатура',
' ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК Продажи',
' ПО Товары.Ссылка = Продажи.Номеклатура',
'ГДЕ',
' Товары.Ссылка <> &Товар'
].join('\n');

View File

@ -218,6 +218,50 @@ describe("Проверка автокомлита и подсказок реда
assert.equal(suggestions.some(suggest => suggest.label === "ВидЦены"), true);
});
it("проверка подсказки полей виртуальной таблицы остатков", function () {
bsl = helper(getCode(), 1095, 10);
let suggestions = [];
bsl.getQueryFieldsCompletition(suggestions);
expect(suggestions).to.be.an('array').that.not.is.empty;
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), false);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), false);
});
it("проверка подсказки полей виртуальной таблицы остатков и оборотов", function () {
bsl = helper(getCode(), 1097, 18);
let suggestions = [];
bsl.getQueryFieldsCompletition(suggestions);
expect(suggestions).to.be.an('array').that.not.is.empty;
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false);
});
it("проверка подсказки полей виртуальной таблицы оборотов (вид регистра 'Остатки')", function () {
bsl = helper(getCode(), 1096, 10);
let suggestions = [];
bsl.getQueryFieldsCompletition(suggestions);
expect(suggestions).to.be.an('array').that.not.is.empty;
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false);
});
it("проверка подсказки полей виртуальной таблицы оборотов (вид регистра 'Обороты')", function () {
bsl = helper(getCode(), 1098, 10);
let suggestions = [];
bsl.getQueryFieldsCompletition(suggestions);
expect(suggestions).to.be.an('array').that.not.is.empty;
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОборот"), true);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоПриход"), false);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоОстаток"), false);
assert.equal(suggestions.some(suggest => suggest.label === "КоличествоНачальныйОстаток"), false);
});
switchQueryMode();
mocha.run();