@ng-vagabond-lab/ng-dsv 0.1.75 → 0.1.76

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.
@@ -133,7 +133,7 @@ class ListItemComponent {
133
133
  }
134
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ListItemComponent, decorators: [{
135
135
  type: Component,
136
- args: [{ selector: 'dsv-list-item', standalone: true, imports: [], template: "<li\n #liRef\n [attr.data-index]=\"index()\"\n [draggable]=\"false\"\n [class.dragging]=\"listDragService.dragSrcIndex() === index()\"\n [class.drag-over]=\"listDragService.dragSrcIndex() === index()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop(index(), $event)\"\n (dragstart)=\"onDragStart(index(), $event)\"\n (dragend)=\"onDragEnd()\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n>\n <ng-content></ng-content>\n</li>\n", styles: [":host li{display:flex;align-items:center;gap:10px;padding:10px 15px;border:1px solid #e0e0e0;border-radius:5px;transition:opacity .2s,border-color .2s;-webkit-user-select:none;user-select:none}:host li.dragging{opacity:.4}.ghost-drag{display:flex;align-items:center;gap:10px;padding:10px 15px;border:1px solid #e0e0e0;border-radius:5px;opacity:.3;pointer-events:none;z-index:99999;position:fixed;transform:scale(.98)}\n"] }]
136
+ args: [{ selector: 'dsv-list-item', imports: [], template: "<li\n #liRef\n [attr.data-index]=\"index()\"\n [draggable]=\"false\"\n [class.dragging]=\"listDragService.dragSrcIndex() === index()\"\n [class.drag-over]=\"listDragService.dragSrcIndex() === index()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop(index(), $event)\"\n (dragstart)=\"onDragStart(index(), $event)\"\n (dragend)=\"onDragEnd()\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n>\n <ng-content></ng-content>\n</li>\n", styles: [":host li{display:flex;align-items:center;gap:10px;padding:10px 15px;border:1px solid #e0e0e0;border-radius:5px;transition:opacity .2s,border-color .2s;-webkit-user-select:none;user-select:none}:host li.dragging{opacity:.4}.ghost-drag{display:flex;align-items:center;gap:10px;padding:10px 15px;border:1px solid #e0e0e0;border-radius:5px;opacity:.3;pointer-events:none;z-index:99999;position:fixed;transform:scale(.98)}\n"] }]
137
137
  }], ctorParameters: () => [], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], callbackOrder: [{ type: i0.Output, args: ["callbackOrder"] }], liRef: [{ type: i0.ViewChild, args: ['liRef', { isSignal: true }] }] } });
138
138
 
139
139
  class ListComponent {
@@ -142,7 +142,7 @@ class ListComponent {
142
142
  }
143
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ListComponent, decorators: [{
144
144
  type: Component,
145
- args: [{ selector: 'dsv-list', standalone: true, imports: [], template: "<ul>\n <ng-content></ng-content>\n</ul>\n", styles: [":host ul{list-style:none;padding:0;margin:20px 0 0;display:flex;flex-direction:column;gap:8px}\n"] }]
145
+ args: [{ selector: 'dsv-list', imports: [], template: "<ul>\n <ng-content></ng-content>\n</ul>\n", styles: [":host ul{list-style:none;padding:0;margin:20px 0 0;display:flex;flex-direction:column;gap:8px}\n"] }]
146
146
  }] });
147
147
 
148
148
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ng-vagabond-lab-ng-dsv-ds-list.mjs","sources":["../../../projects/ng-dsv/ds/list/item/component/drag/list.item.drag.component.ts","../../../projects/ng-dsv/ds/list/item/component/drag/list.item.drag.component.html","../../../projects/ng-dsv/ds/list/list/service/list.drag.service.ts","../../../projects/ng-dsv/ds/list/item/component/list.item.component.ts","../../../projects/ng-dsv/ds/list/item/component/list.item.component.html","../../../projects/ng-dsv/ds/list/list/component/list.component.ts","../../../projects/ng-dsv/ds/list/list/component/list.component.html","../../../projects/ng-dsv/ds/list/ng-vagabond-lab-ng-dsv-ds-list.ts"],"sourcesContent":["import { Component, inject, input } from \"@angular/core\";\nimport { DsvButtonComponent } from \"@ng-vagabond-lab/ng-dsv/ds/button\";\nimport { ButtonVariantType } from \"@ng-vagabond-lab/ng-dsv/type\";\nimport { ListDragService } from \"../../../public-api\";\n\n@Component({\n selector: 'dsv-list-item-drag',\n imports: [DsvButtonComponent],\n templateUrl: './list.item.drag.component.html',\n styleUrl: './list.item.drag.component.scss',\n})\nexport class ListItemDragComponent {\n readonly listDragService = inject(ListDragService);\n\n variant = input<ButtonVariantType>('text');\n\n onHandleMouseDown(event: MouseEvent) {\n const li = (event.currentTarget as HTMLElement).closest('li') as HTMLElement;\n if (li) {\n li.draggable = true;\n }\n }\n\n onTouchStart(event: TouchEvent) {\n this.listDragService.touchDragging.set(true);\n }\n}","<dsv-button\n class=\"drag-handle\"\n icon=\"ri-menu-line\"\n [variant]=\"variant()\"\n color=\"primary\"\n (mousedown)=\"onHandleMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n/>\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ListDragService {\n dragSrcIndex = signal<number | null>(null);\n touchDragging = signal<boolean>(false);\n}","import { Component, ElementRef, inject, input, output, viewChild } from \"@angular/core\";\nimport { ListItemDragDto } from \"../../list/dto/list.dto\";\nimport { ListDragService } from \"../../list/service/list.drag.service\";\n\n@Component({\n selector: 'dsv-list-item',\n standalone: true,\n imports: [],\n templateUrl: './list.item.component.html',\n styleUrl: './list.item.component.scss',\n})\nexport class ListItemComponent {\n readonly listDragService = inject(ListDragService);\n\n index = input.required<number>();\n\n callbackOrder = output<ListItemDragDto>();\n\n readonly liRef = viewChild<ElementRef>('liRef');\n ghostEl: HTMLElement | null = null;\n\n constructor() {\n }\n\n onHandleMouseDown(event: MouseEvent) {\n const div = (event.currentTarget as HTMLElement).closest('div') as HTMLElement;\n if (div) div.draggable = true;\n }\n\n onDragStart(index: number, event: DragEvent) {\n this.listDragService.dragSrcIndex.set(index);\n event.dataTransfer!.effectAllowed = 'move';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n }\n\n onDrop(targetIndex: number, event: DragEvent) {\n event.preventDefault();\n const dragSrcIndex = this.listDragService.dragSrcIndex();\n if (dragSrcIndex === null || dragSrcIndex === targetIndex) {\n return;\n }\n this.callbackOrder.emit({ dragSrcIndex: dragSrcIndex, targetIndex: targetIndex });\n this.listDragService.dragSrcIndex.set(null);\n }\n\n onDragEnd() {\n this.listDragService.dragSrcIndex.set(null);\n }\n\n onTouchStart(event: TouchEvent) {\n if (!this.listDragService.touchDragging()) {\n return;\n }\n this.listDragService.dragSrcIndex.set(this.index());\n\n const li = this.liRef()?.nativeElement as HTMLElement;\n if (!li) {\n return;\n }\n\n const rect = li.getBoundingClientRect();\n const touch = event.touches[0];\n\n this.ghostEl = li.cloneNode(true) as HTMLElement;\n this.ghostEl.classList.add('ghost-drag');\n this.ghostEl.style.top = `${touch.clientY - rect.height / 2}px`;\n this.ghostEl.style.left = `${rect.left}px`;\n this.ghostEl.style.width = `${rect.width - 25}px`;\n this.ghostEl.style.height = `${rect.height - 25}px`;\n\n const ul = li.closest('ul');\n if (ul) {\n ul.appendChild(this.ghostEl);\n }\n this.ghostEl.style.opacity = '0.5';\n }\n\n onTouchMove(event: TouchEvent) {\n event.preventDefault();\n const touch = event.touches[0];\n\n if (this.ghostEl) {\n const rect = (this.liRef()?.nativeElement as HTMLElement).getBoundingClientRect();\n this.ghostEl.style.top = `${touch.clientY - rect.height / 2}px`;\n this.ghostEl.style.left = `${rect.left}px`;\n }\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const targetLi = target?.closest('li');\n\n document.querySelectorAll('li.drag-over-touch')\n .forEach(el => el.classList.remove('drag-over-touch'));\n\n if (targetLi && targetLi !== this.liRef()?.nativeElement) {\n targetLi.classList.add('drag-over-touch');\n }\n }\n\n onTouchEnd(event: TouchEvent) {\n if (this.ghostEl) {\n this.ghostEl.remove();\n this.ghostEl = null;\n }\n\n const li = this.liRef()?.nativeElement as HTMLElement;\n if (li) li.style.opacity = '1';\n\n const touch = event.changedTouches[0];\n const target = document.elementFromPoint(touch?.clientX, touch?.clientY);\n const targetLi = target?.closest('[data-index]') as HTMLElement | null;\n\n if (targetLi) {\n const targetIndex = parseInt(targetLi.dataset['index'] ?? '-1');\n const dragSrcIndex = this.listDragService.dragSrcIndex();\n if (dragSrcIndex !== null && dragSrcIndex !== targetIndex && targetIndex >= 0) {\n this.callbackOrder.emit({ dragSrcIndex, targetIndex });\n }\n }\n\n document.querySelectorAll('li.drag-over-touch')\n .forEach(el => el.classList.remove('drag-over-touch'));\n this.listDragService.dragSrcIndex.set(null);\n this.listDragService.touchDragging.set(false);\n }\n}","<li\n #liRef\n [attr.data-index]=\"index()\"\n [draggable]=\"false\"\n [class.dragging]=\"listDragService.dragSrcIndex() === index()\"\n [class.drag-over]=\"listDragService.dragSrcIndex() === index()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop(index(), $event)\"\n (dragstart)=\"onDragStart(index(), $event)\"\n (dragend)=\"onDragEnd()\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n>\n <ng-content></ng-content>\n</li>\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: 'dsv-list',\n standalone: true,\n imports: [],\n templateUrl: './list.component.html',\n styleUrl: './list.component.scss',\n})\nexport class ListComponent {\n}","<ul>\n <ng-content></ng-content>\n</ul>\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":"ng-vagabond-lab-ng-dsv-ds-list.mjs","sources":["../../../projects/ng-dsv/ds/list/item/component/drag/list.item.drag.component.ts","../../../projects/ng-dsv/ds/list/item/component/drag/list.item.drag.component.html","../../../projects/ng-dsv/ds/list/list/service/list.drag.service.ts","../../../projects/ng-dsv/ds/list/item/component/list.item.component.ts","../../../projects/ng-dsv/ds/list/item/component/list.item.component.html","../../../projects/ng-dsv/ds/list/list/component/list.component.ts","../../../projects/ng-dsv/ds/list/list/component/list.component.html","../../../projects/ng-dsv/ds/list/ng-vagabond-lab-ng-dsv-ds-list.ts"],"sourcesContent":["import { Component, inject, input } from \"@angular/core\";\nimport { DsvButtonComponent } from \"@ng-vagabond-lab/ng-dsv/ds/button\";\nimport { ButtonVariantType } from \"@ng-vagabond-lab/ng-dsv/type\";\nimport { ListDragService } from \"../../../public-api\";\n\n@Component({\n selector: 'dsv-list-item-drag',\n imports: [DsvButtonComponent],\n templateUrl: './list.item.drag.component.html',\n styleUrl: './list.item.drag.component.scss',\n})\nexport class ListItemDragComponent {\n readonly listDragService = inject(ListDragService);\n\n variant = input<ButtonVariantType>('text');\n\n onHandleMouseDown(event: MouseEvent) {\n const li = (event.currentTarget as HTMLElement).closest('li') as HTMLElement;\n if (li) {\n li.draggable = true;\n }\n }\n\n onTouchStart(event: TouchEvent) {\n this.listDragService.touchDragging.set(true);\n }\n}","<dsv-button\n class=\"drag-handle\"\n icon=\"ri-menu-line\"\n [variant]=\"variant()\"\n color=\"primary\"\n (mousedown)=\"onHandleMouseDown($event)\"\n (touchstart)=\"onTouchStart($event)\"\n/>\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ListDragService {\n dragSrcIndex = signal<number | null>(null);\n touchDragging = signal<boolean>(false);\n}","import { Component, ElementRef, inject, input, output, viewChild } from \"@angular/core\";\nimport { ListItemDragDto } from \"../../list/dto/list.dto\";\nimport { ListDragService } from \"../../list/service/list.drag.service\";\n\n@Component({\n selector: 'dsv-list-item',\n imports: [],\n templateUrl: './list.item.component.html',\n styleUrl: './list.item.component.scss',\n})\nexport class ListItemComponent {\n readonly listDragService = inject(ListDragService);\n\n index = input.required<number>();\n\n callbackOrder = output<ListItemDragDto>();\n\n readonly liRef = viewChild<ElementRef>('liRef');\n ghostEl: HTMLElement | null = null;\n\n constructor() {\n }\n\n onHandleMouseDown(event: MouseEvent) {\n const div = (event.currentTarget as HTMLElement).closest('div') as HTMLElement;\n if (div) div.draggable = true;\n }\n\n onDragStart(index: number, event: DragEvent) {\n this.listDragService.dragSrcIndex.set(index);\n event.dataTransfer!.effectAllowed = 'move';\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n }\n\n onDrop(targetIndex: number, event: DragEvent) {\n event.preventDefault();\n const dragSrcIndex = this.listDragService.dragSrcIndex();\n if (dragSrcIndex === null || dragSrcIndex === targetIndex) {\n return;\n }\n this.callbackOrder.emit({ dragSrcIndex: dragSrcIndex, targetIndex: targetIndex });\n this.listDragService.dragSrcIndex.set(null);\n }\n\n onDragEnd() {\n this.listDragService.dragSrcIndex.set(null);\n }\n\n onTouchStart(event: TouchEvent) {\n if (!this.listDragService.touchDragging()) {\n return;\n }\n this.listDragService.dragSrcIndex.set(this.index());\n\n const li = this.liRef()?.nativeElement as HTMLElement;\n if (!li) {\n return;\n }\n\n const rect = li.getBoundingClientRect();\n const touch = event.touches[0];\n\n this.ghostEl = li.cloneNode(true) as HTMLElement;\n this.ghostEl.classList.add('ghost-drag');\n this.ghostEl.style.top = `${touch.clientY - rect.height / 2}px`;\n this.ghostEl.style.left = `${rect.left}px`;\n this.ghostEl.style.width = `${rect.width - 25}px`;\n this.ghostEl.style.height = `${rect.height - 25}px`;\n\n const ul = li.closest('ul');\n if (ul) {\n ul.appendChild(this.ghostEl);\n }\n this.ghostEl.style.opacity = '0.5';\n }\n\n onTouchMove(event: TouchEvent) {\n event.preventDefault();\n const touch = event.touches[0];\n\n if (this.ghostEl) {\n const rect = (this.liRef()?.nativeElement as HTMLElement).getBoundingClientRect();\n this.ghostEl.style.top = `${touch.clientY - rect.height / 2}px`;\n this.ghostEl.style.left = `${rect.left}px`;\n }\n\n const target = document.elementFromPoint(touch.clientX, touch.clientY);\n const targetLi = target?.closest('li');\n\n document.querySelectorAll('li.drag-over-touch')\n .forEach(el => el.classList.remove('drag-over-touch'));\n\n if (targetLi && targetLi !== this.liRef()?.nativeElement) {\n targetLi.classList.add('drag-over-touch');\n }\n }\n\n onTouchEnd(event: TouchEvent) {\n if (this.ghostEl) {\n this.ghostEl.remove();\n this.ghostEl = null;\n }\n\n const li = this.liRef()?.nativeElement as HTMLElement;\n if (li) li.style.opacity = '1';\n\n const touch = event.changedTouches[0];\n const target = document.elementFromPoint(touch?.clientX, touch?.clientY);\n const targetLi = target?.closest('[data-index]') as HTMLElement | null;\n\n if (targetLi) {\n const targetIndex = parseInt(targetLi.dataset['index'] ?? '-1');\n const dragSrcIndex = this.listDragService.dragSrcIndex();\n if (dragSrcIndex !== null && dragSrcIndex !== targetIndex && targetIndex >= 0) {\n this.callbackOrder.emit({ dragSrcIndex, targetIndex });\n }\n }\n\n document.querySelectorAll('li.drag-over-touch')\n .forEach(el => el.classList.remove('drag-over-touch'));\n this.listDragService.dragSrcIndex.set(null);\n this.listDragService.touchDragging.set(false);\n }\n}","<li\n #liRef\n [attr.data-index]=\"index()\"\n [draggable]=\"false\"\n [class.dragging]=\"listDragService.dragSrcIndex() === index()\"\n [class.drag-over]=\"listDragService.dragSrcIndex() === index()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop(index(), $event)\"\n (dragstart)=\"onDragStart(index(), $event)\"\n (dragend)=\"onDragEnd()\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n>\n <ng-content></ng-content>\n</li>\n","import { Component } from \"@angular/core\";\n\n@Component({\n selector: 'dsv-list',\n imports: [],\n templateUrl: './list.component.html',\n styleUrl: './list.component.scss',\n})\nexport class ListComponent {\n}","<ul>\n <ng-content></ng-content>\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAWa,qBAAqB,CAAA;AACrB,IAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAElD,IAAA,OAAO,GAAG,KAAK,CAAoB,MAAM,8EAAC;AAE1C,IAAA,iBAAiB,CAAC,KAAiB,EAAA;QAC/B,MAAM,EAAE,GAAI,KAAK,CAAC,aAA6B,CAAC,OAAO,CAAC,IAAI,CAAgB;QAC5E,IAAI,EAAE,EAAE;AACJ,YAAA,EAAE,CAAC,SAAS,GAAG,IAAI;QACvB;IACJ;AAEA,IAAA,YAAY,CAAC,KAAiB,EAAA;QAC1B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAChD;uGAdS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,2MAQA,EAAA,MAAA,EAAA,CAAA,qGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDDc,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAInB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACI,oBAAoB,EAAA,OAAA,EACrB,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,2MAAA,EAAA,MAAA,EAAA,CAAA,qGAAA,CAAA,EAAA;;;MEJpB,eAAe,CAAA;AACxB,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;AAC1C,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,oFAAC;uGAF7B,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCQrB,iBAAiB,CAAA;AACjB,IAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAElD,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;IAEhC,aAAa,GAAG,MAAM,EAAmB;AAEhC,IAAA,KAAK,GAAG,SAAS,CAAa,OAAO,4EAAC;IAC/C,OAAO,GAAuB,IAAI;AAElC,IAAA,WAAA,GAAA;IACA;AAEA,IAAA,iBAAiB,CAAC,KAAiB,EAAA;QAC/B,MAAM,GAAG,GAAI,KAAK,CAAC,aAA6B,CAAC,OAAO,CAAC,KAAK,CAAgB;AAC9E,QAAA,IAAI,GAAG;AAAE,YAAA,GAAG,CAAC,SAAS,GAAG,IAAI;IACjC;IAEA,WAAW,CAAC,KAAa,EAAE,KAAgB,EAAA;QACvC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5C,QAAA,KAAK,CAAC,YAAa,CAAC,aAAa,GAAG,MAAM;IAC9C;AAEA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,KAAK,CAAC,YAAa,CAAC,UAAU,GAAG,MAAM;IAC3C;IAEA,MAAM,CAAC,WAAmB,EAAE,KAAgB,EAAA;QACxC,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;QACxD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,WAAW,EAAE;YACvD;QACJ;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACjF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/C;IAEA,SAAS,GAAA;QACL,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/C;AAEA,IAAA,YAAY,CAAC,KAAiB,EAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,EAAE;YACvC;QACJ;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAA4B;QACrD,IAAI,CAAC,EAAE,EAAE;YACL;QACJ;AAEA,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAgB;QAChD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;AACxC,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI;AAC/D,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI;AACjD,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI;QAEnD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,IAAI,EAAE,EAAE;AACJ,YAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC;QACA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;IACtC;AAEA,IAAA,WAAW,CAAC,KAAiB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,aAA6B,EAAC,qBAAqB,EAAE;AACjF,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI;AAC/D,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;QAC9C;AAEA,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;AAEtC,QAAA,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB;AACzC,aAAA,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAE1D,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE;AACtD,YAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC7C;IACJ;AAEA,IAAA,UAAU,CAAC,KAAiB,EAAA;AACxB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACrB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACvB;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,aAA4B;AACrD,QAAA,IAAI,EAAE;AAAE,YAAA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;QAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AACrC,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;QACxE,MAAM,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,cAAc,CAAuB;QAEtE,IAAI,QAAQ,EAAE;AACV,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;YAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AACxD,YAAA,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,WAAW,IAAI,WAAW,IAAI,CAAC,EAAE;gBAC3E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YAC1D;QACJ;AAEA,QAAA,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB;AACzC,aAAA,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC1D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IACjD;uGApHS,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,yWCV9B,sgBAgBA,EAAA,MAAA,EAAA,CAAA,qaAAA,CAAA,EAAA,CAAA;;2FDNa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,WAChB,EAAE,EAAA,QAAA,EAAA,sgBAAA,EAAA,MAAA,EAAA,CAAA,qaAAA,CAAA,EAAA;qPAW4B,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;METrC,aAAa,CAAA;uGAAb,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,oECR1B,4CAGA,EAAA,MAAA,EAAA,CAAA,kGAAA,CAAA,EAAA,CAAA;;2FDKa,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,WACX,EAAE,EAAA,QAAA,EAAA,4CAAA,EAAA,MAAA,EAAA,CAAA,kGAAA,CAAA,EAAA;;;AEJf;;AAEG;;;;"}
@@ -57,11 +57,11 @@ class ModalComponent {
57
57
  this.modalService.close(this.id());
58
58
  };
59
59
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
60
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.8", type: ModalComponent, isStandalone: true, selector: "dsv-modal", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, titleText: { classPropertyName: "titleText", publicName: "titleText", isSignal: true, isRequired: true, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, canEchap: { classPropertyName: "canEchap", publicName: "canEchap", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:keydown.escape": "onEscapeKey()" } }, ngImport: i0, template: "<div class=\"modal-overlay\" [class.open]=\"isOpen()\"></div>\n<div [class]=\"'modal ' + class()\" [class.open]=\"isOpen()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n</div>\n", styles: [".modal-overlay{position:fixed;z-index:-1;opacity:0;background-color:oklab(0% none none / .8);width:100%;height:100%;top:0;right:0}.modal-overlay.open{z-index:100;opacity:1}.modal{position:fixed;z-index:-1;opacity:0;top:35%;left:25%;width:50%;height:25%;min-height:180px;background:var(--background);display:flex;flex-direction:column}.modal.open{z-index:101;opacity:1}.modal .modal-header{display:flex;align-items:center;justify-content:space-between;padding:10px;border-bottom:1px outset black}.modal .modal-content{flex:1;overflow:auto;scrollbar-width:thin;padding:10px;align-content:center}.modal .modal-footer{padding:10px}::ng-deep .modal-footer>div{display:flex;gap:.5rem;justify-content:flex-end}::ng-deep .light .modal .modal-content{background-color:var(--text-dark)!important}::ng-deep .light .modal .modal-footer{background-color:var(--text-dark)!important}::ng-deep .dark .modal{background:var(--background-dark)!important}::ng-deep .dark .modal-header{border-color:var(--text-dark)!important}@media screen and (max-width:600px){.modal{width:calc(100% - 16px)!important;left:8px!important}}\n"], dependencies: [{ kind: "component", type: DsvButtonComponent, selector: "dsv-button", inputs: ["libelle", "icon", "iconEnd", "disabled", "noHover", "type", "prevent"], outputs: ["callback"] }] });
60
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: ModalComponent, isStandalone: true, selector: "dsv-modal", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, titleText: { classPropertyName: "titleText", publicName: "titleText", isSignal: true, isRequired: true, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, canEchap: { classPropertyName: "canEchap", publicName: "canEchap", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:keydown.escape": "onEscapeKey()" } }, ngImport: i0, template: "@if (isOpen()) {\n <div class=\"modal-overlay\"></div>\n <div [class]=\"'modal ' + class()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n </div>\n}\n", styles: [".modal-overlay{position:fixed;z-index:300000;background-color:oklab(0% none none / .8);width:100%;height:100%;top:0;right:0}.modal{position:fixed;z-index:300001;top:35%;left:25%;width:50%;height:25%;min-height:180px;background:var(--background);display:flex;flex-direction:column}.modal .modal-header{display:flex;align-items:center;justify-content:space-between;padding:10px;border-bottom:1px outset black}.modal .modal-content{flex:1;overflow:auto;scrollbar-width:thin;padding:10px;align-content:center}.modal .modal-footer{padding:10px}::ng-deep .modal-footer>div{display:flex;gap:.5rem;justify-content:flex-end}::ng-deep .light .modal .modal-content{background-color:var(--text-dark)!important}::ng-deep .light .modal .modal-footer{background-color:var(--text-dark)!important}::ng-deep .dark .modal{background:var(--background-dark)!important}::ng-deep .dark .modal-header{border-color:var(--text-dark)!important}@media screen and (max-width:600px){.modal{width:calc(100% - 16px)!important;left:8px!important}}\n"], dependencies: [{ kind: "component", type: DsvButtonComponent, selector: "dsv-button", inputs: ["libelle", "icon", "iconEnd", "disabled", "noHover", "type", "prevent"], outputs: ["callback"] }] });
61
61
  }
62
62
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ModalComponent, decorators: [{
63
63
  type: Component,
64
- args: [{ selector: 'dsv-modal', imports: [DsvButtonComponent], template: "<div class=\"modal-overlay\" [class.open]=\"isOpen()\"></div>\n<div [class]=\"'modal ' + class()\" [class.open]=\"isOpen()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n</div>\n", styles: [".modal-overlay{position:fixed;z-index:-1;opacity:0;background-color:oklab(0% none none / .8);width:100%;height:100%;top:0;right:0}.modal-overlay.open{z-index:100;opacity:1}.modal{position:fixed;z-index:-1;opacity:0;top:35%;left:25%;width:50%;height:25%;min-height:180px;background:var(--background);display:flex;flex-direction:column}.modal.open{z-index:101;opacity:1}.modal .modal-header{display:flex;align-items:center;justify-content:space-between;padding:10px;border-bottom:1px outset black}.modal .modal-content{flex:1;overflow:auto;scrollbar-width:thin;padding:10px;align-content:center}.modal .modal-footer{padding:10px}::ng-deep .modal-footer>div{display:flex;gap:.5rem;justify-content:flex-end}::ng-deep .light .modal .modal-content{background-color:var(--text-dark)!important}::ng-deep .light .modal .modal-footer{background-color:var(--text-dark)!important}::ng-deep .dark .modal{background:var(--background-dark)!important}::ng-deep .dark .modal-header{border-color:var(--text-dark)!important}@media screen and (max-width:600px){.modal{width:calc(100% - 16px)!important;left:8px!important}}\n"] }]
64
+ args: [{ selector: 'dsv-modal', imports: [DsvButtonComponent], template: "@if (isOpen()) {\n <div class=\"modal-overlay\"></div>\n <div [class]=\"'modal ' + class()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n </div>\n}\n", styles: [".modal-overlay{position:fixed;z-index:300000;background-color:oklab(0% none none / .8);width:100%;height:100%;top:0;right:0}.modal{position:fixed;z-index:300001;top:35%;left:25%;width:50%;height:25%;min-height:180px;background:var(--background);display:flex;flex-direction:column}.modal .modal-header{display:flex;align-items:center;justify-content:space-between;padding:10px;border-bottom:1px outset black}.modal .modal-content{flex:1;overflow:auto;scrollbar-width:thin;padding:10px;align-content:center}.modal .modal-footer{padding:10px}::ng-deep .modal-footer>div{display:flex;gap:.5rem;justify-content:flex-end}::ng-deep .light .modal .modal-content{background-color:var(--text-dark)!important}::ng-deep .light .modal .modal-footer{background-color:var(--text-dark)!important}::ng-deep .dark .modal{background:var(--background-dark)!important}::ng-deep .dark .modal-header{border-color:var(--text-dark)!important}@media screen and (max-width:600px){.modal{width:calc(100% - 16px)!important;left:8px!important}}\n"] }]
65
65
  }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], titleText: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleText", required: true }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], canEchap: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEchap", required: false }] }], onEscapeKey: [{
66
66
  type: HostListener,
67
67
  args: ['document:keydown.escape']
@@ -1 +1 @@
1
- {"version":3,"file":"ng-vagabond-lab-ng-dsv-ds-modal.mjs","sources":["../../../projects/ng-dsv/ds/modal/service/modal.service.ts","../../../projects/ng-dsv/ds/modal/component/modal.component.ts","../../../projects/ng-dsv/ds/modal/component/modal.component.html","../../../projects/ng-dsv/ds/modal/component/alert/modal-alert.component.ts","../../../projects/ng-dsv/ds/modal/component/alert/modal-alert.component.html","../../../projects/ng-dsv/ds/modal/component/button/modal-button.component.ts","../../../projects/ng-dsv/ds/modal/component/button/modal-button.component.html","../../../projects/ng-dsv/ds/modal/ng-vagabond-lab-ng-dsv-ds-modal.ts"],"sourcesContent":["import { Injectable, signal } from \"@angular/core\";\n\n@Injectable({ providedIn: 'root' })\nexport class ModalService {\n private readonly states = new Map<string, ReturnType<typeof signal<boolean>>>();\n\n getSignal(id: string) {\n if (!this.states.has(id)) {\n const newSignal = signal<boolean>(false);\n this.states.set(id, newSignal);\n }\n return this.states.get(id)?.() ?? false;\n }\n\n open(id: string) {\n this.states.get(id)?.set(true);\n }\n\n close(id: string) {\n this.states.get(id)?.set(false);\n }\n\n toggle(id: string) {\n const s = this.states.get(id);\n if (s) s.update(v => !v);\n }\n}","import { Component, effect, HostListener, inject, input, signal } from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { MenuService } from '@ng-vagabond-lab/ng-dsv/ds/menu';\nimport { ModalService } from '../service/modal.service';\n\n@Component({\n selector: 'dsv-modal',\n imports: [DsvButtonComponent],\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.scss'],\n})\nexport class ModalComponent {\n id = input.required<string>();\n titleText = input.required<string>();\n class = input<string>('');\n canEchap = input<boolean>(true);\n\n isOpen = signal<boolean>(false);\n\n modalService = inject(ModalService);\n menuService = inject(MenuService);\n\n constructor() {\n effect(() => {\n this.isOpen.set(this.modalService.getSignal(this.id()) ?? false);\n if (this.isOpen()) {\n this.menuService.isMenuOpen.set(false);\n }\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.isOpen() && this.canEchap()) {\n this.close();\n }\n }\n\n close = () => {\n this.modalService.close(this.id());\n };\n}\n","<div class=\"modal-overlay\" [class.open]=\"isOpen()\"></div>\n<div [class]=\"'modal ' + class()\" [class.open]=\"isOpen()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n</div>\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ModalService } from '../../service/modal.service';\nimport { ModalComponent } from '../modal.component';\n\n@Component({\n selector: 'dsv-modal-alert',\n imports: [ModalComponent, DsvButtonComponent, TranslatePipe],\n templateUrl: './modal-alert.component.html',\n})\nexport class ModalAlertComponent {\n id = input.required<string>();\n titleText = input<string>('title');\n text = input<string>('text');\n button = input<string>('button');\n buttonClose = input<string>();\n callback = output<void>();\n\n isOpen = signal<boolean>(false);\n\n modalService = inject(ModalService);\n\n constructor() {\n effect(() => {\n this.isOpen.set(this.modalService.getSignal(this.id() ?? false));\n });\n }\n\n doClick = () => {\n this.modalService.toggle(this.id());\n this.callback.emit();\n };\n\n doClickClose = () => {\n this.modalService.close(this.id());\n };\n}\n","<dsv-modal [id]=\"id()\" [titleText]=\"titleText()\">\n {{ text() }}\n <div ngProjectAs=\"modal-footer\">\n @if (buttonClose()) {\n <dsv-button (callback)=\"doClickClose()\" color=\"error\">\n {{ buttonClose()! | translate }}\n </dsv-button>\n }\n <dsv-button (callback)=\"doClick()\" color=\"success\">\n {{ button() | translate }}\n </dsv-button>\n </div>\n</dsv-modal>\n","import { Component, inject, input, output } from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { ButtonVariantType, ColorType } from '@ng-vagabond-lab/ng-dsv/type';\nimport { ModalService } from '../../service/modal.service';\n\n@Component({\n selector: 'dsv-modal-button',\n imports: [DsvButtonComponent],\n templateUrl: './modal-button.component.html',\n})\nexport class ModalButtonComponent {\n modalService = inject(ModalService);\n\n id = input.required<string>();\n icon = input<string>('');\n variant = input<ButtonVariantType>('contained');\n text = input<string>('');\n color = input<ColorType>('primary');\n\n callback = output<void>();\n\n doToogle = () => {\n this.callback.emit();\n this.modalService.toggle(this.id());\n };\n}\n","<dsv-button\n [color]=\"color()\"\n [icon]=\"icon()\"\n [variant]=\"variant()\"\n (callback)=\"doToogle()\"\n>\n {{ text() }}\n</dsv-button>\n<ng-content></ng-content>\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":"ng-vagabond-lab-ng-dsv-ds-modal.mjs","sources":["../../../projects/ng-dsv/ds/modal/service/modal.service.ts","../../../projects/ng-dsv/ds/modal/component/modal.component.ts","../../../projects/ng-dsv/ds/modal/component/modal.component.html","../../../projects/ng-dsv/ds/modal/component/alert/modal-alert.component.ts","../../../projects/ng-dsv/ds/modal/component/alert/modal-alert.component.html","../../../projects/ng-dsv/ds/modal/component/button/modal-button.component.ts","../../../projects/ng-dsv/ds/modal/component/button/modal-button.component.html","../../../projects/ng-dsv/ds/modal/ng-vagabond-lab-ng-dsv-ds-modal.ts"],"sourcesContent":["import { Injectable, signal } from \"@angular/core\";\n\n@Injectable({ providedIn: 'root' })\nexport class ModalService {\n private readonly states = new Map<string, ReturnType<typeof signal<boolean>>>();\n\n getSignal(id: string) {\n if (!this.states.has(id)) {\n const newSignal = signal<boolean>(false);\n this.states.set(id, newSignal);\n }\n return this.states.get(id)?.() ?? false;\n }\n\n open(id: string) {\n this.states.get(id)?.set(true);\n }\n\n close(id: string) {\n this.states.get(id)?.set(false);\n }\n\n toggle(id: string) {\n const s = this.states.get(id);\n if (s) s.update(v => !v);\n }\n}","import { Component, effect, HostListener, inject, input, signal } from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { MenuService } from '@ng-vagabond-lab/ng-dsv/ds/menu';\nimport { ModalService } from '../service/modal.service';\n\n@Component({\n selector: 'dsv-modal',\n imports: [DsvButtonComponent],\n templateUrl: './modal.component.html',\n styleUrls: ['./modal.component.scss'],\n})\nexport class ModalComponent {\n id = input.required<string>();\n titleText = input.required<string>();\n class = input<string>('');\n canEchap = input<boolean>(true);\n\n isOpen = signal<boolean>(false);\n\n modalService = inject(ModalService);\n menuService = inject(MenuService);\n\n constructor() {\n effect(() => {\n this.isOpen.set(this.modalService.getSignal(this.id()) ?? false);\n if (this.isOpen()) {\n this.menuService.isMenuOpen.set(false);\n }\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.isOpen() && this.canEchap()) {\n this.close();\n }\n }\n\n close = () => {\n this.modalService.close(this.id());\n };\n}\n","@if (isOpen()) {\n <div class=\"modal-overlay\"></div>\n <div [class]=\"'modal ' + class()\">\n <div class=\"modal-header\">\n <b>{{ titleText() }}</b>\n <dsv-button (callback)=\"close()\" variant=\"text\" color=\"inherit\">\n X\n </dsv-button>\n </div>\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"modal-footer\">\n <ng-content select=\"modal-footer\"></ng-content>\n </div>\n </div>\n}\n","import {\n Component,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ModalService } from '../../service/modal.service';\nimport { ModalComponent } from '../modal.component';\n\n@Component({\n selector: 'dsv-modal-alert',\n imports: [ModalComponent, DsvButtonComponent, TranslatePipe],\n templateUrl: './modal-alert.component.html',\n})\nexport class ModalAlertComponent {\n id = input.required<string>();\n titleText = input<string>('title');\n text = input<string>('text');\n button = input<string>('button');\n buttonClose = input<string>();\n callback = output<void>();\n\n isOpen = signal<boolean>(false);\n\n modalService = inject(ModalService);\n\n constructor() {\n effect(() => {\n this.isOpen.set(this.modalService.getSignal(this.id() ?? false));\n });\n }\n\n doClick = () => {\n this.modalService.toggle(this.id());\n this.callback.emit();\n };\n\n doClickClose = () => {\n this.modalService.close(this.id());\n };\n}\n","<dsv-modal [id]=\"id()\" [titleText]=\"titleText()\">\n {{ text() }}\n <div ngProjectAs=\"modal-footer\">\n @if (buttonClose()) {\n <dsv-button (callback)=\"doClickClose()\" color=\"error\">\n {{ buttonClose()! | translate }}\n </dsv-button>\n }\n <dsv-button (callback)=\"doClick()\" color=\"success\">\n {{ button() | translate }}\n </dsv-button>\n </div>\n</dsv-modal>\n","import { Component, inject, input, output } from '@angular/core';\nimport { DsvButtonComponent } from '@ng-vagabond-lab/ng-dsv/ds/button';\nimport { ButtonVariantType, ColorType } from '@ng-vagabond-lab/ng-dsv/type';\nimport { ModalService } from '../../service/modal.service';\n\n@Component({\n selector: 'dsv-modal-button',\n imports: [DsvButtonComponent],\n templateUrl: './modal-button.component.html',\n})\nexport class ModalButtonComponent {\n modalService = inject(ModalService);\n\n id = input.required<string>();\n icon = input<string>('');\n variant = input<ButtonVariantType>('contained');\n text = input<string>('');\n color = input<ColorType>('primary');\n\n callback = output<void>();\n\n doToogle = () => {\n this.callback.emit();\n this.modalService.toggle(this.id());\n };\n}\n","<dsv-button\n [color]=\"color()\"\n [icon]=\"icon()\"\n [variant]=\"variant()\"\n (callback)=\"doToogle()\"\n>\n {{ text() }}\n</dsv-button>\n<ng-content></ng-content>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -18,12 +18,8 @@ class AuthComponent {
18
18
  constructor() {
19
19
  effect(() => {
20
20
  if (this.environmentService.env() && this.platformService.isPlatformBrowser()) {
21
- this.authGoogleService.initGoogleAuth();
22
21
  this.authService.loginFromCache();
23
- }
24
- });
25
- effect(() => {
26
- if (this.environmentService.env() && this.platformService.isPlatformBrowser()) {
22
+ this.authGoogleService.initGoogleAuth();
27
23
  if (this.authService.userConnected() === null) {
28
24
  this.authGoogleService.loginWithGoogle();
29
25
  }
@@ -111,19 +107,19 @@ class AuthGoogleService {
111
107
  authService = inject(AuthService);
112
108
  environmentService = inject(EnvironmentService);
113
109
  initGoogle = false;
114
- initGoogleAuth(googleButtonid = 'google-signin-button') {
115
- //if (!this.initGoogle) {
116
- this.initGoogle = true;
117
- google.accounts.id.initialize({
118
- client_id: this.environmentService.env()?.GOOGLE_CLIENT_ID,
119
- callback: this.handleCredentialResponse.bind(this),
120
- });
121
- google.accounts.id.renderButton(document.getElementById(googleButtonid), {
122
- theme: 'outline',
123
- size: 'medium',
124
- type: 'icon',
125
- });
126
- //}
110
+ initGoogleAuth() {
111
+ if (!this.initGoogle) {
112
+ this.initGoogle = true;
113
+ google.accounts.id.initialize({
114
+ client_id: this.environmentService.env()?.GOOGLE_CLIENT_ID,
115
+ callback: this.handleCredentialResponse.bind(this),
116
+ });
117
+ google.accounts.id.renderButton(document.getElementById('google-signin-button'), {
118
+ theme: 'outline',
119
+ size: 'medium',
120
+ type: 'icon',
121
+ });
122
+ }
127
123
  }
128
124
  handleCredentialResponse(response) {
129
125
  this.authService.googleLogin(response.credential);
@@ -1 +1 @@
1
- {"version":3,"file":"ng-vagabond-lab-ng-dsv-modules-auth.mjs","sources":["../../../projects/ng-dsv/modules/auth/component/auth.component.ts","../../../projects/ng-dsv/modules/auth/component/auth.component.html","../../../projects/ng-dsv/modules/auth/guard/auth.guard.ts","../../../projects/ng-dsv/modules/auth/service/auth.service.ts","../../../projects/ng-dsv/modules/auth/service/auth.google.service.ts","../../../projects/ng-dsv/modules/auth/utils/auth.utils.ts","../../../projects/ng-dsv/modules/auth/ng-vagabond-lab-ng-dsv-modules-auth.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n inject,\n output\n} from '@angular/core';\nimport { ID } from '@ng-vagabond-lab/ng-dsv/api';\nimport {\n ModalAlertComponent,\n ModalButtonComponent,\n} from '@ng-vagabond-lab/ng-dsv/ds/modal';\nimport { EnvironmentService } from '@ng-vagabond-lab/ng-dsv/environment';\nimport { PlatformService } from '@ng-vagabond-lab/ng-dsv/platform';\nimport { AuthGoogleService, AuthService } from '../public-api';\n\n@Component({\n selector: 'dsv-auth',\n imports: [CommonModule, ModalButtonComponent, ModalAlertComponent],\n templateUrl: './auth.component.html',\n styleUrls: ['./auth.component.scss'],\n})\nexport class AuthComponent {\n readonly authService = inject(AuthService);\n readonly authGoogleService = inject(AuthGoogleService);\n readonly environmentService = inject(EnvironmentService);\n readonly platformService = inject(PlatformService);\n\n readonly initMember = output<ID>();\n\n constructor() {\n effect(() => {\n if (this.environmentService.env() && this.platformService.isPlatformBrowser()) {\n this.authGoogleService.initGoogleAuth();\n this.authService.loginFromCache();\n }\n });\n effect(() => {\n if (this.environmentService.env() && this.platformService.isPlatformBrowser()) {\n if (this.authService.userConnected() === null) {\n this.authGoogleService.loginWithGoogle();\n } else {\n this.initMember.emit(this.authService.userConnected()?.user?.id);\n }\n }\n });\n }\n\n logout() {\n this.authService.logout();\n }\n}\n","<div class=\"auth-button\">\n <button\n id=\"google-signin-button\"\n [class.hidden]=\"authService.userConnected() !== null\"\n ></button>\n</div>\n\n@if (authService.userConnected()) {\n <div class=\"profile\">\n <img [src]=\"authService.userConnected()?.user?.avatar\" alt=\"profile\" />\n <dsv-modal-button id=\"logout\" icon=\"ri-logout-box-line\" />\n </div>\n <dsv-modal-alert\n id=\"logout\"\n title=\"Déconnexion\"\n text=\"Voulez-vous vraiment vous déconnecter ?\"\n button=\"Oui\"\n buttonClose=\"Non\"\n (callback)=\"logout()\"\n ></dsv-modal-alert>\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, Router } from '@angular/router';\nimport { PlatformService } from '@ng-vagabond-lab/ng-dsv/platform';\nimport { AuthService, hasRole } from '../public-api';\n\nexport const authGuard: CanActivateFn = (\n route: ActivatedRouteSnapshot,\n) => {\n const platformService = inject(PlatformService);\n\n if (!platformService.isPlatformBrowser()) {\n return true;\n }\n\n const authService = inject(AuthService);\n const router = inject(Router);\n\n const requiredRole = route.data['role'];\n\n if (!requiredRole) {\n console.warn('No role specified in route data.');\n return false;\n }\n\n authService.loginFromCache();\n const profiles = authService.userConnected()?.user?.profiles;\n if (hasRole(requiredRole, profiles)) {\n return true;\n }\n\n router.navigate(['/']);\n return false;\n};\n","import { inject, Injectable, signal } from '@angular/core';\nimport { ApiService } from '@ng-vagabond-lab/ng-dsv/api';\nimport { ToastService } from '@ng-vagabond-lab/ng-dsv/ds/toast';\nimport { StorageService } from '@ng-vagabond-lab/ng-dsv/storage';\nimport { UserConnectedDto } from '../dto/user.dto';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n apiService = inject(ApiService);\n toastService = inject(ToastService);\n storageService = inject(StorageService);\n\n userConnected = signal<UserConnectedDto | null>(null);\n\n googleLogin(credential: string) {\n this.apiService.post<UserConnectedDto>(\n 'auth/google-identity-connect',\n {\n googleToken: credential,\n },\n (data) => {\n this.storageService.setItem('user-connected', JSON.stringify(data));\n this.userConnected.set(data);\n this.toastService.showToast({\n type: 'success',\n text: 'Connexion réussie',\n });\n }\n );\n }\n\n loginFromCache() {\n const userConnected =\n typeof window !== 'undefined' &&\n JSON.parse(this.storageService?.getItem('user-connected')!);\n this.userConnected.set(userConnected);\n this.apiService.info('userConnected', userConnected);\n return userConnected;\n }\n\n logout() {\n this.storageService?.removeItem('user-connected');\n this.userConnected.set(null);\n this.toastService.showToast({\n type: 'success',\n text: 'Déconnexion réussie',\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { EnvironmentService } from '@ng-vagabond-lab/ng-dsv/environment';\nimport { AuthService } from './auth.service';\n\ndeclare const google: any;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGoogleService {\n private readonly authService = inject(AuthService);\n private readonly environmentService = inject(EnvironmentService);\n\n initGoogle: boolean = false;\n\n initGoogleAuth(googleButtonid: string = 'google-signin-button') {\n //if (!this.initGoogle) {\n this.initGoogle = true;\n google.accounts.id.initialize({\n client_id: this.environmentService.env()?.GOOGLE_CLIENT_ID,\n callback: this.handleCredentialResponse.bind(this),\n });\n google.accounts.id.renderButton(\n document.getElementById(googleButtonid)!,\n {\n theme: 'outline',\n size: 'medium',\n type: 'icon',\n }\n );\n //}\n }\n\n handleCredentialResponse(response: { credential: string }) {\n this.authService.googleLogin(response.credential);\n }\n\n decodeJwtToken(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n return JSON.parse(jsonPayload);\n }\n\n loginWithGoogle() {\n google.accounts.id.prompt();\n }\n}\n","import { ApiDto } from \"@ng-vagabond-lab/ng-dsv/api\";\n\nexport const hasRole = (roles: string, userRoles?: ApiDto[]) => {\n const roleSplit = roles.split(',');\n let find = false;\n roleSplit.forEach(role => {\n if (userRoles?.find(userRole => userRole['roles' as keyof ApiDto]?.toString().includes(role) || userRole['name' as keyof ApiDto] === role)) {\n find = true;\n }\n });\n return find;\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":"ng-vagabond-lab-ng-dsv-modules-auth.mjs","sources":["../../../projects/ng-dsv/modules/auth/component/auth.component.ts","../../../projects/ng-dsv/modules/auth/component/auth.component.html","../../../projects/ng-dsv/modules/auth/guard/auth.guard.ts","../../../projects/ng-dsv/modules/auth/service/auth.service.ts","../../../projects/ng-dsv/modules/auth/service/auth.google.service.ts","../../../projects/ng-dsv/modules/auth/utils/auth.utils.ts","../../../projects/ng-dsv/modules/auth/ng-vagabond-lab-ng-dsv-modules-auth.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n inject,\n output\n} from '@angular/core';\nimport { ID } from '@ng-vagabond-lab/ng-dsv/api';\nimport {\n ModalAlertComponent,\n ModalButtonComponent,\n} from '@ng-vagabond-lab/ng-dsv/ds/modal';\nimport { EnvironmentService } from '@ng-vagabond-lab/ng-dsv/environment';\nimport { PlatformService } from '@ng-vagabond-lab/ng-dsv/platform';\nimport { AuthGoogleService, AuthService } from '../public-api';\n\n@Component({\n selector: 'dsv-auth',\n imports: [CommonModule, ModalButtonComponent, ModalAlertComponent],\n templateUrl: './auth.component.html',\n styleUrls: ['./auth.component.scss'],\n})\nexport class AuthComponent {\n readonly authService = inject(AuthService);\n readonly authGoogleService = inject(AuthGoogleService);\n readonly environmentService = inject(EnvironmentService);\n readonly platformService = inject(PlatformService);\n\n readonly initMember = output<ID>();\n\n constructor() {\n effect(() => {\n if (this.environmentService.env() && this.platformService.isPlatformBrowser()) {\n this.authService.loginFromCache();\n this.authGoogleService.initGoogleAuth();\n if (this.authService.userConnected() === null) {\n this.authGoogleService.loginWithGoogle();\n } else {\n this.initMember.emit(this.authService.userConnected()?.user?.id);\n }\n }\n });\n }\n\n logout() {\n this.authService.logout();\n }\n}\n","<div class=\"auth-button\">\n <button\n id=\"google-signin-button\"\n [class.hidden]=\"authService.userConnected() !== null\"\n ></button>\n</div>\n\n@if (authService.userConnected()) {\n <div class=\"profile\">\n <img [src]=\"authService.userConnected()?.user?.avatar\" alt=\"profile\" />\n <dsv-modal-button id=\"logout\" icon=\"ri-logout-box-line\" />\n </div>\n <dsv-modal-alert\n id=\"logout\"\n title=\"Déconnexion\"\n text=\"Voulez-vous vraiment vous déconnecter ?\"\n button=\"Oui\"\n buttonClose=\"Non\"\n (callback)=\"logout()\"\n ></dsv-modal-alert>\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, Router } from '@angular/router';\nimport { PlatformService } from '@ng-vagabond-lab/ng-dsv/platform';\nimport { AuthService, hasRole } from '../public-api';\n\nexport const authGuard: CanActivateFn = (\n route: ActivatedRouteSnapshot,\n) => {\n const platformService = inject(PlatformService);\n\n if (!platformService.isPlatformBrowser()) {\n return true;\n }\n\n const authService = inject(AuthService);\n const router = inject(Router);\n\n const requiredRole = route.data['role'];\n\n if (!requiredRole) {\n console.warn('No role specified in route data.');\n return false;\n }\n\n authService.loginFromCache();\n const profiles = authService.userConnected()?.user?.profiles;\n if (hasRole(requiredRole, profiles)) {\n return true;\n }\n\n router.navigate(['/']);\n return false;\n};\n","import { inject, Injectable, signal } from '@angular/core';\nimport { ApiService } from '@ng-vagabond-lab/ng-dsv/api';\nimport { ToastService } from '@ng-vagabond-lab/ng-dsv/ds/toast';\nimport { StorageService } from '@ng-vagabond-lab/ng-dsv/storage';\nimport { UserConnectedDto } from '../dto/user.dto';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n apiService = inject(ApiService);\n toastService = inject(ToastService);\n storageService = inject(StorageService);\n\n userConnected = signal<UserConnectedDto | null>(null);\n\n googleLogin(credential: string) {\n this.apiService.post<UserConnectedDto>(\n 'auth/google-identity-connect',\n {\n googleToken: credential,\n },\n (data) => {\n this.storageService.setItem('user-connected', JSON.stringify(data));\n this.userConnected.set(data);\n this.toastService.showToast({\n type: 'success',\n text: 'Connexion réussie',\n });\n }\n );\n }\n\n loginFromCache() {\n const userConnected =\n typeof window !== 'undefined' &&\n JSON.parse(this.storageService?.getItem('user-connected')!);\n this.userConnected.set(userConnected);\n this.apiService.info('userConnected', userConnected);\n return userConnected;\n }\n\n logout() {\n this.storageService?.removeItem('user-connected');\n this.userConnected.set(null);\n this.toastService.showToast({\n type: 'success',\n text: 'Déconnexion réussie',\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { EnvironmentService } from '@ng-vagabond-lab/ng-dsv/environment';\nimport { AuthService } from './auth.service';\n\ndeclare const google: any;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthGoogleService {\n private readonly authService = inject(AuthService);\n private readonly environmentService = inject(EnvironmentService);\n\n initGoogle: boolean = false;\n\n initGoogleAuth() {\n if (!this.initGoogle) {\n this.initGoogle = true;\n google.accounts.id.initialize({\n client_id: this.environmentService.env()?.GOOGLE_CLIENT_ID,\n callback: this.handleCredentialResponse.bind(this),\n });\n google.accounts.id.renderButton(\n document.getElementById('google-signin-button')!,\n {\n theme: 'outline',\n size: 'medium',\n type: 'icon',\n }\n );\n }\n }\n\n handleCredentialResponse(response: { credential: string }) {\n this.authService.googleLogin(response.credential);\n }\n\n decodeJwtToken(token: string) {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n return JSON.parse(jsonPayload);\n }\n\n loginWithGoogle() {\n google.accounts.id.prompt();\n }\n}\n","import { ApiDto } from \"@ng-vagabond-lab/ng-dsv/api\";\n\nexport const hasRole = (roles: string, userRoles?: ApiDto[]) => {\n const roleSplit = roles.split(',');\n let find = false;\n roleSplit.forEach(role => {\n if (userRoles?.find(userRole => userRole['roles' as keyof ApiDto]?.toString().includes(role) || userRole['name' as keyof ApiDto] === role)) {\n find = true;\n }\n });\n return find;\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-vagabond-lab/ng-dsv",
3
- "version": "0.1.75",
3
+ "version": "0.1.76",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.0.0",
6
6
  "@angular/core": "^20.0.0"
@@ -42,7 +42,7 @@ declare class AuthGoogleService {
42
42
  private readonly authService;
43
43
  private readonly environmentService;
44
44
  initGoogle: boolean;
45
- initGoogleAuth(googleButtonid?: string): void;
45
+ initGoogleAuth(): void;
46
46
  handleCredentialResponse(response: {
47
47
  credential: string;
48
48
  }): void;