{"version":3,"file":"ng-nest-ui-tree-file.mjs","sources":["../../../../lib/ng-nest/ui/tree-file/tree-file.property.ts","../../../../lib/ng-nest/ui/tree-file/tree-file.component.ts","../../../../lib/ng-nest/ui/tree-file/tree-file.component.html","../../../../lib/ng-nest/ui/tree-file/tree-file.module.ts","../../../../lib/ng-nest/ui/tree-file/ng-nest-ui-tree-file.ts"],"sourcesContent":["import { XPropertyFunction, XToBoolean, XToCssPixelValue, XToNumber } from '@ng-nest/ui/core';\r\nimport { Component, input, model } from '@angular/core';\r\nimport { XTreeNode } from '@ng-nest/ui/tree';\r\nimport { XCrumbNode } from '@ng-nest/ui/crumb';\r\nimport { XHighlightLines } from '@ng-nest/ui/highlight';\r\nimport type { XData, XBoolean, XNumber } from '@ng-nest/ui/core';\r\n\r\n/**\r\n * TreeFile\r\n * @selector x-tree-file\r\n * @decorator component\r\n */\r\nexport const XTreeFilePrefix = 'x-tree-file';\r\nconst X_TREE_FILE_CONFIG_NAME = 'treeFile';\r\n\r\n/**\r\n * TreeFile Property\r\n */\r\n@Component({ selector: `${XTreeFilePrefix}-property`, template: '' })\r\nexport class XTreeFileProperty extends XPropertyFunction(X_TREE_FILE_CONFIG_NAME) {\r\n  /**\r\n   * @zh_CN 节点数据\r\n   * @en_US Node data\r\n   */\r\n  readonly data = input<XData<XTreeFileNode>>([]);\r\n  /**\r\n   * @zh_CN 文件绝对路径地址前缀，为空表示取当前运行的地址\r\n   * @en_US File absolute path address prefix, empty means to take the address of the current operation\r\n   */\r\n  readonly domain = input<string>('');\r\n  /**\r\n   * @zh_CN 切换状态\r\n   * @en_US Switch state\r\n   */\r\n  readonly toggle = model<boolean>(true);\r\n  /**\r\n   * @zh_CN 显示切换按钮\r\n   * @en_US Show toggle button\r\n   */\r\n  readonly showToggle = input<boolean, XBoolean>(true, { transform: XToBoolean });\r\n  /**\r\n   * @zh_CN 显示树，为 true 的时候隐藏切换按钮\r\n   * @en_US Show the tree, hide the toggle button when true\r\n   */\r\n  readonly showTree = input<boolean, XBoolean>(true, { transform: XToBoolean });\r\n  /**\r\n   * @zh_CN 显示面包屑\r\n   * @en_US Show breadcrumbs\r\n   */\r\n  readonly showCrumb = input<boolean, XBoolean>(true, { transform: XToBoolean });\r\n  /**\r\n   * @zh_CN 最大高度\r\n   * @en_US Maximum height\r\n   */\r\n  readonly maxHeight = input<string, XNumber>(this.config?.maxHeight ?? '37.5rem', { transform: XToCssPixelValue });\r\n  /**\r\n   * @zh_CN 单位间距，这个与层级的乘积算出节点的左边距\r\n   * @en_US Unit spacing, the product of this and the level calculates the left margin of the node\r\n   */\r\n  readonly spacing = input<string, XNumber>(this.config?.spacing ?? '1rem', { transform: XToCssPixelValue });\r\n  /**\r\n   * @zh_CN 当前激活的节点 Id, 当 multiple 为 true 时，值为数组（默认是 Id 数组，objectArray 为 true，对象数组）\r\n   * @en_US Currently active node Id. When Multiple is true, the value is the Id array\r\n   */\r\n  readonly activatedId = model<any>();\r\n  /**\r\n   * @zh_CN 展开的节点\r\n   * @en_US Expanded node\r\n   */\r\n  readonly expanded = input<any[]>([]);\r\n  /**\r\n   * @zh_CN 展开所有节点\r\n   * @en_US Expand all nodes\r\n   */\r\n  readonly expandedAll = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n  /**\r\n   * @zh_CN 默认展开的层级\r\n   * @en_US Default expanded level\r\n   */\r\n  readonly expandedLevel = input<number, XNumber>(-1, { transform: XToNumber });\r\n}\r\n\r\n/**\r\n * @zh_CN TreeFile 数据对象\r\n * @en_US TreeFile data object\r\n */\r\nexport interface XTreeFileNode extends XTreeNode {\r\n  /**\r\n   * @zh_CN 子节点\r\n   * @en_US Child node\r\n   */\r\n  children?: XTreeFileNode[];\r\n  /**\r\n   * @zh_CN 文件内容\r\n   * @en_US Document content\r\n   */\r\n  content?: string;\r\n  /**\r\n   * @zh_CN 文件类型\r\n   * @en_US File type\r\n   */\r\n  type?: string;\r\n  /**\r\n   * @zh_CN 文件分类\r\n   * @en_US File classification\r\n   */\r\n  fileType?: XTreeFileType;\r\n  /**\r\n   * @zh_CN 文件地址，配置了地址将从 url 中加载文件内容\r\n   * @en_US File address, the configured address will load the file content from url\r\n   */\r\n  url?: string;\r\n  /**\r\n   * @zh_CN 文件的面包屑数据\r\n   * @en_US Breadcrumb data\r\n   */\r\n  crumbData?: XCrumbNode[];\r\n  /**\r\n   * @zh_CN 文件内容已经加载过\r\n   * @en_US File content has been loaded\r\n   */\r\n  contentLoaded?: boolean;\r\n  /**\r\n   * @zh_CN 行高亮着色\r\n   * @en_US Line highlight coloring\r\n   */\r\n  highlightLines?: XHighlightLines;\r\n}\r\n\r\n/**\r\n * @zh_CN 文件分类\r\n * @en_US File classification\r\n */\r\nexport type XTreeFileType = 'code' | 'img';\r\n\r\n/**\r\n * @zh_CN 支持显示的图片格式\r\n * @en_US Supported picture format\r\n */\r\nexport const XTreeFileImgs = ['webp', 'png', 'jpg', 'gif', 'jpeg', 'ico'];\r\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, inject, computed, signal } from '@angular/core';\r\nimport { XTreeFilePrefix, XTreeFileProperty, XTreeFileNode, XTreeFileImgs } from './tree-file.property';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { XIsEmpty, XComputedStyle, XToCssPx } from '@ng-nest/ui/core';\r\nimport { XCrumbComponent, XCrumbNode } from '@ng-nest/ui/crumb';\r\nimport { delay, finalize } from 'rxjs/operators';\r\nimport { XHighlightComponent, XHighlightLines } from '@ng-nest/ui/highlight';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { XIconComponent } from '@ng-nest/ui/icon';\r\nimport { XLinkComponent } from '@ng-nest/ui/link';\r\nimport { XLoadingComponent } from '@ng-nest/ui/loading';\r\nimport { XTreeComponent } from '@ng-nest/ui/tree';\r\n\r\n@Component({\r\n  selector: `${XTreeFilePrefix}`,\r\n  imports: [XTreeComponent, XLinkComponent, XCrumbComponent, XIconComponent, XLoadingComponent, XHighlightComponent],\r\n  templateUrl: './tree-file.component.html',\r\n  styleUrls: ['./tree-file.component.scss'],\r\n  encapsulation: ViewEncapsulation.None,\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class XTreeFileComponent extends XTreeFileProperty {\r\n  activatedNode = signal<XTreeFileNode | null>(null);\r\n  loading = signal(false);\r\n  time!: number;\r\n  timeout: number = 200;\r\n  private document = inject(DOCUMENT);\r\n  private fontSize = computed(() => parseFloat(XComputedStyle(this.document.documentElement, 'font-size')));\r\n\r\n  codeHeight = computed(() => {\r\n    return XToCssPx(this.maxHeight(), this.fontSize()) - (this.showCrumb() ? 1.5 : 0) * this.fontSize();\r\n  });\r\n\r\n  crumbData = computed(() => {\r\n    return this.activatedNode()?.crumbData as XCrumbNode[];\r\n  });\r\n\r\n  highlightLines = computed(() => {\r\n    return this.activatedNode()?.highlightLines as XHighlightLines;\r\n  });\r\n\r\n  private http = inject(HttpClient, { optional: true })!;\r\n\r\n  ngOnInit() {\r\n    if (!this.http) {\r\n      throw new Error(\r\n        `${XTreeFilePrefix}: Not found 'HttpClient', You can import 'HttpClientModule' in your root module.`\r\n      );\r\n    }\r\n    if (!this.showTree() && this.activatedId()) {\r\n      this.catalogChange((this.data() as XTreeFileNode[]).find((x) => x.id == this.activatedId()) as XTreeFileNode);\r\n    }\r\n  }\r\n\r\n  catalogChange(node: XTreeFileNode) {\r\n    if (!node?.leaf && this.showTree()) return;\r\n    if (node.url && !node.contentLoaded) {\r\n      this.time = new Date().getTime();\r\n      this.loading.set(true);\r\n      this.setNode(node);\r\n      this.activatedNode.set(node);\r\n      node.url = node.url?.indexOf(this.domain()) === 0 ? node.url : `${this.domain()}/${node.url}`;\r\n\r\n      switch (node.fileType) {\r\n        case 'code':\r\n          this.http\r\n            .get(node.url, { responseType: 'text' })\r\n            .pipe(\r\n              delay(\r\n                new Date().getTime() - this.time > this.timeout ? 0 : this.timeout - new Date().getTime() + this.time\r\n              ),\r\n              finalize(() => {\r\n                this.loading.set(false);\r\n              })\r\n            )\r\n            .subscribe((x) => {\r\n              node.content = x;\r\n              node.contentLoaded = true;\r\n              this.loading.set(false);\r\n            });\r\n          break;\r\n        case 'img':\r\n          break;\r\n      }\r\n    } else {\r\n      this.activatedNode.set(node);\r\n      this.setNode(this.activatedNode()!);\r\n    }\r\n  }\r\n\r\n  setNode(node: XTreeFileNode) {\r\n    if (!node.type) {\r\n      node.type = 'bash';\r\n    }\r\n    if (!node.fileType) {\r\n      node.fileType = XTreeFileImgs.indexOf((node.type as string).toLowerCase()) !== -1 ? 'img' : 'code';\r\n    }\r\n    if (!node.crumbData) {\r\n      node.crumbData = this.setCurmbData(node);\r\n    }\r\n  }\r\n\r\n  imgOnload() {\r\n    this.loading.set(false);\r\n  }\r\n\r\n  setCurmbData(node: XTreeFileNode) {\r\n    let crumbData: XCrumbNode[] = [{ id: node.id, label: node.label }];\r\n    const getParent = (child: XTreeFileNode) => {\r\n      if (XIsEmpty(child.pid)) return;\r\n      const parent = (this.data() as XTreeFileNode[]).find((x) => x.id === child.pid) as XTreeFileNode;\r\n      if (!XIsEmpty(parent)) {\r\n        crumbData = [{ id: parent.id, label: parent.label }, ...crumbData];\r\n        getParent(parent);\r\n      }\r\n    };\r\n    getParent(node);\r\n\r\n    return crumbData;\r\n  }\r\n\r\n  menuToggle() {\r\n    this.toggle.update((x) => !x);\r\n  }\r\n}\r\n","<div #treeFile class=\"x-tree-file\" [class.x-tree-file-toggle]=\"toggle()\">\r\n  @if (showTree()) {\r\n    <div class=\"x-tree-file-catalog\" [style.max-height]=\"maxHeight()\">\r\n      <x-tree\r\n        [data]=\"data()\"\r\n        (activatedChange)=\"catalogChange($event)\"\r\n        nodeOpen\r\n        [expandedAll]=\"expandedAll()\"\r\n        [expandedLevel]=\"expandedLevel()\"\r\n        [expanded]=\"expanded()\"\r\n        [spacing]=\"spacing()\"\r\n        [(activatedId)]=\"activatedId\"\r\n      ></x-tree>\r\n    </div>\r\n  }\r\n  <div class=\"x-tree-file-body\" [x-loading]=\"loading()\">\r\n    @if (showCrumb()) {\r\n      <div class=\"x-tree-file-crumb\">\r\n        @if (showToggle() && showTree()) {\r\n          <x-link class=\"x-tree-file-menu\" icon=\"fto-menu\" (click)=\"menuToggle()\"></x-link>\r\n        }\r\n        <x-crumb [data]=\"crumbData()\" [separator]=\"separatorTpl\"></x-crumb>\r\n        <ng-template #separatorTpl>\r\n          <x-icon type=\"fto-chevron-right\"></x-icon>\r\n        </ng-template>\r\n      </div>\r\n    }\r\n\r\n    <div class=\"x-tree-file-content\" [style.max-height.px]=\"codeHeight()\">\r\n      @switch (activatedNode()?.fileType) {\r\n        @case ('img') {\r\n          <div class=\"x-tree-file-img\"><img [src]=\"activatedNode()?.url\" (load)=\"imgOnload()\" /></div>\r\n        }\r\n        @case ('code') {\r\n          <x-highlight\r\n            [type]=\"activatedNode()?.type\"\r\n            [data]=\"activatedNode()?.content\"\r\n            [highlightLines]=\"highlightLines()\"\r\n          ></x-highlight>\r\n        }\r\n      }\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { XTreeFileComponent } from './tree-file.component';\r\n\r\n@NgModule({\r\n  exports: [XTreeFileComponent],\r\n  imports: [XTreeFileComponent]\r\n})\r\nexport class XTreeFileModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}