inugami-ng 0.0.14 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ElementRef, input, effect, Directive, signal, Component } from '@angular/core';
3
- import { CacheServices } from 'inugami-ng/services';
3
+ import { InuCacheServices } from 'inugami-ng/services';
4
4
  import { map, tap, shareReplay } from 'rxjs';
5
5
  import { HttpClient } from '@angular/common/http';
6
6
  import hljs from 'highlight.js';
@@ -44,7 +44,7 @@ class InuCode {
44
44
  type = input(undefined, ...(ngDevMode ? [{ debugName: "type" }] : []));
45
45
  title = input(undefined, ...(ngDevMode ? [{ debugName: "title" }] : []));
46
46
  http = inject(HttpClient);
47
- cache = inject(CacheServices);
47
+ cache = inject(InuCacheServices);
48
48
  sourceCode = signal('', ...(ngDevMode ? [{ debugName: "sourceCode" }] : []));
49
49
  _title = signal('', ...(ngDevMode ? [{ debugName: "_title" }] : []));
50
50
  _type = signal('', ...(ngDevMode ? [{ debugName: "_type" }] : []));
@@ -1 +1 @@
1
- {"version":3,"file":"inugami-ng-components-inu-code.mjs","sources":["../../../projects/inugami-ng/components/inu-code/inu-code.directive.ts","../../../projects/inugami-ng/components/inu-code/inu-code.ts","../../../projects/inugami-ng/components/inu-code/inu-code.html","../../../projects/inugami-ng/components/inu-code/inugami-ng-components-inu-code.ts"],"sourcesContent":["import { Directive, ElementRef, inject, input, effect } from '@angular/core';\nimport hljs from 'highlight.js';\n\n@Directive({\n selector: 'code[inuHighlight], pre[inuHighlight]',\n standalone: true\n})\nexport class InuHighlightDirective {\n private el = inject(ElementRef);\n\n // On utilise des signaux pour la réactivité\n code = input<string>('', { alias: 'inuHighlight' });\n lang = input<string | undefined | null>(undefined);\n\n constructor() {\n effect(() => {\n const codeValue = this.code() || '';\n const language = this.lang() || '';\n const nativeElement = this.el.nativeElement;\n\n // Reset du contenu et application de la coloration\n nativeElement.textContent = codeValue;\n if (language) {\n nativeElement.className = `language-${language}`;\n }\n\n hljs.highlightElement(nativeElement);\n });\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport {CacheServices} from \"inugami-ng/services\";\nimport {map, shareReplay, tap} from \"rxjs\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {SourceCode} from './code.model';\nimport {InuHighlightDirective} from './inu-code.directive';\n\n\n@Component({\n selector: 'inu-code',\n standalone: true,\n imports: [InuHighlightDirective],\n templateUrl: './inu-code.html',\n styleUrl: './inu-code.scss',\n})\nexport class InuCode {\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n source = input<string | undefined | null>(undefined);\n url = input<string | undefined | null>(undefined);\n tag = input<string | undefined | null>(undefined);\n type = input<string | undefined | null>(undefined);\n title = input<string | undefined | null>(undefined);\n\n\n private readonly http = inject(HttpClient);\n private readonly cache = inject(CacheServices);\n\n sourceCode = signal<string>('');\n _title = signal<string>('');\n _type = signal<string>('');\n\n //==================================================================================================================\n // INITIALIZE\n //==================================================================================================================\n constructor() {\n effect(() => this.init());\n }\n\n init(): void {\n const url = this.url();\n if(this.title()){\n this._title.set(this.title()!);\n }\n\n if (url) {\n this.loadFormUrl(url);\n } else {\n const source = this.source();\n if (source) {\n this.sourceCode.set(source);\n }\n }\n }\n\n loadFormUrl(url: string) {\n\n const data = this.loadFormCache(url);\n if (data) {\n this.initSourceCode(data);\n return;\n }\n const cacheKey = `inu-code_${url}`;\n const pending = this.cache.getPending(cacheKey);\n if (pending) {\n pending.subscribe(res => this.initSourceCode(res));\n return;\n }\n\n const request = this.http.get(url, {responseType: 'text'})\n .pipe(map(res => this.parseData(res, url)),\n tap(data => this.cache.set(cacheKey, data)),\n shareReplay(1)\n );\n this.cache.setPending(cacheKey, request);\n request.subscribe();\n\n }\n\n\n initSourceCode(data: SourceCode[]) {\n\n const values = data.filter(i => this.tag() === i.name);\n if (values.length > 0) {\n const sourceCodeValue = values[0];\n this.sourceCode.set(sourceCodeValue.content!);\n\n const currentTitle = this.title();\n\n if(this.title()){\n this._title.set(this.title()!);\n }else if (sourceCodeValue.title) {\n this._title.set(sourceCodeValue.title);\n }\n\n if(this.type()){\n this._type.set(this.type()!);\n }else if (sourceCodeValue.type) {\n this._type.set(sourceCodeValue.type);\n }\n }\n }\n\n\n //==================================================================================================================\n // PARSE\n //==================================================================================================================\n parseData(response: string, url: string): SourceCode[] {\n const parser = new DOMParser();\n const node = parser.parseFromString(response, \"text/xml\");\n const sources = node.getElementsByTagName(\"src\");\n\n const result: SourceCode[] = [];\n for (let i = 0; i < sources.length; i++) {\n let sourceNode = sources[i];\n let sourceName: string = sourceNode.getAttribute('name') ?? '';\n let sourceContent: string = this.cleanContent(sourceNode.textContent ?? '');\n let type: string | undefined = sourceNode.getAttribute('type') ?? undefined;\n let title: string | undefined = sourceNode.getAttribute('title') ?? undefined;\n\n result.push({\n name: sourceName,\n content: sourceContent,\n type: type,\n title: title\n })\n }\n\n this.initSourceCode(result);\n return result;\n }\n\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n loadFormCache(url: string): SourceCode[] | undefined {\n const cacheKey = `inu-code_${url}`;\n const result: SourceCode[] | undefined = this.cache.get(cacheKey);\n return result;\n }\n\n setToCache(url: string, value: any): void {\n const cacheKey = `inu-code_${url}`;\n if (value) {\n this.cache.set(cacheKey, value);\n }\n }\n\n\n private cleanContent(value: string): string {\n let result: string[] = [];\n let buffer: string[] = [];\n\n let line = value.split(\"\\n\");\n\n let enableClean = false;\n for (let i = 0; i < line.length; i++) {\n if (enableClean || line[i].trim() != '') {\n buffer.push(line[i]);\n enableClean = true;\n }\n }\n enableClean = false;\n for (let i = buffer.length - 1; i >= 0; i--) {\n if (enableClean || buffer[i].trim() != '') {\n result.push(buffer[i]);\n enableClean = true;\n }\n }\n\n result.reverse();\n\n return result.join('\\n');\n }\n}\n","<div class=\"inu-code\">\n <fieldset>\n @if(_title()){\n <legend>{{_title()}}</legend>\n }\n\n @if(sourceCode()){\n <div class=\"source-code\">\n<pre [inuHighlight]=\"sourceCode()\" lang=\"java\" >\n</pre>\n </div>\n }\n\n </fieldset>\n\n\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inugami-ng-components-inu-code.mjs","sources":["../../../projects/inugami-ng/components/inu-code/inu-code.directive.ts","../../../projects/inugami-ng/components/inu-code/inu-code.ts","../../../projects/inugami-ng/components/inu-code/inu-code.html","../../../projects/inugami-ng/components/inu-code/inugami-ng-components-inu-code.ts"],"sourcesContent":["import { Directive, ElementRef, inject, input, effect } from '@angular/core';\nimport hljs from 'highlight.js';\n\n@Directive({\n selector: 'code[inuHighlight], pre[inuHighlight]',\n standalone: true\n})\nexport class InuHighlightDirective {\n private el = inject(ElementRef);\n\n // On utilise des signaux pour la réactivité\n code = input<string>('', { alias: 'inuHighlight' });\n lang = input<string | undefined | null>(undefined);\n\n constructor() {\n effect(() => {\n const codeValue = this.code() || '';\n const language = this.lang() || '';\n const nativeElement = this.el.nativeElement;\n\n // Reset du contenu et application de la coloration\n nativeElement.textContent = codeValue;\n if (language) {\n nativeElement.className = `language-${language}`;\n }\n\n hljs.highlightElement(nativeElement);\n });\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport {InuCacheServices} from \"inugami-ng/services\";\nimport {map, shareReplay, tap} from \"rxjs\";\nimport {HttpClient} from \"@angular/common/http\";\nimport {SourceCode} from './code.model';\nimport {InuHighlightDirective} from './inu-code.directive';\n\n\n@Component({\n selector: 'inu-code',\n standalone: true,\n imports: [InuHighlightDirective],\n templateUrl: './inu-code.html',\n styleUrl: './inu-code.scss',\n})\nexport class InuCode {\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n source = input<string | undefined | null>(undefined);\n url = input<string | undefined | null>(undefined);\n tag = input<string | undefined | null>(undefined);\n type = input<string | undefined | null>(undefined);\n title = input<string | undefined | null>(undefined);\n\n\n private readonly http = inject(HttpClient);\n private readonly cache = inject(InuCacheServices);\n\n sourceCode = signal<string>('');\n _title = signal<string>('');\n _type = signal<string>('');\n\n //==================================================================================================================\n // INITIALIZE\n //==================================================================================================================\n constructor() {\n effect(() => this.init());\n }\n\n init(): void {\n const url = this.url();\n if(this.title()){\n this._title.set(this.title()!);\n }\n\n if (url) {\n this.loadFormUrl(url);\n } else {\n const source = this.source();\n if (source) {\n this.sourceCode.set(source);\n }\n }\n }\n\n loadFormUrl(url: string) {\n\n const data = this.loadFormCache(url);\n if (data) {\n this.initSourceCode(data);\n return;\n }\n\n const cacheKey = `inu-code_${url}`;\n const pending = this.cache.getPending(cacheKey);\n\n if (pending) {\n pending.subscribe(res =>this.initSourceCode(res));\n return;\n }\n\n const request = this.http.get(url, {responseType: 'text'})\n .pipe(map(res => this.parseData(res, url)),\n tap(data => this.cache.set(cacheKey, data)),\n shareReplay(1)\n );\n this.cache.setPending(cacheKey, request);\n request.subscribe();\n\n }\n\n\n initSourceCode(data: SourceCode[]) {\n\n const values = data.filter(i => this.tag() === i.name);\n if (values.length > 0) {\n const sourceCodeValue = values[0];\n this.sourceCode.set(sourceCodeValue.content!);\n\n const currentTitle = this.title();\n\n if(this.title()){\n this._title.set(this.title()!);\n }else if (sourceCodeValue.title) {\n this._title.set(sourceCodeValue.title);\n }\n\n if(this.type()){\n this._type.set(this.type()!);\n }else if (sourceCodeValue.type) {\n this._type.set(sourceCodeValue.type);\n }\n }\n }\n\n\n //==================================================================================================================\n // PARSE\n //==================================================================================================================\n parseData(response: string, url: string): SourceCode[] {\n const parser = new DOMParser();\n const node = parser.parseFromString(response, \"text/xml\");\n const sources = node.getElementsByTagName(\"src\");\n\n const result: SourceCode[] = [];\n for (let i = 0; i < sources.length; i++) {\n let sourceNode = sources[i];\n let sourceName: string = sourceNode.getAttribute('name') ?? '';\n let sourceContent: string = this.cleanContent(sourceNode.textContent ?? '');\n let type: string | undefined = sourceNode.getAttribute('type') ?? undefined;\n let title: string | undefined = sourceNode.getAttribute('title') ?? undefined;\n\n result.push({\n name: sourceName,\n content: sourceContent,\n type: type,\n title: title\n })\n }\n\n this.initSourceCode(result);\n return result;\n }\n\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n loadFormCache(url: string): SourceCode[] | undefined {\n const cacheKey = `inu-code_${url}`;\n const result: SourceCode[] | undefined = this.cache.get(cacheKey);\n return result;\n }\n\n setToCache(url: string, value: any): void {\n const cacheKey = `inu-code_${url}`;\n if (value) {\n this.cache.set(cacheKey, value);\n }\n }\n\n\n private cleanContent(value: string): string {\n let result: string[] = [];\n let buffer: string[] = [];\n\n let line = value.split(\"\\n\");\n\n let enableClean = false;\n for (let i = 0; i < line.length; i++) {\n if (enableClean || line[i].trim() != '') {\n buffer.push(line[i]);\n enableClean = true;\n }\n }\n enableClean = false;\n for (let i = buffer.length - 1; i >= 0; i--) {\n if (enableClean || buffer[i].trim() != '') {\n result.push(buffer[i]);\n enableClean = true;\n }\n }\n\n result.reverse();\n\n return result.join('\\n');\n }\n}\n","<div class=\"inu-code\">\n <fieldset>\n @if(_title()){\n <legend>{{_title()}}</legend>\n }\n\n @if(sourceCode()){\n <div class=\"source-code\">\n<pre [inuHighlight]=\"sourceCode()\" lang=\"java\" >\n</pre>\n </div>\n }\n\n </fieldset>\n\n\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, contentChildren, signal, effect, Component } from '@angular/core';
3
3
  import { InuIcon } from 'inugami-icons';
4
- import { UuidUtils } from 'inugami-ng/services';
4
+ import { UuidUtils } from 'inugami-ng/utils';
5
5
 
6
6
  class InuDocItem {
7
7
  //==================================================================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"inugami-ng-components-inu-doc-item.mjs","sources":["../../../projects/inugami-ng/components/inu-doc-item/inu-doc-item.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-item.html","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/node/inu-doc-summary-node.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/node/inu-doc-summary-node.html","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/inu-doc-summary.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/inu-doc-summary.html","../../../projects/inugami-ng/components/inu-doc-item/inugami-ng-components-inu-doc-item.ts"],"sourcesContent":["import {Component, contentChildren, effect, input, signal, viewChildren} from '@angular/core';\nimport {InuDocItemComponentData} from './inu-doc-item.model';\nimport {InuIcon} from 'inugami-icons';\nimport {UuidUtils} from 'inugami-ng/services';\n\n@Component({\n selector: 'inu-doc-item',\n standalone: true,\n providers: [],\n imports: [\n InuIcon\n ],\n templateUrl: './inu-doc-item.html',\n styleUrl: './inu-doc-item.scss',\n})\nexport class InuDocItem {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n readonly styleClass = input<string | undefined | null>('');\n readonly icon = input<string | null>('');\n readonly title = input<string | undefined | null>('');\n readonly href = input<string | undefined | null>('');\n readonly id = input<string | undefined | null>('');\n readonly level = input<number | undefined | null>(2);\n readonly children = contentChildren(InuDocItem);\n //\n _styleClass = signal<string>('');\n iconSize = signal<number>(1);\n data = signal<InuDocItemComponentData | undefined>(undefined);\n _data: InuDocItemComponentData | undefined = undefined;\n uid: string = UuidUtils.buildUid();\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n effect(() => {\n this.initStyleClass();\n this.init();\n });\n }\n\n init() {\n const title = this.title() ? this.title() : '';\n const href = this.href() ? this.href() : '';\n const id = this.id() ? this.id() : '';\n const level = this.level() ? this.level() : 2;\n\n const fullHref: string[] = [];\n if (href) {\n fullHref.push(href);\n if (id) {\n fullHref.push(id);\n }\n }\n const value: InuDocItemComponentData = {\n title: title!,\n href: fullHref.join('#'),\n id: id!,\n level: level!\n }\n this._data = value;\n this.data.set(value);\n\n\n switch (level) {\n case 1:\n this.iconSize.set(3);\n break;\n case 2:\n this.iconSize.set(2);\n break;\n default :\n this.iconSize.set(1);\n break;\n }\n }\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n private initStyleClass() {\n const styles: string[] = ['inu-doc-item'];\n const style = this.styleClass();\n if (style) {\n styles.push(style);\n }\n\n const level = this.level();\n if (level) {\n styles.push(`level-${level}`);\n }\n this._styleClass.set(styles.join(\" \"));\n }\n}\n","<section [class]=\"_styleClass()\" >\n <header [id]=\"data()?.id\">\n @if(data()?.href) {\n <a [href]=\"data()?.href\" class=\"anchor-link\">\n <div class=\"anchor\">\n @if(icon()){\n <div class=\"inug-doc-item-icon\">\n <inu-icon [icon]=\"icon()\" [size]=\"iconSize()\"></inu-icon>\n </div>\n }\n @if(data()?.level==1){\n <h1 class=\"title\">{{data()?.title}}</h1>\n }\n @if(data()?.level==2){\n <h2 class=\"title\">{{data()?.title}}</h2>\n }\n @else if (data()?.level==3) {\n <h3 class=\"title\">{{data()?.title}}</h3>\n }\n @else if (data()?.level==4) {\n <h4 class=\"title\">{{data()?.title}}</h4>\n }\n @else if (data()?.level==5) {\n <h5 class=\"title\">{{data()?.title}}</h5>\n }\n @else {\n <h6 class=\"title\">{{data()?.title}}</h6>\n }\n <div class=\"anchor-icon\">\n <inu-icon icon=\"link\" [size]=\"1\"></inu-icon>\n </div>\n </div>\n </a>\n }\n @else{\n <div class=\"anchor\">\n @if(icon()){\n <div class=\"inug-doc-item-icon\">\n <inu-icon [icon]=\"icon()\" [size]=\"iconSize()\"></inu-icon>\n </div>\n }\n @if(data()?.level==1){\n <h1 class=\"title\">{{data()?.title}}</h1>\n }\n @if(data()?.level==2){\n <h2 class=\"title\">{{data()?.title}}</h2>\n }\n @else if (data()?.level==3) {\n <h3 class=\"title\">{{data()?.title}}</h3>\n }\n @else if (data()?.level==4) {\n <h4 class=\"title\">{{data()?.title}}</h4>\n }\n @else if (data()?.level==5) {\n <h5 class=\"title\">{{data()?.title}}</h5>\n }\n @else {\n <h6 class=\"title\">{{data()?.title}}</h6>\n }\n <div class=\"anchor-icon\">\n <inu-icon icon=\"link\" [size]=\"1\"></inu-icon>\n </div>\n </div>\n }\n\n </header>\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</section>\n","import {Component, input} from '@angular/core';\nimport {InuDocItem} from '../../inu-doc-item';\nimport {TreeNode} from 'inugami-ng/models';\n\n@Component({\n selector: 'inu-doc-summary-node',\n standalone: true,\n providers: [],\n imports: [],\n templateUrl: './inu-doc-summary-node.html',\n styleUrl: './inu-doc-summary-node.scss',\n})\nexport class InuDocSummaryNode {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n nodes = input<TreeNode<InuDocItem>[] | undefined>(undefined);\n maxLevel = input<number>(3);\n //==================================================================================================================\n // BUILDER\n //==================================================================================================================\n buildHref(nodeValue: any): string {\n const result: string[] = [];\n const href = nodeValue.href();\n if (href) {\n result.push(href);\n const id = nodeValue.id();\n if (id) {\n result.push(id)\n }\n }\n\n\n return result.join('#');\n }\n\n\n protected getTitle(value: any): string {\n return value && value.title ? value.title : '';\n }\n\n protected computeClass(node: TreeNode<InuDocItem>): string {\n const result: string[] = [];\n result.push('level');\n result.push('level-' + node.level);\n return result.join(' ');\n }\n\n protected acceptedLevels(): boolean {\n const nodes = this.nodes();\n if (!nodes || nodes.length == 0) {\n return false;\n }\n\n const level = nodes[0].level + 1;\n const maxLevel = this.maxLevel();\n return level <= maxLevel;\n }\n}\n","@if (nodes() && acceptedLevels()) {\n <ul class=\"inu-doc-summary-node\">\n @for (node of nodes(); track node; ) {\n <li [class]=\"computeClass(node)\">\n <div class=\"inu-doc-summary-node-title\">\n @if (node.value?.href){\n <a [href]=\"node.value?.href\">\n <div class=\"inu-doc-summary-title\">{{node.value?.title!}}</div>\n </a>\n } @else {\n <div class=\"inu-doc-summary-title\">{{node.value?.title!}}</div>\n }\n </div>\n @if (node.children){\n <inu-doc-summary-node [nodes]=\"node.children\" [maxLevel]=\"maxLevel()\"> </inu-doc-summary-node>\n }\n </li>\n }\n </ul>\n}\n","import {AfterViewInit, Component, effect, input, signal} from '@angular/core';\nimport {InuDocItem} from '../inu-doc-item';\nimport {TreeNode} from 'inugami-ng/models';\nimport {InuDocSummaryNode} from './node/inu-doc-summary-node';\n\n@Component({\n selector: 'inu-doc-summary',\n standalone: true,\n providers: [],\n imports: [\n InuDocSummaryNode\n ],\n templateUrl: './inu-doc-summary.html',\n styleUrl: './inu-doc-summary.scss',\n})\nexport class InuDocSummary implements AfterViewInit{\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n styleClass = input<string | undefined | null>('');\n children = input<readonly InuDocItem[] | undefined>(undefined);\n maxLevel = input<number>(3);\n //\n _styleClass = signal<string>('');\n nodes = signal<TreeNode<InuDocItem>[]>([]);\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n effect(() => {\n this.initStyleClass();\n this.init();\n });\n }\n\n ngAfterViewInit(): void {\n this.init();\n }\n\n init() {\n const children = this.children();\n if (!children) {\n return;\n }\n\n const compMap = new Map<string, any>();\n children.forEach(c => compMap.set(c.uid, c));\n\n const parentMap = new Map<string, string>(); // childUid -> parentUid\n children.forEach(parent => {\n const childrenOfThisParent = parent.children() || [];\n childrenOfThisParent.forEach((child: any) => {\n parentMap.set(child.uid, parent.uid);\n });\n });\n\n const roots = children.filter(c => !parentMap.has(c.uid));\n\n const result = roots.map(root => this.mapComponentToNode(root, 0));\n this.nodes.set(result);\n }\n\n private mapComponentToNode(comp: any, level: number): TreeNode<any> {\n return {\n uid: comp.uid,\n level: level,\n value: comp.data ? comp.data() : comp, // On récupère la valeur ou le composant\n children: comp.children()\n ? comp.children().map((child: any) => this.mapComponentToNode(child, level + 1))\n : []\n };\n }\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n private initStyleClass() {\n const styles: string[] = ['inu-doc-summary'];\n const style = this.styleClass();\n if (style) {\n styles.push(style);\n }\n\n\n this._styleClass.set(styles.join(\" \"));\n }\n}\n","<div [class]=\"_styleClass()\" >\n @if (nodes()){\n <inu-doc-summary-node [nodes]=\"nodes()\" [maxLevel]=\"maxLevel()\"> </inu-doc-summary-node>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAea,UAAU,CAAA;;;;AAMZ,IAAA,UAAU,GAAG,KAAK,CAA4B,EAAE,sDAAC;AACjD,IAAA,IAAI,GAAG,KAAK,CAAgB,EAAE,gDAAC;AAC/B,IAAA,KAAK,GAAG,KAAK,CAA4B,EAAE,iDAAC;AAC5C,IAAA,IAAI,GAAG,KAAK,CAA4B,EAAE,gDAAC;AAC3C,IAAA,EAAE,GAAG,KAAK,CAA4B,EAAE,8CAAC;AACzC,IAAA,KAAK,GAAG,KAAK,CAA4B,CAAC,iDAAC;AAC3C,IAAA,QAAQ,GAAG,eAAe,CAAC,UAAU,oDAAC;;AAE/C,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;AAChC,IAAA,QAAQ,GAAG,MAAM,CAAS,CAAC,oDAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAsC,SAAS,gDAAC;IAC7D,KAAK,GAAwC,SAAS;AACtD,IAAA,GAAG,GAAW,SAAS,CAAC,QAAQ,EAAE;;;;AAKlC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC,CAAC;IACJ;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;AAC3C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;QAE7C,MAAM,QAAQ,GAAa,EAAE;QAC7B,IAAI,IAAI,EAAE;AACR,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,EAAE;AACN,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB;QACF;AACA,QAAA,MAAM,KAAK,GAA4B;AACrC,YAAA,KAAK,EAAE,KAAM;AACb,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,YAAA,EAAE,EAAE,EAAG;AACP,YAAA,KAAK,EAAE;SACR;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAGpB,QAAQ,KAAK;AACX,YAAA,KAAK,CAAC;AACJ,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB;AACF,YAAA,KAAK,CAAC;AACJ,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB;AACF,YAAA;AACE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB;;IAEN;;;;IAKQ,cAAc,GAAA;AACpB,QAAA,MAAM,MAAM,GAAa,CAAC,cAAc,CAAC;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACpB;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAA,CAAE,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC;uGAjFW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,uxBAPV,EAAE,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAmBuB,UAAU,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BhD,moEAsEA,4mCD5DI,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKE,UAAU,EAAA,UAAA,EAAA,CAAA;kBAVtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,SAAA,EACL,EAAE,EAAA,OAAA,EACJ;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,moEAAA,EAAA,MAAA,EAAA,CAAA,ojCAAA,CAAA,EAAA;spBAgBmC,UAAU,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEfnC,iBAAiB,CAAA;;;;AAM5B,IAAA,KAAK,GAAG,KAAK,CAAqC,SAAS,iDAAC;AAC5D,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,oDAAC;;;;AAI3B,IAAA,SAAS,CAAC,SAAc,EAAA;QACtB,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE;QAC7B,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACjB,YAAA,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,EAAE;YACzB,IAAI,EAAE,EAAE;AACN,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB;QACF;AAGA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACzB;AAGU,IAAA,QAAQ,CAAC,KAAU,EAAA;AAC3B,QAAA,OAAO,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE;IAChD;AAEU,IAAA,YAAY,CAAC,IAA0B,EAAA;QAC/C,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;AAClC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACzB;IAEU,cAAc,GAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AAC/B,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,OAAO,KAAK,IAAI,QAAQ;IAC1B;uGA/CW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EALjB,EAAE,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECPf,osBAoBA,olBDRa,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,SAAA,EACL,EAAE,WACJ,EAAE,EAAA,QAAA,EAAA,osBAAA,EAAA,MAAA,EAAA,CAAA,4hBAAA,CAAA,EAAA;;;MEOA,aAAa,CAAA;;;;AAMxB,IAAA,UAAU,GAAG,KAAK,CAA4B,EAAE,sDAAC;AACjD,IAAA,QAAQ,GAAG,KAAK,CAAoC,SAAS,oDAAC;AAC9D,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,oDAAC;;AAE3B,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAyB,EAAE,iDAAC;;;;AAK1C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe;AACtC,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAE5C,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC5C,QAAA,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAG;YACxB,MAAM,oBAAoB,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE;AACpD,YAAA,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAAU,KAAI;gBAC1C,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AACtC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEzD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;IACxB;IAEQ,kBAAkB,CAAC,IAAS,EAAE,KAAa,EAAA;QACjD,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;AACb,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;AACrC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ;kBACnB,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,KAAU,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;AAC/E,kBAAE;SACL;IACH;;;;IAKQ,cAAc,GAAA;AACpB,QAAA,MAAM,MAAM,GAAa,CAAC,iBAAiB,CAAC;AAC5C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACpB;AAGA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC;uGAzEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAPb,EAAE,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECRf,qKAKA,4mCDKI,iBAAiB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAKR,aAAa,EAAA,UAAA,EAAA,CAAA;kBAVzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,SAAA,EACL,EAAE,EAAA,OAAA,EACJ;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,qKAAA,EAAA,MAAA,EAAA,CAAA,ojCAAA,CAAA,EAAA;;;AEXH;;AAEG;;;;"}
1
+ {"version":3,"file":"inugami-ng-components-inu-doc-item.mjs","sources":["../../../projects/inugami-ng/components/inu-doc-item/inu-doc-item.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-item.html","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/node/inu-doc-summary-node.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/node/inu-doc-summary-node.html","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/inu-doc-summary.ts","../../../projects/inugami-ng/components/inu-doc-item/inu-doc-summary/inu-doc-summary.html","../../../projects/inugami-ng/components/inu-doc-item/inugami-ng-components-inu-doc-item.ts"],"sourcesContent":["import {Component, contentChildren, effect, input, signal} from '@angular/core';\nimport {InuDocItemComponentData} from './inu-doc-item.model';\nimport {InuIcon} from 'inugami-icons';\nimport {UuidUtils} from 'inugami-ng/utils';\n\n@Component({\n selector: 'inu-doc-item',\n standalone: true,\n providers: [],\n imports: [\n InuIcon\n ],\n templateUrl: './inu-doc-item.html',\n styleUrl: './inu-doc-item.scss',\n})\nexport class InuDocItem {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n readonly styleClass = input<string | undefined | null>('');\n readonly icon = input<string | null>('');\n readonly title = input<string | undefined | null>('');\n readonly href = input<string | undefined | null>('');\n readonly id = input<string | undefined | null>('');\n readonly level = input<number | undefined | null>(2);\n readonly children = contentChildren(InuDocItem);\n //\n _styleClass = signal<string>('');\n iconSize = signal<number>(1);\n data = signal<InuDocItemComponentData | undefined>(undefined);\n _data: InuDocItemComponentData | undefined = undefined;\n uid: string = UuidUtils.buildUid();\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n effect(() => {\n this.initStyleClass();\n this.init();\n });\n }\n\n init() {\n const title = this.title() ? this.title() : '';\n const href = this.href() ? this.href() : '';\n const id = this.id() ? this.id() : '';\n const level = this.level() ? this.level() : 2;\n\n const fullHref: string[] = [];\n if (href) {\n fullHref.push(href);\n if (id) {\n fullHref.push(id);\n }\n }\n const value: InuDocItemComponentData = {\n title: title!,\n href: fullHref.join('#'),\n id: id!,\n level: level!\n }\n this._data = value;\n this.data.set(value);\n\n\n switch (level) {\n case 1:\n this.iconSize.set(3);\n break;\n case 2:\n this.iconSize.set(2);\n break;\n default :\n this.iconSize.set(1);\n break;\n }\n }\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n private initStyleClass() {\n const styles: string[] = ['inu-doc-item'];\n const style = this.styleClass();\n if (style) {\n styles.push(style);\n }\n\n const level = this.level();\n if (level) {\n styles.push(`level-${level}`);\n }\n this._styleClass.set(styles.join(\" \"));\n }\n}\n","<section [class]=\"_styleClass()\" >\n <header [id]=\"data()?.id\">\n @if(data()?.href) {\n <a [href]=\"data()?.href\" class=\"anchor-link\">\n <div class=\"anchor\">\n @if(icon()){\n <div class=\"inug-doc-item-icon\">\n <inu-icon [icon]=\"icon()\" [size]=\"iconSize()\"></inu-icon>\n </div>\n }\n @if(data()?.level==1){\n <h1 class=\"title\">{{data()?.title}}</h1>\n }\n @if(data()?.level==2){\n <h2 class=\"title\">{{data()?.title}}</h2>\n }\n @else if (data()?.level==3) {\n <h3 class=\"title\">{{data()?.title}}</h3>\n }\n @else if (data()?.level==4) {\n <h4 class=\"title\">{{data()?.title}}</h4>\n }\n @else if (data()?.level==5) {\n <h5 class=\"title\">{{data()?.title}}</h5>\n }\n @else {\n <h6 class=\"title\">{{data()?.title}}</h6>\n }\n <div class=\"anchor-icon\">\n <inu-icon icon=\"link\" [size]=\"1\"></inu-icon>\n </div>\n </div>\n </a>\n }\n @else{\n <div class=\"anchor\">\n @if(icon()){\n <div class=\"inug-doc-item-icon\">\n <inu-icon [icon]=\"icon()\" [size]=\"iconSize()\"></inu-icon>\n </div>\n }\n @if(data()?.level==1){\n <h1 class=\"title\">{{data()?.title}}</h1>\n }\n @if(data()?.level==2){\n <h2 class=\"title\">{{data()?.title}}</h2>\n }\n @else if (data()?.level==3) {\n <h3 class=\"title\">{{data()?.title}}</h3>\n }\n @else if (data()?.level==4) {\n <h4 class=\"title\">{{data()?.title}}</h4>\n }\n @else if (data()?.level==5) {\n <h5 class=\"title\">{{data()?.title}}</h5>\n }\n @else {\n <h6 class=\"title\">{{data()?.title}}</h6>\n }\n <div class=\"anchor-icon\">\n <inu-icon icon=\"link\" [size]=\"1\"></inu-icon>\n </div>\n </div>\n }\n\n </header>\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</section>\n","import {Component, input} from '@angular/core';\nimport {InuDocItem} from '../../inu-doc-item';\nimport {TreeNode} from 'inugami-ng/models';\n\n@Component({\n selector: 'inu-doc-summary-node',\n standalone: true,\n providers: [],\n imports: [],\n templateUrl: './inu-doc-summary-node.html',\n styleUrl: './inu-doc-summary-node.scss',\n})\nexport class InuDocSummaryNode {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n nodes = input<TreeNode<InuDocItem>[] | undefined>(undefined);\n maxLevel = input<number>(3);\n //==================================================================================================================\n // BUILDER\n //==================================================================================================================\n buildHref(nodeValue: any): string {\n const result: string[] = [];\n const href = nodeValue.href();\n if (href) {\n result.push(href);\n const id = nodeValue.id();\n if (id) {\n result.push(id)\n }\n }\n\n\n return result.join('#');\n }\n\n\n protected getTitle(value: any): string {\n return value && value.title ? value.title : '';\n }\n\n protected computeClass(node: TreeNode<InuDocItem>): string {\n const result: string[] = [];\n result.push('level');\n result.push('level-' + node.level);\n return result.join(' ');\n }\n\n protected acceptedLevels(): boolean {\n const nodes = this.nodes();\n if (!nodes || nodes.length == 0) {\n return false;\n }\n\n const level = nodes[0].level + 1;\n const maxLevel = this.maxLevel();\n return level <= maxLevel;\n }\n}\n","@if (nodes() && acceptedLevels()) {\n <ul class=\"inu-doc-summary-node\">\n @for (node of nodes(); track node; ) {\n <li [class]=\"computeClass(node)\">\n <div class=\"inu-doc-summary-node-title\">\n @if (node.value?.href){\n <a [href]=\"node.value?.href\">\n <div class=\"inu-doc-summary-title\">{{node.value?.title!}}</div>\n </a>\n } @else {\n <div class=\"inu-doc-summary-title\">{{node.value?.title!}}</div>\n }\n </div>\n @if (node.children){\n <inu-doc-summary-node [nodes]=\"node.children\" [maxLevel]=\"maxLevel()\"> </inu-doc-summary-node>\n }\n </li>\n }\n </ul>\n}\n","import {AfterViewInit, Component, effect, input, signal} from '@angular/core';\nimport {InuDocItem} from '../inu-doc-item';\nimport {TreeNode} from 'inugami-ng/models';\nimport {InuDocSummaryNode} from './node/inu-doc-summary-node';\n\n@Component({\n selector: 'inu-doc-summary',\n standalone: true,\n providers: [],\n imports: [\n InuDocSummaryNode\n ],\n templateUrl: './inu-doc-summary.html',\n styleUrl: './inu-doc-summary.scss',\n})\nexport class InuDocSummary implements AfterViewInit{\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n styleClass = input<string | undefined | null>('');\n children = input<readonly InuDocItem[] | undefined>(undefined);\n maxLevel = input<number>(3);\n //\n _styleClass = signal<string>('');\n nodes = signal<TreeNode<InuDocItem>[]>([]);\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n effect(() => {\n this.initStyleClass();\n this.init();\n });\n }\n\n ngAfterViewInit(): void {\n this.init();\n }\n\n init() {\n const children = this.children();\n if (!children) {\n return;\n }\n\n const compMap = new Map<string, any>();\n children.forEach(c => compMap.set(c.uid, c));\n\n const parentMap = new Map<string, string>(); // childUid -> parentUid\n children.forEach(parent => {\n const childrenOfThisParent = parent.children() || [];\n childrenOfThisParent.forEach((child: any) => {\n parentMap.set(child.uid, parent.uid);\n });\n });\n\n const roots = children.filter(c => !parentMap.has(c.uid));\n\n const result = roots.map(root => this.mapComponentToNode(root, 0));\n this.nodes.set(result);\n }\n\n private mapComponentToNode(comp: any, level: number): TreeNode<any> {\n return {\n uid: comp.uid,\n level: level,\n value: comp.data ? comp.data() : comp, // On récupère la valeur ou le composant\n children: comp.children()\n ? comp.children().map((child: any) => this.mapComponentToNode(child, level + 1))\n : []\n };\n }\n\n //==================================================================================================================\n // TOOLS\n //==================================================================================================================\n private initStyleClass() {\n const styles: string[] = ['inu-doc-summary'];\n const style = this.styleClass();\n if (style) {\n styles.push(style);\n }\n\n\n this._styleClass.set(styles.join(\" \"));\n }\n}\n","<div [class]=\"_styleClass()\" >\n @if (nodes()){\n <inu-doc-summary-node [nodes]=\"nodes()\" [maxLevel]=\"maxLevel()\"> </inu-doc-summary-node>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, inject, model, computed, output, viewChild, signal, Component } from '@angular/core';
3
3
  import { FormField } from '@angular/forms/signals';
4
- import { UuidUtils } from 'inugami-ng/services';
4
+ import { UuidUtils } from 'inugami-ng/utils';
5
5
  import { Subject, debounceTime } from 'rxjs';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { InuIcon } from 'inugami-icons';
@@ -18,10 +18,10 @@ class InuInputText {
18
18
  type = input('text', ...(ngDevMode ? [{ debugName: "type" }] : []));
19
19
  _required = input(false, { ...(ngDevMode ? { debugName: "_required" } : {}), alias: 'required' });
20
20
  // FormValueControl
21
- formField = inject(FormField, { optional: true });
21
+ _formField = inject(FormField, { optional: true });
22
22
  value = model('', ...(ngDevMode ? [{ debugName: "value" }] : []));
23
23
  valid = computed(() => {
24
- const state = this.formField?.state();
24
+ const state = this._formField?.state();
25
25
  if (!state)
26
26
  return true;
27
27
  const isInvalid = state.invalid();
@@ -74,15 +74,16 @@ class InuInputText {
74
74
  }
75
75
  onFocusOut() {
76
76
  this.focus.set(false);
77
+ this._formField?.state()?.markAsTouched();
77
78
  }
78
79
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuInputText, deps: [], target: i0.ɵɵFactoryTarget.Component });
79
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: InuInputText, isStandalone: true, selector: "inu-input-text", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", changed: "changed" }, providers: [], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n", styles: [".inu-input-text{display:flex;flex-direction:column;width:100%}.inu-input-text label{font-weight:700;font-size:90%;width:auto;transition:color .25s}.inu-input-text inu-icon{width:1rem}.inu-input-text input{border:none;border-bottom:2px solid var(--neutral);transition:border-bottom .25s;outline:none}.inu-input-text input:focus{border-bottom:2px solid var(--secondary-light)}.inu-input-text input.disabled{border-bottom:2px solid var(--neutral-light)}.inu-input-text .inu-input-text-label{display:flex;flex-direction:row;gap:.5rem}.inu-input-text.focus .inu-input-text-label{color:var(--secondary-light);fill:var(--secondary-light)}.inu-input-text.invalid input{border-bottom:1px solid var(--danger)}.inu-input-text.invalid .inu-input-text-label{color:var(--danger);fill:var(--danger)}\n"], dependencies: [{ kind: "component", type: InuIcon, selector: "inu-icon", inputs: ["icon", "defaultIcon", "styleclass", "size"] }] });
80
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: InuInputText, isStandalone: true, selector: "inu-input-text", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", changed: "changed" }, providers: [], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, isSignal: true }], ngImport: i0, template: "<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"_formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n", styles: [".inu-input-text{display:flex;flex-direction:column;width:100%}.inu-input-text label{font-weight:700;font-size:90%;width:auto;transition:color .25s}.inu-input-text inu-icon{width:1rem}.inu-input-text input{border:none;border-bottom:2px solid var(--neutral);transition:border-bottom .25s;outline:none}.inu-input-text input:focus{border-bottom:2px solid var(--secondary-light)}.inu-input-text input.disabled{border-bottom:2px solid var(--neutral-light)}.inu-input-text .inu-input-text-label{display:flex;flex-direction:row;gap:.5rem}.inu-input-text.focus .inu-input-text-label{color:var(--secondary-light);fill:var(--secondary-light)}.inu-input-text.invalid input{border-bottom:1px solid var(--danger)}.inu-input-text.invalid .inu-input-text-label{color:var(--danger);fill:var(--danger)}\n"], dependencies: [{ kind: "component", type: InuIcon, selector: "inu-icon", inputs: ["icon", "defaultIcon", "styleclass", "size"] }] });
80
81
  }
81
82
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: InuInputText, decorators: [{
82
83
  type: Component,
83
84
  args: [{ selector: 'inu-input-text', standalone: true, providers: [], imports: [
84
85
  InuIcon
85
- ], template: "<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n", styles: [".inu-input-text{display:flex;flex-direction:column;width:100%}.inu-input-text label{font-weight:700;font-size:90%;width:auto;transition:color .25s}.inu-input-text inu-icon{width:1rem}.inu-input-text input{border:none;border-bottom:2px solid var(--neutral);transition:border-bottom .25s;outline:none}.inu-input-text input:focus{border-bottom:2px solid var(--secondary-light)}.inu-input-text input.disabled{border-bottom:2px solid var(--neutral-light)}.inu-input-text .inu-input-text-label{display:flex;flex-direction:row;gap:.5rem}.inu-input-text.focus .inu-input-text-label{color:var(--secondary-light);fill:var(--secondary-light)}.inu-input-text.invalid input{border-bottom:1px solid var(--danger)}.inu-input-text.invalid .inu-input-text-label{color:var(--danger);fill:var(--danger)}\n"] }]
86
+ ], template: "<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"_formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n", styles: [".inu-input-text{display:flex;flex-direction:column;width:100%}.inu-input-text label{font-weight:700;font-size:90%;width:auto;transition:color .25s}.inu-input-text inu-icon{width:1rem}.inu-input-text input{border:none;border-bottom:2px solid var(--neutral);transition:border-bottom .25s;outline:none}.inu-input-text input:focus{border-bottom:2px solid var(--secondary-light)}.inu-input-text input.disabled{border-bottom:2px solid var(--neutral-light)}.inu-input-text .inu-input-text-label{display:flex;flex-direction:row;gap:.5rem}.inu-input-text.focus .inu-input-text-label{color:var(--secondary-light);fill:var(--secondary-light)}.inu-input-text.invalid input{border-bottom:1px solid var(--danger)}.inu-input-text.invalid .inu-input-text-label{color:var(--danger);fill:var(--danger)}\n"] }]
86
87
  }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], changed: [{ type: i0.Output, args: ["changed"] }], input: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], styleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "styleClass", required: false }] }] } });
87
88
 
88
89
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"inugami-ng-components-inu-input-text.mjs","sources":["../../../projects/inugami-ng/components/inu-input-text/inu-input-text.component.ts","../../../projects/inugami-ng/components/inu-input-text/inu-input-text.component.html","../../../projects/inugami-ng/components/inu-input-text/inugami-ng-components-inu-input-text.ts"],"sourcesContent":["import {\n Component,\n computed,\n ElementRef, inject,\n input,\n InputSignal,\n model,\n ModelSignal,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport {FormField, FormValueControl} from '@angular/forms/signals';\nimport {UuidUtils} from 'inugami-ng/services';\nimport {debounceTime, Subject} from 'rxjs';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {InuIcon} from 'inugami-icons';\n\n@Component({\n selector: 'inu-input-text',\n standalone: true,\n providers: [],\n imports: [\n InuIcon\n\n ],\n templateUrl: './inu-input-text.component.html',\n styleUrl: './inu-input-text.component.scss',\n})\nexport class InuInputText implements FormValueControl<string | number>,FormValueControl<string | number> {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n // input\n readonly disabled = input(false);\n readonly label = input('');\n readonly icon = input('');\n readonly name = input('');\n readonly type: InputSignal<string | 'text' | 'number' | 'email' | 'password'> = input('text');\n readonly _required = input(false, {alias: 'required'});\n\n\n // FormValueControl\n formField = inject(FormField, { optional: true });\n value: ModelSignal<string | number> = model<string | number>('');\n valid = computed(() => {\n const state = this.formField?.state()\n if (!state) return true;\n const isInvalid = state.invalid();\n const hasBeenTouched = state.touched();\n return !(isInvalid && hasBeenTouched);\n });\n // internal\n changed = output<string | number>();\n debouncer = new Subject<string | number>();\n\n id = computed<string>(() => UuidUtils.buildUid());\n input = viewChild<ElementRef<HTMLInputElement>>('input');\n focus=signal<boolean>(false);\n styleClass = input<string>('');\n _styleClass = computed<string>(() => {\n return [\n 'inu-input',\n 'inu-input-text',\n this.disabled() ? 'disabled' : '',\n !this.valid() ? 'invalid' : '',\n this.focus() ? 'focus' : '',\n this.styleClass()!\n ].join(' ');\n })\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n this.debouncer.pipe(\n debounceTime(50),\n takeUntilDestroyed()\n ).subscribe(val => {\n this.value.set(val);\n this.changed.emit(val);\n });\n }\n\n protected onChanged(event: KeyboardEvent) {\n const input = this.input()?.nativeElement;\n if (!input) {\n return;\n }\n let value: number | string = input.value;\n if ('number' === this.type()) {\n try {\n value = Number(value);\n } catch (e) {\n }\n }\n\n this.debouncer.next(value)\n }\n\n protected onFocus() {\n this.focus.set(true);\n }\n\n protected onFocusOut() {\n this.focus.set(false);\n }\n}\n","<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;MA6Ba,YAAY,CAAA;;;;;AAOd,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,IAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AACjB,IAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,IAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,IAAA,IAAI,GAAmE,KAAK,CAAC,MAAM,gDAAC;IACpF,SAAS,GAAG,KAAK,CAAC,KAAK,sDAAG,KAAK,EAAE,UAAU,EAAA,CAAE;;IAItD,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjD,IAAA,KAAK,GAAiC,KAAK,CAAkB,EAAE,iDAAC;AAChE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;AACrC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AACvB,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE;AACjC,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE;AACtC,QAAA,OAAO,EAAE,SAAS,IAAI,cAAc,CAAC;AACvC,IAAA,CAAC,iDAAC;;IAEF,OAAO,GAAG,MAAM,EAAmB;AACnC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAmB;IAE1C,EAAE,GAAG,QAAQ,CAAS,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACjD,IAAA,KAAK,GAAG,SAAS,CAA+B,OAAO,iDAAC;AACxD,IAAA,KAAK,GAAC,MAAM,CAAU,KAAK,iDAAC;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,sDAAC;AAC9B,IAAA,WAAW,GAAG,QAAQ,CAAS,MAAK;QAClC,OAAO;YACL,WAAW;YACX,gBAAgB;YAChB,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,GAAG,EAAE;YACjC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,SAAS,GAAG,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,GAAG,EAAE;YAC3B,IAAI,CAAC,UAAU;AAChB,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AACb,IAAA,CAAC,uDAAC;;;;AAKF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,YAAY,CAAC,EAAE,CAAC,EAChB,kBAAkB,EAAE,CACrB,CAAC,SAAS,CAAC,GAAG,IAAG;AAChB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa;QACzC,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AACA,QAAA,IAAI,KAAK,GAAoB,KAAK,CAAC,KAAK;AACxC,QAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAC5B,YAAA,IAAI;AACF,gBAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACvB;YAAE,OAAO,CAAC,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;uGA/EW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EARZ,EAAE,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBf,uqBAuBA,40BDAI,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAME,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,SAAA,EACL,EAAE,EAAA,OAAA,EACJ;wBACP;AAED,qBAAA,EAAA,QAAA,EAAA,uqBAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA;yzBAkC+C,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE3DzD;;AAEG;;;;"}
1
+ {"version":3,"file":"inugami-ng-components-inu-input-text.mjs","sources":["../../../projects/inugami-ng/components/inu-input-text/inu-input-text.component.ts","../../../projects/inugami-ng/components/inu-input-text/inu-input-text.component.html","../../../projects/inugami-ng/components/inu-input-text/inugami-ng-components-inu-input-text.ts"],"sourcesContent":["import {\n Component,\n computed,\n ElementRef, inject,\n input,\n InputSignal,\n model,\n ModelSignal,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport {FormField, FormValueControl} from '@angular/forms/signals';\nimport {UuidUtils} from 'inugami-ng/utils';\nimport {debounceTime, Subject} from 'rxjs';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {InuIcon} from 'inugami-icons';\n\n@Component({\n selector: 'inu-input-text',\n standalone: true,\n providers: [],\n imports: [\n InuIcon\n\n ],\n templateUrl: './inu-input-text.component.html',\n styleUrl: './inu-input-text.component.scss',\n})\nexport class InuInputText implements FormValueControl<string | number>,FormValueControl<string | number> {\n\n\n //==================================================================================================================\n // ATTRIBUTES\n //==================================================================================================================\n // input\n readonly disabled = input(false);\n readonly label = input('');\n readonly icon = input('');\n readonly name = input('');\n readonly type: InputSignal<string | 'text' | 'number' | 'email' | 'password'> = input('text');\n readonly _required = input(false, {alias: 'required'});\n\n\n // FormValueControl\n _formField = inject(FormField, { optional: true });\n value: ModelSignal<string | number> = model<string | number>('');\n valid = computed(() => {\n const state = this._formField?.state()\n if (!state) return true;\n const isInvalid = state.invalid();\n const hasBeenTouched = state.touched();\n return !(isInvalid && hasBeenTouched);\n });\n // internal\n changed = output<string | number>();\n debouncer = new Subject<string | number>();\n\n id = computed<string>(() => UuidUtils.buildUid());\n input = viewChild<ElementRef<HTMLInputElement>>('input');\n focus=signal<boolean>(false);\n styleClass = input<string>('');\n _styleClass = computed<string>(() => {\n return [\n 'inu-input',\n 'inu-input-text',\n this.disabled() ? 'disabled' : '',\n !this.valid() ? 'invalid' : '',\n this.focus() ? 'focus' : '',\n this.styleClass()!\n ].join(' ');\n })\n\n //==================================================================================================================\n // INIT\n //==================================================================================================================\n constructor() {\n this.debouncer.pipe(\n debounceTime(50),\n takeUntilDestroyed()\n ).subscribe(val => {\n this.value.set(val);\n this.changed.emit(val);\n });\n }\n\n protected onChanged(event: KeyboardEvent) {\n const input = this.input()?.nativeElement;\n if (!input) {\n return;\n }\n let value: number | string = input.value;\n if ('number' === this.type()) {\n try {\n value = Number(value);\n } catch (e) {\n }\n }\n\n this.debouncer.next(value)\n }\n\n protected onFocus() {\n this.focus.set(true);\n }\n\n protected onFocusOut() {\n this.focus.set(false);\n this._formField?.state()?.markAsTouched();\n }\n}\n","<div [class]=\"_styleClass()\">\n <div class=\"inu-input-text-label\">\n @if(icon()){\n <inu-icon [icon]=\"icon()!\" [size]=\"1\"></inu-icon>\n }\n @if (label()) {\n <label [for]=\"id()\">{{ label()! }}</label>\n }\n @if (_required()) {\n <inu-icon icon=\"required\" [size]=\"0.5\"></inu-icon>\n }\n </div>\n\n <input [id]=\"id()\"\n [name]=\"name()!\"\n [type]=\"type()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n (focusin)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n (blur)=\"_formField?.state()?.markAsTouched()\"\n (keyup)=\"onChanged($event)\" #input>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;MA6Ba,YAAY,CAAA;;;;;AAOd,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,IAAA,KAAK,GAAG,KAAK,CAAC,EAAE,iDAAC;AACjB,IAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,IAAA,IAAI,GAAG,KAAK,CAAC,EAAE,gDAAC;AAChB,IAAA,IAAI,GAAmE,KAAK,CAAC,MAAM,gDAAC;IACpF,SAAS,GAAG,KAAK,CAAC,KAAK,sDAAG,KAAK,EAAE,UAAU,EAAA,CAAE;;IAItD,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClD,IAAA,KAAK,GAAiC,KAAK,CAAkB,EAAE,iDAAC;AAChE,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;AACtC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AACvB,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE;AACjC,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE;AACtC,QAAA,OAAO,EAAE,SAAS,IAAI,cAAc,CAAC;AACvC,IAAA,CAAC,iDAAC;;IAEF,OAAO,GAAG,MAAM,EAAmB;AACnC,IAAA,SAAS,GAAG,IAAI,OAAO,EAAmB;IAE1C,EAAE,GAAG,QAAQ,CAAS,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACjD,IAAA,KAAK,GAAG,SAAS,CAA+B,OAAO,iDAAC;AACxD,IAAA,KAAK,GAAC,MAAM,CAAU,KAAK,iDAAC;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,sDAAC;AAC9B,IAAA,WAAW,GAAG,QAAQ,CAAS,MAAK;QAClC,OAAO;YACL,WAAW;YACX,gBAAgB;YAChB,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,GAAG,EAAE;YACjC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,SAAS,GAAG,EAAE;YAC9B,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,GAAG,EAAE;YAC3B,IAAI,CAAC,UAAU;AAChB,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AACb,IAAA,CAAC,uDAAC;;;;AAKF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,YAAY,CAAC,EAAE,CAAC,EAChB,kBAAkB,EAAE,CACrB,CAAC,SAAS,CAAC,GAAG,IAAG;AAChB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa;QACzC,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AACA,QAAA,IAAI,KAAK,GAAoB,KAAK,CAAC,KAAK;AACxC,QAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE;AAC5B,YAAA,IAAI;AACF,gBAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACvB;YAAE,OAAO,CAAC,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE;IAC3C;uGAhFW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EARZ,EAAE,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBf,wqBAuBA,40BDAI,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAME,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,SAAA,EACL,EAAE,EAAA,OAAA,EACJ;wBACP;AAED,qBAAA,EAAA,QAAA,EAAA,wqBAAA,EAAA,MAAA,EAAA,CAAA,oxBAAA,CAAA,EAAA;yzBAkC+C,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE3DzD;;AAEG;;;;"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, input, Component, signal, effect, inject } from '@angular/core';
3
- import { CacheServices } from 'inugami-ng/services';
4
- import { map, tap, shareReplay } from 'rxjs';
3
+ import { InuCacheServices } from 'inugami-ng/services';
4
+ import { tap, shareReplay } from 'rxjs';
5
5
  import { HttpClient } from '@angular/common/http';
6
6
  import { InuCode } from 'inugami-ng/components/inu-code';
7
7
  import { InuIcon } from 'inugami-icons';
@@ -13,12 +13,13 @@ class InuOpenApiServices {
13
13
  // =================================================================================================================
14
14
  convertToOpenApi(response) {
15
15
  const schemaTypes = this.unmarshallComponents(response.components);
16
+ const objectTypeCache = [];
16
17
  const result = {
17
18
  openapi: response.openapi,
18
19
  components: this.unmarshallComponents(response.components),
19
20
  externalDocs: this.unmarshallExternalDocs(response.externalDocs),
20
21
  info: this.unmarshallInfo(response.info),
21
- paths: this.unmarshallPaths(response.paths, schemaTypes),
22
+ paths: this.unmarshallPaths(response.paths, schemaTypes, objectTypeCache),
22
23
  servers: this.unmarshallServers(response.servers),
23
24
  tags: this.unmarshallTags(response.tags)
24
25
  };
@@ -131,7 +132,7 @@ class InuOpenApiServices {
131
132
  }
132
133
  return result;
133
134
  }
134
- unmarshallPaths(paths, schemaTypes) {
135
+ unmarshallPaths(paths, schemaTypes, objectTypeCache) {
135
136
  const result = [];
136
137
  if (!paths) {
137
138
  return result;
@@ -154,8 +155,8 @@ class InuOpenApiServices {
154
155
  summary: openApiEndpoint.summary,
155
156
  description: openApiEndpoint.description,
156
157
  parameters: this.unmarshallEndpointParameters(openApiEndpoint.parameters),
157
- requestBody: this.unmarshallEndpointRequestBody(openApiEndpoint.requestBody, schemaTypes),
158
- responses: this.unmarshallEndpointResponse(openApiEndpoint.responses, schemaTypes),
158
+ requestBody: this.unmarshallEndpointRequestBody(openApiEndpoint.requestBody, schemaTypes, objectTypeCache),
159
+ responses: this.unmarshallEndpointResponse(openApiEndpoint.responses, schemaTypes, objectTypeCache),
159
160
  };
160
161
  result.push(endpoint);
161
162
  }
@@ -229,7 +230,7 @@ class InuOpenApiServices {
229
230
  }
230
231
  return result;
231
232
  }
232
- unmarshallEndpointRequestBody(value, schemaTypes) {
233
+ unmarshallEndpointRequestBody(value, schemaTypes, objectTypeCache) {
233
234
  if (!value) {
234
235
  return undefined;
235
236
  }
@@ -237,9 +238,11 @@ class InuOpenApiServices {
237
238
  let schema;
238
239
  if (value.content) {
239
240
  contentType = Object.keys(value.content)[0];
240
- const objectType = this.renderType(value.content[contentType].schema, schemaTypes);
241
+ let schemaData = this.extractSchema(value, contentType);
242
+ const objectType = this.renderType(schemaData, schemaTypes, objectTypeCache);
243
+ console.log('request', objectType);
241
244
  schema = {
242
- type: value.content[contentType].schema.type,
245
+ type: schemaData?.type,
243
246
  ref: objectType?.value,
244
247
  array: objectType?.array,
245
248
  name: objectType?.name
@@ -251,7 +254,24 @@ class InuOpenApiServices {
251
254
  required: value.required
252
255
  };
253
256
  }
254
- unmarshallEndpointResponse(value, schemaTypes) {
257
+ extractSchema(value, contentType) {
258
+ let content = value.content;
259
+ if (!content) {
260
+ const fields = Object.keys(value).sort();
261
+ for (let field of fields) {
262
+ const subContent = value[field].content;
263
+ if (subContent) {
264
+ content = subContent;
265
+ break;
266
+ }
267
+ }
268
+ }
269
+ if (!content || !content[contentType]) {
270
+ return undefined;
271
+ }
272
+ return content[contentType].schema;
273
+ }
274
+ unmarshallEndpointResponse(value, schemaTypes, objectTypeCache) {
255
275
  if (!value) {
256
276
  return undefined;
257
277
  }
@@ -277,13 +297,23 @@ class InuOpenApiServices {
277
297
  let items = rawSchema['items'];
278
298
  ref = items ? items['$ref'] : undefined;
279
299
  }
280
- const objectType = this.renderType(value.content[contentType].schema, schemaTypes);
281
- schema = {
282
- type: type,
283
- ref: objectType?.value,
284
- array: objectType?.array,
285
- name: objectType?.name
286
- };
300
+ schema = objectTypeCache.find(v => v.name === ref);
301
+ if (!schema) {
302
+ let schemaData = this.extractSchema(value, contentType);
303
+ const objectType = this.renderType(schemaData, schemaTypes, objectTypeCache);
304
+ schema = {
305
+ type: type,
306
+ ref: this.extractObjectTypeValue(objectType?.value),
307
+ array: objectType?.array,
308
+ name: objectType?.name
309
+ };
310
+ if (ref) {
311
+ objectTypeCache.push({
312
+ name: ref,
313
+ value: schema
314
+ });
315
+ }
316
+ }
287
317
  }
288
318
  }
289
319
  result.push({
@@ -297,6 +327,12 @@ class InuOpenApiServices {
297
327
  }
298
328
  return result;
299
329
  }
330
+ extractObjectTypeValue(value) {
331
+ if (Array.isArray(value) && value.length > 0) {
332
+ return value[0];
333
+ }
334
+ return value;
335
+ }
300
336
  unmarshallEndpointResponseHeader(value) {
301
337
  if (!value) {
302
338
  return undefined;
@@ -392,8 +428,8 @@ class InuOpenApiServices {
392
428
  }
393
429
  return result;
394
430
  }
395
- renderType(schema, schemaTypes, level) {
396
- if (!schema) {
431
+ renderType(schema, schemaTypes, objectTypeCache, level) {
432
+ if (!schema || (level > 5)) {
397
433
  return undefined;
398
434
  }
399
435
  const array = schema.type == 'array';
@@ -415,18 +451,30 @@ class InuOpenApiServices {
415
451
  }
416
452
  }
417
453
  }
454
+ if (currentType?.name) {
455
+ const cachedValue = objectTypeCache.find(v => v.name === currentType.name);
456
+ if (cachedValue) {
457
+ return cachedValue;
458
+ }
459
+ }
418
460
  let object = {};
419
461
  if (currentType && currentType.properties) {
420
- object = this.convertObjectPropertiesToObject(currentType.properties, currentType.example ? currentType.example : {}, schemaTypes, level ? level + 1 : 0);
462
+ object = this.convertObjectPropertiesToObject(currentType.properties, currentType.example ? currentType.example : {}, schemaTypes, objectTypeCache, level ? level + 1 : 0);
421
463
  }
422
464
  const result = {
423
465
  array: array,
424
466
  name: currentType?.name,
425
467
  value: array ? [object] : object
426
468
  };
469
+ if (currentType?.name) {
470
+ objectTypeCache.push({
471
+ name: currentType.name,
472
+ value: result
473
+ });
474
+ }
427
475
  return result;
428
476
  }
429
- convertObjectPropertiesToObject(properties, example, schemaTypes, level) {
477
+ convertObjectPropertiesToObject(properties, example, schemaTypes, objectTypeCache, level) {
430
478
  if (!properties) {
431
479
  return undefined;
432
480
  }
@@ -467,17 +515,17 @@ class InuOpenApiServices {
467
515
  object[property.name] = false;
468
516
  break;
469
517
  case 'array':
470
- object[property.name] = this.convertArray(property, property.example ? property.example : {}, schemaTypes, level + 1);
518
+ object[property.name] = this.convertArray(property, property.example ? property.example : {}, schemaTypes, objectTypeCache, level + 1);
471
519
  break;
472
520
  default:
473
- const subType = this.renderType({ ref: property.ref }, schemaTypes, level + 1);
521
+ const subType = this.renderType({ ref: property.ref }, schemaTypes, objectTypeCache, level + 1);
474
522
  object[property.name] = subType?.value;
475
523
  break;
476
524
  }
477
525
  }
478
526
  return object;
479
527
  }
480
- convertArray(property, example, schemaTypes, level) {
528
+ convertArray(property, example, schemaTypes, objectTypeCache, level) {
481
529
  const result = [];
482
530
  const type = property.type ? property.type : 'object';
483
531
  const sample = example[property.name];
@@ -508,7 +556,7 @@ class InuOpenApiServices {
508
556
  result.push(false);
509
557
  break;
510
558
  default:
511
- const subType = this.renderType({ ref: property.ref }, schemaTypes, level + 1);
559
+ const subType = this.renderType({ ref: property.ref }, schemaTypes, objectTypeCache, level + 1);
512
560
  result.push(subType ? subType.value : {});
513
561
  break;
514
562
  }
@@ -938,7 +986,7 @@ class InuOpenApi {
938
986
  url = input(undefined, ...(ngDevMode ? [{ debugName: "url" }] : []));
939
987
  data = input(undefined, ...(ngDevMode ? [{ debugName: "data" }] : []));
940
988
  http = inject(HttpClient);
941
- cache = inject(CacheServices);
989
+ cache = inject(InuCacheServices);
942
990
  inuOpenApiService = inject(InuOpenApiServices);
943
991
  _value = signal(null, ...(ngDevMode ? [{ debugName: "_value" }] : []));
944
992
  //==================================================================================================================
@@ -965,20 +1013,28 @@ class InuOpenApi {
965
1013
  const cacheKey = CACHE_PREFIX + url;
966
1014
  const pending = this.cache.getPending(cacheKey);
967
1015
  if (pending) {
968
- pending.subscribe(res => this.initOpenApi(res));
1016
+ pending.subscribe(res => this.initOpenApi(this.inuOpenApiService.convertToOpenApi(res)));
969
1017
  return;
970
1018
  }
971
1019
  const request = this.http.get(url)
972
- .pipe(map(res => this.inuOpenApiService.convertToOpenApi(res)), tap(data => this.cache.set(cacheKey, data)), shareReplay(1));
1020
+ .pipe(tap(data => {
1021
+ this.cache.set(cacheKey, data);
1022
+ }), shareReplay(1));
973
1023
  this.cache.setPending(cacheKey, request);
974
1024
  request.subscribe({
975
- next: value => this.initOpenApi(value)
1025
+ next: value => this.initOpenApi(this.inuOpenApiService.convertToOpenApi(value))
976
1026
  });
977
1027
  }
978
1028
  //==================================================================================================================
979
1029
  // PARSE
980
1030
  //==================================================================================================================
981
1031
  initOpenApi(openApi) {
1032
+ openApi.paths?.sort((value, ref) => {
1033
+ if (value.url === ref.url) {
1034
+ return `${value.verb}`.toLowerCase().localeCompare(`${ref.verb}`.toUpperCase());
1035
+ }
1036
+ return `${value.url}`.toLowerCase().localeCompare(`${ref.url}`.toUpperCase());
1037
+ });
982
1038
  this._value.set(openApi);
983
1039
  }
984
1040
  //==================================================================================================================