mirror of
https://github.com/salexdv/bsl_console.git
synced 2024-11-28 08:48:48 +02:00
Подсказка методов для переменной в зависимости от того, является она объектом или ссылкой.
Например, когда переменная получена методами НайтиПоКоду или НайтиПоНаименованию, то показываются методы ссылок. Если переменная получена через ПолучитьОбъект, Скопировать, СоздатьДокумент (Элемент), то показываются методы объекта. Реализовано только для справочников и документов.
This commit is contained in:
parent
948756cd42
commit
1a249b6799
@ -83,6 +83,7 @@ define([], function () {
|
||||
"name_en":"FindByCode",
|
||||
"description":"Осуществляет поиск элемента по его коду.",
|
||||
"returns":"СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
"ref": "catalogs:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(Код, ПоискПоПолномуКоду, Родитель, Владелец) : СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
@ -100,6 +101,7 @@ define([], function () {
|
||||
"name_en":"FindByDescription",
|
||||
"description":"Осуществляет поиск элемента по его наименованию.",
|
||||
"returns":"СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
"ref": "catalogs:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(Наименование, ТочноеСоответствие?, Родитель?, Владелец?) : СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
@ -117,6 +119,7 @@ define([], function () {
|
||||
"name_en":"FindByAttribute",
|
||||
"description":"Осуществляет поиск элемента по значению реквизита.",
|
||||
"returns":"СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
"ref": "catalogs:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(ИмяРеквизита, ЗначениеРеквизита, Родитель?, Владелец?) : СправочникСсылка.<Имя справочника>; Неопределено",
|
||||
@ -176,6 +179,7 @@ define([], function () {
|
||||
"name_en":"GetRef",
|
||||
"description":"Формирует ссылку из значения типа УникальныйИдентификатор. Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор.",
|
||||
"returns":"СправочникСсылка",
|
||||
"ref": "catalogs:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(УникальныйИдентификатор) : СправочникСсылка",
|
||||
@ -285,19 +289,22 @@ define([], function () {
|
||||
"name":"ПустаяСсылка",
|
||||
"name_en":"EmptyRef",
|
||||
"description":"Получает пустое значение ссылки на справочник данного вида.",
|
||||
"returns":"СправочникСсылка"
|
||||
"returns":"СправочникСсылка",
|
||||
"ref": "catalogs:ref"
|
||||
},
|
||||
"СоздатьГруппу":{
|
||||
"name":"СоздатьГруппу",
|
||||
"name_en":"CreateFolder",
|
||||
"description":"Создает новую группу справочника.",
|
||||
"returns":"СправочникОбъект"
|
||||
"returns":"СправочникОбъект",
|
||||
"ref": "catalogs:obj"
|
||||
},
|
||||
"СоздатьЭлемент":{
|
||||
"name":"СоздатьЭлемент",
|
||||
"name_en":"CreateItem",
|
||||
"description":"Создает новый элемент справочника.",
|
||||
"returns":"СправочникОбъект"
|
||||
"returns":"СправочникОбъект",
|
||||
"ref": "catalogs:obj"
|
||||
}
|
||||
},
|
||||
"objMethods":{
|
||||
@ -384,7 +391,8 @@ define([], function () {
|
||||
"name":"Скопировать",
|
||||
"name_en":"Copy",
|
||||
"description":"Создает новый элемент справочника копированием существующего",
|
||||
"returns":"СправочникОбъект"
|
||||
"returns":"СправочникОбъект",
|
||||
"ref": "catalogs:obj"
|
||||
},
|
||||
"Удалить":{
|
||||
"name":"Удалить",
|
||||
@ -471,7 +479,8 @@ define([], function () {
|
||||
"name":"Скопировать",
|
||||
"name_en":"Copy",
|
||||
"description":"Создает новый элемент справочника копированием существующего",
|
||||
"returns":"СправочникОбъект"
|
||||
"returns":"СправочникОбъект",
|
||||
"ref": "catalogs:obj"
|
||||
},
|
||||
"Уровень":{
|
||||
"name":"Уровень",
|
||||
@ -483,7 +492,8 @@ define([], function () {
|
||||
"name":"ПолучитьОбъект",
|
||||
"name_en":"GetObject",
|
||||
"description":"Получает по ссылке объект, предназначенный для модификации справочника.",
|
||||
"returns":"СправочникОбъект/Неопределено, Неопределено - объекта в базе нет (например, при обмене данными или после непосредственного удаления объекта, на который есть ссылки)."
|
||||
"returns":"СправочникОбъект/Неопределено, Неопределено - объекта в базе нет (например, при обмене данными или после непосредственного удаления объекта, на который есть ссылки).",
|
||||
"ref": "catalogs:obj"
|
||||
},
|
||||
"Пустая":{
|
||||
"name":"Пустая",
|
||||
@ -551,6 +561,7 @@ define([], function () {
|
||||
"name_en":"FindByNumber",
|
||||
"description":"Осуществляет поиск документа по номеру.",
|
||||
"returns":"ДокументСсылка.<Имя документа>; Неопределено.",
|
||||
"ref": "documents:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(НомерДокумента, ДатаИнтервала) : ДокументСсылка.<Имя справочника>; Неопределено",
|
||||
@ -566,6 +577,7 @@ define([], function () {
|
||||
"name_en":"FindByAttribute",
|
||||
"description":"Осуществляет поиск документа по реквизиту.",
|
||||
"returns":"ДокументСсылка",
|
||||
"ref": "documents:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(ИмяРеквизита, ЗначениеРеквизита) : ДокументСсылка",
|
||||
@ -609,6 +621,7 @@ define([], function () {
|
||||
"name_en":"GetRef",
|
||||
"description":"Формирует ссылку из значения типа УникальныйИдентификатор. Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор.",
|
||||
"returns":"ДокументСсылка",
|
||||
"ref": "documents:ref",
|
||||
"signature":{
|
||||
"default":{
|
||||
"СтрокаПараметров":"(УникальныйИдентификатор) : ДокументСсылка",
|
||||
@ -686,13 +699,15 @@ define([], function () {
|
||||
"name":"ПустаяСсылка",
|
||||
"name_en":"EmptyRef",
|
||||
"description":"Получает пустое значение ссылки на документ данного вида.",
|
||||
"returns":"ДокументСсылка"
|
||||
"returns":"ДокументСсылка",
|
||||
"ref": "documents:ref"
|
||||
},
|
||||
"СоздатьДокумент":{
|
||||
"name":"СоздатьДокумент",
|
||||
"name_en":"CreateDocument",
|
||||
"description":"Создает новый документ.",
|
||||
"returns":"ДокументОбъект"
|
||||
"returns":"ДокументОбъект",
|
||||
"ref": "documents:obj"
|
||||
}
|
||||
},
|
||||
"objMethods":{
|
||||
@ -808,7 +823,8 @@ define([], function () {
|
||||
"name":"Скопировать",
|
||||
"name_en":"Copy",
|
||||
"description":"Создает новый документ копированием существующего.",
|
||||
"returns":"ДокументОбъект"
|
||||
"returns":"ДокументОбъект",
|
||||
"ref": "documents:obj"
|
||||
},
|
||||
"Удалить":{
|
||||
"name":"Удалить",
|
||||
@ -908,7 +924,8 @@ define([], function () {
|
||||
"name":"ПолучитьОбъект",
|
||||
"name_en":"GetObject",
|
||||
"description":"Получает по ссылке объект, предназначенный для модификации докумнгьа.",
|
||||
"returns":"ДокументОбъект/Неопределено, Неопределено - объекта в базе нет (например, при обмене данными или после непосредственного удаления объекта, на который есть ссылки)."
|
||||
"returns":"ДокументОбъект/Неопределено, Неопределено - объекта в базе нет (например, при обмене данными или после непосредственного удаления объекта, на который есть ссылки).",
|
||||
"ref": "documents:obj"
|
||||
},
|
||||
"Пустая":{
|
||||
"name":"Пустая",
|
||||
|
@ -397,7 +397,7 @@ class bslHelper {
|
||||
* @param {object} obj object from BSL-JSON dictionary
|
||||
* @param {sting} methodsName the name of node (objMethods, refMethods)
|
||||
*/
|
||||
getMetadataMethods(suggestions, obj, methodsName) {
|
||||
getMetadataMethods(suggestions, obj, methodsName, metadataKey, medatadaName) {
|
||||
|
||||
if (obj.hasOwnProperty(methodsName)) {
|
||||
|
||||
@ -417,6 +417,12 @@ class bslHelper {
|
||||
if (mvalue.hasOwnProperty('ref'))
|
||||
ref = mvalue.ref;
|
||||
|
||||
if (ref && ref.indexOf(':') != -1) {
|
||||
if (metadataKey && medatadaName) {
|
||||
ref = metadataKey + '.' + medatadaName + '.' +((ref.indexOf(':obj') != -1) ? 'obj' : 'ref');
|
||||
}
|
||||
}
|
||||
|
||||
if (ref || signatures.length) {
|
||||
// If the attribute contains a ref, we need to run the command to save the position of ref
|
||||
command = { id: 'vs.editor.ICodeEditor:1:saveref', arguments: [{ "name": mvalue[this.nameField], "data": { "ref": ref, "sig": signatures } }] }
|
||||
@ -454,7 +460,7 @@ class bslHelper {
|
||||
|
||||
let refArray = arrRefs[i].trim().split('.');
|
||||
|
||||
if (refArray.length == 2) {
|
||||
if (refArray.length >= 2) {
|
||||
|
||||
let itemName = refArray[0];
|
||||
let subItemName = refArray[1];
|
||||
@ -466,9 +472,11 @@ class bslHelper {
|
||||
}
|
||||
else {
|
||||
|
||||
let methodsName = (refArray.length == 3 && refArray[2] == 'ref') ? 'refMethods' : 'objMethods'
|
||||
|
||||
if (this.objectHasProperties(bslMetadata, itemName, 'items', subItemName, 'properties')) {
|
||||
this.fillSuggestionsForMetadataItem(suggestions, bslMetadata[itemName].items[subItemName]);
|
||||
this.getMetadataMethods(suggestions, bslMetadata[itemName], 'refMethods');
|
||||
this.getMetadataMethods(suggestions, bslMetadata[itemName], methodsName, itemName, subItemName);
|
||||
}
|
||||
|
||||
}
|
||||
@ -488,7 +496,7 @@ class bslHelper {
|
||||
* Fills the suggestions for reference-type object
|
||||
* if a reference was found in the previous position
|
||||
*
|
||||
* @param {aaray} suggestions the list of suggestions
|
||||
* @param {array} suggestions the list of suggestions
|
||||
*/
|
||||
getRefCompletition(suggestions) {
|
||||
|
||||
@ -574,7 +582,7 @@ class bslHelper {
|
||||
if (ikey.toLowerCase() == objName) {
|
||||
|
||||
this.fillSuggestionsForMetadataItem(suggestions, ivalue);
|
||||
this.getMetadataMethods(suggestions, ivalue, 'methods');
|
||||
this.getMetadataMethods(suggestions, ivalue, 'methods', null, null);
|
||||
|
||||
if (ivalue.hasOwnProperty('ref'))
|
||||
this.getRefSuggestions(suggestions, ivalue)
|
||||
@ -824,6 +832,57 @@ class bslHelper {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks metadata's method by name in certain types of methods
|
||||
* like 'methods' (CatalogsManager, DocumentsManages),
|
||||
* 'objMethods' - methods belong to the object
|
||||
* 'refMethods' - methods belong to the ref
|
||||
*
|
||||
* @param {object} metadataObj metadata objects from BSL-JSON dictionary
|
||||
* @param {string} metadataFunc name of method (func)
|
||||
*
|
||||
* @returns {object} object of method or false
|
||||
*/
|
||||
findMetadataMethodByName(metadataObj, methodsName, metadataFunc) {
|
||||
|
||||
if (metadataObj.hasOwnProperty(methodsName)) {
|
||||
|
||||
for (const [key, value] of Object.entries(metadataObj[methodsName])) {
|
||||
|
||||
if (value[this.nameField].toLowerCase() == metadataFunc) {
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds metadata's method by name
|
||||
*
|
||||
* @param {object} metadataObj metadata objects from BSL-JSON dictionary
|
||||
* @param {string} metadataFunc name of method (func)
|
||||
*
|
||||
* @returns {object} object of method or false
|
||||
*/
|
||||
getMetadataMethodByName(metadataObj, metadataFunc) {
|
||||
|
||||
let method = this.findMetadataMethodByName(metadataObj, 'methods', metadataFunc);
|
||||
|
||||
if (!method)
|
||||
method = this.findMetadataMethodByName(metadataObj, 'objMethods', metadataFunc);
|
||||
|
||||
if (!method)
|
||||
method = this.findMetadataMethodByName(metadataObj, 'refMethods', metadataFunc);
|
||||
|
||||
return method;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills array of completition for metadata subitem like catalog of products
|
||||
*
|
||||
@ -868,9 +927,13 @@ class bslHelper {
|
||||
for (const [ikey, ivalue] of Object.entries(value.items)) {
|
||||
|
||||
if (ikey.toLowerCase() == metadataItem) {
|
||||
|
||||
let methodDef = this.getMetadataMethodByName(value, metadataFunc);
|
||||
let methodsName = (methodDef && methodDef.hasOwnProperty('ref') && methodDef.ref.indexOf(':ref') != -1) ? 'refMethods' : 'objMethods';
|
||||
|
||||
itemExists = true;
|
||||
this.fillSuggestionsForMetadataItem(suggestions, ivalue);
|
||||
this.getMetadataMethods(suggestions, value, 'objMethods');
|
||||
this.getMetadataMethods(suggestions, value, methodsName, key, ikey);
|
||||
}
|
||||
|
||||
}
|
||||
|
12
src/test.js
12
src/test.js
@ -564,6 +564,18 @@ describe("Проверка автокомлита и подсказок реда
|
||||
switchQueryMode();
|
||||
});
|
||||
|
||||
it("проверка подсказки объекта, полученного методом ПолучитьОбъект()", function () {
|
||||
bsl = helper('СправочникСсылка = Справочник.Товары.НайтиПоКоду(1);\nСправочникОбъект = СправочникСсылка.ПолучитьОбъект();\nСправочникОбъект.');
|
||||
let suggestions = [];
|
||||
contextData = new Map([
|
||||
[2, new Map([["получитьобъект", { "ref": "catalogs.Товары.obj", "sig": null }]])],
|
||||
]);
|
||||
bsl.getRefCompletition(suggestions);
|
||||
expect(suggestions).to.be.an('array').that.not.is.empty;
|
||||
assert.equal(suggestions.some(suggest => suggest.label === "Заблокирован"), true);
|
||||
contextData = new Map();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
mocha.run();
|
||||
|
Loading…
Reference in New Issue
Block a user