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.
- package/fesm2022/inugami-ng-components-inu-code.mjs +2 -2
- package/fesm2022/inugami-ng-components-inu-code.mjs.map +1 -1
- package/fesm2022/inugami-ng-components-inu-doc-item.mjs +1 -1
- package/fesm2022/inugami-ng-components-inu-doc-item.mjs.map +1 -1
- package/fesm2022/inugami-ng-components-inu-input-text.mjs +6 -5
- package/fesm2022/inugami-ng-components-inu-input-text.mjs.map +1 -1
- package/fesm2022/inugami-ng-components-inu-open-api.mjs +85 -29
- package/fesm2022/inugami-ng-components-inu-open-api.mjs.map +1 -1
- package/fesm2022/inugami-ng-components-inu-toast.mjs +1 -1
- package/fesm2022/inugami-ng-components-inu-toast.mjs.map +1 -1
- package/fesm2022/inugami-ng-services.mjs +289 -24
- package/fesm2022/inugami-ng-services.mjs.map +1 -1
- package/fesm2022/inugami-ng-utils.mjs +50 -0
- package/fesm2022/inugami-ng-utils.mjs.map +1 -0
- package/package.json +5 -1
- package/types/inugami-ng-components-inu-input-text.d.ts +1 -1
- package/types/inugami-ng-components-inu-open-api.d.ts +2 -0
- package/types/inugami-ng-services.d.ts +74 -9
- package/types/inugami-ng-utils.d.ts +20 -0
|
@@ -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 {
|
|
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(
|
|
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/
|
|
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/
|
|
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
|
-
|
|
21
|
+
_formField = inject(FormField, { optional: true });
|
|
22
22
|
value = model('', ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
23
23
|
valid = computed(() => {
|
|
24
|
-
const state = this.
|
|
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)=\"
|
|
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)=\"
|
|
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/
|
|
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":"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"}
|
|
@@ -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 {
|
|
4
|
-
import {
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
281
|
-
schema
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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(
|
|
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(
|
|
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
|
//==================================================================================================================
|