SUPPORT-8728: перенос и удаление неиспользуемых методов
This commit is contained in:
parent
34ca75241d
commit
96767eefde
25 changed files with 127 additions and 1167 deletions
|
|
@ -12,7 +12,6 @@ public class TreeItemDto {
|
||||||
public String label;
|
public String label;
|
||||||
public TreeItemDto[] children;
|
public TreeItemDto[] children;
|
||||||
public Object businessId;
|
public Object businessId;
|
||||||
public String domainId;
|
|
||||||
|
|
||||||
public TreeItemDto(Object id, Object parentId, String label) {
|
public TreeItemDto(Object id, Object parentId, String label) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,4 @@ public class TreeItemRpcService extends Behavior {
|
||||||
public List<TreeItemDto> loadTreeData() {
|
public List<TreeItemDto> loadTreeData() {
|
||||||
return treeItemService.loadTreeData();
|
return treeItemService.loadTreeData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@RpcCall
|
|
||||||
public List<TreeItemDto> loadTreeDataByDomainId(String domainId) {
|
|
||||||
return treeItemService.loadTreeDataByDomainId(domainId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,39 +39,14 @@ public class TreeItemService {
|
||||||
public EntityColumn labelColumn;
|
public EntityColumn labelColumn;
|
||||||
@GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
|
@GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
|
||||||
public EntityColumn businessIdColumn;
|
public EntityColumn businessIdColumn;
|
||||||
@GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
|
|
||||||
public EntityColumn domainIdColumn;
|
|
||||||
|
|
||||||
public List<TreeItemDto> loadTreeData() {
|
public List<TreeItemDto> loadTreeData() {
|
||||||
List<TreeItemDto> loadedTreeItems = loadTreeItems();
|
List<TreeItemDto> loadedTreeItems = loadTreeItems();
|
||||||
loadedTreeItems.forEach(item -> item.domainId = null);
|
|
||||||
return loadedTreeItems.stream()
|
return loadedTreeItems.stream()
|
||||||
.filter(item -> item.parentId == null)
|
.filter(item -> item.parentId == null)
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TreeItemDto> loadTreeDataByDomainId(String domainId) {
|
|
||||||
if (domainId == null || domainIdColumn == null) {
|
|
||||||
return loadTreeData();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<TreeItemDto> filteredTreeItems = loadTreeItems().stream()
|
|
||||||
.filter(item -> item.domainId.equalsIgnoreCase(domainId))
|
|
||||||
.toList();
|
|
||||||
filteredTreeItems.forEach(this::setDomainIdToNull);
|
|
||||||
return filteredTreeItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setDomainIdToNull(TreeItemDto treeItem) {
|
|
||||||
treeItem.domainId = null;
|
|
||||||
TreeItemDto[] treeItemChildren = treeItem.children;
|
|
||||||
if (treeItemChildren != null && treeItemChildren.length > 0) {
|
|
||||||
for (TreeItemDto child : treeItemChildren) {
|
|
||||||
setDomainIdToNull(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<TreeItemDto> loadTreeItems() {
|
private List<TreeItemDto> loadTreeItems() {
|
||||||
List<TreeItemDto> loadedList = this.loadDao.load(getColumns(), new LoadOptions()).stream()
|
List<TreeItemDto> loadedList = this.loadDao.load(getColumns(), new LoadOptions()).stream()
|
||||||
.map(this::toTreeItemDto)
|
.map(this::toTreeItemDto)
|
||||||
|
|
@ -105,9 +80,6 @@ public class TreeItemService {
|
||||||
if (businessIdColumn != null) {
|
if (businessIdColumn != null) {
|
||||||
columnSet.add(businessIdColumn);
|
columnSet.add(businessIdColumn);
|
||||||
}
|
}
|
||||||
if (domainIdColumn != null) {
|
|
||||||
columnSet.add(domainIdColumn);
|
|
||||||
}
|
|
||||||
return columnSet;
|
return columnSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,9 +90,6 @@ public class TreeItemService {
|
||||||
if (businessIdColumn != null) {
|
if (businessIdColumn != null) {
|
||||||
treeItemDto.businessId = tableRow.get(businessIdColumn);
|
treeItemDto.businessId = tableRow.get(businessIdColumn);
|
||||||
}
|
}
|
||||||
if (domainIdColumn != null) {
|
|
||||||
treeItemDto.domainId =(String) tableRow.get(domainIdColumn);
|
|
||||||
}
|
|
||||||
return treeItemDto;
|
return treeItemDto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {Injectable} from "@angular/core";
|
import {Injectable} from "@angular/core";
|
||||||
import {DefaultTreeviewI18n} from "../lib/treeview-i18n";
|
import {DefaultTreeviewI18n, TreeviewItem, TreeviewSelection} from "ngx-treeview";
|
||||||
import {TreeviewItem, TreeviewSelection} from "../lib/treeview-item";
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DropdownTreeviewSelectI18n extends DefaultTreeviewI18n {
|
export class DropdownTreeviewSelectI18n extends DefaultTreeviewI18n {
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,13 @@ import {
|
||||||
ViewChild
|
ViewChild
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {DropdownTreeviewSelectI18n} from './dropdown-treeview-select-i18n';
|
import {DropdownTreeviewSelectI18n} from './dropdown-treeview-select-i18n';
|
||||||
import { DropdownTreeviewComponent } from "../lib/dropdown-treeview.component";
|
import {
|
||||||
import { TreeviewConfig } from "../lib/treeview-config";
|
DropdownTreeviewComponent,
|
||||||
import { TreeviewHelper } from "../lib/treeview-helper";
|
TreeviewConfig,
|
||||||
import { TreeviewI18n } from "../lib/treeview-i18n";
|
TreeviewHelper,
|
||||||
import { TreeviewItem } from "../lib/treeview-item";
|
TreeviewI18n,
|
||||||
import { isNil } from '../lib/utils';
|
TreeviewItem
|
||||||
|
} from "ngx-treeview";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
moduleId: module.id,
|
moduleId: module.id,
|
||||||
|
|
@ -54,7 +55,7 @@ export class DropdownTreeviewSelectComponent implements OnChanges {
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateSelectedItem(): void {
|
private updateSelectedItem(): void {
|
||||||
if (!isNil(this.items)) {
|
if (this.items !== null) {
|
||||||
const selectedItem = TreeviewHelper.findItemInList(this.items, this.value);
|
const selectedItem = TreeviewHelper.findItemInList(this.items, this.value);
|
||||||
this.selectItem(selectedItem);
|
this.selectItem(selectedItem);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
import { Directive, HostListener } from '@angular/core';
|
|
||||||
import { DropdownDirective } from './dropdown.directive';
|
|
||||||
|
|
||||||
@Directive({
|
|
||||||
selector: '[ngxDropdownMenu]',
|
|
||||||
host: {
|
|
||||||
'[class.dropdown-menu]': 'true',
|
|
||||||
'[class.show]': 'dropdown.isOpen'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
export class DropdownMenuDirective {
|
|
||||||
constructor(public dropdown: DropdownDirective) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@HostListener('click', ['$event'])
|
|
||||||
onClick(event: MouseEvent): void {
|
|
||||||
if (event.button !== 2 && event.srcElement.attributes[0]
|
|
||||||
&& event.srcElement.attributes[0].nodeValue === 'form-check-label') {
|
|
||||||
this.dropdown.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
import { Directive, ElementRef } from '@angular/core';
|
|
||||||
import { DropdownDirective } from './dropdown.directive';
|
|
||||||
|
|
||||||
@Directive({
|
|
||||||
selector: '[ngxDropdownToggle]',
|
|
||||||
host: {
|
|
||||||
class: 'dropdown-toggle',
|
|
||||||
'aria-haspopup': 'true',
|
|
||||||
'[attr.aria-expanded]': 'dropdown.isOpen',
|
|
||||||
'(click)': 'dropdown.toggle()'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
export class DropdownToggleDirective {
|
|
||||||
constructor(public dropdown: DropdownDirective, elementRef: ElementRef) {
|
|
||||||
dropdown.toggleElement = elementRef.nativeElement;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
import {
|
|
||||||
Component,
|
|
||||||
EventEmitter,
|
|
||||||
Input,
|
|
||||||
Output,
|
|
||||||
ViewChild,
|
|
||||||
TemplateRef,
|
|
||||||
ChangeDetectionStrategy
|
|
||||||
} from '@angular/core';
|
|
||||||
import { TreeviewI18n } from './treeview-i18n';
|
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import { TreeviewConfig } from './treeview-config';
|
|
||||||
import { TreeviewComponent } from './treeview.component';
|
|
||||||
import { TreeviewHeaderTemplateContext } from './treeview-header-template-context';
|
|
||||||
import { TreeviewItemTemplateContext } from './treeview-item-template-context';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
moduleId: module.id,
|
|
||||||
selector: 'ngx-dropdown-treeview',
|
|
||||||
templateUrl: './../../../../../../src/resources/template/component/external/ngx-treeview/dropdown-treeview.component.html',
|
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
|
||||||
})
|
|
||||||
export class DropdownTreeviewComponent {
|
|
||||||
@Input() buttonClass = 'btn-outline-secondary';
|
|
||||||
@Input() headerTemplate: TemplateRef<TreeviewHeaderTemplateContext>;
|
|
||||||
@Input() itemTemplate: TemplateRef<TreeviewItemTemplateContext>;
|
|
||||||
@Input() items: TreeviewItem[];
|
|
||||||
@Input() config: TreeviewConfig;
|
|
||||||
@Output() selectedChange = new EventEmitter<any[]>(true);
|
|
||||||
@Output() filterChange = new EventEmitter<string>();
|
|
||||||
@ViewChild(TreeviewComponent) treeviewComponent: TreeviewComponent;
|
|
||||||
buttonLabel: string;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
public i18n: TreeviewI18n,
|
|
||||||
private defaultConfig: TreeviewConfig
|
|
||||||
) {
|
|
||||||
this.config = this.defaultConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
onSelectedChange(values: any[]): void {
|
|
||||||
this.buttonLabel = this.i18n.getText(this.treeviewComponent.selection);
|
|
||||||
this.selectedChange.emit(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
onFilterChange(text: string): void {
|
|
||||||
this.filterChange.emit(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
import { Directive, Input, Output, HostBinding, HostListener, EventEmitter } from '@angular/core';
|
|
||||||
import { isNil } from './utils';
|
|
||||||
|
|
||||||
@Directive({
|
|
||||||
selector: '[ngxDropdown]',
|
|
||||||
exportAs: 'ngxDropdown'
|
|
||||||
})
|
|
||||||
export class DropdownDirective {
|
|
||||||
toggleElement: any;
|
|
||||||
@Input('open') internalOpen = false;
|
|
||||||
@Output() openChange = new EventEmitter<boolean>();
|
|
||||||
|
|
||||||
@HostBinding('class.show') get isOpen(): boolean {
|
|
||||||
return this.internalOpen;
|
|
||||||
}
|
|
||||||
|
|
||||||
@HostListener('keyup.esc')
|
|
||||||
onKeyupEsc(): void {
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@HostListener('document:click', ['$event'])
|
|
||||||
onDocumentClick(event: MouseEvent): void {
|
|
||||||
if (event.button !== 2 && !this.isEventFromToggle(event)) {
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open(): void {
|
|
||||||
if (!this.internalOpen) {
|
|
||||||
this.internalOpen = true;
|
|
||||||
this.openChange.emit(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close(): void {
|
|
||||||
if (this.internalOpen) {
|
|
||||||
this.internalOpen = false;
|
|
||||||
this.openChange.emit(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle(): void {
|
|
||||||
if (this.isOpen) {
|
|
||||||
this.close();
|
|
||||||
} else {
|
|
||||||
this.open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private isEventFromToggle(event: MouseEvent): boolean {
|
|
||||||
return !isNil(this.toggleElement) && this.toggleElement.contains(event.target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class TreeviewConfig {
|
|
||||||
hasAllCheckBox = true;
|
|
||||||
hasFilter = false;
|
|
||||||
hasCollapseExpand = false;
|
|
||||||
decoupleChildFromParent = false;
|
|
||||||
maxHeight = 500;
|
|
||||||
|
|
||||||
get hasDivider(): boolean {
|
|
||||||
return this.hasFilter || this.hasAllCheckBox || this.hasCollapseExpand;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static create(fields?: {
|
|
||||||
hasAllCheckBox?: boolean,
|
|
||||||
hasFilter?: boolean,
|
|
||||||
hasCollapseExpand?: boolean,
|
|
||||||
decoupleChildFromParent?: boolean
|
|
||||||
maxHeight?: number,
|
|
||||||
}): TreeviewConfig {
|
|
||||||
const config = new TreeviewConfig();
|
|
||||||
Object.assign(config, fields);
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import {TreeviewComponent} from './treeview.component';
|
|
||||||
import { isNil } from './utils';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export abstract class TreeviewEventParser {
|
|
||||||
abstract getSelectedChange(component: TreeviewComponent): any[];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class DefaultTreeviewEventParser extends TreeviewEventParser {
|
|
||||||
getSelectedChange(component: TreeviewComponent): any[] {
|
|
||||||
const checkedItems = component.selection.checkedItems;
|
|
||||||
if (!isNil(checkedItems)) {
|
|
||||||
return checkedItems.map(item => item.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DownlineTreeviewItem {
|
|
||||||
item: TreeviewItem;
|
|
||||||
parent: DownlineTreeviewItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class DownlineTreeviewEventParser extends TreeviewEventParser {
|
|
||||||
getSelectedChange(component: TreeviewComponent): any[] {
|
|
||||||
const items = component.items;
|
|
||||||
if (!isNil(items)) {
|
|
||||||
let result: DownlineTreeviewItem[] = [];
|
|
||||||
items.forEach(item => {
|
|
||||||
const links = this.getLinks(item, null);
|
|
||||||
if (!isNil(links)) {
|
|
||||||
result = result.concat(links);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
private getLinks(item: TreeviewItem, parent: DownlineTreeviewItem): DownlineTreeviewItem[] {
|
|
||||||
if (!isNil(item.children)) {
|
|
||||||
const link = {
|
|
||||||
item,
|
|
||||||
parent
|
|
||||||
};
|
|
||||||
let result: DownlineTreeviewItem[] = [];
|
|
||||||
item.children.forEach(child => {
|
|
||||||
const links = this.getLinks(child, link);
|
|
||||||
if (!isNil(links)) {
|
|
||||||
result = result.concat(links);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.checked) {
|
|
||||||
return [{
|
|
||||||
item,
|
|
||||||
parent
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class OrderDownlineTreeviewEventParser extends TreeviewEventParser {
|
|
||||||
private currentDownlines: DownlineTreeviewItem[] = [];
|
|
||||||
private parser = new DownlineTreeviewEventParser();
|
|
||||||
|
|
||||||
getSelectedChange(component: TreeviewComponent): any[] {
|
|
||||||
const newDownlines: DownlineTreeviewItem[] = this.parser.getSelectedChange(component);
|
|
||||||
if (this.currentDownlines.length === 0) {
|
|
||||||
this.currentDownlines = newDownlines;
|
|
||||||
} else {
|
|
||||||
const intersectDownlines: DownlineTreeviewItem[] = [];
|
|
||||||
this.currentDownlines.forEach(downline => {
|
|
||||||
let foundIndex = -1;
|
|
||||||
const length = newDownlines.length;
|
|
||||||
for (let i = 0; i < length; i++) {
|
|
||||||
if (downline.item.value === newDownlines[i].item.value) {
|
|
||||||
foundIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foundIndex !== -1) {
|
|
||||||
intersectDownlines.push(newDownlines[foundIndex]);
|
|
||||||
newDownlines.splice(foundIndex, 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.currentDownlines = intersectDownlines.concat(newDownlines);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.currentDownlines;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import { TreeviewConfig } from './treeview-config';
|
|
||||||
|
|
||||||
export interface TreeviewHeaderTemplateContext {
|
|
||||||
config: TreeviewConfig;
|
|
||||||
item: TreeviewItem;
|
|
||||||
onCollapseExpand: () => void;
|
|
||||||
onCheckedChange: (checked: boolean) => void;
|
|
||||||
onFilterTextChange: (text: string) => void;
|
|
||||||
}
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import { isNil, pull } from './utils';
|
|
||||||
|
|
||||||
export const TreeviewHelper = {
|
|
||||||
findItem,
|
|
||||||
findItemInList,
|
|
||||||
findParent,
|
|
||||||
removeItem,
|
|
||||||
concatSelection
|
|
||||||
};
|
|
||||||
|
|
||||||
function findItem(root: TreeviewItem, value: any): TreeviewItem {
|
|
||||||
if (isNil(root)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (root.value === value) {
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (root.children) {
|
|
||||||
for (const child of root.children) {
|
|
||||||
const foundItem = findItem(child, value);
|
|
||||||
if (foundItem) {
|
|
||||||
return foundItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function findItemInList(list: TreeviewItem[], value: any): TreeviewItem {
|
|
||||||
if (isNil(list)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const item of list) {
|
|
||||||
const foundItem = findItem(item, value);
|
|
||||||
if (foundItem) {
|
|
||||||
return foundItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function findParent(root: TreeviewItem, item: TreeviewItem): TreeviewItem {
|
|
||||||
if (isNil(root) || isNil(root.children)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const child of root.children) {
|
|
||||||
if (child === item) {
|
|
||||||
return root;
|
|
||||||
} else {
|
|
||||||
const parent = findParent(child, item);
|
|
||||||
if (parent) {
|
|
||||||
return parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeItem(root: TreeviewItem, item: TreeviewItem): boolean {
|
|
||||||
const parent = findParent(root, item);
|
|
||||||
if (parent) {
|
|
||||||
pull(parent.children, item);
|
|
||||||
if (parent.children.length === 0) {
|
|
||||||
parent.children = undefined;
|
|
||||||
} else {
|
|
||||||
parent.correctChecked();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function concatSelection(items: TreeviewItem[], checked: TreeviewItem[], unchecked: TreeviewItem[]): { [k: string]: TreeviewItem[] } {
|
|
||||||
let checkedItems = [...checked];
|
|
||||||
let uncheckedItems = [...unchecked];
|
|
||||||
for (const item of items) {
|
|
||||||
const selection = item.getSelection();
|
|
||||||
checkedItems = checkedItems.concat(selection.checkedItems);
|
|
||||||
uncheckedItems = uncheckedItems.concat(selection.uncheckedItems);
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
checked: checkedItems,
|
|
||||||
unchecked: uncheckedItems
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
import { TreeviewSelection } from './treeview-item';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export abstract class TreeviewI18n {
|
|
||||||
abstract getText(selection: TreeviewSelection): string;
|
|
||||||
abstract getAllCheckboxText(): string;
|
|
||||||
abstract getFilterPlaceholder(): string;
|
|
||||||
abstract getFilterNoItemsFoundText(): string;
|
|
||||||
abstract getTooltipCollapseExpandText(isCollapse: boolean): string;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class DefaultTreeviewI18n extends TreeviewI18n {
|
|
||||||
getText(selection: TreeviewSelection): string {
|
|
||||||
if (selection.uncheckedItems.length === 0) {
|
|
||||||
if (selection.checkedItems.length > 0) {
|
|
||||||
return this.getAllCheckboxText();
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (selection.checkedItems.length) {
|
|
||||||
case 0:
|
|
||||||
return 'Select options';
|
|
||||||
case 1:
|
|
||||||
return selection.checkedItems[0].text;
|
|
||||||
default:
|
|
||||||
return `${selection.checkedItems.length} options selected`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getAllCheckboxText(): string {
|
|
||||||
return 'Все';
|
|
||||||
}
|
|
||||||
|
|
||||||
getFilterPlaceholder(): string {
|
|
||||||
return 'Поиск';
|
|
||||||
}
|
|
||||||
|
|
||||||
getFilterNoItemsFoundText(): string {
|
|
||||||
return 'Элементы не найдены';
|
|
||||||
}
|
|
||||||
|
|
||||||
getTooltipCollapseExpandText(isCollapse: boolean): string {
|
|
||||||
return isCollapse ? 'Развернуть' : 'Свернуть';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
|
|
||||||
export interface TreeviewItemTemplateContext {
|
|
||||||
item: TreeviewItem;
|
|
||||||
onCollapseExpand: () => void;
|
|
||||||
onCheckedChange: () => void;
|
|
||||||
}
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
import {
|
|
||||||
ChangeDetectionStrategy,
|
|
||||||
Component,
|
|
||||||
EventEmitter,
|
|
||||||
Input,
|
|
||||||
Output,
|
|
||||||
TemplateRef
|
|
||||||
} from '@angular/core';
|
|
||||||
import { TreeviewConfig } from './treeview-config';
|
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import { TreeviewItemTemplateContext } from './treeview-item-template-context';
|
|
||||||
import { isNil } from './utils';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
moduleId: module.id,
|
|
||||||
selector: 'ngx-treeview-item',
|
|
||||||
templateUrl: './../../../../../../src/resources/template/component/external/ngx-treeview/treeview-item.component.html',
|
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
|
||||||
})
|
|
||||||
export class TreeviewItemComponent {
|
|
||||||
@Input() config: TreeviewConfig;
|
|
||||||
@Input() template: TemplateRef<TreeviewItemTemplateContext>;
|
|
||||||
@Input() item: TreeviewItem;
|
|
||||||
@Output() checkedChange = new EventEmitter<boolean>();
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private defaultConfig: TreeviewConfig
|
|
||||||
) {
|
|
||||||
this.config = this.defaultConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCollapseExpand = () => {
|
|
||||||
this.item.collapsed = !this.item.collapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCheckedChange = () => {
|
|
||||||
const checked = this.item.checked;
|
|
||||||
if (!isNil(this.item.children) && !this.config.decoupleChildFromParent) {
|
|
||||||
this.item.children.forEach(child => child.setCheckedRecursive(checked));
|
|
||||||
}
|
|
||||||
this.checkedChange.emit(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
onChildCheckedChange(child: TreeviewItem, checked: boolean): void {
|
|
||||||
if (!this.config.decoupleChildFromParent) {
|
|
||||||
let itemChecked: boolean = null;
|
|
||||||
for (const childItem of this.item.children) {
|
|
||||||
if (itemChecked === null) {
|
|
||||||
itemChecked = childItem.checked;
|
|
||||||
} else if (itemChecked !== childItem.checked) {
|
|
||||||
itemChecked = undefined;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itemChecked === null) {
|
|
||||||
itemChecked = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.item.checked !== itemChecked) {
|
|
||||||
this.item.checked = itemChecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkedChange.emit(checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,185 +0,0 @@
|
||||||
import { TreeviewHelper } from './treeview-helper';
|
|
||||||
import { isBoolean, isNil, isString } from './utils';
|
|
||||||
|
|
||||||
export interface TreeviewSelection {
|
|
||||||
checkedItems: TreeviewItem[];
|
|
||||||
uncheckedItems: TreeviewItem[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TreeItem {
|
|
||||||
text: string;
|
|
||||||
value: any;
|
|
||||||
disabled?: boolean;
|
|
||||||
checked?: boolean;
|
|
||||||
collapsed?: boolean;
|
|
||||||
children?: TreeItem[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export class TreeviewItem {
|
|
||||||
private internalDisabled = false;
|
|
||||||
private internalChecked = true;
|
|
||||||
private internalCollapsed = false;
|
|
||||||
private internalChildren: TreeviewItem[];
|
|
||||||
text: string;
|
|
||||||
value: any;
|
|
||||||
|
|
||||||
constructor(item: TreeItem, autoCorrectChecked = false) {
|
|
||||||
if (isNil(item)) {
|
|
||||||
throw new Error('Item must be defined');
|
|
||||||
}
|
|
||||||
if (isString(item.text)) {
|
|
||||||
this.text = item.text;
|
|
||||||
} else {
|
|
||||||
throw new Error('A text of item must be string object');
|
|
||||||
}
|
|
||||||
this.value = item.value;
|
|
||||||
if (isBoolean(item.checked)) {
|
|
||||||
this.checked = item.checked;
|
|
||||||
}
|
|
||||||
if (isBoolean(item.collapsed)) {
|
|
||||||
this.collapsed = item.collapsed;
|
|
||||||
}
|
|
||||||
if (isBoolean(item.disabled)) {
|
|
||||||
this.disabled = item.disabled;
|
|
||||||
}
|
|
||||||
if (!isNil(item.children) && item.children.length > 0) {
|
|
||||||
this.children = item.children.map(child => {
|
|
||||||
if (this.disabled === true) {
|
|
||||||
child.disabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new TreeviewItem(child);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (autoCorrectChecked) {
|
|
||||||
this.correctChecked();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get checked(): boolean {
|
|
||||||
return this.internalChecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
set checked(value: boolean) {
|
|
||||||
if (!this.internalDisabled) {
|
|
||||||
if (this.internalChecked !== value) {
|
|
||||||
this.internalChecked = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get indeterminate(): boolean {
|
|
||||||
return this.checked === undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
setCheckedRecursive(value: boolean): void {
|
|
||||||
if (!this.internalDisabled) {
|
|
||||||
this.internalChecked = value;
|
|
||||||
if (!isNil(this.internalChildren)) {
|
|
||||||
this.internalChildren.forEach(child => child.setCheckedRecursive(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get disabled(): boolean {
|
|
||||||
return this.internalDisabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
set disabled(value: boolean) {
|
|
||||||
if (this.internalDisabled !== value) {
|
|
||||||
this.internalDisabled = value;
|
|
||||||
if (!isNil(this.internalChildren)) {
|
|
||||||
this.internalChildren.forEach(child => child.disabled = value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get collapsed(): boolean {
|
|
||||||
return this.internalCollapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
set collapsed(value: boolean) {
|
|
||||||
if (this.internalCollapsed !== value) {
|
|
||||||
this.internalCollapsed = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setCollapsedRecursive(value: boolean): void {
|
|
||||||
this.internalCollapsed = value;
|
|
||||||
if (!isNil(this.internalChildren)) {
|
|
||||||
this.internalChildren.forEach(child => child.setCollapsedRecursive(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get children(): TreeviewItem[] {
|
|
||||||
return this.internalChildren;
|
|
||||||
}
|
|
||||||
|
|
||||||
set children(value: TreeviewItem[]) {
|
|
||||||
if (this.internalChildren !== value) {
|
|
||||||
if (!isNil(value) && value.length === 0) {
|
|
||||||
throw new Error('Children must be not an empty array');
|
|
||||||
}
|
|
||||||
this.internalChildren = value;
|
|
||||||
if (!isNil(this.internalChildren)) {
|
|
||||||
let checked = null;
|
|
||||||
this.internalChildren.forEach(child => {
|
|
||||||
if (checked === null) {
|
|
||||||
checked = child.checked;
|
|
||||||
} else {
|
|
||||||
if (child.checked !== checked) {
|
|
||||||
checked = undefined;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.internalChecked = checked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getSelection(): TreeviewSelection {
|
|
||||||
let checkedItems: TreeviewItem[] = [];
|
|
||||||
let uncheckedItems: TreeviewItem[] = [];
|
|
||||||
if (isNil(this.internalChildren)) {
|
|
||||||
if (this.internalChecked) {
|
|
||||||
checkedItems.push(this);
|
|
||||||
} else {
|
|
||||||
uncheckedItems.push(this);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const selection = TreeviewHelper.concatSelection(this.internalChildren, checkedItems, uncheckedItems);
|
|
||||||
checkedItems = selection.checked;
|
|
||||||
uncheckedItems = selection.unchecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
checkedItems,
|
|
||||||
uncheckedItems
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
correctChecked(): void {
|
|
||||||
this.internalChecked = this.getCorrectChecked();
|
|
||||||
}
|
|
||||||
|
|
||||||
private getCorrectChecked(): boolean {
|
|
||||||
let checked: boolean = null;
|
|
||||||
if (!isNil(this.internalChildren)) {
|
|
||||||
for (const child of this.internalChildren) {
|
|
||||||
child.internalChecked = child.getCorrectChecked();
|
|
||||||
if (checked === null) {
|
|
||||||
checked = child.internalChecked;
|
|
||||||
} else if (checked !== child.internalChecked) {
|
|
||||||
checked = undefined;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
checked = this.checked;
|
|
||||||
}
|
|
||||||
|
|
||||||
return checked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,242 +0,0 @@
|
||||||
import {
|
|
||||||
Component,
|
|
||||||
Input,
|
|
||||||
Output,
|
|
||||||
EventEmitter,
|
|
||||||
OnChanges,
|
|
||||||
OnInit,
|
|
||||||
SimpleChanges,
|
|
||||||
TemplateRef,
|
|
||||||
ChangeDetectionStrategy
|
|
||||||
} from '@angular/core';
|
|
||||||
import { TreeviewI18n } from './treeview-i18n';
|
|
||||||
import { TreeviewItem, TreeviewSelection } from './treeview-item';
|
|
||||||
import { TreeviewConfig } from './treeview-config';
|
|
||||||
import { TreeviewEventParser } from './treeview-event-parser';
|
|
||||||
import { TreeviewHeaderTemplateContext } from './treeview-header-template-context';
|
|
||||||
import { TreeviewItemTemplateContext } from './treeview-item-template-context';
|
|
||||||
import { TreeviewHelper } from './treeview-helper';
|
|
||||||
import { isNil } from './utils';
|
|
||||||
|
|
||||||
class FilterTreeviewItem extends TreeviewItem {
|
|
||||||
private readonly refItem: TreeviewItem;
|
|
||||||
constructor(item: TreeviewItem) {
|
|
||||||
super({
|
|
||||||
text: item.text,
|
|
||||||
value: item.value,
|
|
||||||
disabled: item.disabled,
|
|
||||||
checked: item.checked,
|
|
||||||
collapsed: item.collapsed,
|
|
||||||
children: item.children
|
|
||||||
});
|
|
||||||
this.refItem = item;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRefChecked(): void {
|
|
||||||
this.children.forEach(child => {
|
|
||||||
if (child instanceof FilterTreeviewItem) {
|
|
||||||
child.updateRefChecked();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let refChecked = this.checked;
|
|
||||||
if (refChecked) {
|
|
||||||
for (const refChild of this.refItem.children) {
|
|
||||||
if (!refChild.checked) {
|
|
||||||
refChecked = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.refItem.checked = refChecked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
moduleId: module.id,
|
|
||||||
selector: 'ngx-treeview',
|
|
||||||
templateUrl: './../../../../../../src/resources/template/component/external/ngx-treeview/treeview.component.html',
|
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
|
||||||
})
|
|
||||||
export class TreeviewComponent implements OnChanges, OnInit {
|
|
||||||
@Input() headerTemplate: TemplateRef<TreeviewHeaderTemplateContext>;
|
|
||||||
@Input() itemTemplate: TemplateRef<TreeviewItemTemplateContext>;
|
|
||||||
@Input() items: TreeviewItem[];
|
|
||||||
@Input() config: TreeviewConfig;
|
|
||||||
@Output() selectedChange = new EventEmitter<any[]>();
|
|
||||||
@Output() filterChange = new EventEmitter<string>();
|
|
||||||
headerTemplateContext: TreeviewHeaderTemplateContext;
|
|
||||||
allItem: TreeviewItem;
|
|
||||||
filterText = '';
|
|
||||||
filterItems: TreeviewItem[];
|
|
||||||
selection: TreeviewSelection;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
public i18n: TreeviewI18n,
|
|
||||||
private defaultConfig: TreeviewConfig,
|
|
||||||
private eventParser: TreeviewEventParser
|
|
||||||
) {
|
|
||||||
this.config = this.defaultConfig;
|
|
||||||
this.allItem = new TreeviewItem({ text: 'All', value: undefined });
|
|
||||||
}
|
|
||||||
|
|
||||||
get hasFilterItems(): boolean {
|
|
||||||
return !isNil(this.filterItems) && this.filterItems.length > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
get maxHeight(): string {
|
|
||||||
return `${this.config.maxHeight}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
this.createHeaderTemplateContext();
|
|
||||||
this.generateSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnChanges(changes: SimpleChanges): void {
|
|
||||||
const itemsSimpleChange = changes.items;
|
|
||||||
if (!isNil(itemsSimpleChange) && !isNil(this.items)) {
|
|
||||||
this.updateFilterItems();
|
|
||||||
this.updateCollapsedOfAll();
|
|
||||||
this.raiseSelectedChange();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onAllCollapseExpand(): void {
|
|
||||||
this.allItem.collapsed = !this.allItem.collapsed;
|
|
||||||
this.filterItems.forEach(item => item.setCollapsedRecursive(this.allItem.collapsed));
|
|
||||||
}
|
|
||||||
|
|
||||||
onFilterTextChange(text: string): void {
|
|
||||||
this.filterText = text;
|
|
||||||
this.filterChange.emit(text);
|
|
||||||
this.updateFilterItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
onAllCheckedChange(): void {
|
|
||||||
const checked = this.allItem.checked;
|
|
||||||
this.filterItems.forEach(item => {
|
|
||||||
item.setCheckedRecursive(checked);
|
|
||||||
if (item instanceof FilterTreeviewItem) {
|
|
||||||
item.updateRefChecked();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.raiseSelectedChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
onItemCheckedChange(item: TreeviewItem, checked: boolean): void {
|
|
||||||
if (item instanceof FilterTreeviewItem) {
|
|
||||||
item.updateRefChecked();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateCheckedOfAll();
|
|
||||||
this.raiseSelectedChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
raiseSelectedChange(): void {
|
|
||||||
this.generateSelection();
|
|
||||||
const values = this.eventParser.getSelectedChange(this);
|
|
||||||
setTimeout(() => {
|
|
||||||
this.selectedChange.emit(values);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private createHeaderTemplateContext(): void {
|
|
||||||
this.headerTemplateContext = {
|
|
||||||
config: this.config,
|
|
||||||
item: this.allItem,
|
|
||||||
onCheckedChange: () => this.onAllCheckedChange(),
|
|
||||||
onCollapseExpand: () => this.onAllCollapseExpand(),
|
|
||||||
onFilterTextChange: (text) => this.onFilterTextChange(text)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private generateSelection(): void {
|
|
||||||
let checkedItems: TreeviewItem[] = [];
|
|
||||||
let uncheckedItems: TreeviewItem[] = [];
|
|
||||||
if (!isNil(this.items)) {
|
|
||||||
const selection = TreeviewHelper.concatSelection(this.items, checkedItems, uncheckedItems);
|
|
||||||
checkedItems = selection.checked;
|
|
||||||
uncheckedItems = selection.unchecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.selection = {
|
|
||||||
checkedItems,
|
|
||||||
uncheckedItems
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private updateFilterItems(): void {
|
|
||||||
if (this.filterText !== '') {
|
|
||||||
const filterItems: TreeviewItem[] = [];
|
|
||||||
const filterText = this.filterText.toLowerCase();
|
|
||||||
this.items.forEach(item => {
|
|
||||||
const newItem = this.filterItem(item, filterText);
|
|
||||||
if (!isNil(newItem)) {
|
|
||||||
filterItems.push(newItem);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.filterItems = filterItems;
|
|
||||||
} else {
|
|
||||||
this.filterItems = this.items;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateCheckedOfAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
private filterItem(item: TreeviewItem, filterText: string): TreeviewItem {
|
|
||||||
const isMatch = item.text.toLowerCase().includes(filterText);
|
|
||||||
if (isMatch) {
|
|
||||||
return item;
|
|
||||||
} else {
|
|
||||||
if (!isNil(item.children)) {
|
|
||||||
const children: TreeviewItem[] = [];
|
|
||||||
item.children.forEach(child => {
|
|
||||||
const newChild = this.filterItem(child, filterText);
|
|
||||||
if (!isNil(newChild)) {
|
|
||||||
children.push(newChild);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (children.length > 0) {
|
|
||||||
const newItem = new FilterTreeviewItem(item);
|
|
||||||
newItem.collapsed = false;
|
|
||||||
newItem.children = children;
|
|
||||||
return newItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
private updateCheckedOfAll(): void {
|
|
||||||
let itemChecked: boolean = null;
|
|
||||||
for (const filterItem of this.filterItems) {
|
|
||||||
if (itemChecked === null) {
|
|
||||||
itemChecked = filterItem.checked;
|
|
||||||
} else if (itemChecked !== filterItem.checked) {
|
|
||||||
itemChecked = undefined;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itemChecked === null) {
|
|
||||||
itemChecked = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.allItem.checked = itemChecked;
|
|
||||||
}
|
|
||||||
|
|
||||||
private updateCollapsedOfAll(): void {
|
|
||||||
let hasItemExpanded = false;
|
|
||||||
for (const filterItem of this.filterItems) {
|
|
||||||
if (!filterItem.collapsed) {
|
|
||||||
hasItemExpanded = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.allItem.collapsed = !hasItemExpanded;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
import { NgModule, ModuleWithProviders } from '@angular/core';
|
|
||||||
import { FormsModule } from '@angular/forms';
|
|
||||||
import { CommonModule } from '@angular/common';
|
|
||||||
import { DropdownDirective } from './dropdown.directive';
|
|
||||||
import { DropdownMenuDirective } from './dropdown-menu.directive';
|
|
||||||
import { DropdownToggleDirective } from './dropdown-toggle.directive';
|
|
||||||
import { DropdownTreeviewComponent } from './dropdown-treeview.component';
|
|
||||||
import { TreeviewComponent } from './treeview.component';
|
|
||||||
import { TreeviewItemComponent } from './treeview-item.component';
|
|
||||||
import { TreeviewPipe } from './treeview.pipe';
|
|
||||||
import { TreeviewI18n, DefaultTreeviewI18n } from './treeview-i18n';
|
|
||||||
import { TreeviewConfig } from './treeview-config';
|
|
||||||
import { TreeviewEventParser, DefaultTreeviewEventParser } from './treeview-event-parser';
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
imports: [
|
|
||||||
FormsModule,
|
|
||||||
CommonModule
|
|
||||||
],
|
|
||||||
declarations: [
|
|
||||||
// TreeviewComponent,
|
|
||||||
// TreeviewItemComponent,
|
|
||||||
TreeviewPipe,
|
|
||||||
DropdownDirective,
|
|
||||||
DropdownMenuDirective,
|
|
||||||
DropdownToggleDirective
|
|
||||||
// DropdownTreeviewComponent
|
|
||||||
], exports: [
|
|
||||||
// TreeviewComponent,
|
|
||||||
TreeviewPipe,
|
|
||||||
DropdownDirective,
|
|
||||||
DropdownMenuDirective,
|
|
||||||
DropdownToggleDirective
|
|
||||||
// DropdownTreeviewComponent
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export class TreeviewModule {
|
|
||||||
static forRoot(): ModuleWithProviders {
|
|
||||||
return {
|
|
||||||
ngModule: TreeviewModule,
|
|
||||||
providers: [
|
|
||||||
TreeviewConfig,
|
|
||||||
{ provide: TreeviewI18n, useClass: DefaultTreeviewI18n },
|
|
||||||
{ provide: TreeviewEventParser, useClass: DefaultTreeviewEventParser }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
import { Pipe, PipeTransform } from '@angular/core';
|
|
||||||
import { TreeviewItem } from './treeview-item';
|
|
||||||
import { isNil } from './utils';
|
|
||||||
|
|
||||||
@Pipe({
|
|
||||||
name: 'ngxTreeview'
|
|
||||||
})
|
|
||||||
export class TreeviewPipe implements PipeTransform {
|
|
||||||
transform(objects: any[], textField: string): TreeviewItem[] {
|
|
||||||
if (isNil(objects)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return objects.map(object => new TreeviewItem({ text: object[textField], value: object }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
export default class Utils {
|
|
||||||
static isBoolean(value): boolean { return isBoolean(value); }
|
|
||||||
static isNil(value): boolean { return isNil(value); }
|
|
||||||
static isString(value): boolean { return isString(value); }
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isBoolean = (value:any): boolean => {
|
|
||||||
return value === true || value === false; // todo not completed; to complete from 'lodash'
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isNil = (value:any): boolean => {
|
|
||||||
// from 'lodash'
|
|
||||||
return value == null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const isString = (value:any): boolean => {
|
|
||||||
return typeof value == 'string'; // todo not completed; to complete from 'lodash'
|
|
||||||
};
|
|
||||||
|
|
||||||
export const pull = (array:any[], item:any): any[] => {
|
|
||||||
// modified 'remove' from 'lodash'
|
|
||||||
// mutate array
|
|
||||||
const result = [];
|
|
||||||
if (!(array && array.length)) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
const indexes = [];
|
|
||||||
|
|
||||||
array.forEach((value, index) => {
|
|
||||||
if (value === item) {
|
|
||||||
result.push(value);
|
|
||||||
indexes.push(index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const index of indexes.reverse()) {
|
|
||||||
array.splice(index, 1);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const reverse = (array:any[]): any[] => {
|
|
||||||
// from 'lodash'
|
|
||||||
return array == null ? array : array.reverse();
|
|
||||||
};
|
|
||||||
|
|
@ -1,11 +1,20 @@
|
||||||
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef} from "@angular/core";
|
|
||||||
import {Control, Event, UserService, Visible} from "@webbpm/base-package";
|
|
||||||
import {TreeItem, TreeviewItem} from "../external/ngx-treeview/lib/treeview-item";
|
|
||||||
import {
|
import {
|
||||||
DropdownTreeviewSelectI18n
|
ChangeDetectionStrategy,
|
||||||
} from "../external/ngx-treeview/dropdown-treeview-select/dropdown-treeview-select-i18n";
|
ChangeDetectorRef,
|
||||||
|
Component,
|
||||||
|
ElementRef
|
||||||
|
} from "@angular/core";
|
||||||
|
import {
|
||||||
|
Event,
|
||||||
|
InputControl,
|
||||||
|
UserService,
|
||||||
|
Visible
|
||||||
|
} from "@webbpm/base-package";
|
||||||
|
|
||||||
import {TreeItemDto} from "../../generated/component/model/TreeItemDto";
|
import {TreeItemDto} from "../../generated/component/model/TreeItemDto";
|
||||||
import {TreeItemRpcService} from "../../generated/component/rpc/TreeItemRpcService";
|
import {TreeItemRpcService} from "../../generated/component/rpc/TreeItemRpcService";
|
||||||
|
import {DropdownTreeviewSelectI18n} from "../external/ngx-treeview/dropdown-treeview-select/dropdown-treeview-select-i18n";
|
||||||
|
import {TreeItem, TreeviewItem} from "ngx-treeview";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
moduleId: module.id,
|
moduleId: module.id,
|
||||||
|
|
@ -16,7 +25,7 @@ import {TreeItemRpcService} from "../../generated/component/rpc/TreeItemRpcServi
|
||||||
}],
|
}],
|
||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class DropdownTreeViewComponent extends Control {
|
export class DropdownTreeViewComponent extends InputControl {
|
||||||
|
|
||||||
public collapseLevel: number;
|
public collapseLevel: number;
|
||||||
public maxHeight: number;
|
public maxHeight: number;
|
||||||
|
|
@ -31,8 +40,7 @@ export class DropdownTreeViewComponent extends Control {
|
||||||
private rpcService: TreeItemRpcService;
|
private rpcService: TreeItemRpcService;
|
||||||
|
|
||||||
constructor(el: ElementRef, cd: ChangeDetectorRef,
|
constructor(el: ElementRef, cd: ChangeDetectorRef,
|
||||||
// todo replace UserService by another one from SUPPORT-8421 providing accountId or domainId
|
private i18n: DropdownTreeviewSelectI18n) {
|
||||||
private i18n: DropdownTreeviewSelectI18n, private userService: UserService) {
|
|
||||||
super(el, cd);
|
super(el, cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,8 +52,6 @@ export class DropdownTreeViewComponent extends Control {
|
||||||
|
|
||||||
@Visible()
|
@Visible()
|
||||||
public loadTreeItems(): void {
|
public loadTreeItems(): void {
|
||||||
// todo replace the called method by
|
|
||||||
// this.rpcService.loadTreeDataByDomainId(domainId)
|
|
||||||
this.rpcService.loadTreeData()
|
this.rpcService.loadTreeData()
|
||||||
.then((res: TreeItemDto[]) => {
|
.then((res: TreeItemDto[]) => {
|
||||||
this.items = res.map(value => new TreeviewItem(this.createTreeItem(value)));
|
this.items = res.map(value => new TreeviewItem(this.createTreeItem(value)));
|
||||||
|
|
@ -78,6 +84,7 @@ export class DropdownTreeViewComponent extends Control {
|
||||||
|
|
||||||
public onValueChange($event: any) {
|
public onValueChange($event: any) {
|
||||||
this.valueChangeEvent.trigger($event);
|
this.valueChangeEvent.trigger($event);
|
||||||
|
this.applyListener(this.changeListeners);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Visible()
|
@Visible()
|
||||||
|
|
@ -104,4 +111,34 @@ export class DropdownTreeViewComponent extends Control {
|
||||||
viewItem.children.forEach((value) => this.checkCollapseLevelRecursive(value, level + 1))
|
viewItem.children.forEach((value) => this.checkCollapseLevelRecursive(value, level + 1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getPresentationValue(): string | number | boolean {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue(): any {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getValueAsModel(): any {
|
||||||
|
return this.value ? this.value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
setValue(value: any): any {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
onChange() {
|
||||||
|
super.onChange();
|
||||||
|
this.valueChangeEvent.trigger(this.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribeToModelChange() {
|
||||||
|
//empty because there is no ngModel here
|
||||||
|
}
|
||||||
|
|
||||||
|
unsubscribeToModelChange() {
|
||||||
|
//empty because there is no ngModel here
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,7 @@ import {FilterContainer} from "../../ervu_business_metrics/component/filter/Filt
|
||||||
import {TokenInterceptor} from "./interceptor/token-interceptor.service";
|
import {TokenInterceptor} from "./interceptor/token-interceptor.service";
|
||||||
import {DropdownTreeViewComponent} from "../../component/field/DropdownTreeViewComponent";
|
import {DropdownTreeViewComponent} from "../../component/field/DropdownTreeViewComponent";
|
||||||
import {DropdownTreeviewSelectComponent} from "../../component/external/ngx-treeview/dropdown-treeview-select/dropdown-treeview-select.component";
|
import {DropdownTreeviewSelectComponent} from "../../component/external/ngx-treeview/dropdown-treeview-select/dropdown-treeview-select.component";
|
||||||
import {DropdownTreeviewComponent} from "../../component/external/ngx-treeview/lib/dropdown-treeview.component";
|
import {TreeviewModule} from "ngx-treeview";
|
||||||
import {TreeviewModule} from '../../component/external/ngx-treeview/lib/treeview.module';
|
|
||||||
import {TreeviewComponent} from "../../component/external/ngx-treeview/lib/treeview.component";
|
|
||||||
import {TreeviewItemComponent} from "../../component/external/ngx-treeview/lib/treeview-item.component";
|
|
||||||
|
|
||||||
registerLocaleData(localeRu);
|
registerLocaleData(localeRu);
|
||||||
export const DIRECTIVES = [
|
export const DIRECTIVES = [
|
||||||
|
|
@ -37,10 +34,7 @@ export const DIRECTIVES = [
|
||||||
forwardRef(() => ErvuChartV2),
|
forwardRef(() => ErvuChartV2),
|
||||||
forwardRef(() => FilterContainer),
|
forwardRef(() => FilterContainer),
|
||||||
forwardRef(() => DropdownTreeViewComponent),
|
forwardRef(() => DropdownTreeViewComponent),
|
||||||
forwardRef(() => DropdownTreeviewComponent),
|
forwardRef(() => DropdownTreeviewSelectComponent)
|
||||||
forwardRef(() => DropdownTreeviewSelectComponent),
|
|
||||||
forwardRef(() => TreeviewComponent),
|
|
||||||
forwardRef(() => TreeviewItemComponent)
|
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,8 @@
|
||||||
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
|
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
|
||||||
'tslib': 'npm:tslib/tslib.js',
|
'tslib': 'npm:tslib/tslib.js',
|
||||||
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
|
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
|
||||||
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js'
|
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js',
|
||||||
|
'ngx-treeview': 'npm:ngx-treeview'
|
||||||
},
|
},
|
||||||
packages: {
|
packages: {
|
||||||
'webbpm': { main: 'main', defaultExtension: 'js'},
|
'webbpm': { main: 'main', defaultExtension: 'js'},
|
||||||
|
|
@ -87,7 +88,8 @@
|
||||||
'inputmask': {
|
'inputmask': {
|
||||||
main: 'dist/inputmask.js',
|
main: 'dist/inputmask.js',
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
}
|
},
|
||||||
|
'ngx-treeview': { main: "bundles/ngx-treeview.umd.js", defaultExtension: 'js'}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(this);
|
})(this);
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,8 @@
|
||||||
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
|
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
|
||||||
'tslib': 'npm:tslib/tslib.js',
|
'tslib': 'npm:tslib/tslib.js',
|
||||||
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
|
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
|
||||||
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js'
|
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js',
|
||||||
|
'ng2-dropdown-treeview': 'npm:ng2-dropdown-treeview'
|
||||||
},
|
},
|
||||||
packages: {
|
packages: {
|
||||||
'preview': { main: './modules/preview/preview.main', defaultExtension: 'js'},
|
'preview': { main: './modules/preview/preview.main', defaultExtension: 'js'},
|
||||||
|
|
@ -86,7 +87,8 @@
|
||||||
'inputmask': {
|
'inputmask': {
|
||||||
main: 'dist/inputmask.js',
|
main: 'dist/inputmask.js',
|
||||||
defaultExtension: 'js'
|
defaultExtension: 'js'
|
||||||
}
|
},
|
||||||
|
'ng2-dropdown-treeview':{ main: "bundles/ng2-dropdown-treeview.umd.js", defaultExtension: 'js'}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(this);
|
})(this);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue