@vendure/admin-ui 3.4.3-master-202509260228 → 3.5.0-minor-202510012036

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.
@@ -90,10 +90,10 @@ class LoginComponent {
90
90
  }
91
91
  return redirectTo;
92
92
  }
93
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginComponent, deps: [{ token: i1.AuthService }, { token: i1$1.Router }, { token: i3.HttpClient }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.10", type: LoginComponent, isStandalone: false, selector: "vdr-login", ngImport: i0, template: "<div class=\"login-wrapper\" [dir]=\"direction$ | async\">\n <div class=\"login-wrapper-inner\">\n <div class=\"login-wrapper-image\">\n <div class=\"login-wrapper-image-content\">\n <div class=\"login-wrapper-image-title\">\n {{ 'common.login-image-title' | translate }}\n </div>\n <div class=\"login-wrapper-image-copyright\">\n <p *ngIf=\"imageCreator\" class=\"creator\">\n Photo by <a [href]=\"imageCreatorUrl\" target=\"_blank\">{{ imageCreator }}</a> on\n <a [href]=\"imageUnsplashUrl\" target=\"_blank\">Unsplash</a>\n </p>\n <p *ngIf=\"imageLocation\" class=\"location\">{{ imageLocation }}</p>\n </div>\n </div>\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" [alt]=\"imageUrl\" />\n </div>\n <div class=\"login-wrapper-form\">\n <p class=\"login-title\">\n {{ 'common.login-title' | translate : { brand: hideVendureBranding ? brand : 'Vendure' } }}\n </p>\n <form class=\"login-form\">\n <div class=\"login-group\">\n <input\n class=\"username\"\n type=\"text\"\n name=\"username\"\n id=\"login_username\"\n [(ngModel)]=\"username\"\n [placeholder]=\"'common.username' | translate\"\n />\n <input\n class=\"password\"\n name=\"password\"\n type=\"password\"\n id=\"login_password\"\n [(ngModel)]=\"password\"\n [placeholder]=\"'common.password' | translate\"\n />\n <clr-alert\n [clrAlertType]=\"'danger'\"\n [clrAlertClosable]=\"false\"\n [class.visible]=\"errorMessage\"\n class=\"login-error\"\n >\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ errorMessage }}\n </span>\n </clr-alert-item>\n </clr-alert>\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n id=\"rememberme\"\n name=\"rememberme\"\n [(ngModel)]=\"rememberMe\"\n />\n <label>{{ 'common.remember-me' | translate }}</label>\n </clr-checkbox-wrapper>\n <div>\n <button\n type=\"submit\"\n class=\"button primary login-button\"\n (click)=\"logIn()\"\n [disabled]=\"!username || !password\"\n >\n {{ 'common.login' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n <img class=\"login-wrapper-logo\" src=\"assets/logo-login.webp\" *ngIf=\"!hideVendureBranding\" />\n </div>\n</div>\n", styles: [".login-wrapper{background:var(--color-weight-100);background-image:none;height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.login-wrapper .login-wrapper-inner{background:var(--login-wrapper-inner-bg);width:1120px;height:590px;display:flex;justify-content:flex-start;align-items:stretch;position:relative;border-radius:var(--border-radius);border:1px solid var(--color-weight-150);overflow:hidden}@media (max-width: 992px){.login-wrapper .login-wrapper-inner{flex-direction:column;height:auto;width:100%}}.login-wrapper .login-wrapper-inner .login-wrapper-image{height:100%;flex-grow:1;position:relative}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image{height:300px}}.login-wrapper .login-wrapper-inner .login-wrapper-image img{display:block;width:100%;height:100%;object-fit:cover;object-position:center;position:relative;z-index:1}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{width:100%;height:100%;position:absolute;left:0;bottom:0;z-index:10;background:#020024;background:linear-gradient(180deg,#02002400,#000000bf);display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;padding:30px}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.6rem;font-weight:700;color:#fff;margin-bottom:20px}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.2rem}}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright{opacity:.8}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright p{font-size:.6rem;color:#fff;margin:0!important}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright a{color:#fff;text-decoration:underline}.login-wrapper .login-wrapper-inner .login-wrapper-form{height:100%;width:400px;padding:40px;display:flex;flex-direction:column;align-items:stretch;justify-content:center;box-shadow:0 20px 25px #0000001a;overflow:hidden;flex-shrink:0}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-form{height:auto;width:100%;padding:20px}}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-title{font-weight:700;font-size:1.2rem;margin-bottom:20px;color:var(--color-weight-600)}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.username,.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.password{display:block;width:100%;margin-bottom:15px;padding:12px 16px!important;background:#fff;font-size:14px;line-height:22px;color:#52667a;outline:none;-webkit-appearance:none}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group .btn{width:100%!important;margin-top:20px!important}.login-wrapper .login-wrapper-inner .login-wrapper-logo{width:60px;height:auto;position:absolute;right:20px;top:20px}.login-button{width:100%;margin-top:var(--space-unit);justify-content:center}.version{flex:1;flex-grow:1;display:flex;align-items:flex-end;justify-content:center;color:var(--color-grey-300)}.version span+span{margin-inline-start:5px}.login-error{max-height:0;overflow:hidden;display:block}.login-error.visible{max-height:46px;transition:max-height .2s;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation-delay:.2s;transform:translateZ(0);backface-visibility:hidden;perspective:1000px}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-logo{right:auto;left:20px}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{left:auto;right:0}\n"], dependencies: [{ kind: "component", type: i4.ClrAlert, selector: "clr-alert", inputs: ["clrAlertSizeSmall", "clrAlertClosable", "clrAlertAppLevel", "clrCloseButtonAriaLabel", "clrAlertLightweight", "clrAlertType", "clrAlertIcon", "clrAlertClosed"], outputs: ["clrAlertClosedChange"] }, { kind: "component", type: i4.ClrAlertItem, selector: "clr-alert-item" }, { kind: "directive", type: i4.ClrAlertText, selector: ".alert-text" }, { kind: "directive", type: i4.ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i4.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: i4.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.ɵɵDir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "directive", type: i1.FormFieldControlDirective, selector: "input, textarea, select, vdr-currency-input" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
93
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginComponent, deps: [{ token: i1.AuthService }, { token: i1$1.Router }, { token: i3.HttpClient }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
94
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: LoginComponent, isStandalone: false, selector: "vdr-login", ngImport: i0, template: "<div class=\"login-wrapper\" [dir]=\"direction$ | async\">\n <div class=\"login-wrapper-inner\">\n <div class=\"login-wrapper-image\">\n <div class=\"login-wrapper-image-content\">\n <div class=\"login-wrapper-image-title\">\n {{ 'common.login-image-title' | translate }}\n </div>\n <div class=\"login-wrapper-image-copyright\">\n <p *ngIf=\"imageCreator\" class=\"creator\">\n Photo by <a [href]=\"imageCreatorUrl\" target=\"_blank\">{{ imageCreator }}</a> on\n <a [href]=\"imageUnsplashUrl\" target=\"_blank\">Unsplash</a>\n </p>\n <p *ngIf=\"imageLocation\" class=\"location\">{{ imageLocation }}</p>\n </div>\n </div>\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" [alt]=\"imageUrl\" />\n </div>\n <div class=\"login-wrapper-form\">\n <p class=\"login-title\">\n {{ 'common.login-title' | translate : { brand: hideVendureBranding ? brand : 'Vendure' } }}\n </p>\n <form class=\"login-form\">\n <div class=\"login-group\">\n <input\n class=\"username\"\n type=\"text\"\n name=\"username\"\n id=\"login_username\"\n [(ngModel)]=\"username\"\n [placeholder]=\"'common.username' | translate\"\n />\n <input\n class=\"password\"\n name=\"password\"\n type=\"password\"\n id=\"login_password\"\n [(ngModel)]=\"password\"\n [placeholder]=\"'common.password' | translate\"\n />\n <clr-alert\n [clrAlertType]=\"'danger'\"\n [clrAlertClosable]=\"false\"\n [class.visible]=\"errorMessage\"\n class=\"login-error\"\n >\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ errorMessage }}\n </span>\n </clr-alert-item>\n </clr-alert>\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n id=\"rememberme\"\n name=\"rememberme\"\n [(ngModel)]=\"rememberMe\"\n />\n <label>{{ 'common.remember-me' | translate }}</label>\n </clr-checkbox-wrapper>\n <div>\n <button\n type=\"submit\"\n class=\"button primary login-button\"\n (click)=\"logIn()\"\n [disabled]=\"!username || !password\"\n >\n {{ 'common.login' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n <img class=\"login-wrapper-logo\" src=\"assets/logo-login.webp\" *ngIf=\"!hideVendureBranding\" />\n </div>\n</div>\n", styles: [".login-wrapper{background:var(--color-weight-100);background-image:none;height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.login-wrapper .login-wrapper-inner{background:var(--login-wrapper-inner-bg);width:1120px;height:590px;display:flex;justify-content:flex-start;align-items:stretch;position:relative;border-radius:var(--border-radius);border:1px solid var(--color-weight-150);overflow:hidden}@media (max-width: 992px){.login-wrapper .login-wrapper-inner{flex-direction:column;height:auto;width:100%}}.login-wrapper .login-wrapper-inner .login-wrapper-image{height:100%;flex-grow:1;position:relative}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image{height:300px}}.login-wrapper .login-wrapper-inner .login-wrapper-image img{display:block;width:100%;height:100%;object-fit:cover;object-position:center;position:relative;z-index:1}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{width:100%;height:100%;position:absolute;left:0;bottom:0;z-index:10;background:#020024;background:linear-gradient(180deg,#02002400,#000000bf);display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;padding:30px}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.6rem;font-weight:700;color:#fff;margin-bottom:20px}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.2rem}}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright{opacity:.8}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright p{font-size:.6rem;color:#fff;margin:0!important}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright a{color:#fff;text-decoration:underline}.login-wrapper .login-wrapper-inner .login-wrapper-form{height:100%;width:400px;padding:40px;display:flex;flex-direction:column;align-items:stretch;justify-content:center;box-shadow:0 20px 25px #0000001a;overflow:hidden;flex-shrink:0}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-form{height:auto;width:100%;padding:20px}}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-title{font-weight:700;font-size:1.2rem;margin-bottom:20px;color:var(--color-weight-600)}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.username,.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.password{display:block;width:100%;margin-bottom:15px;padding:12px 16px!important;background:#fff;font-size:14px;line-height:22px;color:#52667a;outline:none;-webkit-appearance:none}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group .btn{width:100%!important;margin-top:20px!important}.login-wrapper .login-wrapper-inner .login-wrapper-logo{width:60px;height:auto;position:absolute;right:20px;top:20px}.login-button{width:100%;margin-top:var(--space-unit);justify-content:center}.version{flex:1;flex-grow:1;display:flex;align-items:flex-end;justify-content:center;color:var(--color-grey-300)}.version span+span{margin-inline-start:5px}.login-error{max-height:0;overflow:hidden;display:block}.login-error.visible{max-height:46px;transition:max-height .2s;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation-delay:.2s;transform:translateZ(0);backface-visibility:hidden;perspective:1000px}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-logo{right:auto;left:20px}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{left:auto;right:0}\n"], dependencies: [{ kind: "component", type: i4.ClrAlert, selector: "clr-alert", inputs: ["clrAlertSizeSmall", "clrAlertClosable", "clrAlertAppLevel", "clrCloseButtonAriaLabel", "clrAlertLightweight", "clrAlertType", "clrAlertIcon", "clrAlertClosed"], outputs: ["clrAlertClosedChange"] }, { kind: "component", type: i4.ClrAlertItem, selector: "clr-alert-item" }, { kind: "directive", type: i4.ClrAlertText, selector: ".alert-text" }, { kind: "directive", type: i4.ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i4.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: i4.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.ɵɵDir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "directive", type: i1.FormFieldControlDirective, selector: "input, textarea, select, vdr-currency-input" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
95
95
  }
96
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginComponent, decorators: [{
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginComponent, decorators: [{
97
97
  type: Component,
98
98
  args: [{ selector: 'vdr-login', standalone: false, template: "<div class=\"login-wrapper\" [dir]=\"direction$ | async\">\n <div class=\"login-wrapper-inner\">\n <div class=\"login-wrapper-image\">\n <div class=\"login-wrapper-image-content\">\n <div class=\"login-wrapper-image-title\">\n {{ 'common.login-image-title' | translate }}\n </div>\n <div class=\"login-wrapper-image-copyright\">\n <p *ngIf=\"imageCreator\" class=\"creator\">\n Photo by <a [href]=\"imageCreatorUrl\" target=\"_blank\">{{ imageCreator }}</a> on\n <a [href]=\"imageUnsplashUrl\" target=\"_blank\">Unsplash</a>\n </p>\n <p *ngIf=\"imageLocation\" class=\"location\">{{ imageLocation }}</p>\n </div>\n </div>\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" [alt]=\"imageUrl\" />\n </div>\n <div class=\"login-wrapper-form\">\n <p class=\"login-title\">\n {{ 'common.login-title' | translate : { brand: hideVendureBranding ? brand : 'Vendure' } }}\n </p>\n <form class=\"login-form\">\n <div class=\"login-group\">\n <input\n class=\"username\"\n type=\"text\"\n name=\"username\"\n id=\"login_username\"\n [(ngModel)]=\"username\"\n [placeholder]=\"'common.username' | translate\"\n />\n <input\n class=\"password\"\n name=\"password\"\n type=\"password\"\n id=\"login_password\"\n [(ngModel)]=\"password\"\n [placeholder]=\"'common.password' | translate\"\n />\n <clr-alert\n [clrAlertType]=\"'danger'\"\n [clrAlertClosable]=\"false\"\n [class.visible]=\"errorMessage\"\n class=\"login-error\"\n >\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ errorMessage }}\n </span>\n </clr-alert-item>\n </clr-alert>\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n id=\"rememberme\"\n name=\"rememberme\"\n [(ngModel)]=\"rememberMe\"\n />\n <label>{{ 'common.remember-me' | translate }}</label>\n </clr-checkbox-wrapper>\n <div>\n <button\n type=\"submit\"\n class=\"button primary login-button\"\n (click)=\"logIn()\"\n [disabled]=\"!username || !password\"\n >\n {{ 'common.login' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n <img class=\"login-wrapper-logo\" src=\"assets/logo-login.webp\" *ngIf=\"!hideVendureBranding\" />\n </div>\n</div>\n", styles: [".login-wrapper{background:var(--color-weight-100);background-image:none;height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.login-wrapper .login-wrapper-inner{background:var(--login-wrapper-inner-bg);width:1120px;height:590px;display:flex;justify-content:flex-start;align-items:stretch;position:relative;border-radius:var(--border-radius);border:1px solid var(--color-weight-150);overflow:hidden}@media (max-width: 992px){.login-wrapper .login-wrapper-inner{flex-direction:column;height:auto;width:100%}}.login-wrapper .login-wrapper-inner .login-wrapper-image{height:100%;flex-grow:1;position:relative}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image{height:300px}}.login-wrapper .login-wrapper-inner .login-wrapper-image img{display:block;width:100%;height:100%;object-fit:cover;object-position:center;position:relative;z-index:1}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{width:100%;height:100%;position:absolute;left:0;bottom:0;z-index:10;background:#020024;background:linear-gradient(180deg,#02002400,#000000bf);display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;padding:30px}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.6rem;font-weight:700;color:#fff;margin-bottom:20px}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-title{font-size:1.2rem}}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright{opacity:.8}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright p{font-size:.6rem;color:#fff;margin:0!important}.login-wrapper .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content .login-wrapper-image-copyright a{color:#fff;text-decoration:underline}.login-wrapper .login-wrapper-inner .login-wrapper-form{height:100%;width:400px;padding:40px;display:flex;flex-direction:column;align-items:stretch;justify-content:center;box-shadow:0 20px 25px #0000001a;overflow:hidden;flex-shrink:0}@media (max-width: 992px){.login-wrapper .login-wrapper-inner .login-wrapper-form{height:auto;width:100%;padding:20px}}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-title{font-weight:700;font-size:1.2rem;margin-bottom:20px;color:var(--color-weight-600)}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.username,.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group input.password{display:block;width:100%;margin-bottom:15px;padding:12px 16px!important;background:#fff;font-size:14px;line-height:22px;color:#52667a;outline:none;-webkit-appearance:none}.login-wrapper .login-wrapper-inner .login-wrapper-form .login-group .btn{width:100%!important;margin-top:20px!important}.login-wrapper .login-wrapper-inner .login-wrapper-logo{width:60px;height:auto;position:absolute;right:20px;top:20px}.login-button{width:100%;margin-top:var(--space-unit);justify-content:center}.version{flex:1;flex-grow:1;display:flex;align-items:flex-end;justify-content:center;color:var(--color-grey-300)}.version span+span{margin-inline-start:5px}.login-error{max-height:0;overflow:hidden;display:block}.login-error.visible{max-height:46px;transition:max-height .2s;animation:shake .82s cubic-bezier(.36,.07,.19,.97) both;animation-delay:.2s;transform:translateZ(0);backface-visibility:hidden;perspective:1000px}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-logo{right:auto;left:20px}.login-wrapper[dir=rtl] .login-wrapper-inner .login-wrapper-image .login-wrapper-image-content{left:auto;right:0}\n"] }]
99
99
  }], ctorParameters: () => [{ type: i1.AuthService }, { type: i1$1.Router }, { type: i3.HttpClient }, { type: i1.LocalizationService }] });
@@ -114,10 +114,10 @@ class LoginGuard {
114
114
  return !authenticated;
115
115
  }));
116
116
  }
117
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginGuard, deps: [{ token: i1$1.Router }, { token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
118
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginGuard, providedIn: 'root' }); }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginGuard, deps: [{ token: i1$1.Router }, { token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
118
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginGuard, providedIn: 'root' }); }
119
119
  }
120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginGuard, decorators: [{
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginGuard, decorators: [{
121
121
  type: Injectable,
122
122
  args: [{
123
123
  providedIn: 'root',
@@ -134,11 +134,11 @@ const loginRoutes = [
134
134
  ];
135
135
 
136
136
  class LoginModule {
137
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
138
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.10", ngImport: i0, type: LoginModule, declarations: [LoginComponent], imports: [SharedModule, i1$1.RouterModule] }); }
139
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginModule, imports: [SharedModule, RouterModule.forChild(loginRoutes)] }); }
137
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
138
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: LoginModule, declarations: [LoginComponent], imports: [SharedModule, i1$1.RouterModule] }); }
139
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginModule, imports: [SharedModule, RouterModule.forChild(loginRoutes)] }); }
140
140
  }
141
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: LoginModule, decorators: [{
141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: LoginModule, decorators: [{
142
142
  type: NgModule,
143
143
  args: [{
144
144
  imports: [SharedModule, RouterModule.forChild(loginRoutes)],
@@ -1 +1 @@
1
- {"version":3,"file":"vendure-admin-ui-login.mjs","sources":["../../src/lib/login/src/components/login/login.component.ts","../../src/lib/login/src/components/login/login.component.html","../../src/lib/login/src/providers/login.guard.ts","../../src/lib/login/src/login.routes.ts","../../src/lib/login/src/login.module.ts","../../src/lib/login/src/public_api.ts","../../src/lib/login/src/vendure-admin-ui-login.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n ADMIN_UI_VERSION,\n AuthService,\n AUTH_REDIRECT_PARAM,\n getAppConfig,\n LocalizationDirectionType,\n LocalizationService,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n standalone: false,\n})\nexport class LoginComponent implements OnInit {\n direction$: LocalizationDirectionType;\n\n username = '';\n password = '';\n rememberMe = false;\n version = ADMIN_UI_VERSION;\n errorMessage: string | undefined;\n brand = getAppConfig().brand;\n hideVendureBranding = getAppConfig().hideVendureBranding;\n customImageUrl = getAppConfig().loginImageUrl;\n imageUrl = '';\n imageUnsplashUrl = '';\n imageLocation = '';\n imageCreator = '';\n imageCreatorUrl = '';\n\n constructor(\n private authService: AuthService,\n private router: Router,\n private httpClient: HttpClient,\n private localizationService: LocalizationService,\n ) {\n if (this.customImageUrl) {\n this.imageUrl = this.customImageUrl;\n } else {\n this.loadImage();\n }\n }\n ngOnInit(): void {\n this.direction$ = this.localizationService.direction$;\n }\n\n logIn(): void {\n this.errorMessage = undefined;\n this.authService.logIn(this.username, this.password, this.rememberMe).subscribe(result => {\n switch (result.__typename) {\n case 'CurrentUser':\n const redirect = this.getRedirectRoute();\n this.router.navigateByUrl(redirect ? redirect : '/');\n break;\n case 'InvalidCredentialsError':\n case 'NativeAuthStrategyError':\n this.errorMessage = result.message;\n break;\n }\n });\n }\n\n loadImage() {\n this.httpClient\n .get('https://login-image.vendure.io')\n .toPromise()\n .then(res => {\n this.updateImage(res);\n });\n }\n\n updateImage(res: any) {\n const user: any = (res as any).user;\n const location: any = (res as any).location;\n\n this.imageUrl = res.urls.regular + '?utm_source=Vendure+Login+Image&utm_medium=referral';\n this.imageCreator = user.name;\n this.imageLocation = location.name;\n this.imageCreatorUrl = user.links.html + '?utm_source=Vendure+Login+Image&utm_medium=referral';\n this.imageUnsplashUrl = res.links.html;\n }\n\n /**\n * Attempts to read a redirect param from the current url and parse it into a\n * route from which the user was redirected after a 401 error.\n */\n private getRedirectRoute(): string | undefined {\n let redirectTo: string | undefined;\n const re = new RegExp(`${AUTH_REDIRECT_PARAM}=(.*)`);\n try {\n const redirectToParam = window.location.search.match(re);\n if (redirectToParam && 1 < redirectToParam.length) {\n redirectTo = atob(decodeURIComponent(redirectToParam[1]));\n }\n } catch (e: any) {\n // ignore\n }\n return redirectTo;\n }\n}\n","<div class=\"login-wrapper\" [dir]=\"direction$ | async\">\n <div class=\"login-wrapper-inner\">\n <div class=\"login-wrapper-image\">\n <div class=\"login-wrapper-image-content\">\n <div class=\"login-wrapper-image-title\">\n {{ 'common.login-image-title' | translate }}\n </div>\n <div class=\"login-wrapper-image-copyright\">\n <p *ngIf=\"imageCreator\" class=\"creator\">\n Photo by <a [href]=\"imageCreatorUrl\" target=\"_blank\">{{ imageCreator }}</a> on\n <a [href]=\"imageUnsplashUrl\" target=\"_blank\">Unsplash</a>\n </p>\n <p *ngIf=\"imageLocation\" class=\"location\">{{ imageLocation }}</p>\n </div>\n </div>\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" [alt]=\"imageUrl\" />\n </div>\n <div class=\"login-wrapper-form\">\n <p class=\"login-title\">\n {{ 'common.login-title' | translate : { brand: hideVendureBranding ? brand : 'Vendure' } }}\n </p>\n <form class=\"login-form\">\n <div class=\"login-group\">\n <input\n class=\"username\"\n type=\"text\"\n name=\"username\"\n id=\"login_username\"\n [(ngModel)]=\"username\"\n [placeholder]=\"'common.username' | translate\"\n />\n <input\n class=\"password\"\n name=\"password\"\n type=\"password\"\n id=\"login_password\"\n [(ngModel)]=\"password\"\n [placeholder]=\"'common.password' | translate\"\n />\n <clr-alert\n [clrAlertType]=\"'danger'\"\n [clrAlertClosable]=\"false\"\n [class.visible]=\"errorMessage\"\n class=\"login-error\"\n >\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ errorMessage }}\n </span>\n </clr-alert-item>\n </clr-alert>\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n id=\"rememberme\"\n name=\"rememberme\"\n [(ngModel)]=\"rememberMe\"\n />\n <label>{{ 'common.remember-me' | translate }}</label>\n </clr-checkbox-wrapper>\n <div>\n <button\n type=\"submit\"\n class=\"button primary login-button\"\n (click)=\"logIn()\"\n [disabled]=\"!username || !password\"\n >\n {{ 'common.login' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n <img class=\"login-wrapper-logo\" src=\"assets/logo-login.webp\" *ngIf=\"!hideVendureBranding\" />\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { AuthService } from '@vendure/admin-ui/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * This guard prevents loggen-in users from navigating to the login screen.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LoginGuard {\n constructor(private router: Router, private authService: AuthService) {}\n\n canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {\n return this.authService.checkAuthenticatedStatus().pipe(\n map(authenticated => {\n if (authenticated) {\n this.router.navigate(['/']);\n }\n return !authenticated;\n }),\n );\n }\n}\n","import { Routes } from '@angular/router';\n\nimport { LoginComponent } from './components/login/login.component';\nimport { LoginGuard } from './providers/login.guard';\n\nexport const loginRoutes: Routes = [\n {\n path: '',\n component: LoginComponent,\n pathMatch: 'full',\n canActivate: [LoginGuard],\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@vendure/admin-ui/core';\n\nimport { LoginComponent } from './components/login/login.component';\nimport { loginRoutes } from './login.routes';\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild(loginRoutes)],\n exports: [],\n declarations: [LoginComponent],\n})\nexport class LoginModule {}\n","// This file was generated by the build-public-api.ts script\nexport * from './components/login/login.component';\nexport * from './login.module';\nexport * from './login.routes';\nexport * from './providers/login.guard';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","i1"],"mappings":"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"}
1
+ {"version":3,"file":"vendure-admin-ui-login.mjs","sources":["../../src/lib/login/src/components/login/login.component.ts","../../src/lib/login/src/components/login/login.component.html","../../src/lib/login/src/providers/login.guard.ts","../../src/lib/login/src/login.routes.ts","../../src/lib/login/src/login.module.ts","../../src/lib/login/src/public_api.ts","../../src/lib/login/src/vendure-admin-ui-login.ts"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\nimport { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n ADMIN_UI_VERSION,\n AuthService,\n AUTH_REDIRECT_PARAM,\n getAppConfig,\n LocalizationDirectionType,\n LocalizationService,\n} from '@vendure/admin-ui/core';\n\n@Component({\n selector: 'vdr-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n standalone: false,\n})\nexport class LoginComponent implements OnInit {\n direction$: LocalizationDirectionType;\n\n username = '';\n password = '';\n rememberMe = false;\n version = ADMIN_UI_VERSION;\n errorMessage: string | undefined;\n brand = getAppConfig().brand;\n hideVendureBranding = getAppConfig().hideVendureBranding;\n customImageUrl = getAppConfig().loginImageUrl;\n imageUrl = '';\n imageUnsplashUrl = '';\n imageLocation = '';\n imageCreator = '';\n imageCreatorUrl = '';\n\n constructor(\n private authService: AuthService,\n private router: Router,\n private httpClient: HttpClient,\n private localizationService: LocalizationService,\n ) {\n if (this.customImageUrl) {\n this.imageUrl = this.customImageUrl;\n } else {\n this.loadImage();\n }\n }\n ngOnInit(): void {\n this.direction$ = this.localizationService.direction$;\n }\n\n logIn(): void {\n this.errorMessage = undefined;\n this.authService.logIn(this.username, this.password, this.rememberMe).subscribe(result => {\n switch (result.__typename) {\n case 'CurrentUser':\n const redirect = this.getRedirectRoute();\n this.router.navigateByUrl(redirect ? redirect : '/');\n break;\n case 'InvalidCredentialsError':\n case 'NativeAuthStrategyError':\n this.errorMessage = result.message;\n break;\n }\n });\n }\n\n loadImage() {\n this.httpClient\n .get('https://login-image.vendure.io')\n .toPromise()\n .then(res => {\n this.updateImage(res);\n });\n }\n\n updateImage(res: any) {\n const user: any = (res as any).user;\n const location: any = (res as any).location;\n\n this.imageUrl = res.urls.regular + '?utm_source=Vendure+Login+Image&utm_medium=referral';\n this.imageCreator = user.name;\n this.imageLocation = location.name;\n this.imageCreatorUrl = user.links.html + '?utm_source=Vendure+Login+Image&utm_medium=referral';\n this.imageUnsplashUrl = res.links.html;\n }\n\n /**\n * Attempts to read a redirect param from the current url and parse it into a\n * route from which the user was redirected after a 401 error.\n */\n private getRedirectRoute(): string | undefined {\n let redirectTo: string | undefined;\n const re = new RegExp(`${AUTH_REDIRECT_PARAM}=(.*)`);\n try {\n const redirectToParam = window.location.search.match(re);\n if (redirectToParam && 1 < redirectToParam.length) {\n redirectTo = atob(decodeURIComponent(redirectToParam[1]));\n }\n } catch (e: any) {\n // ignore\n }\n return redirectTo;\n }\n}\n","<div class=\"login-wrapper\" [dir]=\"direction$ | async\">\n <div class=\"login-wrapper-inner\">\n <div class=\"login-wrapper-image\">\n <div class=\"login-wrapper-image-content\">\n <div class=\"login-wrapper-image-title\">\n {{ 'common.login-image-title' | translate }}\n </div>\n <div class=\"login-wrapper-image-copyright\">\n <p *ngIf=\"imageCreator\" class=\"creator\">\n Photo by <a [href]=\"imageCreatorUrl\" target=\"_blank\">{{ imageCreator }}</a> on\n <a [href]=\"imageUnsplashUrl\" target=\"_blank\">Unsplash</a>\n </p>\n <p *ngIf=\"imageLocation\" class=\"location\">{{ imageLocation }}</p>\n </div>\n </div>\n <img *ngIf=\"imageUrl\" [src]=\"imageUrl\" [alt]=\"imageUrl\" />\n </div>\n <div class=\"login-wrapper-form\">\n <p class=\"login-title\">\n {{ 'common.login-title' | translate : { brand: hideVendureBranding ? brand : 'Vendure' } }}\n </p>\n <form class=\"login-form\">\n <div class=\"login-group\">\n <input\n class=\"username\"\n type=\"text\"\n name=\"username\"\n id=\"login_username\"\n [(ngModel)]=\"username\"\n [placeholder]=\"'common.username' | translate\"\n />\n <input\n class=\"password\"\n name=\"password\"\n type=\"password\"\n id=\"login_password\"\n [(ngModel)]=\"password\"\n [placeholder]=\"'common.password' | translate\"\n />\n <clr-alert\n [clrAlertType]=\"'danger'\"\n [clrAlertClosable]=\"false\"\n [class.visible]=\"errorMessage\"\n class=\"login-error\"\n >\n <clr-alert-item>\n <span class=\"alert-text\">\n {{ errorMessage }}\n </span>\n </clr-alert-item>\n </clr-alert>\n <clr-checkbox-wrapper>\n <input\n type=\"checkbox\"\n clrCheckbox\n id=\"rememberme\"\n name=\"rememberme\"\n [(ngModel)]=\"rememberMe\"\n />\n <label>{{ 'common.remember-me' | translate }}</label>\n </clr-checkbox-wrapper>\n <div>\n <button\n type=\"submit\"\n class=\"button primary login-button\"\n (click)=\"logIn()\"\n [disabled]=\"!username || !password\"\n >\n {{ 'common.login' | translate }}\n </button>\n </div>\n </div>\n </form>\n </div>\n <img class=\"login-wrapper-logo\" src=\"assets/logo-login.webp\" *ngIf=\"!hideVendureBranding\" />\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { AuthService } from '@vendure/admin-ui/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * This guard prevents loggen-in users from navigating to the login screen.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LoginGuard {\n constructor(private router: Router, private authService: AuthService) {}\n\n canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {\n return this.authService.checkAuthenticatedStatus().pipe(\n map(authenticated => {\n if (authenticated) {\n this.router.navigate(['/']);\n }\n return !authenticated;\n }),\n );\n }\n}\n","import { Routes } from '@angular/router';\n\nimport { LoginComponent } from './components/login/login.component';\nimport { LoginGuard } from './providers/login.guard';\n\nexport const loginRoutes: Routes = [\n {\n path: '',\n component: LoginComponent,\n pathMatch: 'full',\n canActivate: [LoginGuard],\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '@vendure/admin-ui/core';\n\nimport { LoginComponent } from './components/login/login.component';\nimport { loginRoutes } from './login.routes';\n\n@NgModule({\n imports: [SharedModule, RouterModule.forChild(loginRoutes)],\n exports: [],\n declarations: [LoginComponent],\n})\nexport class LoginModule {}\n","// This file was generated by the build-public-api.ts script\nexport * from './components/login/login.component';\nexport * from './login.module';\nexport * from './login.routes';\nexport * from './providers/login.guard';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","i1"],"mappings":";;;;;;;;;;;;;;MAkBa,cAAc,CAAA;AAiBvB,IAAA,WAAA,CACY,WAAwB,EACxB,MAAc,EACd,UAAsB,EACtB,mBAAwC,EAAA;QAHxC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QAlB/B,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,OAAO,GAAG,gBAAgB;AAE1B,QAAA,IAAA,CAAA,KAAK,GAAG,YAAY,EAAE,CAAC,KAAK;AAC5B,QAAA,IAAA,CAAA,mBAAmB,GAAG,YAAY,EAAE,CAAC,mBAAmB;AACxD,QAAA,IAAA,CAAA,cAAc,GAAG,YAAY,EAAE,CAAC,aAAa;QAC7C,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,gBAAgB,GAAG,EAAE;QACrB,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,YAAY,GAAG,EAAE;QACjB,IAAA,CAAA,eAAe,GAAG,EAAE;AAQhB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc;QACvC;aAAO;YACH,IAAI,CAAC,SAAS,EAAE;QACpB;IACJ;IACA,QAAQ,GAAA;QACJ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU;IACzD;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;QAC7B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AACrF,YAAA,QAAQ,MAAM,CAAC,UAAU;AACrB,gBAAA,KAAK,aAAa;AACd,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACxC,oBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAC;oBACpD;AACJ,gBAAA,KAAK,yBAAyB;AAC9B,gBAAA,KAAK,yBAAyB;AAC1B,oBAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO;oBAClC;;AAEZ,QAAA,CAAC,CAAC;IACN;IAEA,SAAS,GAAA;AACL,QAAA,IAAI,CAAC;aACA,GAAG,CAAC,gCAAgC;AACpC,aAAA,SAAS;aACT,IAAI,CAAC,GAAG,IAAG;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACzB,QAAA,CAAC,CAAC;IACV;AAEA,IAAA,WAAW,CAAC,GAAQ,EAAA;AAChB,QAAA,MAAM,IAAI,GAAS,GAAW,CAAC,IAAI;AACnC,QAAA,MAAM,QAAQ,GAAS,GAAW,CAAC,QAAQ;QAE3C,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,qDAAqD;AACxF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,qDAAqD;QAC9F,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI;IAC1C;AAEA;;;AAGG;IACK,gBAAgB,GAAA;AACpB,QAAA,IAAI,UAA8B;QAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA,EAAG,mBAAmB,CAAA,KAAA,CAAO,CAAC;AACpD,QAAA,IAAI;AACA,YAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,eAAe,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE;gBAC/C,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D;QACJ;QAAE,OAAO,CAAM,EAAE;;QAEjB;AACA,QAAA,OAAO,UAAU;IACrB;+GArFS,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,sEClB3B,s+GA6EA,EAAA,MAAA,EAAA,CAAA,43HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FD3Da,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cAGT,KAAK,EAAA,QAAA,EAAA,s+GAAA,EAAA,MAAA,EAAA,CAAA,43HAAA,CAAA,EAAA;;;AEVrB;;AAEG;MAIU,UAAU,CAAA;IACnB,WAAA,CAAoB,MAAc,EAAU,WAAwB,EAAA;QAAhD,IAAA,CAAA,MAAM,GAAN,MAAM;QAAkB,IAAA,CAAA,WAAW,GAAX,WAAW;IAAgB;AAEvE,IAAA,WAAW,CAAC,KAA6B,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,IAAI,CACnD,GAAG,CAAC,aAAa,IAAG;YAChB,IAAI,aAAa,EAAE;gBACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B;YACA,OAAO,CAAC,aAAa;QACzB,CAAC,CAAC,CACL;IACL;+GAZS,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFP,MAAM,EAAA,CAAA,CAAA;;4FAET,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;ACNM,MAAM,WAAW,GAAW;AAC/B,IAAA;AACI,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,CAAC,UAAU,CAAC;AAC5B,KAAA;;;MCCQ,WAAW,CAAA;+GAAX,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAX,WAAW,EAAA,YAAA,EAAA,CAFL,cAAc,CAAA,EAAA,OAAA,EAAA,CAFnB,YAAY,EAAAC,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA,CAAA;gHAIb,WAAW,EAAA,OAAA,EAAA,CAJV,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA,EAAA,CAAA,CAAA;;4FAIjD,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC3D,oBAAA,OAAO,EAAE,EAAE;oBACX,YAAY,EAAE,CAAC,cAAc,CAAC;AACjC,iBAAA;;;ACXD;;ACAA;;AAEG;;;;"}
@@ -263,10 +263,10 @@ class PromotionDetailComponent extends TypedBaseDetailComponent {
263
263
  collection.splice(index, 1);
264
264
  }
265
265
  }
266
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: PromotionDetailComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DataService }, { token: i2.FormBuilder }, { token: i1.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
267
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.10", type: PromotionDetailComponent, isStandalone: false, selector: "vdr-promotion-detail", usesInheritance: true, ngImport: i0, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <div class=\"flex clr-align-items-center\">\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </div>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n class=\"btn btn-primary\"\n (click)=\"save()\"\n *vdrIfPermissions=\"'UpdatePromotion'\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card *vdrIfPermissions=\"'UpdatePromotion'\">\n <clr-toggle-wrapper>\n <input type=\"checkbox\" clrToggle name=\"enabled\" formControlName=\"enabled\" />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n <vdr-page-block>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"name\"\n />\n </vdr-form-field>\n <vdr-rich-text-editor\n class=\"form-grid-span\"\n formControlName=\"description\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [label]=\"'common.description' | translate\"\n ></vdr-rich-text-editor>\n <vdr-form-field [label]=\"'marketing.starts-at' | translate\" for=\"startsAt\">\n <vdr-datetime-picker formControlName=\"startsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.ends-at' | translate\" for=\"endsAt\">\n <vdr-datetime-picker formControlName=\"endsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.coupon-code' | translate\" for=\"couponCode\">\n <input\n id=\"couponCode\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"couponCode\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.per-customer-limit' | translate\"\n [tooltip]=\"'marketing.per-customer-limit-tooltip' | translate\"\n for=\"perCustomerUsageLimit\"\n >\n <input\n id=\"perCustomerUsageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"999\"\n formControlName=\"perCustomerUsageLimit\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.usage-limit' | translate\"\n [tooltip]=\"'marketing.usage-limit-tooltip' | translate\"\n for=\"usageLimit\"\n >\n <input\n id=\"usageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"9999999\"\n formControlName=\"usageLimit\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card\n [title]=\"'common.custom-fields' | translate\"\n formGroupName=\"customFields\"\n *ngIf=\"customFields.length\"\n >\n <vdr-tabbed-custom-fields\n entityName=\"Promotion\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n\n <vdr-custom-detail-component-host\n locationId=\"promotion-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n\n <vdr-card [title]=\"'marketing.conditions' | translate\" formArrayName=\"conditions\">\n <div *ngFor=\"let condition of conditions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeCondition($event)\"\n [position]=\"i\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operation]=\"condition\"\n [operationDefinition]=\"getConditionDefinition(condition)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-condition' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let condition of getAvailableConditions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addCondition(condition)\"\n >\n {{ condition.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'marketing.actions' | translate\" formArrayName=\"actions\">\n <div *ngFor=\"let action of actions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeAction($event)\"\n [position]=\"i\"\n [operation]=\"action\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operationDefinition]=\"getActionDefinition(action)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-action' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let action of getAvailableActions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addAction(action)\"\n >\n {{ action.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", styles: [".item-wrap{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i3.ClrIconCustomTag, selector: "clr-icon" }, { kind: "directive", type: i3.ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i3.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: i3.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { kind: "component", type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarDropdownMenuComponent, selector: "vdr-action-bar-dropdown-menu", inputs: ["alwaysShow"] }, { kind: "component", type: i1.ConfigurableInputComponent, selector: "vdr-configurable-input", inputs: ["operation", "operationDefinition", "readonly", "removable", "position", "hideDescription"], outputs: ["remove"] }, { kind: "component", type: i1.FormFieldComponent, selector: "vdr-form-field", inputs: ["label", "for", "tooltip", "errors", "readOnlyToggle"], outputs: ["readOnlyToggleChange"] }, { kind: "directive", type: i1.FormFieldControlDirective, selector: "input, textarea, select, vdr-currency-input" }, { kind: "component", type: i1.LanguageSelectorComponent, selector: "vdr-language-selector", inputs: ["currentLanguageCode", "availableLanguageCodes", "disabled"], outputs: ["languageCodeChange"] }, { kind: "component", type: i1.RichTextEditorComponent, selector: "vdr-rich-text-editor", inputs: ["label", "readonly"] }, { kind: "component", type: i1.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { kind: "component", type: i1.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }, { kind: "directive", type: i1.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { kind: "directive", type: i1.DropdownItemDirective, selector: "[vdrDropdownItem]" }, { kind: "directive", type: i1.IfPermissionsDirective, selector: "[vdrIfPermissions]", inputs: ["vdrIfPermissions", "vdrIfPermissionsElse"] }, { kind: "component", type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items" }, { kind: "component", type: i1.DatetimePickerComponent, selector: "vdr-datetime-picker", inputs: ["yearRange", "weekStartDay", "timeGranularityInterval", "min", "max", "readonly"] }, { kind: "component", type: i1.TabbedCustomFieldsComponent, selector: "vdr-tabbed-custom-fields", inputs: ["entityName", "customFields", "customFieldsFormGroup", "readonly", "compact", "showLabel"] }, { kind: "component", type: i1.CustomDetailComponentHostComponent, selector: "vdr-custom-detail-component-host", inputs: ["locationId", "entity$", "detailForm"] }, { kind: "component", type: i1.PageBlockComponent, selector: "vdr-page-block" }, { kind: "component", type: i1.PageEntityInfoComponent, selector: "vdr-page-entity-info", inputs: ["entity"] }, { kind: "component", type: i1.PageDetailLayoutComponent, selector: "vdr-page-detail-layout" }, { kind: "component", type: i1.PageDetailSidebarComponent, selector: "vdr-page-detail-sidebar" }, { kind: "component", type: i1.CardComponent, selector: "vdr-card", inputs: ["title", "paddingX"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1.HasPermissionPipe, name: "hasPermission" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
266
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PromotionDetailComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DataService }, { token: i2.FormBuilder }, { token: i1.NotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
267
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PromotionDetailComponent, isStandalone: false, selector: "vdr-promotion-detail", usesInheritance: true, ngImport: i0, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <div class=\"flex clr-align-items-center\">\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </div>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n class=\"btn btn-primary\"\n (click)=\"save()\"\n *vdrIfPermissions=\"'UpdatePromotion'\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card *vdrIfPermissions=\"'UpdatePromotion'\">\n <clr-toggle-wrapper>\n <input type=\"checkbox\" clrToggle name=\"enabled\" formControlName=\"enabled\" />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n <vdr-page-block>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"name\"\n />\n </vdr-form-field>\n <vdr-rich-text-editor\n class=\"form-grid-span\"\n formControlName=\"description\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [label]=\"'common.description' | translate\"\n ></vdr-rich-text-editor>\n <vdr-form-field [label]=\"'marketing.starts-at' | translate\" for=\"startsAt\">\n <vdr-datetime-picker formControlName=\"startsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.ends-at' | translate\" for=\"endsAt\">\n <vdr-datetime-picker formControlName=\"endsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.coupon-code' | translate\" for=\"couponCode\">\n <input\n id=\"couponCode\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"couponCode\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.per-customer-limit' | translate\"\n [tooltip]=\"'marketing.per-customer-limit-tooltip' | translate\"\n for=\"perCustomerUsageLimit\"\n >\n <input\n id=\"perCustomerUsageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"999\"\n formControlName=\"perCustomerUsageLimit\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.usage-limit' | translate\"\n [tooltip]=\"'marketing.usage-limit-tooltip' | translate\"\n for=\"usageLimit\"\n >\n <input\n id=\"usageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"9999999\"\n formControlName=\"usageLimit\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card\n [title]=\"'common.custom-fields' | translate\"\n formGroupName=\"customFields\"\n *ngIf=\"customFields.length\"\n >\n <vdr-tabbed-custom-fields\n entityName=\"Promotion\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n\n <vdr-custom-detail-component-host\n locationId=\"promotion-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n\n <vdr-card [title]=\"'marketing.conditions' | translate\" formArrayName=\"conditions\">\n <div *ngFor=\"let condition of conditions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeCondition($event)\"\n [position]=\"i\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operation]=\"condition\"\n [operationDefinition]=\"getConditionDefinition(condition)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-condition' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let condition of getAvailableConditions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addCondition(condition)\"\n >\n {{ condition.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'marketing.actions' | translate\" formArrayName=\"actions\">\n <div *ngFor=\"let action of actions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeAction($event)\"\n [position]=\"i\"\n [operation]=\"action\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operationDefinition]=\"getActionDefinition(action)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-action' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let action of getAvailableActions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addAction(action)\"\n >\n {{ action.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", styles: [".item-wrap{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i3.ClrIconCustomTag, selector: "clr-icon" }, { kind: "directive", type: i3.ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i3.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { kind: "component", type: i3.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { kind: "component", type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarDropdownMenuComponent, selector: "vdr-action-bar-dropdown-menu", inputs: ["alwaysShow"] }, { kind: "component", type: i1.ConfigurableInputComponent, selector: "vdr-configurable-input", inputs: ["operation", "operationDefinition", "readonly", "removable", "position", "hideDescription"], outputs: ["remove"] }, { kind: "component", type: i1.FormFieldComponent, selector: "vdr-form-field", inputs: ["label", "for", "tooltip", "errors", "readOnlyToggle"], outputs: ["readOnlyToggleChange"] }, { kind: "directive", type: i1.FormFieldControlDirective, selector: "input, textarea, select, vdr-currency-input" }, { kind: "component", type: i1.LanguageSelectorComponent, selector: "vdr-language-selector", inputs: ["currentLanguageCode", "availableLanguageCodes", "disabled"], outputs: ["languageCodeChange"] }, { kind: "component", type: i1.RichTextEditorComponent, selector: "vdr-rich-text-editor", inputs: ["label", "readonly"] }, { kind: "component", type: i1.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { kind: "component", type: i1.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }, { kind: "directive", type: i1.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { kind: "directive", type: i1.DropdownItemDirective, selector: "[vdrDropdownItem]" }, { kind: "directive", type: i1.IfPermissionsDirective, selector: "[vdrIfPermissions]", inputs: ["vdrIfPermissions", "vdrIfPermissionsElse"] }, { kind: "component", type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items" }, { kind: "component", type: i1.DatetimePickerComponent, selector: "vdr-datetime-picker", inputs: ["yearRange", "weekStartDay", "timeGranularityInterval", "min", "max", "readonly"] }, { kind: "component", type: i1.TabbedCustomFieldsComponent, selector: "vdr-tabbed-custom-fields", inputs: ["entityName", "customFields", "customFieldsFormGroup", "readonly", "compact", "showLabel"] }, { kind: "component", type: i1.CustomDetailComponentHostComponent, selector: "vdr-custom-detail-component-host", inputs: ["locationId", "entity$", "detailForm"] }, { kind: "component", type: i1.PageBlockComponent, selector: "vdr-page-block" }, { kind: "component", type: i1.PageEntityInfoComponent, selector: "vdr-page-entity-info", inputs: ["entity"] }, { kind: "component", type: i1.PageDetailLayoutComponent, selector: "vdr-page-detail-layout" }, { kind: "component", type: i1.PageDetailSidebarComponent, selector: "vdr-page-detail-sidebar" }, { kind: "component", type: i1.CardComponent, selector: "vdr-card", inputs: ["title", "paddingX"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1.HasPermissionPipe, name: "hasPermission" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
268
268
  }
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: PromotionDetailComponent, decorators: [{
269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PromotionDetailComponent, decorators: [{
270
270
  type: Component,
271
271
  args: [{ selector: 'vdr-promotion-detail', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <div class=\"flex clr-align-items-center\">\n <vdr-language-selector\n [disabled]=\"isNew$ | async\"\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"languageCode$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n ></vdr-language-selector>\n </div>\n </vdr-ab-left>\n\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-detail\" />\n <button\n class=\"btn btn-primary\"\n *ngIf=\"isNew$ | async; else updateButton\"\n (click)=\"create()\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.create' | translate }}\n </button>\n <ng-template #updateButton>\n <button\n class=\"btn btn-primary\"\n (click)=\"save()\"\n *vdrIfPermissions=\"'UpdatePromotion'\"\n [disabled]=\"!saveButtonEnabled()\"\n >\n {{ 'common.update' | translate }}\n </button>\n </ng-template>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-detail\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<form class=\"form\" [formGroup]=\"detailForm\">\n <vdr-page-detail-layout>\n <vdr-page-detail-sidebar>\n <vdr-card *vdrIfPermissions=\"'UpdatePromotion'\">\n <clr-toggle-wrapper>\n <input type=\"checkbox\" clrToggle name=\"enabled\" formControlName=\"enabled\" />\n <label>{{ 'common.enabled' | translate }}</label>\n </clr-toggle-wrapper>\n </vdr-card>\n <vdr-card *ngIf=\"entity$ | async as entity\">\n <vdr-page-entity-info [entity]=\"entity\" />\n </vdr-card>\n </vdr-page-detail-sidebar>\n <vdr-page-block>\n <vdr-card>\n <div class=\"form-grid\">\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\n <input\n id=\"name\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"name\"\n />\n </vdr-form-field>\n <vdr-rich-text-editor\n class=\"form-grid-span\"\n formControlName=\"description\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [label]=\"'common.description' | translate\"\n ></vdr-rich-text-editor>\n <vdr-form-field [label]=\"'marketing.starts-at' | translate\" for=\"startsAt\">\n <vdr-datetime-picker formControlName=\"startsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.ends-at' | translate\" for=\"endsAt\">\n <vdr-datetime-picker formControlName=\"endsAt\"></vdr-datetime-picker>\n </vdr-form-field>\n <vdr-form-field [label]=\"'marketing.coupon-code' | translate\" for=\"couponCode\">\n <input\n id=\"couponCode\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"text\"\n formControlName=\"couponCode\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.per-customer-limit' | translate\"\n [tooltip]=\"'marketing.per-customer-limit-tooltip' | translate\"\n for=\"perCustomerUsageLimit\"\n >\n <input\n id=\"perCustomerUsageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"999\"\n formControlName=\"perCustomerUsageLimit\"\n />\n </vdr-form-field>\n <vdr-form-field\n [label]=\"'marketing.usage-limit' | translate\"\n [tooltip]=\"'marketing.usage-limit-tooltip' | translate\"\n for=\"usageLimit\"\n >\n <input\n id=\"usageLimit\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n type=\"number\"\n min=\"1\"\n max=\"9999999\"\n formControlName=\"usageLimit\"\n />\n </vdr-form-field>\n </div>\n </vdr-card>\n <vdr-card\n [title]=\"'common.custom-fields' | translate\"\n formGroupName=\"customFields\"\n *ngIf=\"customFields.length\"\n >\n <vdr-tabbed-custom-fields\n entityName=\"Promotion\"\n [customFields]=\"customFields\"\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n ></vdr-tabbed-custom-fields>\n </vdr-card>\n\n <vdr-custom-detail-component-host\n locationId=\"promotion-detail\"\n [entity$]=\"entity$\"\n [detailForm]=\"detailForm\"\n ></vdr-custom-detail-component-host>\n\n <vdr-card [title]=\"'marketing.conditions' | translate\" formArrayName=\"conditions\">\n <div *ngFor=\"let condition of conditions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeCondition($event)\"\n [position]=\"i\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operation]=\"condition\"\n [operationDefinition]=\"getConditionDefinition(condition)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-condition' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let condition of getAvailableConditions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addCondition(condition)\"\n >\n {{ condition.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n <vdr-card [title]=\"'marketing.actions' | translate\" formArrayName=\"actions\">\n <div *ngFor=\"let action of actions; index as i\">\n <vdr-configurable-input\n (remove)=\"removeAction($event)\"\n [position]=\"i\"\n [operation]=\"action\"\n [readonly]=\"!('UpdatePromotion' | hasPermission)\"\n [operationDefinition]=\"getActionDefinition(action)\"\n [formControlName]=\"i\"\n ></vdr-configurable-input>\n </div>\n <div>\n <vdr-dropdown *vdrIfPermissions=\"'UpdatePromotion'\">\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.add-action' | translate }}\n </button>\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\n <button\n *ngFor=\"let action of getAvailableActions()\"\n type=\"button\"\n vdrDropdownItem\n class=\"item-wrap\"\n (click)=\"addAction(action)\"\n >\n {{ action.description }}\n </button>\n </vdr-dropdown-menu>\n </vdr-dropdown>\n </div>\n </vdr-card>\n </vdr-page-block>\n </vdr-page-detail-layout>\n</form>\n", styles: [".item-wrap{white-space:normal}\n"] }]
272
272
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DataService }, { type: i2.FormBuilder }, { type: i1.NotificationService }] });
@@ -456,10 +456,10 @@ class PromotionListComponent extends TypedBaseListComponent {
456
456
  },
457
457
  };
458
458
  }
459
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: PromotionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
460
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.10", type: PromotionListComponent, isStandalone: false, selector: "vdr-promotion-list", usesInheritance: true, ngImport: i0, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n />\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-list\" />\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreatePromotion'\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.create-new-promotion' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<vdr-data-table-2\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"promotion-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n />\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'marketing.search-by-name-or-coupon-code' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-promotion=\"item\">{{ promotion.id }}</ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\"\n id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\"\n id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.name' | translate\"\n id=\"name\"\n [optional]=\"false\"\n [sort]=\"sorts.get('name')\"\n >\n <ng-template let-promotion=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', promotion.id]\"\n ><span> {{ promotion.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-promotion=\"item\">\n <vdr-chip *ngIf=\"promotion.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!promotion.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.coupon-code' | translate\"\n id=\"coupon-code\"\n [sort]=\"sorts.get('couponCode')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.couponCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.starts-at' | translate\"\n id=\"starts-at\"\n [sort]=\"sorts.get('startsAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.startsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'marketing.ends-at' | translate\" id=\"ends-at\" [sort]=\"sorts.get('endsAt')\">\n <ng-template let-promotion=\"item\">\n {{ promotion.endsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.per-customer-limit' | translate\"\n id=\"per-customer-limit\"\n [sort]=\"sorts.get('perCustomerUsageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.perCustomerUsageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.usage-limit' | translate\"\n id=\"usage-limit\"\n [sort]=\"sorts.get('usageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.usageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n</vdr-data-table-2>\n", styles: [".search-form{padding:0}.search-input{margin:6px 8px 0 0;min-width:200px}\n"], dependencies: [{ kind: "directive", type: i3.ClrIconCustomTag, selector: "clr-icon" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { kind: "component", type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarDropdownMenuComponent, selector: "vdr-action-bar-dropdown-menu", inputs: ["alwaysShow"] }, { kind: "component", type: i1.ChipComponent, selector: "vdr-chip", inputs: ["icon", "invert", "colorFrom", "colorType"], outputs: ["iconClick"] }, { kind: "component", type: i1.LanguageSelectorComponent, selector: "vdr-language-selector", inputs: ["currentLanguageCode", "availableLanguageCodes", "disabled"], outputs: ["languageCodeChange"] }, { kind: "directive", type: i1.IfPermissionsDirective, selector: "[vdrIfPermissions]", inputs: ["vdrIfPermissions", "vdrIfPermissionsElse"] }, { kind: "component", type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items" }, { kind: "component", type: i1.BulkActionMenuComponent, selector: "vdr-bulk-action-menu", inputs: ["locationId", "selectionManager", "hostComponent"] }, { kind: "component", type: i1.DataTable2Component, selector: "vdr-data-table-2", inputs: ["id", "items", "itemsPerPage", "currentPage", "totalItems", "emptyStateLabel", "filters", "activeIndex", "trackByPath"], outputs: ["pageChange", "itemsPerPageChange", "visibleColumnsChange"] }, { kind: "component", type: i1.DataTable2ColumnComponent, selector: "vdr-dt2-column", inputs: ["id", "expand", "heading", "align", "sort", "optional", "hiddenByDefault", "orderable"], exportAs: ["row"] }, { kind: "component", type: i1.DataTable2SearchComponent, selector: "vdr-dt2-search", inputs: ["searchTermControl", "searchTermPlaceholder"] }, { kind: "component", type: i1.DataTableCustomFieldColumnComponent, selector: "vdr-dt2-custom-field-column", inputs: ["customField", "sorts"], exportAs: ["row"] }, { kind: "component", type: i1.PageBlockComponent, selector: "vdr-page-block" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1.LocaleDatePipe, name: "localeDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
459
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PromotionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
460
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: PromotionListComponent, isStandalone: false, selector: "vdr-promotion-list", usesInheritance: true, ngImport: i0, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n />\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-list\" />\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreatePromotion'\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.create-new-promotion' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<vdr-data-table-2\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"promotion-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n />\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'marketing.search-by-name-or-coupon-code' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-promotion=\"item\">{{ promotion.id }}</ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\"\n id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\"\n id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.name' | translate\"\n id=\"name\"\n [optional]=\"false\"\n [sort]=\"sorts.get('name')\"\n >\n <ng-template let-promotion=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', promotion.id]\"\n ><span> {{ promotion.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-promotion=\"item\">\n <vdr-chip *ngIf=\"promotion.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!promotion.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.coupon-code' | translate\"\n id=\"coupon-code\"\n [sort]=\"sorts.get('couponCode')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.couponCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.starts-at' | translate\"\n id=\"starts-at\"\n [sort]=\"sorts.get('startsAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.startsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'marketing.ends-at' | translate\" id=\"ends-at\" [sort]=\"sorts.get('endsAt')\">\n <ng-template let-promotion=\"item\">\n {{ promotion.endsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.per-customer-limit' | translate\"\n id=\"per-customer-limit\"\n [sort]=\"sorts.get('perCustomerUsageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.perCustomerUsageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.usage-limit' | translate\"\n id=\"usage-limit\"\n [sort]=\"sorts.get('usageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.usageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n</vdr-data-table-2>\n", styles: [".search-form{padding:0}.search-input{margin:6px 8px 0 0;min-width:200px}\n"], dependencies: [{ kind: "directive", type: i3.ClrIconCustomTag, selector: "clr-icon" }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i1.ActionBarComponent, selector: "vdr-action-bar" }, { kind: "component", type: i1.ActionBarLeftComponent, selector: "vdr-ab-left", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { kind: "component", type: i1.ActionBarDropdownMenuComponent, selector: "vdr-action-bar-dropdown-menu", inputs: ["alwaysShow"] }, { kind: "component", type: i1.ChipComponent, selector: "vdr-chip", inputs: ["icon", "invert", "colorFrom", "colorType"], outputs: ["iconClick"] }, { kind: "component", type: i1.LanguageSelectorComponent, selector: "vdr-language-selector", inputs: ["currentLanguageCode", "availableLanguageCodes", "disabled"], outputs: ["languageCodeChange"] }, { kind: "directive", type: i1.IfPermissionsDirective, selector: "[vdrIfPermissions]", inputs: ["vdrIfPermissions", "vdrIfPermissionsElse"] }, { kind: "component", type: i1.ActionBarItemsComponent, selector: "vdr-action-bar-items" }, { kind: "component", type: i1.BulkActionMenuComponent, selector: "vdr-bulk-action-menu", inputs: ["locationId", "selectionManager", "hostComponent"] }, { kind: "component", type: i1.DataTable2Component, selector: "vdr-data-table-2", inputs: ["id", "items", "itemsPerPage", "currentPage", "totalItems", "emptyStateLabel", "filters", "activeIndex", "trackByPath"], outputs: ["pageChange", "itemsPerPageChange", "visibleColumnsChange"] }, { kind: "component", type: i1.DataTable2ColumnComponent, selector: "vdr-dt2-column", inputs: ["id", "expand", "heading", "align", "sort", "optional", "hiddenByDefault", "orderable"], exportAs: ["row"] }, { kind: "component", type: i1.DataTable2SearchComponent, selector: "vdr-dt2-search", inputs: ["searchTermControl", "searchTermPlaceholder"] }, { kind: "component", type: i1.DataTableCustomFieldColumnComponent, selector: "vdr-dt2-custom-field-column", inputs: ["customField", "sorts"], exportAs: ["row"] }, { kind: "component", type: i1.PageBlockComponent, selector: "vdr-page-block" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1.LocaleDatePipe, name: "localeDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
461
461
  }
462
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: PromotionListComponent, decorators: [{
462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: PromotionListComponent, decorators: [{
463
463
  type: Component,
464
464
  args: [{ selector: 'vdr-promotion-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<vdr-page-block>\n <vdr-action-bar>\n <vdr-ab-left>\n <vdr-language-selector\n [availableLanguageCodes]=\"availableLanguages$ | async\"\n [currentLanguageCode]=\"contentLanguage$ | async\"\n (languageCodeChange)=\"setLanguage($event)\"\n />\n </vdr-ab-left>\n <vdr-ab-right>\n <vdr-action-bar-items locationId=\"promotion-list\" />\n <a class=\"btn btn-primary\" [routerLink]=\"['./create']\" *vdrIfPermissions=\"'CreatePromotion'\">\n <clr-icon shape=\"plus\"></clr-icon>\n {{ 'marketing.create-new-promotion' | translate }}\n </a>\n <vdr-action-bar-dropdown-menu locationId=\"promotion-list\" />\n </vdr-ab-right>\n </vdr-action-bar>\n</vdr-page-block>\n\n<vdr-data-table-2\n [id]=\"dataTableListId\"\n [items]=\"items$ | async\"\n [itemsPerPage]=\"itemsPerPage$ | async\"\n [totalItems]=\"totalItems$ | async\"\n [currentPage]=\"currentPage$ | async\"\n [filters]=\"filters\"\n (pageChange)=\"setPageNumber($event)\"\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\n (visibleColumnsChange)=\"setVisibleColumns($event)\"\n>\n <vdr-bulk-action-menu\n locationId=\"promotion-list\"\n [hostComponent]=\"this\"\n [selectionManager]=\"selectionManager\"\n />\n <vdr-dt2-search\n [searchTermControl]=\"searchTermControl\"\n [searchTermPlaceholder]=\"'marketing.search-by-name-or-coupon-code' | translate\"\n />\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\n <ng-template let-promotion=\"item\">{{ promotion.id }}</ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.created-at' | translate\"\n id=\"created-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('createdAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.createdAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.updated-at' | translate\"\n id=\"updated-at\"\n [hiddenByDefault]=\"true\"\n [sort]=\"sorts.get('updatedAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.updatedAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'common.name' | translate\"\n id=\"name\"\n [optional]=\"false\"\n [sort]=\"sorts.get('name')\"\n >\n <ng-template let-promotion=\"item\">\n <a class=\"button-ghost\" [routerLink]=\"['./', promotion.id]\"\n ><span> {{ promotion.name }}</span>\n <clr-icon shape=\"arrow right\"></clr-icon>\n </a>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\n <ng-template let-promotion=\"item\">\n <vdr-chip *ngIf=\"promotion.enabled\" colorType=\"success\">{{\n 'common.enabled' | translate\n }}</vdr-chip>\n <vdr-chip *ngIf=\"!promotion.enabled\" colorType=\"warning\">{{\n 'common.disabled' | translate\n }}</vdr-chip>\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.coupon-code' | translate\"\n id=\"coupon-code\"\n [sort]=\"sorts.get('couponCode')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.couponCode }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.starts-at' | translate\"\n id=\"starts-at\"\n [sort]=\"sorts.get('startsAt')\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.startsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column [heading]=\"'marketing.ends-at' | translate\" id=\"ends-at\" [sort]=\"sorts.get('endsAt')\">\n <ng-template let-promotion=\"item\">\n {{ promotion.endsAt | localeDate : 'short' }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.per-customer-limit' | translate\"\n id=\"per-customer-limit\"\n [sort]=\"sorts.get('perCustomerUsageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.perCustomerUsageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-column\n [heading]=\"'marketing.usage-limit' | translate\"\n id=\"usage-limit\"\n [sort]=\"sorts.get('usageLimit')\"\n [hiddenByDefault]=\"true\"\n >\n <ng-template let-promotion=\"item\">\n {{ promotion.usageLimit }}\n </ng-template>\n </vdr-dt2-column>\n <vdr-dt2-custom-field-column\n *ngFor=\"let customField of customFields\"\n [customField]=\"customField\"\n [sorts]=\"sorts\"\n />\n</vdr-data-table-2>\n", styles: [".search-form{padding:0}.search-input{margin:6px 8px 0 0;min-width:200px}\n"] }]
465
465
  }], ctorParameters: () => [] });
@@ -530,9 +530,9 @@ class MarketingModule {
530
530
  });
531
531
  MarketingModule.hasRegisteredTabsAndBulkActions = true;
532
532
  }
533
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: MarketingModule, deps: [{ token: i1.BulkActionRegistryService }, { token: i1.PageService }], target: i0.ɵɵFactoryTarget.NgModule }); }
534
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.10", ngImport: i0, type: MarketingModule, declarations: [PromotionListComponent, PromotionDetailComponent], imports: [SharedModule, i3$1.RouterModule, SharedModule, AsyncPipe, SharedModule] }); }
535
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: MarketingModule, providers: [
533
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MarketingModule, deps: [{ token: i1.BulkActionRegistryService }, { token: i1.PageService }], target: i0.ɵɵFactoryTarget.NgModule }); }
534
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: MarketingModule, declarations: [PromotionListComponent, PromotionDetailComponent], imports: [SharedModule, i3$1.RouterModule, SharedModule, AsyncPipe, SharedModule] }); }
535
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MarketingModule, providers: [
536
536
  {
537
537
  provide: ROUTES,
538
538
  useFactory: (pageService) => createRoutes(pageService),
@@ -541,7 +541,7 @@ class MarketingModule {
541
541
  },
542
542
  ], imports: [SharedModule, RouterModule.forChild([]), SharedModule, SharedModule] }); }
543
543
  }
544
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.10", ngImport: i0, type: MarketingModule, decorators: [{
544
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: MarketingModule, decorators: [{
545
545
  type: NgModule,
546
546
  args: [{
547
547
  imports: [SharedModule, RouterModule.forChild([]), SharedModule, AsyncPipe, SharedModule],