Skip to content

Commit

Permalink
Фильтрация по подсистемам #29
Browse files Browse the repository at this point in the history
  • Loading branch information
zerobig committed Jun 10, 2024
1 parent bd37cda commit 7449655
Show file tree
Hide file tree
Showing 6 changed files with 278 additions and 35 deletions.
20 changes: 18 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "vscode-1c-metadata-viewer",
"displayName": "1C Metadata Viewer",
"description": "Explore 1C:Enterprise 8 configuration in the usual way",
"version": "0.2.1",
"version": "0.2.2",
"publisher": "zerobig",
"license": "MIT",
"engines": {
Expand Down Expand Up @@ -101,6 +101,14 @@
{
"command": "metadataViewer.openMetadataProperties",
"title": "%1c-metadata-viewer.openMetadataProperties.title%"
},
{
"command": "metadataViewer.filterBySubsystem",
"title": "%1c-metadata-viewer.filterBySubsystem.title%"
},
{
"command": "metadataViewer.clearFilter",
"title": "%1c-metadata-viewer.clearFilter.title%"
}
],
"menus": {
Expand Down Expand Up @@ -173,7 +181,7 @@
{
"command": "metadataViewer.openXml",
"group": "xml",
"when": "viewItem && viewItem != command"
"when": "viewItem && viewItem != command && !(viewItem =~ /subsystem/)"
},
{
"command": "metadataViewer.openPredefinedData",
Expand All @@ -188,6 +196,14 @@
"command": "metadataViewer.openMetadataProperties",
"group": "metadata",
"when": "viewItem == main"
},
{
"command": "metadataViewer.filterBySubsystem",
"when": "viewItem =~ /subsystem/ && viewItem not in filteredConfigArray"
},
{
"command": "metadataViewer.clearFilter",
"when": "viewItem =~ /subsystem/ && viewItem in filteredConfigArray"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@
"1c-metadata-viewer.openPredefinedData.title": "Open predefined data",
"1c-metadata-viewer.searchDepth.title": "The number of nesting levels of directories in which 1C:Enterprise configurations are searched",
"1c-metadata-viewer.openHandler.title": "Open handler",
"1c-metadata-viewer.openMetadataProperties.title": "Properties"
"1c-metadata-viewer.openMetadataProperties.title": "Properties",
"1c-metadata-viewer.filterBySubsystem.title": "Filter by subsystem",
"1c-metadata-viewer.clearFilter.title": "Clear subsystem filter"
}
4 changes: 3 additions & 1 deletion package.nls.ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@
"1c-metadata-viewer.openPredefinedData.title": "Открыть предопределенные данные",
"1c-metadata-viewer.searchDepth.title": "Количество уровней вложенности каталогов в которых осуществляется поиск конфигураций 1С:Предприятия",
"1c-metadata-viewer.openHandler.title": "Открыть обработчик",
"1c-metadata-viewer.openMetadataProperties.title": "Свойства"
"1c-metadata-viewer.openMetadataProperties.title": "Свойства",
"1c-metadata-viewer.filterBySubsystem.title": "Фильтровать по подсистеме",
"1c-metadata-viewer.clearFilter.title": "Очистить фильтр по подсистеме"
}
107 changes: 94 additions & 13 deletions src/ConfigurationFormats/edt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@ import {
import { posix, resolve } from 'path';
import { Metadata } from './edtMetadataInterfaces';
import { ProgressLocation, window } from 'vscode';
import { NodeWithIdTreeDataProvider } from '../metadataView';

export class Edt {
private xmlPath: vscode.Uri;
private dataProvider: NodeWithIdTreeDataProvider;

constructor(xmlPath: vscode.Uri) {
constructor(xmlPath: vscode.Uri, dataProvider: NodeWithIdTreeDataProvider) {
this.xmlPath = xmlPath;
this.dataProvider = dataProvider;
}

createTreeElements(root: TreeItem) {
createTreeElements(root: TreeItem, subsystemFilter: string[]) {
window.withProgress({
location: ProgressLocation.Notification,
title: "Происходит загрузка конфигурации",
Expand Down Expand Up @@ -54,6 +57,10 @@ export class Edt {
const subTree: TreeItem[] = [...treeItem?.children ?? []];

for (const [indexOfObjects, obj] of objects.entries()) {
if (subsystemFilter.length && subsystemFilter.indexOf(obj) === -1) {
continue;
}

count++;

if (count % Math.round(total / 100) === 0) {
Expand All @@ -74,10 +81,59 @@ export class Edt {

treeItem!.children = subTree;
}

this.dataProvider.update();
}
}
console.timeEnd('edtDownload');
}); // WithProgress

if (subsystemFilter.length) {
// Нумераторы и последовательности в документах
if (root.children![3].children![1].children?.length === 0) {
root.children![3].children?.splice(1, 1);
}
if (root.children![3].children![0].children?.length === 0) {
root.children![3].children?.splice(0, 1);
}

// Очищаю пустые элементы
const indexesToDelete: number[] = [];
root.children?.forEach((ch, index) => {
if (!ch.children || ch.children.length === 0) {
indexesToDelete.push(index);
}
});
indexesToDelete.sort((a, b) => b - a);
indexesToDelete.forEach((d) => root.children?.splice(d, 1));

// Отдельно очищаю раздел "Общие"
indexesToDelete.splice(0);
root.children![0].children?.forEach((ch, index) => {
if (!ch.children || ch.children.length === 0) {
indexesToDelete.push(index);
}
});
indexesToDelete.sort((a, b) => b - a);
indexesToDelete.forEach((d) => root.children![0].children?.splice(d, 1));

// Ненужные вложенные подсистемы
this.removeSubSystems(root.children![0].children![0], subsystemFilter);
this.dataProvider.update();
}
}, ); // WithProgress
}

removeSubSystems(subsystemsTreeItem: TreeItem, subsystemFilter: string[]) {
const indexesToDelete: number[] = [];
subsystemsTreeItem.children?.forEach((ch, index) => {
if (subsystemFilter.indexOf(`Subsystem.${ch.label}`) === -1) {
indexesToDelete.push(index);
} else {
this.removeSubSystems(ch, subsystemFilter);
}
});
indexesToDelete.sort((a, b) => b - a);
indexesToDelete.forEach((d) => subsystemsTreeItem.children?.splice(d, 1));
}

async createElement(rootPath: string, objName: string) {
Expand Down Expand Up @@ -116,16 +172,23 @@ export class Edt {
const treeItemPath = `${treeItemIdSlash}${CreatePath(objectPath)}`;

switch (objName.split('.')[0]) {
case 'Subsystem':
case 'Subsystem': {
const { chilldren, content } = this.getSubsystemChildren(
elementObject,
folderUri,
posix.join(rootPath, objectPath)
);

return GetTreeItem(treeItemId, elementName ?? objName, {
icon: 'subsystem',
children: this.getSubsystemChildren(
elementObject,
folderUri,
posix.join(rootPath, objectPath)
),
context: `subsystem_${rootPath}`,
children: chilldren,
command: 'metadataViewer.filterBySubsystem',
commandTitle: 'Filter by subsystem',
commandArguments: content,
configType: 'edt'
});
}
case 'CommonModule':
return GetTreeItem(treeItemId, elementName ?? objName, {
icon: 'commonModule', context: 'module', path: treeItemPath,
Expand Down Expand Up @@ -310,8 +373,19 @@ export class Edt {
return null;
}

getSubsystemChildren(obj: any, folderUri: vscode.Uri, path: string): TreeItem[] | undefined {
getSubsystemChildren(obj: any, folderUri: vscode.Uri, path: string): {chilldren: TreeItem[] | undefined, content: string[] } {
const subtreeItems: TreeItem[] = [];
// добавляю к фильтру сами подсистемы с иерархией
const subsystemContent: string[] = [
...path.slice(path.indexOf('Subsystem')).replace(/Subsystems\//g, 'Subsystem.').split('/')
];
const rootPath = path.slice(0, path.indexOf('Subsystem') - 1);

if (obj.content && obj.content.length > 0) {
for (const content of obj.content) {
subsystemContent.push(content);
}
}

if (obj.subsystems && obj.subsystems.length > 0) {
for (const subsystem of obj.subsystems) {
Expand All @@ -333,15 +407,22 @@ export class Edt {
const elementObject = element[Object.keys(element)[1]];
const elementName = elementObject.name;

subtreeItems.push(GetTreeItem(`${subPath}/${elementObject.$_uuid}`, elementName ?? subsystem, {
icon: 'subsystem', children: this.getSubsystemChildren(elementObject, folderUri, subPath),
const { chilldren, content } = this.getSubsystemChildren(elementObject, folderUri, subPath);

subtreeItems.push(GetTreeItem(`${rootPath}/${elementObject.$_uuid}`, elementName ?? subsystem, {
icon: 'subsystem',
context: `subsystem_${rootPath}`,
children: chilldren,
command: 'metadataViewer.filterBySubsystem',
commandTitle: 'Filter by subsystem',
commandArguments: content,
configType: 'edt'
}));
});
}
}

return subtreeItems;
return { chilldren: subtreeItems, content: subsystemContent };
}

fillObjectItemsByMetadata(idPrefix: string, metadataType: string, metadata: Metadata) {
Expand Down
4 changes: 2 additions & 2 deletions src/ConfigurationFormats/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export class TreeItem extends vscode.TreeItem {
// TODO: Ужасная функция!!!1 Первая очередь на рефакторинг!
export function CreatePath(name: string): string {
return name
.replace("Subsystem.", "Subsystems/")
.replace(/Subsystem\./g, "Subsystems/")
.replace("CommonModule.", "CommonModules/")
.replace("SessionParameter.", "SessionParameters/")
.replace("Role.", "Roles/")
Expand Down Expand Up @@ -154,7 +154,7 @@ export function GetTreeItem(
treeItem.command = {
command: params.command,
title: params.commandTitle,
arguments: [...(params.commandArguments ?? []), treeItem.configType],
arguments: params.commandArguments ?? [],
};
}

Expand Down
Loading

0 comments on commit 7449655

Please sign in to comment.