mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-14 13:03:07 +00:00
90 lines
2.2 KiB
TypeScript
90 lines
2.2 KiB
TypeScript
import { obx, computed, makeObservable } from '@alilc/lowcode-editor-core';
|
|
import { uniqueId } from '@alilc/lowcode-utils';
|
|
import { IPublicTypeTitleContent, IPublicModelExclusiveGroup } from '@alilc/lowcode-types';
|
|
import { Node } from './node';
|
|
import { intl } from '../../locale';
|
|
|
|
// modals assoc x-hide value, initial: check is Modal, yes will put it in modals, cross levels
|
|
// if-else-if assoc conditionGroup value, should be the same level,
|
|
// and siblings, need renderEngine support
|
|
export class ExclusiveGroup implements IPublicModelExclusiveGroup {
|
|
readonly isExclusiveGroup = true;
|
|
|
|
readonly id = uniqueId('exclusive');
|
|
|
|
@obx.shallow readonly children: Node[] = [];
|
|
|
|
@obx private visibleIndex = 0;
|
|
|
|
@computed get document() {
|
|
return this.visibleNode.document;
|
|
}
|
|
|
|
@computed get zLevel() {
|
|
return this.visibleNode.zLevel;
|
|
}
|
|
|
|
@computed get length() {
|
|
return this.children.length;
|
|
}
|
|
|
|
@computed get visibleNode(): Node {
|
|
return this.children[this.visibleIndex];
|
|
}
|
|
|
|
@computed get firstNode(): Node {
|
|
return this.children[0]!;
|
|
}
|
|
|
|
get index() {
|
|
return this.firstNode.index;
|
|
}
|
|
|
|
add(node: Node) {
|
|
if (node.nextSibling && node.nextSibling.conditionGroup === this) {
|
|
const i = this.children.indexOf(node.nextSibling);
|
|
this.children.splice(i, 0, node);
|
|
} else {
|
|
this.children.push(node);
|
|
}
|
|
}
|
|
|
|
remove(node: Node) {
|
|
const i = this.children.indexOf(node);
|
|
if (i > -1) {
|
|
this.children.splice(i, 1);
|
|
if (this.visibleIndex > i) {
|
|
this.visibleIndex -= 1;
|
|
} else if (this.visibleIndex >= this.children.length) {
|
|
this.visibleIndex = this.children.length - 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
setVisible(node: Node) {
|
|
const i = this.children.indexOf(node);
|
|
if (i > -1) {
|
|
this.visibleIndex = i;
|
|
}
|
|
}
|
|
|
|
isVisible(node: Node) {
|
|
const i = this.children.indexOf(node);
|
|
return i === this.visibleIndex;
|
|
}
|
|
|
|
readonly title: IPublicTypeTitleContent;
|
|
|
|
constructor(readonly name: string, title?: IPublicTypeTitleContent) {
|
|
makeObservable(this);
|
|
this.title = title || {
|
|
type: 'i18n',
|
|
intl: intl('Condition Group'),
|
|
};
|
|
}
|
|
}
|
|
|
|
export function isExclusiveGroup(obj: any): obj is ExclusiveGroup {
|
|
return obj && obj.isExclusiveGroup;
|
|
}
|