@ngodings/ngx-image-tagger
Version:
Simple Image Tagger like instagram, easy to put stuff/item information in x/y position from image, easy configuration in Angular
1 lines • 19.7 kB
Source Map (JSON)
{"version":3,"file":"ngodings-ngx-image-tagger.mjs","sources":["../../../packages/ngx-image-tagger/src/lib/ngx-image-tagger.component.ts","../../../packages/ngx-image-tagger/src/lib/ngx-image-tagger.component.html","../../../packages/ngx-image-tagger/src/lib/ngx-image-tagger.module.ts","../../../packages/ngx-image-tagger/src/public-api.ts","../../../packages/ngx-image-tagger/src/ngodings-ngx-image-tagger.ts"],"sourcesContent":["import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';\nimport { fromEvent } from 'rxjs';\n\nimport { Tagged, TaggerModel } from './model/tag';\n\n@Component({\n selector: 'ngx-image-tagger',\n templateUrl: './ngx-image-tagger.component.html',\n styleUrls: ['./ngx-image-tagger.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class NgxImageTaggerComponent implements OnInit {\n heightElement = 0;\n widthElement = 0;\n\n @Input() isAllowCreate = false;\n @Input() isShowThumbnail = true;\n @Input() imageClassList = \"\";\n\n @Input() placeholderName = 'Name';\n\n @Input() placeholderPrice = 'Price';\n @Input() isShowPrice = true;\n\n @Input() placeholderLink = 'Link';\n @Input() isShowLink = true;\n\n @Input() borderColor = \"#007ac1\";\n @Input() backgroundColor = \"#03a9f4\";\n @Input() textColor = \"#ffffff\";\n\n @Input() inputClassList = \"\";\n\n @Input() placeholderCreateTitle = 'Tag your product!';\n @Input() buttonCancelTitle = \"Cancel\";\n @Input() buttonCreateTitle = \"Create\";\n\n @Input() isShowShop = false;\n @Input() titleShop = \"Go to shop\";\n\n @Input() onShowTagMode: \"Hover\" | \"Click\" | \"IconClick\" = \"Hover\";\n\n @Input() tagger: TaggerModel = {\n idParent: 'image-parent',\n id: 'image',\n style: '',\n urlShop: '',\n isOffsideX: false,\n isOffsideY: false,\n x: 0,\n y: 0,\n url: '',\n tags: []\n }\n @Output() taggerChange: EventEmitter<TaggerModel> = new EventEmitter<TaggerModel>();\n\n isShowForm = false;\n isShowView = true;\n form!: Tagged;\n\n constructor() {\n fromEvent(document.body, 'mousedown').subscribe((event: any) => {\n const elementId = (event.target as Element).id;\n if (this.tagger && elementId === this.tagger.id) {\n this.resetTag();\n\n const x = event.layerX;\n const y = event.layerY - 6;\n\n this.heightElement = event?.srcElement?.offsetHeight;\n const halfY = this.heightElement / 2;\n if (halfY < y) {\n this.tagger.isOffsideY = true;\n } else {\n this.tagger.isOffsideY = false;\n }\n\n this.widthElement = event?.srcElement?.offsetWidth;\n const halfX = this.widthElement / 2;\n if (halfX < x) {\n this.tagger.isOffsideX = true;\n } else {\n this.tagger.isOffsideX = false;\n }\n this.tagger.x = (x * 100) / this.widthElement;\n this.tagger.y = (y * 100) / this.heightElement;\n this.isShowForm = true;\n }\n });\n }\n\n ngOnInit() {\n this.form = {\n id: '',\n x: 0,\n y: 0,\n isOffsideX: false,\n isOffsideY: false,\n tagger: this.tagger,\n open: false,\n }\n\n if (this.onShowTagMode === 'IconClick') {\n this.isShowView = false;\n }\n }\n\n changeStyleClick(id: string, tag: Tagged) {\n if (this.onShowTagMode != 'Click') {\n return;\n }\n\n tag.open = !tag.open;\n this.onShowStyle(id, tag.open);\n }\n\n changeStyleHover(id: string, show: boolean) {\n if (this.onShowTagMode == 'Click') {\n return;\n }\n this.onShowStyle(id, show);\n }\n\n onShowStyle(id: string, show: boolean) {\n const el = document.getElementById(id)\n if (el) {\n if (show) {\n el.style.display = \"block\"\n el.style.zIndex = \"100\"\n } else {\n el.style.display = \"none\"\n el.style.zIndex = \"1\"\n }\n }\n }\n\n goToURL(url: string) {\n window.open(url, \"_blank\");\n }\n\n goToTag(item: Tagged) {\n window.open(item.url, \"_blank\");\n }\n\n resetTag() {\n this.form.name = '';\n this.form.price = 0;\n this.form.url = '';\n this.isShowForm = false;\n }\n\n submitTag(item: TaggerModel) {\n if (item) {\n let isOffsideX = false;\n let isOffsideY = false;\n\n if (item?.x! > 50) {\n isOffsideX = true;\n } else {\n isOffsideX = false;\n }\n\n if (item?.y! > 0) {\n isOffsideY = true;\n } else {\n isOffsideY = false;\n }\n\n item.tags.push({\n id: \"\", name: this.form.name, url: this.form.url, x: item.x!, y: item.y!, isOffsideX, isOffsideY,\n open: false,\n price: this.form.price,\n tagger: Object.assign(this.tagger),\n });\n this.resetTag();\n this.taggerChange.next(this.tagger);\n }\n }\n\n editTag(item: TaggerModel, tag: Tagged, subindex: number) {\n this.form.name = tag?.name!;\n this.form.url = tag?.url!;\n\n this.tagger.x = tag.x;\n this.tagger.y = tag.y;\n this.tagger.isOffsideX = tag.isOffsideX\n this.tagger.isOffsideY = tag.isOffsideY;\n\n this.isShowForm = true;\n this.taggerChange.next(this.tagger);\n }\n\n deleteTag(item: TaggerModel, tag: Tagged, subindex: number) {\n this.tagger.tags.splice(subindex, 1);\n this.taggerChange.next(this.tagger);\n }\n}\n","<div class=\"tagger\" id=\"{{ tagger.idParent }}\">\n <img alt=\"Image Tagger\" id=\"{{ tagger.id }}\" [src]=\"tagger.url\" [ngClass]=\"imageClassList\"> \n <ng-container *ngIf=\"tagger?.tags && tagger.tags?.length! > 0 && onShowTagMode === 'IconClick'\">\n <div class=\"shop-icon\" [class.active]=\"isShowView\" (click)=\"isShowView = !isShowView\" [class.without-shop]=\"!isShowShop\" [class.with-shop]=\"isShowShop\">\n <i class=\"material-icons\">local_mall</i>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"isShowForm\">\n <div class=\"add-tag flex\" *ngIf=\"isAllowCreate\" [ngStyle]=\"{\n 'top.%': tagger.y , \n 'left.%': tagger.x\n }\" [class.items-start]=\"tagger.isOffsideY && !tagger.isOffsideX || tagger.isOffsideY && tagger.isOffsideX\">\n\n <div class=\"pin mr-2\"></div>\n\n <div class=\"content\">\n <ng-container *ngIf=\"placeholderCreateTitle\">\n <div class=\"mb-3 create-title\">\n {{ placeholderCreateTitle }}\n </div>\n </ng-container>\n <div>\n <input class=\"input-style\" [(ngModel)]=\"form.name\" [placeholder]=\"placeholderName\" type=\"text\" [ngClass]=\"inputClassList\">\n </div>\n <ng-container *ngIf=\"isShowPrice\">\n <div class=\"mt-2\">\n <input class=\"input-style\" [(ngModel)]=\"form.price\" currencyMask [options]=\"{ prefix: '$ ', thousands: '.', decimal: ',' }\" [placeholder]=\"placeholderPrice\" [ngClass]=\"inputClassList\">\n </div>\n </ng-container>\n <ng-container *ngIf=\"isShowLink\">\n <div class=\"mt-2\">\n <input class=\"input-style\" [(ngModel)]=\"form.url\" [placeholder]=\"placeholderLink\" type=\"email\" [ngClass]=\"inputClassList\">\n </div>\n </ng-container>\n <div class=\"mt-2 flex items-center justify-space-between gap-2\">\n <div class=\"w-half\">\n <button class=\"button-style outline\" (click)=\"isShowForm = false\" [ngStyle]=\"{ 'border-color': backgroundColor, 'color': backgroundColor }\">\n {{ buttonCancelTitle }}\n </button>\n </div>\n <div class=\"w-half\">\n <button class=\"button-style\" (click)=\"submitTag(tagger)\" [ngStyle]=\"{ 'border-color': backgroundColor, 'background': backgroundColor, 'color': textColor }\" [disabled]=\"!form.name || !form.url && isShowLink\">\n {{ buttonCreateTitle }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"tagger.tags && isShowView\">\n <ng-container *ngFor=\"let tag of tagger.tags; let subindex = index\">\n <div class=\"tagging flex items-start\" (mouseover)=\"changeStyleHover(tag.id+subindex,true)\" (click)=\"changeStyleClick(tag.id+subindex, tag)\"\n (mouseout)=\"changeStyleHover(tag.id+subindex,false)\" [ngStyle]=\"{\n 'top.%': tag.y, \n 'left.%': tag.x\n }\">\n <div class=\"pin mr-2 pointer\">\n </div>\n <div [id]=\"tag.id+subindex\" class=\"content\" style=\"display: none;\">\n <div class=\"flex items-center justify-between gap-2\">\n <ng-container *ngIf=\"isShowThumbnail\">\n <div class=\"thumnbnail\">\n <img [src]=\"tagger.url\" [ngStyle]=\"{'object-position':''+tag.x+'% '+tag.y+'%'+'', 'object-fit': 'none'}\">\n </div>\n </ng-container>\n <div class=\"text-left\">\n <div class=\"name\">{{ tag.name }}</div>\n <div *ngIf=\"isShowPrice\" class=\"mt-1 price\" >{{ tag.price | currency:'USD' }}</div>\n <div *ngIf=\"isShowLink\" class=\"link mt-1 pointer\" (click)=\"goToTag(tag)\">Go to link</div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n<ng-container *ngIf=\"isShowShop\">\n <div class=\"shop flex items-center justify-between\" [ngStyle]=\"{ 'background': backgroundColor }\" (click)=\"goToURL(tagger.urlShop!)\">\n <div class=\"w-half flex items-center justify-content-start\">\n {{ titleShop }}\n </div>\n <div class=\"flex items-center justify-content-end w-half\">\n <i class=\"material-icons\">navigate_next</i>\n </div>\n </div>\n</ng-container>","import { CommonModule, CurrencyPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgxCurrencyModule } from '@ngodings/ngx-currency';\nimport { NgxImageTaggerComponent } from './ngx-image-tagger.component';\n\n@NgModule({\n declarations: [\n NgxImageTaggerComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n NgxCurrencyModule,\n ],\n providers: [\n CurrencyPipe,\n ],\n exports: [\n NgxImageTaggerComponent\n ]\n})\nexport class NgxImageTaggerModule { }\n","/*\n * Public API Surface of ngx-image-tagger\n */\n\nexport * from './lib/ngx-image-tagger.component';\nexport * from './lib/ngx-image-tagger.module';\nexport * from './lib/model/tag';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}